175-circom入门(一)

今天我们来学习zkp的circom

首先,什么是circom呢

Circom 是一种用于构建电路的专用语言。目前,它是生产电路的实际语言。该语言不是特别符合人体工程学,使开发者敏锐地意识到正在编写电路。

Circom是一个用于编写零知识证明电路的领先工具。零知识证明是一种在不透露私密信息的情况下验证某些事情是否为真的方法。Circom使用类似于JavaScript的语言来描述电路,并可以将其编译成低级语言(例如,Snark或STARK协议),以便进行验证。由于Circom可以将大型计算压缩成小而快速的二进制证书,因此它在区块链和加密货币等领域中非常有用。

Circom使用一种类似于JavaScript的自定义语言来描述电路。这种语言具有类似于C和JavaScript的语法和结构,但是它专门为零知识证明电路设计,因此还包括一些特殊的关键字和语法,例如约束(constraints)和信号(signals)。Circom语言相对较简单,易学易用,因此非常适合初学者和快速原型开发。

我们可以使用一个在线编写circom电路的网站

zkREPL

zkREPL

打开这个网站之后呢

我们可以看到一个简单的example

pragma circom 2.1.4;

include "circomlib/poseidon.circom";
// include "https://github.com/0xPARC/circom-secp256k1/blob/master/circuits/bigint.circom";

template Example () {
    signal input a;
    signal input b;
    signal output c;
    
    var unused = 4;
    c <== a * b;
    assert(a > 2);
    
    component hash = Poseidon(2);
    hash.inputs[0] <== a;
    hash.inputs[1] <== b;

    log("hash", hash.out);
}

component main { public [ a ] } = Example();

/* INPUT = {
    "a": "5",
    "b": "77"
} */

我们可以看到

有2个input

1个output

    signal input a;
    signal input b;
    signal output c;
    

然后

    c <== a * b;
    assert(a > 2);

验证c<==a*b

同时验证a>2

那么我们来试着写一个简单的例子

pragma circom 2.1.4;

include "circomlib/poseidon.circom";
// include "https://github.com/0xPARC/circom-secp256k1/blob/master/circuits/bigint.circom";

template Example () {
    signal input a;
    signal input b;
    signal input c;
    signal input d;
    signal output e;

    c === a+b;
    d === a*b;
    e <== d-c;
    
}

component main = Example();

/* INPUT = {
    "a": "2",
    "b": "3",
    "c": "5",
    "d": "6",
    "e": "1",
} */

输入4个input

和1个output

很简单吧

再来写一个简单的例子

pragma circom 2.1.4;

include "circomlib/poseidon.circom";
// include "https://github.com/0xPARC/circom-secp256k1/blob/master/circuits/bigint.circom";

template Example () {
    signal input x1;
    signal input x2;
    signal input x3;
    signal input x4;

    signal y1;
    signal y2;

    signal output out;

    //f(x) = (x1+x2)/x3-x4
    y1 <== x1+x2;
    y2 <-- y1/x3;
    y1 === y2*x3;
    out <== y2-x4;
    
}

component main = Example();

/* INPUT = {
    "x1": "2",
    "x2": "4",
    "x3": "3",
    "x4": "1",
    "out": "1",
} */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值