bcwallet.rb で見ていくbitcoinのhandshake

技術メモ

前回も ruby bcwallet.rb balance が終わらず四苦八苦していたが、今回も再度挑戦。

|=============================================_____| 1020596 / 1123849 -

うぉー、またもうちょっとというところでPG止めなければいけない、、、
同期に1時間かかるので、なぜ時間かかるか調べていたところ

bcwallet.rbは

何故bcwallet.rbは他のSPVクライアントより遅いのか 上のbcwallet.rbを実際に試して頂いた方で、MultiBitなどの他のSPVのBitcoinクライアントを使ったことのある方は、どうしてbcwallet.rbの初回起動時の同期は遅いのかと思われた方も居るかもしれない。

これは、他のSPVクライアントは、アドレスの作成日時・作成時点での最終ブロックなどの情報を用いて、それより前のブロックのダウンロードを省いているからである。bcwallet.rbは教育用であり、このような複雑な処理を省いて単純化をはかる代わり、はじめに全てのブロックをダウンロードしている。

とのこと。最終ブロックのダウンロードだけするように改造できるということか。
ただ、やり方が現時点ではさっぱりわからず、、、

ということで、同期をとっている時にどのブロックまで取得しているか?を計測できるか調べてみる。

handshakeコマンドのやりとり

ログを仕込んで、socketで write, read しているところのやりとりみると

# ruby bcwallet.rb balance
"write = version"
"read  = version"
"write = verack"
"read  = verack"
"read  = alert"
"read  = ping"
"write = pong"
"write = filterload"
"write = mempool"
"write = getdata"
"write = getblocks"
"read  = merkleblock"
"write = getblocks"
"read  = inv"
"write = getdata"
"read  = inv"
"write = getdata"
"read  = merkleblock"
"read  = merkleblock"
  :
  :

となっている。
上から順に見ていくと

"write = version"
"read  = version"
"write = verack"
"read  = verack"

http://bitcoinbook-builds.mkvd.net/translations/ja/chapter-6.html
Mastering Bitcoinの第6章の図を見るとまず、ネットワーク開始するときに version, verackのやりとりをやりあう。

その次は alert だが、これは前回はまったところで、bcwallet.rb がalertに対応していなくて落ちた。

"read  = alert"

これは一旦スルー。

その次。

"read  = ping"
"write = pong"

これもhandshakeの一環。ping, pong この辺り参照。

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

にも書いてあるけど

    # Local -- version -> Remote
# Local Remote
# Local

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

コメントを残す

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

CAPTCHA


Dapps
Plasma Porker をとりあえず動かす

最近、Plasma界隈で賑わしている Plasma Prime。 Plasma Prime desi …

仮想通貨全般
TendermintをDocker使って起動してみる

以前、勉強会に行ってきた際にTendermintの事を聞いて ブロックチェーンプロトコルが実装できる …

仮想通貨全般
Bitcoinのdifficultyを決めるnBitsを理解する

マイニングする際の理解を深めようと思い、マイニング難易度(difficulty)を決めるnBitsに …