libsnark是目前實現zk-SNARKs電路最重要的框架,在眾多私密交易或隱私計算相關項目間廣泛應用,其中最著名當然要數Zcash。Zcash在Sapling版本升級前一直使用libsnark來實現電路。毫不夸張地說,libsnark支撐并促進了zk-SNARKs技術的
首次大規模應用,填補了零知識證明技術從最新理論到工程實現間的空缺。
希望通過本系列文章,所有開發者都能親自上手實踐,在短時間內迅速入門libsnark,一步步了解libsnark的基本概念,學會如何開發zk-SNARKs電路,完成證明的生成和驗證,最終將零知識證明應用到真實業務中去。
1、zk-SNARKs和libsnark背景簡介
零知識證明,可能是目前最具應用前景和想象力的密碼學黑科技。而zk-SNARKs正是一類零知識證明方案的簡稱,全稱為Zero-KnowledgeSuccinctNon-interactiveArgumentsofKnowledge。這一名字幾乎包含了其所有技術特征,即可以在不泄露任何其他信息的前提下證明一個命題的正確性,并且最終生成的證明具有簡潔性,也就是說最終生成的證明足夠小,并且與計算量大小無關,是一個常數。用白話說就是,你理論上可以在不暴露任何隱私的情況下向其他所有人證明某件事,并且生成的證明體積很小,校驗成本很低,與需要證明的內容計算量無關。聽起來簡直太美好了!
zk-SNARKs能應用到很多場景,比如隱私保護、區塊鏈擴容、可驗證計算等。本文不介紹zk-SNARKS和零知識證明的理論細節,不熟悉或想深入了解的同學可閱讀其他文章或論文。
如Vitalik寫的關于zk-SNARKs著名的三篇博文。
https://medium.com/
第一步,我們需要將函數?C(x,out)?在libsnark中進行表達。此處先省略,后面介紹詳細過程。
第二步,對應下面的Generator函數(
G),lambda?為隨機產生,也就是常說的trustedsetup過程中產生的"toxicwaste"。人們喜歡稱它為“有廢物”,是因為它必須被妥善處理,否則會影響證明協議安全。
lambda<-random()
(pk,vk)=G(C,lambda)
最終生成provingkey(pk)和verificationkey(vk)。
第三步,對應使用Prove函數(
P)生成證明。這里想證明的是prover知道一個秘密值?x?和計算結果?out?可使等式滿足。因此將?x、out?還有?pk?作為輸入一起傳給?
P,最終生成證明?proof。
proof=P(pk,out,x)
第四步,對應使用Verify函數(
V)驗證證明,將?proof、out?還有?vk?傳給?
G,即可在不暴露秘密的情況下證明存在一個秘密值可使等式滿足。
共為2020 | 工信部相里朋:國內區塊鏈在關鍵技術上對國外開源項目依存度高達70%:金色財經現場報道,2020年6月21日,由金色財經主辦的共為2020·區塊鏈創新應用論壇在深圳拉開帷幕。本次會議由幣核科技冠名贊助、HBTC作為戰略合作企業。工業和信息化部電子第五研究所高級工程師相里朋現場進行《布局:區塊鏈技術與應用市場之路》主題演講指出,截止2020年6月,國內活躍企業1000余家,實際注冊聯盟94個,集中在北上深杭廣等地,區塊鏈硬件、平臺、應用、咨詢產業鏈條已初步形成。從區塊鏈企業的地域分布情況看,中國區塊鏈公司與項目融資主要集中在粵港澳地區、環渤海地區、長三角地區和陜湘渝地區。
目前看來,區塊鏈產業發展尚需培育,區塊鏈相關投顧、媒體、咨詢、技術服務等產業上下游盈利困難,最終會形成區塊鏈產業,還只是區塊鏈技術,尚需要時間證明。國內區塊鏈技術對國外開源項目的依存度高,據不完全統計,核心技術、關鍵技術上對外依存度高達70%。國內區塊鏈應用探索較多,類型遠比國外豐富,但因研發資金匱乏、人才能力錯位導致持續創新乏力。[2020/6/21]
V(vk,out,proof)?=true
而
開發者主要工作量就集中在第一步,需要按照libsnark的接口規則手寫C++電路代碼來描述命題,由代碼構造R1CS約束。整個過程也即對應下圖的Computation->ArithmeticCircuit->R1CS。
3、搭建zk-SNARKs應用開發環境
下面進入動手環節,快速上手libsnark,跑通例子。
先下載本文對應的libsnark最小可用例子代碼庫?libsnark_abc。
gitclonehttps://github.com/sec-bit/libsnark_abc.git
通過gitsubmodule拉取libsnark代碼。
cdlibsnark_abc
gitsubmoduleupdate--init--recursive
參考libsnark?項目文檔完成相關依賴安裝。以Ubuntu16.04LTS為例,需安裝以下組件:
sudoapt-getinstallbuild-essentialcmakegitlibgmp3-devlibprocps4-devpython-markdownlibboost-all-devlibssl-dev
初始化?build?文件夾。
mkdirbuild&&cdbuild&&cmake..
這步在macOS系統可能會遇到問題,參考這個issue?處理。或嘗試使用以下命令:
聲音 | 江蘇省政協委員:希望以區塊鏈技術為核心建設學習型社區:金色財經報道,1月15日下午,江蘇省政協委員、光華教育集團董事長、鹽城外國語學校董事長魯育宗表示,我們希望通過有效整合資源,以區塊鏈技術為核心,充分利用現有高等院校、職業院校、社會學習中心等各類型學校和企業、社會資源,建設一個集在線教育、學分銀行以及數據與人才中心等功能于一體的學習型社區,以學生為中心建設新的專業人才培養和供應體系,打造人才培養共同體,為社會培養更多更好的人才,為建設‘學習型社會’作出新的貢獻。[2020/1/16]
mkdirbuild&&cdbuild&&CPPFLAGS=-I/usr/local/opt/openssl/includeLDFLAGS=-L/usr/local/opt/openssl/libPKG_CONFIG_PATH=/usr/local/opt/openssl/lib/pkgconfigcmake-DWITH_PROCPS=OFF-DWITH_SUPERCOP=OFF..
成功后,依舊在?build?目錄進行編譯。
make
編譯成功后,在?build/src?目錄中可看到3個二進制文件。
main
range
test
到這兒,你就以及完成示例項目的編譯啦。嘗試運行示例代碼吧。
./src/main
最終出現如下日志,則說明一切正常。你已順利擁有了zkSNARK應用開發環境,并成功跑了第一個zk-SNARKs的demo。
4、理解示例代碼
下面我們一起來仔細瞅瞅代碼。示例項目包含了3份代碼。
不妨先看看?src/main.cpp。這個例子來自HowardWu的?libsnark_tutorial,他也是libsnark作者之一哦。本文?libsnark_abc?的項目結構就是依照他的?libsnark_tutorial?搭建,屬于“官方推薦風格”,請放心食用。
只有區區幾十行代碼,其中?run_r1cs_gg_ppzksnark()?是主要部分。很容易發現,真正起作用的實質代碼只有下面5行。
r1cs_gg_ppzksnark_keypair<ppT>keypair=r1cs_gg_ppzksnark_generator<ppT>(example.constraint_system);
r1cs_gg_ppzksnark_processed_verification_key<ppT>pvk=r1cs_gg_ppzksnark_verifier_process_vk<ppT>(keypair.vk);
r1cs_gg_ppzksnark_proof<ppT>proof=r1cs_gg_ppzksnark_prover<ppT>(keypair.pk,example.primary_input,example.auxiliary_input);
聲音 | OKEx CEO Jay:區塊鏈始終只是一種提高社會效率的技術工具:OKEx CEO Jay Hao今日轉發微博稱,關于區塊鏈的應用的很多設想現在看起來都像天方夜譚,像極了90年代初比爾蓋茨像全世界介紹“什么是互聯網”。區塊鏈始終只是一種提高社會效率的技術工具,很多人開口閉口就是顛覆。這一點,我十分認可俞校長:這個路徑很長,不是瞬間就能做成的。[2019/12/30]
constboolans=r1cs_gg_ppzksnark_verifier_strong_IC<ppT>(keypair.vk,example.primary_input,proof);
constboolans2=r1cs_gg_ppzksnark_online_verifier_strong_IC<ppT>(pvk,example.primary_input,proof);
僅從“超長”的函數名就能看出來每步是在做什么,但是卻看不到如何構造電路的細節。實際上這里僅僅是調用了自帶的?r1cs_example,隱去了實現細節。
既然如此,那讓我們通過一個更直觀的例子來學習電路細節。研究?src/test.cpp,這個例子改編自ChristianLundkvist的?libsnark-tutorial(https://github.com/christianlundkvist/libsnark-tutorial)。
代碼開頭僅引用了三個頭文件,分別是:
#include<libsnark/common/default_types/r1cs_gg_ppzksnark_pp.hpp>
#include<libsnark/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/r1cs_gg_ppzksnark.hpp>
#include<libsnark/gadgetlib1/pb_variable.hpp>
前面提到?r1cs_gg_ppzksnark?對應的是Groth16方案。這里加了?gg?是為了區別?r1cs_ppzksnark,表示GenericGroupModel。Groth16安全性證明依賴GenericGroupModel,以更強的安全假設換得了更好的性能和更短的證明。
第一個頭文件是為了引入?default_r1cs_gg_ppzksnark_pp?類型,第二個則為了引入證明相關的各個接口。pb_variable?則是用來定義電路相關的變量。
下面需要進行一些初始化,定義使用的有限域,并初始化曲線參數。這是相當于每次的準備工作。
typedeflibff::Fr<default_r1cs_gg_ppzksnark_pp>FieldT;
default_r1cs_gg_ppzksnark_pp::init_public_params();
松禾資本張云鵬:幣圈有些負面影響,掩蓋了區塊鏈技術的價值:日前松禾資本張云鵬受訪時表示,去年也投了首個區塊鏈項目,他表示“作為一項先進技術,區塊鏈技術是得到業界肯定的,只是之前幣圈有些負面的影響,一定程度上掩蓋了這項技術的真正價值。”張云鵬也表示,“任何一個新技術都很難在剛開始時看懂看透,但我們都會在有限的能力下去做判斷,不能把它當成一個暴富的工具,關鍵不在于投還是不投,而在于有沒有投好。”[2018/3/18]
接下來就需要明確「待證命題」是什么。這里不妨沿用之前的例子,證明秘密?x?滿足等式?x^3+x+5==out。這實際也是Vitalik博文?"QuadraticArithmeticPrograms:fromZerotoHero"(https://medium.com/
template<typenameppT>
voidtest_r1cs_gg_ppzksnark(size_tnum_constraints,size_tinput_size)
{
??r1cs_example<libff::Fr<ppT>>example=generate_r1cs_example_with_binary_input<libff::Fr<ppT>>(num_constraints,input_size);
??constboolbit=run_r1cs_gg_ppzksnark<ppT>(example);
??assert(bit);
}
intmain(){
??default_r1cs_gg_ppzksnark_pp::init_public_params();
??test_r1cs_gg_ppzksnark<default_r1cs_gg_ppzksnark_pp>(1000,100);
??return0;
}
test.cpp
第二個例子?test.cpp。這個例子具體展示了如何利用libsnark構建一個最簡單的電路。
#include<libsnark/common/default_types/r1cs_gg_ppzksnark_pp.hpp>
#include<libsnark/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/r1cs_gg_ppzksnark.hpp>
#include<libsnark/gadgetlib1/pb_variable.hpp>
usingnamespacelibsnark;
usingnamespacestd;
intmain(){
??typedeflibff::Fr<default_r1cs_gg_ppzksnark_pp>FieldT;
螞蟻金服蔣國飛:區塊鏈是比AI影響更為廣泛的技術:螞蟻金服副總裁、技術實驗室負責人蔣國飛認為,區塊鏈技術是更為底層的技術變革。它最大的邏輯自信是能夠讓多方達成互信,而正是因為這是一個需要多方參與的過程。技術的落地是緩慢——等待所有的參與者看到區塊鏈的明亮面,并且達成共識,而正是因為多方參與,它的影響又是深遠的。相比之前的AI技術,蔣國飛認為區塊鏈的影響更為廣泛,也更公平開放,大小公司都能在其中找到自己的位置和機會。[2018/1/31]
??//Initializethecurveparameters
??default_r1cs_gg_ppzksnark_pp::init_public_params();
??//Createprotoboard
??protoboard<FieldT>pb;
??//Definevariables
??pb_variable<FieldT>x;
??pb_variable<FieldT>sym_1;
??pb_variable<FieldT>y;
??pb_variable<FieldT>sym_2;
??pb_variable<FieldT>out;
??//Allocatevariablestoprotoboard
??//Thestrings(like"x")areonlyfordebuggingpurposes??
??out.allocate(pb,"out");
??x.allocate(pb,"x");
??sym_1.allocate(pb,"sym_1");
??y.allocate(pb,"y");
??sym_2.allocate(pb,"sym_2");
??//Thissetsuptheprotoboardvariables
??//sothatthefirstone(out)representsthepublic
??//inputandtherestisprivateinput
??pb.set_input_sizes(1);
??//AddR1CSconstraintstoprotoboard
??//x*x=sym_1
??pb.add_r1cs_constraint(r1cs_constraint<FieldT>(x,x,sym_1));
??//sym_1*x=y
??pb.add_r1cs_constraint(r1cs_constraint<FieldT>(sym_1,x,y));
??//y+x=sym_2
??pb.add_r1cs_constraint(r1cs_constraint<FieldT>(y+x,1,sym_2));
??//sym_2+5=~out
??pb.add_r1cs_constraint(r1cs_constraint<FieldT>(sym_2+5,1,out));
??
??constr1cs_constraint_system<FieldT>constraint_system=pb.get_constraint_system();
??//generatekeypair
??constr1cs_gg_ppzksnark_keypair<default_r1cs_gg_ppzksnark_pp>keypair=r1cs_gg_ppzksnark_generator<default_r1cs_gg_ppzksnark_pp>(constraint_system);
??//Addpublicinputandwitnessvalues
??pb.val(out)=35;
??pb.val(x)=3;
??pb.val(sym_1)=9;
??pb.val(y)=27;
??pb.val(sym_2)=30;
??//generateproof
??constr1cs_gg_ppzksnark_proof<default_r1cs_gg_ppzksnark_pp>proof=r1cs_gg_ppzksnark_prover<default_r1cs_gg_ppzksnark_pp>(keypair.pk,pb.primary_input(),pb.auxiliary_input());
??//verify
??boolverified=r1cs_gg_ppzksnark_verifier_strong_IC<default_r1cs_gg_ppzksnark_pp>(keypair.vk,pb.primary_input(),proof);
??cout<<"NumberofR1CSconstraints:"<<constraint_system.num_constraints()<<endl;
??cout<<"Primary(public)input:"<<pb.primary_input()<<endl;
??cout<<"Auxiliary(private)input:"<<pb.auxiliary_input()<<endl;
??cout<<"Verificationstatus:"<<verified<<endl;
}
range.cpp
第三個例子?range.cpp。該例子利用了libsnark自帶的?comparison_gadget?來實現取值范圍證明。
#include<libsnark/common/default_types/r1cs_gg_ppzksnark_pp.hpp>
#include<libsnark/zk_proof_systems/ppzksnark/r1cs_gg_ppzksnark/r1cs_gg_ppzksnark.hpp>
#include<libsnark/gadgetlib1/pb_variable.hpp>
#include<libsnark/gadgetlib1/gadgets/basic_gadgets.hpp>
usingnamespacelibsnark;
usingnamespacestd;
intmain(){
??typedeflibff::Fr<default_r1cs_gg_ppzksnark_pp>FieldT;
??//Initializethecurveparameters
??default_r1cs_gg_ppzksnark_pp::init_public_params();
??//Createprotoboard
??protoboard<FieldT>pb;
??pb_variable<FieldT>x,max;
??pb_variable<FieldT>less,less_or_eq;
??x.allocate(pb,"x");
??max.allocate(pb,"max");
??
??pb.val(max)=60;
??comparison_gadget<FieldT>cmp(pb,10,x,max,less,less_or_eq,"cmp");
??cmp.generate_r1cs_constraints();
??pb.add_r1cs_constraint(r1cs_constraint<FieldT>(less,1,FieldT::one()));
??constr1cs_constraint_system<FieldT>constraint_system=pb.get_constraint_system();
??//generatekeypair
??constr1cs_gg_ppzksnark_keypair<default_r1cs_gg_ppzksnark_pp>keypair=r1cs_gg_ppzksnark_generator<default_r1cs_gg_ppzksnark_pp>(constraint_system);
??//Addwitnessvalues
??pb.val(x)=18;//secret
??cmp.generate_r1cs_witness();
??//generateproof
??constr1cs_gg_ppzksnark_proof<default_r1cs_gg_ppzksnark_pp>proof=r1cs_gg_ppzksnark_prover<default_r1cs_gg_ppzksnark_pp>(keypair.pk,pb.primary_input(),pb.auxiliary_input());
??//verify
??boolverified=r1cs_gg_ppzksnark_verifier_strong_IC<default_r1cs_gg_ppzksnark_pp>(keypair.vk,pb.primary_input(),proof);
??cout<<"NumberofR1CSconstraints:"<<constraint_system.num_constraints()<<endl;
??cout<<"Primary(public)input:"<<pb.primary_input()<<endl;
??cout<<"Auxiliary(private)input:"<<pb.auxiliary_input()<<endl;
??cout<<"Verificationstatus:"<<verified<<endl;
}
Tags:ARKNARZKSKSNDarkShield Games StudioMOONARCHzksync幣imtokenKSN幣
來源:新浪科技 新浪科技訊1月8日下午消息,螞蟻金服副總裁、智能科技總裁蔣國飛在北京宣布,螞蟻區塊鏈將開放平臺技術能力給全行業,尤其是面向實體產業,“不讓任何一個實體產業在數字經濟時代掉隊”.
1900/1/1 0:00:00作者:余弦 來源:懶人在思考 在這作為已經是區塊鏈世界的局內人,我有一些思考寫出來和我的關注者們聊聊。首先過去兩年,我在這已經做了一些主要圍繞區塊鏈安全的分享.
1900/1/1 0:00:00來源:新京報 北京市十五屆人大三次會議即將召開,1月11日晚,“一府兩院”有關部門現場接受代表詢問.
1900/1/1 0:00:00寫在前面:本文來以太坊博客,介紹了eth2的激勵機制以及對驗證者的懲罰機制。 本文的重點是通過eth2的設計理念來了解它的激勵機制.
1900/1/1 0:00:00作者:XiuMU 來源:比推bitpush.news2020年1月10日,歐盟第5條反洗錢指令正式生效。該法規旨在提高金融交易的透明度以在歐洲范圍內打擊洗錢和恐怖主義融資.
1900/1/1 0:00:00來源:人民日報 作者:劉泰山 前不久,第七屆“燈湖論劍”金融科技創新大賽在廣東佛山落下帷幕。作為廣東金融高新區舉辦的全國性區塊鏈賽事,第七屆“燈湖論劍”于2019年9月啟動,圍繞金融科技創新的技.
1900/1/1 0:00:00