关于区块链:PrivacIN-Week4课程回顾-ZK应用实践

3次阅读

共计 5863 个字符,预计需要花费 15 分钟才能阅读完成。

7 月 23 日,隐衷学院【PrivacyIN】第一期 ZK 训练营第四课——《ZK Hands-on》如期开讲。本期课堂由资深隐衷开发工程师 Kelvin Wong 讲授,次要介绍 Circom 电路开发和 ZK 利用实际。

背景

随着零常识证实(ZKP)技术实践和工程利用的提高,ZK-Dapp 曾经成为区块链技术的利用热点,但 ZKP 技术的过高的技术门槛,使得设计和开发一个基于区块链零碎的残缺 ZK-Dapp 仍然有较高的难度。因而 PrivacyIN 特地开设实际课程,从实践到实际,帮忙开发者疾速进入 ZK 利用开发。

次要课程内容

本期课堂 Kelvin Wong 次要围绕 Circom 电路设计和零常识证实利用开发进行开展。

ZK 利用介绍

Kelvin 老师首先介绍了以后 ZK 利用倒退详情,率领学员理解以后支流的 ZK 利用和倒退方向,将 ZK 利用次要分为:L2 ZK-Rollup 利用、ZK-VM & ZK-EVM、ZK 区块链零碎、风行的 ZK 开发框架及编译器、其余热门电路及利用等,并进行分类的介绍和特点剖析。

ZK-Rollup 次要应用 zkSNARKs 技术将批量交易线下聚合,再将聚合交易及证实记录到智能合约,借助 zkSANRKs 其简洁、可验证、零知识性的特点,十分优雅地解决了以太坊等交易解决效率低和手续费低廉的问题。目前 ZK-Rollup 涌现了十分多热点利用,包含升高转账手续费的 STARKNET、zkSync、LOOPRING 等,利用类 ZigZog、Curve、zkNFT 等。

ZK-VM 是基于 ZKP 来保障程序执行状态转换的安全性和可验证性的可信通用虚拟机,个别 ZK-VM 都提供相似电路描述语言来实现计算利用。

EVM 是运行在以太坊上,用来执行智能合约的虚构机器,EVM 是基于栈架构的,次要组件包含:Stack、Memory、PC、Storage 等,EVM 应用 Gas 进行指令计价和束缚执行。

ZK-EVM 是以 ZKP 形式执行智能合约或 EVM 指令的虚拟机,个别能够依照兼容性分为合约兼容 ZK-EVM、EVM 指令级别 ZK-EVM、EVM 标准规范级别 ZK-EVM。ZK-EVM 赋予了 EVM 执行正确性证实和可验证的特点,次要是用来构建兼容以太坊智能合约的 ZK-Rollup 计划或区块链零碎。

基于 ZK 的区块链零碎,最驰名的是 ZCash,它是第一个基于 zkSNARK 技术构建的提供匿名交易的电子货币实现。随着 ZK 实践和技术的倒退,越来越多区块链零碎基于 ZK 技术进行构建,以提供更好的匿名性和安全性。比方 monero 门罗币也将应用 ZK 技术构建,其将应用 BulletProof 协定来实现匿名交易;Mina 应用递归零常识证实技术来构建简洁和轻量的区块链零碎;Filecoin 借助递归零常识证实技术来实现数据存储证实;Aleo 则基于 ZK 构建通用、私密、高效公链零碎。

在开放性区块链世界,ZK 公链和利用的倒退离不开开源社区,开源社区为 ZK 技术的倒退提供了松软的根底,以 Arkworks、Matters Labs、Polygon 等为代表社区或公司提供丰盛的密码学开发根底库、ZK 协定实现、编译器等。比拟风行有开发库有:libnark、ZK-Garage/plonk、snarkjs、halo2 等;经典的编译器及开发库套件,包含:Circom+Snarkjs、Aleo、ZoKrates、Cairo 等。

以电路利用开发的视角来看,有很多热门的利用方向,包含:ZK-ML 机器学习、ZK-DID、ZK-NFT、ZK-DAO 外包计算等。依照电路用处分类,能够分为:通用性电路库(Circomlib)、专用性电路库(Semphore 成员关系证实)、zkEVM-Circuits(EVM 构建根底电路)等。

ZK 利用开发工作流

一个残缺的 ZK 利用开发是一个残缺的软件工程用例构建,本次课堂不依照残缺的软件工程工作流来展现利用开发过程,而是将电路逻辑来示意业务逻辑,围绕构建电路电路实现可验证计算的能力。zkSNARKs 协定因为其简洁、非交互、高效性的特点,ZK 支流利用基本上都应用 zkSNARKs 构建,课堂中将次要介绍基于 zkSNARKs(次要为 Plonk、Groth16 协定)的利用开发。

zkSNARs 利用开发的次要步骤,次要包含:

1. 电路构建 & 编译

