txindexオプションは有効にするべきか?

2018-10-21

最初にbitcoin.confを作成した時は、オプションは色々あるけどとりあえずどんな動きするのかわからないので、データを保存するフォルダの指定以外は全部デフォルトにしたんだよね。

こんな感じ。

$ cat bitcoin.conf
# Generated by https://jlopp.github.io/bitcoin-core-config-generator/

# This config should be placed in following path:
# ~/.bitcoin/bitcoin.conf

# [core]
# Specify a non-default location to store blockchain and other data.
datadir=/media/hdd/.bitcoin

ただ、このままだと自分のウォレットに関係しないトランザクションはインデックスされないようで、getrawtransactionコマンドを実行した場合なんかにデータ取得ができなかったりする。

開発や分析目的でBitcoin Coreを構築するならtxindexオプションを有効にした方がいいみたい。ただ、同期は遅くなると思うので、単なるウォレットとして使う場合などは必要ないと思う。マイニングのみが目的の場合もかな?

そんな議論(かなり前だけど)がこちらWhat are pros and cons of txindex option?

実際にgetrawtransactionコマンドを実行した時に、txindexオプションを有効にしていない場合は、トランザクションによっては情報が取得できない。下記の1つ目は取得可能なトランザクションで、2つ目は取得ができない。

$ bitcoin-cli getrawtransaction e9cff9ae72a0c66842df7e05e2a9e9506bcb05918c67cb63eec579f52ab666cc
0100000005ea1cd984838b7a510c5d99f5ab2179a5f845198f7e28515a4342b66df769aad0000000006a47304402200786892492df094b52bebd3be9e0b317deee24980623aa6810f45663d6f100f802204090e50c19b24d7f2433cb8bdf534e39cf7e37a34e772176b8dec9ab06888784012102c11724d7e56c88a9db394ca17cef74209069dd927daf6a65d6c8bd648da1b2a9ffffffffcc337f4b13c61779a28901beb53630c67fbfdb9874664f4eac2741685153702a010000006b483045022100ef939f6511fa4b5bb56dbffd6d8d4bff02148d8993c6ac21446eb5a19ef3bd8102205cd9307afeca02955b17be7b82ed24de4aac2c9c7533d93d83be6768daafea9d0121032f3ac1ee05d20626d3189d235c95f66f42c90c3383062345552d2085ff3e28d6ffffffff1663ce6ed15c7addb028da3bfd2b91192c492fbbee8096e3491e4b804193acbf050000006b483045022100f949b6260689ea9d23ee832003c91d5b02e431b5a3cbe3d01fcf91f8651e8fb002201890294c4f9ae30e42559477b3be50cbcff3b1ec91fdd3bb1d798023613bb8d8012102755b1e5f7019e4e943ad76422de2a6e0f7fcd7ff6f50f21172a2ee4dc529a2feffffffffa18acc99d75d421761c88467535d9a499587c0121f85d04e7f70c0052f7efb55010000006b483045022100e09c5862fa4fa5b40f4b03560d6d0638a176285c13acdd42fef730e37ca972650220083b18284181a056bd25de081133d5990142ede99d1756888b98e1e4597af4bd012102b89e8ddd17a9facfec3042ce2822dc05185066d6d102b6545855555b1c48ea8cffffffff0afbb375f4577a9967d283c9261c23b36eee5f71cb11f252641a5cb9b6837722000000006a473044022063d7c09f9a3a82453ff3fc78a7d97f48ccded3ec2f5777a8193734cebd60495b0220252126e31a52686e6976e8cfb43229f16a5387877197d60e62379a0cdce7cd54012103a0cae8ead6d3813aa049c7e4f23f7e7eb07383be987fc9984a69f056ea87ccffffffffff02ddca0200000000001976a9146211508410342cfb457f7ebb0d674de714f141ba88ac701c9100000000001976a914ed8a6aa0da15ffd497eac047d379c82c4def529888ac00000000

$ bitcoin-cli getrawtransaction d0aa69f76db642435a51287e8f1945f8a57921abf5995d0c517a8b8384d91cea
error code: -5
error message:
No such mempool transaction. Use -txindex to enable blockchain transaction queries. Use gettransaction for wallet transactions.

