
編者按:本文來自安比實驗室(ID:secbitlabs),Odaily經授權轉載。
編者按:本文來自
安比實驗室(ID:secbitlabs)
,Odaily經授權轉載。
安比實驗室(ID:secbitlabs)
,Odaily經授權轉載。
安比實驗室(ID:secbitlabs)
二級標題
,Odaily經授權轉載。
以太坊也一直在嘗試各種方法以提升性能,在2.0被推出的前夜,它「試」出了密碼學。以太坊2.0將是一個以「分佈式系統+密碼學」為基礎來運轉的公鏈,這個密碼學不是指被用於簽名和隱私的那部分,而是指作為一個高性能係統的核心組件的那部分。
二級標題
從這個角度而言,或許我們可以說顛覆以太坊的不是別人,而是它自己。它從分佈式系統設計的單一思路中跳了出來,走上分佈式系統+密碼學組合設計的道路。
二級標題
狀態分片:從單賬本到多賬本
對於未分片的公鏈,所有節點都持有一個相同的賬本;而為了防止記賬衝突,每次也只允許一個出塊節點記賬。以太坊提出狀態分片,實際上就是把一個賬本分成多個賬本,這樣一來,一些節點在1號賬本記賬,一些節點在2號賬本記賬……(相當於7-11從一個收銀台增加為多個收銀台),多個節點同時記賬,整個公鏈的性能就會得到質的提升。
二級標題
但如果我們把出塊節點與賬本/分片的關係固定,比如確定由a、b、c、d四個節點負責1號賬本,那壞人只需收買a、b、c、d中的一部分就能破壞賬本,公鏈在提升性能的同時,安全性同比例下降。
以太坊給出的方案是出塊節點不拿任何一個賬本,或者說,讓出塊節點不需要賬本就能記賬。
二級標題
這會帶來兩大好處,一是不管節點被分配到哪個分片,它都可以立刻開始記賬(出塊)工作,幾乎不用花費時間來獲得以及同步該分片的賬本,節點也因此可以在不同分片間輕鬆跳轉;二是出塊節點不需要存儲賬本,也就不需要高硬件配置,任何人抵押32ETH就能成為一個驗證者,這非常有助於以太坊PoS的去中心化以及整個公鏈的安全。
二級標題
向量承諾:從查詢到證明
可出塊節點為什麼能夠通過一個proof來判斷某筆交易是否合法?這裡涉及到兩個密碼學的重要概念,第一個叫「成員證明」。它指的是通過某種方法,證明個體是群體的一部分。如果能夠證明某個賬戶狀態是整個賬本狀態的一部分,出塊節點當然就能相信這個賬戶狀態,並以此為根據進行交易合法性的判斷。
圖片描述
下圖是一棵Merkle樹,最下一層的葉子節點存儲的是應用數據,其他非葉節點存儲的是其子節點的哈希值。如果知道綠色節點和所有黃色節點的值,就可以從下至上進行三次哈希運算,得到該Merkle樹根的值,也就是6c0a。
圖片描述
如下圖所示,SPV節點不存儲完整的區塊/賬本,但存儲了每個區塊中Merkle樹的樹根(此Merkle樹的葉子節點存儲的是該區塊所有交易),當它需要查詢一筆交易是否存在時,會找全節點要一個該交易的proof,該proof類似於上文中綠色節點和黃色節點值的一個打包(Merkle路徑),然後SPV節點會計算這些值的總的哈希值是否等於自己手中Merkle樹根的值,如果相等,則說明這筆交易是該Merkle樹的一個成員,即這筆交易是存在的。
二級標題
圖片描述
SPV節點通過成員證明判斷交易是否存在,該證明系統包含三個部分:節點手中有一個簡短的摘要(樹根);證明提供方給出一個proof;節點計算此proof,看是否與自己手中的摘要相符合。
二級標題
到此,我們就完成了「不需要賬本就能查賬」,它是把查詢思路改為了證明思路;接下來我們要實現的是「不需要賬本就能記賬」。
對於以太坊2.0分片上的出塊節點而言,它的證明系統同樣是由摘要、證明、驗證這三部分構成,但它要做到是使用交易發送方(而不是全節點)給出的proof來判斷一筆新交易是否合法(而不是舊交易是否存在),並以此判斷為基礎記賬。
二級標題
無狀態:從證明賬本到證明行為
想像有一個很小的村莊,這個村莊每天只有3筆村民間的交易,村長拿著賬本負責記賬。 A現在要給B轉5塊錢,傳統的思路很簡單:村長看A的賬戶上是否有5塊錢,如果有,就記下這筆新交易。
現在換一個思路:假設A在今天早上要給B轉5塊錢,村長知道A的賬戶在昨天早上有10塊錢,那麼如果A能夠證明昨天的3筆交易都和他沒有關係,是不是就意味著他的賬戶在今天早上依然有10塊錢?這樣一來,村長是不是不用查賬本就能放心記下這筆新交易?答案是肯定的。
如果A昨天有一筆交易怎麼辦?很簡單,A這時不是證明自己沒交易,而是證明自己昨天只有一筆交易,且那筆交易用掉了3塊錢;村長就知道他還有7塊錢,可以記下新交易。
這個思路的轉變至關重要,你一定要去理解它,這是「無狀態」這件事的奧妙所在。不難發現,即使是不拿賬本的SPV節點,它在查詢交易時實際上也是要用到賬本,或者說狀態的,只不過它不是自己存儲狀態,而是去找全節點要這個狀態的證明;但在這個新思路下,狀態的作用可以徹底被「行為證明」取代,那麼這條鏈就能夠以無狀態的方式去設計。 (注:行為證明這個詞並無出處,是作者為了易於理解這樣描述的)
如何實現無狀態?如何借助於行為證明完成記賬?依然是成員證明的方法。能夠利用Merkle樹來完成這種成員證明嗎?理論上可以,但對於「無狀態」這個應用場景來說,用它的開銷過大。在本文中,我們將介紹通過「可聚合子向量承諾」來進行成員證明,以實現無賬本記賬。
可聚合子向量承諾(aSVC)是一個最新的研究成果,來自於論文《無狀態密碼貨幣的可聚合子向量承諾》,作者是Alin Tomescu、Ittai Abraham、Vitalik Buterin(以太坊)、Justin Drake(以太坊)、Dankrad Feist(以太坊)、 Dmitry Khovratovich(以太坊)。其工作過程是這樣的:
1. 初始化分片,即在賬本建立時確定賬戶的初始情況。假設某個分片建立時有100個賬戶,這些賬戶都有初始的餘額,我們需要用v(i)代表第i個賬戶,它是(地址i,餘額i)這樣的一對值;用V代表全部賬戶,它是(地址1,餘額1)(地址2,餘額2)……(地址100,餘額100)這樣的一組值。
同時需要生成兩個值,第一個叫c,它是對V的承諾,代表的是此時該分片所有賬戶和賬戶裡的餘額。出塊節點手中都握有c,(可以對比Merkle樹根來便於理解),它是將來用於驗證的摘要。
第二個叫π(i),它是對v(i) 是V的成員的證明,代表第i個賬戶及該賬戶的餘額是在總賬本V中。每個賬戶都握有且只握有自己的π(i),它是將來發送交易時提交給出塊節點的proof。
在初始化階段,承諾和證明的生成是需要初始「狀態」的。
2. 第一筆交易。賬戶i發起整個分片的第一筆交易,此時它需要把π(i)和交易一起提交給出塊節點,出塊節點對π(i)進行計算,看結果是否與自己手中的c相符合,如果一致就可以相信發送方賬戶確實有多少餘額,並以此判斷它提交的交易是否合法。
3. 接下來是關鍵之處:對c和π(i)進行更新。
c(對整個賬本的承諾)不再是根據狀態生成,它是用第一筆交易發生之前的c,以及第一筆交易引起的餘額變動生成的;π(i)(賬戶對自己的證明)也不是根據狀態生成,它是用第一筆交易發生之前的π(i),以及第一筆交易對該賬戶的改變生成的。
在完成c和π(i)的更新之後,出塊節點手中便有了可以承諾所有用戶新余額的新承諾(新c),賬戶手中也有了可以證明自己新余額的新proof(新π(i ))。
那麼到這一步,就終於實現了「不需要賬本就能記賬」,不管對於出塊節點,還是對於賬戶,它們手中握著的都是某種密碼學的證明,而不是賬本的狀態。另需一提的是,無狀態與分片似乎是絕配,但無狀態並不是針對分片的一種設計,它是針對公鏈的一種設計。
aSVC的設計目標是要成為一個高效的成員證明,降低上述過程中的通信開銷和計算開銷,使得這種方案可用於無狀態區塊鏈的實現。從論文來看,使用aSVC方案,c和π(i)的大小僅為幾十個字節,π(i)的更新時間為O(1),驗證時間也為O(1),該方案還支持把多個proof聚合為一個O(1)大小的proof,這種低開銷的實現正是aSVC的意義所在。不過就像Vitalik在以太坊研究者論壇中展開的相關討論,aSVC還需要做進一步的優化。
1.為了安全,以太坊2.0的狀態分片需要隨機分配出塊節點。
二級標題
2.如果出塊節點需要賬本,賬本同步會成為新的性能瓶頸,賬本存儲也會影響PoS的去中心化。
4.第一個思路轉變:把查找賬本的方式改為證明賬本的方式。這需要藉助於密碼學來完成。
二級標題
5.第二個思路轉變:把證明賬本狀態的方式改為證明交易行為的方式,實現無狀態和無需賬本的記賬。這需要藉助於密碼學來完成。
6.密碼學的工具有很多,當有了目標後,需要根據應用需求選擇和組合適當的工具形成方案,並對方案進行優化。https://eprint.iacr.org/2020/527.pdf。