開発者向けMonad
Monadは、秒間10,000トランザクション、1秒のブロック時間、およびシングルスロットの最終確定を持つ、Ethereum互換のレイヤー1ブロックチェーンです。
MonadのEthereumバーチャルマシンの実装は、上海フォークに準拠しており、Monad実行環境での歴史的なEthereumトランザクションのシミュレーションは同一の結果を生み出します。また、Monadは完全なEthereum RPC互換性を提供するため、ユーザーはMetaMaskやEtherscanのような馴染みのあるツールを使用してMonadと対話できます。
Monadは、いくつかの主要な革新の導入を通じてこれらのパフォーマンスの改善を達成しています:
MonadBFT(追加の研究改善を備えたパイプライン化されたHotStuff合意)
遅延実行(合意と実行の間のパイプライニングを大幅に増やすことで実行予算を大幅に増加させる)
MonadDb(高性能状態バックエンド)
Monadには並列実行とパイプライニングが特徴ですが、Monad内のブロックはリニアであり、各ブロック内のトランザクションはリニアに順序付けられていることに注意することが重要です。
トランザクション形式
アドレス空間
Ethereumと一致 ECDSAを使用した20バイトのアドレス
トランザクション形式
Ethereumと一致 EIP-2718に準拠し、RLPでエンコードされます。アクセスリスト(EIP-2930)はサポートされていますが、必須ではありません。
ウォレットの互換性
MonadはMetamaskのような標準的なEthereumウォレットと互換性があります。必要な変更は、RPC URLとChainIdを変更することだけです。
スマートコントラクト
MonadはEVMバイトコードをサポートし、Ethereumとバイトコードが等価です。すべてのオペコード(上海フォーク時点)がサポートされています。
コンセンサス
シビル耐性メカニズム
プルーフ・オブ・ステーク(PoS)
委任
許可されている(プロトコル内)
コンセンサスメカニズムとパイプライニング
MonadBFTは、部分的に同期された条件下でトランザクションの順序と含まれる内容について合意に達するためのリーダーベースのアルゴリズムです。一般的には、HotStuffの派生であり、追加の研究改善が施されています。
MonadBFTは、一般的なケースで線形通信オーバーヘッドを持つパイプライン化された2フェーズのBFTアルゴリズムです。ほとんどのBFTアルゴリズムと同様に、通信はフェーズごとに進行します。各フェーズで、リーダーは署名されたメッセージを投票者に送信し、投票者は署名された返答を送り返します。パイプライニングにより、ブロックk
のためのクォーラム証明(QC)またはタイムアウト証明(TC)をブロックk+1
の提案にピギーバックすることが可能です。タイムアウトは二次的なメッセージングを発生させます。
ブロック時間
1秒
ファイナリティ
シングルスロット。2/3のステーク重みがブロック提案にYESと投票したら、それは最終確定されます。
Mempool
mempoolが存在します。トランザクションはイレイジャ符号化され、効率のためにブロードキャストツリーを使用して伝達されます。
スパム耐性
ユーザーはブロックへの組み込み(運搬コスト)とトランザクションの実行(実行コスト)のために料金を支払います。
コンセンサス参加者
直接のコンセンサス参加者はブロック提案に投票し、リーダーとして機能します。直接参加するためには、ノードは少なくともMinStakeをステークし、ステーク重みによる上位MaxConsensusNodes
参加者である必要があります。これらのパラメータはコードで設定されます。
トランザクションのハッシュ化
効率のために、ブロック提案はトランザクションをハッシュのみで参照します。ノードがトランザクションを持っていない場合、隣のノードからハッシュでトランザクションをリクエストします。
遅延実行と運搬コスト
Monadでは、コンセンサスと実行がパイプライン方式で行われます。ノードはその順序の実行に先立って、公式のトランザクション順序についてコンセンサスに達します(遅延実行);実行の結果はコンセンサスの前提条件ではありません。 実行がコンセンサスの前提条件であるブロックチェーンでは、実行のための時間予算はブロック時間の小さな割合です。コンセンサスと実行をパイプライン化することで、Monadはコンセンサスと実行の両方に全ブロック時間を費やすことができます。
ブロック提案は、トランザクションハッシュの順序付けられたリストと、D
ブロック前の状態メルクルルートで構成されます。遅延パラメータD
はコードで設定され、初期にはD = 10
であることが予想されます。
ユーザーは、トランザクションをブロックに含めるために支払いをする必要があります(運搬コスト)。各アドレスに対して、ノードは二つの残高を維持します:
運搬コストを支払うための予約残高
トランザクション実行のために使用される実行残高
運搬コストは、トランザクションがブロックに含まれるとき(コンセンサス)に予約残高に請求され、実行時に実行残高から差し引かれ(二重請求)、D
ブロックの遅延期間が経過した後に予約残高に返金されます。
アカウントの予約残高は、実質的に「進行中の注文」のための予算であり、支払われたトランザクションのみがブロックに含まれるようにするために存在します。
各アカウントは、目標予約残高を持ち、これは例えば、多くの進行中の注文を送信することを予想するEOA(Externally Owned Account)など、固有のスマートコントラクトとの対話によって変更することができます。
状態の決定論
最終確定はコンセンサス時に発生します。この時点でトランザクションの公式な順序が確立され、結果は任意のフルノードにとって完全に決定論的であり、通常、その新しいブロックのトランザクションを1秒未満で実行します。状態メルクルルートのD
ブロック遅延は、例えばノードが計算エラーを起こしていないことを保証するための状態ルート検証のみのためです。
実行
各ブロックの実行フェーズは、そのブロックについてのコンセンサスが得られた後に始まり、ノードは後続のブロックについてのコンセンサスを進めることができます。
並列実行
トランザクションはリニアに順序付けられており、実行の仕事は、そのトランザクションのリストを連続して実行することで得られる状態に到達することです。素朴なアプローチは、トランザクションを次々に実行することです。もっと良い方法はありますか?はい、あります!
Monadは並列実行を実装しています:
実行者は、トランザクションを実行するための仮想マシンです。Monadは多くの実行者を並行して実行します。
実行者はトランザクションを取り、結果を生成します。結果とは、トランザクションの入力と出力のリストであり、入力は実行の過程でSLOADされた(ContractAddress、Slot、Value)のタプル、出力はトランザクションの結果としてSSTOREされた(ContractAddress、Slot、Value)のタプルです。
結果は当初、保留状態で生成されます。その後、トランザクションの元の順序でコミットされます。結果がコミットされると、その出力が現在の状態を更新します。結果がコミットされる番になったとき、Monadはその入力が現在の状態とまだ一致するかを確認します。一致しない場合、Monadはトランザクションを再スケジュールします。この並行制御の結果、Monadの実行は、トランザクションが連続して実行された場合と同じ結果を生成することが保証されます。
トランザクションが再スケジュールされると、必要な入力の多くまたはすべてがキャッシュされるため、再実行は一般的に比較的安価です。再実行に際して、トランザクションが前回の実行で行ったのと異なる一連の入力を生成する可能性があることに注意してください。
MonadDb:高性能状態バックエンド
全てのアクティブな状態はMonadDbに保存されます。これは、メルクルトライデータの保存に最適化された、ソリッドステートドライブ(SSD)用のストレージバックエンドです。アップデートはバッチ処理され、メルクルルートを効率的に更新できるようになっています。
MonadDbはインメモリキャッシングを実装し、効率的な非同期読み書きのためにasioを使用します。ノードには最適なパフォーマンスのために32 GBのRAMが必要です。
Ethereumとの比較:ユーザーの視点
トランザクション/秒 (スマートコントラクトの呼び出しと転送)
~10
~10,000
ブロックタイム
12秒
1秒
Cryptography
ECDSA
ECDSA
アカウント
ECDSAの下での公開鍵のkeccak-256の最後の20バイト
ECDSAの下での公開鍵のkeccak-256の最後の20バイト
コンセンサスメカニズム
Gasper (Casper-FFG最終確定ガジェット + LMD-GHOSTフォーク選択ルール)
MonadBFT (追加の研究改善を備えたパイプライン化されたHotStuff)
Mempool
Yes
Yes
トランザクションの順序付け
リーダーの裁量 (実際にはPBS)
リーダーの裁量 (デフォルト動作:優先ガスオークション)
シビル耐性メカニズム
PoS
PoS
委任の許可
No ; LSTを通じた疑似委任
Yes
Last updated