買以太坊 買以太坊
Ctrl+D 買以太坊
ads

NAR:技術干貨 | 零知識證明Learn by Coding:libsnark 入門篇_ZKS

Author:

Time:1900/1/1 0:00:00

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,即可在不暴露秘密的情況下證明存在一個秘密值可使等式滿足。

動態 | 多家券商報告肯定區塊鏈技術發展:據中國證券報消息,東方證券(600958.SH)指出,目前在市場、監管、認知等各方面因素作用下,區塊鏈產業發展回歸理性,持續在各細分領域中探索技術落地;看好區塊鏈技術長期在我國行業應用的潛力,隨著5G、物聯網等新技術的應用,區塊鏈技術落地有望加速。民生證券認為,此次將推進區塊鏈技術的發展和落地應用提升至國家核心技術的戰略高度,明確區塊鏈技術的價值;通過技術提升教育、食品安全、醫療、公益等民生領域、供應鏈管理、金融等企業效益,以及智慧交通、智慧城市、人工智能等區塊鏈生態打造,相關重點企業有望受益。聯訊證券預判,下周科技主線有望回歸最強音,區塊鏈有望引領科技板塊反攻;頂層釋放重大信號,新的技術周期將逐步崛起,建議關注A股市場區塊鏈、數字貨幣、5G、物聯網等相關概念股。中銀國際證券表示,區塊鏈技術橫空出世有望引爆近期走勢糾結的資本市場,帶動計算機和科技板塊反彈,相關概念龍頭股有望獲得較高的收益;另一方面,區塊鏈概念涉及廣泛,不斷有新的公司涌現,市場短期有可能存在認知誤區,可以在增量上挖掘。[2019/10/28]

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?處理。或嘗試使用以下命令:

動態 | 高德納發文介紹區塊鏈技術在人力資源領域的五種用例:知名信息技術研究和分析公司高德納(Gartner)今日發文稱,早期采用者已經在某些人力資源領域采用了區塊鏈技術,這些用例可為人力資源主管提供了未來的一瞥。高德納在文章中列舉了五種區塊鏈技術在人力資源領域的具體用例,分別為:背景和工作經歷檢查、員工數據安全及訪問、適用于合同工或臨時工的智能合約、監管合規(主要針對歐盟GDPR等法規,確保員工對自己的數據擁有控制權)、支付及福利(不再依賴銀行等中介機構)。[2019/8/27]

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);

聲音 | 徐少山:區塊鏈技術是實現可追溯性的創新手段:中國質量認證中心處長徐少山在10月10日舉行的主題為“區塊鏈技術為溯源保駕護航”的溯源區塊鏈論壇上,區塊鏈技術從技術角度實現了可信任,是實現可追溯性創新的手段。這其中的應用有四個方面值得考量:原始數據的真實性和顆粒度、數據的安全和隱私、物聯網技術的可行性、傳統的信息化管理升級。[2018/10/10]

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();

接下來就需要明確「待證命題」是什么。這里不妨沿用之前的例子,證明秘密?x?滿足等式?x^3+x+5==out。這實際也是Vitalik博文?"QuadraticArithmeticPrograms:fromZerotoHero"(https://medium.com/

應用區塊鏈技術 專家組正立項制定溯源國家標準 :據中國經濟網消息,日前,在北京召開的媒體交流會的“食品質量追溯體系評價與區塊鏈”主題分享中,中國標準化研究院副研究員劉鵬表示,目前國家專家組正在立項制訂一系列的追溯國家標準,標準發布后對各類產品的追溯,包括應用區塊鏈進行的追溯,會有很大的幫助。[2018/6/1]

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;

??//Initializethecurveparameters

??default_r1cs_gg_ppzksnark_pp::init_public_params();

??//Createprotoboard

香港數碼港湛家揚:區塊鏈技術是目前發展金融科技的重點:香港數碼港公眾使命總監湛家揚表示,對于發展金融科技,目前區塊鏈技術是重點,而ICO目前是剛興起的融資方法,不少初創企業都用這個模式融資,是否適合作為初創企業融資的方式還需要觀察。香港數碼港項目由香港最大固網電話營運商電訊盈科興建,并由香港特區政府全權擁有。[2018/4/22]

??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:NARARKKSNZKSNARUTObulwarkKSN幣zks幣未來前景如何

以太坊交易
LIBRA:美國國稅局:加密貨幣交易不報稅或將付出昂貴代價,逃稅者或將面臨高達25萬美元罰款_加密貨幣

文:RobertW.Wood 編譯:L 來源:Cointelegraph中文編者注:原標題為《加密貨幣未報稅可能會付出昂貴代價,甚至刑事代價》美國國稅局已意識到數百萬筆加密貨幣交易可能仍未報稅.

1900/1/1 0:00:00
ECB:歐洲央行高管發文:雙層CBDC機制有可能解決金融脫媒與危機_加密貨幣市場分析

2019年下半年以來歐洲央行高層一改過去對CBDC的不熱情態度,頻頻吹風,表明對CBDC的擁抱.

1900/1/1 0:00:00
人工智能:上海:支持人民銀行數字貨幣研究所在滬設立金融科技公司_元宇宙

記者:陳鵬 來源:新京報 新京報訊1月15日,新京報記者獲悉,《加快推進上海金融科技中心建設實施方案》已經印發。方案的“重點任務”中提到,積極支持人民銀行數字貨幣研究所在滬設立金融科技公司.

1900/1/1 0:00:00
比特幣:巴比特專欄 | 《證券法》修訂,與虛擬貨幣有關嗎?_加密貨幣

作者按:最新修訂的《證券法》出臺了,看點很多,對于傳統證券市場的影響筆者不再贅述。本文擬探討的是,新修訂的《證券法》與虛擬貨幣是否有關?最新修訂的《證券法》近期落地了,在該法下,虛擬貨幣相關活動.

1900/1/1 0:00:00
BTC:干貨 | 三種技術分析法,玩轉比特幣市場周期_比特幣

來源:OKEx 編譯:頭等倉 本文將分享三種技術分析法,對BTC市場周期進行分析,最后找尋答案:當前是否是入場的最佳時機? 目前市場上對“比特幣將帶來一輪牛市”的預期主要是基于前兩次的經歷.

1900/1/1 0:00:00
OIN:算力沖鴨!2020 年比特幣挖礦行業展望_COI

2019年12月,數字資產管理公司CoinShares下屬研究機構CoinSharesResearch發布了一份關于比特幣挖礦網絡的報告.

1900/1/1 0:00:00
ads