欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

circom/snarkjs實(shí)戰(zhàn)zkrollup的示例分析

今天就跟大家聊聊有關(guān)circom/snarkjs實(shí)戰(zhàn)zk rollup的示例分析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

成都創(chuàng)新互聯(lián)從2013年成立,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站制作、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元撫順縣做網(wǎng)站,已為上家服務(wù),為撫順縣各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

過(guò)去的一年出現(xiàn)了很多零知識(shí)證明應(yīng)用,在這個(gè)教程中,我們將首先學(xué)習(xí)零知識(shí)證明的基本概念、使用circom搭建算術(shù)電路、使用snarkjs實(shí)現(xiàn)零知識(shí)證明的全過(guò)程,并利用這些知識(shí)實(shí)現(xiàn)二層擴(kuò)容方案zk rollup。

零知識(shí)程序和其他程序的實(shí)現(xiàn)不太一樣。首先,你要解決的問(wèn)題需要先轉(zhuǎn)化成多項(xiàng)式,再進(jìn)一步轉(zhuǎn)化成電路。例如,多項(xiàng)式x3 + x +5 可以表示成如下的電路:

sym_1 = x * x // sym_1 = x2 
sym_2 = sym_1 * x // sym_2 = x3 
y = sym_2 + x // y = x3 + x 
~out = y + 5

Circom編譯器將邏輯轉(zhuǎn)換為電路。通常我們不需要自己設(shè)計(jì)基礎(chǔ)電路。如果你需要一個(gè)哈希函數(shù)或簽名函數(shù),可以在circomlib 找到。

2、證據(jù)的生成與驗(yàn)證:零知識(shí)證明的流程

在運(yùn)行零知識(shí)證明程序之前,我們需要?jiǎng)?chuàng)建一個(gè)可信的設(shè)置,這需要 一個(gè)電路以及一些隨機(jī)數(shù)。一旦設(shè)置完成就會(huì)生成一個(gè)證明密鑰和一個(gè)驗(yàn)證密鑰,分別用于生成證據(jù)和執(zhí)行驗(yàn)證。

circom/snarkjs實(shí)戰(zhàn)zk rollup的示例分析

一旦創(chuàng)建了證明/驗(yàn)證密鑰對(duì),就可以生成證據(jù)了。

有兩種類(lèi)型的輸入:公開(kāi)輸入和私有輸入。例如,A向B轉(zhuǎn)賬但是不希望公開(kāi)賬戶余額,那么A的賬戶余額就是私有輸入,也被稱(chēng)為見(jiàn)證(Witness)。公開(kāi)輸入可以是A和B的地址或者轉(zhuǎn)賬金額,這完全取決于你的具體設(shè)計(jì)。

接下來(lái)證明人就可以利用證明密鑰、公開(kāi)輸入和見(jiàn)證來(lái)生成證據(jù):

circom/snarkjs實(shí)戰(zhàn)zk rollup的示例分析

最后一步是驗(yàn)證。驗(yàn)證方使用公開(kāi)輸入、證據(jù)和驗(yàn)證密鑰來(lái)驗(yàn)證證據(jù)。

circom/snarkjs實(shí)戰(zhàn)zk rollup的示例分析 公開(kāi)輸入、見(jiàn)證(私有輸入)、證明密鑰、驗(yàn)證密鑰、電路、證據(jù)這些基本概念以及相互之間的關(guān)系,就是我們繼續(xù)下面的教程之前需要理解的零知識(shí)證明的基本概念。

3、Circom基本概念:算術(shù)電路語(yǔ)言

首先我們先了解下Circom的語(yǔ)法。Circom的語(yǔ)法類(lèi)似javascript和C,提供一些基本的數(shù)據(jù)類(lèi)型和操作,例如for、while、>>、array等。

讓我們看一個(gè)具體的實(shí)例。

假設(shè)x、y是保密的(即witness),我們不想暴露x和y的具體值,但是希望證明 (x * y) + z == out,其中z,out是公開(kāi)輸入。我們假設(shè)out = 30, z = 10, 那么顯然 (x*y) = 20,但是這不會(huì)暴露x和y的具體值。

circom提供了如下這些關(guān)鍵字用于描述算術(shù)電路:

  • signal:信號(hào)變量,要轉(zhuǎn)換為電路的變量,可以是private或public

  • template:模板,用于函數(shù)定義,就像Solidity中的function或golang中的func

  • component:組件變量,可以把組件變量想象成對(duì)象,而信號(hào)變量是對(duì)象的公共成員

Circom也提供了一些操作符用于操作信號(hào)變量:

  • <==, ==>:這兩個(gè)操作符用于連接信號(hào)變量,同時(shí)定義約束

  • ←, →:這些操作符為信號(hào)變量賦值,但不會(huì)生成約束條件

  • ===:這個(gè)操作符用來(lái)定義約束

好了,這些就是我們繼續(xù)零知識(shí)證明實(shí)踐需要了解的circom關(guān)鍵字。

4、用circom和snarkjs實(shí)現(xiàn)零知識(shí)證明應(yīng)用的全流程

