Layer 2 扩容技术:Optimistic Rollups 与 zk-Rollups

Published by

on

扩容方案通常分为两大类:

  1. 链下扩容(Layer 2),通过在底层区块链之上构建新的协议层来实现扩容;链下扩容方案可以分为状态通道、Plasma 和 Rollups。
  2. 链上扩容(Layer 1),通过优化底层区块链协议本身来提高吞吐量;链上扩容方案可以分为:分片、选择更高效的共识算法和协议优化等。

其中Layer2部分的三种:

  1. 状态通道(State Channels):允许用户在链下进行交易,仅在通道开启和关闭时与主链进行交互,这极大地减少了链上交易数量,从而提高了吞吐量,像 Raiden Network 和 Lightning Network 就是分别针对以太坊和比特币的状态通道扩容产品。
  2. Plasma 是一种子链(sidechain)方案,允许用户将资产从主链迁移到子链,并在子链上进行交易,子链周期性地将其状态更新提交给主链,以确保安全性,比如 OMG Network。
  3. Rollups 是将多笔交易打包成单个证明(zk-SNARKs 或 Optimistic Rollup 的欺诈证明),并提交到主链。这样,主链仅需验证证明而无需处理每笔交易,从而提高了吞吐量。典例是 zkSync(基于 zkRollup)和 Optimism(基于 Optimistic Rollup),Arbitrum 同样也是基于 OP 的 产品。

Optimistic Rollups 与 zk-Rollups

zk-Rollups

zk-Rollups 是一种基于零知识证明的二层扩容方案。首先由 Rollup Operator 组件将多个链下交易聚合成一个批次,之后使用零知识证明(例如 zk-SNARKs 或 zk-STARKs)生成一个简洁的证明文件,这个证明可以验证整个批次的交易的有效性,而不需要逐一检查每笔交易;然后将证明及与该批次相关的数据提交到主链,主链通过验证证明的正确性,确保交易是有效的;主链验证通过后,链上合约会根据证明中的数据更新链上的状态。这意味着,尽管交易是在链下进行的,但链上状态仍然得到了更新,确保了数据的一致性。

注:零知识证明(Zero-Knowledge Proof,简称 ZKP)是一种密码学概念,它允许一个证明者向验证者证明某个陈述为真,而无需透露任何关于该陈述的其他信息。简而言之,零知识证明可以让一个人证明他拥有某种信息,而不需要透露这个信息本身。

zk-SNARK算法中,一共有两个角色:

  • Prover,提交proof证明给Verifier。
  • Verifier,验证proof的有效性。

Vitalik这里有篇精彩的文章,我们引用他的例子。整个ZK证明流程为:

  1. 有一个公式f(x)=x**3 + x + 5。
  2. Prover想要证明两个结论:
    1. 结论1) prover申明输入x=3,则f(x)=35。
    2. 结论2) prover执行了完整的运算过程
  3. Prover提交proof给Verifier
  4. Verifier通过proof验证Prover诚实

zk算法的核心本质为:Prover提供(输入, 输出,中间值)三元组作为proof,Verifier根据contraint验证输出的正确性

电路

电路是zk算法中比较困扰人的地方,为什么需要使用电路??

在代码的算法公式中,为了zk证明,进一步需要转换成能产生中间值的公式,但其实转换后的结果其实就是一些简单的加法运算和乘法运算,完美的对应上了数字电路中的加法门、乘法门。于是,那就干脆连最开始的代码都不用写了,直接用电路来写逻辑吧,于是就出现了这样的代码(这里是完整的circom示例):

    //__1. verify sender account existence
component senderLeaf = HashedLeaf();
senderLeaf.pubkey[0] <== tx_sender_pubkey[0];
senderLeaf.balance <== account_balance;

