以太坊顛覆了以太坊:引入密碼學(xué)實(shí)現(xiàn)2.0性能突破

企鵝號(hào)
火星財(cái)經(jīng)24h
區(qū)塊鏈?zhǔn)且粋€(gè)分布式賬本,出塊節(jié)點(diǎn)是記賬的礦工,它們負(fù)責(zé)把交易寫入賬本。除了競(jìng)爭(zhēng)記賬權(quán),出塊節(jié)點(diǎn)最重要的工作,或者說(shuō)本職工作就是檢查自己打包的這些交易是否合法。完成這個(gè)工作并不難,因?yàn)槌鰤K節(jié)點(diǎn)手中握有賬本,它去查一下交易發(fā)送方有沒(méi)有這筆錢即可。

性能是阻礙公鏈發(fā)展的瓶頸,提升性能則是絕大多數(shù)希望超越以太坊的公鏈的主要設(shè)計(jì)目標(biāo),但當(dāng)我們站在今天回望時(shí),會(huì)發(fā)現(xiàn)這些公鏈選擇的方法大多是通過(guò)機(jī)制的設(shè)計(jì)來(lái)增強(qiáng)一個(gè)分布式系統(tǒng)的性能,但受困于分布式系統(tǒng)CAP定理(不可能三角),改善性能是要付出代價(jià)的,當(dāng)這個(gè)分布式系統(tǒng)的用途是賬本時(shí),這些代價(jià)甚至可能是難以被接受的。以太坊也一直在嘗試各種方法以提升性能,在2.0被推出的前夜,它「試」出了密碼學(xué)。

以太坊2.0將是一個(gè)以「分布式系統(tǒng)+密碼學(xué)」為基礎(chǔ)來(lái)運(yùn)轉(zhuǎn)的公鏈,這個(gè)密碼學(xué)不是指被用于簽名和隱私的那部分,而是指作為一個(gè)高性能系統(tǒng)的核心組件的那部分。從這個(gè)角度而言,或許我們可以說(shuō)顛覆以太坊的不是別人,而是它自己。它從分布式系統(tǒng)設(shè)計(jì)的單一思路中跳了出來(lái),走上分布式系統(tǒng)+密碼學(xué)組合設(shè)計(jì)的道路。這篇文章將試著介紹在以太坊2.0中,分布式系統(tǒng)設(shè)計(jì)如何與密碼學(xué)設(shè)計(jì)結(jié)合,實(shí)現(xiàn)公鏈在性能上突破。

狀態(tài)分片:從單賬本到多賬本

區(qū)塊鏈?zhǔn)且粋€(gè)分布式賬本,出塊節(jié)點(diǎn)是記賬的礦工,它們負(fù)責(zé)把交易寫入賬本。除了競(jìng)爭(zhēng)記賬權(quán),出塊節(jié)點(diǎn)最重要的工作,或者說(shuō)本職工作就是檢查自己打包的這些交易是否合法。完成這個(gè)工作并不難,因?yàn)槌鰤K節(jié)點(diǎn)手中握有賬本,它去查一下交易發(fā)送方有沒(méi)有這筆錢即可。

對(duì)于未分片的公鏈,所有節(jié)點(diǎn)都持有一個(gè)相同的賬本;而為了防止記賬沖突,每次也只允許一個(gè)出塊節(jié)點(diǎn)記賬。以太坊提出狀態(tài)分片,實(shí)際上就是把一個(gè)賬本分成多個(gè)賬本,這樣一來(lái),一些節(jié)點(diǎn)在1號(hào)賬本記賬,一些節(jié)點(diǎn)在2號(hào)賬本記賬……(相當(dāng)于7-11從一個(gè)收銀臺(tái)增加為多個(gè)收銀臺(tái)),多個(gè)節(jié)點(diǎn)同時(shí)記賬,整個(gè)公鏈的性能就會(huì)得到質(zhì)的提升。但如果我們把出塊節(jié)點(diǎn)與賬本/分片的關(guān)系固定,比如確定由a、b、c、d四個(gè)節(jié)點(diǎn)負(fù)責(zé)1號(hào)賬本,那壞人只需收買a、b、c、d中的一部分就能破壞賬本,公鏈在提升性能的同時(shí),安全性同比例下降。因此,出塊節(jié)點(diǎn)需要被隨機(jī)、動(dòng)態(tài)地分配到不同賬本,以此保證分片后的公鏈與未分片的公鏈具有相同的安全性。但動(dòng)態(tài)分配會(huì)帶來(lái)新的問(wèn)題:節(jié)點(diǎn)手中該拿哪一個(gè)賬本?它可能會(huì)被分配到64個(gè)賬本(以太坊計(jì)劃啟動(dòng)64個(gè)分片)中的任何一個(gè)去記賬。以太坊給出的方案是出塊節(jié)點(diǎn)不拿任何一個(gè)賬本,或者說(shuō),讓出塊節(jié)點(diǎn)不需要賬本就能記賬。這會(huì)帶來(lái)兩大好處,一是不管節(jié)點(diǎn)被分配到哪個(gè)分片,它都可以立刻開(kāi)始記賬(出塊)工作,幾乎不用花費(fèi)時(shí)間來(lái)獲得以及同步該分片的賬本,節(jié)點(diǎn)也因此可以在不同分片間輕松跳轉(zhuǎn);二是出塊節(jié)點(diǎn)不需要存儲(chǔ)賬本,也就不需要高硬件配置,任何人抵押32ETH就能成為一個(gè)驗(yàn)證者,這非常有助于以太坊PoS的去中心化以及整個(gè)公鏈的安全。但新問(wèn)題躍然紙上:如果出塊節(jié)點(diǎn)手中沒(méi)有賬本,它怎么知道交易發(fā)送方的錢夠不夠?密碼學(xué)就在這時(shí)候登場(chǎng)了。

