当前位置: 首页 > article >正文

【零知识证明】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

结果如下

 


http://www.kler.cn/news/288333.html

相关文章:

  • DOM树和CSS树解读
  • 【Spring Boot 实战】统一数据返回格式的最佳实践:构建稳定的RESTful API(实战篇)
  • 【时时三省】c语言例题----华为机试题<密码强度等级>
  • 【数据库|第10期】SQL Server、Access和Sqlite 的表别名详解
  • 如何交叉编译 Linux v4l-utils 依赖库?
  • ubuntu设置为自己需要的屏幕分辨率
  • RabbitMQ练习(Topics)
  • P7958 [COCI2014-2015#6] NEO
  • 如何处理海量数据
  • 事半功倍:利用增强现实提高工作效率
  • [AcWing]-完全背包问题-动态规划
  • RabbitMQ的TLL
  • Mac OS X 如何升级系统自带的 Ruby
  • 教程:使用显卡MX250做YOLO目标检测(定位)滑块缺口,包括获取数据集,对数据集手动标注,训练的代码,推理的代码,超多细节,你的第一次YOLO绝佳体验!
  • 微信小程序认证和备案
  • 比特币详解
  • (大三上_游戏开发设计模式_上课_1)多态练习_计算机
  • CUDA编程08 - 并行编程思维
  • 【React 简化路由的生成的方式
  • kafka3.7.1 单节点 KRaft部署测试发送和接收消息
  • 深入解析FPGA在SOC设计中的核心作用
  • 深入探讨Java中的分布式事务管理:实现、挑战与最佳实践
  • 超声波的应用
  • 【python计算机视觉编程——4.照相机模型与增强现实】
  • sqlite3的db.wait方法:等待所有查询完成
  • PyQt6 / PySide 6 实现可拖拽的多标签页 web 浏览器【1】(有 Bug)
  • Ansible 自动化运维项目
  • 如何在Mac上使用VMware配置Windows虚拟机
  • C#绘制常用工业控件(仪表盘,流动条,开关等)
  • 浅谈分库分表的“读扩散”问题