本稿について
本稿は、Tendermintホワイトペーパーの詳細版ともいえるTendermint現CTOであるEthan Buchman氏の執筆論文をもとにTendermintについて見ていくシリーズです。冒頭に筆者による「簡単まとめ」を入れ、その後にもととなった部分の日本語訳を載せるという順番で書いていきます。
論文「Tendermint: Byzantine Fault Tolerance in Age of Blockchain」の原文はこちら。
今回の対象範囲は第4章「Tendemint Subprotocols」のうち4.3「Mempool」、4.4「Syncing the Blockchain」、4.5「Conclusion」で、これを読むとTendermintのmempoolとブロックチェーンとの同期方法について把握することができます。
原文はこちらになります。
スポンサードサーチ
要点をまとめてみる
- トランザクションは受信時にアプリケーションロジックで検証され、有効であればmempoolで管理される。トランザクションは順番通りに送信される。提案者がmempoolからトランザクションを取ってきて最終的にコミットが行われたあと、再度残りのトランザクションについてアプリケーションロジックで検証が行われる。
- 最新のブロックチェーンステートから数ブロック遅れているピアに対しては、コンセンサスリアクターではなくブロックチェーンリアクターを使って高速に追いつかせる措置を取る。
- 接続しているピアのうち、自分より高いブロック高を報告したピアから現在の自分のブロック高以降のブロックをダウンロードする。
- ブロックチェーンへの追加にあたり、ブロックの検証は必ず2ブロックずつ行う。
- あるブロックのコミットはLastCommitデータとして次のブロックにも含まれるからである。
- 最新のステートに追いついたらブロックチェーンリアクターを停止し、コンセンサスリアクターを開始する。
以下、今回取り扱った箇所の日本語訳なので詳細を知りたければどうぞ。
Chapter4. Tendermintのサブプロトコル(続き)
4.3 Mempool
チャプター3ではトランザクションについてほとんど言及しなかった。というのも、Tendermintは一度にトランザクションのブロックを操作するのであって、ブロック内にあるトランザクションのチェックサムが正しい限り、個々のトランザクションには関心がないからである。
トランザクションはインメモリキャッシュで独立して管理され、これはBitcoinに従ってmempoolとして知られることになった。トランザクションは受信された際にアプリケーションロジックで検証され、有効であればmempoolに追加されて順序付きマルチキャストアルゴリズムを使ってゴシップ伝送される。ノードは各ピアに対してルーチンを維持し、mempool内のトランザクションがノードによって処理された順序と全く同じ通りに送信されていることを保証する。
提案者は新規ブロック提案のためにmempool内の順番リストからトランザクションを取ってくる。一度ブロックがコミットされると、そのブロックに含まれているトランザクションは全てmempoolから取り除かれ、残りのトランザクションはアプリケーションロジックにより再検証される。というのも、ノードが自身のmempoolに持っていなかったかもしれないトランザクションがコミットされたことで残りのトランザクションの有効性が変わった可能性があるためである。
4.4 ブロックチェーンとの同期
Tendermintのブロックチェーンはリアルタイムのコンセンサスのために設計されているので、コンセンサスリアクターはブロックチェーンの最新のステートと同期する比較的ゆっくりな方法を提供しており、ピアは次ブロックに関して迷う前に一つのブロックをコミットするための情報が全て揃うのを待つ。数ブロック以上遅れている可能性のあるピアを追いつかせるために、追加的なリアクター、つまりブロックチェーンのリアクターによりピアは大量のブロックを並行してダウンロードでき、コンセンサスリアクターよりも数百倍速く同期できる。
ノードが新しいピアに接続する際、そのピアは自身の現在のブロック高を送信する。ノードはより高いブロック高を自己報告した全てのピアからノードの現在のブロック高を起点として順番にブロックをリクエストすると同時にそのブロックをダウンロードし、ブロックプールに追加する。別のルーチンでは継続的にブロックプールからブロックを取り除いて最新のブロックチェーンのステートに対して一度に2ブロック検証し実行することでブロックチェーンに追加しようとする。ブロックは一度に2ブロック検証されなければならない。なぜならば、1ブロックに対するコミットはLastCommitデータとして次のブロックに含まれるからである。
ノードは継続的に周りのピアにその時点のブロック高に関して問い合わせを行い、それと同時にピア間で最も高いブロック高に追いつくまでブロックをリクエストし続け、追いついた時点でピアのブロック高に関するリクエスト送信をやめてコンセンサスリアクターを開始する。
4.5 結論
実用的なTendermintブロックチェーンの実装にはたくさんのサブプロトコルが必要である。これらのサブプロトコルには、コンセンサスデータ(投票と提案)、ブロックデータ、トランザクションのゴシップ伝送と新規ピアがすぐにブロックチェーンの最新のステートに追いつくためのいくつかの手段が含まれる。
(EthanのTendermint論文10 ←← 前)|(次 →→ EthanのTendermint論文12)
免責
邦訳には誤りがある場合がございます。予めご承知おき下さい。
確実な情報を知るためには冒頭に示した原文をご参照くださいますようお願いいたします。