美文网首页
以太坊源码分析--账户的管理

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

作者: 187J3X1 | 来源:发表于2018-06-22 20:37 被阅读0次
    ethereum.jpeg

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

    基本概念

    账户地址

    address.png

    在以太坊中,无论是外部账户还是合约账户,都以一个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值
      注:[合约]表示该项仅对合约账户有效

    账户在区块链中的位置

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

    账户管理

    stateDB & stateObject

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

    type stateObject struct {
        address common.Address
        data   Account
        db     *StateDB
        trie   Trie
        code  Code
        ......
    }
    
    • address 为账户的160 bits 地址
    • data 为账户的信息,即前面提到的Account结构
    • trie 合约账户的存储空间的缓存,我们可以从由dataRoot从底层数据库中读取这棵树,但鉴于我们会经常使用,所以把它缓存起来也不是一个坏主意
    • code 合约代码的缓存,作用和trie类似

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

    type stateDB struct {
        db    Database
        trie   Trie
        stateObjects  map[common.Address] * stateObject
        ......
    }
    
    • db 以太坊底层数据库接口,账户的信息都是从数据库中读取的
    • trie 所有账户组织而成的的MPT树的实例,从它里面可以读取以太坊所有账户
    • stateObjects 管理的所有需要修改stateObject

    账户操作

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

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

    相关文章

      网友评论

          本文标题:以太坊源码分析--账户的管理

          本文链接:https://www.haomeiwen.com/subject/bctlyftx.html