撰文:Jaehyun Ha,量化交易公司 Presto Labs 分析师
编译:Yangz,Techub News
当前的区块链行业可以称之为零知识(ZK)时代。放眼望去,ZK 这个词几乎随处可见......不将 ZK 写入自己名号的下一代区块链项目也越来越少见。从技术角度来看,不可否认,ZK 很有前途,能为更具可扩展性和隐私性的区块链生态做出贡献。然而,由于 ZK 复杂的技术背景,许多投资者(包括散户和机构投资者)经常会发现自己投资 ZK 项目是基于一种「信念」,即它看起来很酷、很新,而且有可能解决区块链不可能三角,但却没有完全掌握 ZK 技术如何使每个项目受益。

在本 ZK 系列中,我们将探讨 ZK Rollup 的缺陷和有益应用。首先,我们将解读区块链 ZK 证明(ZKP)的两个核心属性:「零知识」和 「简洁性」(succinctness);然后,我们将讨论目前正在使用的大量 ZK Rollup 为何并没完全做到「零知识」的原因。接下来,我们将探讨在哪些领域应用 ZK Rollup 会是有害无益的,以避免许多问题,如实施的复杂性。最后,我们将重点介绍那些有效体现了 ZK 原则,并通过使用 ZK 技术实际展示了切实效益的典范项目。
回顾:ZK Rollup 中的交易生命周期
Rollup 作为一种扩展解决方案,通过在链外执行捆绑交易,然后在 L1 上存储最新 L2 状态的摘要数据,从而解决 L1 的吞吐量限制。其中,ZK Rollup 的突出之处在于它能够通过在链上提交链下计算的有效性证明来及时提取资金。在深入探讨 ZK Rollup 的问题之前,我们先简单回顾一下它的交易生命周期。

-
每个 L2 用户生成交易并提交给排序器。
-
排序器对多个交易进行汇总和排序,然后通过在链外执行这些交易来计算新的 Rollup 状态。随后,排序器以「批量处理」的形式将新的 Rollup 状态提交给链上状态智能合约,同时将相应的 L2 交易数据压缩成 blob,以确保数据的可用性。
-
批量处理被发送给验证者,验证者创建批量处理执行的有效性证明(或 ZKP)。然后,该有效性证明与额外数据(即之前的状态根)一起发送给 L1 的验证者智能合约,有助于验证者识别它正在验证的内容。
-
验证者合约检查证明是否有效后,Rollup 的状态就会更新,提交批次中的 L2 交易就会被视为最终完成。
(请注意,以上解释只是整个 ZK Rollup 过程的简化版,每个实现方式都会因协议而异。如果我们将角色分开,L2 中可能会有更多的实体,如聚合者、执行者和提议者。数据块的层级也可能不同,如块(block)、组块(chunk)和批(batch),这取决于它们的用途。上述解释假定的情况是,中心化排序器具有很强的权威性,既能执行交易,也能生成统一的数据块格式)。
与 Optimistic Rollup 不同,得益于 ZKP(如 ZK-SNARKs 或 ZK-STARKs),ZK Rollup 只需验证一个简单的证明,就能验证数千个交易的执行正确性,而无需重放所有交易。那么,什么是 ZKP,它又有哪些特点呢?
ZKP 的两个特性:零知识性和简洁性
顾名思义,ZKP 基本上就是一个证明。证明可以是任何能充分支持证明者声明的东西。假设 Bob(证明者)想让 Alice(验证者)相信他拥有某台笔记本电脑的所有权。最简单的证明方法是:Bob 告诉 Alice 密码,Alice 在电脑上输入密码并验证 Bob 的所有权。然而,这个验证过程对二者来说都有缺陷。如果 Bob 设置了一个很长很复杂的密码,那么 Alice 要想正确输入这个密码就会非常困难(假设 Alice 不会复制和粘贴)。更现实的情况是,为了证明自己的所有权,Bob 可能不愿意透露自己的密码。
但如果有一种验证程序,可以让 Alice 迅速验证计算机的所有权,而无需 Bob 透露密码,那会怎么样?例如,Bob 只需在 Alice 面前通过触摸 ID 解锁电脑就可以证明自己的所有权(注意,这并不是一个完美的 ZKP 例子)。这时,双方都可以从 ZKP 的两个关键属性中受益,即零知识和简洁性。

