木星链 木星链
Ctrl+D收藏木星链
首页 > 火必 > 正文

NAR:技术|零知识证明 - ethsnarks源代码导读

作者:

时间:1900/1/1 0:00:00

最近看知乎,发现知乎上有些文章真的醍醐灌顶。印象比较深的是,文因互联CEO鲍捷的一篇文章:最快的成长方式就是慢慢来。创业最关键的能力,就是“不被卡住”的能力。这才是“探索力”的根本,是创业“执行力”的核心。

很多人都熟悉让别人告知一个明确的目标,然后清晰的执行。但是,创业是一种探索,没有人会告诉你这样的明确的目标。探索,是一种反人性的活动。大多数人会对探索畏惧,恐惧,抵触,茫然。

“不被卡住”,需要掌握好“任务分解,快速迭代”的方法论,需要建立“交付”的态度,需要“勤于沟通”,需要”不固执己见“,更需要”不断复盘“。”不被卡住“,还有个要注意的是,有多少本钱打多少仗,不要总想着打大仗,要学会从小仗慢慢打。

ethsnarks在libsnark的基础上,实现了以太坊上与zkSNARK相关的智能合约和电路。ethsnarks本身也是libsnark应用很好的学习示例。

ethsnarks的源代码地址:

https://github.com/HarryR/ethsnarks.git

本文中使用的ethsnarks源代码的最后一个commit如下:

commit9adc64355adb9154ba5042c0fadf84c438b8a08a

Author:WanseobLim

Date:FriAug1601:49:192019+0900

AddFrfieldclasstothefield.py

01源代码结构

contracts-实现了groth16的验证智能合约,椭圆曲线的计算,MerkleTree以及MiMCHash计算的智能合约。这些智能合约可以通过truffle进行部署测试。部署相关的脚本在migrations目录下。

ethsnarks-python实现的相关功能,包括pedersen/mimc/poseidon等hash函数,groth16验证,以及椭圆曲线的计算。

test-以上两个功能的测试代码,采用python语言实现。

depends-依赖库,包括libsnark,libfqfft等等。

src-基于libsnark的gadget1库实现的更多的gadget。本文着重介绍这些gadget的实现。

星际联盟CEO范国连:分布式存储技术拥有不可限量的未来潜力:据官方消息,星际联盟CEO范国连以“面对数据存储万亿级金,我们该如何选择优质综合服务商?”为主题,发表了精彩的演讲。范总为大家讲解了当前参与分布式存储生态领域的几类公司,以及选择优质综合服务商的六大标准:技术、价格、市场、战略、团队规范以及强大的后方支持。

收益及合作的长久性,取决于战略的长远性;战略与眼光取决于创始团队的基因;扎实的技术实力,如封装速度、出块优化、集群稳定性等则是硬实力的象征。而营销能力则决定市场占有率,单T性价比则是吸引用户的直接要素。通过详细分析这六大标准可以看出,星际联盟作为全球领先的分布式存储综合服务商,在行业已然遥遥领先。此外,范总还向大家介绍了星际联盟的产品与合作方案,包括C端与B端。

分布式存储技术拥有不可限量的未来潜力,去中心化分布式存储行业是万亿级别的赛道。选择大于努力,选择一家优质的矿商是至关重要的。星际联盟坚持“匠心品质·洞见未来”的产品理念,为构建信息和谐的行业生态而努力,持续为客户创造价值;秉承“以敬畏·敬无畏”的精神,致敬这个时代里勇敢向前、勇于创新的人。星际联盟期待与大家的合作。[2021/4/17 20:30:45]

02gadget实现

src目录下的源代码结构如下:

2.1ethsnarks.hpp

libsnark的gadget1库主要围绕sha256实现各种gadgets。ethsnarks在alt_bn128这条椭圆曲线上实现了基于Field的hash函数。

libsnark的电路中各种定义都非常长。libsnark定义一个变量数组类型:pb_variable_array。

ethsnarks.hpp精简了在alt_bn128这条椭圆曲线相关的类型声明:

namespaceethsnarks{

typedeflibff::bigintLimbT;

typedeflibff::alt_bn128_G1G1T;

typedeflibff::alt_bn128_G2G2T;

typedeflibff::alt_bn128_ppppT;

typedeflibff::FqFqT;

typedeflibff::FrFieldT;

动态 | Harmony发布技术更新报告:最小化作恶节点影响:据Harmony官方推特,目前已对测试网络进行技术更新。 此次技术更新有两点: 1. 已经在Harmony测试网络上测试了视图更改协议,最小化了恶意领导者对Harmony协议的影响; 2. 同时增加了对CPU、内存和一般机器状态的验证器节点监控。这将有助于测试网/主网的网络状态检查。[2019/6/10]

typedeflibsnark::r1cs_constraintConstraintT;

typedeflibsnark::protoboardProtoboardT;

typedeflibsnark::pb_variableVariableT;

typedeflibsnark::pb_variable_arrayVariableArrayT;

typedeflibsnark::pb_linear_combinationLinearCombinationT;

typedeflibsnark::pb_linear_combination_arrayLinearCombinationArrayT;

typedeflibsnark::linear_termLinearTermT;

typedeflibsnark::gadgetGadgetT;

typedeflibsnark::r1cs_gg_ppzksnark_zok_proofProofT;

typedeflibsnark::r1cs_gg_ppzksnark_zok_proving_keyProvingKeyT;

typedeflibsnark::r1cs_gg_ppzksnark_zok_verification_keyVerificationKeyT;

typedeflibsnark::r1cs_gg_ppzksnark_zok_primary_inputPrimaryInputT;

typedeflibsnark::r1cs_gg_ppzksnark_zok_auxiliary_inputAuxiliaryInputT;

}

其中,FieldT特指在alt_bn128线上的点的个数。

动态 | 美剧《亿万》最新一集多次提及区块链技术:据BitcoinExchangeGuide消息,由Showtime制作公司出品的美剧《亿万》(Billions)在最新播出的一集中(第四季第八集)中出现了区块链技术,并被反复提及。在该集中,剧中人们提出了使用区块链技术来建立投票系统的想法,人们可以用手机进行投票。[2019/5/7]

2.2utils.hpp/utils.cpp

utils实现了电路实现中常用的功能性函数。

inlineconstVariableTmake_variable(ProtoboardT&in_pb,conststd::string&annotation)

{

VariableTx;

x.allocate(in_pb,annotation);

returnx;

}

make_variable创建一个VariableT。

constVariableArrayTflatten(conststd::vector&in_scalars)

{

size_ttotal_sz=0;

for(constauto&scalar:in_scalars)

total_sz+=scalar.size();

VariableArrayTresult;

result.resize(total_sz);

size_toffset=0;

for(constauto&scalar:in_scalars)

{

for(size_ti=0;i<scalar.size();i++)

{

result.index=scalar.index;

}

}

returnresult;

}

flatten函数将多个VariableArrayT合并成一个VariableArray。其实也很简单,就是把VariableArray中的index都合并到一个VariableArray中。

动态 | 试点之后埃森哲的区块链技术即将全面推出:7月27日消息,全球IT服务巨头埃森哲很快将在亚太地区和北美地区的两个石油和天然气地区,推出它的区块链解决方案,并且大部分工作实施都是由该公司在印度的先进技术中心完成的。[2018/7/27]

2.3r1cs_gg_ppzksnark_zok

在libsnark的r1cs_gg_ppzksnark的基础上,稍做改动,让以太坊的预编译智能合约能验证groth16的算法。r1cs_gg_ppzksnark_zok目录中的README.md很清晰的解释了改动的原因。

从以太坊的拜占庭硬分叉之后,以太坊引入了基于ALT_BN128的配对函数计算的预编译合约,合约实现的功能如下:

给定ALT_BN128上两个基点一系列的点(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)=1

r1cs_gg_ppzksnark_zok目录就是实现如上的改动。同时提供了stubs.hpp/stubs.cpp,从json文件中读取相应的验证参数进行验证。

2.4poseidon

poseidon算法的实现在gadgets/poseidon.hpp文件中。

template

usingPoseidon128=Poseidon_gadget_T<6,1,8,57,nInputs,nOutputs,constrainOutputs>;

加拿大政府正尝试利用区块链技术来提升政府工作的透明度和被信任度:据Bitcoinist报道,加拿大国家研究委员会(NRC)已经开始尝试利用区块链技术来提升政府工作的透明度和被信任度,NRC希望能够利用以太坊技术中的智能合约系统来提升资金信息披露程度和出纳细节的透明度,而此项新的尝试NRC已通过发送相关信息给加拿大区块链公司Bitaccess来测试以太坊相关技术的实施。NRC对此表示,区块链技术是很多创新型专家都认可的未来方向,一旦数据进入区块链中,它便是安全且不可修改的,通过区块链所产生的信任,将会成为公众对政府信任的基础。[2018/2/26]

Poseidon128是Poseidon_gadget_T的一个实例。前面四个参数是poseidon算法的参数,后续会写文章详细介绍poseidon算法以及这些参数的含义。nInputs指定算法的输入的个数,nOutputs指定输出的个数,contrainOutputs指定是否对输出进行约束。

Poseidon_gadget_T的构造函数如下:

