無狀態全節點(Stateless Full Node)

作者:扎克-赫斯, Zack Hess https://github.com/zack-bitcoin/amoveo-docs/blob/master/design/stateless%5Ffull%5Fnode.md amoveo-docs/stateless_full_node.md at master - zack-bitcoin/amoveo-docs

無狀態全節點 #

共識狀態是區塊鏈以去中心化的無信任方式維護的信息。例如,你的賬戶餘額是共識狀態的一部分。沒有人可以操縱你的餘額,即使他們願意花很多錢來做這件事。

無狀態全節點策略是指全節點和礦池不需要爲了驗證區塊是否有效而存儲一份共識狀態。

Amoveo自2018年3月推出以來,一直被設計爲使用無狀態全節點。

區塊鏈網絡中的節點種類 #


  • 輕節點。他們下載報頭並驗證Pow。他們可以驗證你的賬戶餘額證明並簽署txs。
  • 無狀態全節點。他們下載和驗證區塊,但只存儲頭文件。可以是一個礦池。
  • 共識狀態的完整節點。他們下載和驗證區塊,但只存儲頭文件和共識狀態。他們可以向輕型節點證明賬戶餘額,併爲任何人生成無符號的txs。
  • 歸檔的完整節點。他們下載和驗證區塊,並存儲區塊。

不通過硬盤驗證一個的區塊 #

無狀態全節點中的區塊驗證過程。全節點驗證頭的PoW。一旦一個頭是有效的,那麼全節點就會下載該頭的塊。全節點掃描區塊中的merkle證明,它對merkle證明的各塊進行散列,以驗證每個merkle證明是否有效,並建立一個小型的ram數據庫,其中包括驗證該區塊中的txs所需的部分共識狀態。最後,全節點可以檢查該塊中的txs是否有效。

平行驗證區塊 #

無狀態全節點策略的一個優點是,全節點可以以任何順序驗證區塊。由於全節點沒有維護任何數據庫來驗證區塊,它可以知道一個區塊是有效的,而不需要記住關於之前區塊的任何信息。因此,我們可以以相反的順序驗證區塊,或者並行驗證。

Amoveo目前默認是平行驗證區塊,有一個配置選項可以按相反順序驗證區塊。反向驗證區塊意味着,如果發生分叉,你的節點可以立即查看與該分叉有關的區塊,你不需要等待幾個小時來驗證歷史,以達到分叉的目的。這大大降低了我們對全節點的CPU能力所需的安全係數。我們可以使用50%或更多的CPU能力來保持同步。

消極的方面 #

無狀態全節點策略的最大缺點是,每個區塊都需要包括處理該區塊所需的所有共識狀態的加密證明。例如,如果你想做一個tx來花掉你的一些錢,包含這個tx的區塊需要包括你的餘額的加密證明。這樣,全部節點就可以確定你有足夠的錢來負擔你想花的金額。

在未來,我們可能會找到更有效的方法來向全部節點加密證明共識狀態,但我們目前的策略是使用Merkle證明。這些Merkle證明是很大的,它們使一個典型的交易比原來大十倍左右。所以每筆交易在一個區塊中佔用的空間比在比特幣中多10倍。這意味着一個使用無狀態全節點策略的1兆字節的區塊所能容納的交易比普通比特幣少10倍。

平行硬盤 #

今天,按順序寫入硬盤的速度可以非常快,甚至消費類產品也在每秒1千兆字節左右。這些硬盤可以在RAID中被微不足道地並行化,以提供我們需要的任何速度。

也可以使用有狀態全節點的並行化數據庫,但非常複雜。txs需要並行處理,所以有不同的線程想訪問不同的硬盤來讀/寫數據頁,如果他們想同時看不同的硬盤,他們可以。

沒有隨機的硬盤讀/寫 #

在大多數區塊鏈中,交易處理的瓶頸在於對硬盤的讀取和寫入。這是因爲當你處理一個區塊時,你需要隨機地讀寫散落在硬盤上的一點點數據。像這樣到處讀和寫數據位,比順序讀/寫慢3倍左右,即使你使用最佳頁面大小。例如,在比特幣中,當每個交易被處理時,它消耗了一些未用的輸出,並創造了一些未用的輸出。所以爲了處理這個交易,全節點需要在其數據庫中搜索那些被消耗的輸出,並將其刪除。而全節點需要將新的未花費的產出插入其數據庫中。讀取和寫入這些未花費的產出來維護數據庫是非常慢的。

計算無狀態全節點的速度限制 #

無狀態全節點設計中的交易需要一個merkle證明。Merkle證明的大小,對於一個二進制的Merkle樹,其加密哈希值爲32字節,系統中有1000億個賬戶。322log2(1000億) = 32236.5 = 2336字節 平均來說,我們每筆tx需要大約3個merkle證明。交易本身大約是400字節,因此,所有這些加在一起,每個tx被處理約爲7.5千字節。

現代光纜每秒可發送100兆字節。因此,帶寬限制是每秒100億次txs。意味着地球上的每個人每秒都可以進行一次tx。

帶寬不是區塊鏈的瓶頸,因此擁有更大的區塊和需要更多的帶寬並不是一個問題。

共識狀態全節點的比較 #

現代固態硬盤的隨機讀/寫速度比連續讀/寫速度慢3倍左右,如果你讀/寫的是4千字節的最佳頁面大小。

如果我們使用的是二進制merkle樹,並且我們以4KB的最佳方式打包,那麼這意味着數據庫樹的每個節點將有~64個孩子。如果樹上有1000億個賬戶,那麼讀/寫將意味着訪問log64(1000億),或者大約6頁。平均而言,我們需要在每個tx上讀/寫3個位置。(3個位置)

