Kernel Ventures:一文解析 DA 和歷史數據層設計



區塊鏈的功能越來越複雜,帶來了更大的存儲空間需求。

作者:Kernel Ventures Jerry Luo

TL;DR

  1. 早期公鏈要求全網節點保持數據一致性,以確保全全與去中心化。然而,隨著區塊鏈生態的發展,存儲壓力不斷增大,導致節點運營出現中心化的趨勢。現階段 Layer1 急需解決 TPS 增長帶來的存儲成本問題。

  2. 面對這一問題,開發者需要在兼顧安全性,存儲成本,數據讀取速度與 DA 層通用性的前提下,提出新的歷史數據存儲方案。

  3. 在解決這一問題的過程中,許多新技術與新思路湧現,包括 Sharding,DAS,Verkle Tree,DA 中間元件等。他們分別從減少數據冗餘與提高數據校驗效率等途徑出發,嘗試優化 DA 層的存儲方案。

  4. 現階段的 DA 方案從數據存儲位置出發大體分為兩類,分別是主鏈 DA 與第三方的 DA。主鏈 DA 分別從定期清理數據與對數據分片存儲的角度出發,以減小節點存儲壓力。而第三方 DA 設計需求均旨在為存儲服務,對於大量的數據有合理的解決方案。因而主要是在單鏈相容性與多鏈相容性之間進行 trade-off,提出了主鏈專用 DA,模塊化 DA,存儲公鏈 DA 三種解決方案。

  5. 支付型的公鏈對於歷史數據安全有極高的要求,適合使用主鏈作為 DA 層。不過對於運行了很長時間而又有大量礦工在運行網路的公鏈,採取不涉及共識層又兼顧安全性的第三方 DA 會更加合適。而綜合性的公鏈更適合使用數據容量更大,成本更低又兼顧安全性的主鏈專用 DA 存儲。但是考慮到跨鏈的需求,模塊化 DA 也是不錯的選項。

  6. 總體上來說,區塊鏈正在朝減少數據冗餘以及多鏈分工的方向發展。

1.背景

區塊鏈作為分佈式賬本,需要在所有節點上都對歷史數據作一份存儲,以確保數據存儲的安全與足夠去中心化。由於每一次狀態變動的正確性都與上一個狀態(交易來源)有關,為了確保交易的正確性,一條區塊鏈原則上應當存儲從第一筆交易產生到當下交易的所有歷史記錄。以以太坊為例,即便按照平均每個區塊 20 kb 的大小估計,當前以太坊區塊的總大小也已達到 370 GB,而一個全節點除了區塊本身,還要對狀態和交易收據記錄。算上這部分,單個節點存儲總量已超過 1 TB,這使得節點的運營向少數人集中。

Kernel Ventures:一文解析 DA 和歷史數據層設計插图1

以太坊最新區塊高度,圖片來源:Etherscan

2. DA 性能指標

2.1 安全性

區塊鏈相對於資料庫或者鏈表存儲結構而言,其不可篡改性來自於可以通過歷史數據對新產生的數據進行校驗,因而確保其歷史數據的安全性是 DA 層存儲中首先要考慮的問題。對於區塊鏈系統數據安全性的評判,我們往往從數據的冗餘數量和數據可用性的校驗方式進行分析

  • 冗餘數量:對於區塊鏈系統中數據的冗餘,其主要可以起到以下作用:首先,如果網路中冗餘數量越多,當驗證者需要查看某個歷史區塊中的賬戶狀態以對當下某筆交易進行驗證的時候,其可以得到最多的樣本進行參考,從中選取被大多數節點記載的數據。而在傳統的資料庫中,由於只在某個節點以鍵值對的形式存儲數據,要更改歷史數據只用在單一節點進行,攻擊成本極低,理論上說,冗餘數量越多,數據的可信程度越高。同時,存儲的節點越多,數據相應越不容易丟失。這點也可以對比存儲 Web2 遊戲的中心化服務器,一旦後臺服務器全部關閉,就會出現徹底閉服的情況。但是這個數量也並非越多越好,因為每一份冗餘都會帶來額外的存儲空間,過多數據冗餘會給系統帶來過大的存儲壓力,好的 DA 層應該選擇一種合適的冗餘方式在安全性和存儲效率中取得平衡。

  • 數據可用性校驗:冗餘數量保證了網路中對於數據足夠多的記錄,但是要使用的數據還要對其準確性和完整性進行校驗。現階段的區塊鏈中常用校驗方式是密碼學的承諾算法,既保留一個很小的密碼學承諾供全網記錄,這個承諾由交易數據混合得到的。而要檢驗某條歷史數據的真實性時需要通過該數據還原密碼學承諾,檢驗這個還原得到這個密碼學承諾是否和全網的記錄一致,如果一致則驗證通過。常用的密碼學校驗算法有 Merkle Root 和 Verkle Root。高安全性的數據可用性驗證算法只需要很少的校驗數據,可以快速的對歷史數據進行校驗。

