对于一个合格的生产算法,我们需要关注两个点:1. 算法解决了什么问题,算法逻辑的正确性。2. 算法性能临界点是否符合预期。目前,在 zkp 领域,虽然统一公认的 protocol 还没有出现,但是在隐私计算、Rollup等诸多方面已经产生的实际应用;于此同时,zkp 算法的性能问题也暴漏出来,本文就 zkp 算法的主要逻辑、性能瓶颈从protocol与计算两个方面介绍可能的发展方向。
通常一个零知识证明算法包含3个关键元素:
比如 zk-SNARKs 广泛流传的 Groth16 算法使用了 KCA 来验证多项式,如果把多项式验证部分改为 Kate,则它演化成了 PlonK 算法,Marlin(ALEO使用),同属 zk-SNARKs,但是将 CMS 生成转化为了 SMS,不必每次改动算法就重新做 trusted setup。如果使用 FRI 做多项式验证,那么这个证明转化为了一个 zk-STARKs 算法,STARKs 场景下不需要做 trusted setup。他们所对应的安全性等级与 proof 大小如下图所示:
目前时间点上,zkp 领域算法繁多、且复杂,仍然有很多算法虽然有应用在测试,但依然还处于理论验证阶段。具体性能优化更多的可以针对不同项目从工程性上下手。
而到 zkp 算法本身,大多需要 zk 友好的描述方式,比如上面的 Groth16、PlonK、STARKs算法都是 zk 友好的。不同的证明系统,具体的证明生成逻辑可能不一样,但是他们都会强依赖下面两个运算:
在一个同时存在着两种运算的系统中,MSM 大概占了 70% 的时间,剩下的大部分时间在做 FFT。这两种运算都很慢,但是有可能的办法做性能优化:
幸运的是 PipeZK 在解决 MSM、FFT 这两个算法性能问题上是很有希望的,作者使用 Pippenger算法 缓存与跳过重复计算,从而加快运算速度。同时,在PipeZK论文中,描述了一种“unroll” FFT的算法,使得可大幅减少shuffling的数量,由于采用了now-predictable内存访问模式,大幅改进了硬件上的运行速度。
现在 zkp 算法的发展仍属于非常早期的阶段,没有系统的标准化参数,比如 FFT 的width定多少,大数向量元素的位宽等。而且甚至对 zk 系统本身的选型也没有明确的方案,在这种情况下 ASIC 方案周期长,自定义参数少,显然是不划算的。
至于 FPGA 对比 GPU,FPGA 在获取成本和能耗方面有一定优势,但是在开发上 GPU有着比较明显的优势。这两种硬件预计将会在比较长的时间内主导 zkp 领域的计算,当然如果将来 zkp 领域在 L1、L2 只有一个或少量几个方案实现,那么 ASIC 可能会显示出更多优势从而超过 FPGA。