最近看知乎,發現知乎上有些文章真的醍醐灌頂。印象比較深的是,文因互聯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的實現。
現場丨朱嘉偉:公有鏈技術在中國發展需要一條合法合規、符合監管的道路:金色財經現場報道,BSN開放聯盟鏈項目全球啟動儀式今日在京舉行。火幣集團首席運營官朱嘉偉在啟動儀式上表示,因為法律法規和監管要求以及公有鏈產品定位等原因,一直以來公有鏈技術在中國境內的推廣缺少有效的方法和渠道。若要讓公有鏈技術在中國境內健康發展,勢必需要一條合法合規、符合監管要求的道路。以BSN國內公共城市節點為基礎,通過對公有鏈進行許可化改造,使其成為部署在BSN生態內并可接受監管的“開放聯盟鏈”,是目前公有鏈技術進入中國,并合法合規在中國發展最直接和有效的路徑。火幣集團會不遺余力,致力于貢獻BSN的長期建設和發展,讓BSN成為全球最大的合規區塊鏈網絡。[2020/9/27]
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;
聲音 | 工信部網安局副局長:積極引導區塊鏈等技術在網絡安全領域的應用:信部網安局副局長陶青在接受采訪時表示,工信部立足行業監管責任,著力推進行業網絡安全保障體系建設,全力營造安全可信的網絡環境。下一步,工信部將從三方面推動網絡空間體系建設。一是瞄準網絡安全核心技術,加快前沿布局,推進網絡安全核心技術的創新與深化應用,積極引導人工智能、區塊鏈等技術在網絡安全領域的應用,實現產業鏈、資金鏈有效管理,培育良好的網絡安全市場環境產業生態體系。二是防范新風險。三是共建新環境。(人民郵電報)[2019/12/9]
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線上的點的個數。
2.2utils.hpp/utils.cpp
utils實現了電路實現中常用的功能性函數。
inlineconstVariableTmake_variable(ProtoboardT&in_pb,conststd::string&annotation)
聲音 | 海通證券黨委副書記:區塊鏈等技術目前深度應用于金融行業的業務場景當中:金色財經報道,11月27日,以“人工智能與金融創新”為主題的2019金融發展高峰論壇在上海舉辦。海通證券黨委副書記、董事、總經理,海通國際控股、海通國際證券董事局主席瞿秋平表示,對于金融科技相關的技術我們用英文字母縮寫為ABCDMI,大家知道A代表人工智能、B代表區塊鏈、C代表云計算,D代表數據,M代表移動,I代表物聯網。這些技術目前深度應用于金融行業的業務場景當中,這些技術與證券行業的經濟業務、投資業務、投研業務、資管業務等業務形態相結合,助力證券公司的轉型。[2019/11/28]
{
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中。
2.3r1cs_gg_ppzksnark_zok
聲音 | 經濟學家曹和平:可基于區塊鏈技術打造具有商業服務器性質的物流園區:據四川日報報道,經濟學家、北京大學經濟學院教授曹和平說,以前搞物流首先是修路架橋,如今交通基礎設施不斷完善,應加強網絡基礎設施建設,基于區塊鏈技術,打造具有商業服務器性質的物流園區,配合建設超級搜索分發平臺,讓人流、貨流、信息流、資金流充分對接。四川擁有電子科大等一批高校資源,應當充分發揮數字人才優勢,打造數字智能商務平臺,為物流產業發展賦能。[2019/9/21]
在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
高偉達澄清:截至目前,公司在2017年的業務收入中并未有關于區塊鏈技術的研發成果而直接產生的業務收入:選股寶注:近期投資者市場比較關注區塊鏈技術,市場上出現“高偉達作為區塊鏈概念股”等傳言。部分投資者認為高偉達屬于區塊鏈概念,公司股價隨之上漲。[2018/1/10]
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函數。
尊敬的ZG.TOP用戶:ZG.TOP將于2019年10月09日12:00正式開啟ZGLabs幣者榮耀staking模式,首期項目為HFC。活動詳情請前往活動頁面查看.
1900/1/1 0:00:00活動時間:10月1日00:00:00-10月7日23:59:59活動獎勵:價值1,000,000美元的IT 活動規則: 1活動期間,IDAX實名用戶點擊進入IDAX官網首頁-信用卡購買.
1900/1/1 0:00:00親愛的BKEXer: 為感恩回饋廣大用戶,BKEXGlobal聯合ADMFund舉行“‘攀登者’計劃之ADF大放送”活動.
1900/1/1 0:00:00親愛的用戶: 為更好的服務用戶,Binance升級了充值、提現方式。發行在幣安鏈的BTCB、USDSB、TUSDB資產余額將合并至BTC、USDS、TUSD,具體安排如下:香港時間2019年09.
1900/1/1 0:00:00撰文:AshEgan,就職于科技風險投資機構AccompliceVCDeFi這個詞是2017年造出來的,此后發展迅猛,把各種各樣的金融事務拆分成一個開放的、免許可的系統.
1900/1/1 0:00:00火幣礦池正式上線CKB測試網礦池,支持CKB測試網挖礦。CKB挖礦算法為Ealgesong,當前支持N卡和A卡挖礦.
1900/1/1 0:00:00