欢迎光临散文网 会员登陆 & 注册

Optimism Rollup

2023-05-30 13:21 作者:DoraHacks  | 我要投稿

Hacker Dōjō Web3前沿技术 workshop文稿

资助金额:120 USDT

Bounty链接:https://dorahacks.io/daobounty/156

Workshop回顾:https://b23.tv/Vl6wndS

内容贡献者:@0x7ac61a

本项目由Hacker Dōjō 资助,文章转载请注明出处。

🔸学习量子计算、密码学、Space等Web3前沿技术

🔸认领Bounty,赚取赏金

🔸参与Hackathon,获得资助

更多Web3精彩技术分享尽在Dōjō👇

WeChat: @HackerDojo0

Optimistic Rollup基本概念

1、区块链扩容方案Rollup

有两种方法可以扩展区块链生态系统:

  • 可以让区块链本身拥有更高的交易能力

  • 可以改变使用区块链的方式

Rollup属于第二种方法,通过将计算移到链下,在链上保留每个交易的一些数据的方式来更快、更便宜地使用区块链,实现扩展。
Rollup的原理:在链上会存在一个智能合约,其中包含一个状态根(state root)。

任何人都可以发布一批汇总交易 (batch),这是一个经由高度压缩的交易集合,其中包含之前的状态根和处理交易之后的新默克尔根。合约会检查批处理中的前一个状态根是否与其当前的状态根相匹配,如果匹配则将状态根切换到新的状态根。

关于如何知道一个batch执行后提交的新root是正确的,存在着两种Rollups的解决方案:

  • Optimistic rollup:利用欺诈证明(fraud proofs)

  • ZK rollup:利用有效性证明(validity proofs)

2、Optimistic Rollup工作流程

OP Rollup中目前有2种类型的节点,sequencer(排序器)和verifier(验证器)。sequencer和verifier节点都运行L2Geth(由Optimism创建的Geth的轻微修改版本)。
当User提交一个L2 Transaction给sequencer时,sequencer处理这笔交易,将新的状态根提交给L1,同时其他L2节点在其L2副本上处理交易。为了确保L1新的状态是正确的,验证着节点会将自己的心状态根与sequencer提交的状态根进行比较。如果存在差异会开始欺诈证明,存在欺诈行为开始的state root均要被删除,Sequencer需要重新计算丢失的state root。

在L2提交交易:

  • 用户将交易发送给sequencer节点,如果是有效交易,sequencer会立即将其添加到L2链中。L2的块大小仅1 个事务,因此能立即将一个新块与新事务一起添加到链中

  • 然后在 sequencer 向L2链添加一些交易后,它将调用 L1 上的智能合约(CanonicalTransactionChain.sol)并将这些 L2 交易的交易数据与执行过交易后L2的新state roots

  • L1 上的智能合约将交易数据和state roots存储在另一个智能合约中(StateCommitmentChain.sol)

  • 交易数据存储在L1之后,validator节点将把交易包含在它们的 L2 链副本中。验证者也可以选择从L2同步,可以将直接从sequencer获得新交易

跨链交易:L1->L2
从L1到L2的交易速度很快,在这个过程中只需依靠sequencer将消息中继到L2链,用户需要将他们的交易数据发送到 L1 上的智能合约(L1StandardBridge.sol)。例如,如果用户想发送10 ETH到他们在L2上的地址,步骤如下:

  • 用户向 L1 上的桥接合约(L1StandardBridge.sol)发送 10 ETH

  • 合约将ETH锁定在L1上

  • 合约将用户的交易添加到交易队列中(CanonicalTransactionChain.sol->enqueue)

  • sequencer处理此交易,并将ETH存入用户的L2帐户。

跨链交易:L2->L1

用户会将交易发送到L2上的特定智能合约,然后中继器将读取它并将其发送到 L1。例如用户想将他们在 L2 上的 10 WETH 转移回他们 L1 地址上的 ETH,步骤如下:

  • 用户将10 WETH发送到 L2 上的桥接合约(L2StanderBridger.sol)

  • 桥接合约销毁WETH并将交易信息发送到另一个称为L2ToL1MessagePasser的智能合约。该智能合约记录了需要从L2发送到L1的交易数据。

  • 中继节点从L2ToL1MessagePasser读取此交易数据,并等待欺诈证明窗口(7 天)完成,然后再将交易发送到 L1。

  • 随后交易在L1上处理,用户可以从L1中当时锁定资产的桥接合约(L1StandardBridge.sol)中锁提取 ETH提取他们的ETH。

存储在L1上的状态:

