TAIKO: 路印创始人领衔构建的以太坊通用zkRollup L2

项目简介

Taiko 是一个基于zkEVM的以太坊通用zkRollup Layer2,部分项目成员来自Loopring。

项目设计还处于初步阶段,团队仍在处理潜在的安全性和性能相关问题,Solidity L1/L2 汇总合约将很快开源。

官方声称即将完成第一轮融资,并在未来会推出协议代币和稳定币。

post image

官网:https://taiko.xyz/

官推(847 followers):https://twitter.com/taikoxyz

Discord(650 members):https://discord.gg/HXcmU43Cbd

Github: https://github.com/taikochain

设计目标

  • 简单性 —— 设计应尽可能少地对网络的定序器/验证器施加责任,以便它们只需执行最少的操作即可保持网络正常运行。

  • 以太坊“等价” —— 最终目标是允许为以太坊L1开发的 DApp 迁移到 Taiko,而无需更改任何一行代码。Taiko 应以与 L1 完全相同的方式表示 Ether,这意味着 Ether 是 Taiko 的本币,而不是 ERC20 代币。也就是允许以太坊L1 Dapp的无缝迁移。

  • 成本效益 —— Taiko 在L1上的占地面积应尽量减少到极致,以降低成本。

  • 完全去中心化 —— Taiko 从第一天起就无需许可和去中心化。

专业术语

  • L1:以太坊网络。

  • L2:一般的layer-2,但有时也称为 Taiko。

  • 块:L2 块。当需要提及 L1Block 时,会明确地将其称为 L1 blockEthereum block。

  • L1 Rollup: L1上处理区块提交的一组智能合约。

  • L2 Rollup: L2上的一组智能合约,用于准备一个区块,包括授权 L1 验证器和处理跨链信号。

  • L2 排序器:L2区块矿工,他决定将哪些交易包含在区块中,以及何时/如何处理L2 汇总合约的prepareB1ock交易。

  • L1 Validator:与L1 Rollup 交互的地址。区块的验证者地址必须首先在prepareBlock交易中由 L2排序器授权。

  • 信号:源链上的 32 字节数据,表示要发送到目标链的消息。数据的解释取决于 DApD,因此与系统无关。

  • 检查点:区块发件箱中包含的所有信号的默克尔根。DApp 在目标层上提供了检查点而不是信号,以使用默克尔证明来验证其信号的包含。

  • 发件箱:包含信号的数据结构。每个L2 块有两个发件箱,一个在L1,一个在 Taiko。

  • 收件箱:标记所有收到的检查点的数据结构。有两个收件箱,一个在L1,一个在 Taiko。

假设 Taiko 在汇总中使用 AppliedZKP 的ZKEVM 作为核心组件。官方假设:

  1. ZKEVM 与当前的以太坊客户端实现完全兼容,只是区块奖励将改为零以太币。

  2. L2 交易的签名不属于数据可用性 (DA、DA数据)的一部分,因此,L2 交易对除区块的排序器和验证器之外的各方不可用

链选择和 PoS

