概要
异步执行是一种通过将共识与执行解耦,使 Monad 能够大幅提升执行吞吐量的技术。 将共识与执行解耦使 Monad 能够大幅扩展执行预算,因为执行从占用区块时间的一小部分,变为占用整个区块时间。背景:交错执行效率低下
共识是节点就交易的正式排序达成一致的过程。执行是实际执行这些交易并更新状态的过程。 在以太坊和大多数其他区块链中,执行是共识的前提。当节点就某个区块达成共识时,它们同时在就 (1) 区块中的交易列表,以及 (2) 执行该交易列表后概括所有状态的默克尔根这两点达成一致。因此,领导者必须在共享提案 之前 执行提议区块中的所有交易,而验证节点也必须在响应投票 之前 执行这些交易。 我们将这种类型的区块链称为执行与共识 交错 的区块链。在这一范式中,执行的时间预算极其有限,因为它必须发生两次 并且 还要为多轮跨全球通信的共识留出足够时间。 此外,由于执行会阻塞共识,每个区块的 gas 上限必须选择得极为保守,以确保即使在最坏情况下,计算也能在预算内在所有节点上完成。 结果是每个区块的 gas 上限只占区块时间的极小一部分。特别是在以太坊中,gas 上限(最坏情况下的 30M gas)对应大约 100ms 的时间预算,尽管区块时间为 12 秒:
以太坊执行预算与区块时间的对比
这仅占区块时间的 1%!简而言之,交错执行共识与执行会大大压缩时间。 如果不必这样呢?异步执行
Monad 将共识与执行解耦,将执行从共识的关键路径中移出,放入一个独立的、略有滞后的通道中。 在 Monad 中,节点在无需执行这些交易的情况下达成共识(即就交易的正式排序达成一致)。 也就是说,领导者在不知道最终状态根的情况下提议一个排序,验证节点在不知道(例如)区块中所有交易是否都能无回退地执行的情况下就区块的有效性进行投票。 当一个区块被最终确认时,网络中的每个节点(验证者和全节点)都可以执行该区块的交易,以生成最新的、经过一致同意的状态。 这一变化的结果是,执行可以分配到完整的区块时间。要理解原因,请参考下面的示意图,其中蓝色矩形对应执行,橙色矩形对应共识: 交错执行 在交错执行中,执行和共识预算之和等于区块时间,而共识占据了区块时间的大部分。
交错执行
异步执行 在异步执行中,共识占据完整的区块时间——执行也是如此,因为它们发生在不同的通道中,同时进行:
异步执行
对比 将两种方式并排比较,您可以看到异步方式的好处:执行预算可以显著扩展,以占据完整的区块时间:
上:交错式;下:异步式。
排序确定即意味着状态确定
尽管执行滞后于共识,但一旦排序确定,世界的真实状态就已确定。执行是揭示真相所必需的,但真相已经被确定。 值得注意的是,在 Monad 中,像在以太坊中一样,区块中的交易”失败”(即直觉上的结果未能成功)是可以接受的。(例如,某个区块中可能包含一个交易,其中 Bob 试图向 Alice 发送 10 个代币,但他的账户中只有 1 个代币。转账”失败”,但该交易仍然有效。) 任何交易的结果,包括失败,都是确定性的。
即使某些交易失败,交易确定性的示例
更细节的内容
延迟默克尔根
如上所述,Monad 的区块提案不包含状态 trie 的默克尔根,因为这需要执行已经完成。 所有节点应保持同步,因为它们都在做相同的工作。但确认这一点是好的!作为预防措施,提案还包括D 个区块之前的默克尔根,以便节点检测是否出现分歧。D 是一个系统级参数(当前在测试网和主网中设置为 3)。
延迟默克尔根的有效性是区块有效性的一部分,因此如果领导者提议一个区块但延迟默克尔根错误,该区块将被拒绝。
由于这个延迟默克尔根:
- 在网络就区块
N达成共识后(2/3 多数投票)(通常是在收到包含N区块 QC-on-QC 的N+2区块后),这意味着网络已同意区块N-D的正式结果是一个以默克尔根M为根的状态。轻客户端可以随后向全节点查询区块N-D处状态变量值的默克尔证明。 - 任何在区块
N-D处执行出错的节点将从区块N开始脱离共识。这将触发该节点回滚到区块N-D-1的结束状态,然后重新执行区块N-D中的交易(希望结果的默克尔根匹配),然后重新执行区块N-D+1、N-D+2等中的交易。

延迟默克尔根
预留余额
因为共识只能假设拥有全局状态的最多D 个区块的延迟视图,所以有必要略微调整共识和执行规则,以允许共识安全地构建仅包含可以支付 gas 费用的交易的区块。
Monad 引入了预留余额规则来确保这一点。这些规则对交易何时可以在共识时被包含施加了较轻的限制,并规定了一些交易将在执行时回退的条件。
推测性执行
在 MonadBFT 中,节点在时隙N 收到提议的区块 N,但直到时隙 N+2 时它才被最终确认。在中间的这段时间里,节点仍然可以在本地执行提议的区块(不保证它一定会被投票通过或最终确认)。这带来了一些不错的特性:
- 在提议的区块被最终确认的可能情况下,验证者节点已经完成了工作,可以立即将其默克尔根指针更新为结果。
- 交易可以针对推测性状态进行模拟(在
eth_call或eth_estimateGas中),该状态可能更新得更及时。
来自新充值账户的交易
因为共识略微领先于执行,所以先前余额为零的新充值账户在为其充值代币的转账已经过去D 个区块之前不能发送交易。
实际上,这意味着如果您从账户 A 向账户 B(余额为 0)发送代币,那么您应该等到看到交易收据(表明该区块已达到Proposed状态)之后,再等待 1.2 秒。
或者,根据 B 打算进行的交易的性质,可能可以编写一个可由 A 调用的智能合约,将充值操作与 B 打算做的任何事情结合起来,这样就不需要在充值和消费之间等待。

