以太坊状态树
Last updated
Last updated
以太坊采用基于账户的模式,系统中显式记录每个账户的状态(余额、nonce等)。
账户地址:160字节
地址总数:2.5亿
状态树实现了从账户地址到账户状态的映射,状态包含了:
余额(balance)
交易次数(nonce)
合约账户中还包含了code(代码)和存储(storage)
账户地址-账户状态组成了许多key- value pairs,即hash table。
能否像BTC中,将哈希表的内容组织为Merkel Tree?
不能。BTC每次发布区块新状态,需要重新组织Merkel Tree。如果用Merkel Tree来组织账户信息,规模会越来越庞大,发生变化的仅仅为很少一部份数据,每次重新构建Merkel Tree代价很大。每个节点自己组织Merkel Tree,树的形状不同。为了保证所有节点的一致性和查找速度,需要进行排序。
Trie 被称为字典树,又称单词查找树或键树,常用于统计和排序大量的字符串,如搜索引擎的文本磁盘统计等。
可以利用公共前缀进行状态压缩,就得到了Patricia Tree:
每次发布新的区块时,状态树中的新节点的值会发生变化,并不是更改原值,而是新建一些分支,保留原来的状态(因此可以实现回滚)。
为什么以太坊不在原节点上直接修改,要保留历史状态?
为了支持回滚,以太坊分叉很普遍;智能合约功能复杂。