Updates

Perfect Zero-Knowledge PCPs for #P

这周有一些关于计算复杂性理论的讨论出来, Kurt Pan 也写了一个关于PSPACE的随笔。而这篇文章讨论了一个针对 #P 族编程语言的 ZK PCP 构造的问题。如果对PCP陌生的同学,可以看看链接2的文章, 交互式证明系统(IP)的零知识性质可以细分为完美零知识PZK, 统计零知识SZK, 计算零知识CZK。历史上的一些重要理论结果都与此相关,比如:CZK = IP = PSPACE,PZK-MIP = MIP = NEXP, MIP*=RE,PCP定理等。一个ZK-PCP就是一个具有零知识性的PCP。类似的,一个PCP证明系统也可以细分成PZK,SZK,CZK(注意目前认为ZK-IPs和ZK-PCP无直接关系)。即使现在也有不错的相关理论结果出现,比如SZK-PCP[poly, poly] = NEXP,但对于PZK-PCP类的结构依然不甚清晰,是否有BPP之外的语言存在PZK-PCP构造依然是开放问题。

这篇论文是来自资深理论密码学家/计算复杂性理论家Tom Gur和Nicholas Spooner的一篇重要工作:为任意#P语言构建出了PZK-PCP,从而得到了首个BPP外语言的PZK-PCP构造,且同时对任意多项式时间恶意验证者实现了非自适应性和(完美)零知识。

论文基于 ZK sumcheck IOP 来实现:为了验证在上的(对于算术电路F),证明者发送一个随机的 mask ,使得;验证者选择一个随机数;然后他们对 进行。交互过程在这里很重要, 如果我们试图通过让证明者为多个不同的发送证明来消除交互,那么零知识性将会丧失(因为sumcheck是线性的)。而论文利用了求和检查声明的置换不变性来打破这种线性关系。

Towards Verifiable FHE in Practice

Zama团队关于可验证FHE最新的一篇工作。FHE虽然可以对密文空间数据进行任意计算,但如果不能对该计算生成计算完整性证明,则无法在恶意敌手存在的环境下(比如云计算)得到真正的落地应用。在这项工作中,Zama团队使用plonky2设计了一个证明bootstrapping操作(FHE中最重要的操作)的算术电路,从而首次在实践中对FHE使用 SNARK 进行了计算完整性验证。在 AWS C6i.metal 实例上证明该电路,生成时间大约20分钟, 证明大小约为 200 kB,验证时间不到 10 毫秒。该结果表明该技术路线可行,但依然是一个很慢的结果,未来改进空间依然巨大。

BitVM ZK Verifier

BitVM 最近开源了他们的 ZK Verifier,以比特币上证明任何事情为目标,其主要流程如下:

  1. 用 RISC0 客户端程序创建STARK证明
  2. 将STARK证明包装成Groth16证明,并在在C语言中编写其对应的Groth16验证器
  3. 将验证器编译为rv32i指令集,从而转化为BitVM指令集

就第二部来看, 似乎如果有更多的工具可以减少开发 verifer的工作会更靠。

Client-side proof generation

这篇文章探讨了用于证明私有函数正确执行的客户端(资源受限)证明生成,并解释了它与通用rollup的证明生成的区别。隐私保护的zk-rollup的证明生成与通用zk-rollup有很大的区别。

这篇文章比较简单易懂,对于zk入门学习者可以参考文中的例子增加对 zk 的理解。笔者感兴趣的地方在于 Goblin Plonk(可能笔者之前没有了解过),他允许允许资源受限的证明者构建具有多层递归的zk-snark,其核心逻辑是将每个递归层的昂贵操作(如椭圆曲线操作)被推迟到最后一步,而不是在每个层次上执行。链接2是对Goblin Plonk的进一步参考资料。

Universal Proof Aggregation protocol

NEBRA 发布了Universal Proof Aggregation protocol (通用证明聚合协议),使用零知识证明本身来扩展零知识证明验证。其核心思想是使用高效的递归SNARK(IVC/PCD)来获得近乎无限量的递归。这意味着可以在链外递归地证明多个零知识证明,并在链上仅验证单个聚合证明。

一些学习资料

Getting Started with RISC Zero

STARK MATH