向量承諾:從查詢到證明

不需要賬本就能記賬聽(tīng)上去不可思議,但其思路是簡(jiǎn)單的:在以前,節(jié)點(diǎn)有賬本,一筆交易來(lái)后它翻看賬本,查詢交易是否合法;在以后,節(jié)點(diǎn)沒(méi)有賬本,交易發(fā)送方在提交交易的同時(shí)需要提交一個(gè)密碼學(xué)證明(為了區(qū)分,后文特指密碼學(xué)證明時(shí)都用proof表示),自己證明自己的這筆交易是合法的。

可出塊節(jié)點(diǎn)為什么能夠通過(guò)一個(gè)proof來(lái)判斷某筆交易是否合法?這里涉及到兩個(gè)密碼學(xué)的重要概念,第一個(gè)叫「成員證明」。它指的是通過(guò)某種方法,證明個(gè)體是群體的一部分。如果能夠證明某個(gè)賬戶狀態(tài)是整個(gè)賬本狀態(tài)的一部分,出塊節(jié)點(diǎn)當(dāng)然就能相信這個(gè)賬戶狀態(tài),并以此為根據(jù)進(jìn)行交易合法性的判斷。第二個(gè)叫「向量承諾」,它可以將群體,不管這個(gè)群體有多龐大,壓縮成僅僅一個(gè)數(shù),然后給出成員證明,該成員證明表明的是某個(gè)個(gè)體是屬于這個(gè)數(shù)背后所關(guān)聯(lián)的群體的,且能證明個(gè)體在群體中的位置,以及進(jìn)行證明的更新。Merkle樹(shù)是可被用于向量承諾的方法之一,我們以它為例來(lái)看如何實(shí)現(xiàn)成員證明。下圖是一棵Merkle樹(shù),最下一層的葉子節(jié)點(diǎn)存儲(chǔ)的是應(yīng)用數(shù)據(jù),其他非葉節(jié)點(diǎn)存儲(chǔ)的是其子節(jié)點(diǎn)的哈希值。如果知道綠色節(jié)點(diǎn)和所有黃色節(jié)點(diǎn)的值,就可以從下至上進(jìn)行三次哈希運(yùn)算,得到該Merkle樹(shù)根的值,也就是6c0a。

那么,如果驗(yàn)證方手中有樹(shù)根的值(6c0a),證明提供方把綠色節(jié)點(diǎn)的值和所有黃色節(jié)點(diǎn)的值作為一個(gè)proof給驗(yàn)證方,驗(yàn)證方是不是就能通過(guò)計(jì)算三次哈希的值是否等于6c0a來(lái)判斷綠色節(jié)點(diǎn)的值是否在這棵Merkle樹(shù)中?答案是可以。這就是對(duì)綠色節(jié)點(diǎn)屬于Merkle樹(shù)的成員證明,它是以向量承諾的方式完成的,而這也幾乎就是比特幣SPV節(jié)點(diǎn)(簡(jiǎn)單支付驗(yàn)證)的工作方式。