STEP 1:編譯電路文件,生成circuit.json:

circom sample1.circom

STEP 2:創(chuàng)建可信設(shè)置,使用groth協(xié)議生成proving_key.json和verification_key.json

snarkjs setup — protocol groth

STEP 3:生成見(jiàn)證(私有輸入)。這一步需要輸入,因此應(yīng)當(dāng)將你的輸入存入input.json,就像下面這樣:

// input.json
{“x”:3, “y”:5, “z”: 100}

使用下面的命令生成見(jiàn)證文件witness.json:

snarkjs calculatewitness

STEP 4:使用如下的snarkjs命令生成證據(jù):

snarkjs proof

結(jié)果是得到proof.json、public.json。在public.json中包含了公開(kāi)輸入,例如:

// public.json
{
  “115”, // → out
  “100” // → z:100
}

STEP 5:使用如下snarkjs命令進(jìn)行驗(yàn)證:

snarkjs verify

5、零知識(shí)證明實(shí)踐案例:zk rollup實(shí)現(xiàn)

zk rollup是一個(gè)二層解決方案,不過(guò)它和其他的二層方案不同。zk roolup將所有數(shù)據(jù)放在鏈上,使用zk-snark進(jìn)行驗(yàn)證。因此,不需要復(fù)雜的挑戰(zhàn)游戲。在zk rollup中,用戶的地址記錄在智能合約的merkle樹(shù)上,使用3字節(jié)的索引來(lái)表征用戶的地址(地址的原始大小是20字節(jié)),因此zk rollup可以通過(guò)減小數(shù)據(jù)大小來(lái)增加交易吞吐量。

為了便于理解,在下面的zk rollup實(shí)現(xiàn)中,我們有意忽略一些細(xì)節(jié),原始的zk rollup教程可以參考 ZKRollup Tutorial。

首先,有一個(gè)記錄賬號(hào)的merkle樹(shù),賬號(hào)記錄的內(nèi)容是(公鑰,余額)。每個(gè)交易的內(nèi)容是(發(fā)送方索引、接收方索引、金額)。流程如下:

1、檢查發(fā)送方賬號(hào)是否在merkle樹(shù)上 2、驗(yàn)證發(fā)送方的簽名 3、更新發(fā)送方的余額并驗(yàn)證中間merkle根 4、更新接收方的余額并更新merkle根

circom電路程序的變量定義如下:

// account tree
signal input account_root;
signal private input account_pubkey[2];
signal private input account_balance;  

// new account root after sender's balance is updated
signal private input new_sender_account_root;  

// tx
signal private input tx_sender_pubkey[2]
signal private input tx_sender_balance
signal private input tx_amount
signal private input tx_sender_sig_r[2]
signal private input tx_sender_sig_s
signal private input tx_sender_path_element[levels]
signal private input tx_sender_path_idx[levels]
signal private input tx_receiver_pubkey[2]
signal private input tx_receiver_balance
signal private input tx_receiver_path_element[levels]
signal private input tx_receiver_path_idx[levels]

// output new merkle root
signal output new_root;

在這個(gè)案例中幾乎所有的變量都是私有的,不管是公鑰、賬戶余額還是簽名等等,只有merkle根和更新后的merkle根是公開(kāi)的。path_element是構(gòu)建merkle根的中間值,path_idx是一個(gè)索引數(shù)組,用于保存merkle樹(shù)每一層的索引 —— 這時(shí)一個(gè)二叉樹(shù),因此只有左右兩個(gè)分支,0表示左,1表示右。最終的路徑像一個(gè)二進(jìn)制字符串:001011。

下面的circom代碼檢查發(fā)送方是否存在:

//__1. verify sender account existence
component senderLeaf = HashedLeaf();
senderLeaf.pubkey[0] <== tx_sender_pubkey[0];
senderLeaf.pubkey[1] <== tx_sender_pubkey[1];
senderLeaf.balance <== account_balance; 

component senderExistence = GetMerkleRoot(levels);
senderExistence.leaf <== senderLeaf.out; 

for (var i=0; i<levels; i++) {
   senderExistence.path_index[i] <== tx_sender_path_idx[i];
   senderExistence.path_elements[i] <== tx_sender_path_element[i];
}

senderExistence.out === account_root;

上面的代碼也比較簡(jiǎn)單,哈希發(fā)送方的公鑰和賬戶余額,用merkle樹(shù)的中間值計(jì)算,然后得到merkle根(senderExistence.out)。檢查計(jì)算得到的merkle根和輸入是否一致(account_root)。

出于簡(jiǎn)化考慮,我們省略了merkle樹(shù)和哈希函數(shù)的實(shí)現(xiàn),你可以查看HashedLeaf和GetMerkleRoot。

下面的circom代碼檢查發(fā)送方的簽名:

//__2. verify signature
component msgHasher = MessageHash(5);
msgHasher.ins[0] <== tx_sender_pubkey[0];
msgHasher.ins[1] <== tx_sender_pubkey[1];
msgHasher.ins[2] <== tx_receiver_pubkey[0];
msgHasher.ins[3] <== tx_receiver_pubkey[1];
msgHasher.ins[4] <== tx_amount
    