由于每个交易的交易数据和结果状态根必须存储在L1上,因此最小化此数据的大小对于降低系统的存储成本至关重要。这就是术语“rollup”的由来。以下步骤解释了每个 L2 事务的数据如何存储在 L1 上:

  • sequencer获取许多顺序L2事务的调用数据,并将它们组合成一个batch

  • sequencer将这个batch发送到CanonicalTransactionChain合约

  • 合约对每个交易的调用数据进行哈希处理,并创建这些哈希值的merkel tree

  • CanonicalTransactionChain获取该批次的merkle根并将其发送到专门用于存储的智能合约中

3、欺诈证明

欺诈证明是Optimism系统的一个非常重要的部分,这可以保证sequencer的诚实性。
Optimistic Rollup对状态转移的保证是在一定时间窗口内,允许挑战者提交欺诈证明,在此期间任何人都可以对状态转换提出异议,并开始仲裁。仲裁有两种方式:

  • 非交互式欺诈证明

    • 如果sequencer将欺诈状态根发布到L1,则验证者节点可以启动欺诈证明并在L1上执行相应的L2交易

    • Optimism OVM1.0

  • 交互式欺诈证明

    • 在L2上由双方进行多轮交互后锁定某条存疑指令后在 L1 仲裁

    • Arbitrum/Optimism cannon(2022.3)

在 Optimism 实现中,一个L2区块只包含一笔交易,使得区块的 stateRoot 实际就是这笔交易的 stateRoot;即每笔交易都会有一个对应的状态被提交到 L1,因此它可以被单独挑战。


结合代码分析

L1与L2上涉及的主要合约:

位置:optimism/packages/contracts/contracts

1、 L1->L2

在使用L2之前,用户首先需要在L1StandardBridge进行充值。用户通过四个deposit函数可以存入对应的ETH或ERC20代币到L1StandardBridge合约。

或存入ERC20 token:

其中在_initiateETHDeposit函数中,设置了到L2的时候需要调用的函数

sendCrossDomainMessage函数触发L1CrossDomainMessenger.sol中的sendMessage函数:

首先,在这个函数中encodeXDomainCalldata构造了在L2中对应的L2CrossDomainMessenger.sol合约中,会调用relayMessage函数:

其次,在_sendXDomainMessag内部调用了CanonicalTransactionChain合约的enqueue函数:

CanonicalTransactionChain中的enqueue接收,经过了以下几个步骤:

  • 首先,如果攻击者在提交L1->L2的交易时将_gasLimit设置的很大,然后在 L2 合约中消耗,可能会导致Sequencer性能下降。于是Optimism设置了阈值enqueueL2GasPrepaid_gasLimit超过阈值的部分合约将根据超出的大小按比例燃烧gas。

  • msg.sender的说法:对于 L1->L2 消息,如果 msg.sender 为合约,那么在 L2 执行时,Origin 会被加上偏移。

  • 将交易压入queueElements队列中

  • 触发TransactionEnqueued事件


data-transport-layer会监听事件并存入数据库,由Sequencer查询TransactionEnqueued,转换为交易并挖出对应的区块。
在L2中的L2CrossDomainMessenger合约中的relayMessage函数会对应的处理这个交易,首先对交易进行如下检查:

  • 首先检查了msg.sender,msg.sender需要是L1CrossDomainMessenger

  • 并且同一条消息之前没有处理过

  • 保证消息的target不是L2_TO_L1_MESSAGE_PASSER,防止L2的消息又回环到L1

随后会调用到L2StandardBridge.sol中的finalizeDeposit函数,在这个函数中最终实现mint操作:

2、L2->L1

当用户需要在L2上销毁一些代币并在L1上使用它们时,用户可以调用L2StandardBridge.sol中的withdraw函数:

或用户或合约在L2调用入口函数L2CrossDomainMessenger.sendMessage()

sendMessage会进一步进一步调用OVM_L2ToL1MessagePasser.passMessageToL1(),它计算消息哈希并更新合约状态:

batch-submitter会监听 L2 区块,进行两个操作:

  • 打包批量交易 txBatch 提交到 L1

  • 打包批量状态 stateBatch 提交到 L1

每隔几秒钟Sequencer就会检查接收到的新交易,将它们与所需的任何其他元数据分批汇总,然后利用CanonicalTransactionChain.appendSequencerBatch()函数进行提交。appendSequencerBatch没有任何参数。批次以紧密打包的格式提交,避免了ABI编码的低效率。
appendSequencerBatch函数:

  • 首先计算批次头,然后计算其哈希值

  • 然后计算出批次的上下文

  • 然后将哈希值和上下文存储在存储器中(batchesRef)

同时在sequencer执行L2->L1交易时,将修改OVM_L2ToL1MessagePasser状态树(sentMessages[slot]),因而进导致状态的变化,反应在区块头部的stateRoot字段。batch-submitter随后通过appendStateBatch函数打包批量状态到state batch:

在_appendBatch函数中:

  • Lib_MerkleTree.getMerkleRoot(_batch)计算这个batch的merkel root

  • Lib_OVMCodec.ChainBatchHeader生成这个batch的header

  • 然后存储batch到数组中

在经过预定的欺诈证明期并与StateCommitmentChain核实后,任何人都可以调用relayMessage函数,并在L1上最终完成提款。同时relayMessage也是一个可以pause的函数。

  • _verifyXDomainMessage函数负责验证L2->L1交易存在

    • 证明 交易 存在 stateRoot 中

    • 证明 stateRoot 存在 batchRoot中

_verifyStateRootProof:

  • 验证是否在欺诈证明周期中

  • verifyStateCommitment函数验证_proof.stateRoot, _proof.stateRootBatchHeader, _proof.stateRootProof之间的一致性

_verifyStorageProof验证

  • 信息是由L2CrossDomainMessenger通过L2_TO_L1_MESSAGE_PASSER发送

  • 并且与_proof一致。

在relayMessage的剩余部分验证

  • 之前没有relay过相同的交易

  • 确保这个交易没有被Optimism阻止。

  • target不是CanonicalTransactionChain,因此L2->L1消息不能被回送到L2

  • 在调用前修改sender

  • 触发合约调用

  • 调用成功后标记为已经吊用

3、OVM1.0与OVM2.0

前面提到,欺诈证明存有两种实现方式:

  • 非交互式欺诈证明

  • 交互式欺诈证明

OVM1.0

由于OP Rollup依赖于欺诈证明,所以如果一条交易存在争议,就需要重放该交易以证明交易的结果是否正确,但是有些EVM操作码依赖于系统范围内的参数,这些参数可能会改变(例如存储状态或时间戳),这会导致交易在L1与L2间产生不同的行为。
因此Optimsim实现了OVM来处理L1上的L2争端的机制,这个机制保证可以重现在L1上执行L2事务时存在的 任何“上下文”,并且在理想情况下不引入太多开销。OVM是通过将上下文相关的EVM操作码替换为其对应的OVM操作码来实现的。

OVM2.0

cannon的欺诈证明解决方案:

✨ 关于Dorahacks

DoraHacks 是一个全球范围内的极客运动、全球黑客马拉松组织者,也是全球最活跃的多链 Web3 开发者平台之一。DoraHacks.io平台使得世界各地的Hacker和开源开发者可以参与黑客马拉松、Bounty、Grant、Grant DAO,以及公共物品质押等加密原生协议和基础设施进行协作并获得资助。到目前为止,DoraHacks 社区的 4000 多个项目已经获得了来自全球行业支持者超过 3000 万美元的资助。大量开源社区、DAO 和 超过50个主要区块链生态系统正在积极使用 Dora 的基础设施(DoraHacks.io)进行开源融资和社区治理。

✨ 关于Dorahacks DAO Bounty
Dorahacks DAO Bounty,为各类DAO和组织赋能!
Bounty计划为DAO和组织提供了一个强大的平台,通过社区激励的形式,发布问题,协调任务,鼓励用户积极参与。
作为Bounty发布者,您可以根据我们的指南,发布社区相关的悬赏任务,解决问题的同时,提升社区活跃度:https://dorahacks.io/blog/guides/publish-a-bounty/
作为赏金猎人,您可以在DAO Bounty计划中发挥自己的专长和能力,认领悬赏,解决问题,获得酬金:https://dorahacks.io/daobounty

✨ 关于Hacker Dōjō
Hacker Dōjō是由Hacker共建的加密、Web3前沿技术开源知识社区。Dōjō会以直播/音频/文字等形式定期组织分享session,内容包括Web3领域前沿技术论文解读、技术研讨、工作坊、技术领袖研讨会等。欢迎在Hacker Dōjo社区讨论、学习和交流:Dora Dōjo - Dora Community Forum: https://community.dorahacks.io/c/buidl-dorahacks-io/6

目前Hacker Dōjō已分享的主题有:

加入Dōjō的Hacker可以提出自己的学习期望,主动提案自己擅长的技术话题,由Dōjō组织分享。同时,Hacker Dōjō推出Web3前沿课题研究计划,定期选题,由Hacker进行研究和讲解,并以bounty形式奖励研究贡献者。欢迎各位Hacker认领Bounty:https://dorahacks.io/zh/daobounty

联系我们:

Telegram: @DoraDojo0

WeChat: @HackerDojo0

E-mail: hackerdojo0@gmail.com

Optimism Rollup的评论 (共 条)

分享到微博请遵守国家法律