零知识证明入门:发展历程、应用场景与原理解析
零知识证明源于1985年GMR85论文,从交互式发展为非交互式,关键突破包括Pinocchio、Groth16、Bulletproofs和zk-STARKs。应用集中于隐私交易(如Zcash、TornadoCash)和扩容(如zk-rollup)。其核心性质为完整性、可靠性与零知识,zk-SNARK通过算术电路、R1CS及QAP转换实现证明。
一、零知识证明的历史
现代零知识证明体系的起源,可以追溯到1985年Goldwasser、Micali和Rackoff三位学者合作发表的论文(常被称为GMR85)。该论文的核心思想是:在一个需要K轮对话的交互系统中,究竟需要交换多少“知识”,才能证明某个声明的真实性?如果信息交换量能够达到零,便可称为“零知识证明”。在该模型中,证明者被假定拥有无限资源,而验证者资源有限。不过,交互式系统存在一个固有缺陷——其证明并非数学上绝对确定,而是基于概率,尽管出错概率极小(1/2^n)。
因此,交互式系统并不完美,仅具备“近似完备性”。后来出现的非交互式系统(NP)弥补了这一短板,成为零知识证明体系中最理想的基石。
早期的零知识证明系统在效率和可用性方面均不理想,长期停留在理论层面。直到近十年,随着密码学在加密领域成为显学,ZKP才真正走向台前,成为关键技术方向。特别是,构建一个通用、非交互且证明体积小的协议,成为最重要的研究目标之一。
简而言之,零知识证明需要在三个方面进行权衡:证明生成速度、验证速度以及证明大小。理想协议应具备证明快、验证快且证明体积小的特点。
2010年,Groth的论文《Short Pairing-based Non-interactive Zero-Knowledge Arguments》被视为里程碑,为后来ZKP领域最重要的zk-SNARK理论奠定了基础。在应用层面,2015年Zcash使用的零知识证明系统实现了对交易和金额的隐私保护,这是一个决定性突破。此后,zk-SNARK与智能合约结合,应用场景迅速拓展。
在此期间,几项重要的学术成果值得单独提及:
- 2013年,Pinocchio (PGHR13):将证明和验证时间压缩到可实际应用的程度,也是Zcash早期使用的底层协议。
- 2016年,Groth16:精简了证明体积,同时大幅提升验证效率。至今仍是应用最广泛的ZK基础算法。
- 2017年,Bulletproofs (BBBPWM17):提出一种非常短的非交互式零知识证明,最大优势在于无需可信设置。值得关注的是,该论文发表仅6个月后便被Monero采用,堪称从理论到应用最快的落地案例之一。
- 2018年,zk-STARKs (BBHR18):提出同样无需可信设置的zk-STARK算法协议。这也是当前ZK领域另一备受瞩目的方向,重量级项目StarkWare便以此为基础诞生。
当然,后续出现的PLONK、Halo2等也是极其重要的进展,它们从不同层面改进了zk-SNARK方案。
二、零知识证明的应用简述
零知识证明最广泛的两个应用场景是隐私保护和扩容。早期,随着Zcash、Monero等明星项目的推出,隐私交易一度风头正劲。但客观而言,市场对隐私交易的需求并未如预期那样迫切,因此这类项目逐渐进入二三线阵营(并未消失)。反观扩容,随着2020年以太坊2.0(现更名为共识层)正式转向以Rollup为核心的技术路线,ZK再次成为关注焦点。
隐私交易: 这方面的落地方案较多。包括使用SNARK的Zcash和Tornado Cash、使用Bulletproof的Monero,以及Dash。不过Dash严格来说未使用ZKP,而是采用简单粗暴的混币系统,仅能隐藏地址,金额透明,此处不再展开。
Zcash应用zk-SNARKs的流程大致如下:

来源:Demystifying the Role of zk-SNARKs in Zcash
- 系统设置阶段:通过KeyGen函数生成用于加密证明多项式的证明密钥和验证密钥。
- CPA阶段:使用ECIES加密方法生成公钥和私钥。
- 铸币阶段:生成新币的数量、公共地址以及币的承诺。
- 转移阶段:生成zk-SNARK证明,并将证明添加至转账交易账本中。
- 验证阶段:验证者验证铸币和转账的交易量是否匹配。
- 收款阶段:接收方收到币。如需花费这笔钱,则再次调用转移过程,生成新的zk-SNARK证明,重复步骤4至6,完成交易。
Zcash使用零知识证明仍存在局限性。它基于UTXO模型,因此仅“屏蔽”了部分交易信息,并非完全隐匿。加之其基于比特币架构的独立网络,难以与其他应用结合。截至2022年的数据显示,实际使用Shielding(隐私交易)功能的用户不足10%,表明隐私交易在应用层面推广并不成功。
相比之下,Tornado Cash采用单一大型混币池方案,更加通用,且基于以太坊这一经过长期检验的网络。从技术上看,它本质上是使用zk-SNARK的混币池,可信设置基于Groth 16论文。其保证的特性包括:
- 只有存入的币才能被提取。
- 同一币不能被提取两次。
- 证明过程与币的“作废通知”绑定,使用相同证明但不同Nullifier哈希值无法提币。
- 安全性高达126-bit,不会因组合使用而降级。
Vitalik曾指出,与扩容相比,隐私相对更容易实现。如果扩容协议能够顺利运行,隐私问题通常不会成为无法解决的难题。
扩容: ZK对扩容的贡献可在第一层网络上实现(如Mina),也可在第二层网络上实现,即常说的zk-rollup。zk-rollup的思路最早可能源自Vitalik在2018年的一篇帖子,探讨通过大规模交易验证将链上吞吐量提升至每秒500笔。
在zk-rollup生态中,有两个关键角色:Sequencer和Aggregator。Sequencer负责打包交易,而Aggregator则将大量交易合并成一个Rollup区块,并生成一个SNARK证明(或基于其他算法的零知识证明)。该证明会与L1链上之前的状态进行比较,进而更新以太坊的Merkle树,计算出新的状态树。

