首页
 
河北省保定市港闸区赛时大楼552号
400-123-4567
+86-123-4567
admin@sneaker-daily.com
570000

非公有制经济动态

【美狮会】ethsnarks源代码导读

来源:点击:时间:2024-05-15 03:52
本文摘要:最近看知乎,找到知乎上有些文章知道醍醐灌顶。

最近看知乎,找到知乎上有些文章知道醍醐灌顶。印象较为浅的是,文因网络CEO 鲍捷的一篇文章:最慢的茁壮方式就是慢慢来。创业最关键的能力,就是“不被卡住”的能力。这才是“探寻力”的显然,是创业“执行力”的核心。

很多人都熟知让别人告诉一个具体的目标,然后明晰的继续执行。但是,创业是一种探寻,没有人不会告诉他你这样的具体的目标。探寻,是一种反人性的活动。

大多数人会对探寻惧怕,不安,违背,茫然。“不被卡住”,必须掌控好“任务分解成,较慢递归”的方法论,必须创建“交付给”的态度(每个时期完结都有可交付给的状态),必须“精于交流”, 必须”不固执己见“,更加必须”大大复盘“。”不被卡住“,还有个要留意的是,有多少本钱打多少仗,不要总就让打大仗,要学会自小仗渐渐打。

ethsnarks在libsnark的基础上,构建了以太坊上与zkSNARK涉及的智能合约和电路。ethsnarks本身也是libsnark应用于很好的自学示例。ethsnarks的源代码地址:https://github.com/HarryR/ethsnarks.git本文中用于的ethsnarks源代码的最后一个commit如下:commit 9adc64355adb9154ba5042c0fadf84c438b8a08aAuthor: Wanseob Lim [emailprotected]Date: Fri Aug 16 01:49:19 2019 +0900Add Fr field class to the field.py1. 源代码结构contracts - 构建了groth16的检验智能合约(Verifier.sol),椭圆曲线的计算出来,MerkleTree以及MiMC Hash计算出来的智能合约。这些智能合约可以通过truffle展开部署测试。

部署涉及的脚本在migrations目录下。ethsnarks - python构建的涉及功能,还包括pedersen/mimc/poseidon等hash函数,groth16检验,以及椭圆曲线的计算出来。

test - 以上两个功能的测试代码,使用python语言构建。depends - 倚赖库,还包括libsnark,libfqfft等等。src - 基于libsnark的gadget1库构建的更好的gadget。

本文侧重讲解这些gadget的构建。2. gadget构建src目录下的源代码结构如下:2.1 ethsnarks.hpplibsnark的gadget1库主要环绕sha256(基于bit的hash函数)构建各种gadgets。ethsnarks在alt_bn128这条椭圆曲线上构建了基于Field的hash函数(mimc,pedersen,poseidon等)。

libsnark的电路中各种定义都十分宽。libsnark定义一个变量数组类型:pb_variable_arrayFieldT。

ethsnarks.hpp精简了在alt_bn128这条椭圆曲线涉及的类型声明:namespace ethsnarks {typedef libff::bigintlibff::alt_bn128_r_limbs LimbT;typedef libff::alt_bn128_G1 G1T;typedef libff::alt_bn128_G2 G2T;typedef libff::alt_bn128_pp ppT;typedef libff::FqppT FqT;typedef libff::FrppT FieldT;typedef libsnark::r1cs_constraintFieldT ConstraintT;typedef libsnark::protoboardFieldT ProtoboardT;typedef libsnark::pb_variableethsnarks::FieldT VariableT;typedef libsnark::pb_variable_arrayFieldT VariableArrayT;typedef libsnark::pb_linear_combinationFieldT LinearCombinationT;typedef libsnark::pb_linear_combination_arrayFieldT LinearCombinationArrayT;typedef libsnark::linear_termFieldT LinearTermT;typedef libsnark::gadgetethsnarks::FieldT GadgetT;typedef libsnark::r1cs_gg_ppzksnark_zok_proofppT ProofT;typedef libsnark::r1cs_gg_ppzksnark_zok_proving_keyppT ProvingKeyT;typedef libsnark::r1cs_gg_ppzksnark_zok_verification_keyppT VerificationKeyT;typedef libsnark::r1cs_gg_ppzksnark_zok_primary_inputppT PrimaryInputT;typedef libsnark::r1cs_gg_ppzksnark_zok_auxiliary_inputppT AuxiliaryInputT;}其中,FieldT特指在alt_bn128线上的点的个数。2.2 utils.hpp/utils.cpputils构建了电路构建中常用的功能性函数。inline const VariableT make_variable( ProtoboardT in_pb, const std::string annotation ){VariableT x;x.allocate(in_pb, annotation);return x;}make_variable创立一个VariableT。

