简介

零知识简洁的非交互式知识论证(Zero-Knowledge Succinct Non-Interactive Arguments of Knowledge,zk-SNARK)真的是一种非常精妙的方法,它可以在不揭示任何信息的前提下证明某个论断为真。但首要问题是,它为什么有用?

其实零知识证明在无数的应用中都具备优势,包括:

1)证明关于隐私数据的声明:

  • 一个人 A 的银行账户金额多于 X
  • 去年,一家银行未与实体 Y 进行交易
  • 在不暴露全部 DNA 数据的前提下匹配 DNA
  • 一个人的信用评分高于 Z

2)匿名认证:

  • 在不揭露身份的情况下(比如登录密码),证明请求者 R 有权访问网站的受限区域
  • 证明一个人来自一组被允许的国家 / 地区列表中的某个国家 / 地区,但不暴露具体是哪个
  • 证明一个人持有地铁月票,而不透露卡号

3)匿名支付:

  • 付款完全脱离任何一种身份 [Ben+14]
  • 纳税而不透露收入

4)外包计算

  • 将昂贵的计算外包,并在不重新执行的情况下验证结果是否正确;它开辟了一种零信任计算的类别
  • 改进区块链模型,从所有节点做同样的计算,到只需一方计算,然后其他节点进行验证

和「零知识证明」这个伟大的名词一样,其背后的方法可以说是数学和密码学的奇迹。自 1985 年零知识证明这个概念在《交互式证明系统的知识复杂性》[GMR85] 一文中被引入以来,至今已经进入到第四个十年的研究。还有随后出现的非交互式零知识证明 [BFM88],在区块链环境中尤其重要。

在任意的零知识证明(Zero-knowledge Proof)系统中,都有一个证明者(Prover)在不泄漏任何额外信息的前提下要让验证者(Verifier)确信某些陈述(Statement)是正确的。例如验证者仅能知道证明者的银行账户金额超过 X(也就是不披露实际金额)。协议应当满足下面三个性质:

  • 完整性——只要陈述是正确的,证明者就可以让验证者确信
  • 可靠性——如果陈述是错误的,那么作弊的证明者就没有办法让验证者相信
  • 零知识——协议的交互仅仅揭露陈述是否正确而不泄漏任何其他的信息

zk-SNARK 这个术语本身是在 [Bit+11] 中引入的,它在 [Gro10] 的基础上,又遵循了匹诺曹协议(Pinocchio Protocol)[Gen+12; Par+13] 使其能够适用于通用的计算。