フレセッツ技術ブログ弊社エンジニアがブロックチェーンの旬の話題をお届けします。2019の13日目の記事です。Cash(BTC)のハードフォーク(HF)がありました。BTCは律儀に半...tech.fressets.com2019.12.13(https://tech.fressets.com/bitcoinプロトコルをrustでお話してみる(前編)/)">bitcoinプロトコルをrustでお話してみる(前編)の続きの記事です。2019の中の記事の一つとして書きましたが、気がつくとあっという間に12月も終わってしまっていて、後編をエントリーし損ねました(^^;今回は実際にブロック到達の通知を貰ってからブロック詳細情報を取ってくるところを書きたいと思います。処理の大まかな流れ(おさらい)前編でも書きましたが、処理の流れはこの様になっています。相手が生きているかどうか、定期的にチェックブロックが到達したという通知を待つ「到達した」という情報が来たら、さらに詳しいブロック情報をリクエストしゲット!前回はStep3までカバーしたので、今回はStep4と5の解説になります。連続した流れなので一つの章で説明しちゃいます。新しいブロックやトランザクションの情報がフルノードサーバに届いた場合、その情報は繋がっているピア(接続しているホスト)に通知されます。Invメッセージになります。InvメッセージはボディにInventory構造体の配列を持ちます。Inventory構造体は以下のように定義されています。WitnessTransaction}これを受け取って処理する部分はこのようになります。on_inv_block()というメソッドを呼びます。NetworkMessage::GetData([inv].to_vec()));}on_inv_block()の中でsend_getdata()を呼んでいて、そこで受け取ったInventory型のデータをそのまま渡します。ピアに対してGetDataメッセージを送り、ブロックの詳細情報をリクエストします。GetDataに対する返答がBlcokメッセージで返されます。ややこしいのですが、BlockメッセージのボディがBlockという名前の構造体で、中身は以下のようになっています。これを受け取るコードが以下になります。}}本来であれば、受け取ったブロックをDBに格納して解析などに利用するところですが、Bitcoinのプロトコルを理解する上では本質的ではない部分なので割愛し、ここでは受け取った情報をそのまま標準出力に書き出しています。まとめ分量的にはだいぶコンパクトになりましたが、Bitcoinのプロトコルを用いてブロックの情報を入手する方法を解説してみました。いうメッセージにより新たに生成されたブロックの情報が伝播され、それを元に詳細な情報を入手する方法がわかったかと思います。Bitcoinというクレートですが、一つ残念な部分があります。前編でも書いたようにBitcoinのプロトコルを話す最初にVersionメッセージを送るのですが、このクレートはバージョンが70001に固定になっています。Bitcoindのバージョンでいうと、2013年のv0.8.0相当。それ以降に追加されたメッセージタイプなどは残念ながらサポートされていません。いうことで、このクレートをそのまま商用に使うのはちょっと厳しそうです。一方で、オープンソースなので自分で変更を加えることは可能です。Blockの対応を入れようとしてやり取りが続いています。そんな活動に足を踏み入れてOSSに貢献しながら、商用利用の道を探るというのも有りかも知れません。健一いろいろやってます。接続とパケットの解析(パース)は出来るようになりました。やりとりして、ハンドシェイクをしていきます。フリをしてみようと思います。2019の7日目の記事です。Signetについて興味を持ち、10月のビットコインとか勉強会#34でもハンズオンを行いました。2019の13日目の記事です。Cash(BTC)のハードフォーク(HF)がありました。ブロックチェーン業界に転職して約1年。運用周りの比較的泥臭いことをやってきました。日々思うことをざっとまとめてみました。通信してみる(後編)ホームお知らせフレセッツ株式会社とは暗号資産(仮想通貨)取引所向けに事業者用ウォレットシステムを提供する事業を行っています。コールド/ホットを問わず、マルチシグ対応のウォレットを作っています。Reserved.ホーム検索トップサイドバーフレセッツ株式会社とは暗号資産(仮想通貨)取引所向けに事業者用ウォレットシステムを提供する事業を行っています。コールド/ホットを問わず、マルチシグ対応のウォレットを作っています。Lemma)の解説と具体例2019.12.092019.12.18カテゴリーお知らせ最近のコメントタイトルとURLをコピーしました。