2.2 存儲成本

在確保了基礎安全性的前提下,DA 層下個需要實現的核心目標便是降本增效。首先是降低存儲成本,在不考慮硬體性能差異的情況下,也就是降低存儲單位大小數據造成的內存佔用。現階段區塊鏈中降低存儲成本的方式主要是採取分片技術以及使用獎勵式存儲以確保數據被有效存儲基礎上降低數據備份數量。但是從以上改進方式不難看出,存儲成本與數據的安全性存在博弈關係,降低存儲的佔用也往往意味著安全性的下降。因而一個優秀的 DA 層需要實現存儲成本與數據安全性之間的平衡。此外,如果 DA 層如果是一條單獨的公鏈的話,還需要通過儘量減少數據交換所經歷的中間過程以減少成本,在每一次中轉過程都需要留下索引數據以供後續查詢時的調用,因而越長的調用過程就會留有越多的索引數據而增加存儲成本。最後,數據的存儲成本直接和數據的持久性直接掛鉤。一般情況下,數據的存儲成本越高,公鏈越難以對數據持久化存儲。

2.3 數據讀取速度

實現了降本,下一步便是增效,也就是當需要使用數據時將其迅速從 DA 層中調用出來的能力。這個過程涉及兩個步驟,首先是搜尋存儲數據的節點,這個過程主要是對於未實現全網數據一致性的公鏈而言的,如果公鏈實現了全網節點的數據同步,便可以忽略這一過程的時間消耗。其次,現階段主流的區塊鏈系統,包括 Bitcoin,Ethereum,Filecoin 中,節點存儲方式為 Leveldb 資料庫。在 Leveldb 中,數據以三種方式存儲。首先是即時寫入的數據會存儲在 Memtable 類型檔案中,當 Memtable 存儲滿了後則會將檔案類型從 Memtable 改為 Immutable Memtable。這兩種類型的檔案均存儲在內存中,但是 Immutable Memtable 檔案無法再做更改,只能從中讀取數據。IPFS 網路中使用的熱存儲就是將數據存儲在了這個部分,當要調用時就可以快速從內存讀取,但是一個普通節點的移動內存往往都是 GB 級別,很容易就會寫慢,並且當節點出現宕機等異常情況後,內存中的數據便會永久丟失。如果希望數據持久存儲,則需要以 SST 檔案的形式存儲到固態硬碟(SSD),但讀取數據時需要先將數據讀到內存,因而大大降低數據索引速度。最後,對於採取了分片存儲的系統,其數據還原時需要向多個節點發送數據請求並進行還原,這個過程也會降低數據的讀取速度。

Kernel Ventures:一文解析 DA 和歷史數據層設計插图3

Leveldb 數據存儲方式,圖片來源:Leveldb-handbook

2.4 DA 層通用性

隨著 DeFi 的發展,以及 CEX 的種種問題,用戶對於去中心化資產跨鏈交易的要求也不斷增長。而無論是採取哈希鎖定,公證人還是中繼鏈的跨鏈機制,都避免不了對兩條鏈上歷史數據的同時確定。這個問題的關鍵在於兩條鏈上數據的分離,不同的去中心化系統中無法實現直接溝通。因而現階段通過改變 DA 層存儲方式提出了一種解決方案,既將多條公鏈的歷史數據存儲在同一條可信的公鏈上,驗證的時候只需要在這條公鏈上調用數據即可。這需要 DA 層能夠與不同類型的公鏈建立安全的通信方式,也就是 DA 層具有較好的通用性。

3. DA 相關技術探索

3.1 Sharding

  • 傳統的分佈式系統中,一份檔案不會以完整的形式存儲在某一個節點上,而是將原始數據分成多個 Blocks 後在每一個節點中存儲一個 Block。並且 Block 往往不會僅存儲在一個節點上,而是會在其他節點上留有適當的備份,現有主流分佈式系統中,這個備份數量通常設置為 2。這種 Sharding 機制可以減少單個節點的存儲壓力,將系統的總容量擴展為各個節點存儲量的總和,同時又通過適當的數據冗餘確保存儲的安全性。區塊鏈中採取的 Sharding 方案大體與之類似,但在具體細節上會存在不同。首先是由於區塊鏈中默認各個節點是不可信的,實現 Sharding 的過程中需要足夠大的數據量備份以供後續數據真實性的判斷,所以這個節點的備份數量需要遠超過 2。理想情況下,在採用這種方案存儲的區塊鏈系統中,如果驗證節點總數為 T,分片數量為 N,那麼備份數量應該為 T/N。其次是對 Block 的存儲過程,傳統分佈式系統中節點較少,因而往往是一個節點適配多個數據塊,首先是通過一致性哈希算法將數據映射到哈希環上去,然後每個節點存儲某個範圍內編號的數據塊,並且可以接受某個節點在某次存儲中並沒有分配存儲任務。而在區塊鏈上,每個節點是否分配到 Block 不再是隨機事件而是必然事件,每個節點都會隨機抽取一個 Block 進行存儲,這一過程通過將帶有區塊原始數據與節點自身資訊的數據哈希後的結果對分片數取餘完成。假設每份數據被分為了 N 個 Blocks,每個節點的實際存儲大小僅為原來的 1/N。通過適當設置 N,可以實現增長的 TPS 和節點存儲壓力的平衡。