Taiko 的 PoS 设计深受NXT(https://nxtdocs.jelurida.com/Nxt_Whitepaper)项目的启发。

Taiko 中的链选择与以太坊的不同之处在于,提议的区块被提交到以太坊上的 L1 Rollup以验证其有效性,而不是被广播到点对点网络以达成共识。

Taiko 中的待处理交易确实会通过网络传播,以便未来的区块可能包含在内。

一个Taiko 区块在L1上可能有以下状态:

  • 待定: 该块暂时被 L1 接受,但尚末通过有效的ZKP证明。

  • 已证明: 该块已通过有效的 ZKP 证明,但如果其祖先之一无效,仍可能会被丢弃。

  • 最终确定: 区块被证明,它的所有先前操作也被证明。一旦一个区块被敲定,它就永远是规范链的一部分,除非L1 • 重新组织敲定交易。L2的创世区块立即完成,无需 ZKP。

在 L1 上,Taiko 使用一个环形缓冲区来跟踪最后一个完成的块和最多 V 个待处理的块,因此,环形缓冲区有 N + 1 个插槽,高度为 H 的块将被放入插槽 H%(N + 1)。Taiko 还允许以任意顺序证明前 M (0 < M ≦N) 个待处理块。

由此,验证者可以降低 L1 成本,从而获得更快的块完成速度,从而达到更高的 L2 吞吐量。

**但 M 不能太大,否则,最终交易可能需要比 L1 区块 Gas Limit 更高。 **

块到期:

如果未在相应的到期窗口(expiry windows)内证明,可证明的待处理块将到期。

过期的块在被报告之前仍然有效——网络允许任何地址报告过期的块。 一旦报告了一个过期的块,它将与它后面的所有块一起被删除,无论后面的块是否被证明。 这意味着所有后续区块的验证者都失去了交易费用。 为了惩罚过期区块的验证者,其一定比例的质押将被削减 如果一个过期区块在被报告之前被证明,其状态将变为已证明或已完成,并且任何报告交易都会失败。 请注意,验证区之外的待处理区块永不过期。

块更换:

如果块的数据没有完整性,则块是无效的。Taiko 节点软件可以通过在其父级世界状态之上重放封闭的交易并比较块后状态根来识别无效块。当识别出无效区块时,L2客户端会立即丢奔该区块,并将其有效父区块视为最新的已知区块。如果客户端启用了 PoS 挖掘,它将产生一个新的 (可能是空的)块,用 replaceBlockL1 上的交易替换无效块。

下图显示了块 4'已经替换了块 4。类似于过期块报告逻辑,当一个块被替换时,它的所有后续块也会被删除。在下面的示例中,将删除块 5。

post image

为防止有效区块被替换,Taiko 要求替换区块质押额外数量的代币,称为 Replacing Stake。如果被替换块在其证明超时之前收到有效的ZKP,则替换块的替换权益将被削减,并旦被替换块验证者获得相同的块奖励,但在L1上。 另一方面,如果被替换块在证明超时内没有收到有效的ZKP,则替换块的验证者可以收回他的替换权益并获得替换奖励,这高于激励网络验证者的常规块奖励无效的块删除。 替换块也可以被另一个块替换,但不能被先前已替换的块替换。换言之,禁止循环块替换

提议延迟: 区块可以由以最小提议延迟 (MPD:minimal proposing delay) 质押任何非零数量协议代币的验证者提议。第一个成功提议高度为 i 的块将是高度为 i 的待处理块。 一旦在某个高度 i 有一个待处理的区块,相同高度的其他区块提案将失败。

在多次模拟后发现:无论质押权重和区块权重如何变化或分布,平均区块时间都会收敛于目标区块时间 T。

post image

仿真结果

  1. 验证者的平均 MPD 会随着其权益的增加而变小。

  2. 当要提议的块具有较大的权重时,验证者的 MPD 较小。

块时间戳:

在任何 L1 块中,所有封闭的交易共享相同的block.timestamp值。似乎所有交易都发生在一个时间点内。这种观点意味着没有人可以在一个L1块内提出多个L2块,因为每个L2 块都有一个非零MPD。

post image

L1 块的时间跨度为零。 **因此,官方采用 L1 区块时间戳的另一种观点 —— 将其解释 block.timestamp为 L1区块的开始时问,其结束时间定义为 block.timestamp + 12 seconds, 因为 Merge 后的Eth2 中的 L1区块时间为12秒 (SECONDS_PER SLOT)。

请注意,这12秒不一定是准确的,总是要求L2 块的 proposedAt 值大于其父块的值 proposedAt.

post image

L1 块具有非零时间跨度 然后验证者就有可能在一个L1块内提出多个L2块,只要这些块的proposedAt时间戳不小于block.timestamp且不大于 block. timestamp + 12 seconds

块奖励:

区块奖励是在每个L2 区块中铸造的TAI 代币。一个例外是替换但经过验证的块,它们的奖励是在 L1 上铸造的,因为它们的状态更改被丢弃。区块奖励的数量将每 4 年自动减半。 还将铸造固定数量的 TAI代币并发送到 DAO 的地址,为期4 年,以确保DAO 有足够的资金来支持持续的协议升级和生态系统的发展。

跨链数据同步

块哈希可用性: 每个L2 块应将最新的已知 L1 块编号和散列带到 L2,并使其可用于 L2 DApps。L1块的数量不得小于父 L2块带到L2 的数量。 最新最终确定的L2块的块哈希、块号和状态根被带到 L1 并可供L1 DApps 使两条链上的应用程序都可以使用另一条链的最新区块哈希,并使用 Tie proof 来验证另一条链的世界状态。

信号和检查点: Taiko 还为 DApp 引入了一个跨链通信子协议,以将信号发送到另一层。目标层上的 DApp 可以使用默克尔证明来验证源链上包含的信号。

信号是一个 32 字节的与应用程序无关的数据。在源链上,信号与其发送者地址进行哈希处理,并被放入与要提议的块相邻的 L2 块相关的发件箱中——这意味着下一个块的发件箱已关闭。请注意,对于每个 L2 块,有两个发件箱,一个在 L2,另一个在 L1。每个发件箱都有固定的容量(默认1024个信号)。一旦发件箱满了,信号服务在一个块被提议之前就变得不可用。

当一个 L2 区块被提议时,其发件箱中的信号被默克尔化为两个 32 字节的检查点(它们实际上是默克尔树的根),并且只有这两个检查点会被写入目标链的收件箱。信号和检查点永久保留,除非以太坊重组,否则永远不会被删除或修改。

信号费: 由于每个发件箱的容量有限,因此每个信号将收取费用以防止垃圾邮件。每个区块的发件箱有不同的信号费,其计算基于:1)当前区块的信号费, 2)发件箱中的信号数量,使用相同的 EIP-1558-style-math —— 每个区块的目标跨链信号数量发件箱设置为最大容量的一半。注意,一旦为发件箱设置了费用,它就不会再次更改,即使相应的块已过期或被替换。 信号费在 L1 和 L2 上都以以太币支付。在 L1 上收到的信号费将立即转发到 DAO 保险库;而在 L2 上收到的信号费则奖励给定序器。

