国产乱人伦在线播放,99无码精品二区在线视频,最近在线更新8中文字幕免费,精品成人一区二区三区四区

您的位置:首頁(yè) > 互聯(lián)網(wǎng) >

ethsnarks可實(shí)現(xiàn)與zkSNARK相關(guān)的智能合約 在libsnark的基礎(chǔ)上

2019-09-29 16:06:51 來源: 區(qū)塊網(wǎng)

最近看知乎,發(fā)現(xiàn)知乎上有些文章真的醍醐灌頂。印象比較深的是,文因互聯(lián)CEO 鮑捷的一篇文章:最快的成長(zhǎng)方式就是慢慢來。創(chuàng)業(yè)最關(guān)鍵的能力

最近看知乎,發(fā)現(xiàn)知乎上有些文章真的醍醐灌頂。印象比較深的是,文因互聯(lián)CEO 鮑捷的一篇文章:最快的成長(zhǎng)方式就是慢慢來。創(chuàng)業(yè)最關(guān)鍵的能力,就是“不被卡住”的能力。這才是“探索力”的根本,是創(chuàng)業(yè)“執(zhí)行力”的核心。

很多人都熟悉讓別人告知一個(gè)明確的目標(biāo),然后清晰的執(zhí)行。但是,創(chuàng)業(yè)是一種探索,沒有人會(huì)告訴你這樣的明確的目標(biāo)。探索,是一種反人性的活動(dòng)。大多數(shù)人會(huì)對(duì)探索畏懼,恐懼,抵觸,茫然。

“不被卡住”,需要掌握好“任務(wù)分解,快速迭代”的方法論,需要建立“交付”的態(tài)度(每個(gè)時(shí)期結(jié)束都有可交付的狀態(tài)),需要“勤于溝通”, 需要”不固執(zhí)己見“,更需要”不斷復(fù)盤“。”不被卡住“,還有個(gè)要注意的是,有多少本錢打多少仗,不要總想著打大仗,要學(xué)會(huì)從小仗慢慢打。

ethsnarks在libsnark的基礎(chǔ)上,實(shí)現(xiàn)了以太坊上與zkSNARK相關(guān)的智能合約和電路。ethsnarks本身也是libsnark應(yīng)用很好的學(xué)習(xí)示例。

ethsnarks的源代碼地址:

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

本文中使用的ethsnarks源代碼的最后一個(gè)commit如下:

commit 9adc64355adb9154ba5042c0fadf84c438b8a08a

Author: Wanseob Lim

Date: Fri Aug 16 01:49:19 2019 +0900

Add Fr field class to the field.py

1. 源代碼結(jié)構(gòu)

contracts - 實(shí)現(xiàn)了groth16的驗(yàn)證智能合約(Verifier.sol),橢圓曲線的計(jì)算,MerkleTree以及MiMC Hash計(jì)算的智能合約。這些智能合約可以通過truffle進(jìn)行部署測(cè)試。部署相關(guān)的腳本在migrations目錄下。

ethsnarks - python實(shí)現(xiàn)的相關(guān)功能,包括pedersen/mimc/poseidon等hash函數(shù),groth16驗(yàn)證,以及橢圓曲線的計(jì)算。

test - 以上兩個(gè)功能的測(cè)試代碼,采用python語言實(shí)現(xiàn)。

depends - 依賴庫(kù),包括libsnark,libfqfft等等。

src - 基于libsnark的gadget1庫(kù)實(shí)現(xiàn)的更多的gadget。本文著重介紹這些gadget的實(shí)現(xiàn)。

2. gadget實(shí)現(xiàn)

src目錄下的源代碼結(jié)構(gòu)如下:

2.1 ethsnarks.hpp

libsnark的gadget1庫(kù)主要圍繞sha256(基于bit的hash函數(shù))實(shí)現(xiàn)各種gadgets。ethsnarks在alt_bn128這條橢圓曲線上實(shí)現(xiàn)了基于Field的hash函數(shù)(mimc,pedersen,poseidon等)。

