构建第一个zk

2024-08-27 15:36
文章标签 构建 第一个 zk

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

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

这篇关于构建第一个zk的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112077

相关文章

基于Python构建一个高效词汇表

《基于Python构建一个高效词汇表》在自然语言处理(NLP)领域,构建高效的词汇表是文本预处理的关键步骤,本文将解析一个使用Python实现的n-gram词频统计工具,感兴趣的可以了解下... 目录一、项目背景与目标1.1 技术需求1.2 核心技术栈二、核心代码解析2.1 数据处理函数2.2 数据处理流程

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

Python FastMCP构建MCP服务端与客户端的详细步骤

《PythonFastMCP构建MCP服务端与客户端的详细步骤》MCP(Multi-ClientProtocol)是一种用于构建可扩展服务的通信协议框架,本文将使用FastMCP搭建一个支持St... 目录简介环境准备服务端实现(server.py)客户端实现(client.py)运行效果扩展方向常见问题结

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加