今天我们来学习zkp的circom
首先,什么是circom呢
Circom 是一种用于构建电路的专用语言。目前,它是生产电路的实际语言。该语言不是特别符合人体工程学,使开发者敏锐地意识到正在编写电路。
Circom是一个用于编写零知识证明电路的领先工具。零知识证明是一种在不透露私密信息的情况下验证某些事情是否为真的方法。Circom使用类似于JavaScript的语言来描述电路,并可以将其编译成低级语言(例如,Snark或STARK协议),以便进行验证。由于Circom可以将大型计算压缩成小而快速的二进制证书,因此它在区块链和加密货币等领域中非常有用。
Circom使用一种类似于JavaScript的自定义语言来描述电路。这种语言具有类似于C和JavaScript的语法和结构,但是它专门为零知识证明电路设计,因此还包括一些特殊的关键字和语法,例如约束(constraints)和信号(signals)。Circom语言相对较简单,易学易用,因此非常适合初学者和快速原型开发。
我们可以使用一个在线编写circom电路的网站
打开这个网站之后呢
我们可以看到一个简单的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",
} */