bcwallet.rb でブロックを読み込んだ途中経過で保存できた

技術メモ

前回の続き。今度こそ途中経過を保存するぞ。

処理が停止している時の bitcoind側のdebug.logを調べてみると(bitcoind -daemon -debug=1で起動している)、以下のまま停止。

2017-05-22 15:11:21 Added connection peer=10
2017-05-22 15:11:21 connection from [::1]:52392 accepted
2017-05-22 15:11:21 received: version (104 bytes) peer=10
2017-05-22 15:11:21 sending version (102 bytes) peer=10
2017-05-22 15:11:21 send version message: version 70015, blocks=1125343, us=[::]:0, peer=10
2017-05-22 15:11:21 sending verack (0 bytes) peer=10
2017-05-22 15:11:21 receive version message: /bcwallet.rb:1.00/: version 70002, blocks=2501, us=0.0.0.0:8333, peer=10
2017-05-22 15:11:21 sending alert (168 bytes) peer=10
2017-05-22 15:11:21 received: verack (0 bytes) peer=10
2017-05-22 15:11:21 sending ping (8 bytes) peer=10
2017-05-22 15:11:21 received: pong (8 bytes) peer=10
2017-05-22 15:11:21 received: filterload (524 bytes) peer=10
2017-05-22 15:11:21 received: mempool (0 bytes) peer=10
2017-05-22 15:11:21 received: getblocks (69 bytes) peer=10
2017-05-22 15:11:21 getblocks -1 to end limit 500 from peer=10
2017-05-22 15:11:23 socket closed
2017-05-22 15:11:23 disconnecting peer=10

そして、data_testnet ファイル(ブロック同期用の保存ファイル)を削除してまっさらな状態で起動した場合のログは以下。

2017-05-22 15:17:02 Added connection peer=12
2017-05-22 15:17:02 connection from [::1]:52410 accepted
2017-05-22 15:17:02 received: version (104 bytes) peer=12
2017-05-22 15:17:02 sending version (102 bytes) peer=12
2017-05-22 15:17:02 send version message: version 70015, blocks=1125343, us=[::]:0, peer=12
2017-05-22 15:17:02 sending verack (0 bytes) peer=12
2017-05-22 15:17:02 receive version message: /bcwallet.rb:1.00/: version 70002, blocks=-1, us=0.0.0.0:8333, peer=12
2017-05-22 15:17:02 sending alert (168 bytes) peer=12
2017-05-22 15:17:02 received: verack (0 bytes) peer=12
2017-05-22 15:17:02 sending ping (8 bytes) peer=12
2017-05-22 15:17:02 received: pong (8 bytes) peer=12
2017-05-22 15:17:02 received: filterload (524 bytes) peer=12
2017-05-22 15:17:02 received: mempool (0 bytes) peer=12
2017-05-22 15:17:02 received: getdata (37 bytes) peer=12   ★★★★★★★★★★★★★★★★  getdata がちゃんと送られている。
2017-05-22 15:17:02 received getdata (1 invsz) peer=12
2017-05-22 15:17:02 received getdata for: merkleblock 000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943 peer=12
2017-05-22 15:17:02 sending merkleblock (119 bytes) peer=12
2017-05-22 15:17:02 received: getblocks (69 bytes) peer=12
2017-05-22 15:17:02 getblocks 1 to end limit 500 from peer=12
2017-05-22 15:17:02   getblocks stopping at limit 500 00000000a2424460c992803ed44cfe0c0333e91af04fde9a6a97b468bf1b5f70
2017-05-22 15:17:02 sending inv (18003 bytes) peer=12
2017-05-22 15:17:02 received: getblocks (69 bytes) peer=12
2017-05-22 15:17:02 getblocks 1 to end limit 500 from peer=12
2017-05-22 15:17:02   getblocks stopping at limit 500 00000000a2424460c992803ed44cfe0c0333e91af04fde9a6a97b468bf1b5f70
2017-05-22 15:17:02 sending inv (18003 bytes) peer=12
2017-05-22 15:17:02 received: getdata (18003 bytes) peer=12
2017-05-22 15:17:02 received getdata (500 invsz) peer=12
2017-05-22 15:17:02 received getdata for: merkleblock 00000000b873e79784647a6c82962c70d228557d24a747ea4d1b8bbe878e1206 peer=12
2017-05-22 15:17:02 sending merkleblock (119 bytes) peer=12
2017-05-22 15:17:02 sending merkleblock (119 bytes) peer=12

