用語集 / ノードとソフトウェア
P2Pメッセージ
別名はMessageです。
- P2Pメッセージとは?
- P2Pメッセージとは、ビットコインのノード同士が通信するために使う固定の語彙で、version、inv、getdata、tx、blockといった短いコマンドを、平文のTCP接続で送るものです。
呼び出すべき中央サーバーは存在しないため、ノードとネットワークの関係はすべてこの会話になります。Bitcoin Coreはプロトコルバージョン70016を通知し、ポート8333で接続を開き、語彙全体は1ページに収まります。あなたの出金がマイナーに届くのは、あるマシンが別のマシンにtxを送り、それが数秒のうちに数千回転送されるからです。
仕組み
すべての接続はハンドシェイクで始まり、その後は少数の繰り返し行われるやり取りに落ち着きます。
どちらの側も最初に送るのはversionで、自身が話すプロトコル番号、サービスのフラグ、現在時刻、相手が持つと考えるアドレス、誤って自分自身に接続したことを検出するためのランダムなnonce、ユーザーエージェント文字列、そして自身が知る最良のチェーンの高さを載せています。各側はverackで応答します。両方がこれを終えるまで、ほかのものは処理されません。
このプロトコル番号は飾りではなく機能の階段です。ヘッダーの直接通知には70012、コンパクトブロックの交渉には70014、完全な検証前のコンパクトブロック通知には70015、ウィットネス識別子によるトランザクションの中継には70016が必要です。ノードは相手の番号を読み、その相手が使えない機能を提供しないよう静かに控えます。これにより、調整された一斉切り替えなしにネットワークは更新されます。
目的別にまとめると、語彙は短いものです。ピアの探索:getaddr、addr、そしてBIP155のTorアドレスやI2Pアドレスを運べるaddrv2形式。通知:invとheaders。要求:getheaders、getdata、getblocks、mempool。配信:tx、block、cmpctblock、blocktxn、notfound。保守:ping、pong、sendheaders、sendcmpct、wtxidrelay、そしてfeefilterで、最後のものは指定した手数料率を下回るトランザクションを転送する手間を省くよう相手に伝えます。
2つの沈黙は意図的なものです。認識されないコマンドは拒否ではなく無視され、これにより新しいメッセージ種別を、誰も一斉に更新できないネットワークへ徐々に展開できます。また、ピアがあなたのトランザクションをなぜ破棄したかを伝える方法はありません。BIP61のrejectメッセージはBitcoin Core 0.18.0でデフォルトで無効化され、0.20.0でオプションが完全に削除されました。応答は信頼できず、偽造は容易で、権威あるものと日常的に誤解されていたからです。
どこで見られるか
P2Pメッセージは、あなた自身のノードが一日中行っていることであり、簡単に観察できます。
Bitcoin Coreを-debug=netで起動すると、ログは届いた各メッセージの名前を記録します。getpeerinfo呼び出しは、各接続について、メッセージ種別ごとに分けた送受信バイト数を報告します。これは、1つのピアがほぼすべてを供給し、残りが遊んでいることを発見する最も速い方法です。自身のノードを指すウォレットから支払いをブロードキャストすると、認識できる小さな一連の流れが生じます。invが出て行き、getdataが返ってきて、それに応じてtxが出て行くという流れです。
P2Pメッセージvs RPC
ビットコインには2つのインターフェースがあり、互換性はありません。P2Pはノード間であり、認証なし、両端がv2トランスポートを交渉しない限り暗号化なし、ポート8333で、どの参加者も単独では拡張できない語彙を持ちます。RPCはプログラムからノードへであり、認証あり、デフォルトでローカル、ポート8332で、リリースごとに変わるメソッド一覧を持ちます。あなたが作成する支払いは両方を通ります。あなたのノードにはRPC呼び出しとして入り、P2Pメッセージとして出て行き、他人が関与するのは後半だけです。