###### tags: `blockchain` # ETH怎麼儲存balance 關於ETH帳戶結構 乙太坊黃皮書 https://zhuanlan.zhihu.com/p/203347169 (關鍵字 世界状态) 問題起因 : ETH是如何儲存在區塊鏈上的? ethscan是怎麼找出目標地址擁有那些代幣? 簡單解答 : 關於ETH token可以直接找worldstate tree存取 那其餘token的存在 1. 是透過Tx tree找到目標地址(sender)中與其互動過的合約(to) 2. 再去world state中找出該合約地址(to)用變數根結點(storageRoot)連結到 3. account storage tree找出儲存的token數量 ![](https://i.imgur.com/6hRSbxJ.png) 區塊鏈上乙太坊存在所有礦工交易紀錄的帳本 但乙太坊有另外的資料庫計算交易餘額相關資料 關於餘額相關的資料 是另外透過一個world state(世界狀態)的樹狀結構儲存主要的資料並且**即時更新** ![](https://i.imgur.com/WqfDVLN.png) 其中還有另外三種樹 最下有附圖 TransTree Receiptes Tree 以及world state附屬的account storate tree * 重要 不是儲存在區塊鏈上 ETH有中心化的資料庫管理 區塊鏈上只儲存該樹的hashRoot ![](https://i.imgur.com/uH62tsL.png) 乙太坊存在兩種帳戶 一種EOA(Externally Owned Accounts) 就是我們平常用來發送乙太幣的帳戶 付gas部屬智能合約的帳戶 即是EOA 另一種則是智能合約產生時會賦予其一個帳戶 可以說是獨屬於智能合約的帳戶 底下是帳戶有的變數 * nonce EOA發送的交易數量 合約帳戶產生的操作數量 * balance 乙太餘額 * storageRoot EOA留空 合約帳戶有 儲存 合約帳戶儲存樹的根節點 合約帳戶儲存樹 是另一顆完全不同樹 即是合約帳戶產生的所有資料 (https://medium.com/coinmonks/a-practical-walkthrough-smart-contract-storage-d3383360ea1b) storageRoot便是其根節點 所以另外會有一棵樹Storage trie儲存著合約帳戶所有資料 透過storageRoot查找 https://www.blockchain-council.org/blockchain/how-to-store-data-on-ethereum-blockchain/ * codeHash EOA留空 合約帳戶儲存著EVM code的hash值(即是智能合約的code) 並且一經部屬是無法更改的 另外三個都能更改 唯有codeHash無法變動 --- https://www.blockchain-council.org/blockchain/how-to-store-data-on-ethereum-blockchain/ 總共有三種樹 (更正:四種 還有transaction receipt) State trie 上文描述的樹 儲存著最主要的狀態 worldstate Storage trie 只有合約帳戶有的樹 儲存者合約產生的資料 Transaction trie 交易當時的相關資訊 gas 隨機數 to 等等 receipt trie 儲存著交易資料的總結 地址 區塊 transactionHash https://ethereum.stackexchange.com/questions/6531/structure-of-a-transaction-receipt --- 世界状态: 以太坊这台分布式计算机的硬盘。它是从地址到账户状态的映射。 账户状态: 保存着每个以太坊账户的状态信息。账户状态同样保存着账户状态树的 storageRoot,后者包含了该账户的存储数据。 交易: 标示了系统中的状态转移。它可以是资金的转移、消息调用或是合约的部署。 区块: 包括对前序区块(parentHash)的链接,并且保存了当执行时会在系统中产生新状态的交易。区块同时保存了 stateRoot 、transactionRoot 、 receiptsRoot 、 世界状态树的根节点哈希、交易树以及对应的交易收据树。 ![](https://i.imgur.com/uH62tsL.png) --- (一些很不重要的小補充) 重點: Ethereum狀態由四棵樹組成 每棵樹都是 16-branch 因目前資料過於龐大的緣故 有想解決的議題名為Verkle tree world state trie (發音同 tree) 才對;事實上整個 Ethereum 的狀態要由四棵 Merkle Patricia trie 一起看(world state、account storage、transaction、transaction receipt),每棵 trie 都是 "16-branch" 的構造 起初選擇十六分支樹是為了減少樹的 level 數,讓每次的 query 可以很快就走到樹葉,不過時至今日 Ethereum 已經膨脹到非常巨大的 world state,縱使這樣的結構仍明顯拖慢存取樹的時間 (每多一層 trie 的存取,就有可能多一次 disk I/O),因此在未來的升級路線圖中,有一個名為 Verkle tree 的東東就是想要解決這方面的議題 https://vitalik.ca/general/2021/06/18/verkle.html https://www.youtube.com/watch?v=LfgDAU0dABI ← 影片版 (但非唯一一場有提及的演講)