当前位置: 首页 > 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,剩下的是全部的中间变量。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MVSEP-MDX23容器构建详细教程
  • windows中使用vscode的remote-ssh连接linux失败
  • vue组件和插件使用
  • 网络安全场景化解决方案编写教程(大纲)
  • day42 代码随想录 | 子序列问题 面试高频题
  • 漏洞挖掘 | 记一次Spring横向渗透
  • 小程序wx:if 和hidden的区别
  • leetcode 3146 两个字符串的排列差
  • QStackedWidget使用整理
  • 力扣刷题(复习版)
  • 7-2 求矩阵的最大值(设惟一)
  • Java底层堆内存、GC等知识点阐述
  • 8、引用
  • 【机器学习】CNN在计算机视觉中的应用
  • PowerShell脚本编写:自动化Windows开发工作流程
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【5+】跨webview多页面 触发事件(二)
  • css选择器
  • ES6 ...操作符
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JAVA_NIO系列——Channel和Buffer详解
  • Java-详解HashMap
  • JAVA之继承和多态
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux gpio口使用方法
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • OSS Web直传 (文件图片)
  • Redash本地开发环境搭建
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Sublime Text 2/3 绑定Eclipse快捷键
  • tensorflow学习笔记3——MNIST应用篇
  • vue.js框架原理浅析
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 安装python包到指定虚拟环境
  • 测试如何在敏捷团队中工作?
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 简单数学运算程序(不定期更新)
  • 类orAPI - 收藏集 - 掘金
  • 利用DataURL技术在网页上显示图片
  • 聊聊flink的TableFactory
  • 前端_面试
  • 思考 CSS 架构
  • hi-nginx-1.3.4编译安装
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • !!Dom4j 学习笔记
  • !$boo在php中什么意思,php前戏
  • #Lua:Lua调用C++生成的DLL库
  • #NOIP 2014# day.1 T2 联合权值
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (7)svelte 教程: Props(属性)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程