最近看知乎,发现知乎上有些文章真的醍醐灌顶。印象比较深的是,文因互联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的实现。
深圳:支持区块链技术和数字货币创新应用:近日,深圳市委推进粤港澳大湾区建设领导小组出台《关于大力支持社会力量参与粤港澳大湾区和中国特色社会主义先行示范区建设的意见》,《意见》提出,支持区块链技术和数字货币创新应用。鼓励科技企业与深圳金融科技研究院等创新机构合作,共同开发区块链底层技术并推动区块链技术在数字货币、防伪认证、跨境支付等领域创新应用。通过政府资助等形式,加快推进与数字货币相关的移动支付和终端安全等关键技术突破。(澎湃新闻)[2020/5/14]
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;
typedeflibsnark::r1cs_constraintConstraintT;
typedeflibsnark::protoboardProtoboardT;
typedeflibsnark::pb_variableVariableT;
typedeflibsnark::pb_variable_arrayVariableArrayT;
typedeflibsnark::pb_linear_combinationLinearCombinationT;
青岛“智能办”平台上线试运行,将区块链等技术与审批业务深度融合:5月7日,青岛“智能办”平台上线试运行,通过“青岛市行政审批微大厅”微信公众号同步新发30项“智能办”事项,其中28个涉企事项,包括社会团体印章备案、人力资源服务许可(延续)等12个业务领域。与“网上审批”“秒批”相比,“智能办”亮点更加突出。技术平台更加先进,建成全省首个、国内领先的综合性“智能办”平台。将大数据、人工智能、区块链等前沿技术与审批业务深度融合,在全省率先建成支撑市、区两级“智能审批”改革的综合性、一体化平台。(青岛日报)[2020/5/9]
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线上的点的个数。
2.2utils.hpp/utils.cpp
utils实现了电路实现中常用的功能性函数。
inlineconstVariableTmake_variable(ProtoboardT&in_pb,conststd::string&annotation)
{
VariableTx;
声音 | Jimmy Nguyen:区块链技术将改变互联网技术 甚至比互联网技术更强大:在2019 T-EDGE新金融峰会暨CHAINSIGHTS金融科技与区块链中国峰会上,Bitcoin Association创始主席Jimmy Nguyen 发表主题演讲表示,区块链和比特币将是引领我们这一代人的主要技术,它会改变互联网技术,甚至比互联网技术更加强大。他进一步解释称,比特币把数据和货币价值通过一个网络协议集合在一起,它给数据赋权,使数据有更大的力量。(钛媒体)[2019/12/8]
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中。
2.3r1cs_gg_ppzksnark_zok
在libsnark的r1cs_gg_ppzksnark的基础上,稍做改动,让以太坊的预编译智能合约能验证groth16的算法。r1cs_gg_ppzksnark_zok目录中的README.md很清晰的解释了改动的原因。
声音 | 民生银行研究院研究员:银行应该主动拥抱区块链技术:11月2日,中国证券报刊发民生银行研究院研究员郭晓蓓的文章《多方发力 促进区块链与金融深度融合》。文章表示,目前区块链在国外落地比较好,比较成熟的应用主要还是数字货币,国内则主要集中在金融、贸易、医疗、供应链管理、慈善、公共管理等行业。其中,金融领域的应用落地案例占80%以上,主要是电子合同、跨境支付、贸易金融中的授信,还有围绕核心企业开展的供应链金融和资产证券化等应用。在金融普惠方面,区块链也大有施展空间。银行应该主动拥抱区块链技术。一是将区块链技术应用融入到银行数字化转型战略中。二是推动区块链技术与实体经济深度融合,解决中小企业融资难、银行风控难、部门监管难的问题。三是重视技术人才储备工作。同时,要深入研判新技术的适用性和安全性。我国构建银行业区块链生态圈也是有可行性的。 一是由监管机构牵头打造银行业区块链生态圈。二是银行机构主动承担或参与区块链生态圈建设。三是依托行业协会或现有联盟打造区块链生态圈。[2019/11/2]
从以太坊的拜占庭硬分叉之后,以太坊引入了基于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文件中读取相应的验证参数进行验证。
声音 | 国务院发展研究中心原副主任侯云春:区块链等技术会对商业企业的现代化带来更多的挑战:据新浪财经消息,“改革与创新”商业领袖国际峰会今天在北京举行,国务院发展研究中心原副主任侯云春出席演讲表示,要紧紧拥抱新一轮技术革命,特别是数字化、网络化、智能化,他们的创新发展在商业领域的实际应用,把云、网、端紧密地无缝衔接,把它融合在一起。可以说市场模式创新在商业领域里发展的最快、运用得最好,但是这个并没有说到了一个止境,而是随着形势的发展,不断地有新的问题、新的矛盾、新的模式要涌现出来,特别是下一步制度化的发展,互联网、物联网以及区块链这些技术应用,万物互联,会对商业企业的现代化带来更多的挑战,也带来更多的机遇和技术支撑。[2019/1/16]
2.4poseidon
poseidon算法的实现在gadgets/poseidon.hpp文件中。
template
usingPoseidon128=Poseidon_gadget_T<6,1,8,57,nInputs,nOutputs,constrainOutputs>;
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函数。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。