用語集 / マイニングとコンセンサス
マークルルート
- マークルルートとは?
- マークルルートは、ブロックヘッダー内にある32バイトの単一のハッシュであり、そのブロック内のすべてのトランザクションを、マイナーが並べた正確な順序のまま確定させるものです。
1つの支払いの1サトシを変える、2つのトランザクションの順序を入れ替える、あるいは1つ追加するだけで、ルートは完全に変わります。マイナーはその性質に頼っています。32ビットのナンスでは約43億通りの試行しかできないため、マイニングソフトウェアはcoinbaseトランザクションを書き換えて新しいルートを生成し、探索を続けます。ビットコインを保有する人にとって、この1つのフィールドがあるからこそ、ブロックはマイニングされた後に支払いを密かに増やしたり失ったりすることができません。
仕組み
マークルルートは選ばれるのではなく計算されるものであり、それこそがこの値に意味をもたらします。
ヘッダーの80バイトのうち32バイトを占め、マイナーはトランザクションから生じる値をそのまま書き込みます。ブロックを受け取ったすべてのノードは、送られてきたトランザクション一覧からツリーを再構築し、自身の計算結果をヘッダーと照合します。一致しなければ、即座に異議の余地なく拒否されます。ヘッダーがあることを述べ、ブロック本体が別のことを述べるというプロトコルの版は存在しません。
この照合によってルートはマイニングループの要になります。ナンスは幅がわずか4バイトで、4,294,967,296通りの値しかありません。200兆ハッシュ毎秒で動作するマシンは、それらすべてをおよそ100万分の20秒で使い切ります。そのためマイナーは新しい候補を生成する手段を必要とし、最も安価な手段はcoinbaseトランザクションを変更することです。プールは各マシンに、coinbaseを2つの半分に分けその間に隙間を設けたものを送り、マシンは隙間に自身のバイトを書き込みます。coinbaseトランザクションIDが変わり、マークルルートが変わり、43億通りの新しいナンスが利用可能になります。タイムスタンプと、BIP320が予約する16ビットのバージョンビットを動かすことも、追加の余地をもたらします。
Segregated Witnessはヘッダーに触れることなく2つ目のルートを追加しました。ヘッダーに触れることはハードフォークになるからです。BIP141はウィットネストランザクションIDに対する別個のツリーを定義し、そのルートは4バイトの接頭辞0xaa21a9edで示される形でcoinbaseトランザクションの出力に書き込まれます。coinbase自体が通常のツリーの葉であるため、そのウィットネスコミットメントは結局、1階層を隔ててヘッダーのマークルルートに折り込まれます。
目にする場所
マークルルートは、どのブロックエクスプローラーでも表示されるフィールドの1つであり、手作業で検証できる数少ないフィールドの1つでもあります。
Bitcoin Coreはgetblockheaderとgetblockの出力でこれをmerklerootとして報告します。4a5e1e4bで始まるジェネシスブロックの値は出発点として適しています。このブロックにはトランザクションが1つしかないからです。葉が1つのツリーはそれ自身がルートになるため、マークルルートとトランザクションIDは同一になります。coinbaseトランザクションのみを含むブロックはすべて同じ性質をもちます。
また、ブロックの中ではなくマイニングプロトコルの中でも目にします。Stratumのジョブ通知は、マイナーにトランザクションを一切送りません。coinbaseの半分と、coinbaseから頂上までたどるのに必要な短いハッシュの一覧を送るため、マシンは試す各extranonceについてルートを自身で計算できます。Stratum V2はそもそも誰がトランザクションを選択するかを変えますが、ルートは依然として同じ方法で組み立てられます。
マークルルートvs前ブロックヘッダーハッシュ
マークルルートと前ブロックヘッダーハッシュはどちらも32バイトのハッシュで、同じ80バイトのヘッダー内に並んで存在し、それぞれ異なる方向を確定させます。マークルルートは内側、つまりこのブロックの内容、すなわちトランザクションとその順序のみを指します。前ブロックヘッダーハッシュは後方、つまりその背後にある全履歴を指します。支払いを編集すれば壊れるのはマークルルートだけです。昨年のブロックを編集すれば、それ以降のすべてのブロックの前ブロックヘッダーハッシュが誤りになります。これが、1つのブロックを改ざんすることとチェーンを改ざんすることの違いです。