Kernel Ventures:一文解析 DA 和歷史數據層設計插图5

Sharding 後的數據存儲方式,圖片來源:Kernel Ventures

3.2 DAS(Data Availability Sampling)

DAS 技術是基於 Sharding 在存儲方式上的進一步優化。在 Sharding 過程中,由於節點簡單的隨機存儲,可能會出現某個 Block 丟失的情況。其次,對於分片後的數據,還原過程中如何確認數據的真實性與完整性也非常重要。在 DAS 中,通過 Eraser code 與 KZG 多項式承諾對這兩個問題進行了解決。

  • Eraser code:考慮以太坊龐大的驗證節點數量,某個 Block 沒有被任何節點存儲的概率幾乎為 0,但是理論上來說仍然存在這種極端情況發生的可能。為了減輕這一可能造成的存儲缺失的威脅,此方案下往往不直接將原始數據切分為 Block 進行存儲,而是先將原始數據映射到一個 n 階多項式的係數上,然後在多項式上取 2n 個點,並讓節點從中隨機選擇一個進行存儲。對於這個 n 階多項式,只需要 n+1 個點便可以進行還原,因而只需要有一半的 Block 有被節點選中,我們便可以實現對原始數據的還原。通過 Eraser code,提高了數據存儲的安全程度與網路對於數據的恢復能力。

  • KZG 多項式承諾:在數據存儲中非常重要的一環便是對於數據真實性的檢驗。在沒有采用 Eraser code 的網路中,校驗環節可以採用多樣的方法,但是如果引入了上文的 Eraser code 以提高數據安全性,那麼比較合適的方法是使用 KZG 多項式承諾。KZG 多項式承諾可以直接以多項式的形式對單個 Block 內容校驗,從而省去將多項式還原為二進制數據的過程,驗證的形式總體與 Merkle Tree 類似,但是不需要具體的 Path 節點數據,只需要 KZG Root 與 Block 數據便可對其真偽進行驗證。

3.3 DA 層數據校驗方式

數據校驗既確保從節點中調用的數據未被篡改且具有沒有出現丟失。為了盡可能減少校驗過程中所需要的數據量以及計算成本,DA 層現階段採用樹結構做為主流的校驗方式。最簡單的形式便是使用 Merkle Tree 進行校驗,使用完全二叉樹的形式記錄,只需要保留一個 Merkle Root 以及節點路徑上另一側子樹的哈希值便可以進行校驗,校驗的時間複雜度為 O(logN) 級別(如果 logN 不加底數默認為 log2(N))。雖然已經極大建恩化了校驗過程,但是驗證過程的數據量總體還是隨著數據的增加而增長。為了解決增加的驗證量問題,現階段提出了另一種驗證方式,Verkle Tree。Verkle Tree 中每個節點除了存儲 value 還會附帶一個 Vector Commitment ,通過原始節點的值和這個承諾性證明就可以快速對數據真實性進行驗證,而不需要調用其他姐妹節點的值,這使得每次驗證的計算次數只和 Verkle Tree 的深度有關,是一個固定的常數,從而大大加速了驗證速度。但是 Vector Commitment 的計算需要同一層所有姐妹節點的參與,這大大增大了寫入數據與更改數據的成本。但是對於歷史數據這類做永久性存儲而不能篡改的數據,只有讀而沒有寫的需求,Verkle Tree 就顯得極為合適了。此外 Merkle Tree 與 Verkle Tree 本身還有 K-ary 形式下的變體,其具體實現機制相似,只是改變了每個節點下子樹的數量,其具體性能的對比可以見下表。

Kernel Ventures:一文解析 DA 和歷史數據層設計插图7

數據校驗方式時間性能對比,圖片來源:Verkle Trees

3.4 通用 DA 中間件

