ZoKrates+Remix在线实现zkSNARK零知识证明
引言:在之前的文章里,我介绍了利用circom和snarkjs实现zkSNARK零知识证明,包含了snarkjs的使用步骤,并且我的毕业论文也全部采用snarkjs实现zkSNARK算法。
不过snarkjs里的signal信号的概念和高级语言变量之间的差别有点大,很多运算操作都不能直接进行,而且在执行circom库里的SHA256哈希算法时需要调整powersOfTau可信设置(snarkjs ptn bn128 10 powersOfTau10_0000.ptau,修改10为更大值),只能采用snark友好的MiMC哈希算法。于是我开始探索其他zkSNARK工具。
有些报告指出,snarkjs、libsnark和ZoKrates号称三大最常用的zkSNARKs零知识开发库。经过测试发现ZoKrates在编写代码的过程中更接近高级语言,算术电路的输入输出都是以变量的形式,天然支持comparator数值比较,更易实现零知识范围证明(Zero-Knowledge Range Proof,ZKRP),而且ZoKrates支持log输出利于debug。此外,ZoKrates实现了Remix插件,也就可以在线运行zkSNARK算术电路,特此记录下ZoKrates+Remix在线实现zkSNARK零知识证明的步骤。
ZoKrates是以太坊上zkSNARKs的工具箱。它可以帮助您在DApp中使用可验证的计算,从高级语言的程序规范到生成计算证明,再到在Solidity中验证这些证明。(ZoKrates官网介绍)
Remix官网:https://remix.ethereum.org/
1.安装插件
点击左下角的插件按钮,找到ZOKRATES插件,点击Activate激活插件:
2.编写zkSNARK算术电路
新建文件命名为main.zok,输入如下代码:
def main(private u8 p, private u8 q, u8 n) -> bool {return p * q == n;
}
2.1代码解释
两个隐私输入p和q、一个公开输入n,u8代表8位无符号整型,返回bool类型。
根据“大整数质因子分解”是NP困难问题(Nondeterministic polynomial-time,非确定性多项式时间),给定两个素数p和q,他们的乘积是n,但是如果只提供这个数字n,找出n的两个素因子是困难的。
根据这个难题,利用zkSNARK向外界证明自己“知道n的两个素因子”,但是不向外界泄露p和q的真实值。因此,zkSNARK的隐私输入是p和q、公开输入是n、算术电路是p*q==n。
2.2在线测试
ZoKrates提供了在线编译算术电路的测试环境,进入官网https://play.zokrat.es:
3.编译与测试
进入ZOKRATES插件,点击compile编译:
输入错误样例进行测试,p=3、q=7、n=22,输出是false:
输入正确样例进行测试,p=3、q=7、n=21,输出是true:
4.初始化密钥verification_key.json
点击Run Setup进行初始化,得到verification_key.json作为验证密钥:
5.生成证明proof.json
点击Generate,生成proof.json:
复制Verifier inputs备用:
[["0x1dc9038012cef119c740a52bffc3280d6ed125bbd9bfc474bcca78dd982a901d","0x0fa4945211306b5d0a50bbc80e5def88fe1224b927fcace75d725384d31755f9"],[["0x15ae9c563fcfcb4cdf74780bbefd44bd54e6be9222170bd907bd962f0928c103","0x27ad25d6aa4089fd27622e8f17524b3bb05ffa67d2c099a1f880d69357a0b168"],["0x297ea2971f2296ba60e9e4fe3b9535455e9130e14a0c973f584deec0437448d2","0x05484d4637c39f5b7eadf920686d3290f4f5dfeae3ae7d486a9f753521cc12c5"]],["0x0760832bd07407205278074a131c8e67de0e90f8e45f6ac43c083ffa44873b34","0x014b52710266031a08b23d556f0ca1c64b4b579db8f6e0c4720ffe649bbd3bf9"]],["0x0000000000000000000000000000000000000000000000000000000000000015","0x0000000000000000000000000000000000000000000000000000000000000001"]
0x0000000000000000000000000000000000000000000000000000000000000015对应十进制的21,就是zkSNARK的公开输入n。
6.导出验证合约verifier.sol
点击Export,生成verifier.sol智能合约:
7.编译并部署验证合约verifier.sol
点击Compile verifier.sol编译:
选择verifier.sol,点击Deploy部署:
8.运行验证合约
在Deployed Contracts里选择VERIFIER,在verifyTX函数的输入框里填写刚才复制备用的Verifier inputs,点击verifyTX。
右下角log出现了函数执行结果,input是21,输出true:
将verifyTX的input里的21改成22,即十六进制0x0000000000000000000000000000000000000000000000000000000000000016,再测试一下,输出false:
9.结语
至此便实现了大整数质因子分解的零知识证明,p和q是隐私输入,仅在生成证明的过程由证明者知道,n是公开输入,可以输入到公开的智能合约,智能合约自动验证零知识证明的有效性,并且修改n之后能检测出零知识证明已失效。
ZoKrates也有离线的命令行版本,结合Remix在线自动部署与运行较为方便,适合部署前测试。
ZoKrates+Remix在线实现zkSNARK零知识证明相关推荐
- 利用circom和snarkjs实现zkSNARK零知识证明的智能合约应用
利用circom和snarkjs实现zkSNARK零知识证明的智能合约应用 0. 实验环境 1. 理解zkSNARK 2. 编写电路circuit.circom并编译 3. 根据私有输入input.j ...
- 《零知识证明 – zkSNARK 入门》— PPIO Code Talks 第二期
PPIO Code Talks 致力于打造一个以上海为中心,辐射全球的高质量区块链学习,分享,交友平台. 7月27日,PPIO 举办了第二期 Code Talks 闭门技术交流分享会.在上一期的活动中 ...
- 什么是零知识证明(ZK Proof)?Web2.0通往Web3.0的入口技术
古老的难题 女:你爱我吗? 男:爱! 女:怎么证明? 男:-- 零知识证明的定义 零知识证明(Zero-Knowledge Proof)也叫做最小泄露证明,能充分证明自己是某种权益的合法拥有者,又不把 ...
- 使用 zk-SNARK 的可编程零知识证明:第 1 部分
理论上,可以为任何数学问题构建零知识证明 (ZKP),而无需揭示此解决方案.在实践中,为一个问题开发 ZKP 通常需要发明一种全新的密码算法.它没有标准配方,需要广泛而深入的密码学知识.例如,零知识谜 ...
- 比较零知识证明算法zkSNARK,zkSTARKs,zkBoo,Sonic,BulletProofs
本文分为两部分,第一部分说明零知识能干什么,为什么它这么强大,在区块链中这么火:第二部分比较零知识证明的算法zkSNARK, zkSTARKs, zkBoo, Sonic和BulletProofs的特 ...
- 零知识证明之zk-snark 应用案例(零知识证明实战渔业监控【zksnark】)
文章目录 零知识证明实战渔业监控 1.需求分析 2.circom电路实现 3.circom电路编译 4.zksnark的可信设置 5.计算ziksarnk电路信号的见证(witness) 6. 创建z ...
- 零知识证明系列之三——入门zkSNARK
前文回顾 回顾一下一套完善的零知识证明体系需要以下的条件: (1)完备性(Completeness)如果证明方和验证方都是诚实的,并遵循证明过程的每一步,进行正确的计算,那么这个证明一定是成功的,验证 ...
- 笔记——零知识证明zkSNARK
记录下学习零知识证明的相关资料以及协议构建过程 相关定义 Definition 1 (Quadratic Span Program) 若一个程序QQQ为QSP,则其在域FFF上存在两个集合V={vk( ...
- 零知识证明 - zkSNARK入门
网络上讲解零知识证明的文章就不多,这些文章要不太浅显,要不太深入,很少有能给入门者整体框架上的认识. 比如,阿里巴巴零知识证明就是一个非常好的通俗理解零知识证明的例子: 阿里巴巴被强盗抓住,为了保命, ...
最新文章
- 全球及中国斜交胎市场品牌竞争形势与投资策略分析报告2022年
- jQuery学习笔记之DOM操作、事件绑定(2)
- CNN:测试一下YoloV3
- JavaWeb项目前端规范(采用命名空间使js深度解耦合)
- 乘幂法、复化梯形以及二分法求特征值【相关例题python实现】
- 北京人工智能工程师职称评定政策出台,明年起一年一评
- 做了MVC模式一年,可不要把传统模式忘记呀!ashx配合aspx实现AJAX加载JSON数据...
- Cisco交换机设备配置镜像端口
- 水光半导体于2017 CES展示全方位通讯网络、多媒体及消费性电子芯片解决方案
- Flash相关知识总结
- pyodbc linux 乱码,python-无法在Linux上安装pyodbc
- 学习笔记Android弹框material-dialogs
- 专业技术问题:UI设计师岗位面试反馈的常见问题
- java判断字符串是否是中文_Java检查字符串是否包含中文字符
- SSID、BSSID、ESSID的区别
- TMS320F280049 I2C IIC 相对于库函数操作CAT24C02 中文
- 机器学习之二十一(读书笔记)
- 清华胡宇迪教授谈关于爱情、关于伴侣、关于承诺、关于人生、关于友情、关于微笑、关于生活、关于幸福...
- 学号 20172326 《程序设计与数据结构》第八周学习总结
- Android权限 权限等级 普通权限 敏感权限 申请权限
热门文章
- NVDIA Jetson TX2软件介绍
- iOS程序闪退的原因以及处理办法
- 第一次使用框架-amaze UI
- 简单理解二进制的左移和右移(通俗易懂)
- 和数集团董事长唐毅先生受邀出席“文旅产业与数字艺术新形态”高峰文化论坛
- 帝国备份王mysql导入_使用帝国备份王EmpireBak备份与恢复网站的MySQL数据库
- 论文阅读笔记:Global-Locally Self-Attentive Dialogue State Tracker
- 深度解析推荐系统的算法原理
- 网站被篡改怎么办?如何防护网站被黑
- 最新泛微E-office10.5 泛微Eoffice V10.5 泛微E-office10.0 Eoffice10.0 泛微E-offic95 泛微Eoffice9.0 8.0 泛微行政事业V10.0