const VariableArrayT flatten( const std::vectorVariableArrayT in_scalars ){size_t total_sz = 0;for( const auto scalar : in_scalars )total_sz += scalar.size(); VariableArrayT result;result.resize(total_sz);size_t offset = 0;for( const auto scalar : in_scalars ){for( size_t i = 0; iscalar.size(); i++ ){result[offset++].index = scalar[i].index;}}return result;}flatten函数将多个VariableArrayT拆分成一个VariableArray。只不过也很非常简单,就是把VariableArray中的index都拆分到一个VariableArray中。2.3 r1cs_gg_ppzksnark_zok在libsnark的r1cs_gg_ppzksnark的基础上,略为做到改动,让以太坊的预编译器智能合约能检验groth16的算法。r1cs_gg_ppzksnark_zok目录中的README.md很明晰的说明了改动的原因。

从以太坊的拜占庭软末端之后,以太坊引进了基于ALT_BN128的筛选函数计算出来的预编译器合约,合约构建的功能如下:等价ALT_BN128上两个基点(G1/G2)一系列的点(a1, b1, a2, b2, ..., ak, bk),实编译器合约能检查:e(a1, b1) * ... * e(ak, bk) 否相等1?Groth16原先的检验系数为:vk.alpha_beta,vk.gamma以及vk.delta。Groth16的检验等式为:vk.alpha_beta = e(A, B) * e(-x, vk.gamma) * e(-C, vk.delta)其中vk.alpha_beta为e(alpha, beta)。

如果必要用之前的检验等式,以太坊上的预编译器合约不了构建。在不影响Groth16的安全性的情况下,将Groth16的检验系数变成:vk.alpha,网卓新闻网,vk.beta,vk.gamma以及vk.delta。Groth16的检验等式也变成:e(A, B) * e(-x, vk.gamma) * e(-C, vk.delta) * e(-alpha, beta) = 1r1cs_gg_ppzksnark_zok目录就是构建如上的改动。

同时获取了stubs.hpp/stubs.cpp,从json文件中加载适当的检验参数展开检验。2.4 poseidonposeidon算法的构建在gadgets/poseidon.hpp文件中。templateunsigned nInputs, unsigned nOutputs, bool constrainOutputs=trueusing Poseidon128 = Poseidon_gadget_T6, 1, 8, 57, nInputs, nOutputs, constrainOutputs;Poseidon128是Poseidon_gadget_T的一个实例。前面四个参数是poseidon算法的参数,先前不会写文章详尽讲解poseidon算法以及这些参数的含义(6,1,8,57是配置文件的配备)。