區塊鏈生態的不斷擴大,隨之帶來公鏈數量的不斷增加。由於各條公鏈在各自領域的優勢與不可替代性,短時間內 Layer1 公鏈幾無可能走向統一。但是隨著 DeFi 的發展,以及 CEX 的種種問題,用戶對於去中心化跨鏈交易資產的要求也不斷增長。因此,可以消除跨鏈數據交互中的安全問題的 DA 層多鏈數據存儲得到了越來越多的關注。但是要接受來自不同公鏈的歷史數據,需要 DA 層提供數據流標準化存儲與驗證的去中心化協定,比如基於 Arweave 的存儲中間件 kvye ,採取主動從鏈上抓取數據的方式,可以將所有鏈上的數據以標準的形式存儲至 Arweave,以最小化數據傳輸過程的差異性。相對來說,專門為某條公鏈提供 DA 層數據存儲的 Layer2 通過內部共享節點的方式進行數據交互,雖然降低了交互的成本並提高了安全性,但是具有比較大的侷限性,僅能向特定公鏈提供服務。

4. DA 層存儲方案

4.1 主鏈 DA

4.1.1 類 DankSharding

這類存儲方案暫時還沒有確定的名稱,而其中最突出的代表就是以太坊上的 DankSharding,因而本文中使用類 DankSharding 代稱這一類方案。這類方案主要使用了上述的兩種 DA 存儲技術,Sharding 和 DAS。首先通過 Sharding 將數據分成合適的份數,然後再讓每個節點以 DAS 的形式抽取一個數據 Block 進行存儲。對於全網節點足夠多的情況,我們可以取一個較大的分片數 N,這樣每個節點的存儲壓力只有原來的 1/N,從而實現整體存儲空間的 N 倍擴容。同時為了保證防止某個 Block 沒有被任一區塊存儲的極端情況,DankSharding 對數據使用 Eraser Code 進行了編碼,只需要一半的數據就可以進行完整還原。最後是對數據的檢驗過程,使用了 Verkle 樹的結構與多項式承諾,實現了快速的校驗。

4.1.2 短期存儲

對於主鏈的 DA,一種最為簡單的數據處理方式就是對歷史數據進行短期存儲。本質上來說,區塊鏈所起的是一個公示賬本的作用,在全網共同見證的前提下實現對賬本內容的更改,而並沒有永久化存儲的需求。以 Solana 為例,雖然其歷史數據被同步到了 Arweave 上,但是主網節點只保留了近兩日的交易數據。基於賬戶記錄的公鏈上,每一時刻的歷史數據保留了區塊鏈上賬戶最終的狀態,便足以為下一時刻的更改提供驗證依據。而對於這個時間段之前數據有特殊需求的專案方,可以自己在其他去中心化公鏈上或者交由可信第三方進行存儲。也就是說對於數據有額外需求的人,需要對歷史數據存儲進行付費。

4.2 第三方 DA

4.2.1 主鏈專用 DA:EthStorage

  • 主鏈專用DA:DA 層最重要的就是數據傳輸的安全性,這一點上安全性最高的便是主鏈的 DA。但是主鏈存儲受到存儲空間的限制以及資源的競爭,因而當網路數據量增長較快時,如果要實現對數據的長期存儲,第三方 DA 會是一個更好的選擇。第三方 DA 如果與主網有更高的相容性,可以實現節點的共用,數據交互過程中也會具有更高的安全性。因而在考慮安全性的前提下,主鏈專用 DA 會存在巨大優勢。以以太坊為例,主鏈專用 DA 的一個基本要求是可以與 EVM 相容,保證和以太坊數據與合約間的互操作性,代表性的專案有 Topia,EthStorage 等。其中 EthStorage 是相容性方面目前開發最完善的,因為除了 EVM 層面的相容,其還專門設置了相關接口與 Remix,Hardhat 等以太坊開發工具對接,實現以太坊開發工具層面的相容。

  • EthStorage:EthStorage 是一條獨立於以太坊的公鏈,但其上運行的節點是以太坊節點的超群,也就是運行 EthStorage 的節點也可以同時運行以太坊,通過以太坊上的操作碼便可以直接對 EthStorage 進行操作。EthStorage 的存儲模式中,僅在以太坊主網保留少量元數據以供索引,本質上是為以太坊創建了一個去中心化的資料庫。現階段的解決方案中,EthStorage 通過在以太坊主網上部署了一份 EthStorage Contract 實現了以太坊主網與 EthStorage 的交互。如果以太坊要存入數據,則需要調用合約中的 put() 函數,輸入參數是兩個位元組變量 key, data,其中 data 表示要存入的數據,而 key 則是其在以太坊網路中的標識,可以將其看成類似於IPFS中 CID 的存在。在(key,data)數據對成功存儲到 EthStorage 網路後,EthStorage 會生成一個 kvldx 返回給以太坊主網,並於以太坊上的 key 對應,這個值對應了數據在 EthStorage 上的存儲地址,這樣原來可能需要存儲大量數據的問題現在就變為了存儲一個單一的 (key,kvldx)對,從而大大降低了以太坊主網的存儲成本。如果需要對之前存儲的數據進行調用,則需要使用 EthStorage 中的 get() 函數,並輸入 key 參數,通過以太坊存儲的 kvldx 便可在 EthStorage 上對數據進行一個快速查找。

