为简单起见,可以将 zkProver 视为由以下四个组件组成;
- Executor,即主状态机执行器
- STARK 递归组件
- CIRCOM 库
- zk-SNARK Prover
简而言之,zkProver 使用这四个组件来生成可验证的证明。下面的图 5 推测了该过程。
1. Executor
Executor 实际上是 Main SM Executor。它作为输入;交易、新旧状态、Sequencer 的 ChainID 等等。
Executor 也需要
- PIL,它是多项式列表、寄存器列表
- ROM,存储与执行有关的指令列表。
因此,有了这些输入,Executor 在 PIL 硬件上执行所有指令并生成提交的多项式;这是状态机周期,或所有状态的列表。它还生成一些公共数据,这些数据构成 zk-SNARK 验证器输入的一部分。
执行器的完整描述可以在主状态机的单独文档中找到。
二. STARK 递归组件
一旦主 SM 执行器将事务和相关数据转换为已提交的多项式,STARK 递归组件将作为输入;
- 承诺多项式,
- 常数多项式,
- 脚本,是指令列表,
为了生成 zk-STARK 证明。
为了促进快速 zk-STARK 证明,STARK 递归组件对每个 zk-proof 使用 Fast Reed-Solomon Interactive Oracle Proofs of Proximity (RS-IOPP),也称为 FRI。
该组件被称为 STARK 递归,因为;
(a) 它实际上产生了几个 zk-STARK 证明, (b) 将它们整理成若干 zk-STARK 证明的捆绑包, (c) 并生成每个捆绑包的进一步 zk-STARK 证明, (d) 捆绑包的最终 zk-STARK 证明也经过整理和证明,仅使用一个 zk-STARK 证明。
这样一来,数百个 zk-STARK 证明就可以用一个 zk-STARK 证明来表示和证明。