bcwallet.rb で ブロック同期している仕組みがやっとわかる

技術メモ

いままで散々悩んでたのはなんだったのかと思いたいぐらいなんだが
結論、同期しているブロックのhash達は @data 変数で保持されていて、ファイル(data_testnet)にも保存されている。

getblocks で最後に同期した hash を無理やりハードコーディングで送って

getblocks -1 to end limit 500

とか出ていたのは、getblocks の block_locator で送っていた文字列が間違っていたため
bitcoind側で該当のhashを見つけることができず -1 を返していた
ということだと思われる。

getblocksの block_locator で渡すhashをlast_hashを p コマンドで直接吐き出すと

p @last_hash
{ timestamp: 0, hash: 'CIx7FxD7xF8&x95qbxF4xA3x0FxD9xCExC3xAExBAyx97 x84xE9x0ExADx01xEA3tx00x00x00x00'}

こんなんで出力されるけど、ちゃんとhash文字で表示されるように

p @last_hash[:hash].reverse.unpack('H*')
000000007f0eaec313e119f8ba4ad2df1d9a617771058f25d65c1263bec75589

で表示される文字列を指定して

['000000007f0eaec313e119f8ba4ad2df1d9a617771058f25d65c1263bec75589'].pack('H*').reverse

を block_locator に渡してあげたら

getblocks 3000 to end limit 500

のように -1 が表示されず 3000などのちゃんとした値が表示されるようになった。

なんで、結果 @data の値がちゃんと保持されているので、プログラムが停止するタイミングで
ファイル(data_testnet)
が壊れないようにしてやるだけでよさそう。

ファイル保持するタイミングは invコマンドをやりとりするタイミングにした。

https://github.com/peryaudo/bcwallet/blob/master/bcwallet.rb#L1152
のあたりに
@blockchain.save_data
を追加。

https://github.com/peryaudo/bcwallet/blob/master/bcwallet.rb#L1161
disptchh_merkleblock
でもよいが、saveする頻度多すぎるで処理が重くなるため却下。

そして、bcwallet.rb を実行し

114002 / 1126004

あたりで、ctrl-c で止めてみる。

その後、再度 bcwallet.rbを起動すると・・・

bcwallet.rb:678:in `restore': marshal data too short (ArgumentError)

おぉっと、、、データファイル(data_testnet) が壊れたようだ、、、
ctrl-c にしろイベント受け付けて安全に停止できる必要がありそうだ。

そのあたり少し改良してみるか。

Sponsored Link

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

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

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

コメントを残す

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

CAPTCHA


Ethereum(イーサリアム)
Ethereumの開発用ツールリストが公開されていた!

ALISのCTO石井さんがつぶやいてたんですが とてもありがたい #Ethereum 開発ツールの一 …

技術メモ
Counterpartyの環境構築が大変という話

暗号通貨の独自通貨を作ろうとするとEthereumが有名で簡単ですが、BitcoinでもCounte …

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

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