2022年7月23日9:30,隐私学院PrivacyIN首期ZK训练营第三课——《Applied ZK In Practice》准时开课。本期课程由香港科技大学在读博士韩思远讲授,以ZK电路开发和zkEVM设计为主题,围绕零知识证明应用电路设计及zkEVM构建思路展开,帮助学员学懂ZKP电路设计。此次培训延续小班授课,数十名国内外密码学及相关领域的专家学者参加了本次ZK技术培训。
背景知识
基于零知识证明(ZKP)的应用实现,主要是通过将一般的计算问题转化为电路问题,然后构建基于零知识证明系统的电路约束或其他保证计算特性的约束,来实现可验证计算和零知识性。在确定的零知识证明系统(协议)上,ZKP应用的构建核心内容则是业务电路的设计和开发,因此了解应用电路设计思路、保证安全性和高效性都是非常重要的议题。
课程主要内容
简单介绍了基于零知识证明的应用系统设计所涉及的背景知识后,韩思远老师以开发者的视角,为大家介绍了ZKP应用涉及的难题。
他表示:完整理解零知识证明(ZKP)应用开发是非常复杂的,需要理解多种经典ZKP协议设计原理、深度的密码学和数学知识、难以选择的ZKP框架、晦涩难懂的术语和概念等,ZKP应用系统设计知识曲线较高,初学者是很难入门的。
ZKP系统
从程序设计视角,ZKP系统一般可以划分为前端frontend和后端backend两个部分。
ZKP系统的Frontend部分的主要使用低级别语言来表示高级别语言,例如可以将一个一般地计算问题使用较低级别的电路语言表示,如R1CS电路约束构建计算等(比如circom使用R1CS描述其前端电路)。
ZKP系统的Backend部分即密码学证明系统,主要将frontend构建低级别的语言描述的电路,转换为生成证明和验证正确性等,比如常用的backend系统协议有Groth16和Plonk等。
韩思远博士表示,基于frontend和backend开发分离的思路,开发一个基于ZKP的应用系统,在密码学专家选定合适ZKP证明系统作为backend后,开发人员的工作主要考虑的是如何使用frontend提供的低级语言来描述和实现应用业务逻辑,而无需关注ZKP证明系统后端。
R1CS的创建
zkSNARKs系统比较常用的是R1CS(rank1-constraint-system),R1CS定义结构形如:
Ai、Bi、Ci分别为乘法电路门的左操作符(线)的系数向量、右操作符(线)的系数向量、输出系数向量,S为输入变量或witness,R1CS主要关注乘法门。(注意:系数向量的元素表示对应的变量(或线)是否参与该电路门计算)
在进行实现某个计算业务时候,构建R1CS形式约束电路方程组和QAP非常重要,课堂中以Vitalik的提供的范例,即有函数f(x)=x^3 + x + 5,如何表示为可以用来构建该函数证明proof的R1CS电路约束。
创建R1CS和QAP(Quadratic Arithmetic Programs)的主要步骤:
1.计算业务使用统一的计算表达式表示,并表示为电路,其中如if,switch,循环等语句需要转换;(本例无需转换)
2.计算表达式拍平(flatten),将计算表达式使用算数电路门表示成电路circuit,并按照电路门展开、每个电路门一行,电路门的输出都定义新的变量(中间变量)。例如z=x+y可以使用一个加法门表示,z=x+5y可以使用一个加法门和一个乘法门表示;本例中f(x)拍平后的变量:one,~out(为35), x, y, sym_1, sym_2为,其中one为常量,~out为输出,x, y, sym_1, sym_2构成witness,x也是唯一的私密输入变量。
3.每个约束方程转换或合并为乘法门约束方程(多个加法可以在一个约束方程中),所有乘法门构成R1CS约束方程组;(注意:本例prover已经知道一个解x=3,并得出其他witness取值,如y=27, sym_1=9, sym_2=27)
4.对R1CS约束方程组,使用多项式插值分别求解每个变量的系数多项式,如本范例可以得到Ai、Bi、Ci(其中i=0,1,2,3)多项式;(注意:系数多项式求解一般使用随机数作为x值,y值则表示对应的变量在计算这个乘法门中是否起作用了)
5.将所有变量的系数多项式向量Ai、Bi、Ci(其中i=0,1,2,3)构成的矩阵多项式与变量向量相乘,再向量点积,就可以表示为统一的多项式,且该多项式可被“多项式插值“作为根的可擦除多项式Z(x)整除,其与Z(x)构成QAP;
课堂中,韩博士使用Vitalik提供的范例进行重点讲解,即给定一个多项式f(x),如何编写电路约束和构建QAP,而一般的zkSNARK大多使用Bilinear-Pairing对QAP进行检验来实现ZKP计算。
R1CS的异或运算
R1CS适用于算数门电路,其主要使用+、-、*表示电路运算,其不直接支持布尔电路的异或运算。实现ZKP的多比特位的异或运算需要转换为算术电路来实现,并添加合适的约束来实现。比如一个8bits的异或运算:A XOR B = C,其中A=11000000,B=1011111, C=01111111。实现的思路是将多个bit位转化为算术电路元素数组,证明这些bit的关系满足A XOR B = C, 于是转化为证明如下约束条件:
1.这些数组中的元素为0或1,即a(a-1)=0,a可取值0或1;
2.这些数组中的元素表示的是构成A、B、C的比特位,即元素按照低位到高位累加;
3.A XOR B=C,对每个bit位异或运算,比特的异或运算:a xor b = a+b-2ab
Plonk电路约束
Plonk协议使用区别于传统R1CS的电路约束形式,其使用一个统一的电路表达式:
,表示算术门和输入门。
Plonk中将约束主要分为门约束(运算和输入)、线约束(复制约束),然后分别对这两类约束构建零知识证明和验证。
Plonk电路编写跟R1CS不同,它引入线约束后,电路表示不是R1CS离散形式的,电路线之间通过线约束关联起来。
ZKP业务开发者关注点
具体的ZKP业务开发中,开发者在选定零知识证明系统后,针对R1CS或Plonkish风格的电路进行设计和实现,一般需要关注的是:
1.如何将业务问题转换为计算问题,再转化为电路问题,然后得到R1CS或Plonkish风格的电路约束;
2.输入和中间变量对于多项式是很重要的,这将用于后端的证明。
zkEVM的实现
zkVM是一般意义上的能够执行ZK程序代码(低级或高级语言编写)并创建可验证证明的虚拟机,而zkEVM是一种特殊的EVM,其以ZK方式执行智能合约,能够生成智能合约或其指令执行的可验证证明。
zkEVM目前是非常火热的项目,目前比较主流的方案有STARKWARE,zkSync,polygen-Hermez,Scroll等,一般按照对EVM的兼容级别可以划分为:
1.EVM-EVM-compatibility智能合约功能级别兼容,如STARKWARE, zkSync
2.EVM-equivalence,EVM指令级别兼容(等同),如polygen-Hrmez,scroll
以太坊是通过交易执行驱动世界状态变化,这些交易包括转账交易和合约调用交易,最终都会转换成指令在EVM中执行,EVM执行涉及状态机state machine、stack和memory等。EVM执行的时候从状态机state-machine获取执行指令,借助stack和memory依次执行指令,并对storage进行更新。
一个指令兼容的zkEVM,EVM指令都是需要转换到ZK系统中执行中,同样每一条对应的指令都需要提供证明,主要包括State状态证明和EVM执行正确性证明。
zkEVM一般是按照以太坊L1合约和L2(线下)结合的方式来实现的,L2层有一个类以太坊的节点程序,它从以太坊区块链系统获取数据,并具备以太坊节点的其他处理能力(如何交易、区块头、合约等校验), 其工作大致如下(不同的方案可能有差异):
1.节点程序处理和验证执行日志、区块头、交易、合约字节码、默克尔证明等,并把这些发送给zkEVM处理;
2.zkEVM使用电路,将执行、区块头、交易、合约字节码、默克尔证明这些变化的结果生成ZK证明proofs(非常大的证明),这里zkEVM电路功能主要使用table和特制circuit来实现的,zkEVM的所有计算指令和状态更新都需要依赖电路和table构建的证明来实现。zkEVM的电路和table如下如下图:
3.使用聚合电路将大的证明生成更小的证明,也即生成聚合证明,比如使用递归证明来生成;
4.聚合证明则以交易的形式发送给L1合约执行。
zkEVM作为通用的以太坊解决方案,同样可以提供ZK-Rollup的能力,因为L1上的交易能够放到L2上的zkEVM上执行,然后构建简洁的递归证明配合L1合约实现交易聚合,并因此提升交易处理能力。
另外课堂上,韩老师针对zkEMV实现,对不同背景技术人员提出相关实践建议,比如密码学专家可以更多关注减少证明大小和证明时间的密码学方案;比如程序开发人员如何使用优化电路门实现计算业务等,这些实践性建议的目标是则是一致的:提升效率和降低gas费用。
课程结束之际,韩老师也提出了一些开放性的问题,希望引发关于ZK的安全性思考。比如ZK技术的使用并不能保证安全性,不同的电路实现和对应生成的多项式都有很多差异,甚至电路的实现也可能隐藏着安全问题,安全性的保证更难,需要更多验证和技术审计等;另外保证电路实现和原始计算一致,而没有进行不等价的修改也是非常重要安全问题,比如ZK电路的不等价替换,ZK的延展性攻击问题等。
关于PrivacyIN
PrivacyIN 隐私学院 (Privacy Institution) 由LatticeX基金会发起,致力于建设开放的密码和隐私技术布道和研究社区。联合全球顶尖的学者、隐私技术开发者推动ZK(零知识证明)、MPC(安全多方计算)、FHE(全同态密码)的创新和落地。
关于LatticeX基金会
LatticeX基金会(LatticeX Foundation)是一家全球范围的开源技术社区,以通过构建复杂计算归还用户数据主权,保护数据隐私,实现数据价值交换为愿景,构建一个完全去中心化的计算互操作网络,在保护数据主权和隐私的前提下促进数据使用权的交易,并为实现LatticeX愿景资助各类学术研究及科研项目。