零知识
「零知识」指的是证明者生成的证明没有透露任何私人数据信息,验证者除了知道证明的有效性外,不知道任何关于数据的信息。在区块链中,这一特性可用于保护个人用户的隐私。如果对每笔交易都应用 ZKP,用户就可以证明其行为的合理性(即证明用户有足够的资金进行交易),而不会向公众暴露交易细节(如转账、账户余额更新、智能合约部署和智能合约执行)。
简洁性
另一个特性「简洁性」指的是 ZK 能够从一个包含大量事件的声明中生成一个简短且可快速验证的证明。换句话说,它可以化繁为简。在区块链中,这一点尤其适用于 Rollup。有了 ZKP,L2 中的证明者可以通过向 L1 中的验证者提交简洁的证明来说明交易的正确执行(10~100 KB 的证明可以表示 TB 交易级别的有效性)。这样,验证者就可以通过验证简明证明而不是重放所有交易,在短时间内(即 10ms~1s )轻松确认执行的有效性。
ZK Rollup 很好,但并不能保证隐私性
上述 ZKP 特性在 ZK Rollup 中得到了很好的应用。虽然验证者无法从证明者提供的 ZKP 中推断出原始交易数据,但验证简洁的证明可以让验证者有效地验证声明(即新的 L2 状态)。尽管如此,认为当前迭代中的 ZK Rollup 完全符合零知识和简洁性特性的说法是有误导性的。如果只关注证明者和验证者之间的交互,这可能是对的,但在 ZK Rollup 中还存在其他组件,如排序器、证明者和 Rollup 节点。它们是否也能保证「零知识」原则?
想想 ZK Rollup 中的交易生命周期--当交易从用户发送到排序器时,隐私是否得到了保护?证明者又如何?或者说,当 L2 批量提交给 DA 层时,个人账户信息的隐私是否得到了保护?目前这些情况都得不到保证。

在大多数主流 ZK Rollup 中,排序器或证明者(或其他一些具有强大权限的中心化实体)可以清楚地看到交易细节。举个简单的例子,只要访问任何一个 ZK Rollup 区块浏览器,就能轻松观察到上述所有细节。不仅如此,还可以考虑这样一种情况,即中心化排序器因某种原因停止服务,那么另一个 Rollup 节点便会试图恢复 Rollup 状态。它将从 DA 层(大多数情况下是以太坊)获取公开发布的 L2 数据,并重建 L2 状态。在此过程中,任何有能力重放存储在 DA 层的 L2 交易的节点都可以恢复每个用户的账户状态信息。
因此,「零知识」一词在当前的 ZK Rollup 中是以碎片形式实现的。虽然这不能被认为是错误的,但它显然不同于人们通常认为的「ZK 意味着零知识,等于完全隐私」的概念。当前 ZK Rollup 的新颖之处在于利用了「简洁性」属性而非「零知识」,即在链外执行交易,并生成简洁的证明,供验证者以快速、可扩展的方式验证执行的有效性,而无需重新执行。
因此,为了避免混淆,Starknet 等一些 ZK Rollup 将自己称为「有效性 Rollup」,而 Aztec 等其他确保真正 ZK 隐私性的 Rollup 则将自己称为 ZK-ZK Rollup。
思考 ZK Rollup 的实用性
如上所述,大多数 ZK Rollup 都没有完全实现 ZK 隐私。那么,我们的下一个目标应该是什么?通过在 Rollup 的每个部分全面部署 ZK 来实现完整的交易隐私吗?事实上,这不是一个简单的问题。除了要在技术上取得重大进步之外,ZK 在意识形态(如非法使用私人交易)和实用性上也要取得进展。鉴于交易完全隐私化的道德问题超出了本文的讨论范围,我们将把注意力集中在区块链项目遇到的 ZK Rollup 的两个实用性问题上。
要点 1:生成 ZKP 可能成为交易「快速终结性」的瓶颈
我们先讨论一下 ZK Rollup 本身的实用性。ZK Rollup 最具吸引力的卖点是 ZKP 带来的交易「快速终结性」,从而缩短资产的提取延迟。此外,增强的 TPS 和低交易费用则是锦上添花。最能有效利用 ZK Rollup 特性的是游戏行业,因为游戏内货币的存取非常频繁,每秒都会产生大量的游戏内交易。
但是,ZK Rollup 真的能被视为游戏的最佳堆栈吗?试想一下这样一种情况:一个玩家正在基于 ZK Rollup 堆栈的 Web3 游戏上畅玩。该玩家将游戏道具换成游戏中的货币,并试图从游戏中提出该资产。那么,要提出资产,游戏内的交易流程必须完全走完,也就是说着交易必须包含在新的 Rollup 状态承诺中,相应的 ZKP 应提交给 L1,并且需要等待证明在 L1 以太坊中最终完成,这样才能保证交易不会被撤销。如果所有这些过程都是即时发生的,那么我们就可以实现 ZK Rollup 经常吹捧的「即时交易确认」,允许用户立即提出资产。
然而,现实并非如此。根据 L2beat 提供的不同 ZK Rollup 的最终确认时间统计,zkSync Era 需要 2 小时左右,Linea 需要 3 小时,而 Starknet 平均需要 8 小时左右。这是因为证明者生成 ZKP 需要时间,而将更多交易纳入单个批次(即单个证明)以降低交易费成本又需要时间。换句话说,生成和提交证明的速度是实现 ZK Rollup 交易快速终结性的潜在瓶颈,会降低 Web3 游戏的用户体验。

