chain.h の概要
チェーンを扱うクラス、関数が定義されているファイルです。ここで言うチェーンとは1列にブロックが連なるデータのことであり、フォークなどは表現していません。
最も重要なのは CChain です。このクラスがチェーンを表現しており、 グローバルに g_chainstate.chainActive として、Bitcoin の正当なチェーンがインメモリで保管されています。
CChain はアクティブなチェーンに含まれる全てのブロックへの参照を持っています。各ブロックは CBlockIndex クラスのインスタンスとして表現されています。ブロックデータの実体は block.h で宣言されている CBlock ですが、CBlockIndex はチェーンを効率的に扱うための前ブロックへの参照やブロック高などの付加情報を持っています。そのためコード中でブロックを扱う際には CBlockIndex がよく使われます。
https://gyazo.com/16feeb529a9da0a4053de8ceb84499ac
定義されているクラス
クラス
CBlockFileInfo
CDiskBlockPos
CBlockIndex
CDiskBlockIndex
CChain
enum
BLockStatus
関数
GetBlockProof
GetBlockProofEquivalentTime
LastCommonAncestor
CBlockFileInfo
ブロックを記録するファイルを扱うクラス。1つのファイルを扱っている。そのファイルにおけるブロックの数やサイズ、そのファイルがどのブロック高またはいつ作られたブロックをストアしているかを知っている。
undoファイルについてもサイズを管理している。
undoファイルとはなにか?
CDiskBlockPos
特定のブロックがストアされている位置を扱うクラス。ブロックをストアするファイルには番号が振られており(blk????.dat)、その番号とそのファイルの中の位置(何バイト目からか)で表現される。
CBlockIndex
チェーン内における1つのブロックを扱うクラス。CBlockクラスと違うのは、チェーン内の自身の位置や前ブロックへの直接の参照(こちらもCBlockIndexのインスタンスへの参照)を持つ。CBlock では前ブロックのハッシュ値しか持たない。
CDiskBlockIndex
CBlockIndexのサブクラス。
ファイルにブロックの情報を書き出すためのシリアライズ処理が定義してある。
CChain クラス
インメモリなブロックチェーンのインデックスです。チェーン内の任意の場所のブロックにアクセスするために利用できます。
例えば、chain.Genesis() でジェネシスブロックを、chain.Tip() で現在の最新のブロックを取得します。また、chain0 などで任意のheight のブロックを取得できます。 CChain クラスのインスタンス
CChainState クラスの chainActive フィールドで利用されている。validation.h で宣言され、各所からアクセスされている chainActive は、このCChainState のフィールドへの参照です。CChainState はシングルトンで g_chainstate というグローバルなオブジェクトが宣言されています。
BLockStatus
チェーンの状態を表す enum です。
BLOCK_VALID_UNKNOWN
未使用
BLOCK_VALID_TREE
全ての親ヘッダが見つかること(genesisブロックまで辿れる)
難易度が適正であること
タイムスタンプが前回の median time(過去11ブロックの中央値)とチェックポイントのもの以上であること
全ての親ブロックが BLOCK_VALID_TREE を満たすことを意味する
BLOCK_VALID_TRANSACTIONS
最初のトランザクションがコインベースTxである
コインベースTxのインプットのスクリプトの長さが2以上、100以下である
トランザクションが valid である
txid、sigops、size、merkle root が重複していない
全ての親ブロックが少なくとも BLOCK_VALID_TREE を満たすことを意味する。必ずしも BLOCK_VALID_TRANSACTIONS を満たすわけではない。
全ての親ブロックが BLOCK_VALID_TRANSACTIONS を満たすなら、CBlockIndex::nChainTx がセットされる。
nChainTx はチェーンのblockindexまでの全てのブロックのトランザクション数の合計。つまり、genesis から blockkindex までブロックをたどりながら全てのブロックに含まれるトランザクションの数を数え上げたもの。
BLOCK_HAVE_DATA
データを完全に blk*.dat ファイル内に持っているブロック
BLOCK_FAILED_VALID
stage after last reached validness failed(よく分かってないので、そのままコメントを引用)
BLOCK_FAILED_CHILD
descends from failed block(よく分かってないので、そのままコメントを引用。察するに、BLOCK_FAILS_VALID の子孫ブロック?)
BLOCK_FAILED_MASK
BLOCK_FALIED_VALID と BLOCK_FAILED_CHILD のいずれかに該当しないかチェックするためのマスク
GetBlockProof()
GetBlockProofEquivalentTime()
BlockProof をもとに2つのブロック間の時間の差を推定します。つまり、引数で渡す1つ目のブロックが生まれてから、2つ目のブロックが生成されるまでにかかる時間を Block Proof をもとに推定します。
LastCommonAncestor()
2つのチェーン感の共通の先祖ブロックを探します。つまり、フォークした時に、そのフォークチェーンがどこから枝分かれしたかを調べる処理です。