构建第一个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,剩下的是全部的中间变量。

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

相关推荐
爱写代码的小朋友2 小时前
人工智能驱动下个性化学习路径的构建与实践研究——以K12数学学科为例
人工智能·学习
不灭锦鲤8 小时前
网络安全学习第48天
学习
怪侠_岭南一只猿8 小时前
爬虫工程师入门阶段一:基础知识点完全学习文档
css·爬虫·python·学习·html
今天你TLE了吗9 小时前
JVM学习笔记:第八章——执行引擎
java·jvm·笔记·后端·学习
蒙***团9 小时前
使用 MinMix 创建 Tailwindcss 学习网站全流程经验分享
学习
y = xⁿ9 小时前
【从零开始学习Redis|第四篇】从底层理解缓存问题:雪崩、击穿、穿透与一致性设计
java·redis·学习·缓存
温柔一只鬼.10 小时前
GUI学习——day2
java·开发语言·学习
云边散步11 小时前
godot2D游戏教程系列二(10)
笔记·学习·游戏·游戏开发
所谓伊人,在水一方33311 小时前
【Python数据科学实战之路】第12章 | 无监督学习算法实战:聚类与降维的奥秘
python·sql·学习·算法·信息可视化·聚类
泯仲11 小时前
从零起步学习MySQL 第三章:DML语句定义及常见用法示例
数据库·学习·mysql