第三章:Optimistic Rollup 原理:欺诈证明、挑战期与验证哲学

好,咱们进入正题。Optimistic Rollup 这个名字,说白了就是「乐观」——我默认你提交的数据是对的,除非有人站出来说「不对,这里有猫腻」。这种思路,跟我早期做联盟链时遇到的一个场景很像:当时我们设计了一个跨链桥,也是先假设交易有效,等有人举报再处理。嗯,那时候还没 Rollup 这个概念,但思想已经萌芽了。

3.1 欺诈证明:链上的「法庭」

欺诈证明(Fraud Proof)是什么?你可以把它想象成一个链上的法庭。当有人(我们叫它「挑战者」)发现某笔交易有问题,他就提交一份证明,告诉主链:「你看,这个状态转换是错的。」

具体怎么操作?我举个例子。假设在 Optimistic Rollup 里,用户 A 转了 10 个 ETH 给用户 B。排序器(Sequencer)打包了这个交易,然后提交了一个状态根到以太坊主链。如果这个状态根是错的——比如 A 只有 5 个 ETH,却转了 10 个——那么挑战者就可以提交欺诈证明。

欺诈证明的核心是单步证明(Single-Step Proof)。什么意思?就是把一笔复杂的交易拆成最细的粒度,比如一条 EVM 指令。挑战者只需要证明某一条指令执行错了,而不是整个交易都错了。这样做的好处是:证明的规模很小,Gas 成本可控。

关键点:欺诈证明不是重新执行整个交易,而是定位到出错的某一步。这就像你查 bug,不需要重跑整个程序,只需要定位到崩溃的那一行代码。

我在项目中遇到过一个问题:挑战者提交的欺诈证明太大,导致主链 Gas 费飙升。后来我们优化了证明结构,把单步证明的 Gas 消耗降到了 20 万以内。嗯,这个数字我记得很清楚,因为当时团队为了这个优化熬了好几个通宵。

3.2 挑战期:等待正义的窗口

挑战期(Challenge Period)是 Optimistic Rollup 里最让人纠结的设计。为什么需要它?因为我们要给挑战者足够的时间去发现并提交欺诈证明。

挑战期一般是 7 天。为什么是 7 天?不是 1 天,也不是 30 天?这其实是个权衡。太短了,挑战者来不及反应;太长了,用户提款要等很久。我个人习惯把挑战期叫做「等待正义的窗口」——在这段时间里,任何一笔交易都可能被质疑。

你想想看,如果挑战期是 1 天,那攻击者可以趁周末提交一笔欺诈交易,等挑战者反应过来,窗口已经关闭了。7 天的话,至少能覆盖两个周末,攻击者想钻空子就难多了。

避坑指南:我曾经在测试网上把挑战期设成了 3 天,结果发现挑战者根本来不及同步数据。后来我意识到,挑战者需要先同步整个 Rollup 的状态,这本身就需要时间。所以,挑战期的长度不仅要考虑攻击窗口,还要考虑挑战者的数据同步时间。

挑战期的另一个作用是「冷却」。用户提款时,需要等待挑战期结束才能拿到钱。这听起来很烦,但它是安全的代价。我建议你在设计产品时,把这个等待时间明确告诉用户,否则他们会骂你「吞钱」。

3.3 假设有效 vs 主动验证:两种哲学

Optimistic Rollup 的核心哲学是「假设有效」。什么意思?就是默认所有交易都是对的,除非有人证明它错了。这跟 ZK Rollup 的「主动验证」正好相反——ZK Rollup 每笔交易都要生成一个零知识证明,证明它是正确的。

这两种哲学有什么区别?我画个表给你看:

特性 Optimistic Rollup(假设有效) ZK Rollup(主动验证)
验证方式 欺诈证明(事后验证) 零知识证明(事前验证)
确认时间 需要等待挑战期(7 天) 即时确认
Gas 成本 低(平时不验证) 高(每笔都要生成证明)
安全性 依赖挑战者 依赖数学
适用场景 通用计算、复杂逻辑 简单转账、高频交易

我个人更倾向于把 Optimistic Rollup 叫做「懒人方案」——不是贬义,而是它确实省事。你想想看,如果每笔交易都要生成证明,那计算量得多大?而 Optimistic Rollup 平时什么都不做,只有出事了才干活。这种「按需验证」的思路,在资源有限的环境下特别实用。

但「假设有效」也有代价。我记得有一次,一个项目方问我:「如果挑战者都不在线怎么办?」我说:「那就等着被攻击吧。」说白了,Optimistic Rollup 的安全性依赖于至少有一个诚实的挑战者。如果全网都没有人挑战,那攻击者就可以为所欲为。

警告:不要以为挑战者会自动出现。你需要设计激励机制,让挑战者有利可图。比如,提交欺诈证明成功可以获得奖励,失败则要承担 Gas 费。否则,你的 Rollup 就是「裸奔」的。

3.4 欺诈证明的交互式挑战

刚才提到单步证明,但实际实现中,欺诈证明往往是交互式的。什么意思?就是挑战者和排序器之间会进行多轮交互,逐步缩小争议范围。

举个例子。假设排序器提交了一个状态根,挑战者说「这个根是错的」。然后他们开始玩一个「二分查找」的游戏:挑战者说「第 1000 笔交易有问题」,排序器说「不对,是第 500 笔」,然后继续二分,直到定位到某一条指令。

这个过程在链上执行,每一步都要消耗 Gas。但好处是,最终只需要在链上验证一条指令,而不是整个区块。这大大降低了链上的计算负担。

我在实现这个机制时,踩过一个坑:交互轮数太多,导致 Gas 费爆炸。后来我限制了最大轮数,比如 10 轮。如果 10 轮还没定位到具体指令,那就默认挑战者赢。嗯,这个设计后来被很多项目借鉴了。

3.5 实战中的挑战期优化

挑战期 7 天,用户等得起吗?说实话,等不起。所以很多项目开始优化挑战期。比如,允许用户支付额外费用来「加速」提款——说白了就是找第三方做流动性提供,先垫付资金,等挑战期结束后再结算。

还有一种思路是「部分提款」。用户可以先提一部分钱,剩下的等挑战期结束。这样至少能缓解用户的焦虑。我个人习惯在项目初期就把这些优化方案设计好,否则上线后用户会天天来投诉。

小技巧:如果你在做 DeFi 产品,可以考虑把挑战期和流动性挖矿结合起来。比如,用户在挑战期内质押 LP 代币,可以获得额外奖励。这样既能留住用户,又能保证安全性。

好了,这一章的内容就到这里。欺诈证明、挑战期、假设有效 vs 主动验证——这三个概念是 Optimistic Rollup 的基石。下一章我们会聊 ZK Rollup,到时候你会发现,两种方案各有各的脾气,没有绝对的好坏。