<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 以太坊狀態數據庫 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 可視為一個內存數據庫,狀態數據先在內存數據庫中完成修改,所有關于狀態的計算都在內存中完成。 在將區塊持久化時完成有內存到數據庫的更新存儲,此更新屬于增量更新,僅僅修改涉及到被修改部分。 ![](https://img.kancloud.cn/df/e2/dfe2d2023a3153b139d1751a243e73dc_1720x1758.png) 如上圖所示,上半部分均屬于內存操作,僅僅在`stateDB.Commit()`時才將狀態通過樹提交到 leveldb 中。 ### StateDB如何校驗數據 在輕節點中,因為本地并不存儲狀態數據,但又必須校驗某數據的合法性,這依賴于默克爾樹的校驗。 StateDB 僅提供數據的讀取實現。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看