1. ZK 协处理器的含义与应用

图片来源:Kernel Ventures
ZK 协处理器的核心是把链上计算挪到链下,用 ZK 证明链下计算过程的可靠性,使得智能合约能够轻松处理大量的计算,同时让合约能核实计算的可靠性。这和 zkRollup 的思路是类似的,但 Rollup 是链协议层利用链下计算资源,而 ZK 协处理器是 dApp 利用链下资源。
这里用 RISC Zero 来解释一种 ZK 协处理器实现方式,但 ZK 协处理器有很多种实现方式,后文会继续介绍。RISC Zero 开发了 Bonsai ZK 协处理器架构,其中的核心是 RISC Zero 的 zkVM, 开发者可以在 zkVM 上为「某段 Rust 代码被正确执行」这件事生成 zkp。有了 zkVM 后,实现 ZK 协处理器的具体流程为:
- 开发者向 Bonsai 的中继合约发起请求,即在 zkVM 中跑开发者要求的程序
- 中继合约把请求发给链下请求池
- Bonsai 在链下 zkVM 中执行请求,进行链下的大规模运算,然后为其生成一个凭证(receipt)。
- 这些证明,也叫做「收据」,由 Bonsai 通过中继合约发布回链上。

图片来源:RISC Zero
在 Bonsai 中证明的程序被称作 Guest Program ,凭证(receipt)用来证明 guest program 被正确执行。凭证包括一个 journal 和一个印章(seal)。具体而言,Journal 承载了 zkVM 应用的公共输出,而印章用于证明凭证的有效性,即证明 guest program 被正确执行 ,印章本身也是一个由证明者生成的 zkSTARK。验证凭证可以保证 journal 是用了正确的电路等构建所得 。
Bonsai 为开发者简化了从 Rust 代码到 zkVM 字节码的编译、程序上传、在 VM 中的执行和证明反馈等流程,让开发者能够更聚焦于程序的逻辑设计。而且不仅是部分的合约逻辑,而且整个合约逻辑都可以放到链下跑。RISC Zero 还使用了 continuations,它把一个大的 proof 生成拆分成很多份,然后每份单独进行证明。这样既可以为大型程序生成证明,也不会占用太多内存。除了 RISC Zero, 还有 IronMill , =nil; Foundation 和 Marlin 几个项目也提供了类似的通用解决方案。
2. ZK 协处理器在 DeFi 上的应用
2.1 AMM - Bonsai 为协处理器
zkUniswap 就是一种利用了链下计算资源的 AMM,它的核心是把 swap 的部分计算放在链下,而且它使用了 Bonsai。用户在链上发起一个 swap 请求。Bonsai 的中继合约获得请求,发起链下计算,Bonsai 完成计算后向 EVM 中的 callback 函数返回计算结果和 proof。如果 proof 被验证为成功,swap 就会被执行。
但 swap 不是一次完成的,请求和执行过程分别在不同的 transactions 中,这带来了一定风险,即在提交请求后和 swap 完成前,池子的状态可能发生变化。因为验证是基于提交请求时池子的状态。如果一个请求还在等待时,池子状态变了,那么验证就会失效。
为了解决这个问题,开发者设计了一个池子锁。当用户发起请求时,除了结算 swap 以外的所有操作都被锁了起来,直到链下成功触发链上 swap 或者 swap 超时了(会预设这个时间)。有时间限制的话,即使中继或 zkp 出问题,池子也不会被一直锁着。而具体的时间限制可能是几分钟。
zkUniswap 对 MEV 有个特殊的设计,即开发者希望让协议捕获 MEV 价值。理论上 zkAMMs 同样有 MEV,因为第一个提交易的人就能上锁,所以大家还是会争 gas, builders 同样可以为请求交易排序。但 zkUniswap 会把 MEV 收益自己吃掉,用到的方法是可变利率渐变式荷兰拍卖(VRGDA)。
zkUniswap 把 lock 拿出来自己降价拍卖,如果 lock 很快卖掉,那协议就知道目前需求量大,然后自动升价,如果售出 lock 的速度变慢,协议就会降低价格。这会成为新的收入来源。相当于,协议提供了一个新东西决定交易顺序,而竞争价格的钱直接通过新东西给到项目方,这个很有想象力。
2.2 AMM - zkOracle 为协处理器
除了用 zkVM,还有人提出用 zkOracle 来实现对链下计算资源的利用, 而 zkOracle 是兼顾输入和输出的预言机。一般预言机有两种,一种是输入预言机,一种是输出预言机,输入预言机是把链下数据整理(计算)后放到链上,输出预言机是把链上数据整理(计算)后提供给链下。I/O(输入兼输出)预言机(zkOracle ),是先做输出,再做输入,让链上能利用链下计算资源。
zkOracle 一方面使用链上数据作为数据源,另一方面用 ZK 保证预言机节点的计算没有作假,可以实现协处理器的功能。因此,可以把 AMM 的核心计算放在 zkOracle 中,实现传统 AMM 功能的同时,还可以用 zkOracle 实现更复杂更消耗计算资源的操作。

图片来源:github fewwwww/zkAMM
2.3 借贷利率计算、保证金计算等其他应用
抛开实现方式,有了 ZK 协处理器后可以实现很多功能。比如,借贷协议可以不再预设参数,而是根据实时的借贷情况调整利率。比如在借钱需求旺盛时提高利率吸引供给,然后在需求降低时降低利率。这要求借贷协议能实时获得链上数据,同时进行大量的计算,得出合适的参数,这就需要链下计算了(除非链上成本极低)。
计算保证金余额、未实现的盈亏、清算金额等的复杂运算也可以将其转移到协处理器来执行。用协处理器的优势在于它让这些应用更透明、更可验证,保证金引擎的逻辑不再是一个秘密的黑盒子。虽然计算是在链下完成的,但用户可以完全信任其执行的正确性。此外,这种做法也适用于期权的计算。