PrivacIN Week3课程回顾 | 韩博士讲授ZK电路开发 & zkEVM设计

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 也是唯一的私密输入变量。

在这里插入图片描述
在这里插入图片描述

  1. 每个约束方程转换或合并为乘法门约束方程(多个加法可以在一个约束方程中),所有乘法门构成 R1CS 约束方程组;(注意:本例 prover 已经知道一个解 x=3,并得出其他 witness 取值,如 y=27, sym_1=9, sym_2=27)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  2. 对 R1CS 约束方程组,使用多项式插值分别求解每个变量的系数多项式,如本范例可以得到 Ai、Bi、Ci(其中 i=0,1,2,3)多项式;(注意:系数多项式求解一般使用随机数作为 x 值,y 值则表示对应的变量在计算这个乘法门中是否起作用了)

  3. 将所有变量的系数多项式向量 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 愿景资助各类学术研究及科研项目。

猜你喜欢

转载自blog.csdn.net/Matrix_element/article/details/127387869