来源:Polygon
ZK rollup 的优缺点
- 优点:费用低,不像OP那样容易受经济攻击,无需为交易设置延迟等待,能保护隐私,并能快速实现最终确定性。
- 缺点:生成ZK证明需要极大计算量;存在安全问题(SNARK需要可信设置);不抗量子攻击(STARK可以,但SNARK不行);交易顺序可能被篡改。

来源:以太坊research
根据数据可用性和证明方法的不同,StarkWare为L2绘制了一张经典分级图(Volition模式下,数据可用层可在链上和链下自由选择):

来源:Starkware
目前市场上最具竞争力的ZK rollup项目包括:StarkWare的StarkNet、Matter Labs的zkSync、Aztec的Aztec Connect,以及Polygon的Hermez和Miden、Loopring、Scroll等。
各项目的分歧主要集中在SNARK(及其改进版)与STARK的技术路线选择,以及对EVM的支持方式(是兼容还是完全等同)。
- Aztec:开发了通用SNARK协议——Plonk。正在运行的Aztec3可能支持EVM,但隐私优先级高于EVM兼容。
- StarkNet:采用zk-STARK,无需可信设置。但目前不支持EVM,拥有自己的编译器和开发语言。
- zkSync:同样使用Plonk,支持EVM。zkSync 2.0兼容EVM,拥有自己的zkEVM。
- Scroll:一种EVM兼容的ZK rollup,其团队也是以太坊基金会zkEVM项目的重要贡献者。
谈到EVM兼容性,这是一个长期存在的难题。ZK系统与EVM兼容一直令人困扰,项目方通常需要做出取舍。有些项目为了强化ZK能力,选择在自己的系统中构建虚拟机,并配备专门的ZK语言和编译器。但这会显著提高开发者的学习门槛,且因基本不开源,对用户而言如同黑箱。当前行业共识是两条路径:要么与Solidity的操作码完全兼容,要么设计一种新的虚拟机,既对ZK友好,又能兼容Solidity。老实说,业界也未预料到融合速度如此之快。近一两年技术的快速迭代,已将EVM兼容性提升至新高度,开发者甚至能在一定程度上实现无缝迁移(从以太坊主链到ZK rollup)。这无疑是一个振奋人心的进展,也将直接影响ZK开发工具生态和整个行业的竞争格局。这一问题,我们将在后续报告中详细讨论。
三、ZK SNARK 实现的基本原理
回到源头,Goldwasser、Micali和Rackoff为零知识证明定义了三个核心性质:
- 完整性:任何一个拥有合理证据的声明,都能被验证者成功验证。
- 可靠性:任何一个只有不合理证据的声明,都不应被验证者通过。
- 零知识:验证过程不会泄露证据以外的任何信息。
要理解ZKP,从zk-SNARK入手最为合适,因为当前区块链上绝大多数应用都基于SNARK。首先需明确其定义。
zk-SNARK的全称是:zero-knowledge Succinct Non-interactive ARguments of Knowledge。
- Zero Knowledge:证明过程零知识,不暴露多余信息。
- Succinct:验证体积小,简洁。
- Non-interactive:非交互,证明者发送一个证明即可,无需来回对话。
- ARguments:具备“计算可靠性”,即只有有限计算能力的证明者不能伪造证明,但具有无限计算能力的证明者理论上可以。这与“证明”略有区别。
- of Knowledge:证明者不可能在不知道有效信息(即证据Witness,例如哈希函数的输入,或一条能确定Merkle树根节点的路径)的情况下,凭空构造出一组有效的参数和证明。
Groth16这一zk-SNARK方案的证明原理,可用下图概括:

来源:https://learnblockchain.cn/article/3220
其核心步骤包括:
- 将待证明的问题转化为一个算术电路。
- 将该电路“拍平”,转换成R1CS(Rank-1 Constraint System)形式。
- 再将R1CS转换成QAP(Quadratic Arithmetic Programs),即二次算术程序。
- 创建可信设置,生成随机参数,包括证明密钥(PK)和验证密钥(VK)。
- 最后,利用这些参数进行zk-SNARK证明的生成与验证。
