儲存優化
隨著 Kaia 區塊鏈的成長,儲存區塊鏈資料所需的儲存空間也在增加。 Kaia 實作了兩種主要技術來管理這種不斷成長的儲存需求:
狀態批次修剪(狀態遷移)
State Migration 是一種批次修剪功能,可應用於現有節點,而不會中斷執行中的節點。
動機
區塊狀態或 StateDB 以 trie 資料結構儲存鏈上帳號與契約。 trie 資料結構被設計來儲存過時和最近的狀態,因此可以使用 Merkle hash 來驗證它們。 當交易執行狀態變更時,狀態 trie 就會無限擴大。 截至撰寫本文時(2024 年 8 月),Kaia Mainnet 存檔節點大小超過 20TB,即使是完整節點也超過 10TB。
概念
State Migration 會刪除處理新區塊時不需要的舊區塊狀態。 它將狀態 trie 從「舊」複製到「新」。 並非所有 trie 節點都會被複製。 從選擇區塊的狀態根可到達的區塊被複製。 複製之後,舊目錄會被刪除,因此您只剩下選取區塊的狀態。
閱讀這些部落格文章,瞭解更多技術細節: State Migration: Saving Node Storage, Kaia State Migration: An Efficient Way to Reduce Blockchain Data
有關如何執行 Batch Pruning,請參閱 State Migration Guide。
國家現場修剪
State Live Pruning 是解決狀態資料庫大小不斷增加問題的新方案。 與 Batch Pruning(狀態遷移)不同,Live Pruning 會隨著節點程序的阻塞,一點一滴地自動刪除舊的狀態。
動機
區塊狀態或 StateDB 以 trie 資料結構儲存鏈上帳號與契約。 trie 資料結構被設計來儲存過時和最近的狀態,因此可以使用 Merkle hash 來驗證它們。 當交易執行狀態變更時,狀態 trie 就會無限擴大。 截至撰寫本文時(2025 年 8 月),Kaia Mainnet 存檔節點大小超過 20TB,即使是完整節點也超過 10TB。
在此之前,「狀態遷移」已經透過選擇性複製最近的狀態並刪除其餘的狀態來刪除舊的狀態,從而緩解了這個問題。 這樣可以將完整節點大小縮小到 5 TB 以下。
儘管如此,國家移民也有其缺點。 它需要花費數天的時間來遍歷整個州的 trie,因此開銷很高。 此外,狀態轉移必須手動觸發。 為了克服這些限制,我們引進了 Live Pruning 技術。
概念
Trie 剪枝很困難,因為無法確定某個 trie 節點是否過時。 在原始狀態 trie 結構中,一個 trie 節點可以是多個 tries 的一部分,每個 tries 構成一個不同的區塊。 即使 trie 節點 (例如帳戶餘額) 更新為其他值,也不能刪除 trie 節點,因為其他父節點可能仍然需要它。 這個問題被稱為雜湊重複問題。
Live Pruning 會故意重複具有相同內容的 trie 節點。 在 Live Pruning 的情況下,一個 trie 節點不會被其切細值所引用,而是被其 ExtHash 所引用。 ExtHash 是內容的 32 位元組雜湊值加上 7 位元組序列索引。 序列索引是單調遞增的,因此每個 trie 節點都是唯一的。
Hash: 32-byte Keccak256ExtHash: 32-byte Keccak256 + 7-byte Serial index
這樣,每當 trie 節點的內容改變時,就可以安全地假設這個 trie 節點現在已經過期。 只要忽略序列索引,就能以同樣的方式計算 Merkle 哈希,使其在共識方面與非活剪節點相容。
閱讀這篇部落格文章,瞭解更多技術細節:Efficient Management of Blockchain Data Capacity with StateDB Live Pruning.
有關如何啟用即時修剪,請參閱 即時修剪指南。