libsnark的電路中各種定義都非常長(zhǎng)。libsnark定義一個(gè)變量數(shù)組類型:pb_variable_array。

ethsnarks.hpp精簡(jiǎn)了在alt_bn128這條橢圓曲線相關(guān)的類型聲明:

namespace ethsnarks {

typedef libff::bigint LimbT;

typedef libff::alt_bn128_G1 G1T;

typedef libff::alt_bn128_G2 G2T;

typedef libff::alt_bn128_pp ppT;

typedef libff::Fq FqT;

typedef libff::Fr FieldT;

typedef libsnark::r1cs_constraint ConstraintT;

typedef libsnark::protoboard ProtoboardT;

typedef libsnark::pb_variable VariableT;

typedef libsnark::pb_variable_array VariableArrayT;

typedef libsnark::pb_linear_combination LinearCombinationT;

typedef libsnark::pb_linear_combination_array LinearCombinationArrayT;

typedef libsnark::linear_term LinearTermT;

typedef libsnark::gadget GadgetT;

typedef libsnark::r1cs_gg_ppzksnark_zok_proof ProofT;

typedef libsnark::r1cs_gg_ppzksnark_zok_proving_key ProvingKeyT;

typedef libsnark::r1cs_gg_ppzksnark_zok_verification_key VerificationKeyT;

typedef libsnark::r1cs_gg_ppzksnark_zok_primary_input PrimaryInputT;

typedef libsnark::r1cs_gg_ppzksnark_zok_auxiliary_input AuxiliaryInputT;

}

其中,F(xiàn)ieldT特指在alt_bn128線上的點(diǎn)的個(gè)數(shù)。

2.2 utils.hpp/utils.cpp

utils實(shí)現(xiàn)了電路實(shí)現(xiàn)中常用的功能性函數(shù)。

inline const VariableT make_variable( ProtoboardT &in_pb, const std::string &annotation )

{

VariableT x;

x.allocate(in_pb, annotation);

return x;

}

make_variable創(chuàng)建一個(gè)VariableT。

const VariableArrayT flatten( const std::vector &in_scalars )

{

size_t total_sz = 0;

for( const auto& scalar : in_scalars )

total_sz += scalar.size();

VariableArrayT result;

result.resize(total_sz);

size_t offset = 0;

for( const auto& scalar : in_scalars )

{

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

{

result[offset++].index = scalar[i].index;

}

}

return result;

}

flatten函數(shù)將多個(gè)VariableArrayT合并成一個(gè)VariableArray。其實(shí)也很簡(jiǎn)單,就是把VariableArray中的index都合并到一個(gè)VariableArray中。

2.3 r1cs_gg_ppzksnark_zok

在libsnark的r1cs_gg_ppzksnark的基礎(chǔ)上,稍做改動(dòng),讓以太坊的預(yù)編譯智能合約能驗(yàn)證groth16的算法。r1cs_gg_ppzksnark_zok目錄中的README.md很清晰的解釋了改動(dòng)的原因。

從以太坊的拜占庭硬分叉之后,以太坊引入了基于ALT_BN128的配對(duì)函數(shù)計(jì)算的預(yù)編譯合約,合約實(shí)現(xiàn)的功能如下:

給定ALT_BN128上兩個(gè)基點(diǎn)(G1/G2)一系列的點(diǎn)(a1, b1, a2, b2, ..., ak, bk),預(yù)編譯合約能檢查:

e(a1, b1) * ... * e(ak, bk) 是否等于1?

Groth16原有的驗(yàn)證系數(shù)為:vk.alpha_beta,vk.gamma以及vk.delta。Groth16的驗(yàn)證等式為:

vk.alpha_beta = e(A, B) * e(-x, vk.gamma) * e(-C, vk.delta)