bitcoin.confを修正

ということで、僕は色々調べたい派なので、txindexが有効になるようにbitcoin.confを修正。

$ cat bitcoin.conf
# Generated by https://jlopp.github.io/bitcoin-core-config-generator/

# This config should be placed in following path:
# ~/.bitcoin/bitcoin.conf

# [core]
# Specify a non-default location to store blockchain and other data.
datadir=/media/hdd/.bitcoin
txindex=1  ←これを追加

bitcoindの再起動

どうせconfファイルなんて起動時のみ読み込むだけだろうし、indexの再構築をするには-reindexオプションを付けて起動しないといけないみたいなので、bitcoindを再起動する

$ bitcoin-cli stop
Bitcoin server stopping
$ bitcoind -reindex -daemon
Bitcoin server starting

とりあえず、debug.logを見たら「Reindexing block file…」と表示されているので、全てインデックスし直すのかー。どのくらいかかるんだろう?

2018-10-17T11:48:14Z Reindexing block file blk00000.dat...
2018-10-17T11:48:35Z Reindexing block file blk00001.dat...
2018-10-17T11:48:46Z Reindexing block file blk00002.dat...
2018-10-17T11:48:56Z Reindexing block file blk00003.dat...
2018-10-17T11:49:05Z Reindexing block file blk00004.dat...
2018-10-17T11:49:15Z Reindexing block file blk00005.dat...
2018-10-17T11:49:25Z Reindexing block file blk00006.dat...
2018-10-17T11:49:35Z Reindexing block file blk00007.dat...
2018-10-17T11:49:43Z Reindexing block file blk00008.dat...
2018-10-17T11:49:52Z Reindexing block file blk00009.dat...
2018-10-17T11:50:02Z Reindexing block file blk00010.dat...

