本文へスキップ
buybitcoinsmart

用語集 / プロトコルとアップグレード

コンパクトブロックリレー

別名はBIP152です。

コンパクトブロックリレーとは?
コンパクトブロックリレーは、ネットワーク上で新しいブロックを6バイトの識別子のリストに置き換える仕組みです。受信側のノードはその識別子をすでに保有するトランザクションと照合し、ブロックをローカルで再構成します。

BIP-152で規定されています。

mempoolを監視している2つのピアは、次のブロックに含まれるほぼすべてのトランザクションをすでに共有しています。そのため、それらをもう一度送るのは無駄です。Matt Coralloがこの修正をBIP152として仕様化し、Bitcoin Coreがバージョン0.13.0で有効にしました。このバージョンは2016年8月23日にリリースされました。自宅でノードを運用する人にとって、これは許容できる帯域幅の請求額と許容できない請求額との差になります。

仕組み

コンパクトブロックリレーはプロトコルに4つのメッセージを追加します。そのうち注目すべきはcmpctblockで、ブロックを内包せずに記述します。

cmpctblockは、80バイトのヘッダーと、送信者が選ぶ8バイトのnonce、そしてブロック内の各トランザクションにつき1つの6バイトの短縮識別子を運びます。これらの識別子はSipHash-2-4から生成され、その鍵はヘッダーとそのnonceを連結したもののSHA-256から得られます。nonceがこの方式を安全にしています。識別子はブロックごと、送信者ごとに異なるため、識別子が衝突する2つのトランザクションをあらかじめ用意し、ネットワーク全体の再構成を一度に妨害することは誰にもできません。

一部のトランザクションは識別子ではなく完全な形で送られます。coinbaseは常にその形です。どのピアも事前にそれを見ることができないためです。また送信者は、受信者が持っていないと疑われるその他のトランザクションを先に埋めることができます。

その後、再構成は受信側で行われます。ノードは自身のmempoolにあるすべてのトランザクションを同じ鍵でハッシュ化し、各短縮識別子を照合してブロックを埋めます。また、最近追い出されたトランザクションと置き換えられたトランザクションを保持する小さな追加プールも維持し、直前にmempoolから外れたものを補います。それでも不足しているものはgetblocktxnで位置を指定して要求し、送信者はそのトランザクションだけをblocktxnメッセージで返します。

ブロック全体の取得に切り替える必要が生じるのは2つの場合です。往復1回に見合わないほど多くのトランザクションが不足している場合、または2つの異なるトランザクションが同じ6バイトの識別子を生み出す場合です。6バイトでは281兆の値を扱えるため、偶発的な衝突は極めてまれであり、意図的な衝突こそnonceが排除するものです。

告知には2つの方式があります。低帯域幅モードでは、ピアが新しいブロックを告知し、要求されるのを待ちます。高帯域幅モードでは、ノードが最大3つのピアに対して有効にし、ブロックが到着した瞬間にcmpctblockが送り出されるため、伝播速度が最も重要な経路で往復1回を節約できます。

確認できる場所

コンパクトブロックリレーは自身のノードのログにブロックごとに1行で表示され、それを読むことがノードが健全かどうかを判断する最も速い方法です。

Bitcoin Coreは再構成の概要を出力し、何件のトランザクションが先に埋められたか、何件がmempoolから来たか、何件が追加プールから来たか、何件を要求する必要があったかを示します。何時間も稼働しているマシンでは、要求件数は通常ゼロかそれに近い値です。10分前に起動したマシンではmempoolがほぼ空で、ほとんどすべてを取得する必要があり、最初のいくつかのブロックはゆっくり到着します。

ここから、ウェブサイトを信頼するのではなく自身の残高を確認するためにノードを運用する人への実用的なルールが導かれます。稼働させたままにしてください。必要になる直前に再起動したノードはブロック全体をダウンロードするノードであり、その先端の見え方はmempoolが再び満たされるまで公開のブロックエクスプローラーより遅れます。

混同しやすい用語

よくある質問

コンパクトブロックリレーは、有効なブロックとみなされるものを変えますか?

いいえ。変わるのはピア間でバイトがどのように移動するかだけです。受信側のノードは再構成されたブロックを同じコンセンサスルールに照らしてゼロから検証するため、コンパクトな形で到着したブロックは、完全な形でダウンロードしたブロックとまったく同じ厳格さで検証されます。

再起動後にノードがブロック全体をダウンロードするのはなぜですか?

再構成にはトランザクションが入ったmempoolが必要だからです。起動したばかりのノードは短縮識別子と照合できるものがほとんどないため、各ブロックの大部分を要求しなければなりません。この挙動はmempoolが再び満たされるにつれて、1時間ほどで自然に解消します。

関連用語

プロトコルとアップグレードのその他の用語

このページを英語で読む