Merkle Rootとは何ですか?
Merkle Rootはブロック内のすべてのトランザクションを要約する単一のハッシュです。トランザクション内のたった1ビットが変わるだけでブロックヘッダに記載された短いフィンガープリントが変化します。プレイリストの全トラックが正しいことを証明するアルバムコードのようなものと考えてください。
Merkle Rootをトランザクションの一覧だと考える人がいますが、それは違います。Merkle Rootはそれらすべてへの単一のコミットメントであり、詳細を公開せずに集合の存在を証明します。
Merkle Rootの仕組み
ブロックをトランザクションのフィンガープリントから作られた木と想像してください。コーヒー片手にどうぞ、簡単な手順は次のとおりです:
- ステップ1:ブロックの生の トランザクションデータ から始めます。
- ステップ2:各トランザクションを 暗号学的ハッシュ でハッシュ化します。各結果が葉ノードになります。
- ステップ3:葉を対にしてペアごとにハッシュし、Merkleツリー を上へ登っていきます。奇数の葉は自身とペアになります。問題ありません。
- ステップ4:ペアのハッシュを続けて、最後に1つのハッシュだけが残るまで行います。その最終ハッシュがMerkle Rootです。
- ステップ5:単一のトランザクションがブロックに含まれることを証明するには、ブロック全体ではなくその Merkleパス だけがあれば十分です。
下層のどこかで小さな変更があると、上のハッシュは大きく変わります。これが目的です。
なぜ Merkle Root が重要か
フルノードを稼働させていない場合でも確かな証明を得たいときに、速度と信頼性の両方が重要になります。
- 利点:高速な検証。ライトクライアントは巨大なブロックをダウンロードする代わりに小さな証明で支払いを確認できます。
- 視点:アプリはメンバーシップをきれいに証明でき、オープン金融での利用に向いており、手数料やダウンロード量を抑えます。
- 関連:ブロックヘッダ、ウォレットの検証工程、そしてトランザクションが本当に含まれていることを示す 暗号学的証明 を示す場面で見かけます。
トランザクション内の1バイトが反転すると、Merkle Rootは予測できない形で変化します。デバッグやツール作成時は、まずルート同士を比較して静かなデータ改変を素早く見つけてください。
Merkle Rootの主な特徴
一目でわかる特徴:
- コンパクト:短いハッシュ一つで数千のトランザクションを要約できます。
- 検出性:下層での改変はルートが変わるため直ちに分かります。
- 拡張性:証明のサイズはトランザクション数の対数に比例して増え、トランザクション全数に比例しません。
- 互換性:ブロック内で一貫していれば、異なる安全なハッシュ関数でも働きます。
バリエーション
同じ考え方の、よく見かける種類:
- Binary:Bitcoinのブロックで使われる古典的な二分木です。
- K ary:ノードが二つ以上の子を持つ木で、実験的な設計で使われることがあります。
- Patricia:EthereumはアカウントやストレージにMerkle Patricia Trieを使っており、パスを圧縮してキー値検索に向いています。
ブロックハッシュとMerkle Rootを混同しないでください。ブロックハッシュはヘッダ全体にコミットしますが、Merkle Rootはトランザクションのみをコミットします。
例
ブロックエクスプローラーでBitcoinのブロックを開くと、Merkle Rootとラベル付けされた16進文字列が表示され、ライトウォレットがブロック全体を取得せずに支払いを検証できます。
豆知識
Merkleは実在の人物です。Ralph Merkleは1970年代にこれらの木構造を提案し、同時期に公開鍵の初期アイデアも描いており、それが後の暗号技術に影響を与えました。頭の良い時代でした。
まとめ
一言で言えば:Merkle Rootは小さいが強力なフィンガープリントで、ブロック内の全トランザクション集合が正当であることを示します。
