因此,显而易见的是,zkEVM 的证明需要包含以下几个方面(与执行流程对应):
在为 zkEVM 设计架构时,我们需要分别采取措施满足上述三个方面的需求。 我们需要为某个密码学累加器设计一个电路。这是为了起到 「可验证存储器」 的作用,我们需要通过某种技术来证明读取过程是准确无误的。密码学累加器可以更高效地实现这一点 6。我们以默克尔树为例。已部署的字节码会被存储为默克尔树上的叶节点。然后,验证者可以使用简洁证明来验证该字节码是否正确加载自某个地址(即,验证电路中的默克尔路径)。针对以太坊存储,我们需要这个电路同时兼容默克尔-帕特里夏树和 Keccak 哈希函数。 我们需要设计一个电路将字节码与实际的执行追踪关联起来。将字节码转移到静态电路中会带来一个问题:像 jump 这样的条件式操作码(与智能合约中的 loop、if else 语句相对应)可能会跳转到任何地方。在某个人使用特定输入运行该字节码之前,跳转目的地都是不确定的。这就是为什么我们需要验证实际的执行踪迹。执行踪迹可以被认为是 「展开的字节码」,包含按实际执行顺序排列的操作码(即,如果你跳转到另一个位置,踪迹中将包含该目标操作码和位置)。 证明者将直接提供执行踪迹作为电路的见证数据。我们需要证明该执行追踪确实是特定的字节码使用特定的输入 「展开」 的。我们的想法是强制让程序计数器的值保持一致。针对目的地不确定的问题,解决思路 是让证明者提供一切数据。然后,你可以使用查找参数高效地检查一致性(即,证明带有准确全局计数器的操作码包含在 「总线」 中)。 我们需要为每个操作码设计电路(证明每个操作码中的读、写和计算都是正确的)。这是最重要的部分 —— 证明执行追踪中的每个操作码都是正确且一致的。如果你直接将所有东西都放在一起,会产生高昂的成本。此处重要的优化思路是:
|