(6頁) * (每頁4千字節) = #

72千字節/tx。由於是隨機讀/寫,它比順序讀/寫慢3倍。所以這需要的時間和順序寫入216千字節一樣多。有內存的完整節點需要讀取所有內容,處理區塊,然後寫入所有內容的新版本。它在不同的步驟中讀取和寫入,給另一個2倍的緩慢係數。所以它需要的時間和432千字節的順序一樣多。

一個無狀態的全節點在每個tx上需要大約3個merkle證明。證明的大小是log2(1000億)。因此,每個tx大約7.5千字節。

432/7.5大約是60。因此,一個存儲所有共識狀態的無狀態全節點,比一個存儲共識狀態的全節點的效率要高60左右。其中,效率是指在每個tx上讀/寫硬盤的總時間。

不存儲區塊的無狀態全節點可以比歸檔節點便宜得多。非歸檔的無狀態全節點永遠不需要對硬盤進行讀或寫。

歸檔全節點的比較 #

無狀態的全節點區塊鏈,它們的txs每個大約是7.5千字節。相比之下,存儲共識狀態的區塊鏈約爲400字節。這意味着無狀態全節點的區塊約爲40倍大。

如果我們存儲2個月的區塊,平均每個人每天做2次txs,有100億用戶,這意味着我們存儲了大約1萬億txs。

所以有狀態的全節點,檔案節點將需要大約400兆字節的硬盤空間。一個擁有無狀態全節點的區塊鏈,每個檔案節點需要7500兆字節的硬盤空間。

在無狀態設計中,歸檔節點的成本明顯較高,但預計歸檔節點將是網絡中的少數,所以使用無狀態全節點設計的網絡的總成本可以更低。

礦池的比較 #

在無狀態全節點設計中,一個礦池可以是一個無狀態全節點。但在有狀態的全節點設計中,一個礦池需要成爲一個共識狀態的全節點,這要昂貴得多。

在不存儲區塊的情況下驗證區塊的成本。

如果我們不斷向區塊鏈添加更多的用戶,那麼共識狀態的總規模最終會變得非常大。對於有狀態的全節點,它們需要訪問所有這些共識狀態,以便能夠驗證區塊。如果有1000億個賬戶,每個賬戶有64字節的merkle證明數據,和32字節的地址,以及少量的其他字節。那每個賬戶大約是100字節。所以我們需要10萬億字節的共識空間,或大約10兆字節。因此,一個10兆字節的固態硬盤是強制性的,只是爲了驗證區塊,目前它們的成本遠遠超過1000美元。由於速度原因,可能需要在RAID中運行多個這樣的硬盤,這使得成本更高。

相比之下,用於挖礦的無狀態全節點需要大約1千兆字節的內存,以便能夠驗證區塊,其成本約爲10美元。

共識狀態全節點的比較 #

在無狀態的全節點策略中,共識狀態的全節點可以存儲他們感興趣的任何部分的共識狀態。所以這是一種分片的做法。我們可以將共識狀態劃分到不同的節點上,而任何一個單獨的節點的內存需求都可以得到限制。

如果我們不使用無狀態的全節點策略,那麼每個cosnensus狀態的全節點都需要存儲整個共識狀態,因爲這是驗證區塊的唯一方法。對於一個全球區塊鏈來說,這意味着一個10兆字節的硬盤。

在無狀態全節點中並行驗證Txs #

用於驗證txs的ram內數據庫的共識狀態。我們可以在txs之間的不同點設置檢查點,並且爲每個檢查點設置不同版本的ram內共識狀態。這樣一來,被這些檢查點隔開的區域就可以被平行處理。在處理完一個區域後,全節點需要檢查該區域的最終共識狀態,它與該區域結束時的檢查點數據一致。Amoveo目前沒有並行驗證txs,但我們有計劃增加這方面的支持。

在無狀態全節點中並行驗證智能合約 #

並行驗證智能合約與TXS並行非常相似。我們需要將智能合約的執行分割到一個以上的 tx 上。在這些txs之間,我們需要一個智能合約在該執行點的狀態的檢查點。在處理區塊時,在智能合約的每個塊之後,全節點需要驗證智能合約的狀態是否與檢查點相符。

Amoveo使用的其他技巧使智能合約具有可擴展性 #

有人說,無狀態的全節點只會讓以太坊的可擴展性提高3倍,但這種設計將使Amoveo的規模遠遠超過這個數字。Amoveo的智能合約系統完全針對這種設計進行了優化。

Amoveo的智能合約系統是基於欺詐證明的。大多數智能合約都不需要上鍊,因爲如果參與者對結果達成一致,他們可以在不需要區塊鏈強制執行的情況下解決正確的結果。他們被激勵在沒有區塊鏈的情況下解決他們的合同,因爲使用區塊鏈來執行結果對他們來說成本更高。相對於其他智能合約區塊鏈,如以太坊,這大大降低了CPU成本。

Amoveo的智能合約系統使用Merklized抽象語法樹。這意味着只有合同的實際執行部分才需要上鍊。與其他智能合約區塊鏈(如以太坊)相比,這大大降低了CPU成本。

Amoveo的智能合約交易總是可並行的。不可能使它們成爲單線程任務,就像在其他智能合約區塊鏈中可能發生的那樣,比如以太坊或任何使用EVM的區塊鏈。這大大降低了Amoveo的智能合約系統的CPU成本。

相關鏈接 #

以太坊正在研究類似的想法