面向开发人员的 Monad

Monad 是与以太坊兼容的 Layer1 区块链,吞吐量为 10,000 tps,区块时间为1秒,采用单时隙确定性(single-slot finality)。

Monad 对以太坊虚拟机的优化符合上海升级的要求,使用 Monad 执行环境模拟以太坊历史交易会产生相同的结果。Monad 还与以太坊 RPC 完全兼容,因此用户可以使用 MetaMask 和 Etherscan 等熟悉的工具与 Monad 进行交互。

Monad 通过引入以下四项重大创新实现了这些性能的优化:

虽然 Monad 具有并行执行和流水线执行功能,但需要注意的是,Monad 中的区块是线性的,交易在每个区块中也是线性排序的。

交易格式

相关属性属性描述

地址空间

使用 ECDSA 匹配以太坊 20 字节地址

交易格式

符合 以太坊

符合 EIP-2718,使用 RLP 编码。支持但不要求访问列表(EIP-2930)。

钱包兼容性

Monad 与 Metamask 等标准以太坊钱包兼容。唯一需要更改的是 RPC URL 和 ChainId。

智能合约

  • Monad 支持 EVM 字节码,与以太坊字节码等效,支持所有 操作码(截至上海升级)。

共识机制

相关属性属性描述

抗 51% 攻击

权益证明(PoS)

委托投票权

允许(协议原生)

共识机制和流水线机制

MonadBFT 是一种基于领导人选举的共识算法,用于在部分同步条件下就交易排序和打包达成一致。广义上,它是 HotStuff 的衍生算法,并进行了额外的研究优化。

MonadBFT 是一种流水线式两阶段 BFT 算法,在一般情况下具有线性的 communication overhead。与大多数 BFT 算法一样,通信分阶段进行,在每个阶段,领导人向投票者发送签名信息,投票者再发回签名回执。流水线作业允许区块 k 的法定人数证书(QC)或超时证书(TC)包含区块 k+1 的提议,超时会进行二次消息传递。

区块时间

1秒

最终确定性

单时隙确定性,一旦2/3的验证者对整块提议投了"支持"票,区块即最终确定。

内存池

内存池,交易采用纠删码,并使用 broadcast tree 进行通信,以提高效率。

抵制垃圾交易

用户为交易打包进区块(“传输成本”)和交易执行(“执行成本”)付费。

共识参与者

直接共识参与者对区块提议进行投票,并担任领导人。要成为直接参与者,节点必须至少有 MinStake 质押,并且按投票权排在 MaxConsensusNodes 参与者的前列,这些参数在代码中设定。

交易哈希

为提高效率,区块提议仅通过哈希值来引用交易。如果一个节点没有参与交易,它将通过哈希向邻居节点请求交易。

延迟执行和燃料成本

在 Monad 中,共识和执行以流水线方式进行。节点在执行正式交易排序(延迟执行)之前,会就该排序达成共识,执行结果并不是达成共识的先决条件。

在区块链中,通常执行是达成共识的先决条件,而执行的时间预算只占区块时间的一小部分。将共识和执行流水线化后,Monad 就可以将全部区块时间用于共识和执行。

区块提议由交易哈希有序列表和 D 个区块前的状态 merkle 根组成,延迟参数 D 在代码中设定,预计最初 D = 10

用户必须支付费用("传输费用")才能将交易打包进区块。对于每个交易账户,节点保留两个余额:

• 储备余额,用于支付传输费用

• 执行余额,用于支付执行费用

当交易被纳入区块(共识)时,传输费用从储备余额中扣除;当交易被执行时,传输费用从执行余额中扣除(双重费用);在 D 个区块的延迟期后,将剩余费用偿还给储备余额。

账户的储备余额实际是"待处理"交易的费用预算,它的存在是为了确保只有已支付交易费用的交易被打包进区块。

每个账户都有一个预留储备余额,该余额可通过与内置的智能合约交互进行更改,例如,对于计划发送大量交易的 EOA 账户而言。

状态确认

最终确定性发生在共识时间,在这一点上,交易的官方排序是神圣的。对于任何全节点来说,结果都是完全确定的,它们通常会在1秒内执行该新块的交易。

状态 merkle 根的 D 区块延迟仅用于状态根验证,例如允许节点验证自己没有计算错误。

执行机制

每个区块的执行阶段,在该区块达成共识后开始,并允许节点继续就后续区块达成共识。

并行执行

交易是按线性顺序排列的,执行作业是得出串行执行交易列表后的状态,最简单的方法就是一个接一个地执行交易。我们能做得更好吗?可以!

Monad 采用并行执行

  • 执行器是执行交易的虚拟机,Monad 可并行运行多个执行器。

  • 执行器接收一笔交易并产生一个结果,结果是该笔交易的输入输出列表,其中输入是执行过程 SLOAD 的(ContractAddress、Slot、Value)元组,输出是交易结果 SSTORE 的(ContractAddress、Slot、Value)元组。

  • 结果最初在待处理状态下产生,然后按照交易的原始排序提交,当结果提交时,其输出会更新当前状态。在结果提交时,Monad 会检查其输入是否仍与当前状态匹配,如果不匹配,Monad 会重新安排交易。由于采用了并发控制,Monad 能确保生成与串行执行交易相同的结果。

  • 当交易被重新安排时,许多或全部需要的输入都已被缓存,因此重新执行的成本通常相对较低。需要注意的是,在重新执行时,交易可能会生成与上次执行不同的输入集。

MonadDb:高性能状态后端

所有交易的活动状态都存储在 MonadDb 中,MonadDb 是由固态硬盘(SSD)组成的存储后端,专为存储 merkle trie 数据而优化。该数据更新是分批进行的,因此可以提高 merkle 根的更新效率。

MonadDb 实现了内存缓存,并使用 asio 实现了高效的异步读写。节点至少配置 32GB 内存,以获得最佳性能。

与以太坊的比较:用户角度

相关属性EthereumMonad

每秒交易量(合约调用和转账)

~10次

~10,000次

区块时间

12秒

1秒

最终确定性

2 epochs (12-18分钟)

单时隙确定性 (1秒)

字节码标准

RPC API

密码学

ECDSA

ECDSA

账户

ECDSA 算法中,keccak-256 公钥的最后20个字节

ECDSA 算法中,keccak-256公钥的最后20个字节

共识机制

Gasper (Casper-FFG finality gadget + LMD-GHOST fork-choice rule)

MonadBFT (pipelined HotStuff 以及更多的研究优化)

内存池

交易排序

Leader's discretion

(实际:PBS)

Leader's discretion

(默认方案:PGA)

抗51%攻击

PoS

PoS

投票权委托

不允许,需通过 LSTs 实现

允许

硬件要求 (全节点)

4核 CPU

16GB 内存

1TB 固态硬盘

25Mbit/s 带宽

16核 CPU

32GB 内存

2TB 固态硬盘

100Mbit/s 带宽

最后更新于