同步哈希: 为了支持前面提到的每个区块的跨链数据同步,区块的排序器必须将某些数据写入 L2 世界状态,包括: 1)最后一个已知的 L1 区块编号,2)最后一个已知的 L1 区块的哈希值,3)被授权在 L2 上进行proposeBlock 交易的验证者地址, 4) L1 和 L2 检查点。可能还会将更多数据添加到此列表中。 L1 汇总合约可以验证正确的数据是否正确写入 L2 世界状态,但它会要求proposeBlock交易提供所有值及其对应的 L2 Trie 证明。Taiko 通过将所有这些值散列到称为同步散列的 bytes32 中来简化验证。在 L1 上,Taiko 只需要验证同步哈希是否写入 L2 世界状态,因此,一个 Trie 证明就足够了。

Bridges

桥接器旨在促进跨链合约调用,包括以太币转账。 但是 Bridge 不是核心 rollup 协议的一部分,因此,包括第三方网桥在内的多个网桥可以部署在 Taiko 上。

默认的启用桥接的调用由下面定义的 Message 结构捕获,其中 sender 表示调用 sendMessage 事务的地址,owner 表示目标链上可以执行某些操作的消息的所有者,to 是在其上的目标地址 将发生调用,数据是交易调用数据有效载荷(空数据表示以太传输到目标地址)。

费用和所需的以太币:

在源链上,消息发送者必须发送足够的发送者来支付1)信号发送费用,2)跨链保证金,3) 合约调用以太调用价值和gas 成本,4) 目标链上的消息处理费用。

因此,所需的总以太币为:

post image

任何额外的以太币将退还给sendMessage函数的调用者或指定地址。 如果message.gastLimt设置为零,则只有消息的所有者地址才能调用消息调用。

消息处理:

在目的层(destination layer),允许任意地址通过与Bridge 合约交互来处理消息,只要:

  • 该消息具有有效的包含证明

  • 该消息尚末处理

消息处理器收取的处理费不能超过messaeg .maxProcessingFee以太币。

如果messaeg.maxProcessingFee设置为零,则消息仍然可以由任意地址处理而无需支付费用,只要处理器愿意支付gas 费用。

消息调用:

消息调用是消息处理的一部分,除非message.gasLimit为零。message. gasPrice * message. gasLimit将收取更多费用。如果调用成功,消息将被标记为done,否则,所有剩余费用将被退还,消息将变为retriable。可重试消息只能由其所有者重新调用,并且在重试消息的同时,可以提供自定义的gas limit 和 gas 价格。