著者:Rachit Srivastava, Avail builder; 翻訳:Golden Finance xiaozou
Monad はEVM互換のL1チェーンですが、イーサのコアの柱を中心に、いくつかの大きな見直しが行われています。そのため、Monadは毎秒最大10,000トランザクションを処理することができます。
Monadは最近devnetをリリースしました。
パイプラインと非同期I/Oという2つのコンセプトを適用しています。パイプラインとは、タスクを並列処理可能な一連の小さなタスクに分割することで並列性を実現する技術です。一方、非同期I/Oは、入出力処理の一形態で、通信が行われると同時にCPUが並行して実行できるようにするものです。
それでは、一般的なケースでは線形通信オーバヘッドを使用し、タイムアウトのケースでは2次通信オーバヘッドを使用する楽観的応答の形式を持つパイプライン化された2段階BFTアルゴリズムであるMonadBFTは何が違うのでしょうか?
以下では、すべてのノードが同じエクイティを持っていると仮定します。
--MonadBFTはコンセンサスに達するためにノードの2/3を必要とする。
--リーダーは新しいブロックを「QC」または「TC」(閾値署名は、デジタル署名を生成する能力を複数の参加者に割り当てる暗号技術です)とともに送信します。一人の当事者がグループ全体を代表して署名することはできず、当事者の一部(「閾値」)が協力して署名を生成しなければならない)。
--検証者はブロックを検証し、YesかNoの回答をリーダーに送る。リーダーは(閾値署名を介して)YesとNoの票を集約することで、QC(定足数証明書)を導き出す。
--検証に失敗した場合、検証者は署名入りのタイムアウトメッセージを全ノードにブロードキャストする。このメッセージには、バリデータが観測した最高QCが含まれる。バリデータの数から2/3以上のタイムアウト要求が蓄積された場合、TC(Timeout Certificate)が生成され、次のリーダーに送られる。
各バリデータは、第kラウンドで提案されたブロックを確定する前に、第k+1ラウンドのQCを受け取る。ラウンドのQCを受け取る。
k+1ラウンドでLEADERが悪意を持って行動したと仮定すると、k+2ラウンドでは、少なくとも1人のバリデータがk+1ラウンドのTCを生成し、k+2ラウンドのLEADERがCHECKを行い、そのラウンドのTCを生成します。
遅延実行
イーサリアムでは、実行はコンセンサスの前提条件です。あるブロックについてコンセンサスを得るとき、ノードはブロック内のトランザクションリストと、そのトランザクションリストの実行後のすべての状態を要約したメルクルルートに合意する。したがって、LEADERは提案を共有する前に、提案されたブロック内のすべてのトランザクションを実行しなければならず、VERIFYINGノードはその応答を投票する前に、それらのトランザクションを実行しなければならない。
以上から、真の状態はトランザクションのシーケンスが形式化された後に完全に決定されることがわかる。真の状態を明らかにするには実行が必要ですが、真の状態はすでに決定されています。これがMonadの最適化の基礎である。Monadは、コンセンサスに達する前のノード実行の要件を排除することによって、この洞察を利用する。ノードプロトコルは正式なトランザクションの順序にのみ関係し、各ノードはブロックNで独立してトランザクションを実行し、ブロックN+1でコンセンサスに達し始める。
Etherのアプローチは、コンセンサスを使用して、非常に厳格な方法でステートマシンの複製を強制します。ノードがコンセンサスに達した後、私たちは、ノードの絶対多数が正式な順序付けとその順序付けから生じる状態に同意していることを知っています。
- モナドの最終的な確実性は1スロット(1秒)
- トランザクションの実行結果(成功か失敗か?その後の収支は?)の最終的な判断は、通常フルノードで1秒未満遅れる。
- フルノードを実行せずにトランザクションの結果を安全に照会したい人は、Merkle Proofを使ってフルノードの残高を照会するライトクライアントを実行できます。この場合、クエリはMerkleルートの遅延によって遅延します。
キャリッジのコスト
ネットワーク上のブロックという形でネットワークトランザクションを実行するにはコストがかかります。この費用は実行コストとは別です。リザーブ残高はキャリッジコストの支払いに使われます。一方、実行残高はトランザクション実行の支払いに使われます。
並列実行
モナドは楽観的実行を使用します。これは、ブロック内のトランザクションの以前のバッチが完了する前に、モナドがトランザクションの実行を開始することを意味します。時々(常にではありませんが)、これは実行エラーにつながる可能性があります。
すべてのトランザクションが前のトランザクションに依存している場合、楽観的実行はトランザクション2を実行するために使用された入力データを追跡し、トランザクション1からの出力データと比較することでこれを回避します。
2つのデータが一致せず、トランザクション2が間違ったデータで実行されたことを検出した場合、正しいデータで再度実行する必要がある。Monadがトランザクションを並行して実行する場合、各トランザクションのステータス更新は順次「マージ」されます。
MonadDb
MonadDbはブロックチェーンの状態を保存するためのカスタムデータベースです。ほとんどのイーサリアムクライアントは、B-Tree(LMDBなど)またはLSM-Tree(LevelDBやRocksDBなど)のデータ構造として展開されるキーバリューデータベースを使用しています。
MonadDbはPatricia Trieデータ構造をディスクとメモリ上に展開します。Monadは複数のトランザクションを並列に実行します。あるトランザクションがディスクから状態を読み込む必要がある場合、処理の完了を待つのではなく、読み込み処理を開始し、その間に別のトランザクションの処理を開始する必要があります。