RealPath:
WebPath:
2017/01/08 18:29 (JST) 更新
ブロック >>

ブロックの構造

Contents

ブロックは複数のトランザクションを保有する。保有されるトランザクション数は固定ではない。

ブロックヘッダ

class CBlockHeader
{
public:
    // header
    int32_t  nVersion;
    uint256  hashPrevBlock;
    uint256  hashMerkleRoot;
    uint32_t nTime;
    uint32_t nBits;
    uint32_t nNonce;
};

ブロック本体

class CBlock : public CBlockHeader
{
public:
    // network and disk
    std::vector<CTransactionRef> vtx; // ブロックが保有するトランザクションリスト

    // memory only
    mutable bool fChecked;
};

ブロックバージョンについて

ブロックにはバージョンがある。

ブロックインデックス

基本的にブロックの集合は CBlockHeader や CBlock ではなく CBlockInstance という別クラスのインスタンス集合によりメモリ上で管理されることが多い。

例えば同期済みのブロック集合は CChain クラスのインスタンス上で std::vector<CBlockIndex*> vChain; として保持されている。
このメモリ上のブロック集合は bitcoind 起動時にファイルから読み取られ構築される。そしてその後の動的に追加されるブロック情報もここに随時追加されていく。

ブロックインデックスの集合

// グローバル変数
CChain chainActive;
class CChain {
private:
    std::vector<CBlockIndex*> vChain;
};

ブロックインデックス定義

class CBlockIndex
{
public:
    //! pointer to the hash of the block, if any. Memory is owned by this CBlockIndex
    // 256bit(32byte)のブロックハッシュ(バイナリ)。これは文字列(16進表記)で表すと64文字になる。
    const uint256* phashBlock;

    //! pointer to the index of the predecessor of this block
    // 直前のブロック情報へのポインタ
    CBlockIndex* pprev;

    //! pointer to the index of some further predecessor of this block
    CBlockIndex* pskip;

    //! height of the entry in the chain. The genesis block has height 0
    // ブロック高。genesisブロックのブロック高は 0。その次のブロックのブロック高は 1。さらにその次のブロックのブロック高は 2。のような感じ。
    int nHeight;

    // ブロックインデックスが保管されているファイル情報 (blk?????.dat)
    int nFile; //!< Which # file this block is stored in (blk?????.dat)
    unsigned int nDataPos; //!< Byte offset within blk?????.dat where this block's data is stored

    //! Byte offset within rev?????.dat where this block's undo data is stored
    unsigned int nUndoPos;

    //! (memory only) Total amount of work (expected number of hashes) in the chain up to and including this block
    arith_uint256 nChainWork;

    //! Number of transactions in this block.
    //! Note: in a potential headers-first mode, this number cannot be relied upon
    unsigned int nTx;

    //! (memory only) Number of transactions in the chain up to and including this block.
    //! This value will be non-zero only if and only if transactions for this block and all its parents are available.
    //! Change to 64-bit type when necessary; won't happen before 2030
    unsigned int nChainTx;

    //! Verification status of this block. See enum BlockStatus
    unsigned int nStatus;

    //! block header
    // ここのメンバ変数群がいわゆるブロックヘッダ情報にあたる
    int nVersion;           // 4バイト
    uint256 hashMerkleRoot; // 32バイト
    unsigned int nTime;     // 4バイト
    unsigned int nBits;     // 4バイト
    unsigned int nNonce;    // 4バイト

    //! (memory only) Sequential id assigned to distinguish order in which blocks are received.
    int32_t nSequenceId;
    ....

最新ブロック情報

以下のようなアクセスにより最新ブロックハッシュを取得できる。

chainActive.Tip()->GetBlockHash()

 
これは bitcoin-cli コマンドにおいては以下と同等である。

$ bitcoin-cli getbestblockhash

ブロックインデックス総数(同期済みブロック総数)

以下のようなアクセスによりブロックインデックス総数(同期済みブロック総数)を取得できる。

chainActive.Height()

 
これは bitcoin-cli コマンドにおいては以下により表示できる。

$ bitcoin-cli getinfo | grep blocks
  "blocks": 208,

ブロックヘッダ → ブロックインデックス変換

CBlockIndex::CBlockIndex(const CBlockHeader& block)