引言:在之前的文章里,我介绍了利用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零知识证明相关推荐

  1. 利用circom和snarkjs实现zkSNARK零知识证明的智能合约应用

    利用circom和snarkjs实现zkSNARK零知识证明的智能合约应用 0. 实验环境 1. 理解zkSNARK 2. 编写电路circuit.circom并编译 3. 根据私有输入input.j ...

  2. 《零知识证明 – zkSNARK 入门》— PPIO Code Talks 第二期

    PPIO Code Talks 致力于打造一个以上海为中心,辐射全球的高质量区块链学习,分享,交友平台. 7月27日,PPIO 举办了第二期 Code Talks 闭门技术交流分享会.在上一期的活动中 ...

  3. 什么是零知识证明(ZK Proof)?Web2.0通往Web3.0的入口技术

    古老的难题 女:你爱我吗? 男:爱! 女:怎么证明? 男:-- 零知识证明的定义 零知识证明(Zero-Knowledge Proof)也叫做最小泄露证明,能充分证明自己是某种权益的合法拥有者,又不把 ...

  4. 使用 zk-SNARK 的可编程零知识证明:第 1 部分

    理论上,可以为任何数学问题构建零知识证明 (ZKP),而无需揭示此解决方案.在实践中,为一个问题开发 ZKP 通常需要发明一种全新的密码算法.它没有标准配方,需要广泛而深入的密码学知识.例如,零知识谜 ...

  5. 比较零知识证明算法zkSNARK,zkSTARKs,zkBoo,Sonic,BulletProofs

    本文分为两部分,第一部分说明零知识能干什么,为什么它这么强大,在区块链中这么火:第二部分比较零知识证明的算法zkSNARK, zkSTARKs, zkBoo, Sonic和BulletProofs的特 ...

  6. 零知识证明之zk-snark 应用案例(零知识证明实战渔业监控【zksnark】)

    文章目录 零知识证明实战渔业监控 1.需求分析 2.circom电路实现 3.circom电路编译 4.zksnark的可信设置 5.计算ziksarnk电路信号的见证(witness) 6. 创建z ...

  7. 零知识证明系列之三——入门zkSNARK

    前文回顾 回顾一下一套完善的零知识证明体系需要以下的条件: (1)完备性(Completeness)如果证明方和验证方都是诚实的,并遵循证明过程的每一步,进行正确的计算,那么这个证明一定是成功的,验证 ...

  8. 笔记——零知识证明zkSNARK

    记录下学习零知识证明的相关资料以及协议构建过程 相关定义 Definition 1 (Quadratic Span Program) 若一个程序QQQ为QSP,则其在域FFF上存在两个集合V={vk( ...

  9. 零知识证明 - zkSNARK入门

    网络上讲解零知识证明的文章就不多,这些文章要不太浅显,要不太深入,很少有能给入门者整体框架上的认识. 比如,阿里巴巴零知识证明就是一个非常好的通俗理解零知识证明的例子: 阿里巴巴被强盗抓住,为了保命, ...

最新文章

  1. 全球及中国斜交胎市场品牌竞争形势与投资策略分析报告2022年
  2. jQuery学习笔记之DOM操作、事件绑定(2)
  3. CNN:测试一下YoloV3
  4. JavaWeb项目前端规范(采用命名空间使js深度解耦合)
  5. 乘幂法、复化梯形以及二分法求特征值【相关例题python实现】
  6. 北京人工智能工程师职称评定政策出台,明年起一年一评
  7. 做了MVC模式一年,可不要把传统模式忘记呀!ashx配合aspx实现AJAX加载JSON数据...
  8. Cisco交换机设备配置镜像端口
  9. 水光半导体于2017 CES展示全方位通讯网络、多媒体及消费性电子芯片解决方案
  10. Flash相关知识总结
  11. pyodbc linux 乱码,python-无法在Linux上安装pyodbc
  12. 学习笔记Android弹框material-dialogs
  13. 专业技术问题:UI设计师岗位面试反馈的常见问题
  14. java判断字符串是否是中文_Java检查字符串是否包含中文字符
  15. SSID、BSSID、ESSID的区别
  16. TMS320F280049 I2C IIC 相对于库函数操作CAT24C02 中文
  17. 机器学习之二十一(读书笔记)
  18. 清华胡宇迪教授谈关于爱情、关于伴侣、关于承诺、关于人生、关于友情、关于微笑、关于生活、关于幸福...
  19. 学号 20172326 《程序设计与数据结构》第八周学习总结
  20. Android权限 权限等级 普通权限 敏感权限 申请权限

热门文章

  1. NVDIA Jetson TX2软件介绍
  2. iOS程序闪退的原因以及处理办法
  3. 第一次使用框架-amaze UI
  4. 简单理解二进制的左移和右移(通俗易懂)
  5. 和数集团董事长唐毅先生受邀出席“文旅产业与数字艺术新形态”高峰文化论坛
  6. 帝国备份王mysql导入_使用帝国备份王EmpireBak备份与恢复网站的MySQL数据库
  7. 论文阅读笔记:Global-Locally Self-Attentive Dialogue State Tracker
  8. 深度解析推荐系统的算法原理
  9. 网站被篡改怎么办?如何防护网站被黑
  10. 最新泛微E-office10.5 泛微Eoffice V10.5 泛微E-office10.0 Eoffice10.0 泛微E-offic95 泛微Eoffice9.0 8.0 泛微行政事业V10.0