介绍欺诈证明系统及其变体, 欺诈证明如何在安全性、及时性和去中心化之间的权衡, 如果我们有 ZK,欺诈证明是否还有意义。
感谢 Gabriel Coutinho de Paula (Cartesi)、Ed Felten (Arbitrum) 和 Kelvin Fichter (Optimism) 审阅本文。
在思考乐观 Rollup 时,我们最初设想的是具有固定挑战期的系统,任何一个诚实的挑战者都可以确保其安全。因为我们认为这些属性是理所当然的,所以我们开始关注其他问题,比如验证者困境:如果一个欺诈证明系统有效,没有人会提交无效的根,因此没有人有动力检查链,这会反过来激励人提交无效的根。这个问题可以通过复杂的技术来解决,或者简单地忽略这个问题:浏览器、RPC 提供商、桥和其他基础设施提供商将不得不运行全节点,由于他们中的任何一个都可以是唯一的诚实挑战者,实际上链条将始终是安全的。
我们更进一步, 声称经济激励甚至不是真的必要来保护链条:任何人都可以成为挑战者,并假设他们能够承担执行挑战的 gas 费用,看上去一切都很好。而事实证明,这种说法极大地低估了捍卫者所需的资源需求。2024 年 4 月,一篇名为 “欺诈证明已坏” 的 ethresearch 论坛帖子由 Gabriel(来自 Cartesi)试图论证,具有固定延迟证明系统的愿景在“1/N”的假设下似乎从根本上是不可能的。这个说法背后的原因在于资源耗尽攻击:攻击者可以通过经济上击败诚实的捍卫者来尝试使协议确认无效的状态根,后者将没有更多的资金来保护系统。如果捍卫者需要大量资金,“1/N”中的 N 可能会变得小而危险。旨在解决这种攻击类型的技术似乎极大地影响了系统的其他理想属性,如固定挑战期。这个权衡空间将被呈现为欺诈证明三难困境,正如我们将看到的,每个项目都采取了不同的方法,具有自己独特的平衡。本文的目标是让用户、开发者和协议设计者更好地理解这些系统,并围绕乐观 Rollup 的安全性及其激励机制展开讨论。
在本文中,我们将一般性地介绍欺诈证明系统及其变体,即单轮与多轮和链上与链下协议。然后,我们将展示一个资源耗尽攻击的基本示例,以及不同的并发方法如何解决这个问题,但也会影响结算延迟。然后将定义三难困境,突出安全性、及时性和去中心化之间的权衡。将详细描述和比较四个主要的多轮欺诈证明系统,即(旧的)Arbitrum Classic 协议、(新的)Arbitrum 的 BoLD 协议、Optimism 的故障证明(OPFP)和 Cartesi 协议。将讨论挑战期的长度,以及利用不完美信息的可能攻击。最后,我们将讨论如果我们有 ZK,欺诈证明是否还有意义。
区块链状态是通过对其交易顺序应用状态转换函数(STF)计算得出的。鉴于全节点应在网络的相同视图上达成一致,这种 STF 必须是确定性的。Rollup 不是在其自己的 p2p 网络上传播填充交易的区块并拥有自己的共识来定义顺序,而是将这些任务委托给一个称为基础层或 L1 的独立网络。虽然 Rollup 也可以通过 p2p 共享区块并拥有单独的共识来排序,但最终的真相来源始终是 L1,因为 L2 可以发生矛盾(即在 L1 上发布不同的数据或不同的顺序)。一旦 L1 收集了交易批次并最终确定了顺序,Rollup 全节点就能够计算出由此产生的最终状态。如果用户想在两个网络之间桥接资产,他们需要一种方式告诉 Rollup 某些代币在 L1 上被锁定并在 L2 上铸造它们,而要提取时,他们需要告诉 L1 代币在 L2 上被销毁并释放它们。为此,两个系统需要了解彼此的状态。L2 全节点必须从 L1 获取数据及其顺序,这意味着它们需要自己运行 L1 全节点并且已经可以无信任地读取其状态。由于 L1 节点不运行 L2 节点,我们需要通过其他方式说服它们认可 L2 状态。此外,由于完整的 L2 状态不能完全发布在 L1 上,而是以状态根的形式发布其加密承诺。在 L1 上执行所有 L2 交易来计算这些承诺大多是不可行的,因此我们必须使用次线性策略,如 ZK 证明或欺诈证明,允许桥接仅接受正确的状态根。前者简洁地证明所有状态根都是正确的,而后者只是证明错误的状态根是错误的,“乐观地”接受其他的。由于接受无效的状态根可能允许攻击者窃取桥接中的所有资金,我们必须非常谨慎地设计这些协议。在本文中,我们将重点讨论乐观 Rollup。
从初始状态(S_0)到下一个状态(S_1024)的 1024 步转换。S_0 状态已经被共同接受,就像使用的 STF 一样。
如何证明不正确的状态转换是错误的?最简单的解决方案是在 L1 上执行所有先前确认状态的 L2 交易,要么完全计算下一个正确的状态根,要么证明特定的错误。这是 Fuel v1 采取的方法 ,这是第一个在主网上线的乐观 Rollup,仅支持简单支付。虽然这可能适用于简单的特定应用 Rollup,但在另一个 VM 中重新执行整个通用 VM 执行要复杂得多。Optimism 的初始版本,称为 OVMv1,尝试为 EVM 实现单轮欺诈证明 ,但纯粹在 EVM 内部模拟 EVM 的复杂性(例如,参见乐观时间旅行攻击 )使他们放弃了这种方法。Celestia 实现了两种类型的单轮欺诈证明,一种是证明不正确生成的扩展数据 ,这与数据的 Reed-Solomon 纠删编码有关,另一种是用于状态转换的。后者尚未在主网上线,鉴于其最小的 VM,Celestia 正在考虑直接转向 ZK。另一种单轮方法是 Taiko 计划的:节点可以使用 SGX 证明提出区块的状态根,稍后可以通过单个 ZK 证明进行挑战并证明错误。
虽然 ZK 可以为无法在基础层上简单重新执行的计算启用单轮证明,但即使使用 ZK,证明非常长的计算和非常高吞吐量的链也可能具有挑战性。在这样的系统中,断言者和挑战者同意初始状态但不同意最终状态,共同努力限制分歧空间,并减少需要在 L1 上重新执行的内容,可能减少到一个简单的指令,或者是可以用 ZK 证明的内容。在撰写本文时,唯一使用多轮欺诈证明并在最终步骤中使用 ZK 的项目是 Kroma。由于他们的欺诈证明系统仍在开发中,因此本文不会描述。
找到分歧单一指令的简单技术是反复在链上发布执行每个交易后生成状态根,或者换句话说,线性搜索。 对于极客 ,线性搜索需要 $O(n)$ 时间,其中 $n$ 是跟踪中的步骤数。由于在最坏情况下协议需要每一步进行一次交互,因此链上的成本将类似于执行所有步骤,使其不切实际。
线性搜索的交互式欺诈证明示例。
更快的搜索(O(log n))包括对执行跟踪进行二分,断言者询问挑战者是否同意执行一半步骤后的状态:如果他们同意中点,这意味着他们肯定不同意后半部分。否则,这意味着他们肯定不同意前半部分。协议通过提供剩余执行跟踪的前半部分或后半部分的中点递归继续,直到找到一个单一指令,在执行一步后双方同意一个状态并不同意。这个过程也被称为二分游戏。最后,给定作为 DA 提供的数据,在 L1 上执行单一指令。
二分搜索(二分法)的交互式欺诈证明示例。然后在链上执行所找到的步骤。
采用二分游戏的多轮证明系统是 Arbitrum、Cartesi 和 Optimism 采用的方法,这将在后面更详细地讨论。在这些协议中,最终的链上一步执行器被实现为一个简化的最小 VM,其中原始代码被编译到最小 VM。具体来说,Arbitrum 实现了一个链上 WASM VM,Optimism 实现了一个 MIPS VM,Cartesi 实现了一个 RISC-V VM,可以在给定适当状态见证的情况下执行单步。
多轮证明系统裁定胜者后的情况将在本文后面讨论,因为设计各不相同。
希望与 L1 实现信任最小化桥接的乐观 Rollup 必须将欺诈证明系统实现为 L1 上的一系列智能合约,以便基础层可以裁定争议的胜者并正确释放托管的资金。在其他情况下,如主权 Rollup 或独立 L1,欺诈证明系统可以设置为链下机制,并通过 p2p 网络将证明中继到每个节点,主要优势是挑战期可以减少到网络延迟, 在适当假设下 。据我们所知,唯一实际提出的链下欺诈证明系统是单 -轮,尚不清楚是否可以实现链下多轮证明系统。原则上,每个轻客户端应该充当“裁判”,接收断言者和挑战者的响应,并最终为自己裁定胜者。
在本文的其余部分,我们将重点讨论链上的多轮欺诈证明系统。
让我们开始深入探讨三难困境的细节,假设一个简单的挑战协议。想象一个简单的系统,每个人都可以提交状态根。原则上,我们希望有一个诚实的挑战者能够确保链的安全。我们还假设不需要保证金来提出状态根或挑战它们。由于二分游戏在 L1 上进行,因此每次移动都会产生成本,这会影响断言者和挑战者的 gas。在这种情况下,恶意断言者可以通过反复提出状态根来攻击协议,直到诚实的挑战者没有更多资金或计算资源来反击。只有当诚实方拥有比对手更多的资金和资源时,协议才是安全的。假设一个乐观 Rollup 桥托管了 100 亿美元的资金:攻击者可能愿意花费 90 亿美元的 gas 费用来攻击链,而防御者至少需要拥有相同数量的资金来用于挑战。如果协议不独立退还每场比赛,而是将所有资金退还给最终的根,则攻击面更大,因为攻击者可以花费 90 亿美元来攻击一个 100 万美元的桥接。这种攻击被称为鲸鱼攻击或资源耗尽攻击,这是一种女巫攻击。由于并非每个人都有 90 亿美元在 L1 上用于欺诈证明,这种协议极大地影响了去中心化,因为只有少数参与者可以参与。通过放宽单一诚实挑战者的假设,协议需要诚实挑战者在总资金上超过攻击者的总资金。如果不是这种情况,系统的安全性将受到威胁。
没有保证金的资源耗尽攻击
现在让我们尝试添加保证金以在挑战结束时退还胜者。保证金大小必须至少覆盖挑战中花费的 gas 费用,加上给防御者的可选奖励。断言者和挑战者都需要质押保证金,因为诚实的断言者需要在恶意挑战者的情况下获得退款,而诚实的挑战者需要在恶意断言者的情况下获得退款。由于每次挑战都会产生成本,让我们设计协议,使得断言者需要为每个提出的状态根质押保证金,而挑战者需要为每个挑战的状态根质押保证金。请注意,这不是唯一可能的保证金设计,其他设计将在描述不同团队提出的协议时讨论。在所有挑战结束时,诚实方保证获利,攻击者失去保证金。
1v1 挑战可以有两种方式进行:完全并发或部分并发。在第一种情况下,诚实方需要同时挑战所有对手,而在第二种情况下,每方最多只能同时参与一个挑战实例,但不同的对可以并行进行。第一种方法的优点是状态根可以在一个“挑战期”的固定时间后最终确定,而第二种方法需要根据一方需要经历的挑战次数进行多个连续的挑战期。
完全并发 vs 部分并发。在第一个例子中,一个根将在一个挑战期(7 天)后最终确定,而在第二个例子中,它需要两个挑战期(14 天),因为第二个诚实的断言者必须一次与两个恶意挑战者交战。
完全并发呈现出与没有保证金的协议类似的资源耗尽攻击:如果对手的资金比诚实方多,他们可以创建大量状态根来消耗诚实方的资源。如果诚实方设法找到所需的初始流动性和计算资源来同时赢得所有挑战,他们最终将获得利润。在部分并发中,鉴于诚实方一次只进行一个挑战,每个人只需要一个比赛的流动性,赢得后加上利润返回,可以用于下一个比赛,但代价是多个挑战期的延迟。
协议可以决定是使用已经确认的状态根作为提案的初始状态,还是使用在新提案之前的未确认状态根。如果使用已经确认的状态根作为初始状态,提案实际上是彼此独立的,这意味着前一个根的结果不会影响后续的根。每个提议的根都必须押注保证金,只有在确认时才会退还。假设只有一个诚实的提议者,并且状态根平均每小时提议一次,挑战期为 7 天,那么任何时候将有总共 168 个保证金被押注。另一种选择是,状态根的确认以所有前一个根的确认为条件:如果一个状态根被证明是错误的,它将与所有后续的状态根一起被修剪。这种修剪机制是关键,因为一个子节点可能相对于其无效的父节点是正确的(即不可能被证明是错误的),但仍应被丢弃。鉴于这种依赖关系,保证金可以从一个未确认的状态根移动到下一个,这隐含地证明了所有未确认祖先的有效性。如果只有一个保证金支持一个分支,任何根上的成功挑战都会修剪其整个分支,因为没有保证金支持它。正如我们将看到的,这种设计选择也会影响抵御某些旨在延迟确认的攻击的能力。
并行 vs 顺序争议。绿色勾号表示已确认的状态根,而时钟表示仍在挑战期的状态根。在并行情况下,对 S_300 的恶意挑战不会以任何方式影响后续 S_400 状态的解决,而在顺序情况下,它可能会。另一方面,对 S_300’的挑战与 S_400 无关。
让我们尝试更好地定义这个三难困境。我们定义一个资源函数,该函数以攻击者愿意花费的资金量为输入,并确定防御者需要多少资金来保护链。同样,我们定义一个延迟函数,该函数也以攻击者的资金为输入,并计算通过挑战在系统中引入的延迟量。理想情况下,我们希望这两个函数的增长尽可能慢。资源函数表示我们的系统有多安全:如果它增长得更慢,就更容易保护链免受资金充足的对手的攻击。
部分并发使得一个单一的押注可以独立于攻击者拥有多少资源来保护协议,代价是线性数量的延迟:资源函数是常数,而延迟函数是线性的。另一方面,完全并发使得资源函数线性增长,斜率为 1,而延迟函数是常数。正如我们将看到的,中间解决方案是存在的。去中心化指的是进入的门槛:提议一个状态根的成本是多少?事实证明,在某些协议中,可以牺牲去中心化来提高安全性或及时性。
虽然在这三个属性之间存在权衡,但尚不清楚这是否真的是一个普遍适用的三难困境。需要注意的是,在撰写本文时,尚未发现能够同时获得恒定资源、恒定延迟和高水平去中心化的解决方案。
Arbitrum Classic 协议自 2020 年以来已部署在每个版本的 Arbitrum 上,首次在 Arbitrum Nitro 白皮书中描述。与迄今为止描述的简单协议相比,它引入的一个改进是分支。协议强制参与者提交替代声明,而不仅仅是挑战声明。每个声明都需要押注。声明和反声明的集合可以看作是一个有向图 。由于协议使用顺序争议,保证金可以从一个状态根移动到其子节点。冲突的声明(兄弟节点)在 1v1 挑战中相互竞争以修剪失败的分支。
当参赛者输掉挑战时会发生什么?事实证明,他们押注的状态根不能立即删除,因为其防御者能够故意输掉。问题在于提供正确的二分法并未被强制执行,因为 L1 无法仅通过最终状态根知道执行轨迹中途的状态根值。因此,只有当所有押注在其上的参与者都输掉挑战时,状态根才会被修剪,这意味着所有诚实的参与者必须同时押注在正确的状态根上,因为他们无法检测和信任彼此。
为了防止资源耗尽攻击,协议使用部分并发,这意味着参与者一次只能进行一个挑战。如前所述,这种方法虽然实现了很高的安全性,但如果攻击者愿意为此烧钱,允许 sybils 进行延迟攻击。攻击的工作原理如下:攻击者创建许多 sybils,这些 sybils 押注在正确的声明上,而一个押注在错误的声明上。假设攻击者还控制交易排序(但不控制包含,即它具有有限的审查能力),它设置挑战,使得所有 sybils 首先与押注在错误声明上的那个进行比赛:那些押注在正确声明上的将故意通过错误的二分法输掉,并尽可能慢地浪费整个挑战期。该过程重复,直到所有押注在正确声明上的 sybils 被淘汰,诚实的断言者最终可以消除最后一个押注在错误根上的 sybil。直观上,更大的保证金(较少的去中心化)减少了攻击者可以产生的 sybils 数量,从而减少了延迟次数(更及时)。
对 Arbitrum Classic 的延迟攻击。攻击者可以花费一个质押来引发一次延迟(7 天)。协议强制在错误根上质押的恶意断言者依次进行挑战。
Arbitrum 通过实施一个可以提议状态根并对其进行挑战的地址小白名单来解决延迟攻击。目前包含 14 个受信任的参与者 ,这意味着最大延迟实际上被限制,发生的概率被最小化。另一方面,如果这 14 个参与者全部串通,一个无效的状态转换可以通过协议推送,显著影响安全性。
Arbitrum Classic 协议最大限度地远离及时性,达到了很高的安全性和去中心化属性。
为了在 Arbitrum Classic 协议上解决延迟攻击,Offchain Labs 一直在开发 BoLD,一个全新的挑战协议。一个简短的论文版本于 2023 年 8 月发布,而完整的论文于 2024 年 4 月发布。合约代码可以在这里找到。
在之前的协议中,诚实的参与者由于错误的二分风险而难以相互信任和识别。BoLD 通过在最终状态根之外,加入对整个执行历史(即所有中间状态根)的承诺来改进这一点。这一增强使得二分可以根据历史承诺进行验证。因此,如果初始声明是准确的,协议保证不会丢失任何挑战。诚实的参与者现在可以识别有效的声明,并允许任何人进行二分。因此,他们只需要在一个断言上放置一个质押,甚至可以汇集资金来覆盖这个质押。这种资本效率的提高使协议能够完全并发运行。由于二分与其各自的根声明相关联,二分树可以用于多个挑战,消除了重复发布相同中点的需要。
正确的断言被两个不诚实的断言挑战。中点可以在挑战之间共享,形成一个图。由于二分是根据原始声明进行检查的,任何人都可以在任何地方进行二分。
在这个协议中,一个额外的无效状态根只能引发一个额外的挑战。现在可以设计保证金始终是一个挑战成本的倍数,换句话说,使得对手总是需要花费诚实方响应所需花费的倍数,从而使资源攻击变得不那么有效。在论文中,这个倍数被称为协议的“资源比率”,因为资源函数是线性的,斜率可以任意设置。更高的初始保证金提高了比率,但也增加了诚实方的质押要求,损害了去中心化。
历史承诺的缺点是计算每个中间状态的默克尔根,然后计算所有这些其他默克尔根的默克尔根是非常昂贵的。给出一个具体的数字,Offchain Labs 估计两个状态根之间的步骤数约为 2⁷⁰步。相反,BoLD 使用多级方法:它计算每个大块步骤的历史承诺,一旦二分降到证明这两个块之间的转换,它在块中的第一个和最后一个根之间递归应用完整协议。使用的级别数可以是任意的,BoLD 目前使用 3 级。
三级挑战协议。较高级别的单步执行是由较小块组成的树的完整协议执行。最后一层在所找到的段的所有步骤上进行二分,最后在链上执行一个指令。
由于协议在较低级别重复,我们也需要在这里要求新的保证金。这个保证金应该有多大?事实证明,如果选择相同的保证金大小,可以部署一种新的耗尽攻击。攻击者可以在顶层质押 N 个保证金以生成 N 个顶层挑战,这导致诚实方在较低级别必须质押 N 个额外的保证金,这意味着资源比率接近 1。
在保证金相同的情况下,1 级和 2 级之间的资源耗尽攻击。攻击者不被迫在子挑战中进行游戏,但诚实玩家被迫。
通过在较低级别要求一个按所需资源比率缩小的保证金大小来防止攻击向量。换个角度看,最低级别的保证金大小应至少覆盖诚实方执行一次完整二分的成本,然后在向上时按所需资源比率进行放大。如果有 3 个级别,最低级别的保证金大小是 1 ETH,所需资源比率是 10%,那么顶层保证金大小应为 100 ETH。资源比率和级别数都代表了与初始保证金大小的权衡,因此影响去中心化,即参与系统的要求。
声明确认的直觉(简化警告!)可以解释如下。每个声明(即初始状态根)都有一个 7 天的“棋钟”,它会倒计时,但当一个后代被冲突的中点挑战时会停止。声明在其时钟归零时得到确认。为了让时钟再次滴答,对应的参与者需要二分自己的挑战点,直到这个新点也被对手挑战。当达到最后一步时,无效声明被删除,而正确声明继续倒计时。鉴于正确声明的时钟总是可以被使其滴答,而错误声明的时钟总是可以被停止(这可能需要降到单步),协议保证最终的正确解决。
BoLD 的挑战期设定为 7 天:如果一个状态根没有被挑战,其关联的时钟将在 7 天内归零并得到确认。在挑战的情况下,诚实方尽快响应,延迟仍然是 7 天,因为总是可以在状态根被挑战时使诚实状态根时钟再次滴答。在攻击者审查诚实方交易的情况下,正确的状态根时钟将被暂停。BoLD 假设审查攻击不会持续超过 7 天,因此如果攻击者成功审查,结算可能需要长达 14 天。协议允许质押者由于顺序提议将保证金从一个声明移动到下一个声明,隐含地断言最新断言所建立的所有未确认状态根的正确性,如同在 Arbitrum Classic 中一样。Arbitrum BoLD 争议经济学 文档和 BoLD AIP 提案 讨论了保证金大小。初始保证金不是通过将完整二分法的成本按资源比率乘以层数自下而上计算的,而是通过自上而下的方法估算的,其大小必须足够高,以防止在审查情况下结算延迟从 7 天延长到 14 天。鉴于桥中的资金量,Arbitrum 计算了一周内无法移动资金的机会成本。假设年收益率为 5%,这导致了 3600 ETH 的巨大顶级保证金。第二级保证金被计算为 555 ETH,第三级保证金为 79 ETH。通过计算这些保证金之间的比率,得到的资源比率约为 15%,这意味着攻击者需要拥有比诚实方(总和)多 6.5 倍的资金才能进行成功的资源耗尽攻击。虽然这些巨大的保证金影响了去中心化,因为并不是每个人都有那么多资金来单独保护协议,但重要的是要记住,人们可以将资金汇集在一起,并最终保证获利。
BoLD 协议试图在实现固定最大结算延迟的同时最大化安全性,牺牲去中心化。
Cartesi 在 2022 年 12 月发表的 Permissionless Refereed Tournaments 论文中描述了他们的欺诈证明系统(称为 Dave),比 BoLD 短文发表早了八个月。两个协议独立地收敛到相同的解决方案,通过历史承诺解决了无效二分法,并通过多层次解决了大默克尔树问题。同样的推理也适用于单一挑战的计时器。
与 BoLD 相比,Cartesi 决定采取及时性权衡的另一面,构建一个具有部分并发性的协议,使诚实方相对于对手具有比线性更好的优势。为了解决延迟攻击,即攻击者可以花费 $N$ 押金来延迟协议 $N$ 个挑战期,协议被设置为一个分组锦标赛。攻击者大多会在彼此之间淘汰,而诚实方只会参与与 sybils 数量相比对数数量的比赛。由于这种设置,攻击者的花费只会在诚实方上引发对数数量的 gas 花费,并增加对数数量的延迟。
诚实方,总体上,对抗 7 个 sybils,只参与 3 场比赛(8 的 log2)。当前实现仅在锦标赛结束时退款给获胜方,但预计在协议的下一次迭代中会修复这一点。
请注意,在此协议中,历史承诺不仅仅是优化:如果同意相同状态根的玩家不能联合起来,而是必须独立参加锦标赛,他们最终会被匹配在一起,如果他们都诚实地玩(但可能后来叛变),就不可能淘汰任何一方。
诚实方不能被匹配在一起,因此协议必须允许他们在同一声明上合作。
正如我们在 BoLD 中看到的,多层次挑战在考虑保证金时需要额外注意,因为一个额外的顶级押金可以引发诚实方的一个额外低级押金,并加剧耗尽攻击。在 Cartesi 协议中,由于额外的押金只会在同一级别引发对数数量的额外挑战,因此只会在低级别引发对数数量的额外押金,保证金大小不需要缩减。尽管如此,每增加一级会导致指数级更多的延迟,因为每个 sybil 可以再次参与每个低级别的锦标赛。
假设挑战期为 7 天,有 8 个 sybils,协议使用三级。顶级导致 3 周的延迟,成本为 7 个对手押金。诚实方在顶级参与的三场比赛导致二级的三个锦标赛。所有这些锦标赛由 3 场比赛组成,总共导致 9 周的延迟和 9 个三级锦标赛,成本为 21 个押金。在三级,9 个锦标赛,总共 27 场比赛,导致 189 周的延迟,成本为 63 个押金。总计 201 周的延迟,成本为 91 个押金,几乎 4 年。如果所有 91 个押金在一个单级协议中使用,延迟将“仅”为 6.5 周。
有强烈的动机尽可能少地使用级别或完全删除它们。一种解决方案是显著限制一次转换中允许的步骤数量,这意味着更频繁地发布根或完全减少系统的计算能力。另一种方法是允许更大的单步,这导致更便宜的历史承诺,使用 ZK。Cartesi 目前正在使用 RISC Zero 证明 RISC V 上的更大步骤,并完全删除多级。为了进一步减少延迟的影响,可以想象 BoLD 风格的游戏,最大玩家数量超过 2 个,在 Cartesi 风格的锦标赛中进行。
一种混合协议,其中延迟减少到 sybils 数量的 log8 而不是 log2,乘以一个挑战期。保证金大小需要比标准 Cartesi 锦标赛高,但比标准 BoLD 协议低。
Cartesi 中的保证金预计约为 1 ETH,允许非常高的去中心化水平。如果允许发布多个连续状态根,则经济要求也会增加:例如,每小时一个状态根,7 天挑战期意味着任何时候都有 168 个待定状态根,每个状态根都可能有一个独立的锦标赛,因此需要更高的总保证金。Cartesi 通过任何时候只允许一个锦标赛来解决这个问题,这意味着只有当前一个状态根被确认时才发布新的状态根。
如果 S_100 因为一个活跃的锦标赛需要 28 天才能最终确定,下一个状态根也将在 28 天后发布。下一个根将考虑与前一个根的时间延迟。
与 Arbitrum Classic 一样,更高的初始保证金可以减少攻击者可能引发的延迟,但代价是去中心化。此外,如果保证金在每场 1v1 比赛后巧妙分配(使用账户抽象!仍在研发中),对数资源函数可以改进为常数,因为这些资金可以用于支付下一场比赛的 gas(但不能被拿走)。
Cartesi 协议与 Arbitrum Classic 协议具有相同的权衡,但由于游戏的锦标赛结构,在及时性方面有严格的改进。
OP 主网于 2024 年 6 月在生产环境中发布了其欺诈证明系统。尚未发布任何论文,但可以在这里找到系统的规范,该规范首次发布于 2023 年 9 月。
该协议设置为具有固定延迟的完全并发。有趣的是,与 BoLD 和 Cartesi 相比,它不使用执行历史承诺来防止对有效初始声明的错误二分。挑战共享相同的图,类似于 BoLD 中所展示的那样。由于挑战共享相同的图并且可以发布无效的二分,因此协议不能仅依赖于顶级保证金,而是需要为每个二分移动提供质押保证金。由于这种方法,即使诚实的玩家无法识别彼此,他们也可以作为一个团队进行游戏,因为任何人都可以识别正确和错误的图节点。在 OPFP 中,如果其攻击子节点中只有一个未被反驳,则声明被认为是“反驳”的,递归地。最终的单步定义了这种递归的基本情况,因为它可以客观地裁定上面的声明是否正确。
正在运行的 OPFP 游戏的示例,包括必须反驳的正确声明的无效二分 (S_256 → S_384’) (S_384’ → S_320)。
这种方法的一个主要优点是发布初始声明比在 BoLD 中便宜得多,因为它不需要考虑完整二分的成本。Bond Incentives 规范 以 gas 而非 ETH 为单位给出保证金大小,但目前在主网上运行的实现假设固定 gas 价格为 200 Gwei,因此保证金的 ETH 大小也是固定的。发布初始声明的成本设定为 0.08 ETH,并且在每个深度增加 1.09493 倍。由于 OPFP 的最大深度 为 73,完成一次挑战到单步执行所需的 ETH 总量为 691 ETH。事实证明,在这种设置下,由于每次移动的价值都会增加,可以通过创建大量顶级断言来执行资源耗尽攻击,每个提案花费 0.08 ETH,诚实方需要攻击,每次移动花费 0.0875944 ETH。在这种情况下,资源比率正好是用于缩放保证金的因子,因此 109.493%,在经济上有利于攻击者。
对 OPFP 的资源耗尽攻击。防御者需要至少拥有攻击者资金的 109% 才能保护链。
OPFP 的时钟设置为 3.5 天,是 BoLD 和 Cartesi 协议使用时间的一半,其后果将在下一章讨论。这 3.5 天可以像 BoLD 从 7 天延长到 14 天一样延长到 7 天。此外,当声明即将到期时,协议允许延长 3 小时的时钟。根节点可以受到的延迟次数受最大深度限制,在 73 时约为 9 天,但由于指数保证金大小曲线,诱导额外延迟的成本也是指数级的。由于协议使用并行提案,这意味着每个初始声明需要单独的保证金,因此一个状态根上的时钟扩展不会影响其他状态根,因此用户可以选择退出下一个根。需要注意的是,并行提案不能防止由审查攻击引起的延迟,因为它会同时影响所有状态根。
OPFP 似乎在及时性和去中心化方面进行了优化,但尚不清楚该协议是否真的适合三难困境的权衡空间:即使保证金增加,资源功能(即安全性)也不会变得更好。
欺诈证明系统需要提供足够的时间让防御者挑战无效的状态根并进行二分游戏。假设诚实的挑战者始终在线并准备尽快采取行动,主要威胁是他们的交易由于审查攻击而无法包含在 L1 上。有两种类型的审查攻击,分别是弱审查和强审查。
弱审查发生在某些百分比的构建者(和中继者)审查某些交易,但大多数验证者没有。一个流行的例子是构建者审查不符合 OFAC 的交易 。假设这个百分比不是 100%,被审查的交易只会被延迟,最终会被包含。改进以太坊弱审查抵抗属性的技术目前正在研究中 。
即使 95% 的区块由审查构建者构建,交易在 36 分钟后以 99.99% 的概率被包含。在撰写本文时,符合 OFAC 的区块百分比为 35%。
即使这些结果看起来有希望将默认挑战期从 7 天减少到不到一天,主要威胁来自强审查攻击。在这种情况下,大多数验证者可以决定不投票支持包含要审查交易的区块,并且它们永远不会被包含。在以太坊上,强审查攻击只会导致活跃性失败,例如资金闲置在 EOA 中,除非涉及时间敏感的应用程序,如 DeFi 协议或 Optimistic Rollup。为了防止资金损失,以太坊社区可以决定硬分叉将审查验证者移出协议并恢复其强审查抵抗属性。可以说,协调硬分叉并非易事,不久前我们都同意 7 天是协议应为社区提供的安全边际。在这方面,由于 Optimism 决定使用 3.5 天作为其挑战期,因此在强审查攻击的情况下,他们可能无法保护用户。做出这一决定的理由是,在阶段 1 期间,在根确认后实施了额外的 3.5 天提款延迟,以解决挑战最后一分钟可能发生的任何错误,将总确认延迟保持在 7 天。预计在移除安全委员会的迭代中,挑战期将延长至 7 天。
一些“半自动化”技术(不太活跃地)正在讨论中,以减少在审查情况下进行硬分叉所需的社会协调努力,但它们需要对以太坊本身进行更改,并且尚未接近讨论是否包含在未来的升级中。
被弱审查的交易最终会被包含,而强审查则完全阻止包含。请注意,图表已被大大简化。提议者可以连接到多个中继器,其中一些也可能进行审查。
类似的论点可以用来讨论建立在可以延迟交易的 L2 之上的乐观 L3 的安全性。在撰写本文时,OP Mainnet 可以将每个 L1 → L2 交易延迟最多 12 小时,而 Arbitrum One 则最多 24 小时。如果我们假设一个具有 7 天挑战期的乐观 L3,这意味着协议不能超过 14 或 7 步,忽略 L1 审查。在实践中,欺诈证明系统需要大约 70 到 90 步来解决二分游戏,这意味着建立在 OP Mainnet 或 Arbitrum One 之上的 L3 应该有大约 3 个月的挑战期才能确保安全。另一种解决方案当然是减少 L2 对用户施加的审查延迟,或者使 L2 状态转换函数更明确地意识到排序器延迟,以便 L3 可以对此采取行动。
资源耗尽攻击仅在挑战期结束前影响诚实的参与者。即使协议需要大量资金来保护它,也可以认为找到流动性并不是一项困难的任务,因为它最终保证了非常高的利润,假设证明系统正常工作。我们认为这个假设不应被轻视。假设攻击者实际上花费数十亿美元攻击一个协议,然后在社交媒体或链上消息中表示他们在挑战协议中发现了一个漏洞,防御者肯定会失去他们的资金。没有人知道这个漏洞是否真的存在,还是只是虚张声势,但它可以作为一种有效的威慑手段,防止达到拯救链所需的资金目标。更好的资源函数减少了保护链所需的风险资本:在 Cartesi 协议中总共冒 1 ETH 的风险比在 BoLD 中冒攻击者资金的 15%的风险要好,这又比在 OPFP 中冒 109%的风险要好。
我们几年前开始开发乐观 Rollup,认为它们会是中期解决方案,直到 ZK 技术成熟到足以构建 zkEVM,这预计需要很多年。我们认为挑战协议比 ZK Rollup 更快更容易实现,但时间证明了这种看法是错误的:第一个通用 ZK Rollup,即 Starknet,于 2022 年 5 月发布,而第一个 zkEVM,即 ZKsync Era,于 2023 年 2 月发布,我们可以数出至少 3 个其他独立的 zkEVM 实现,包括 Linea、Scroll 和 Polygon zkEVM。第一个无许可的欺诈证明系统,即 OPFP,直到 2024 年 6 月才发布,且尚未部署其他系统。虽然这是事实,但也需要注意的是,在撰写本文时,没有一个 ZK Rollup 成熟到可以在无许可环境中运行,但可以说已经非常接近。
ZK Rollup 的主要优势是结算延迟,可以随着技术进步减少到几小时甚至更少,而乐观 Rollup 的 >7 天似乎是根本性的。另一方面,使用 ZK Rollup 不可能比乐观 Rollup 具有更低的运营成本,因为在理想情况下无需在链上证明。ZK 验证成本可以通过多个项目的通用证明聚合器来摊销,但证明成本和时间是最大的限制:ZK Rollup 的吞吐量必须受到证明者吞吐量的限制,否则区块链的头将越来越落后于 L1 上证明的内容。并行化技术可以用来提高证明时间,而证明成本似乎是根本性的。乐观 Rollup 可以随时轻松增加吞吐量:每秒步骤数的增加仅转化为一次更多的二分,这仅在罕见的争议情况下需要执行。给定最快的 ZK 证明者,这意味着具有最高吞吐量的 ZK Rollup,添加一个单一的二分和随后的 ZK 证明可以轻松产生吞吐量翻倍的链。具有 10 个二分步骤的相同链将具有>1000 倍的原始吞吐量。最大的权衡是,如果运行节点的硬件要求增加,那么能够运行挑战者的人就会减少。
总之,如今看来,乐观 Rollup 适用于那些需要比 ZK Rollup 多几个数量级的可扩展性并且能够承受额外结算延迟的用例,比如链上游戏或一般的隔离环境。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!