こうして見比べてみると、まっさらな状態の時は getdataコマンドがちゃんとwallet側から送られている。
この違いかなぁ。

https://github.com/peryaudo/bcwallet/blob/master/bcwallet.rb#L1039

  def send_getblocks
  :
  :
    if @blockchain.blocks.empty?
      send_getdata([{type: Message::MSG_FILTERED_BLOCK, hash: @last_hash[:hash]}])
    end
  :
  :

send_getblocksで、 ブロックがからの場合に getdataを送っている。
じゃぁ、これ起動時のみ send_getdata送るようにしてみる。

2017-05-23 09:35:53 Added connection peer=12
2017-05-23 09:35:53 connection from [::1]:48304 accepted
2017-05-23 09:35:53 received: version (104 bytes) peer=12
2017-05-23 09:35:53 sending version (102 bytes) peer=12
2017-05-23 09:35:53 send version message: version 70015, blocks=1125448, us=[::]:0, peer=12
2017-05-23 09:35:53 sending verack (0 bytes) peer=12
2017-05-23 09:35:53 receive version message: /bcwallet.rb:1.00/: version 70002, blocks=1501, us=0.0.0.0:8333, peer=12
2017-05-23 09:35:53 sending alert (168 bytes) peer=12
2017-05-23 09:35:53 received: verack (0 bytes) peer=12
2017-05-23 09:35:53 sending ping (8 bytes) peer=12
2017-05-23 09:35:53 received: pong (8 bytes) peer=12
2017-05-23 09:35:53 received: filterload (524 bytes) peer=12
2017-05-23 09:35:53 received: mempool (0 bytes) peer=12
2017-05-23 09:35:53 received: getdata (37 bytes) peer=12
2017-05-23 09:35:53 received getdata (1 invsz) peer=12
2017-05-23 09:35:53 received getdata for: merkleblock 0000000000000468e9fd39a9da9e3ed82544de906a1977845660ee02beec90d6 peer=12
2017-05-23 09:35:53 sending merkleblock (119 bytes) peer=12
2017-05-23 09:35:53 received: getblocks (69 bytes) peer=12
2017-05-23 09:35:53 getblocks -1 to end limit 500 from peer=12
2017-05-23 09:35:53 received: getblocks (69 bytes) peer=12
2017-05-23 09:35:53 getblocks -1 to end limit 500 from peer=12

すると、上記のようなログが。
結局、「getblocks -1 to end limit 500」のログをはいておわってしまう。

https://github.com/bcoin-org/bcoin/issues/129

のissueで似たような問題が取り上げられていた。

うまくgetblocksができている時は以下のように getblocks XXXX to end のように数字が積み重なっていく。

2017-05-23 09:31:25 getblocks 1001 to end limit 500 from peer=8
2017-05-23 09:31:25 getblocks stopping at limit 1500 00000000cabd2d0245add40f335bab18d3e837eccf868b64aabbbbac74fb21e0

なぜ、getblocksは途中で処理停止すると進まなくなるんだろうか?
getblocksで送信しているパラメータを見てみる。

  def send_getblocks
  :
  :
    @message.write(@socket, {
      command: :getblocks,

      version: PROTOCOL_VERSION,
      block_locator: [@last_hash[:hash]],
      hash_stop: ['00' * 32].pack('H*')
    })
  :
  :

と、block_locator に @last_hash[:hash] を渡していて、この値だけが可変。
この辺りを調べてみよう。

Sponsored Link

ビットコイン(Bitcoin)、イーサリアム(Ethereum)、リップル(Ripple)、ネム(NEM)などの仮想通貨を買うならZaifがおすすめです。

特に国内でETHを購入するなら、アルトコインでも板取引に対応しているZaif(ザイフ)が割安なのでよいですよ。

コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


Ethereum(イーサリアム)
Error: The contract code couldn’t be stored, please check your gas amount.

ALISのICOソースのzeppelinバージョンを1.2から1.8にあげようとしたときにはまったエ …

Dapps
日本の都道府県を所有できるDApps & ERC721 のサンプルを公開してみました

最近、Ethereum上でカードなどを所有できるdAppsが流行っているので、試しに日本の都道府県を …

Ethereum(イーサリアム)
TX doesn’t have the correct nonce – Metamask

EthereumのdAppsを作ろうとしていてはまったのでメモ。 Metamaskを使用して支払いを …