component senderExistence = GetMerkleRoot(levels);
senderExistence.leaf <== senderLeaf.out;
for (var i=0; i<levels; i++) {
senderExistence.path_index[i] <== tx_sender_path_idx[i];
senderExistence.path_elements[i] <== tx_sender_path_element[i];
}
senderExistence.out === account_root;

//__2. verify signature
component msgHasher = MessageHash(5);
msgHasher.ins[0] <== tx_sender_pubkey[0];
msgHasher.ins[1] <== tx_sender_pubkey[1];


component sigVerifier = EdDSAMiMCSpongeVerifier();
sigVerifier.enabled <== 1;
sigVerifier.Ax <== tx_sender_pubkey[0];
sigVerifier.Ay <== tx_sender_pubkey[1];

//__3. Check the root of new tree is equivalent
component newAccLeaf = HashedLeaf();
newAccLeaf.pubkey[0] <== tx_sender_pubkey[0];

这是一套常见的交易执行逻辑,只不过换成了电路实现。因此,在ZK Rollup中,使用电路的目的,是要把逻辑拆分成一个个的中间步骤,专业术语叫做拍平(Flattening),用于产生约束和中间值。最终转化成多项式表达式参与ZK计算。

zk算法小结

– 把代码转换成电路(约束),目的是为了生成执行的中间值(Trace)。
– 把约束转换成多项式,用于验证Proof。
– Prover运行电路代码生成生成Proof,包括(输入,输出,中间值)
– Verifier利用多项式验证Proof

ZK和OP的流程,主要是在Proof手段不同,OP使用了OVM处理Challege, ZK用了ZK Proof。

Optimistic Rollups

Optimistic Rollups 是一种基于乐观性验证的二层扩容方案,即默认提交的区块是正确的,除非有人提出质疑。它同样需要 Rollup Operator 将许多链下交易聚合成一个批次,之后计算批次交易产生的新状态(如余额、合约状态等)并生成一份链下状态更新;然后将链下状态更新、相关数据提交到主链,这个状态默认是正确的,不需要额外验证;但是在状态更新提交后,会有一个固定的挑战期,在此期间,任何人都可以通过提供欺诈证明来质疑提交的状态更新的有效性,与被质疑状态的相关的整个交易将通过 EVM 运行检验,如果证明状态更新是错误的,提交者会被惩罚(扣除押金),同时链上状态会回滚到正确的状态;如果在挑战期内没有人质疑状态更新,或者质疑被证明是错误的,那么链上状态会根据提交的状态更新进行更新。

注:乐观性验证系统中,当有人对某个提交的区块提出质疑时,就要启动仲裁过程。质疑者需要指出区块中存在的一个具体错误,例如交易执行的结果不正确、状态更新错误等。

整体思路和Plasma大致相同:

  1. OP Rollup定期提交交易数据以及State Root到Ethereum。
  2. Optimistic, Ethereum先乐观认同Operator的提交,把交易数据和State Root上链。
  3. Fraud Proof,存在上链的窗口期(Challenge),一般为7天,等待第三方提出欺诈证明,并验证欺诈。
  4. 奖惩机制,根据Challenge的结果进行奖惩。

还有一些值得注意的特性:

  1. PoS机制。Operator( Validator )的产生往往采用PoS机制,利于实现奖惩机制,当然也有完全中心化的Operator。
  2. 数据压缩。Operator需要把所有的交易数据打包,提交到Ethereum,为节约存储空间,采用了数据压缩。
  3. OVM。当发生欺诈时,需要在以太坊上重新执行对应的Layer2交易。OP Rollup在Ethereum的合约中内置了一个OVM(Optmism叫做OVM,而Arbitrium叫做AVM),模拟Layer2的环境,重新执行对应交易。
  4. 挑战次数。当欺诈发生时,在挑战者和被挑战者之间可能会多轮交互,一般是两种策略:
    • Single-Round。一轮交互,代表产品Optimism。挑战者发出挑战,由OVM重新执行交易,判断最终结果。这种流程比较简单,但是成本高,OVM重新执行交易,需要挑战者提供额外的数据到layer1以太坊,即增加了layer1的上链数据,也需要消耗对应gas费。
    • Multi-Round。多轮交互,代表产品Arbitrium。核心思路是把交易的执行分成很多step,然后寻找出最小的step执行,具体如下:
      1. Challenger对某个交易发起挑战;
      2. Asserter(被挑战者),把该交易二分法(Bisection Protoco)分成两半,等待Challenger继续;
      3. Challeger挑战其中有问题的那一半;
      4. Asserter继续把step细分为两半,等待Chanllger挑战有问题的那一半,如此反复,最终Challenger确定有问题的最小step;
      5. 在Layer1上面重新执行该最小step,挑战结束。