其中vk.alpha_beta為e(alpha, beta)。

如果直接用之前的驗(yàn)證等式,以太坊上的預(yù)編譯合約沒法實(shí)現(xiàn)。在不影響Groth16的安全性的情況下,將Groth16的驗(yàn)證系數(shù)變?yōu)椋簐k.alpha,vk.beta,vk.gamma以及vk.delta。Groth16的驗(yàn)證等式也變?yōu)椋?/p>

e(A, B) * e(-x, vk.gamma) * e(-C, vk.delta) * e(-alpha, beta) = 1

r1cs_gg_ppzksnark_zok目錄就是實(shí)現(xiàn)如上的改動(dòng)。同時(shí)提供了stubs.hpp/stubs.cpp,從json文件中讀取相應(yīng)的驗(yàn)證參數(shù)進(jìn)行驗(yàn)證。

2.4 poseidon

poseidon算法的實(shí)現(xiàn)在gadgets/poseidon.hpp文件中。

template

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

Poseidon128是Poseidon_gadget_T的一個(gè)實(shí)例。前面四個(gè)參數(shù)是poseidon算法的參數(shù),后續(xù)會(huì)寫文章詳細(xì)介紹poseidon算法以及這些參數(shù)的含義(6,1,8,57是默認(rèn)的配置)。nInputs指定算法的輸入的個(gè)數(shù),nOutputs指定輸出的個(gè)數(shù),contrainOutputs指定是否對(duì)輸出進(jìn)行約束。

Poseidon_gadget_T的構(gòu)造函數(shù)如下:

Poseidon_gadget_T(

ProtoboardT &pb,

const VariableArrayT& in_inputs,

const std::string& annotation_prefix

) :

GadgetT(pb, annotation_prefix),

inputs(in_inputs),

constants(poseidon_params()),

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

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[%u]", total_rounds-1)),

_output_vars(constrainOutputs ? make_var_array(pb, nOutputs, ".output") : VariableArrayT())

{

}

poseidon算法的計(jì)算由好幾輪組成:first_round(第一輪),prefix_full_rounds(預(yù)處理,完整輪),partial_rounds(中間,不完整輪),suffix_full_rounds(后處理,完整輪)以及l(fā)ast_round(最后一輪)。

_output_vars是輸出的變量。這些輪都是通過make_rounds函數(shù)實(shí)現(xiàn)。

template

static const std::vector make_rounds(

unsigned n_begin, unsigned n_end,

ProtoboardT& pb,

const std::vector >& inputs,

const PoseidonConstants& constants,

const std::string& annotation_prefix)

{

std::vector result;

result.reserve(n_end - n_begin);

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

{

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

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

}

return result;

}

make_rounds就是為每一輪準(zhǔn)備合適的參數(shù)。每一輪的具體實(shí)現(xiàn)通過Poseidon_Round實(shí)現(xiàn)。

在Poseidon_Round的封裝下,Poseidon_gadget_T的generate_r1cs_constraints以及generate_r1cs_witness相對(duì)簡(jiǎn)單,小伙伴們可以自行查看源代碼。

3. 示例代碼

在ethsnarks的基礎(chǔ)上,實(shí)現(xiàn)Poseidon函數(shù)的電路就非常簡(jiǎn)單了。構(gòu)造一個(gè)簡(jiǎn)單的電路,給大家參考一下。

電路的需求:實(shí)現(xiàn)Poseidon計(jì)算,輸入為兩個(gè)FieldT,輸出為一個(gè)FieldT。輸出作為電路的public input。

#include "ethsnarks.hpp"

#include "gadgets/poseidon.hpp"

using namespace ethsnarks;

