【零知识证明】MiMC哈希函数电路
1 哈希电路
哈希函数电路实现:
pragma circom 2.0.0;
// y = (x + k + c) ^ 5
// 输入信号x, k ,常量c
// base = x + k + c
// base2 = base * base
// base4 = base2 * base2
// base5 = base *base4
// 输出 y
template MIMC5(){
signal input x;
signal input k;
signal output y;
var nRounds = 10;
var lastOutput[0] <== x;
signal lastOutput[nRounds + 1];
var base[nRounds];
signal base2[nRounds];
signal base4[nRounds];
var c[nRounds] = [];
for(var i = 0; i < nRounds; i++){
base[i] = lastOutput[i] + k + c[i];
base2[i] <== base[i] * base[i];
base4[i] <== base2[i] * base2[i];
lastOutput[i+1] <== base[i] + base4[i];
}
}
component main = MIMC5();
对于“c”使用ethers中的 BigNumber来生成10个随机的256位数
2 generate_bignumbers.js生成随机数
新建一个名为generate_bignumbers.js的文件
const { ethers } = require("ethers");
const num = 10;
async function generate(){
for (let i = 0; i < num; i++){
let n = ethers.BigNumber.from(ethers.utils.randomBytes(32));// ethers v5.6.1
// let n = ethers.BigNumber.from(ethers.randomBytes(32));ethers v6
console.log(n.toString());
}
}
generate().catch(
(err) => {console.log(err); process.exit(1);}
);
下载ethers的版本为v6.13.2,现需要更改为v5.6.0。
第一步,删除package-lock.json文件。
第二步,在package.json文件中将^6.13.2改为^5.6.0 ,并保存文件。
第三步,在终端输入" npm install ",然后等待下载完成。
最后,在终端输入 " node generate_bignumbers.js "得到结果:
3 编译
第一步,终端输入:
circom circuit.circom --r1cs --wasm
运行成功后会生成circuit_js文件夹中的内容
第二步,新建一个input.json文件,给出输入x和k的值
{
"x" : "156345341",
"k" : "28965346"
}
第三步,对其生成见证
node ./circuit_js/generate_witness.js ./circuit_js/circuit.wasm input.json output.wtns
生成的见证为output.wtns文件
第四步,将生成的见证转换为json可读形式:
snarkjs wtns export json output.wtns output.json
结果如下