次要将计算业务应用电路语言形容,而后编译器翻译为 R1CS 或 Plonkish 等格调束缚

2.Setup

公共参数、电路参数生成,包含创立 prover/verifier 各自的 keys

3. 创立证实 proof

证实者(prover)应用本人公有输出 witness 和 Setup 失去 keys,构建对于电路的证实。

4. 验证电路 proof

验证者(verifier)应用 prover 生成的 proof,验证“prover 应用 witness 作为输出并正确执行了电路”。

目前比拟风行的集成开发套件有 Aleo、ZoKrates、Circom+Snarkjs 等,基本上采取相似的工作流程,本次课堂则选取“Circom & Snarkjs”进行具体的电路利用开发介绍。

Circom & Snarkjs 工作流程

Circom & Snarkjs 次要的长处在于有比拟丰盛的电路开发模板库,Snarkjs 性能十分弱小,反对 Web 和验证合约生成,对支流协定 Groth16 和 Plonk 反对比拟齐备。

Circom & Snarkjs 的工作流程如下:

1. 算数电路设计(Circom 语言)

将计算业务转化为对立的算术表达式,而后将算术表达式用 Circom 语言形容实现。

2. 编译电路

将 Circom 语言示意的电路翻译成低级别的 R1CS 模式电路(能够生产 wasm 以及调试信息),其实用 circom 编译器。

参考命令:circom circuit.circom –r1cs –wasm –sym

3.Snarkjs 生成 witness 文件

参考命令:snarkjs calculatewitness –wasm circuit.wasm –input input.json –witness witness.json

4. 可信设置 & 证实生成

可信设置应用 MPC 接力典礼生成,包含:universal-trusted-setup 和电路相干的 trusted-setup。

universal-trusted-setup 次要为生成通用参数,实用于所有电路,次要命令参考:snarkjs powersoftau new/contribute(典礼参数初始化 / 接力)

电路相干的 trusted-setup,生成实用于指定电路的 ZKP 计算参数, 次要命令参考

snarkjs groth16/plonk setup(创立 proving key 和 verification key)

snarkjs zkey powersoftau new/contribute(指定电路参数初始化 / 生成接力)

证实(proof)生成基于可信设置生成的通用参数、指定电路参数以及 witness,生成指定电路的计算的证实 proof,其次要命令参考:snarkjs plonk/groth16 prove

5. 验证证实 & 验证智能合约生成

应用电路和 witness 生成的 proof 能够用来进行正确性验证(validate),也能够生成实用于以太坊的验证智能合约(generate verifier)。

参考命令:snarkjs validate/generateverifier(验证 / 生成验证合约)

Circom 电路设计

Circom 是一个示意 R1CS 电路束缚的 DSL 语言,同时也是一个针对该语言的编译器,它是一个强类型检测和动态剖析语言,目前次要反对算术电路。Circom 通过定义显式电路束缚实现电路逻辑,用户设计电路则相似于编写电路信号(线)的赋值和定义束缚,而后 Circom 编译器将这些编写的电路翻译成 R1CS 束缚(也包含 WASM、C++ 等相干语言),提供给 snarkjs 应用,并借助 snarkjs 实现残缺的 ZKP 计算流程。

Circom 的语法比较简单,次要为反对无限域(finite-field)的电路运算,提供了 template(有点相似 C ++)来定义子电路模块 component,提供了 function 用来定义非电路函数代码块等。

一个残缺的 Circom 电路包含:预编译指令、电路模板实现、main 定义,如下定义了一个简略的乘法电路(注:参考官网文档):

预编译,次要指定编译器兼容版本;电路模板实现,次要实现电路逻辑,包含定义输入输出信号(signal),两头信号,构建束缚等;main 定义,定义入口 main 组件,其应用电路模板构建的实例。

Circom 示意的算术电路定义包含:公有输出、共有输出、共有输入、电路门和线束缚,这些元素工作在无限域 Fp 上,通过构建 R1CS 的格局的束缚实现电路。

Circom 的 Signal

signal 相似电路的 wire(或变量),次要分为 input(输出)signal、output(输入)signal、默认 signal(两头变量),这些 signal 工作在无限域 Fp 上 (mod p)。

signal 默认为 private,能够在 main{} 中设置 input signal 为 public,output signal 总是为 public,不能设置为 private,默认定义的 signal 为 private。

Circom 的表达式

Circom 反对常量表达式(只有常量操作或赋值)、线性表达式(只有常量和信号的乘法和加法)、二元表达式,其中常量表达式、线性表达式是二元表达式的非凡模式。二元表达式模式相似于”AB-C”其中 A、B、C 为线性表达式,比方非法的二元表达式:2x + 3y + 2) (x+y) + 6*x + y – 2。

Circom 的 Template

