行业知识
密码协议形式化分析与可证明安全实验2——使用circom和snarkjs来创建一个零知识snark电路
���作系统: Windows11 X64
Circom 和 snarkjs 安装
概述
由JS和纯Web Assembly实现的zkSNARK,内部实现了Groth16、Plonk和FFLONK(Beta版)三个算法。
snarkjs继承了所有协议需要的组件,包括初始可信设置的NMPC执行过程(用以计算全局的的幂)和计算指定电路的证明。
snarkjs基于nodejs,计算采用circom编译的电路。
snarkjs采用ES模式,可以直接部署到rollup或webpack等项目中。
环境安装
由于circom是基于Rust开发的,因此主机需要有Rust环境。
snarkjs需要node环境。
rust环境安装
Rust是一种系统编程语言,以其安全性、并发性和性能闻名,可以通过官网链接进行下载。
msvc编译器
在Windows中使用rust需要有msvc编译器,本人由于之前安装Visual Studio时已经安装该编译器,故此处省略。
rust下载
打开压缩包后,会弹出cmd命令行窗口,等待其下载完成。出现以下内容即下载完成。
检查rust安装是否成功
安装程序会自动配置环境变量,在cmd命令行窗口中输入rustc --version,确认其安装成功,出现以下信息即安装成功:
node环境安装
简单来说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。可以通过官网链接下载。
node下载
这里我选择LTS的windows下载包。
下载完成后,双击安装包开始安装~~(我是下载完了才写的博客,图时偷来的,大家按照自己的需求安装)~~
这里我的路径是D:\LenovoSoftstore\NodeJS
中间会弹出“你要允许此应用对你的设备进行更改吗?”,选择“是”。
检查node安装是否成功
接下来检查环境变量:右击此电脑->属性->高级系统设置->环境变量->系统变量->Path
然后在命令行窗口中输入node -v和npm -v查看node是否安装成功,出现以下信息即安装成功(这里我的node已经自动安装了npm,新版的Node.js已自带npm,安装Node.js时会一起安装,npm的作用就是对Node.js依赖的包进行管理,也可以理解为用来安装/卸载Node.js需要装的东西)。
node环境配置
这里的环境配置主要配置的是npm安装的全局模块所在的路径,以及缓存cache的路径,之所以要配置,是因为以后在执行类似:npm install express [-g] (后面的可选参数-g,g代表global全局安装的意思)的安装语句时,会将安装的模块安装到【C:\Users\用户名\AppData\Roaming\npm】路径中,占C盘空间。
但我希望将全模块所在路径和缓存路径放在我node.js安装的文件夹中,则在我安装的文件夹D:\LenovoSoftstore\NodeJS下创建两个文件夹node_global及node_cache如下图:
注意:这两个文件夹需要打开修改权限 很重要不然会报错没有权限
创建完两个空文件夹后,打开cmd命令行窗口,输入
npm config set prefix “D:\LenovoSoftstore\NodeJS\node_global”npm config set cache “D:\LenovoSoftstore\NodeJS\node_cache”
再次点开环境变量,在系统变量下新建NODE_PATH,
输入D:\LenovoSoftstore\NodeJS\node_global\node_modules,将用户变量下的Path修改为
D:\LenovoSoftstore\NodeJS\node_global
不知道为什么我的电脑上这个环境变量配置没有了,就没有图。
还要将需要将npm全局包的目录添加到系统环境变量Path中,否则后面会报错血与泪的教训 。
测试node安装结果
在cmd命令行输入以下代码,安装两个常用的模块:
npm install express -gnpm install webpack -g
打开存放module的文件夹,发现这两个module已经被安装在该路径下(这里的截图我已经安装了其他module,所以有那么多,理论上只有webpack和express)。
Circom 安装
由于Circom安装语句中用到了git,需要在电脑上安装git需要使用的环境。
git环境安装
从官网链接下载git,选择适配电脑操作系统的安装包。
下载完成后,直接运行安装包,傻瓜式安装。
打开cmd验证器是否安装成功,输入git --version,如果如下图所示,返回了版本信息,就说明git安装成功了。
Circom安装
在命令行输入
git clone https://github.com/iden3/circom.git # 从该网站拷贝该资源cargo build --release #进入进入circom目录后执行该命令cargo install --path circom # 编译完成后执行安装命令,等待安装完毕即可
之后可以用以下命令查看circom版本:
circom --help
如下图所示,返回了版本信息,就说明circom安装成功了。
snarkjs安装
在命令行窗口中输入npm install -g snarkjs@latest安装snarkjs的module
安装完成后可以使用snarkjs --help查看帮助
至此,circom和snarkjs都安装完成。
构建电路与证明
准备工作——电路部分
首先准备好一个电路文件 circuit.circom ,具体如下:
pragma circom 2.1.4; # 指定编译该电路用到的circom版本为2.1.4template Multiplier() { # 电路包含三个变量,其中a,b为输入,输出为c,该电路可以证明Prover知道两个数字a和b,其乘积为csignal input a;signal input b;signal output c;c "a": "3", "b": "11"} #注意这里的输入均为字符串,因为JS无法处理大于2^53的整数,所以转换为字符串形式处理