如下圖所示,SPV節(jié)點(diǎn)不存儲(chǔ)完整的區(qū)塊/賬本,但存儲(chǔ)了每個(gè)區(qū)塊中Merkle樹(shù)的樹(shù)根(此Merkle樹(shù)的葉子節(jié)點(diǎn)存儲(chǔ)的是該區(qū)塊所有交易),當(dāng)它需要查詢一筆交易是否存在時(shí),會(huì)找全節(jié)點(diǎn)要一個(gè)該交易的proof,該proof類似于上文中綠色節(jié)點(diǎn)和黃色節(jié)點(diǎn)值的一個(gè)打包(Merkle路徑),然后SPV節(jié)點(diǎn)會(huì)計(jì)算這些值的總的哈希值是否等于自己手中Merkle樹(shù)根的值,如果相等,則說(shuō)明這筆交易是該Merkle樹(shù)的一個(gè)成員,即這筆交易是存在的。

SPV節(jié)點(diǎn)只存儲(chǔ)區(qū)塊頭(綠框),區(qū)塊頭中包含Merkle樹(shù)根(紅框)

SPV節(jié)點(diǎn)通過(guò)成員證明判斷交易是否存在,該證明系統(tǒng)包含三個(gè)部分:節(jié)點(diǎn)手中有一個(gè)簡(jiǎn)短的摘要(樹(shù)根);證明提供方給出一個(gè)proof;節(jié)點(diǎn)計(jì)算此proof,看是否與自己手中的摘要相符合。到此,我們就完成了「不需要賬本就能查賬」,它是把查詢思路改為了證明思路;接下來(lái)我們要實(shí)現(xiàn)的是「不需要賬本就能記賬」。對(duì)于以太坊2.0分片上的出塊節(jié)點(diǎn)而言,它的證明系統(tǒng)同樣是由摘要、證明、驗(yàn)證這三部分構(gòu)成,但它要做到是使用交易發(fā)送方(而不是全節(jié)點(diǎn))給出的proof來(lái)判斷一筆新交易是否合法(而不是舊交易是否存在),并以此判斷為基礎(chǔ)記賬。

無(wú)狀態(tài):從證明賬本到證明行為

想象有一個(gè)很小的村莊,這個(gè)村莊每天只有3筆村民間的交易,村長(zhǎng)拿著賬本負(fù)責(zé)記賬。A現(xiàn)在要給B轉(zhuǎn)5塊錢,傳統(tǒng)的思路很簡(jiǎn)單:村長(zhǎng)看A的賬戶上是否有5塊錢,如果有,就記下這筆新交易?,F(xiàn)在換一個(gè)思路:假設(shè)A在今天早上要給B轉(zhuǎn)5塊錢,村長(zhǎng)知道A的賬戶在昨天早上有10塊錢,那么如果A能夠證明昨天的3筆交易都和他沒(méi)有關(guān)系,是不是就意味著他的賬戶在今天早上依然有10塊錢?這樣一來(lái),村長(zhǎng)是不是不用查賬本就能放心記下這筆新交易?答案是肯定的。如果A昨天有一筆交易怎么辦?很簡(jiǎn)單,A這時(shí)不是證明自己沒(méi)交易,而是證明自己昨天只有一筆交易,且那筆交易用掉了3塊錢;村長(zhǎng)就知道他還有7塊錢,可以記下新交易。這個(gè)思路的轉(zhuǎn)變至關(guān)重要,你一定要去理解它,這是「無(wú)狀態(tài)」這件事的奧妙所在。不難發(fā)現(xiàn),即使是不拿賬本的SPV節(jié)點(diǎn),它在查詢交易時(shí)實(shí)際上也是要用到賬本,或者說(shuō)狀態(tài)的,只不過(guò)它不是自己存儲(chǔ)狀態(tài),而是去找全節(jié)點(diǎn)要這個(gè)狀態(tài)的證明;但在這個(gè)新思路下,狀態(tài)的作用可以徹底被「行為證明」取代,那么這條鏈就能夠以無(wú)狀態(tài)的方式去設(shè)計(jì)。(注:行為證明這個(gè)詞并無(wú)出處,是作者為了易于理解這樣描述的)如何實(shí)現(xiàn)無(wú)狀態(tài)?如何借助于行為證明完成記賬?依然是成員證明的方法。能夠利用Merkle樹(shù)來(lái)完成這種成員證明嗎?理論上可以,但對(duì)于「無(wú)狀態(tài)」這個(gè)應(yīng)用場(chǎng)景來(lái)說(shuō),用它的開(kāi)銷過(guò)大。

