零知识证明-libsnark库学习:Gadgets

。_饼干妹妹 提交于 2020-02-22 15:10:13

libsnark库使用gadgets将R1CS打包;
首先创建src/gadget.hpp文件,开发人员设置共有变量out和私有变量x,gadget会自己处理中间变量ysym_1sym_2
然后创建一个派生自gadget类的test_gadget类,ysym_1sym_2作为其私有成员,xout是公共类成员变量;

接下来介绍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,然后它计算中间值ysym_1sym_2的见证值,因此gadget用户无须担心中间变量;
使用gadget:

protoboard<FieldT> pb;
pb_variable<FieldT> out;
pb_variable<FieldT> x;

out.allocate(pb, "out");
x.allocate(pb, "x");

初始化pb,声明outx

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中自动计算;

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!