Now and Nawoo

NFTの制作記録、技術メモ → C#, Solidity, Blockchain, Bitcoin, Ethereum, NFT

C#でBitcoin (2) ブロック情報を取得する

ブロック情報やトランザクション情報を取得するにはQBitNinjaを使います。

GitHubには、すでにメンテナンスされていないと書かれていますが、一応は使えるみたいなので、そのまま使っています。 GitHub - QBitNinja

インストール

NuGetで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から取得します。

トランザクションの内部については、また次回。