另一方面,Ronin(为 Pixels 和 Axie Infinity 等 Web3 游戏提供动力)等游戏专用链在牺牲去中心化和安全性的同时,确保了较快的交易完成速度。Ronin 不是基于 ZK 或 Rollup 的链,它是一个 EVM 区块链,在 PoA(授权证明)+ DPoS(委托权益证明)共识算法下运行。它根据委托的质押数额选择 22 个验证者,然后这些验证者以 PoA 的方式生成并验证区块(即只在 22 个验证者之间进行投票)。因此,交易在 Ronin 上很快就能完成,其被纳入区块时几乎不存在延迟,而且验证所需的时间也不长。在 Shillin 硬分叉后,每笔交易的最终完成时间平均只需 6 秒钟。Ronin 在没有 ZKP 的情况下实现了这一切。
当然,Ronin 也有缺点。由于受中心化验证器的控制,它相对更容易受到 51% 攻击。此外,由于它没有使用以太坊作为结算层,因此无法继承以太坊的安全性。使用跨链桥也存在安全风险。但站在用户的角度想一想:他们会在意这些吗?目前没有去中心化排序的 ZK Rollup 也存在单点故障(SPOF)问题。以太坊为它们提供了保证,因为它降低了交易还原的可能性,但如果中心化排序器或证明器宕机,ZK Rollup 也会无用。请再次注意,ZK Rollups 中的 「ZK」仅用于验证执行正确的有效性。如果有其他项目能提供与 ZK Rollups 相同的功能,而且速度更快、成本更低,那么 Web3 游戏用户和开发者可能就不会再把 ZK Rollup 视为最优堆栈了。
要点 2:发布状态差异是把双刃剑
另一点是 ZK Rollup 协议实现的实用性。本篇文章中,我们将重点讨论状态差异发布,它是确保 ZK Rollup 中数据可用性的方法之一(参见《解锁坎昆升级:DA 层扩展的未知真相》)。
要理解 Rollup 中的数据可用性,一个简单的方法是想象一个业余登山者在攀登珠穆朗玛峰时进行认证和记录。最简单的方法是用视频记录从大本营到山顶的每一步攀登过程。虽然视频文件可能很大,但任何人都可以验证攀登过程,或许还可以重放录像。这种类比可以比作确保数据可用性的原始交易数据发布方法。Optimistic Rollup 采用的就是这种方法,允许各个挑战者重放并验证执行的正确性,毕竟对于排序器的状态承诺没什么可信任的。在 ZK Rollup 中,Polygon zkEVM 和 Scroll 采用了这种方法,将原始 L2 交易数据以压缩的形式存储在 L1 上,这样任何人都可以重放 L2 交易,以便在需要时恢复 Rollup 的状态。
回到业余登山者的例子,另一种验证方法可能是请一位著名的登山家与其一起登上珠峰,向全世界证实登山确实完成了。由于登顶活动已由可信赖的个人进行了认证,登山者便不再需要记录每一步以便存档。只需在起点和山顶各拍一张照片,其他人就会认为这位业余选手已经登顶。这个类比反映了用来确保数据可用性的状态差异方法。在 ZK Rollup 中,zkSync Era 和 StarkNet 都采用了这种方法,只存储在 L1 上执行 L2 交易前后的状态差异,这样任何人都可以从一开始计算状态差异,以便在必要时恢复 Rollup 的状态。

与原始交易数据发布方法相比,这种状态差异方法无疑有利于降低成本,因为它可以跳过中间交易的存储,从而降低 L1 的存储成本。不过,这也存在一个潜在的缺陷(虽然不是一个常见问题):这种方法无法还原完整的 L2 交易历史,对某些 DApp 来说可能是个问题。
以 DeFi 借贷协议 Compound 为例,假设它建立在基于状态差异方法的 ZK Rollup 堆栈之上。这些协议需要完整的交易历史记录,以便计算每秒的供应和借贷利率。但是,如果 ZK Rollup 排序器发生故障,其他 Rollup 节点试图恢复最新状态,会发生什么情况?它可能会恢复状态,但恢复的利率会不准确,因为它只能跟踪批次之间的快照,而不是每笔中间交易。
总结
本文想要传达的是,当今大多数 ZK Rollup 中都没有「ZK」这一部分,在 DApp 中的许多领域,使用 ZKP 和 ZK Rollup 可能也不是最佳选择。ZK 技术本身并没什么问题,只是在利用其技术进步的过程中,可能会给 DApp 带来潜在的性能下降。这并不是说 ZK 技术对这个行业毫无用处。当 ZKP 和 ZK Rollup 技术成熟时,它们肯定能为解决区块链不可能三角提供更好的解决方案。事实上,目前已有基于 ZK 的项目维持了 ZK 的隐私性,也有许多类型的 DApps 有效利用了 ZKP 和 ZK Rollup 的优势。我们将在下一篇文章中进一步探讨这一点,敬请期待!


