本文摘要:libsnark库有一个清晰的代码层次结构。

OPE官网

libsnark库有一个清晰的代码层次结构。LibSNARK还获得了SNARK中涉及的算法的完整图片,包括各种关系、语言和证明系统。

为了更好的分解R1CS电路,libsnark抽象了原板和小工具,方便开发者慢慢设置电路。在阅读样例代码之前,请仔细阅读libsnark的源代码分析:零科学知识证明——libsnark源代码分析唯一令人失望的地方是libsnark没有给出一个原创的电路结构示例,初学者想建立自己的电路,但一开始有点困惑。为了方便初学者编写自己的电路,同事们编写了一个基于libsnark结构的电路,并对电路进行了分解和测试:https://github.com/StarLI-Trapdoor/libsnark_sample初学者可以基于这个例子开发自己的电路。自由选择默克尔树根作为电路的例子,因为在零科学知识证明的应用中,使用了大量的默克尔树根的数据结构。

1代码结构本例构建了merkle路径的测试电路,并对其进行了分解和验证。Merkle根的深度为3,merkle的根使用sha256哈希函数计算。

代码结构清晰,merkle目录中的main.cpp是主要功能。电路目录下的Merklecircuit.h是电路的构造。整个项目用cmake扩展编译器。电路构造电路的名字叫MerkleCircuit,主要取决于两个小工具:merkle _ authentication _ path _ variable和merkle_tree_check_read_gadget。

Merkle _ authentication _ path _ variable获取Merkle根的路径。Merkle_tree_check_read_gadget检查等价叶节点net卓新闻网是否能计算出是否有准确的根。

构造一个电路,主要构造两个接口函数:generate _ R1CS _ constraints-declare R1CS。这个电路比较简单,只有两个依赖它的小玩意可以分解r1c。generate _ r1cs _ witness-为所有变量赋值。

在该电路中,必须分配的变量是根、叶、叶节点设施的默克尔路径,以及对应于默克尔路径的地址信息(即每层节点的方向,左或右)。整个电路最简单的部分就是电路的构造器,申请人变量,小玩意。

重点是set _ input _ sizes函数。在libsnark的框架下,区分公共变量和私有变量是一个非常简单的模型。

通过set _ input _ sizes函数将前几个变量设置为公共变量。Pb . set _ input _ size(root _ digest-digest _ size);也就是说,这个电路公布的变量是根的位数。3.分解和验证确认了电路的构造。

想到主要功能,如何分解验证。在主函数中定义了merkle树的一些必要类型:typedefrifff : default _ EC _ ppppppzksnark _ PPT;typedef libff :3360 frppzksnark _ PPt field t;typedef sha 256 _ two _ to _ one _ hash _ gadgetFieldT Hasht;FieldT配置文件是bn256椭圆曲线的Fr,计算默克尔树的根使用sha256算法。

3.1安装程序构建generate_read_keypair函数并分解pk/vk。仔细看generate _ read _ key phare函数,逻辑很简单明了:构造MerkleCircuit,分解R1CS后,调用r1cs_gg_ppzksnark_generator分解pk/vk。

protoboardFieldT pbsample : erklecircuitfield t,HashT mc(pb,tree _ depth);MC . generate _ r1cs _ constraints();r1cs _ constraint _ SystemFieldt cs=Pb . get _ constraint _ system();return r1cs _ gg _ ppzksnark _ generatorppzksnark _ PPt(cs);Pk存储在merkle_pk.raw文件中,vk存储在merkle _ vk.raw. 3.2 proveprove逻辑,首先从输出参数构造一个原始merkle树,根据输出指定merkle路径。可以通过生成_ read _ proof函数分解来证明。这个函数的逻辑也很清楚:protoboardFieldT pbsample : erklecircuitfield t,HashT mc(pb,tree _ depth);MC . generate _ r1cs _ constraints();mc.generate_r1cs_witness(pb,leaf,root,path,address,address _ bitsreturn r1cs _ gg _ ppzksnark _ proverppzksnark _ PPt(provide _ key,pb.primary_input(),Pb . assistant _ input());MerkleCircuit,分解R1CS后,设置每个变量的值。

然后用r1cs_gg_ppzksnark_prover分解证明。3.3在知道vk、证书、发布信息(根)的基础上,验证调用r1cs _ gg _ ppzksnark _ verifier _ strong _ IC的模块已经过验证。这就是verify_read_proof函数的逻辑。4编译器和操作编译器之前,项目实时依赖的libsnark库:git子模块update-init-recursive 4.1编译器mkdir buildcd构建;Cmake.编译器完成后,merkle目录继续分解merkle的可执行文件。

4.2可信设置。/MerkleSetup 4.3分解证明。/Merkleprove[data 1][data 2][data 3][data 4][data 5][data 6][data 7][data 8][index]Prove命令,必须获得一个完整的3层Merkleroot的8个叶节点,4.4验证。

/merkle验证[root],其中root信息是在prove分解过程中来自打印机的root信息(也是发布的信息)。如果测试通过,它将解释没有可以分解根的merkle路径,尽管没有发布关于该路径的显式信息。总结:libsnark库代码层次清晰,抽象了原板和小工具,方便开发者慢慢设置电路。

本文给出了一个基于libsnark库的电路实例。该示例构建了一个具有三层默克尔根的默克尔路径测试。

默克尔树的根使用sha256的哈希函数。

本文关键词:OPE官网,专业电子竞技竞猜平台,OPE电子竞技

本文来源:OPE官网-www.neptunatuna.com

admin

相关文章