Jeffrey Hu

Posted on Jun 27, 2022Read on Mirror.xyz

zk 学习笔记

对 zk Talk 第一期《隐私型的扩容解决方案-零知识证明(1)》的一部分记录:

https://twitter.com/i/spaces/1LyxBoakdROKN?s=20

零知识证明和 zkSNARKs

“checking without understanding“。一方(prover)向另一方(verifier)证明一个命题为真,但 verifier 除了知道该命题为真以外并没有增加任何其他的知识。

在区块链领域内的应用:

  • 隐私
  • 扩容

zkSNARKs

Zero-Knowledge Succinct Non-Interactive ARgument of Knowledge

  • 零知识
  • 简洁
  • 非交互式
  • 证明

零知识

“知识”在数学上是有非常良好的定义的。但“零知识”不是“零信息”的,因为要至少传递一些 01 串的信息给对方。零知识本质上在于熵很大,都是很随机的信息,无法从中提取出有用的知识。

简洁

“简洁”的证明尺寸是 sublinear 的。简洁对于验证非常重要,对于区块链尤为重要,因为链上成本和考虑到其他节点容易接收等。

非交互式

  • 交互式证明:
    • 最早是需要反复“问答”来确认证明者拥有某项知识
    • 最早 Goldwasser、Micali、Rackoff 在 1985 年提出“The Knowledge of Complexity of Interactive Proof Systems”
  • 非交互式证明
    • 1987 年,NIZK(非交互式零知识证明),避免反复问答来确认。实现方式包括:
      • 可以引入一个第三方采用“随机预言机”
      • 也可以用 CRS(Common Reference String,公共参考串)
    • CRS 相当于是给完全没有信任基础的双方一点点信任基础(Trusted Setup)

证明

零知识证明里的证明(proof),其实一般多指的是“argument”。因为 argument 和 proof 的区别是

  • proof 没有任何限制条件;而 argument 在多项式时间内可以完成的计算,而且体积比较小
  • 另一个区别是在安全性上
    • 安全性上有两个对抗性的属性:可靠性、零知识
    • argument 倾向于零知识(所以也不用担心未来超级计算机去破解)

zkSNARKs vs SNARKs

也可以单独说 “SNARKs”。zkSNARKs 和 SNARKs 的算法几乎差不多,可能 80% - 90% 都是一样的,只是一些关键步骤可能不一样,两者之间不是竞争关系。主要区别是:

  • zkSNARKs 加上了隐私
  • SNARKs 更多只是关注于压缩,而不关心计算的数据是否是隐私的

一些重要的里程碑

  • 1985 提出交互式零知识证明
  • 85 年 - 92 年
    • 计算理论发展很快,很多重要理论都是在这个阶段,例如 argument 等。因为零知识证明其实和计算复杂度理论的关系比密码学的关系更大
    • 这段时间也提出了非交互式零知识证明(NIZK)
    • 最早的 SNARK 的定义也在 92 年提出
  • 92 年 - 02 年
    • 基于 CRS 的非交互式零知识证明:多方共同约定一串数,给完全没有信任的基础一点点信任基础。其他的的实现方式还包括 Random Oracle、PCP 等
    • Schnorr 协议,很多零知识证明最早的起点
    • Cramer 和 Damgard(CD98)引入算术电路,用算术电路做零知识证明。即把常见的运算转换为零知识证明,之后就可以和写程序绑定在一起
  • 02 年 - 10 年
    • 02、03 年左右, Dan Boneh 提出基于椭圆曲线的双线性配对(ECC pairing)椭圆曲线上和乘法相关的一些构造
    • Groth10,可以用 很短的 proof size 来构造零知识证明(之前要一个证明要大概几个G)
  • 10 年之后
    • GGPR13,论证了很多零知识证明可用,并且提供了一个 libsnark 的库(两年前直接业界基本都会用的一个库;现在不太维护,业界主要都切换为 rust)
    • ZCash 第一个区块链领域内的零知识应用,基于2014 的论文和 libsnark,2015年就实现上线
    • 接下来,零知识证明社区和区块链世界开始结合,一直延续到2017-2018年
    • 从2018年到现在,很多算法开始合流

当前常见算法

当前主要的两类算法:

  • PLONK
  • zkSTARK

其他还包括 Marlin(Aleo)等,但和 Plonk 区别不是太大

Halo

Halo 比较受关注,不需要 trusted setup。Halo 主要基于5个前置的工作:

  • 和 bulletproof 关系很大
  • 一种递归分摊的工作,解决递归零知识证明的工作
  • 多项式承诺(KZG 10),零知识证明的操作抽象成同一个接口,有非常简洁的接口
  • STARK,StarkWare 的创始人最早对虚拟机做零知识证明的(可以看作是非常早期的 zkEVM),两个曲线可以互相嵌入
  • Plonk,Aztec 团队发明的

zkSTARK

Scalable Transparent。其中 S 不是简洁,因为一开始做不到,因此更多宣传其 Trusted Setup 的特点。

但 STARKs 其实也需要一个 uniformly-random string。

对 STARK 其实也没有像 SNARK 的学术定义,一般指的是 StarkWare 研发的算法。

Proof 最早可能比较大,但经过了多轮的迭代,目前也可以做到简洁。

Trusted Setup

以往学术界不太重视(不认为是一个大问题),但随着业界实用需求增长,也在被研究。Trusted Setup 目前不是大问题,因为:

  • Setup Ceremony 参与范围广,例如任何人都可以在 github 上提交,而且是永续的方式来提交。只要一个人感觉目前的随机数不安全,都可以再不断提交
  • 不过 trusted setup 的 proof size 会更小
  • 也可以把生成的过程用 MPC 的方式来解决