Kernel Ventures:一文解析 DA 和歷史數據層設計插图9

EthStorage 合約,圖片來源:Kernel Ventures

  • 在節點具體存儲數據的方式上,EthStorage 借鑑了 Arweave 的模式。首先是對於來自 ETH 的大量 (k,v)對進行了分片,每個 Sharding 包含固定數量個(k,v)數據對,其中每個(k,v)對的具體大小也存在一個限制,通過這種方式保證後續對於礦工存儲獎勵過程中的工作量大小的公平性。對於獎勵的發放,需要先對節點是否存儲數據進行驗證。這個過程中,EthStorage 會把一個 Sharding(TB 級別大小)分成非常多的 chunk,並在以太坊主網保留一個 Merkle root 以做驗證。接著需要礦工首先提供一個 nonce 來與 EthStorage 上前一個區塊的哈希通過隨機算法生成出幾個 chunk 的地址,礦工需要提供這幾個 chunk 的數據以證明其確實存儲了整個 Sharding。但這個 nonce 不能隨意選取,否則節點會選取出合適的 nonce 只對應其存儲的 chunk 從而通過驗證,所以這個 nonce 必須使得其所生成的 chunk 經過混合與哈希後可以使難度值滿足網路要求,並且只有第一個提交 nonce 和隨機訪問證明的節點才可以獲取獎勵。

4.2.2 模塊化 DA:Celestia

  • 區塊鏈模塊:現階段 Layer1 公鏈所需執行的事務主要分為以下四個部分:(1)設計網路底層邏輯,按照某種方式選取驗證節點,寫入區塊並為網路維護者分配獎勵;(2)打包處理交易併發布相關事務;(3)對將要上鏈的交易進行驗證並確定最終狀態;(4)對於區塊鏈上的歷史數據進行存儲與維護。根據所完成功能的不同,我們可以將區塊鏈分別劃分為四個模塊,即共識層、執行層、結算層、數據可用性層(DA 層)。

  • 模塊化區塊鏈設計:很長一段時間,這四個模塊都被整合到了一條公鏈上,這樣的區塊鏈稱為單體區塊鏈。這種形式更加穩定並便於維護,但也給單條公鏈帶來了巨大的壓力。實際運行過程中,這四個模塊之間互相約束並競爭公鏈有限的計算與存儲資源。例如,要提高處理層的處理速度,相應就會給數據可用性層帶來更大的存儲壓力;要保證執行層的安全性就需要更復雜的驗證機制但拖慢交易處理的速度。因此,公鏈的開發往往面臨著這四個模塊間的權衡。為了突破這一公鏈性能提升的瓶頸,開發者提出了模塊化區塊鏈的方案。模塊化區塊鏈的核心思想是將上述的四個模塊中的一個或幾個剝離出來,交給一條單獨的公鏈實現。這樣在該條公鏈上就可以僅專注於交易速度或者存儲能力的提升,突破之前由於短板效應對於區塊鏈整體性能造成的限制。

  • 模塊化 DA:將 DA 層從區塊鏈業務中剝離出來單獨交由一條公鏈複雜的方法被認為是面對 Layer1 日益增長曆史數據的一種可行解決方案。現階段這方面的探索仍處於早期階段,目前最具代表性的專案是 Celestia。在存儲的具體方式上,Celestia 借鑑了 Danksharding 的存儲方法,也是將數據分成多個 Block,由各個節點抽取一部分進行存儲並同時使用 KZG 多項式承諾對數據完整性進行驗證。同時,Celestia 使用了先進的二維 RS 糾刪碼,通過 kk 矩陣的形式改寫原始數據,最終只需要 25% 的部分便可以對原始數據實現恢復。然而,數據分片存儲本質上只是將全網節點的存儲壓力在總數據量上乘以了一個係數,節點的存儲壓力與數據量仍然是保持線性增長。隨著 Layer1 對於交易速度的不斷改進,節點的存儲壓力某天仍可能達到一個無法接受的臨界。為了解決這一問題,Celestia 中引入了 IPLD 元件進行處理。對於 kk 矩陣中的數據,並不直接存儲在 Celestia 上,而是存儲在 LL-IPFS 網路中,僅在節點中保留該數據在 IPFS 上的 CID 碼。當用戶請求某份歷史數據時,節點會向 IPLD 元件發送對應 CID,通過該 CID 在 IPFS 上對原始數據進行調用。如果在 IPFS 上存在數據,則會經由 IPLD 元件和節點返回回來;如果不存在,則無法返回數據。

Kernel Ventures:一文解析 DA 和歷史數據層設計插图11

