libsnark库使用gadgets将R1CS打包;
首先创建src/gadget.hpp文件,开发人员设置共有变量out和私有变量x,gadget会自己处理中间变量y、sym_1和sym_2;
然后创建一个派生自gadget类的test_gadget类,y、sym_1和sym_2作为其私有成员,x和out是公共类成员变量;
接下来介绍gadget的功能及使用方法
构造函数:
sym_1.allocate(this->pb, "sym_1");
y.allocate(this->pb, "y");
sym_2.allocate(this->pb, "sym_2");
构造函数将中间变量分配给pb;
generate_r1cs_constraints()
该函数添加了与电路相对应的R1CS约束,与前面手动添加的函数相同,只是捆绑在这个函数中;
generate_r1cs_witness()
该函数假设我们已经设置了公共值out和见证值x,然后它计算中间值y、sym_1和sym_2的见证值,因此gadget用户无须担心中间变量;
使用gadget:
protoboard<FieldT> pb;
pb_variable<FieldT> out;
pb_variable<FieldT> x;
out.allocate(pb, "out");
x.allocate(pb, "x");
初始化pb,声明out和x;
pb.set_input_sizes(1);
test_gadget<FieldT> g(pb, out, x);
指定哪些变量是公共的,哪些变量是私有的,然后创建新的test_gadget;
g.generate_r1cs_constraints();
调用函数生成R1CS约束;
pb.val(out) = 35;
pb.val(x) = 3;
g.generate_r1cs_witness();
添加公共值35和见证值3,其余中间变量的值在gadget中自动计算;
来源:CSDN
作者:别找了我就是弗兰克
链接:https://blog.csdn.net/qq_32953791/article/details/104441262