component sigVerifier = EdDSAMiMCSpongeVerifier(); 
sigVerifier.enabled <== 1;
sigVerifier.Ax <== tx_sender_pubkey[0];
sigVerifier.Ay <== tx_sender_pubkey[1];
sigVerifier.R8x <== tx_sender_sig_r[0];
sigVerifier.R8y <== tx_sender_sig_r[1];
sigVerifier.S <== tx_sender_sig_s;
sigVerifier.M <== msgHasher.out;

就像區(qū)塊鏈交易需要驗(yàn)證發(fā)送方的簽名一樣,在上面的代碼中,我們首先哈希消息然后進(jìn)行簽名,然后調(diào)用不同的封裝函數(shù)。

更新發(fā)送方余額并檢查新的merkle根。

//__3. Check the root of new tree is equivalent
component newAccLeaf = HashedLeaf();
newAccLeaf.pubkey[0] <== tx_sender_pubkey[0];
newAccLeaf.pubkey[1] <== tx_sender_pubkey[1];
newAccLeaf.balance <== account_balance - tx_amount;

component newTreeExistence = GetMerkleRoot(levels);
newTreeExistence.leaf <== newAccLeaf.out;
for (var i=0; i<levels; i++) {
 newTreeExistence.path_index[i] <== tx_sender_path_idx[i];
 newTreeExistence.path_elements[i] <== tx_sender_path_element[i];
} newTreeExistence.out === new_sender_account_root;

前面的兩個(gè)步驟從發(fā)送方的角度檢查信息,然后更新發(fā)送方的余額并計(jì)算新的merkle根。最下面一行:newTreeExistence.out === new_sender_account_root;作用是檢查計(jì)算得到的merkle根和輸入(new_sender_account_root)是否一致。通過(guò)這個(gè)檢查,可以避免偽造或不正確的輸入。

下面的代碼更新接收方余額以及merkle樹(shù):

//__5. update the root of account tree
component newReceiverLeaf = HashedLeaf();
newReceiverLeaf.pubkey[0] <== tx_receiver_pubkey[0];
newReceiverLeaf.pubkey[1] <== tx_receiver_pubkey[1];
newReceiverLeaf.balance <== tx_receiver_balance + tx_amount;

component newReceiverTreeExistence = GetMerkleRoot(levels);
newReceiverTreeExistence.leaf <== newReceiverLeaf.out;
for (var i=0; i<levels; i++) {
newReceiverTreeExistence.path_index[i]<==tx_receiver_path_idx[i];
newReceiverTreeExistence.path_elements[i] 
<==tx_receiver_path_element[i];
}

new_root <== newReceiverTreeExistence.out;

最后一步更新接收方余額,計(jì)算并輸出新的merkle根。一旦電路構(gòu)建好,就像一個(gè)黑盒子。如果你輸入正確的值,那么輸出一定是正確的,因此用戶容易檢查以避免惡意中間人。這就是為什么我們需要在電路最后輸出一些東西的原因 —— 在這個(gè)案例里我們輸出的是merkle根。

看完上述內(nèi)容,你們對(duì)circom/snarkjs實(shí)戰(zhàn)zk rollup的示例分析有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

分享題目:circom/snarkjs實(shí)戰(zhàn)zkrollup的示例分析
文章地址:http://aaarwkj.com/article12/gooodc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、移動(dòng)網(wǎng)站建設(shè)域名注冊(cè)、用戶體驗(yàn)網(wǎng)站設(shè)計(jì)、定制開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管
亚洲中文永久免费视频| 亚洲av日韩综合一区尤物| 禁止18黄色免费网站| 日本东京热免费一二三区| 久久亚洲精品中文字幕一| 国产精品va在线观看入口| 午夜久久精品国产亚洲av| 欧美 日本国产一区| 少妇性生活视频免费观看| 日韩不卡区高清在线视频| 日本亚洲美丽少妇天堂| 亚洲另类综合日韩一区| 国产高清不卡一区二区| 国产亚洲综合一区二区三区| 久久午夜人妻一区二区| 97福利影院在线观看| 亚洲香蕉在线视频免费| 欧美一区二区精品网站| 有码不卡中文字幕在线视频| 不卡视频在线免费观看| 中文字幕乱码日韩一区| 初爱视频教程完整版韩国| 日韩人妻中文字幕亚洲| 高清国产在线播放91| 国产龙熟女高潮一区二区| 日本午夜福利久久久| 亚洲精品中文字幕码专区| 精品中文人妻中文字幕| 搡老女人老91妇女老熟女| 久久亚洲国产成人精品性色| 国产av一区二区三区最新精品| 国产激情在线四五区观看| 日本道欧美一区二区aaaa| 激情男女一区二区三区| 国产午夜草莓视频在线观看| 国产在线视频不卡福利片| 国产999精品免费国产| 激情婷婷亚洲五月综合网| 色综合色综合色综合色综合| 国产精品男人在线播放| 亚洲视频在线男人天堂|