Celestia 數據讀取方式,圖片來源:Celestia Core

  • Celestia:以 Celestia 為例,我們可以窺視模塊化區塊鏈在解決以太坊存儲問題中的落地應用。Rollup 節點會將打包並驗證好的交易數據發送給 Celestia 並在 Celestia 上對數據進行存儲,這個過程中 Celestia 只管對數據進行存儲,而不會有過多的感知,最後根據存儲空間的大小 Rollup 節點會向 Celestia 支付相應 tia代幣作為存儲費用。在Celstia中的存儲利用了類似於 EIP4844 中的 DAS 和糾刪碼,但是對 EIP4844 中的多項式糾刪碼進行了升級,使用了二維 RS 糾刪碼,將存儲安全進行了再次升級,僅需 25% 的 fractures 便可以對整個交易數據進行還原。本質上只是一條存儲成本低廉的 POS 公鏈,如果要實現用來解決以太坊的歷史數據存儲問題,還需要許多其他具體模塊來與 Celestia 進行配合。比如 Rollup 方面,Celestia 官網上大力推薦的一種 Rollup 模式是 Sovereign Rollup。不同於 Layer2 上常見的 Rollup,僅僅對交易進行計算和驗證,也就是完成執行層的操作。Sovereign Rollup 包含了整個執行和結算的過程,這最小化了 Celestia 上對交易的處理,在 Celestia 整體安全性弱於以太坊的情況下,這種措施可以最大提升整體交易過程的安全性。而在以太坊主網 Celestia 調用數據的安全性保障方面,當下最主流的方案是量子引力橋智慧合約。對於 Celestia 上存儲的數據,其會生成一個 Merkle Root(數據可用性證明) 並保持在以太坊主網的量子引力橋合約上,當以太坊每次調用 Celestia 上歷史數據時,都會將其哈希結果與 Merkle Root 進行比較,如果符合才表示其確實是真實的歷史數據。

4.2.3 存儲公鏈 DA

在主鏈 DA 技術原理上,向存儲公鏈借鑑了類似 Sharding 的許多技術。而在第三方 DA 中,有些更是直接藉助存儲公鏈完成了部分存儲任務,比如 Celestia 中具體的交易數據就是放在了 LL-IPFS 網路上。第三方 DA 的方案中,除了搭建一條單獨的公鏈解決 Layer1 的存儲問題之外,一種更直接的方式是直接讓存儲公鏈和 Layer1 對接,存儲 Layer1 上龐大的歷史數據。對於高性能區塊鏈來說,歷史數據的體量更為龐大,在全速運行的情況下,高性能公鏈 Solana 的數據量大小接近 4 PG,完全超出了普通節點的存儲範圍。Solana 選擇的解決方案是將歷史數據存儲在去中心化存儲網路 Arweave 上,只在主網的節點上保留 2 日的數據用來驗證。為了確保存儲過程的安全性 Solana 與 Arweave 鏈自己專門設計了一個存儲橋協定 Solar Bridge。Solana 節點驗證後的數據會同步到 Arweave 上並返回相應 tag。只需要通過該 tag,Solana 節點便可以對 Solana 區塊鏈任意時刻的歷史數據進行查看。而在 Arweave 上,不需要全網節點保持數據一致性,並以此作為參與網路運行的門檻,而是採取了獎勵存儲的方式。首先 Arweave 並沒有採用傳統鏈結構構建區塊,而更類似一種圖的結構。在 Arweave 中,一個新的區塊不僅會指向前一個區塊,還會隨機指向一個已生成的區塊 Recall Block。Recall Block 的具體位置由其前一區塊與其區塊高度的哈希結果決定,在前一區塊被挖出之前,Recall Block 的位置是未知的。但是在生成新區塊的過程中,需要節點具有 Recall Block 的數據以使用 POW 機制計算規定難度的哈希,只有最先計算出符合難度哈希的礦工才可以獲得獎勵,鼓勵了礦工存儲盡可能多的歷史數據。同時,存儲某個歷史區塊的人越少,節點在生成符合難度 nonce 時會有更少的競爭對手,鼓勵礦工存儲網路中備份較少的區塊。最後,為了保證節點在 Arweave 中對數據做永久性存儲,其引入了 WildFire 的節點評分機制。節點間會傾向於與可以較快的提供更多歷史數據的節點通信,而評分等級較低的節點往往無法第一時間獲得最新的區塊與交易數據從而無法在 POW 的競爭中佔取先機。

Kernel Ventures:一文解析 DA 和歷史數據層設計插图13

Arweave 區塊構建方式,圖片來源:Arweave Yellow-Paper

5.綜合對比

