以太坊源码分析--账户的管理

2018-06-22  本文已影响0人  187J3X1
ethereum.jpeg

以太坊是一个巨大的状态机,在网络中,每一个全节点都保存着以太坊状态机的全部历史,只要愿意,我们可以查询到任何时刻的状态(黄皮书中 World State),其中账户状态便是其中的一部分,这部分功能由主要由state包提供

基本概念

账户地址

address.png

在以太坊中,无论是外部账户还是合约账户,都以一个160bit的数组表示地址,它是由特定椭圆曲线上的一个点表示的公钥经过Keccak Hash算法截取而来。

外部账户和合约账户的区别

账户内容

以太坊中,账户用 Account 表示

type Account struct {
    Nonce      uint64
    Balance   *big.Int
    Root       common.Hash
    CodeHash   []byte
}

账户在区块链中的位置

ether.png
所有账户以MPT树的形式组织起来,根节点的Hash值存储在区块HeaderstateRoot字段

账户管理

stateDB & stateObject

在以太坊账户管理中,stateObject表示一个账户的动态变化,结构中的关键字段如下

type stateObject struct {
    address common.Address
    data   Account
    db     *StateDB
    trie   Trie
    code  Code
    ......
}

stateDB 表示所有账户的动态变化,即它管理stateObject,结构中的关键字段如下:

type stateDB struct {
    db    Database
    trie   Trie
    stateObjects  map[common.Address] * stateObject
    ......
}

账户操作

在执行区块中的交易时,我们可能需要修改某些账户的信息(比如增减余额,或者修改合约账户代码) ,这时我们按以下步骤进行操作

  1. stateDB找到账户对应的stateObject,若不存在,则从trie树中,通过读取底层数据库构建新的stateObject,访问过的stateObject会缓存起来
  2. stateObject账户进行操作,可能会涉及对余额的操作,如AddBalance()调用,也有可能对存储空间的操作,如SetState(),或者对合约代码的操作如 SetCode()
  3. 在区块构建完成时,计算每个账户新的MPT树的各个节点Hash,并存入数据库,完成修改。
上一篇下一篇

猜你喜欢

热点阅读