RealPath:
WebPath:
2017/01/09 00:25 (JST) 更新
ブロック >>

ブロックチェーン情報

Contents

現在のブロックチェーン情報

bash
# bitcoin-cli getblockchaininfo
{
  "chain": "test",
  "blocks": 277300, ← ★ローカルに同期済みのブロック数 (同期が完了すれば headers と同じ値になる)
  "headers": 1038089, ← ★ネットワーク上にある全ブロック数
  "bestblockhash": "0000000015b5695111eb54d2b66b547be9877f3a00784262764c951672c466fa",
  "difficulty": 1,
  "mediantime": 1408993225,
  "verificationprogress": 0.9051154576318484,
  "chainwork": "0000000000000000000000000000000000000000000000003b69a74e1eb8e8d7",
  "pruned": false,
  "softforks": [
    {
      "id": "bip34",
      "version": 2,
      "enforce": {
        "status": true,
        "found": 100,
        "required": 51,
        "window": 100
      },
      "reject": {
        "status": true,
        "found": 100,
        "required": 75,
        "window": 100
      }
    },
    ....

最新のブロックハッシュを取得: getbestblockhash

ローカルに同期済みのブロック群のうち、チェーンの最も最先端のブロックのハッシュを取得する。

$ bitcoin-cli getbestblockhash
1555336a1bf85041fe60866c10739f08594e4786f96a9a94e43c2e70669c3f16

現在のブロック数を取得: getblockcount

$ bitcoin-cli getblockcount
4

指定位置のブロックハッシュを取得: getblockhash

$ bitcoin-cli getblockcount
4

ブロック数が 4 である状態で以下コマンドを試してみる。実はこの 4 という数値は genesis ブロックを含めないブロック数である。

$ bitcoin-cli getblockhash 0
0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206 ← genesis ブロックのハッシュ

$ bitcoin-cli getblockhash 1
495f7a7a9d4eff533350e6f460f481ab1ab6939e78c907d242276544a773d6e5 ← 最初の generate で生成されたブロックのハッシュ

$ bitcoin-cli getblockhash 2
34d154422f2cc332a3a636ff579aa76197f75309830f81fa688e998d710b5ad4

$ bitcoin-cli getblockhash 3
74c5af2b5ded62485741a090b3748d18127a3aebc296cea340499ff238ee58f7

$ bitcoin-cli getblockhash 4
1555336a1bf85041fe60866c10739f08594e4786f96a9a94e43c2e70669c3f16 ← ここまでは有効なハッシュが返る

$ bitcoin-cli getblockhash 5 ← (genesis以外の) ブロックは4つしかないので、これは範囲外エラーとなる。
error code: -8
error message:
Block height out of range

指定ブロックの情報を取得: getblock

ブロックのハッシュ値を指定して対象ブロックの詳細を表示する。

$ bitcoin-cli getblock 1555336a1bf85041fe60866c10739f08594e4786f96a9a94e43c2e70669c3f16
{
  "hash": "1555336a1bf85041fe60866c10739f08594e4786f96a9a94e43c2e70669c3f16",
  "confirmations": 1,
  "strippedsize": 226,
  "size": 226,
  "weight": 904,
  "height": 4, ← ブロック高
  "version": 536870912,
  "versionHex": "20000000",
  "merkleroot": "72418a9a7dae94a5202f4001bd836d4e7547a2643fc29c69aa68ec554edcb1ee",
  "tx": [
    "72418a9a7dae94a5202f4001bd836d4e7547a2643fc29c69aa68ec554edcb1ee"
  ],
  "time": 1483029866,
  "mediantime": 1483025041,
  "nonce": 2,
  "bits": "207fffff",
  "difficulty": 4.656542373906925e-10,
  "chainwork": "000000000000000000000000000000000000000000000000000000000000000a",
  "previousblockhash": "74c5af2b5ded62485741a090b3748d18127a3aebc296cea340499ff238ee58f7" ← 直前のブロックハッシュ
}

previousblockhash により示される「直前のブロックハッシュ」が割と重要。

ブロックチェーンの構造

ブロックは常に自分の直前のブロックハッシュ (previousblockhash) を保持する。
逆に、ブロックは自分の直後のブロック情報を知らない。

端的にいうとブロックチェーンの構造は双方向リストではなく片方向リストの形をとる。

※ bitcoin-cli getblock の結果によって nextblockhash という値を知ることもできるが、これはメモリ上から算出しているだけで、ブロックデータ自体が次のブロック情報を持っているわけではない。

genesis ブロック

ノードによる採掘(ブロック生成)が行われる以前から存在する唯一の先頭ブロックを genesis ブロックと呼ぶ。
genesis ブロックはソースコード上にハードコーディングされている。

mainnetの場合

chainparams.cpp

CMainParams() {
    ....
    // genesisブロックの生成
    //   nTime = 1231006505 = 2009/01/03 18:15:05 GMT
    //   nonce = 2083236893
    //   nBits = 0x1d00ffff
    //   nVersion = 1
    //   genesisReward = 50BTC
    genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN);
    consensus.hashGenesisBlock = genesis.GetHash();

    // genesisブロックのハッシュ値
    assert(consensus.hashGenesisBlock == uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"));
  • 上記に含まれるタイムスタンプ 1231006505 = 2009/01/03 18:15:05 GMT および genesis ブロックのハッシュ値 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f および nonce 値 2083236893 は以下コミットで設定されている。
    • First commit (2番目のコミット) … /main.cpp
      (コミット日時は 2009/08/30 03:46 GMT)

※実際には GitHub に移行する以前には Sourceforge にてソースコードは管理されており、Sourceforget 側は 2011/09/13 の r252 最後のコミットとし、完全に GitHub に移行した。

testnet の場合

chainparams.cpp

CTestNetParams() {
    ....

    // genesisブロックの生成
    //   nTime = 1296688602 = 2011/02/02 23:16:42 GMT
    //   nonce = 414098458
    //   nBits = 0x1d00ffff
    //   nVersion = 1
    //   genesisReward = 50BTC
    genesis = CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN);

    // genesisブロックのハッシュ値
    consensus.hashGenesisBlock = genesis.GetHash();
    assert(consensus.hashGenesisBlock == uint256S("0x000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943"));
  • 上記に含まれるタイムスタンプ 1296688602 = 2011/02/02 23:16:42 GMT は以下プルリクエストで設定されている。
  • また、上記に含まれるgenesisブロックのハッシュ値 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943 および nonce 値 414098458 は以下プルリクエストで設定されている。

regtest の場合

chainparams.cpp

CRegTestParams() {
    ....

    // genesisブロックの生成
    //   nTime = 1296688602 = 2011/02/02 23:16:42 GMT
    //   nonce = 2
    //   nBits = 0x207fffff
    //   nVersion = 1
    //   genesisReward = 50BTC
    genesis = CreateGenesisBlock(1296688602, 2, 0x207fffff, 1, 50 * COIN);

    // genesisブロックのハッシュ値
    consensus.hashGenesisBlock = genesis.GetHash();
    assert(consensus.hashGenesisBlock == uint256S("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"));

    ...

    checkpointData = (CCheckpointData){
        boost::assign::map_list_of
        ( 0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")), // genesisブロックのハッシュ値
        0,
        0,
        0
    };