Multi-Round整个挑战过程是在L2上面完成的,L1会负责验证挑战的有效性,以及仅重新执行最小的挑战单元。考虑到L2无论是GAS费,还是执行速度都远远优于L1,因此整个过程减少了L1的负担,从成本和执行效率的角度,多轮交互是优于一轮交互的。

  1. Liquidity Provider(LP)。引入解决LP撤回时间慢的问题,LP相当于中间商,用户可以把正在撤回中的资产转移给LP,LP确认资产无争议以后,直接放款给用户,收取一定的手续费,然后由LP来完成具体的挑战流程。

相关项目

Arbitrum

Arbitrum方案是由Offchain Labs提出并创建的,该方案也是基于Optimistic Rollup的解决方案,通过经济激励的博弈模型维护安全性并通过欺诈证明来维护交易有效性,主要区别在于挑战机制和实现形式。Optimism只需要排序者和验证者执行一次欺诈证明交互即可判断出结果,而Arbitrum认为一次交互可能导致欺诈证明需要包含大量的交易从而超出gas限制,并且提出欺诈证明是由于单条指令执行异常导致,无需执行全部的指令。因此,Arbitrum将欺诈证明分为多轮步骤,只需要证明排序者在执行某条指令时出现异常,即可证明排序者作恶,节省成本。

1. 多轮欺诈证明交互。Arbitrum采用多轮欺诈证明验证交易的有效性,降低单次挑战需要消耗的gas,不必担心gas费用超出限制。
2. 对EVM的兼容性更强。虽然Optimism团队的OVM对EVM兼容,但其实不是100%兼容,已有的项目从一层迁移过来仍然需要修改代码,Arbitrun团队的方案则是几乎100%兼容。
3. 多步交易可能存在安全性问题。Arbitrum交易的有效性验证需要多轮交互,内置虚拟机需要支持异步机制,该机制更加复杂,代码量更大,可能存在安全问题。

小结

总的来说,zkr和opr难分优劣,ZK rollup似乎架构上更优,但TVL上却是OP rollup领先,主要的原因为:

  • ZK rollup理论上更安全,也更复杂,接受度不如OP rollup。
  • OP rollup虽然存在撤回资产时间长的问题,但是LP的加入,对普通用户影响不大。
  • OP对EVM的支持良好,对dAPP友好,而ZK则是支持困难,虽然最近有不少zkEVM出现,但未被普遍接受。
  • OP rollup采用了经济模型,ZK rollup采用了算法模型,算法模型虽然更安全,市场表现并不一定优于经济模型,经济模型在生态圈更有优势。
  • Gas费方面,如果区块打包交易量少,ZK的gas更高,因为ZK需要额外计算Proof,而OP不需要。如果交易量多,ZK也不一定会占优势,取决于ZK上链的数据。一般OP rollup会把所有交易数据上链,看起来交易费会高于ZK,但实际并非如此。这里有个比较。Polygon zkEVM会把所有交易数据上链,而zkSync和Starknet则仅上链部分数据。上链全部数据则对比OP没优势,上链部分数据虽然GAS费低于OP,但又会被诟病DA问题。

To be continued.

留下评论

在WordPress.com的博客.