接下來,我們將從 DA 性能指標的四個維度出發,分別對 5 種存儲方案的優劣進行比較。

  • 安全性:數據安全問題的最大的來源是數據傳輸過程中導致的遺失以及來自不誠信節點的惡意篡改,而跨鏈過程中由於兩條公鏈的獨立性與狀態不共享,所以是數據傳輸安全的重災區。此外,現階段需要專門 DA 層的 Layer 1 往往有強大的共識群體,自身安全性會遠高於普通儲儲公鏈。因而主鏈 DA 的方案具更高的安全性。而在確保了數據傳輸安全後,接下來就是要保證調用數據的安全。只考慮用來驗證交易的短期歷史數據的話,同一份數據在臨時存儲的網路中得到了全網共同的備份,而在類 DankSharding 的方案中數據平均的備份數量只有全網節點數的 1/N,更多的數據冗餘可以使得數據更不容易丟失,同時也可以在驗證時提供更多的參考樣本。因而臨時存儲相對會有更高的數據安全性。而在第三方 DA 的方案中,主鏈專用 DA 由於和主鏈使用公共節點,跨鏈過程中數據可以通過這些中繼節點直接傳輸,因而也會有比其他 DA 方案相對較高的安全性。

  • 存儲成本:對存儲成本最大的影響因素是數據的冗餘數量。在主鏈 DA 的短期存儲方案中,使用全網節點數據同步的形式進行存儲,任何一份新存儲的數據需要在全網節點中得到備份,具有最高的存儲成本。高昂的存儲成本反過來也決定了,在高 TPS 的網路中,該方式只適合做臨時存儲。其次是 Sharding 的存儲方式,包括了在主鏈的 Sharding 以及第三方 DA 中的 Sharding。由於主鏈往往有更多的節點,因而相應一個 Block 也會有更多的備份,所以主鏈 Sharding 方案會有更高的成本。而存儲成本最低的則是採取獎勵存儲方式的存儲公鏈 DA ,此方案下數據冗餘的數量往往在一個固定的常數附近波動。同時存儲公鏈 DA 中還引入了動態調節的機制,通過提高獎勵吸引節點存儲備份較少的數據以確保數據安全。

  • 數據讀取速度:數據的存儲速度主要受到數據在存儲空間中的存儲位置、數據索引路徑以及數據在節點中的分佈的影響。其中,數據在節點的存儲位置對速度的影響更大,因為將數據存儲在內存或 SSD 中可能導致讀取速度相差數十倍。存儲公鏈 DA 多采取 SSD 存儲,因為該鏈上的負載不僅包括 DA 層的數據,還包括用戶上傳的視頻、圖片等高內存佔用的個人數據。如果網路不使用 SSD 作為存儲空間,難以承載巨大的存儲壓力並滿足長期存儲的需求。其次,對於使用內存態存儲數據的第三方 DA 和主鏈 DA,第三方 DA 首先需要在主鏈中搜索相應的索引數據,然後將該索引數據跨鏈傳輸到第三方 DA,並通過存儲橋返回數據。相比之下,主鏈 DA 可以直接從節點查詢數據,因此具有更快的數據檢索速度。最後,在主鏈 DA 內部,採用 Sharding 方式需要從多個節點調用 Block,並對原始數據進行還原。因此相對於不分片存儲的短期存儲方式而言,速度會較慢。

  • DA 層通用性:主鏈 DA 通用性接近於零,因為不可能將存儲空間不足的公鏈上的數據轉移到另一條存儲空間不足的公鏈上。在第三方 DA 中,方案的通用性與其與特定主鏈的相容性是一對矛盾的指標。例如,對於專為某條主鏈設計的主鏈專用 DA 方案中,其在節點類型和網路共識層面進行了大量改進以適配該公鏈,因而在與其他公鏈通信時,這些改進會起到巨大的阻礙作用。而在第三方 DA 內部,與模塊化 DA 相比, 存儲公鏈 DA 在通用性方面表現更好。存儲公鏈 DA 具有更龐大的開發者社區和更多的拓展設施,可以適應不同公鏈的情況。同時,存儲公鏈 DA 對於數據的獲取方式更多是通過抓包主動獲取,而不是被動接收來自其他公鏈傳輸的資訊。因此,它可以以自己的方式對數據進行編碼,實現數據流的標準化存儲,便於管理來自不同主鏈的數據資訊,並提高存儲效率。

Kernel Ventures:一文解析 DA 和歷史數據層設計插图15

存儲方案性能比較,圖片來源:Kernel Ventures

6.總結

現階段的區塊鏈正在經歷從 Crypto 向更具包容性的 Web3 轉換的過程中,這個過程中帶來的不僅是區塊鏈上專案的豐富。為了在 Layer1 上容納如此多專案的同時運行,同時保證 Gamefi 和 Socialfi 專案的體驗,以以太坊為代表的 Layer1 採取了 Rollup 和 Blobs 等方式來提高 TPS。而新生區塊鏈中,高性能區塊鏈的數量也是不斷增長。但是更高的 TPS 不僅意味著更高的性能,也意味著網路中更大的存儲壓力。對於海量的歷史數據,現階段提出了主鏈和基於第三方的多種 DA 方式,以適應鏈上存儲壓力的增長。改進方式各有利弊,在不同情境下有不同適用性。