namespace testproject {

using TestHash = Poseidon128<2, 1>;

class test_gadget : public GadgetT {

public:

VariableT output;

VariableT input0;

VariableT input1;

TestHash tHash;

test_gadget(

ProtoboardT& pb,

const std::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"))

{

}

void generate_r1cs_witness(

ethsnarks::FieldT w_input0,

ethsnarks::FieldT w_input1,

ethsnarks::FieldT w_output)

{

pb.val(input0) = w_input0;

pb.val(input1) = w_input1;

pb.val(output) = w_output;

tHash.generate_r1cs_witness();

}

void generate_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)"));

}

};

};

總結(jié):

ethsnarks在libsnark的基礎(chǔ)上,實(shí)現(xiàn)了以太坊上與zkSNARK相關(guān)的智能合約和電路。ethsnarks本身也是libsnark應(yīng)用很好的學(xué)習(xí)示例。libsnark的gadget1庫(kù)主要圍繞sha256(基于bit的hash函數(shù))實(shí)現(xiàn)各種gadgets。ethsnarks在alt_bn128這條橢圓曲線上實(shí)現(xiàn)了基于Field的hash函數(shù)(mimc,pedersen,poseidon等)。(Star Li)

關(guān)鍵詞: ethsnarks zkSNARK 智能合約

精選 導(dǎo)讀

募資55億港元萬物云啟動(dòng)招股 預(yù)計(jì)9月29日登陸港交所主板

萬科9月19日早間公告,萬物云當(dāng)日啟動(dòng)招股,預(yù)計(jì)發(fā)行價(jià)介乎每股47 1港元至52 7港元,預(yù)計(jì)9月29日登陸港交所主板。按發(fā)行1 167億股計(jì)算,萬

發(fā)布時(shí)間: 2022-09-20 10:39
管理   2022-09-20

公募基金二季度持股情況曝光 隱形重倉(cāng)股多為高端制造業(yè)

隨著半年報(bào)披露收官,公募基金二季度持股情況曝光。截至今年二季度末,公募基金全市場(chǎng)基金總數(shù)為9794只,資產(chǎn)凈值為269454 75億元,同比上

發(fā)布時(shí)間: 2022-09-02 10:45
資訊   2022-09-02

又有上市公司宣布變賣房產(chǎn) 上市公司粉飾財(cái)報(bào)動(dòng)作不斷

再有上市公司宣布變賣房產(chǎn)。四川長(zhǎng)虹25日稱,擬以1 66億元的轉(zhuǎn)讓底價(jià)掛牌出售31套房產(chǎn)。今年以來,A股公司出售房產(chǎn)不斷。根據(jù)記者不完全統(tǒng)

發(fā)布時(shí)間: 2022-08-26 09:44
資訊   2022-08-26

16天12連板大港股份回復(fù)深交所關(guān)注函 股份繼續(xù)沖高

回復(fù)交易所關(guān)注函后,大港股份繼續(xù)沖高。8月11日大港股份高開,隨后震蕩走高,接近收盤時(shí)觸及漲停,報(bào)20 2元 股。值得一提的是,在7月21日

發(fā)布時(shí)間: 2022-08-12 09:56
資訊   2022-08-12

萬家基金再添第二大股東 中泰證券擬受讓11%基金股權(quán)

7月13日,中泰證券發(fā)布公告,擬受讓齊河眾鑫投資有限公司(以下簡(jiǎn)稱齊河眾鑫)所持有的萬家基金11%的股權(quán),交易雙方共同確定本次交易的標(biāo)的資

發(fā)布時(shí)間: 2022-07-14 09:39
管理   2022-07-14

央行連續(xù)7日每天30億元逆回購(gòu) 對(duì)債市影響如何?

央行12日再次開展了30億元逆回購(gòu)操作,中標(biāo)利率2 10%。這已是央行連續(xù)7日每天僅進(jìn)行30億元的逆回購(gòu)縮量投放,創(chuàng)下去年1月以來的最低操作規(guī)

發(fā)布時(shí)間: 2022-07-13 09:38
資訊   2022-07-13

美元指數(shù)創(chuàng)近20年新高 黃金期貨創(chuàng)出逾9個(gè)月新低

