当前位置: 首页 > news >正文

【零知识证明】构建第一个zk

1 必要步骤

视频学习:5. Circcom 中的基本算术电路_哔哩哔哩_bilibili

文字学习:https://hackmd.io/@YlNLZS2ESI21OSqdTW_mPw/S1jqN-h80/edit

第五课,circom实践,需要安装

1 vscode

2 rust:Windows安装Rust环境(详细教程)-CSDN博客

安装rust出现问题解决方案:Windows 11 上通过国内源安装 Rust - rust - 大象笔记 (sunzhongwei.com)

rust 安装完成后测试是否能正常使用:

rust 创建项目并运行_rust 创建节目-CSDN博客

3 node:2024最新版Node.js下载安装及环境配置教程【保姆级】_nodejs下载-CSDN博客

以上完成后接下来安装 circom 和 snarkjs,在全局模式下下载:

npm install circom -g
npm install snarkjs -g

最终:

 C语言依赖:x86_64-14.1.0-release-posix-seh-ucrt-rt_v12-rev0

rust版本:rustc 1.80.1 (3f5fd8dd4 2024-08-06)

node版本:v18.19.0

2 电路设计 

2.1 前期准备

新建一个zkProject文件夹,用于存放zk相关的代码

mkdir zkProject

进入此文件夹

cd zkProject

再新建一个文件夹

mkdir zktest1
cd zktest1

 打开vscode

code .

在vscode中打开终端 

 2.2 创建项目

 初始化一个默认的package.json和安装必要的包

npm init -y

 安装依赖,此处参考文章:构建零知识snark电路时出现问题解决方案(circom2)_circom 编译总出错-CSDN博客

npm install --save circom snarkjs

新建一个名为 【circuit.circom】的文件

2.3 设计电路

文件中写入测试示例并保存

pragma circom  2.0.0;// f(x,y) = x^2 * y + x * y^2 + 17
// Signal Definition: 
// 1、所有的输入都是信号
// 2、每次将两个信号相乘时,都需要定义一个新的信号
// 3、一次只能占用两个信号来获取一个新的信号
// 4、所有的输出都是信号// 模版
template F() {// Declaration of signals.signal input x;signal input y;signal output o;signal m1 <== x * x;signal m2 <== m1 * y;signal m3 <== y * y;signal m4 <== m3 * x;o <== m2 + m4 + 17;}//组装
component main = F();

2.4 编译电路

运行电路前需要先编译,编译命令为【circom 电路文件名 --r1cs --wasm】

其中,r1cs:一阶约束系统,最多只有一次信号之间的乘法。

wasm:web浏览器可以理解的二进制代码

circom circuit.circom --r1cs --wasm

若出现以下问题:

 circom : 无法加载文件 D:\node\node_global\circom.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwl 
ink/?LinkID=135170 中的 about_Execution_Policies。
所在位置 行:1 字符: 1
+ circom circuit.circom --r1cs --wasm
+ ~~~~~~

snarkjs wtns export json witness.wtns witness.json


    + CategoryInfo          : SecurityError: (:) [],PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

解决方法:cnpm : 无法加载文件 node_global\cnpm.ps1,因为在此系统上禁止运行脚本-CSDN博客 

编译成功后,运行此电路,通过刚刚生成的js文件进行运行。

2.5 运行电路

新建一个json文件,用于给出电路的输入

终端输入

node ./circuit_js/generate_witness.js ./circuit_js/circuit.wasm input.json witness.wtns

可以看见对应的见证生成 

若要读这里面的内容,则需要转为json格式

内容如下:

见证文件的第一个数字总是1,代表电路中的常量操作。

接下来是总输出 47 ,然后是两个输入2、3,剩下的是全部的中间变量。

但会少一个(不知道原因)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python-带空格的数字层三角形
  • SQL视图:简化复杂查询的利器
  • 详细说一下MVCC
  • 电脑强制退出程序快捷键
  • redis内存数据库的专业术语雪崩、击穿、穿透的名词解释
  • 二分法介绍
  • Python生成指定数量的随机XML文件
  • 572. 另一棵树的子树
  • Python自动化:Excel根据IP匹配网段获取所属源端口
  • 探索OpenCV:图像处理基础与实践
  • 如何解决“Intel (R) Wireless-AC 9560 160MHz 设备无法启动“?
  • SpringBoot下调用kettle脚本
  • Linux--数据链路层(macarp)
  • 实战演练:利用京东API一键抓取商品详情
  • SQL AI 工具:颠覆数据库管理与分析的创新力量
  • [译]Python中的类属性与实例属性的区别
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • angular学习第一篇-----环境搭建
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Java 网络编程(2):UDP 的使用
  • java中具有继承关系的类及其对象初始化顺序
  • JDK9: 集成 Jshell 和 Maven 项目.
  • JS数组方法汇总
  • Lucene解析 - 基本概念
  • MaxCompute访问TableStore(OTS) 数据
  • Mocha测试初探
  • Promise面试题2实现异步串行执行
  • PV统计优化设计
  • Terraform入门 - 3. 变更基础设施
  • Vue学习第二天
  • windows下如何用phpstorm同步测试服务器
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 阿里云购买磁盘后挂载
  • 大数据与云计算学习:数据分析(二)
  • 跨域
  • 聊聊flink的TableFactory
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 小程序测试方案初探
  • 小李飞刀:SQL题目刷起来!
  • 译有关态射的一切
  • 在Docker Swarm上部署Apache Storm:第1部分
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • #include到底该写在哪
  • #QT 笔记一
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (20050108)又读《平凡的世界》
  • (2020)Java后端开发----(面试题和笔试题)
  • (arch)linux 转换文件编码格式
  • (done) 两个矩阵 “相似” 是什么意思?
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (二)hibernate配置管理
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (六)vue-router+UI组件库