在本文中,我們將介紹通過(guò)「可聚合子向量承諾」來(lái)進(jìn)行成員證明,以實(shí)現(xiàn)無(wú)賬本記賬??删酆献酉蛄砍兄Z(aSVC)是一個(gè)最新的研究成果,來(lái)自于論文《無(wú)狀態(tài)密碼貨幣的可聚合子向量承諾》,作者是Alin Tomescu、Ittai Abraham、Vitalik Buterin(以太坊)、Justin Drake(以太坊)、Dankrad Feist(以太坊)、 Dmitry Khovratovich(以太坊)。其工作過(guò)程是這樣的:

1. 初始化分片,即在賬本建立時(shí)確定賬戶的初始情況。假設(shè)某個(gè)分片建立時(shí)有100個(gè)賬戶,這些賬戶都有初始的余額,我們需要用v(i)代表第i個(gè)賬戶,它是(地址i,余額i)這樣的一對(duì)值;用V代表全部賬戶,它是(地址1,余額1)(地址2,余額2)……(地址100,余額100)這樣的一組值。同時(shí)需要生成兩個(gè)值,第一個(gè)叫c,它是對(duì)V的承諾,代表的是此時(shí)該分片所有賬戶和賬戶里的余額。出塊節(jié)點(diǎn)手中都握有c,(可以對(duì)比Merkle樹(shù)根來(lái)便于理解),它是將來(lái)用于驗(yàn)證的摘要。第二個(gè)叫π(i),它是對(duì)v(i) 是V的成員的證明,代表第i個(gè)賬戶及該賬戶的余額是在總賬本V中。每個(gè)賬戶都握有且只握有自己的π(i),它是將來(lái)發(fā)送交易時(shí)提交給出塊節(jié)點(diǎn)的proof。在初始化階段,承諾和證明的生成是需要初始「狀態(tài)」的。

2. 第一筆交易。賬戶 i發(fā)起整個(gè)分片的第一筆交易,此時(shí)它需要把π(i)和交易一起提交給出塊節(jié)點(diǎn),出塊節(jié)點(diǎn)對(duì)π(i)進(jìn)行計(jì)算,看結(jié)果是否與自己手中的c相符合,如果一致就可以相信發(fā)送方賬戶確實(shí)有多少余額,并以此判斷它提交的交易是否合法。

3. 接下來(lái)是關(guān)鍵之處:對(duì)c和π(i)進(jìn)行更新。c(對(duì)整個(gè)賬本的承諾)不再是根據(jù)狀態(tài)生成,它是用第一筆交易發(fā)生之前的c,以及第一筆交易引起的余額變動(dòng)生成的;π(i)(賬戶對(duì)自己的證明)也不是根據(jù)狀態(tài)生成,它是用第一筆交易發(fā)生之前的π(i),以及第一筆交易對(duì)該賬戶的改變生成的。在完成c和π(i)的更新之后,出塊節(jié)點(diǎn)手中便有了可以承諾所有用戶新余額的新承諾(新c),賬戶手中也有了可以證明自己新余額的新proof(新π(i))。以此類推,每筆交易都會(huì)改變一次c,改變一次全部π(i),但這種改變不再依賴于狀態(tài)數(shù)據(jù),它取決于舊的c和π(i),以及上一筆交易;當(dāng)需要驗(yàn)證一筆新交易時(shí),出塊節(jié)點(diǎn)手中總有最新的c,它通過(guò)c和賬戶提供的π(i)就能判斷某筆交易是否合法,是否可被打包進(jìn)區(qū)塊。

那么到這一步,就終于實(shí)現(xiàn)了「不需要賬本就能記賬」,不管對(duì)于出塊節(jié)點(diǎn),還是對(duì)于賬戶,它們手中握著的都是某種密碼學(xué)的證明,而不是賬本的狀態(tài)。另需一提的是,無(wú)狀態(tài)與分片似乎是絕配,但無(wú)狀態(tài)并不是針對(duì)分片的一種設(shè)計(jì),它是針對(duì)公鏈的一種設(shè)計(jì)。aSVC的設(shè)計(jì)目標(biāo)是要成為一個(gè)高效的成員證明,降低上述過(guò)程中的通信開(kāi)銷和計(jì)算開(kāi)銷,使得這種方案可用于無(wú)狀態(tài)區(qū)塊鏈的實(shí)現(xiàn)。從論文來(lái)看,使用aSVC方案,c和π(i)的大小僅為幾十個(gè)字節(jié),π(i)的更新時(shí)間為O(1),驗(yàn)證時(shí)間也為O(1),該方案還支持把多個(gè)proof聚合為一個(gè)O(1)大小的proof,這種低開(kāi)銷的實(shí)現(xiàn)正是aSVC的意義所在。不過(guò)就像Vitalik在以太坊研究者論壇中展開(kāi)的相關(guān)討論,aSVC還需要做進(jìn)一步的優(yōu)化。

