譯者按:此前以太坊創(chuàng)始人Vitalik根據(jù)ZK-SNARKs技術(shù)提出的500tps擴(kuò)容方案,引發(fā)了社區(qū)對(duì)區(qū)塊鏈擴(kuò)容的更多思考,而此后由以太坊研究者Barry Whitehat,Alex Gluchowski,Harry R,Yondon Fu和Philippe Castonguay共同提出的snark側(cè)鏈方案,更是號(hào)稱可讓以太坊網(wǎng)絡(luò)實(shí)現(xiàn)17000 tps 的交易吞吐量。那這種方案究竟是怎么回事呢?本文試圖給出答案。
原文作者:BarryWhitehat, Alex Gluchowski, HarryR , Yondon Fu, Philippe Castonguay
一、概述
本文介紹了一種基于snark的側(cè)鏈方案,它要求每次狀態(tài)轉(zhuǎn)換恒定的gas,其不依賴于每次轉(zhuǎn)換過(guò)程中包含的交易數(shù)。這限制了snark大小的可擴(kuò)展性,其在經(jīng)濟(jì)上是可證明的,這與之前提出的gasBlockLimit/gasPerTx提議(注:以太坊創(chuàng)始人vbuterin提出的500tps擴(kuò)容方案)不同。
如果出現(xiàn)了一個(gè)惡意運(yùn)營(yíng)者(最壞的情況下),系統(tǒng)會(huì)退化為一種鏈上通證,而惡意的運(yùn)營(yíng)者將無(wú)法竊取人們的資金。
如果數(shù)據(jù)變得不可用,運(yùn)營(yíng)者可以被替換,我們可以回滾到之前的有效狀態(tài)(根據(jù)現(xiàn)有用戶的請(qǐng)求),然后通過(guò)新的運(yùn)營(yíng)者繼續(xù)該狀態(tài)的運(yùn)行。
二、系統(tǒng)角色
系統(tǒng)當(dāng)中有兩種角色
1.創(chuàng)建交易以更新?tīng)顟B(tài)的用戶;
2.使用snark的運(yùn)營(yíng)者,他們會(huì)將這些交易聚合為單個(gè)鏈上狀態(tài)更新;
他們使用智能合約來(lái)進(jìn)行交互。系統(tǒng)在默克爾樹(shù)(merkle tree)中有一個(gè) item列表,它將公鑰(所有者)與不可替代通證聯(lián)系起來(lái)。
通證可以被撤回,但機(jī)會(huì)只有一次。
2.1、在snark交易中
用戶創(chuàng)建交易,以更新通過(guò)鏈外方式發(fā)送給運(yùn)營(yíng)者的通證所有權(quán)。該運(yùn)營(yíng)者創(chuàng)建的證明包含:
·之前的狀態(tài);
·交易集;
通過(guò)newState碼,我們可以驗(yàn)證EVM虛擬機(jī)中的證明,當(dāng)且僅當(dāng)證明是有效的時(shí)候,系統(tǒng)會(huì)更新這個(gè)默克爾根(merkle root);
2.2、優(yōu)先隊(duì)列
用戶還可以通過(guò)智能合約層請(qǐng)求一次取回操作。如果運(yùn)營(yíng)者無(wú)法在給定的時(shí)間內(nèi)服務(wù)這個(gè)隊(duì)列,我們就假定數(shù)據(jù)不可用。由此,這個(gè)運(yùn)營(yíng)者會(huì)受到懲罰,而系統(tǒng)會(huì)開(kāi)始尋找新的運(yùn)營(yíng)者。
兩次取出相同的leaf(子葉)是不可能的,因?yàn)槊看稳〕鰰r(shí),系統(tǒng)會(huì)存儲(chǔ)已經(jīng)退出的leaf(子葉),并檢查未來(lái)所有退出的leaf(子葉);
2.3、運(yùn)營(yíng)者拍賣活動(dòng)
如果先前的運(yùn)營(yíng)者已經(jīng)遭到了懲罰,系統(tǒng)會(huì)開(kāi)始搜索新的運(yùn)營(yíng)者,而這是通過(guò)拍賣活動(dòng)來(lái)實(shí)現(xiàn)的,其中用戶可以通過(guò)投標(biāo)的方式競(jìng)選運(yùn)營(yíng)者。
經(jīng)過(guò)一段時(shí)間后,新的運(yùn)營(yíng)者將根據(jù)最新側(cè)鏈狀態(tài)的最高出價(jià)(高于某個(gè)最小出價(jià))被選出。
2.4、回滾
當(dāng)運(yùn)營(yíng)者發(fā)生更改時(shí),系統(tǒng)會(huì)允許用戶退出。要做到這一點(diǎn)的原因在于,在回滾發(fā)生時(shí),用戶能夠拿回某個(gè)狀態(tài)下自己的幣。
系統(tǒng)會(huì)按狀態(tài),排序這些取款操作,并在該狀態(tài)下回滾鏈交易,直到新的運(yùn)營(yíng)者繼續(xù)負(fù)責(zé)狀態(tài)的更新。
請(qǐng)注意,由于不可能將同一leaf(子葉)撤回兩次,所以用戶不能從舊狀態(tài)退出同一leaf(子葉);
三、討論
運(yùn)營(yíng)者被迫處理優(yōu)先隊(duì)列中的請(qǐng)求,否則將遭到懲罰。如果他們拒絕運(yùn)行系統(tǒng)的snark側(cè)鏈,他們?nèi)詴?huì)被迫允許優(yōu)先隊(duì)列退出。因此,如果運(yùn)營(yíng)者出現(xiàn)了惡意,系統(tǒng)將會(huì)退化為一種鏈上通證。
用戶不應(yīng)該接受一個(gè)被傳輸?shù)膌eaf(葉交易),除非所有的鏈數(shù)據(jù)都是可用的,以便他們知道在最壞的情況下(如果發(fā)生了回滾),他們可以成為新的運(yùn)營(yíng)者。
成為運(yùn)營(yíng)者所擁有的權(quán)限,可能超出了普通用戶,但只要有一個(gè)誠(chéng)實(shí)的運(yùn)營(yíng)者想要接管狀態(tài),那么用戶的錢就會(huì)是安全的。此外,在較新的狀態(tài)投標(biāo)中,這些運(yùn)營(yíng)者的投標(biāo)相對(duì)其他投標(biāo)都具有優(yōu)勢(shì)。
然而,這就允許當(dāng)前運(yùn)營(yíng)者繼續(xù)連任,因?yàn)樗麄儗⒅雷钚聽(tīng)顟B(tài)的數(shù)據(jù),并且可競(jìng)標(biāo)最新的狀態(tài)。
然而,我們可以定一個(gè)最低權(quán)益,如果他們?cè)俅尉芙^優(yōu)先服務(wù),這些運(yùn)營(yíng)者會(huì)再次遭受懲罰。因此,這樣的系統(tǒng)可保證有人會(huì)前來(lái)處理隊(duì)列,否則鏈將回滾到最初的狀態(tài),而用戶可以在回滾發(fā)生時(shí)進(jìn)行退出操作。
不同于無(wú)法保證所有狀態(tài)有效性的Plasma結(jié)構(gòu),這種設(shè)計(jì)避免了競(jìng)爭(zhēng)性撤回,因?yàn)閟nark不允許無(wú)效的狀態(tài)轉(zhuǎn)換。因此,我們可以從具有惡意運(yùn)營(yíng)者的場(chǎng)景當(dāng)中恢復(fù)過(guò)來(lái),而不必強(qiáng)制所有用戶退出(當(dāng)然,希望退出的用戶仍然可以退出)。
四、附錄 :TPS的計(jì)算
目前,每個(gè)簽名需要~500k的constraints,通過(guò)優(yōu)化,我們認(rèn)為這可以減少到2k constraints;
目前,我們的哈希函數(shù)(sha256)每秒消耗50000筆交易。我們可以用消耗1k constraints的佩德森承諾( pedersen commitments)方案來(lái)替代這一點(diǎn)。
如果我們創(chuàng)建自己的29層默克爾樹(shù)(merkle tree 29 layers),系統(tǒng)就可以容納536,870,912個(gè)子葉( leaves)。 對(duì)于每一筆交易,我們必須:
·確認(rèn)簽名 = 2k constraints
·確認(rèn)樹(shù)中的舊葉交易 = 1k * 29 = 29k constraints
·添加新的葉交易,并重新計(jì)算根 = 1k * 29 = 29k constraints
這等于每筆交易為60k constraints ;
吳等人所撰寫(xiě)的論文指出,他們可以證明一個(gè)10億gate的 snark;
1000000000 / 60,000 ,則每個(gè)snark確認(rèn)16666筆交易;
而驗(yàn)證一個(gè)snark,就需要50萬(wàn)的gas,而以太坊每個(gè)區(qū)塊可以有800萬(wàn)gas。這意味著每個(gè)區(qū)塊,我們可容納16個(gè)這樣的snark;
也就是說(shuō),每個(gè)區(qū)塊理論上可以容納 16666 * 16 = 266656筆交易;
266656 / 15 = 每秒 17777筆交易;
我們可通過(guò)創(chuàng)建更大的集群來(lái)達(dá)到更高的tps;
注:運(yùn)行硬件以達(dá)到這個(gè)速率,可能會(huì)是相當(dāng)昂貴的,但同時(shí)其回報(bào)也遠(yuǎn)遠(yuǎn)小于當(dāng)前區(qū)塊的獎(jiǎng)勵(lì)。
五、社區(qū)評(píng)論
fleupold回復(fù):
關(guān)于回滾期間的退出問(wèn)題,我有些不解:
“barryWhiteHat: 當(dāng)運(yùn)營(yíng)者發(fā)生更改時(shí),系統(tǒng)允許用戶退出。要做到這一點(diǎn)的原因在于,在回滾發(fā)生時(shí),用戶能夠拿回某個(gè)狀態(tài)下自己的幣?!?/p>
這是否意味著在發(fā)生回滾后,你能夠退出在某個(gè)區(qū)塊(不再是鏈的一部分)中得到的幣(例如,假設(shè)我們回滾到第42個(gè)區(qū)塊,我們能夠退出在44個(gè)區(qū)塊中得到的幣)?
假設(shè)第44個(gè)區(qū)塊的數(shù)據(jù)不可用,有人能夠證明退出是有效的嗎?
barryWhiteHat答:
在回滾過(guò)程中,你將有機(jī)會(huì)從狀態(tài)44退出你的幣。如果你錯(cuò)過(guò)了這個(gè)機(jī)會(huì),你會(huì)丟失掉你的幣,而幣的發(fā)送者將重新獲得它的所有權(quán)。
一旦你退出了一個(gè) leaf(子葉),那么同一個(gè) leaf(子葉)就無(wú)法再次退出,即使我們回滾到它被退出之前;
kaibakker回復(fù)說(shuō):
我真的很喜歡這個(gè)項(xiàng)目的進(jìn)展情況,這個(gè)項(xiàng)目的github代碼可以在這里找到:
https://github.com/barryWhiteHat/roll_up 。
下面我來(lái)探討一個(gè)問(wèn)題:你如何確保一個(gè)誠(chéng)實(shí)者隨時(shí)準(zhǔn)備成為一名運(yùn)營(yíng)者?怎樣的收費(fèi)才是有意義的?
作為一名運(yùn)營(yíng)者,他是需要付出一定成本的:
·用于snark計(jì)算和數(shù)據(jù)可用性的服務(wù)器成本;
·驗(yàn)證和提現(xiàn)的Gas成本;
運(yùn)行者可以通過(guò)以下的方式收回這些成本:
·存入和提現(xiàn)費(fèi);
·交易費(fèi);
·無(wú)需信任的利息(通過(guò)PETH或者DAI利息最大可達(dá)到0.5%)
對(duì)于一個(gè)新的運(yùn)營(yíng)者來(lái)說(shuō),有利可圖是很重要的,否則沒(méi)有人會(huì)為此付出代價(jià)。如果沒(méi)有人愿意成為運(yùn)營(yíng)者,費(fèi)用可以適當(dāng)?shù)卦黾印?/p>
以當(dāng)前gas價(jià)格為例:
假設(shè)一名運(yùn)營(yíng)者希望每小時(shí)更新一次snark。他每年在gas上的花費(fèi)大約為0.50$ × 24 × 356 = 3560 + 812 = 4372美元,他每年要處理50000筆存款和提現(xiàn)交易,假設(shè)這名運(yùn)營(yíng)者每提現(xiàn)一次只需支付0.1美元,這就需要額外的5000美元成本,而服務(wù)器的成本又需要4000美元,而他如果預(yù)計(jì)的利潤(rùn)為每年5628美元。
那他預(yù)計(jì)的收入總額就要達(dá)到20000美元,他需要對(duì)每筆存款交易收取0.3美元,或者3倍的以太坊gas費(fèi)用,這樣他的業(yè)務(wù)才是可持續(xù)的。這個(gè)問(wèn)題可能是有趣的。
barryWhiteHat回復(fù):
“怎樣的收費(fèi)才是有意義的?”
這取決于用途。我希望它能夠應(yīng)用于不可替代通證、去中心化媒體以及一堆其它應(yīng)用。文章中我們沒(méi)有具體討論到費(fèi)用。如果你想按每筆交易收取費(fèi)用,你可以使用存款費(fèi)或取款費(fèi)的方式(當(dāng)然不包括優(yōu)先隊(duì)列,這意味著你的取款費(fèi)必須比優(yōu)先隊(duì)列費(fèi)用要低,以防止費(fèi)用避免問(wèn)題的發(fā)生),你可能需要用到plasma debit這類技術(shù)。目前,我不知道哪種方式最有意義。我想看到一些充分使用的情況。
“你如何確保一個(gè)誠(chéng)實(shí)者隨時(shí)準(zhǔn)備成為一名運(yùn)營(yíng)者?”
他們不需要誠(chéng)實(shí),我們只是需要有人挺身而出,最好的辦法,似乎就是付錢給他們。當(dāng)然,這也取決于用例。
MihailoBjelic:
@barryWhiteHat 為你們之前以及現(xiàn)在的工作致敬!
“barryWhiteHat:系統(tǒng)在默克爾樹(shù)(merkle tree)中有一個(gè)item列表,其將公鑰(所有者)與不可替代通證聯(lián)系起來(lái)?!?/p>
可以說(shuō)說(shuō),為什么整個(gè)設(shè)計(jì)是基于NFT嗎,你們是否認(rèn)為它對(duì)于公鑰-余額模型(當(dāng)然會(huì)有一些修改)也是有效的呢?
barryWhiteHat:
余額(Balance)模型是很棘手的,因?yàn)槟憧梢酝ㄟ^(guò)將余額(Balance)從一個(gè)leaf(子葉)移動(dòng)到另一個(gè)leaf(子葉),從而實(shí)現(xiàn)取出相同的余額(Balance)兩次。
我們可以嘗試并建立plasma debit,以增加可調(diào)節(jié)的余額(Balance)。但這需要我們更多的思考。
MihailoBjelic:
對(duì)不起,我沒(méi)有看懂你所說(shuō)的話。你怎么能把你的balance轉(zhuǎn)移到另一個(gè)leaf(子葉)上,你不是只有一個(gè)代表你賬戶(及其余額)的 leaf嗎?或許你的思路是用到了SMT?如果你有時(shí)間,請(qǐng)查看@jieyilong的帖子:通過(guò)鏈上智能合約實(shí)現(xiàn)的鏈外Plasma狀態(tài)驗(yàn)證 (你可以只閱讀“Plasma狀態(tài)構(gòu)造”和“概率Plasma狀態(tài)驗(yàn)證”部分的內(nèi)容)。我在思考類似的東西,但使用的是SNARK,而不是隨機(jī)抽樣?
barryWhiteHat:
不確定我們是否在同一個(gè)頻道。這是我的回答,希望它能回答你提出的問(wèn)題。
“你怎么能把你的余額(balance)轉(zhuǎn)移到另一個(gè)leaf(子葉)上,你不是只有一個(gè)代表你賬戶(及其余額)的 leaf嗎?”
如果你無(wú)法移動(dòng)leaf之間的余額(balance),那么你就沒(méi)有賬戶余額,因?yàn)橛囝~永遠(yuǎn)都不會(huì)改變。如果你不能移動(dòng) leaf之間的余額(不包括plasma debit),那么你擁有的只是一個(gè)輸入輸出模型。
“我在思考類似的東西,但使用的是SNARK,而不是隨機(jī)抽樣? ”
我快速地瀏覽了一下,如果你想驗(yàn)證整棵默克爾樹(shù)( merkle tree)的完整性,為什么不驗(yàn)證每筆交易呢?對(duì)一棵大默克爾樹(shù)進(jìn)行證明,這需要大量的哈希,而這是相當(dāng)昂貴的。
評(píng)論
查看更多