C#でBitcoin (2) ブロック情報を取得する
ブロック情報やトランザクション情報を取得するにはQBitNinjaを使います。
(GitHubには、すでにメンテナンスされていないと書かれていますが、一応は使えるみたいなので、そのまま使っています。 GitHub - QBitNinja )
インストール
NuGetでQBitNinjaをインストールします。
ブロック情報を取得
Genesisブロックと呼ばれているビットコインの最初のブロック (Height=0)を取得してみます。
// using NBitcoin; // using QBitNinja.Client; // using QBitNinja.Client.Models; // Heightを指定してブロックを取得 var blockHeight = 0; var client = new QBitNinjaClient(Network.Main); var blockFeature = new BlockFeature(blockHeight); var blockResponse = client.GetBlock(blockFeature).Result; // ブロックの追加情報 var info = blockResponse.AdditionalInformation; Console.WriteLine($"Height={info.Height}"); Console.WriteLine($"Confirmations={info.Confirmations}"); Console.WriteLine($"BlockId={info.BlockId}"); // =Hash Console.WriteLine(); // ブロックのヘッダ情報 var header = blockResponse.Block.Header; Console.WriteLine($"BlockTime={header.BlockTime}"); Console.WriteLine($"Difficulty={header.Bits.Difficulty}, Compact={header.Bits.ToCompact()}"); Console.WriteLine($"MerkleRoot={header.HashMerkleRoot}"); Console.WriteLine($"Version={header.Version}"); Console.WriteLine($"Nonce={header.Nonce}"); Console.WriteLine($"HashPrevBlock={header.HashPrevBlock}"); Console.WriteLine(); // ブロックに含まれるトランザクション var txs = blockResponse.Block.Transactions; Console.WriteLine($"TxCount={txs.Count}"); Console.WriteLine($"Tx0Hash={txs[0].GetHash()}"); /* 出力例 Height=0 Confirmations=700128 BlockId=000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f BlockTime=2009/01/03 18:15:05 +00:00 Difficulty=1, Compact=486604799 MerkleRoot=4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b Version=1 Nonce=2083236893 HashPrevBlock=0000000000000000000000000000000000000000000000000000000000000000 TxCount=1 Tx0Hash=4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b */
出力例を Block: 0 | Blockchain Explorer と比較するとわかりやすいです。
ブロックを取得
上の例ではブロック高 (block height)を指定して取得していますが、最新ブロックを取得する場合は以下のようにします。
var blockFeature = new BlockFeature(SpecialFeature.Last); // ←最新ブロックを取得
追加情報
HeightやConfirmationは、blockResponse.AdditionalInformationから取得します。 (ブロック内部に記録されている情報ではないため。)
ヘッダ
ヘッダ情報は block.Headerから取得します。
Bits
Bitsとはマイニングの難易度設定のことで、指数形式でエンコードされています。
上の例では、Bits.Difficulty で 1 が取得できますが、
Target = 2 ^ (256-Difficulty)
の式でTargetを計算し、マイニングでは、Targetよりも小さなハッシュを見つける必要があります。
トランザクション
ブロックに含まれるトランザクションは blockResponse.Block.Transactionsから取得します。
トランザクションの内部については、また次回。