Template 用来创立通用电路的模板,其余电路 Template 或 main 能够通过创立模板实例来应用电路,提供相似模块化的能力,即一个大电路能够由很多个小的电路实例集成构建失去。目前 Circom 社区提供了很多优质的电路模板,比方 circomlib、Semphore 等,能够基于这些电路模板构建简单的电路。

Circom 的 Constraint

Circom 应用 constraint 定义 R1CS 电路束缚,constraint 操作符个别配合二元表达式应用,次要的 constraint 操作符有:等于束缚 (===),赋值等于(==> 或 <==),signal 赋值(–> 或 <–)。Cricom 个别举荐应用赋值等于(==> 或 <==)进行赋值和束缚同时定义,灵便的场景下则将两者离开,比方:除法操作转化为赋值和乘法束缚,A/B= C 则应用“C<– A/B; C*B===A”示意。

Circom 范例学习

课程中以实现简略多项式零常识证实为例,给定一个单变量多项式 poly3(x)=1 + 2x + 3x^2 + 4x^3,演示如何进行设计 Circom 电路实现 poly3 多项式。

poly3 多项式不是二元表达式(最高次数为 3),将问题进行拆解,定义平方 x^2 电路模板、x^3 电路模板剖析多项式,而后进行线性组合即实现了 poly3 多项式。

实现步骤:

1. 创立电路文件,增加预处理定义,指定编译器版本;

2. 定义平方电路、立方电路模板;平方电路实现,其为一个乘法电路,输出信号相乘,只需增加复制等于束缚。

立方电路实现,应用平方电路实例,再乘以输出信号即可,即 x^3=x*(x^2)。

3. 定义 poly3 电路实现模板,其通过创立平方电路和立方电路实例,线性组合实现;

4. 定义 main,即创立 poly3 电路实例。

将 poly3 多项式实现的电路保留为 polynominal.circom 文件,执行编译命令:circom polynominal.circom –inspect –wasm –c,将输入变量和束缚信息;应用 snarkjs 命令行工具也可能查看编译输入的 R1CS 信息,如执行命令:snarkjs r1cs info polynominal.r1cs,将能够查看电路线数目、束缚个数、公有输出变量、公共输出变量、公共输入变量等信息。

残缺 ZK- Dapp 范例流程演示

给定一个多变量函数,蕴含 3 个变量 x、y、z,其中 x 为 0 或 1,定义如下:

如何实现一个残缺的零常识证实可验证智能合约?

筹备:

● 装置 Circom 和 Snarkjs

● 下载或生成通用的 ZK 参数

能够从 Polygen-Hermez 下载曾经实现的 MPC 典礼生成参数。

能够应用 Snarkjs 进行 MPC 接力典礼生产 ZK 参数,如命令:snarkjs contribute 等。

开发实现:

1. 实现电路

1.1. 将函数转化对立的算术表达式,if 分支语句合并

为了简化计算,限度 x 为 0 或 1,不便分支语句的合并。

1.2. 电路拍平 flatten,引入新的变量(信号 signal),并应用 R1CS 示意

1.3. R1CS 示意的电路转化为 circom 语言(间接翻译),保留为 f.circom 文件

2. 编译电路编译输入 r1cs 二进制,snarkjs 命令查看电路信息

3.Setup 和创立证实 & 验证 keys

4. 创立 witness 和 proof

5. 生成验证合约 verifier 和调用数据

6. 部署到 remix 并调用例如,能够将上一步骤生成的 verifier 合约部署到 remix 以太坊模仿环境,应用上一步骤的 calldata 作为输出,调用 call 接口:

如果输入 true 则示意计算 proof 验证胜利。

能够看到基于 Circom 和 Snarkjs 可能实现一个残缺的 ZK 利用,该开发套件灵便、可编程,提供多协定反对、丰盛的根底电路、多语言的反对如 C ++、JavaScript、Solidity 等,尤其 Solidity 验证合约的生成能力,则进一步减少了 Web3-ZK 利用开发的友好度。

自在探讨环节,Kelvin 老师急躁地为学员解答了一系列电路设计技巧和开发相干的问题。

对于 PrivacyIN

PrivacyIN 隐衷学院 (Privacy Institution) 由 LatticeX 基金会发动,致力于建设凋谢的明码和隐衷技术布道和钻研社区。联结寰球顶尖的学者、隐衷技术开发者推动 ZK(零常识证实)、MPC(平安多方计算)、FHE(全同态明码) 的翻新和落地。

对于 LatticeX 基金会

LatticeX 基金会(LatticeX Foundation)是一家寰球范畴的开源技术社区,以通过构建简单计算偿还用户数据主权,爱护数据隐衷,实现数据价值替换为愿景,旨在构建一个齐全去中心化的计算互操作网络,在爱护数据主权和隐衷的前提下促成数据使用权的交易,并为实现 LatticeX 愿景赞助各类学术研究及科研项目。

正文完
 0