nInputs登录算法的输出的个数,nOutputs登录输入的个数,contrainOutputs登录否对输入展开约束。Poseidon_gadget_T的构造函数如下:Poseidon_gadget_T(ProtoboardT pb,const VariableArrayT in_inputs,const std::string annotation_prefix) :GadgetT(pb, annotation_prefix),inputs(in_inputs),constants(poseidon_paramsparam_t, param_F, param_P()),first_round(pb, constants.C[0], constants.M, in_inputs, FMT(annotation_prefix, ".round[0]")),prefix_full_rounds(make_roundsFullRoundT(1, partial_begin, pb,first_round.outputs, constants, annotation_prefix)),partial_rounds(make_roundsPartialRoundT(partial_begin, partial_end, pb,prefix_full_rounds.back().outputs, constants, annotation_prefix)),suffix_full_rounds(make_roundsFullRoundT(partial_end, total_rounds-1, pb,partial_rounds.back().outputs, constants, annotation_prefix)),last_round(pb, constants.C.back(), constants.M, suffix_full_rounds.back().outputs, FMT(annotation_prefix, ".round[%u]", total_rounds-1)),_output_vars(constrainOutputs ? make_var_array(pb, nOutputs, ".output") : VariableArrayT()){}poseidon算法的计算出来由好几轮构成:first_round(第一轮),prefix_full_rounds(预处理,原始轮),partial_rounds(中间,不原始轮),suffix_full_rounds(后处理,原始轮)以及last_round(最后一轮)。

_output_vars是输入的变量。这些轮都是通过make_rounds函数构建。templatetypename Tstatic const std::vectorT make_rounds(unsigned n_begin, unsigned n_end,ProtoboardT pb,const std::vectorlibsnark::linear_combinationFieldTinputs,const PoseidonConstants constants,const std::string annotation_prefix){std::vectorT result;result.reserve(n_end - n_begin);for( unsigned i = n_begin; in_end; i++ ){const auto state = (i == n_begin) ? inputs : result.back().outputs;result.emplace_back(pb, constants.C[i], constants.M, state, FMT(annotation_prefix, ".round[%u]", i));}return result;}make_rounds就是为每一轮打算适合的参数。

每一轮的明确构建通过Poseidon_Round构建。在Poseidon_Round的PCB下,Poseidon_gadget_T的generate_r1cs_constraints以及generate_r1cs_witness比较非常简单,小伙伴们可以自行查阅源代码。3. 示例代码在ethsnarks的基础上,构建Poseidon函数的电路就非常简单了。

结构一个非常简单的电路,给大家参照一下。电路的市场需求:构建Poseidon计算出来,输出为两个FieldT,输入为一个FieldT。输入作为电路的public input。#include "ethsnarks.hpp"#include "gadgets/poseidon.hpp"using namespace ethsnarks;namespace testproject {using TestHash = Poseidon1282, 1;class test_gadget : public GadgetT {public: VariableT output;VariableT input0;VariableT input1; TestHash tHash;test_gadget(ProtoboardT pb,const std::string prefix) : GadgetT(pb, prefix), output(make_variable(pb, FMT(prefix, ".output"))),input0(make_variable(pb, FMT(prefix, ".input0"))),input1(make_variable(pb, FMT(prefix, ".input1"))),tHash(pb, create_var_array({input0, input1}), FMT(prefix, ".testhash")){}void generate_r1cs_witness(ethsnarks::FieldT w_input0,ethsnarks::FieldT w_input1,ethsnarks::FieldT w_output){pb.val(input0) = w_input0;pb.val(input1) = w_input1;pb.val(output) = w_output;tHash.generate_r1cs_witness();}void generate_r1cs_constraints(){ pb.set_input_sizes(1);tHash.generate_r1cs_constraints();pb.add_r1cs_constraint(ConstraintT(output, 1, tHash.result()),FMT(annotation_prefix, " output == Poseidon(input0 || input1)"));}};};总结:ethsnarks在libsnark的基础上,构建了以太坊上与zkSNARK涉及的智能合约和电路。

ethsnarks本身也是libsnark应用于很好的自学示例。libsnark的gadget1库主要环绕sha256(基于bit的hash函数)构建各种gadgets。ethsnarks在alt_bn128这条椭圆曲线上构建了基于Field的hash函数(mimc,pedersen,poseidon等)。


本文关键词:美狮会

本文来源:美狮会-www.sneaker-daily.com