## 以太坊狀態數據庫 StateDB
### 為什么有狀態數據庫
即使在以太坊早期,當以太坊運行三個月后,以太坊客戶端的本地文件夾存儲已膨脹到驚人的 10 到40 GB。 截止到區塊高度9001290,一個保留所有狀態的以太坊歸檔節點,需要占用 216 GB 空間。如果說這些狀態全部記錄在區塊鏈上,那么,這會是一個噩夢。
這會使得物聯網設備、個人筆記本、手機等微設備無法使用以太坊客戶端,會導致網絡節點數量下降和影響用戶使用。因此這些狀態并非直接存儲在區塊鏈上,而是將這些狀態維護在默克爾前綴樹中,在區塊鏈上僅記錄對應的樹 Root 值。使用簡單的數據庫來維護樹的持久化內容,而這個用來維護映射的數據庫叫做 StateDB。
### 狀態數據庫存儲什么內容
首先,以太坊中有兩種級別的狀態,一個是頂級的世界狀態,另一個是賬戶級的賬戶狀態。賬戶狀態中存儲賬戶信息:
1. nonce: 這個值等于由此賬戶發出的交易數量,或者由這個賬戶所創建的合約數量(當這個賬戶有關聯代碼時)。
2. balance: 表示這個賬戶賬戶余額。
3. storageRoot: 表示保存了賬戶存儲內容的 MPT 樹的根節點的哈希值。
4. codeHash: 表示賬戶的 EVM 代碼哈希值,當這個地址接收到一個消息調用時,這些代碼會被執行; 它和其它字段不同,創建后不可更改。如果 codeHash 為空,則說明該賬戶是一個簡單的外部賬戶,只存在 nonce 和 balance。
在以太坊中不止一顆默克爾樹,所有賬戶狀態通過以賬戶地址為鍵,維護在表示世界狀態的樹中。所有賬戶也存在一顆表示此賬戶的存儲數據的樹,此樹是獨立唯一的。
通過賬戶地址便可以從世界狀態樹中查找到該賬戶狀態(如賬戶余額),如果是合約地址,還可以繼續通過 storageRoot 從該賬戶存儲數據樹中查找對應的合約信息(如:拍賣合約中的商品信息)。
至于為什么使用默克爾樹來維護狀態,將在后續文章中講解。
### StateDB是如何管理狀態的
從程序設計角度,StateDB 有多種用途:
1. 維護賬戶狀態到世界狀態的映射。
2. 支持修改、回滾、提交狀態。
3. 支持持久化狀態到數據庫中。
4. 是狀態進出默克爾樹的媒介。
實際上 StateDB 充當狀態(數據)、Trie(樹)、LevelDB(存儲)的協調者。
### StateDB持久化
在區塊中,將交易作為輸入條件,來根據一系列動作修改狀態。 在完成區塊挖礦前,只是獲得在內存中的狀態樹的 Root 值。 StateDB 可視為一個內存數據庫,狀態數據先在內存數據庫中完成修改,所有關于狀態的計算都在內存中完成。 在將區塊持久化時完成有內存到數據庫的更新存儲,此更新屬于增量更新,僅僅修改涉及到被修改部分。

如上圖所示,上半部分均屬于內存操作,僅僅在`stateDB.Commit()`時才將狀態通過樹提交到 leveldb 中。
### StateDB如何校驗數據
在輕節點中,因為本地并不存儲狀態數據,但又必須校驗某數據的合法性,這依賴于默克爾樹的校驗。 StateDB 僅提供數據的讀取實現。
- 重要更新說明
- linechain發布
- linechain新版設計
- 引言一
- 引言二
- 引言三
- vs-code設置及開發環境設置
- BoltDB數據庫應用
- 關于Go語言、VS-code的一些Tips
- 區塊鏈的架構
- 網絡通信與區塊鏈
- 單元測試
- 比特幣腳本語言
- 關于區塊鏈的一些概念
- 區塊鏈組件
- 區塊鏈第一版:基本原型
- 區塊鏈第二版:增加工作量證明
- 區塊鏈第三版:持久化
- 區塊鏈第四版:交易
- 區塊鏈第五版:實現錢包
- 區塊鏈第六版:實現UTXO集
- 區塊鏈第七版:網絡
- 階段小結
- 區塊鏈第八版:P2P
- P2P網絡架構
- 區塊鏈網絡層
- P2P區塊鏈最簡體驗
- libp2p建立P2P網絡的關鍵概念
- 區塊鏈結構層設計與實現
- 用戶交互層設計與實現
- 網絡層設計與實現
- 建立節點發現機制
- 向區塊鏈網絡請求區塊信息
- 向區塊鏈網絡發布消息
- 運行區塊鏈
- LineChain
- 系統運行流程
- Multihash
- 區塊鏈網絡的節點發現機制深入探討
- DHT
- Bootstrap
- 連接到所有引導節點
- Advertise
- 搜索其它peers
- 連接到搜到的其它peers
- 區塊鏈網絡的消息訂發布-訂閱機制深入探討
- LineChain:適用于智能合約編程的腳本語言支持
- LineChain:解決分叉問題
- LineChain:多重簽名
- libp2p升級到v0.22版本
- 以太坊基礎
- 重溫以太坊的樹結構
- 世界狀態樹
- (智能合約)賬戶存儲樹
- 交易樹
- 交易收據樹
- 小結
- 以太坊的存儲結構
- 以太坊狀態數據庫
- MPT
- 以太坊POW共識算法
- 智能合約存儲
- Polygon Edge
- block結構
- transaction數據結構
- 數據結構小結
- 關于本區塊鏈的一些說明
- UML工具-PlantUML
- libp2p介紹
- JSON-RPC
- docker制作:啟動多個應用系統
- Dockerfile
- docker-entrypoint.sh
- supervisord.conf
- docker run
- nginx.conf
- docker基礎操作整理
- jupyter計算交互環境
- git技巧一
- git技巧二
- 使用github項目的最佳實踐
- windows下package管理工具