原文来源:Opside Team
当前,以太坊主网上已经有多个 ZK-Rollups 在运行了。然而 ZK-Rollup 的去中心化设计仍然处于早期阶段。我们目前都聚焦在 Sequencer 的去中心化问题上,大部分人都忽略了,实际上目前绝大部分的 ZK-Rollup 项目都没有实现去中心化的 prover。
对于 ZK-Rollup 来说,中心化的 prover 仍然是安全的,并且也不像中心化的 sequencer 那样会带来审查的问题。但是中心化的 prover 也会引发很多问题。首先,如果只有一个 prover,那么单节点宕机就会造成整个 ZK-Rollup 的有效性证明无法提交,从而给交易的最终确定性造成影响。其次,中心化的 prover 成本高昂,无法承担未来海量的 ZK-Rollup 的算力需求。最后,从经济的角度来说,中心化的 prover 独享了一部分收益,这在代币经济学上来说,实际上是不公平的。
去中心化 prover 能很好地解决以上的问题,但是也带来一些挑战,这也是为什么最近上线的几个 zkEVM 方案采用了中心化 prover 方案的原因之一。例如 Polygon zkEVM 的 beta mainnet 中依靠 trusted aggregator 来提交 ZKP,zkSync era 也是类似。
从技术细节上来讲,ZK-Rollup 的智能合约验证 ZKP 的时候,需要原始的 proof 数据,这就可能引发各种不同的链上攻击行为。例如,某一个 prover 提交计算出来的 ZKP 到链上合约时,需要发一笔L1的交易。当这个 prover 发出的交易广播到交易池中,攻击者就可以看到原始 proof 数据,攻击者可以设置一个更高的 gas 费来发交易,从而优先打包到区块中,来获取 PoW 奖励。
此外,由于 prover 之间是依靠算力来竞争,没有一个可信的身份识别机制,也很难建立一个通信机制。不同的矿工有可能做重复的工作,从而造成算力的浪费。
对于某个 sequence,prover 计算出 ZKP 之后,首先计算(proof / address)的 hash,并向链上智能合约提交 hash 和 address。其中,proof 是某一个 sequence 的零知识证明,address 是该 prover 的地址
假设在第 1 个 prover 在第 T 个区块提交了 hash,则在第 T 10 区块以内,还可以接受其他 prover 提交 hash,没有数量限制。第 T 11 区块及之后,不再接受新的 prover 提交 hash
第 T 11 区块及之后,允许任何 prover 提交 ZKP。只要有一个 ZKP 通过验证,那么就可以根据该 ZKP 对所有提交过的 hash 进行校验。校验通过的 prover 都可以得到 PoW 奖励,奖励金额按照矿工质押量的比例来分配。
如果在第 T 20 区块之前,都没有 ZKP 通过验证,则所有提交过 hash 的 prover 都将被 slash。此时该 sequence 重新开放,允许提交新的 hash,回到第 1 步
举一个例子,假设 Opside 中每个L2区块的 PoW 奖励是 128 IDE,当前总共有 64 个 Rollup slots,那么每一个 Rollup sequence 分配到的 PoW 奖励是 2 IDE。如果先后有 A, B, C 3 个矿工为一个 sequence 提交了正确的 ZKP,且 A, B, C 3 个矿工的矿工质押量(IDE)分别为 200 K, 500 K, 300 K。那么,A, B, C 可以获得的 PoW 奖励分别为 0.4 IDE, 1 IDE, 0.6 IDE。
prover 提交了错误的 hash
对于某个 sequence,如果没有对应的 ZKP 通过验证,则所有提交过 hash 的 prover 都将被惩罚
罚没的 token 将被烧毁。
关于 ZKP 的两步提交机制更多的细节与考量,请读者参阅官方文档。prover 质押以及惩罚的具体数字在未来可能会改动。
为什么允许多个 prover 提交 hash?如果第一个 hash 的提交者才能获得奖励,那么第一个 prover 提交了 hash 之后,其他 prover 就没有动力提交 proof。如果一个恶意攻击者提交 hash 之后迟迟不提交 proof,那么会阻碍整个 sequence 被验证的速度。因此应当允许多个 prover 独立且并行地提交 hash,以避免 ZKP 的验证被单个攻击者垄断。
为什么需要设置一个时间窗口?假设任何人在提交了 hash 之后可以立即提交 proof,那么该 proof 仍然有可能被抢跑。因为攻击者会立即提交一个与自己地址关联的 hash,随后提交 proof,从而获取奖励。设置时间窗口之后,提交过 hash 的 prover 就没有动力在此时间窗口内提交 proof,从而避免了 proof 被攻击者利用的可能。
为什么要按照质押量来分配 PoW 奖励?在一个时间窗口内,允许多个 prover 为同一个 sequence 提交 hash。实际上,矿工可以利用自己生成的 proof 提交多个 hash(只需要多个地址即可),从而占有大部分甚至所有 PoW 奖励。为了避免这种攻击行为,一个 sequence 的 PoW 奖励将按照矿工质押量的比例来分配。
本文提出的 ZKP 两步提交算法,在实现了 prover 去中心化的同时,能很好地规避针对 prover 的抢跑攻击,并鼓励更多的矿工提供稳定、持续的 ZKP 算力。最初的版本将在 Opside 的 Pre-alpha testnet 上线。在未来,Opside 也将在更多 ZKP 的挖矿领域进行更多创新。例如:
根据整个网络的 ZKP 算力供需关系,动态调整 PoS 与 PoW 的奖励分配比例
根据 ZK-Rollup 类型、Rollup 交易数量、gas 使用量等进行工作量预估,建立 Rollup batch 的个性化定价机制
应用开发者对所属 Rollup 的 ZKP 生成进行补贴,以激励矿工提供算力