文章的最后是對(duì)全文的簡(jiǎn)要總結(jié):分布式系統(tǒng)的狀態(tài)分片設(shè)計(jì)與密碼學(xué)的成員證明設(shè)計(jì)相結(jié)合,實(shí)現(xiàn)以太坊2.0在性能上突破。1.為了安全,以太坊2.0的狀態(tài)分片需要隨機(jī)分配出塊節(jié)點(diǎn)。2.如果出塊節(jié)點(diǎn)需要賬本,賬本同步會(huì)成為新的性能瓶頸,賬本存儲(chǔ)也會(huì)影響PoS的去中心化。3.是否有不需要賬本就能驗(yàn)證余額的方式?4.第一個(gè)思路轉(zhuǎn)變:把查找賬本的方式改為證明賬本的方式。這需要借助于密碼學(xué)來(lái)完成。5.第二個(gè)思路轉(zhuǎn)變:把證明賬本狀態(tài)的方式改為證明交易行為的方式,實(shí)現(xiàn)無(wú)狀態(tài)和無(wú)需賬本的記賬。這需要借助于密碼學(xué)來(lái)完成。6.密碼學(xué)的工具有很多,當(dāng)有了目標(biāo)后,需要根據(jù)應(yīng)用需求選擇和組合適當(dāng)?shù)墓ぞ咝纬煞桨?,并?duì)方案進(jìn)行優(yōu)化。

彩蛋

可聚合子向量承諾

在文章中我們用自然語(yǔ)言描述了aSVC的工作,如果你感興趣,可以通過(guò)aSVC 的API定義來(lái)更清晰地了解它。如下圖所示:第一個(gè)紅框是初始化時(shí)生成承諾c,第二個(gè)紅框是根據(jù)交易更新c;第一個(gè)綠框是初始化時(shí)生成證明π(i),第二個(gè)綠框是根據(jù)交易更新π(i);藍(lán)框是出塊節(jié)點(diǎn)用c和π(i)做驗(yàn)證。

在上述過(guò)程中,最核心的工作是根據(jù)交易引發(fā)的變動(dòng)把舊的c變成新的c,把舊的π(i)變成新的π(i)。不但要能夠完成更新,且這種更新的開(kāi)銷是可以被接受的,這是aSVC要解決的關(guān)鍵問(wèn)題。我們以c的更新為例來(lái)介紹aSVC是如何做的。

如前文所述,c承諾的是V,從c到新c,實(shí)際上就是從承諾V到承諾一個(gè)新的V。對(duì)V來(lái)說(shuō),它是由一系列的點(diǎn)構(gòu)成的,(地址1,余額1)是一個(gè)點(diǎn),(地址2,余額2)是另一個(gè)點(diǎn)……(地址100,余額100)是第100個(gè)點(diǎn)。借助于拉格朗日插值法,可以把這一系列的點(diǎn)變成一個(gè)多項(xiàng)式(該多項(xiàng)式代表的曲線經(jīng)過(guò)所有這些點(diǎn)),這意味著可以把對(duì)一系列點(diǎn)的承諾變成對(duì)一個(gè)多項(xiàng)式的承諾;從c到新c,也就等價(jià)于從承諾一個(gè)多項(xiàng)式到承諾另一個(gè)多項(xiàng)式。而多項(xiàng)式有著各種神奇的屬性,對(duì)多項(xiàng)式及多項(xiàng)式變換的承諾可以是小的、快速的。那么通過(guò)這種從點(diǎn)到多項(xiàng)式的轉(zhuǎn)化,就可以把c的更新開(kāi)銷變?yōu)榭山邮艿?。但這只是對(duì)aSVC方案思路的一個(gè)簡(jiǎn)單、片面的介紹,在該方案中還使用了諸多其他工具和方法,而且它依然在追求更好的設(shè)計(jì)。如果你想更多的了解它,可以去閱讀原論文,其中的3.1節(jié)和4.1節(jié)是最有助于理解整篇論文的部分。

論文下載地址是:https://eprint.iacr.org/2020/527.pdf。

THEEND

最新評(píng)論(評(píng)論僅代表用戶觀點(diǎn))

更多
暫無(wú)評(píng)論