原文标题:《BedrockExplainer》
撰文:Optimism?官方
编译:Frank,ForesightNews
Bedrock是OPStack有史以来第一个正式版本的名称,作为一组免费和开源的模块化组件,它旨在为Optimism的发展提供动力。
改进总结
Bedrock在其前身的基础上进行了改进,主要包含:
使用经过优化的批量交易压缩以及将以太坊作为数据可用性层,从而降低交易费用;
通过更好地处理L1重组,缩短了将L1交易打包到rollups中的延迟;
通过代码重用来启用模块化证明系统;
通过消除设计负债来提高节点性能。
更低的费用
Bedrock使用了经过优化的数据压缩策略,以最大限度地降低数据成本。我们目前正在对这一变化的影响进行基准测试,但我们预计它将大幅降低费用。
Bedrock还消除了向L1提交数据时与EVM执行相关的所有Gas成本,与之前版本的协议相比,这将额外减少10%的费用。
更短的存款入账时间
Bedrock在节点软件中引入了对L1重组的支持,这大大减少了用户等待存款入账所需的时间。
该协议的早期版本最多可能需要10分钟来确认存款入账,而使用Bedrock后,我们预计存款会在3分钟内确认入账。
改进的模块化证明
Bedrock从OPStack中抽象出了证明系统,以便rollup可以使用故障证明或有效性证明来证明在rollup上输入后的正确执行,这种抽象也将允许使用Cannon来证明系统中的故障。
改进的节点性能
通过在单个rollup「区块」中执行多笔交易,而不是之前版本中「每个区块一笔交易」的模型,节点软件性能因此得到了显著提高。
这使得MerkleTrie更新的成本能在多笔交易中进行分摊,在当前的交易量下,这会使状态数据的增长幅度每年减少大约15GB。
通过消除之前版本的协议中的技术负债,节点性能也得到进一步提高,这包括不再需要一个单独的「数据传输层」节点来为L1编制索引,并更新节点软件以有效地查询来自L1的交易数据。
改进的以太坊等效性
Bedrock从一开始就被设计成尽可能与以太坊「一致」,先前版本协议中与以太坊的多项偏差已被消除,包括:
Coinbase:客户诉讼的问题属于私人仲裁:金色财经报道,美国最高法院法官在Coinbase试图停止客户诉讼的问题上出现分歧,Coinbase(COIN.O)称这些诉讼属于私人仲裁。[2023/3/22 13:18:03]
「每个区块一笔交易」的模型;
自定义操作码以获取L1的区块信息;
在JSON-RPCAPI中分离L1/L2费用字段;
ETH余额的自定义ERC20表示形式。
Bedrock还增加了对EIP-1559、区块链重组和L1上存在的其他以太坊功能的支持。
设计原则
Bedrock被构建为模块化和可升级的设计,同时可以复用以太坊的现有代码,并尽可能达成?100%以太坊等效的目标。
模块化
通过使用定义良好的接口和版本控制方案,Bedrock可以轻松地更换OP堆栈中的不同组件,并添加新功能。
这就允许其借助一个灵活的架构,适应以太坊生态系统的未来发展,例如:
rollup节点与执行客户端分离;
模块化防故障设计。
代码复用
Bedrock尽可能地使用现有的以太坊架构和基础设施,这种方法使OPStack能够从以太坊主网使用的经过实战测试的代码库中继承安全性和林迪效应优势。
您会在整个设计中找到这样的示例,包括:
最少修改的执行客户端;
EVM合约而不是预编译的客户端代码。
以太坊等效性
Bedrock旨在最大程度地兼容现有的以太坊开发人员体验,但由于L1和rollup之间的根本差异,也存在一些例外情况:费用模型的不同、更快的出块时间以及包含L1存款交易的特殊交易类型。
这些例外情况包括:
旨在证明最小修改的以太坊执行客户端的故障证明;
以太坊执行客户端的代码重用,以供L2网络中的节点和排序器使用。
协议
Rollups建立在数据可用性的基础上,在最常见的配置中,rollup协议从两个主要信息来源派生出「规范的L2链」:
交易数据由定序器发布到L1;
存款交易由账户和智能合约提交到L1上的桥接合约。
以下是该协议的基本组成部分:
通过直接与L1上的智能合约交互,将存款写入「规范的L2链」;
Circle 2022年12月储备报告:金库储备资金超445亿美元:金色财经报道,美元稳定币 USDC 发行方 Circle 发布 2022 年 12 月的储备报告,该报告由 GrantThornton 会计集团审计,详细说明了稳定币发行方 Circle 的储备金库的构成,目前 44,553,543,212 USDC由托管账户中的 44,693,963,701 美元支持,其中很大一部分为美国国债。Circle 的储备基金注册为政府货币市场基金,该基金的股权由 Circle 全资拥有,包括 14 种不同的美国债券,价值超过 235 亿美元,该基金还持有 4890 万美元现金,另外还有 3300 万美元应归该基金(due to the Fund),但被“时间和结算差异”所抵消。持有 Circle 现金储备的美国银行包括纽约梅隆银行、Citizens Trust Bank、Customers Bank、New York Community Bank、Signature Bank、硅谷银行和Silvergate Bank。(cointelgraph)[2023/1/30 11:36:50]
提款是写入「规范的L2链」,并隐式触发与L1上智能合约和账户的交互;
Batches是与rollup上的batches相对应的数据写入;
区块推导是如何解释L1上的数据读取以理解「规范的L2链」;
证明系统定义了L1上发布的输出根的最终性,以便它们可以被执行。
存款
存款是L1上的一笔交易,并将包含在rollup中。根据定义,存款被保证包含在「规范的L2链」中,作为防止审查或控制L2的一种手段。
从L1传递的任意消息
存款交易是作为存款的一部分进行的rollup交易。通过Bedrock,存款是完全通用的以太坊交易,例如以太坊上的账户或智能合约可以创建「存款」合约。
Bedrock定义了一个在L1上可用的存款合约:它是一个智能合约,L1帐户和智能合约可以与之交互以写入L2。L2上的存款交易是从该存款合约发出的交易中派生出来的,其中包括预期参数,例如from、to和data。
有关详细信息,请参阅存款合约协议规范部分。
在L1上购买有担保的L2Gas
Bedrock还明确了Gas燃烧机制和存款费用市场,存款交易在L2上花费的Gas是通过Gas燃烧在L1上购买的。
这种Gas具体是在费用市场上购买的,并且在单个L1区块中提供给所有存款交易的Gas总量有一个硬性上限,该机制用于防止拒绝服务攻击,这种攻击可能发生在将交易从L1写入L2时,因为这些交易在L2上耗费大量Gas,但在L1上却很便宜。
Reddit Collectible Avatar总量突破350万,过去4天增长超50 万:金色财经报道,据Dune Analytics最新数据显示,Reddit于Polygon网络发行的NFT系列 Reddit Collectible Avatar总量已突破350万,本文撰写时为3,556,626个。 此外,Reddit Avatar NFT累计销售额已达到11,269,384美元,总销售量38,151笔,Avatar NFT 持有地址总量为 3,064,658个,单一 NFT 持有地址为2,993,655个。历史数据显示,Reddit Collectible Avatar总量于11月16日突破300万,这意味着在过去四天增长超50 万。[2022/11/20 22:09:15]
提供给存款交易的Gas有时被称为「有担保的Gas」。GuaranteedGas的独特之处在于它是通过在L1上燃烧Gas来支付的,因此是不可退还的。
且每单位有担保的L2Gas所要求的必须燃烧的L1Gas总量,取决于EIP-1559式收费机制报告的L2Gas价格。此外,用户根据计算费用机制更新所花费的L1Gas数量获得动态Gas津贴。
如需更深入的解释,请阅读存款部分的协议规范。
提款
提款是在L2上发起并由在L1上执行的交易完成的跨层交易。值得注意的是,L2账户可以使用提款来调用L1合约,或将ETH从L2账户转移到L1账户。
提款是通过在L2上调用MessagePasser预部署合约启动的,该合约在其存储中记录了消息的重要属性,然后通过调用OptimismPortal合约在L1上完成提款,以证明包含此提款消息。
这样,提款和存款就不一样了:提款交易必须使用L1上的智能合约来完成,而不是依赖于区块派生出来的信息。
分两步的提款过程
提款证明验证错误是过去几年许多跨链桥黑客攻击事件的根本原因。Bedrock版本在先前版本的提款过程中引入了一个额外的步骤,旨在为这些类型的错误提供额外的防御设计。
在分两步的提款过程中,每次提款必须在最终退出前7天提交与提款对应的Merkle证明,这种新的安全机制给了监控工具整整7天的时间来查找和检测无效的提款证明。
在此期间如果发现提款证明无效,就可以在资金丢失之前部署智能合约修复,这大大降低了跨链桥妥协的风险。
有关详细信息,请参阅提款协议规范部分。
批次交易
数据:币安销毁近1亿枚USDC:金色财经报道,Whale Alert数据显示,99,999,997 枚USDC (价值约100,108,896 美元) 在Binance上销毁。[2022/11/12 12:53:40]
在Bedrock中,为L1和L2之间的消息传递定义了一种有线格式,这种有线格式的设计目的是将写入L1的成本和软件复杂性降到最低。
优化数据压缩
为了优化数据压缩,L2交易列表被组织到对象组中,每个channel的最大规模能够在可配置参数中定义,最初将设置为9.5M,这些channel预计将使用压缩功能进行压缩并提交给L1。
batch并行提交
为了并行化来自向L1提交压缩channel数据的定序器消息,channel被进一步分解为「channelframes」,这些「channelframes」是可以适合单个L1交易的压缩channel数据块。
假设「channelframes」是相互独立的,并且顺序是已知的,那么由定序器发送到L1的以太坊交易可以并行发送,从而最大限度地降低了定序器软件的复杂性,并允许填充L1上所有可用的数据空间。
最小化以太坊Gas
Bedrock删除了L1系统在称为「batchertransactions」的交易中向L1提交channel数据所使用的所有执行Gas。之前发生在L1智能合约上的所有验证逻辑都被移动到了区块派生逻辑中。相反,「batchertransactions」被发送到以太坊上的单个EOA地址,称为「batchinboxaddress」。
Batches仍需接受有效性检查,batche中的单个交易也是如此,无效batches和有效batches中的无效单个交易被视为被丢弃并且与系统无关。
注意:以太坊将很快升级包含EIP-4844的新版本,它引入了一个单独的数据写入费用市场,并增加了以太坊协议愿意存储的数据量上限,这一变化有望进一步降低与将数据发布到L1相关的成本。
如需更深入的解释,请阅读有线格式规范。
区块派生
在Bedrock中,该协议的设计旨在保证L1上存款的时间与「规范L2链」的区块派生有关。这样做是通过定序器、存款和L1区块属性将数据写入L1的纯函数。
为了实现这一点,该协议定义了保证存款入账、处理L1和L2时间戳以及处理channel中的排序窗口以确保正确排序的策略。
保证存款入账
数据:1950枚BTC从未知钱包转移到Coinbase:金色财经报道,Whale Alert数据显示,1950枚BTC (价值约41,949,969美元) 从未知钱包转移到Coinbase。[2022/9/11 13:22:02]
区块派生协议的目标是这样进行定义的:
每个「L2区块间隔」过去后,必须有一个L2区块,且L2区块的时间戳与L1的时间戳保持同步。
在Bedrock中,引入了「sequencingepoch」的概念:它是由一系列L1区块派生出来的L2区块的范围,每个epoch由一个「epochnumber」标识,该「epochnumber」等于排序窗口中第一个L1区块的区块序号。受一些限制,epoch的大小可以有所不同。
batch派生channel将与「epochnumber」相关联的L1区块的时间戳视为确定L2上交易顺序的锚点。该协议保证一个epoch的第一个L2区块永远不会落后于所匹配epoch的L1区块的时间戳。一个epoch的第一个区块必须包含L1上的存款,以保证存款将被处理。
请注意,在Bedrock版本中,L2上的区块间隔目标配置为2秒。
处理L1和L2时间戳
Bedrock试图解决将L2上时间戳与存入交易中存在的L1上时间戳进行协调的问题。
它通过允许一个很短的时间窗口来进行排序,以便在epoch之间的L2交易上自由应用时间戳来实现这一点。
排序窗口是L1区块的序列,从中可以导出epoch。一个排序窗口中,其第一个L1区块的编号N包含epoch的「batchertransactions」。?
排序窗口包含区块,其中取决于排序窗口的大小:一个固定的rollup级别配置参数必须至少为2,增加它会为定序器提供了更多关于存款的L2交易排序机会,降低它为定序器提交「batchertransactions」引入的更严格时间窗口。这是在创造MEV机会和增加软件复杂性之间的权衡。
称为「最大定序器漂移」的协议常量控制一个区块在其?epoch?内可以具有的最大时间戳,有了这种漂移,定序器就可以在连接到L1出现临时问题时保持活跃。
区块派生管道
「规范的L2链」可以从头开始处理,方法是从L2创世状态开始,将L2链起始设置为第一个epoch,然后处理所有排序窗口,以便根据以下简化的顺序确定定序器batches和存款的正确顺序管道:
故障证明
在定序器处理一个或多个L2区块后,从这些区块中执行交易计算得出的输出将需要用L1写入,以实现L2到L1消息传递的无信任执行,例如提款等。
在Bedrock中,输出以树形结构的形式进行哈希处理,从而最大限度地降低了证明输出捕获的任何数据片段的成本。提议者定期向L1提交作为整个「规范L2链」的Merkle根的输出根。
OPStack的未来升级应该包括一个故障证明变体的规范,其中包含绑定,以激励提议者提出正确的输出根。
有关完整详细信息,请阅读?L2输出根提案部分的协议规范。
执行
在Bedrock中,OPStack通过镜像以太坊执行层和共识层之间的分离,在很大程度上不得不依赖于以太坊指定的技术关注点分离。
所以Bedrock以同样的方式引入了执行客户端和rollup节点的分离。
执行客户端
执行客户端是定序器和其他类型的节点操作员运行以确定「规范L2链」状态的系统。它还执行其他功能,例如处理入站交易和点对点通信,以及处理系统状态以处理针对它的查询。
借助Bedrock,OPStack旨在重用以太坊自己的执行客户端规范及其许多执行操作。在此版本中,Bedrock展示了对以太坊客户端go-ethereum的极其有限的修改,其差异小于2000行代码。
存在差异的根本原因有两个:处理存款交易和收取交易费用。
处理存款交易
为了在rollup中表示已存入的交易,引入了一种额外的交易类型。执行客户端实现这个新的交易类型是根据EIP-2718类型的交易标准。
收取交易费用
Rollups从根本上说还有两种与交易相关的费用:
一个是定序器费用。使用与以太坊相同的Gas表和相同的EIP-1559算法计算操作定序器的成本,这些费用用于操作排序器的协议,并根据网络拥堵情况随时波动。
另一个数据可用性费用。数据可用性成本与将批次处理交易写入L1相关,这些费用旨在支付定序器向L1提交批次交易所需支付的费用。
在Bedrock中,费用的数据可用性部分是根据称为GasPriceOracle的rollup系统智能合约中的信息确定的,该智能合约在区块派生过程中,是根据从每个epoch开始时插入的L1区块属性中检索到的Gas价格信息进行更新。
Bedrock指定在使用JSON-RPC时将这两种费用加到一个字段中。
rollup节点
与以太坊不同,Bedrock没有PoS共识。相反,「规范的L2链」的共识是由区块派生定义的。OPStack的执行客户端与一个新组件通信,该组件实现了称为rollup节点的区块派生,该节点使用与以太坊完全相同的引擎API与执行客户端通信。
rollup节点是一个无状态组件,负责通过读取L1上的数据和存款来推导系统的状态。在Bedrock中,rollup节点可用于对来自用户或其他汇总节点的传入交易进行排序,或者通过单独依赖L1来验证在L1上发布的已确认交易。
rollup节点的多种用途概述如下:
验证「规范的L2链」
运行rollup节点的最简单模式是只遵循「规范的L2链」。在这种模式下,rollup节点没有对等节点,严格用于从L1读取数据并根据区块派生协议规则对数据进行解释。
这种节点的一个目的是根据协议定义验证由其他节点共享或发布在L1上的任何输出根是否正确。此外,打算将输出根提交给L1的提议者自己可以使用optimism_outputAtBlock生成他们需要的输出根,并返回对应于L2输出根的32字节哈希值。
为此,节点应该只需要跟随「最终确定」的区块头。术语「finalized」指的是以太坊PoS共识,而「最终确定」的L2区块头是仅从「最终确定」的L1区块派生的「规范L2链」的区块头。
参与L2网络
使用rollup节点的最常见方法是参与其他rollup节点的网络、跟踪L2的进程和状态。在这种模式下,rollup节点同时读取数据和它从L1观察到的存款,将其解释为区块,并接受来自其他rollup节点网络中的用户和对等方的入站交易。
参与网络的节点可以使用它们正在同步的L2的安全和不安全区块头。
安全的L2区块头表示可以构建的rollup,其中每个区块都可以完全从参考L1链中导出,在L1必须「最终确定」之前;
不安全的L2区块头包括尚未从L1派生的不安全区块。这些区块要么来自将rollup节点作为定序器操作,要么来自不安全的同步与定序器。这也称为「最新」区块头。在出现分歧的情况下,总是选择安全的L2区块头而不是不安全的L2区块头。当出现分歧时,该链的不安全部分将重组;
在大多数情况下,对于终端用户应用程序,L2网络中的rollup节点将引用不安全的L2区块头。
交易排序
使用rollup节点的第三种方法是对交易进行排序。在这种模式下,rollup节点将在不安全的L2区块头之上创建新区块。目前,每个OPStack网络只有一个定序器。
定序器还负责将批次交易发布到L1,以便网络中的其他节点从中同步。
Batcher
定序器的作用是生产批次交易,为此,排序器可以运行rollup节点并具有单独的进程,这些进程通过从它们运行的??受信任的rollup节点读取来执行批处理。
这保证了OPStack的一个附加组件,称为批次交易处理程序,它从rollup节点读取交易数据并将其解释为要写入L1的批处理交易,batcher组件负责读取由定序器运行的rollup节点的不安全L2区块头,创建batcher交易,并将它们写入L1。
标准桥接合约
Bedrock还包括一对用于最常见类型存款的桥接合约,称为标准桥接合约。这些合约封装了存款和提款合约,为ETH和ERC-20代币的存款和提款提供简单的接口。
这些桥接合约的设计是在跨链桥的一侧为本地代币,另一侧包含一个可以管理铸造和销毁的封装代币,桥接原生代币涉及将原生代币锁定在合约中,然后在跨链桥的另一侧铸造等量的封装代币。
有关详细信息,请参阅标准跨链桥协议规范部分。
Cannon
虽然在Cannon中实现了防故障构建和验证,但故障证明游戏规范和将输出根挑战者集成到rollup节点中是后续规范里程碑的一部分。
延伸阅读
协议规范
协议规范定义了OPStack的技术细节,它是协议内部运作的最新事实来源。
Bedrock差异
要深入了解Bedrock与先前版本之间的差异,请参阅「Bedrock有何不同」。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。