由于對(duì)美聯(lián)儲(chǔ)激進(jìn)加息的擔(dān)憂,美元指數(shù)11日大漲近1%創(chuàng)出近20年新高。受此影響,歐美股市、大宗商品均走弱,而黃金期貨創(chuàng)出逾9個(gè)月新低。美

發(fā)布時(shí)間: 2022-07-13 09:36
資訊   2022-07-13

美股三大股指全線下跌 納斯達(dá)克跌幅創(chuàng)下記錄以來最大跌幅

今年上半年,美股持續(xù)回落。數(shù)據(jù)顯示,道瓊斯指數(shù)上半年下跌15 3%,納斯達(dá)克綜合指數(shù)下跌29 5%,標(biāo)普500指數(shù)下跌20 6%。其中,納斯達(dá)克連續(xù)

發(fā)布時(shí)間: 2022-07-04 09:51
推薦   2022-07-04

融資客熱情回升 兩市融資余額月內(nèi)增加超344億元

近期A股走強(qiáng),滬指6月以來上漲4%,融資客熱情明顯回升。數(shù)據(jù)顯示,截至6月16日,兩市融資余額1 479萬億元,月內(nèi)增加344 67億元,最近一個(gè)半

發(fā)布時(shí)間: 2022-06-20 09:41
資訊   2022-06-20

4個(gè)交易日凈買入超百億元 北向資金持續(xù)流入A股市場(chǎng)

北向資金凈流入態(tài)勢(shì)延續(xù)。繼6月15日凈買入133 59億元后,北向資金6月16日凈買入44 52億元。自5月27日至今,除6月13日以外,北向資金累計(jì)凈

發(fā)布時(shí)間: 2022-06-17 09:37
推薦   2022-06-17

熱門TAG

more
美聯(lián)儲(chǔ)今年已將基準(zhǔn)利率從接近零大幅上調(diào)至略高于3% EIA報(bào)告:美國(guó)原油庫(kù)存及戰(zhàn)略儲(chǔ)備減少,汽油及精煉油庫(kù)存輕微波動(dòng) 美國(guó)政府更廣泛推動(dòng)從汽油動(dòng)力汽車轉(zhuǎn)向電動(dòng)汽車的一部分 數(shù)據(jù)顯示:今年9月日本船企接單量延續(xù)8月下跌下跌趨勢(shì) 公告顯示:2022年前三季度TCL中環(huán)研發(fā)投入為27億元 占比營(yíng)業(yè)收入5.42% 新的111.75億英鎊注資列在“對(duì)金融機(jī)構(gòu)的援助—支付給英格蘭銀行”標(biāo)題下 本次政府儲(chǔ)備肉投放面向北京18家主要連鎖超市門店及相關(guān)零售終端投放 有交易員預(yù)計(jì):如果LME不采取措施 接下來可能將有數(shù)十萬噸鋁流入LME 據(jù)報(bào)道:繼德國(guó)最大釀酒商拉德貝格啤酒公司9月宣布漲價(jià) 據(jù)報(bào)道:澳大利亞礦商Pilbara的鋰礦拍賣價(jià)再創(chuàng)新高 折算后的碳酸鋰成本 中集天達(dá)首次公開發(fā)行A股股票 招股書顯示此次擬公開發(fā)行股數(shù)不超過103, 多家銀行加強(qiáng)綠色金融頂層設(shè)計(jì) 致力于為經(jīng)濟(jì)社會(huì)綠色低碳轉(zhuǎn)型貢獻(xiàn)力量 萊特幣 比特幣 數(shù)字資產(chǎn) 火幣 以太經(jīng)典 比特股 EOS 比特幣現(xiàn)金 量子鏈 Hcash 泰達(dá)幣 瑞波幣 Qcash 比特幣鉆石 超級(jí)比特幣 優(yōu)幣 硬分叉 加密貨幣