用語集 / 開発者向けリファレンス
MSG_TX
- MSG_TXとは?
- MSG_TXはインベントリの項目をトランザクションとして、タイプコード1で示すものであり、未承認の支払いが、どのピアもその内容を見る前に、ピアへ告知される仕組みです。
ビットコインの告知プロトコルでは、支払いとブロックを分ける数字が1つあり、その数字は1です。これはトランザクションの32バイトの識別子、合計36バイトとともに送られ、送信者に何も約束しません。バイト列が動くのは、ピアがgetdataで応答したときだけです。Bitcoin Core 0.21.0以降、ほとんどのピアはまったく別のコードで告知します。
仕組み
MSG_TXはトランザクションをtxid、すなわちウィットネスデータを除いて計算した識別子で指定します。
あなたの支払いをメモリプールに受け入れたノードは、そのハッシュが存在することをピアに伝えます。それを持たないピアが要求し、そのときになって初めて内容がtxメッセージで送られます。ノードがもはや保持していないものを要求したピアにはnotfoundが返ります。これは日常的に起こります。メモリプールは負荷がかかると追い出しを行い、ノードはすでに破棄したトランザクションのコピーを誰に対しても負うものではありません。
提供は意図的に渋く行われます。Bitcoin Coreは、告知していないピアには、そのトランザクションがメモリプールに2分ほど滞留するまでトランザクションを渡しません。この遅延がなければ、見知らぬ相手が接続し、getdataを使ってあなたのノードが特定の支払いを知っているかを試せます。そうなると、あらゆるノードが自らのメモリプールへの照会窓口になってしまい、支払いが最初にどこに現れたかを突き止めるのがはるかに容易になります。
タイプ1は古いシリアル化の規則も伴います。これに応じて提供されるトランザクションは、ウィットネスデータなしで書かれます。これは2017年より前に存在した形式で、segwitの支出では署名が省かれます。そのためsegwit対応のピアはウィットネス付きの変種を要求し、BIP339が2021年1月のBitcoin Core 0.21.0で登場して以来、通常は代わりにタイプ5で告知します。トランザクションをウィットネスハッシュで指定するため、改変されたウィットネスが未知のトランザクションに見えることはなくなります。
どこで見られるか
MSG_TXは「トランザクションはブロードキャストされた」という表現の背後にある仕組みであり、そうではなかったと判明する場面の背後にある仕組みでもあります。
1つのノードにだけ接続したウォレットが署名済みトランザクションを渡すと、そのノードがハッシュを告知し、いずれかのピアが要求するまでほかには何も起こりません。誰も要求しなければ、支払いは1台のマシン上にとどまり、どのマイナーにも見えません。Bitcoin Coreは、まだどのピアも要求していない自ウォレットのトランザクションを追跡し、誰かが要求するまで再告知します。そのため、ファイアウォールの内側の家庭内ネットワークにあり、外向き接続を持たないノードは、何も外に出ていないのに支払いを送信済みとして報告することがあります。
取引所の出金のバッチ処理もここに関わります。取引所は1つのハッシュを告知し、1回の要求で数十人の顧客への支払いを含むトランザクションが届きます。だからこそ、あなたの出金のtxidには他人の出力が含まれるのです。
MSG_TX vs tx P2Pメッセージ
MSG_TXはトランザクションを指定し、txメッセージはトランザクションを含みます。両者を混同するとプロトコルのログは読めなくなります。invとgetdataの行はタイプコードとハッシュだけであり、実際のバイト列はtxの行にしか現れないからです。この区別が最も重要になるのは伝播をデバッグするときです。あなたのハッシュがinvで送り出されるのを見れば、あなたのノードが誰かに伝えたことが証明されます。その後にtxメッセージが続くのを見れば、誰かが実際にそれを求めていたことが証明されます。