以支付為主的區塊鏈對於歷史數據的安全性有著極高的要求,而不追求特別高的 TPS。如果這類公鏈還處於籌備階段,可以採取類 DankSharding 的存儲方式,在保證安全性的同時也可以實現存儲容量的巨大提升。但如果是位元幣這種已經成型並有大量節點的公鏈,在共識層貿然進行改進存在巨大風險,因而可以採取鏈外存儲中安全性較高的主鏈專用 DA 來兼顧安全性與存儲問題。但值得注意的是,區塊鏈的功能並不是一成不變而是不斷變化的。比如早期的以太坊的功能主要也侷限於支付以及使用智慧合約對資產和交易進行簡單的自動化處理,但是隨著區塊鏈版圖的不斷拓展,以太坊上逐漸加入了各種 Socialfi 與 Defi 專案,使以太坊向著更加綜合性的方向發展。而最近伴隨著位元幣上銘文生態的爆發,位元幣網路的交易手續費自 8 月以來激增了近 20 倍,背後反映的是現階段位元幣網路的交易速度無法滿足交易需求,交易者只能拉高手續費使交易儘快得到處理。現在,位元幣社區需要做出一個 trade-off,是接受高昂的手續費以及緩慢的交易速度,還是降低網路安全性以提高交易速度但違背支付系統的初衷。如果位元幣社區選擇了後者,那麼面對增長的數據壓力,相應的存儲方案也需要做出調整。

Kernel Ventures:一文解析 DA 和歷史數據層設計插图17

位元幣主網交易費用波動,圖片來源:OKLINK

而對於綜合功能的公鏈,其對 TPS 有著更高的追求,歷史數據的增長更加巨大,採取類 DankSharding 的方案長期來看難以適應 TPS 的快速增長。因此,較為合適的方式是將數據遷移到第三方 DA 進行存儲。其中,主鏈專用 DA 具有最高的相容性,如果只考慮單條公鏈的存儲問題,可能更具優勢。但是在 Layer1 公鏈百花齊放的今天,跨鏈資產轉移與數據交互也成為區塊鏈社區的普遍追求。如果考慮到整個區塊鏈生態的長期發展,將不同公鏈的歷史數據存儲在同一條公鏈上可以消除許多數據交換與驗證過程中的安全問題,因此,模塊化 DA 和存儲公鏈 DA 的方式可能是一個更好的選擇。在通用性接近的前提下,模塊化 DA 專注於提供區塊鏈 DA 層的服務,引入了更精細化的索引數據管理歷史數據,可以對不同公鏈數據進行一個合理歸類,與存儲公鏈相比具有更多優勢。然而,上述方案並未考慮在已有公鏈上進行共識層調整的成本,這個過程具有極高的風險性,一旦出現問題可能會導致系統性的漏洞,使得公鏈失去社區共識。因此,如果是區塊鏈擴容過程中的過渡方案,最簡單的主鏈臨時存儲可能更合適。最後,以上討論都基於實際運行過程中的性能出發,但如果某條公鏈的目標是發展自身生態,吸引更多專案方和參與者,也有可能會傾向於受到自身基金會扶持和資助的專案。比如在同等甚至總體性能略低於存儲公鏈存儲方案的情況下,以太坊社區也會傾向於 EthStorage 這類以太坊基金會支持的 Layer2 專案,以持續發展以太坊生態。

總而言之,當今區塊鏈的功能越來越複雜,也帶來了更大的存儲空間需求。在 Layer1 驗證節點足夠多的情況下,歷史數據並不需要全網所有節點共同備份,只需要備份數量達到某個數值後便可保證相對的安全性。與此同時,公鏈的分工也變得越來越細緻,Layer1 負責共識和執行,Rollup 負責計算和驗證,再使用單獨的一條區塊鏈進行數據存儲。每個部分都可以專注於某一功能,不受其他部分性能的限制。然而,具體存儲多少數量或讓多少比例的節點存儲歷史數據才能實現安全性與效率的平衡,以及如何保證不同區塊鏈之間的安全互操作,這是需要區塊鏈開發者進行思考和不斷完善的問題。對於投資者而言,可以關注以太坊上的主鏈專用 DA 專案,因為現階段以太坊已有足夠多的支持者,不需要再借助其他社區擴大自己的影響力。更多的需要是完善與發展自己的社區,吸引更多專案落地以太坊生態。但是對處於追趕者地位的公鏈,比如 Solana,Aptos 來說,單鏈本身沒有那麼完善的生態,因而可能更傾向於聯合其他社區的力量,搭建一個龐大的跨鏈生態以擴大影響力。因而對於新興的 Layer1 ,通用的第三方 DA 值得更多的關注。

聯系郵箱:0xniumao@gmail.com