blkxxxxx.datファイルを一つずつ再インデックス化しているみたいだけど、このファイル群って現時点でblk01402.datまで出来てるんだよね(`・д´・ ;)

しかも途中から既に同期済みのチェーンのアップデートも走り始めたので、多分長丁場になりそうな気がするよw

2018-10-17T12:25:02Z Pre-allocating up to position 0x100000 in rev00000.dat
2018-10-17T12:25:02Z UpdateTip: new best=00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048 height=1 version=0x00000001 log2_work=33.000022 tx=2 date='2009-01-09T02:54:25Z' progress=0.000000 cache=0.0MiB(1txo)
2018-10-17T12:25:02Z UpdateTip: new best=000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd height=2 version=0x00000001 log2_work=33.584985 tx=3 date='2009-01-09T02:55:44Z' progress=0.000000 cache=0.0MiB(2txo)
2018-10-17T12:25:02Z UpdateTip: new best=0000000082b5015589a3fdf2d4baff403e6f0be035a5d9742c1cae6295464449 height=3 version=0x00000001 log2_work=34.000022 tx=4 date='2009-01-09T03:02:53Z' progress=0.000000 cache=0.0MiB(3txo)

再インデックス中は、最新ブロックの情報を取得した時も過去に戻っていた。

$ bitcoin-cli getblockcount
137133

$ bitcoin-cli getbestblockhash | xargs bitcoin-cli getblock
{
  "hash": "000000000000031121a992b8a7b08bfa22726d42490d885b5d7754704e35e987",
  "confirmations": 7,
  "strippedsize": 3717,
  "size": 3717,
  "weight": 14868,
  "height": 138525,
  "version": 1,
  "versionHex": "00000001",
  "merkleroot": "830294b556ea208e67eea0ce0c0f8388a15780404acab54c3014954fee0c3230",
  "tx": [
    "87dfef10bbce4bebace9aa43d7b02a54a894d6cc688fee90c695355cd7350bad",
    "78cc168315a4915af01292793bd4f0677e5ca4dcc99fee63d8e19fee50e67082",
    "7c4499b3725aef6faf7889d464d9107d025140f3be3e172186d6e5a3840adf04",
    "9926bcc6c4c83b2168c2f95b01e15b694f3f09898b7eccd8b6f28f5d22bb2a76",
    "44d1705824458135732efaadcaaa3bea94b230b36a2d7afc98818855ee5407db",
    "9c81402a1b43bef830814ae1b28f6e6e0c65a24ec6fd0d915c275a8e5945342e",
    "1868f9e965e57fce71392949b6d626ac94289b277c904390b77805a0c9b8e16b",
    "4939b88bbb2f3e9c0c37e3bbfb232a67124fc89a1fc22f8c1da15fdc7dc9e6a6",
    "01b49d91a8558b77ddde0c2d0ce5f57f8d2e4f9d64094ec988bd6371a4f98025",
    "1d6f4eecb2d1273dda72cfff76cbfc4a85e506a2d524fb71678b7ed69d81c284",
    "cbb92ec42f6c2d915ed7d391c2af8162b500249288d98b10d09735915d10baaf",
    "d4b955cb506317fa2d3987930244b2531c8b9ce3f65caf30d55a46dfa4f5a31b",
    "15fc9084591f8311478db41009f37b46021ab2f2de03a874c153e135f2722fa9",
    "db48e2c44d50a01c9dff1cdbba59579a75f51d6e83b4fdf64064ca272c77f84f"
  ],
  "time": 1311882193,
  "mediantime": 1311879083,
  "nonce": 532878446,
  "bits": "1a09ec04",
  "difficulty": 1690895.803052393,
  "chainwork": "000000000000000000000000000000000000000000000003541ce5ec3223291e",
  "nTx": 14,
  "previousblockhash": "00000000000002edb9c42ab9a31a3f09906f550adf6111962696af93c0880d3c",
  "nextblockhash": "00000000000004cd9ba0f389697f6f17022425ad6ef9bf45130c88389426fecd"
}

とりあえずしばらく放置ですねー(。・ω・)ノ゙

チェーンの同期が追いついた(追記)

チェーンが追いついていたので追記。

2018-10-20T00:26:40Z UpdateTip: new best=0000000000000000000ec5755f0acdbb1d9177247b059db99f8b54bdf455fe3a height=546492 version=0x20000000 log2_work=89.880318 tx=349985997 date='2018-10-20T00:04:30Z' progress=0.999991 cache=336.4MiB(2875914txo) warning='9 of last 100 blocks have unexpected version'
2018-10-20T00:28:09Z UpdateTip: new best=00000000000000000007a2d3543804d851b6e4758302859f4f23d7323c2398b6 height=546493 version=0x20000000 log2_work=89.880357 tx=349988601 date='2018-10-20T00:27:40Z' progress=1.000000 cache=336.8MiB(2879714txo) warning='9 of last 100 blocks have unexpected version'
2018-10-20T00:33:54Z UpdateTip: new best=0000000000000000001b4f3fc02999476e0f664882fe404e62a26b10bb98f3b6 height=546494 version=0x3fffe000 log2_work=89.880396 tx=349991610 date='2018-10-20T00:33:40Z' progress=1.000000 cache=337.0MiB(2881600txo) warning='10 of last 100 blocks have unexpected version'

2018-10-17 12:25:02 (UTC) から始めて、2018-10-20 00:28:09 (UTC) で追いついたから約60時間かかった。最初にmainnetと同期した時(3ヶ月前)は50時間かかったけど、それよりも時間がかかってる。もしかしたら、txindexオプションを有効にした状態で、mainetと同期すると1週間ぐらいかかってしまうかも。

同期が追いついていたので、以前はgetrawtransactionで取得できなかったトランザクションIDを指定すると

$ bitcoin-cli getrawtransaction d0aa69f76db642435a51287e8f1945f8a57921abf5995d0c517a8b8384d91cea
0100000001001697bc2b0874d52925ad2b330564685e1efb3155915aaedd1668ca57d57747090000006b48304502210081bc84312024074b05d482f554903e4f109a862b362560fe14892231fd400e3b022045d932909d95950c3a87e40b6005670a1b046dec54e351596a49637db1e632db012103a0cae8ead6d3813aa049c7e4f23f7e7eb07383be987fc9984a69f056ea87ccffffffffff026fa70a00000000001976a914dfaae948ac89caea9bfbc0d29d805883ecb02a3788ac60182300000000001976a9140826e8ac09eda307f0b2957addb9bd36904fdb2e88ac00000000

ちゃんとデータが取得できるようになった!よかったよかった(。・ω・)ノ゙