我们将依托上篇文章建立的框架,深入polygon zkEVM关于Sequencer和Bridge更多的技术细节,同时也探讨未来潜在的去中心化Sequencer架构的不同特点。
在polygon zkEVM的第一篇文章里,我们总结了Polygon zkEVM 的整体框架以及交易执行流程,同时也分析了Polygon zkEVM是如何实现计算扩容的同时继承了L1的安全性的;在这篇文章里,我们将依托上篇文章建立的框架,深入polygon zkEVM关于Sequencer和Bridge更多的技术细节,同时也探讨未来潜在的去中心化Sequencer架构的不同特点。
<aside> 💡 在这篇文章中L2等价于Rollup,L1等价于Ethereum
</aside>
在上一篇文章里,我们介绍Ploygon zkEVM的过程中,实际上缺失了很重要的一个部分,就是polygon zkEVM 的原生桥(bridge)。
Polygon zkEVM的在L1和L2分别维护了一棵Exit Tree,名字分别为L1 Exit Merkle tree和L2 Exit Merkle tree。
但是为了更好的管理这两棵树,polygon zkEVM 很聪明的将这两棵树结合在了一起,如下图:
也就是用分别把L1 Exit Tree Root 作为Global Exit Tree的左叶子节点,把L2 Exit Tree Root 作为Global Exit Tree 的右叶子节点。
不过需要注意这里L1 Tree Root 和 L2 Tree Root是Sparse Merkle Tree(SMT),而Global Exit Tree是Binary Merkle Tree。
L1/L2 Exit Tree叶子节点的基本信息如下:
An exit leaf, in particular, is a Keccak256 hash of the ABI encoded packed structure with the following parameters:
leafType = 0
, Origin network token address (0x0000...0000
) is reserved for ether. If leafType = 1
, msg.sender
of the message在Polygon zkEVM的合约设计中,还是尽可能的将Bridge和Consensus合约尽可能的解耦。
目前其在L1部署的合约主要分为3个,如下图所示:
需要注意,他们之间不是继承关系,都是独立的合约,不过PolygonZkEVMBridge和PolygonPolygonZkEVM都会调用PolygonZkEVMGlobalExitRoot来更新或验证Global Exit Tree Root 。
PolygonZkEVMBridge.sol
bridgeAsset()
方法;或者在目标链调用该合约的claimAsset()
方法获得对应的跨链资产。PolygonZkEVMGlobalExitRoot.sol
PolygonZkEVM.sol
L1 → L2的跨链流程对应上图的橙色标识的三个步骤.
PolygonZkEVMBridge.sol
的bridgeAsset()
方法,这个方法会将这次跨链的metadata加入到L1 Exit Tree
中并更新L1 Exit Tree Root
,PolygonZkEVmGlobalExitRoot
合约中的Global Exit Tree Root
。claimAsset()
进行取款(合约会验证用户提供的Merkle Path是否和当前的Tree Root匹配)。会在下次调用polygonZkEVM.sol
的sequenceBatch()
方法的时候(我们上一篇文章Sequencer上传Batch的流程),每个Batch都需要加入一个有效的Global Exit Tree Root
或者一个Empty Root,当这个Global Exit Tree Root
结合之后提交的validity proof被验证通过的时候(证明Global Exit Root Manager同步到Rollup的Global Exit Tree Root
是正确的),这个时候才可以认为整个跨链流程正在完结。
对应以下代码中的BatchData
的结构体中的globalExitRoot
:
struct BatchData {
bytes transactions;
bytes32 globalExitRoot;
uint64 timestamp;
uint64 minForcedTimestamp;
}
function sequenceBatches(
BatchData[] memory batches
) public ifNotEmergencyState onlyTrustedSequencer
zkEVM Transaction Hash (Txhash) Details | zkEVM
PolygonZkEVMBridge | Address 0x39e780d8800f7396e8b7530a8925b14025aedc77 | zkEVM
Bridge()
函数发送一笔L2-Bridge-Tx,这会更新添加一个新节点在L2 Exit Tree中,然后依次更新L2 Exit Tree Root和 Global Exit Tree Root。trustedVerifyBatches()
往L1提交validity proof的时候,实际上也会把L2 Exit Root也一并作为Input进行上传,也就是以下函数的中的newLocalExitRoot,它代表了L2有新的BridgeToL1的交易,但是这些交易目前在L1还不能提款,需要等待这个新的newLocalExitRoot被验证成功。claimAsset()
函数并给出相应的MerklePath进行提款,跨链交易的也就完美结束。在上篇文章,我们介绍了Trusted Sequencer ,由官方运行的Single Sequencer,基本上L2网络的交易都会提交给这个Trusted Sequencer,并且可以获得一个及时Sequencer Finality。
而实际上用户还可以通过另一种方式直接提交交易到L1的合约中,而不需要通过Trusted Sequencer,从而保证了整个网络仍然具备一定的抗审查的特性。
function forceBatch(
bytes memory transactions ,
uint256 maticAmount
) public ifNotEmergencyState isForceBatchAllowed
forcedBatches[lastForceBatch] = keccak256(
abi.encodePacked(
keccak256(transactions),
lastGlobalExitRoot,
uint64(block.timestamp)
)
);
sequenceForceBatches()
函数,让这笔forceBatch
进入到L1合约中的sequencedBatches
,也就意味着这笔forceBatch在rollup中的交易顺序被L1合约最终确定,即便是Trusted Sequence也无法再更改这个forceBatch的交易顺序。(实际上所有rollup都会有这样的特性来提供抗审查特性比如Arbitrum的sequence Inbox和Inbox)不过这里推荐大家尽可能还是不要通过forceBatch的方式提交rollup的交易,因为通过这种方式,你在调用forceBatch往L1提交自己的交易的时候会暴露你的交易内容,而这个时候交易顺序还没被确认(需要等待sequence同步forceBatch并通过sequenceBatch()
再一次提交到L1的时候交易顺序才被真正确认)同时你已经没办法取消你的交易了,这个时候你有很大的可能被抢跑。
<aside> 💡 似乎这并不能真正的抗审查,因为forceBatch的方式存在被抢跑的风险,用户真的会用这个功能吗?
</aside>
从上文我们可以得知,sequence会从L1同步forceBatch中的交易到本地节点进行执行,于是Sequence的真正状态如下图所示:
Bn表示用户直接提交给sequence的交易执行后得出的结果
FBn表示Sequence同步forceBatch的交易进行执行后得出的结果
Polygon zkEVM State Management | Polygon Wiki
接下来我们回顾下Ploygon的整体架构,为接下来的去中心化sequencer思考做好铺垫。
我们需要关注到。对于Sequencer 和 Aggregator来说,他们的状态都是通过Syschronizer从一层合约中进行同步的,他们之间并不是直接通信的。
因此我们可以认为目前整个网络存在三种不同程度的Finality,我们给他命名成Sequencer Finality, DA Finality和Verified Finality。
sequenceBatch
将交易发送到L1上,在这种情况下,交易已经被DA层包含;在polygon的设计中, 由于单一 Trusted Sequencer的原因,所以可以确保上传到L1合约上进行DA的交易都是有效交易。我们可以认为当一笔交易被Trusted Sequencer 上传到L1合约中的时候, 这个时候它已经被rollup网络承认了,并且在之后Aggregator会提供validity proof让这笔交易真正无法被revert(除非L1 reorg)。假如我们这里假设提供validity proof是有利可图的,那么对于Aggregator来说,最好的同步交易的方式,不是在L1的DA层合约中同步,而是直接跟Trusted Sequencer建立rpc链接,直接从Trusted Sequencer获取最新的交易,这样生成validity proof会更快,从而相比其他从DA合约中获取交易的Aggregator更有竞争优势,因为提供validity proof这件事情是先到先得,对于一批交易来说也仅仅需要一个聚合的validity proof,第一个提交validity proof的Aggregator可以拿走对应交易的Matic奖励,其他Aggregator生成的validity proof也无法再获得任何奖励。
不过目前实际上polygon跟Trusted Sequencer角色一样,也有一个Trusted Aggregator, 来处理生成和提交validity proof的工作。
接下来,我们续接来是关于去中心化Sequencer的思考。
首先第一个问题是我们为什么需要去中心化的Sequencer?
因为我们希望Rollup能在扩容以太坊的计算能力的同时,继承以太坊的安全性和去中心化程度。
而当前 Single Sequencer的方案显然达不到继承以太坊的去中心化程度的目标。
再继续勾画去中心化Sequencer的未来之前,我们先来回顾Sequencer的工作。
以Polygon zkEVM为例,目前Trusted Sequencer对交易的处理会遵循FCFS,先到的交易先进行处理,并行mempool也是私有的,尽可能保护用户的交易不被MEV。
当收集到一定量的交易之后,会把它们封装成batches上传到L1合约中对应的DA的位置,并且在第一篇文章中我们也提到了这些了Sequencer上传的Batch中实际上已经通过在后一个batch包含前一个batch的哈希的方式确定了交易的顺序。
因此我们认为Sequencer的工作类似L1 proposer的工作,提议了一批交易,并且确认了交易的顺序。
因为我们是从polygon zkEVM 开始介绍去中心化Sequencer的,我们就先介绍polygon zkEVM的去中心化Sequencer方案Proof of Efficiency(效率证明)。
在POE的设计中,允许任何人成为Sequencer并且向L1提交 Rollup Block的,Rollup网络的交易顺序取决于交易被提交到L1的Rollup DA 合约的顺序。
<aside> 💡 在polygon zkEVM 里 Batch 等价于Block
</aside>
如下图,用户都可以自行选择将交易发送给哪个Sequencer,甚至可以自己成为Sequencer, 这些Sequencer在收到足够的交易之后,会将这些交易打包成Batch,然后往L1上提交。
这些Sequencer需要考虑利润问题:
Sequencer 成本 = L1 gas cost + generate zkProof fee
Sequencer 收入 = L2 gas fee
所以Sequencer 需要考量将至少多少笔交易打成一个Batch提交L1才是有利可图的。
但是Sequencer还需要考虑另外一个问题,时效性问题,如果一个Sequencer的提交交易速度过慢,那么它的用户可能会流失到其他提供更快确认的Sequencer那里。
首先这个方案能运转的核心原因是polygon的DA部分没有做任何状态承诺,仅仅确定了交易顺序;状态承诺(Sequencer承诺交易执行后对应的新的世界状态,但是这个状态未被validity proof或者fraud proof验证的状态)是在提交validity proof的时候才会给出,这是这个方案能远行的核心原因。
实际上像Arbitrum在提交交易到DA合约中的时候也没有做任何状态承诺,但是Optimism在提交交易到DA层的时候是携带状态承诺的,所以理论上Arbitrum也可以运用POE来实现去中心化Sequencer,但是Optimism则不行。
因为在多个Sequencer几乎同时往L1提交Batch的时候,实际上没有一个Sequencer可以保证最终在DA合约上L2的交易顺序到底是怎样,所以如果携带状态承诺,大概率会导致整个Batch无法通过validity proof或者fraud proof的验证。
<aside> 💡 无效交易指的是比如账户的nonce过低,账户余额不足以支付gas费用的交易,当这些交易在L1(geth)是不会被放入到区块的,因为如果一个区块中包含一笔无效交易,都会导致整个区块变成无效区块,Validator不会给这种区块投票,Propoer也不会提案这种区块。
</aside>
在当前Single Sequencer的情况下,L2网络是有能力辨别这种无效区块的,并且可以避免在L1 DA合约中避免包含这种交易,这可以避免浪费L1的区块空间。
但是采用POE之后,Sequencer实际上失去了辨别这种无效交易的能力,因此在L1的验证交易带来的状态变更过程中,也需要将这种情况考虑进去,并且Sequencer提交无效交易是无法获得用户的手续费的。
采用POE之后,如果这些去中心化的Sequencer之间会存在Public Mempool,那么会导致用户一笔交易被不同的Sequencer提交多次,当然只有第一次提交的交易是有效交易,也只有这交易最终能获得用户的手续费。
在这种Permissonless Sequencer的模型下,一个Sequencer是无法给用户提供及时的Sequencer Finality,因为Sequencer预测的最终上链的的交易顺序和实际的交易顺序会有偏差,这个偏差是由于可能有多个Sequencer在几乎同个时刻向L1的DA合约提交了交易Batch,在这种情况下很难保证这些交易Batch的实际顺序是否跟预测顺序相同。
因此Sequencer同步自身状态的时候,也会从L1的DA合约上同步最新被提交的交易Batch并执行来获得最新状态,而不是其他Sequencer那里同步状态。
由于交易任何人都可以成为Sequencer提交Rollup网络的交易, 并且提交交易Batch的交易实际上跟L1的普通交易无异,因此它实际上还是会经过MEV Boost的整个流程,意味着L2网络的MEV都会流失到MEV Boost模块。
在POE的设计上,Aggregator同样也是permissionless的,但是由于validity proof实际上只需要一个正确的交易,也就意味着只有第一个为交易提交正确的validity proof的Aggregator才能获得奖励。因此作为Aggregator,你需要权衡提交的validity proof的证明范围,提交时间以及提交validity proof可以获得的Matic奖励之间的关系,最终找出一个最有竞争力的策略。
似乎,利用这种自由市场竞争策略,可以让交易对应的validity proof的生成速度达到最快。
Proof of Efficiency: A new consensus mechanism for zk-rollups
POE可以带来完全PermissionLess的网络,并且整个网络可能也不会有宕机的风险,但是L1的DA合约中可能包含无效交易(比如相同Nonce的交易),MEV都被L1网络获取,并且只能提供DA Finality和Verified Finality。
Based Rollup 是期望将Rollup网络的Single Sequencer的工作委托给以太坊的proposer去完成。它会要求每个Proposer提案L1的区块需要包含一个有效的Rollup 区块。
因此L1 网络的Block Builder需要运行一个Rollup的全节点用来接受L2的交易,并且构建最大价值的Rollup Block。
这样的方案的好处是可以最大程度的继承了L1的安全性以及去中心化程度,但是也会导致只能提供Sequencer Finality和Verified Finality,L2的MEV也会都流失到L1 同时也需要对以太坊客户端的代码进行修改,这也可能会影响L1的安全性。
Shared Rollup 相比Based Rollup将构建和提交Rollup Block的工作交给以太坊的Propoer,则是将这个工作交给Share Sequencers中的委员会。
因为Rollup之间不一定是同构Rollup,比如Arbitrum和polygon zkEVM之间的跨链,那么意味着跨链交易对应在Arbitrum和polygon zkEVM之上交易的Verified Finality并不一致,比如我在polygon zkEVM之上的mint交易已经获得Verified Finality(提交了validity proof),但是此时我在Arbitrum上的Lock交易仅获得了DA Finality(需要等待7天挑战期),如果我在这个时候成功revert了我在Arbiturm的交易,那么也就意味着:我实际上在polygon zkEVM无成本铸造了很多跨链资产。
在这篇文章我们详细结构了polygon zkEVM的bridge以及sequencer更多的技术细节,在下篇文章也是最后一篇文章,会继续解构zkEVM的技术细节,敬请期待。
未完待续…
如果大家觉得写得不错的话,欢迎大家关注我的推特 0xhhh,可以的话也给我的Thread一个like ,感激不尽(写文章真的太需要正反馈了)。
Polygon zkEVM的下一篇文章也会继续在推特发布,也欢迎大家在推特催更。
本文首发于:https://literate-wolfsbane-bf0.notion.site/polygon-zkEVM-f0915b65aa784593a77b1938ddf34755
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!