内容简介:以太坊是一个巨大的状态机,在网络中,每一个全节点都保存着以太坊状态机的全部历史,只要愿意,我们可以查询到任何时刻的在以太坊中,无论是
前言
以太坊是一个巨大的状态机,在网络中,每一个全节点都保存着以太坊状态机的全部历史,只要愿意,我们可以查询到任何时刻的 状态
(黄皮书中 World State),其中账户状态便是其中的一部分,这部分功能由主要由 state
包提供
基本概念
账户地址
在以太坊中,无论是 外部账户 还是 合约账户 ,都以一个160bit的数组表示地址,它是由特定椭圆曲线上的一个点表示的公钥经过Keccak Hash算法截取而来。
账户内容
以太坊中,账户用 Account 表示
type Account struct { Nonce uint64 Balance *big.Int Root common.Hash CodeHash []byte }
-
Nonce
:账户发起交易的次数 -
Balance
:账户的余额 -
Root
[合约] :代表存储空间的一棵MPT树的根节点的Hash,可以简单地理解为一片存储空间,可以用它存储一些数据到区块链上,关于MPT,可以查看 这篇博文 。 -
CodeHash
[合约] :合约代码的Hash值
注: [合约] 表示该项仅对合约账户有效
账户在区块链中的位置
所有账户以MPT树的形式组织起来,根节点的Hash值存储在区块 Header 的 stateRoot 字段
账户管理
stateDB & stateObject
在以太坊账户管理中, stateObject 表示一个账户的 动态 变化,结构中的关键字段如下
type stateObject struct { address common.Address data Account db *StateDB trie Trie code Code ...... }
-
address
为账户的160 bits 地址 -
data
为账户的信息,即前面提到的 Account 结构 -
trie
合约账户的存储空间的缓存,我们可以从由 data 的 Root 从底层数据库中读取这棵树,但鉴于我们会经常使用,所以把它缓存起来也不是一个坏主意 -
code
合约代码的缓存,作用和trie类似
stateDB表示所有账户的 动态 变化,即它管理 stateObject ,结构中的关键字段如下:
type stateDB struct { db Database trie Trie stateObjects map[common.Address] * stateObject ...... }
-
db
以太坊底层数据库接口,账户的信息都是从数据库中读取的 -
trie
所有账户组织而成的的MPT树的实例,从它里面可以读取以太坊所有账户 -
stateObjects
管理的所有 需要修改 的 stateObject
账户操作
在执行区块中的交易时,我们可能需要修改某些账户的信息(比如增减余额,或者修改合约账户代码) ,这时我们按以下步骤进行操作
- 从 stateDB 找到账户对应的 stateObject ,若不存在,则从trie树中,通过读取底层数据库构建新的 stateObject ,访问过的 stateObject 会缓存起来
- 对 stateObject 账户进行操作,可能会涉及对余额的操作,如 AddBalance() 调用,也有可能对存储空间的操作,如 SetState() ,或者对合约代码的操作如 SetCode()
- 在区块构建完成时,计算每个账户新的MPT树的各个节点Hash,并存入数据库,完成修改。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 兄弟连区块链教程以太源码分析accounts账户管理分析
- EA Games 漏洞致3亿账户面临账户劫持威胁
- SQL2008的sa账户被禁用其他账户无法连接的快速解决方法
- 多账户的统一登录
- Bytom交易说明(账户管理模式)
- 3.04 账户体系与安全设计
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。