Poseidon_gadget_T(

ProtoboardT&pb,

constVariableArrayT&in_inputs,

conststd::string&annotation_prefix

):

GadgetT(pb,annotation_prefix),

inputs(in_inputs),

constants(poseidon_params()),

first_round(pb,constants.C,constants.M,in_inputs,FMT(annotation_prefix,".round")),

prefix_full_rounds(

make_rounds(

1,partial_begin,pb,

first_round.outputs,constants,annotation_prefix)),

partial_rounds(

make_rounds(

partial_begin,partial_end,pb,

prefix_full_rounds.back().outputs,constants,annotation_prefix)),

suffix_full_rounds(

make_rounds(

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",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函数实现。

template

staticconststd::vectormake_rounds(

unsignedn_begin,unsignedn_end,

ProtoboardT&pb,

conststd::vector>&inputs,

constPoseidonConstants&constants,

conststd::string&annotation_prefix)

{

std::vectorresult;

result.reserve(n_end-n_begin);

for(unsignedi=n_begin;i<n_end;i++)

{

constauto&state=(i==n_begin)?inputs:result.back().outputs;

result.emplace_back(pb,constants.C,constants.M,state,FMT(annotation_prefix,".round",i));

}

returnresult;

}

make_rounds就是为每一轮准备合适的参数。每一轮的具体实现通过Poseidon_Round实现。

在Poseidon_Round的封装下,Poseidon_gadget_T的generate_r1cs_constraints以及generate_r1cs_witness相对简单,小伙伴们可以自行查看源代码。

03示例代码

在ethsnarks的基础上,实现Poseidon函数的电路就非常简单了。构造一个简单的电路,给大家参考一下。

电路的需求:实现Poseidon计算,输入为两个FieldT,输出为一个FieldT。输出作为电路的publicinput。

#include"ethsnarks.hpp"

#include"gadgets/poseidon.hpp"

usingnamespaceethsnarks;

namespacetestproject{

usingTestHash=Poseidon128<2,1>;

classtest_gadget:publicGadgetT{

public:

VariableToutput;

VariableTinput0;

VariableTinput1;

TestHashtHash;

test_gadget(

ProtoboardT&pb,

conststd::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"))

{

}

voidgenerate_r1cs_witness(

ethsnarks::FieldTw_input0,

ethsnarks::FieldTw_input1,

ethsnarks::FieldTw_output)

{

pb.val(input0)=w_input0;

pb.val(input1)=w_input1;

pb.val(output)=w_output;

tHash.generate_r1cs_witness();

}

voidgenerate_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实现各种gadgets。ethsnarks在alt_bn128这条椭圆曲线上实现了基于Field的hash函数。

标签:NARARKPUTCONSonarWatchbulwarkPutinCoinConvex Finance

火必热门资讯
比特币:鼓捣币:芝加哥对交易所的努力 在今日获得成功记录

芝加哥商品交易所(CME)官方刚刚发布推特称,在第三季度,机构投资者对CME比特币期货的兴趣继续增长,持有大量未平仓比特币期货(25+BTC)的机构投资者创下了纪录.

1900/1/1 0:00:00
VLS:GJ比特国际数字资产平台K板上线VLS

尊敬的GJGlobal用户:GJ比特国际数字资产平台即将开始VLS充值上币活动,具体内容如下:充值时间:新加坡时间2019年10月18日12:00-2019年10月21日12:00交易时间:新加.

1900/1/1 0:00:00
EOS:鲸交所:高配版的去中心化交易所

本文作者:风口渊要说EOS最火热的时候,应该是去年六月EOS要上主网的那段时间。同时气氛被带动起来的、还有币圈大佬们参与竞选的“超级节点”.

1900/1/1 0:00:00
HTT:LOEx国际站关于CBE下线公告

尊敬的LOEx用户:LOEx国际站将于10月12日12:00关闭CBE交易对和充币,所有CBE/USDT交易对的挂单用户,请提前撤单;持有CBE的用户尽快将资产提现至其他平台.

1900/1/1 0:00:00
WELL:注意了!XRP一年一度的暴涨机会即将到来

当地时间11月7-8日,Ripple一年一度的Swell2019年度会议将在新加坡举行,包括印度央行前行长RaghuramRajan博士、新加坡外交部大使ChanHengChee以及芝加哥大学金.

1900/1/1 0:00:00
BIKI:BiKi平台关于EYES隐藏交易对并限期整改的公告(1011)

尊敬的用户:经与EYES项目方沟通,针对不满足平台要求的问题进行限期调整,并在调整符合平台基本要求前限制交易对在正常交易区展示.

1900/1/1 0:00:00