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

栏目: 编程工具 · 发布时间: 7年前

内容简介:以太坊是一个巨大的状态机,在网络中,每一个全节点都保存着以太坊状态机的全部历史,只要愿意,我们可以查询到任何时刻的在以太坊中,无论是

前言

以太坊是一个巨大的状态机,在网络中,每一个全节点都保存着以太坊状态机的全部历史,只要愿意,我们可以查询到任何时刻的 状态 (黄皮书中 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值存储在区块 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,并存入数据库,完成修改。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Game Programming Patterns

Game Programming Patterns

Robert Nystrom / Genever Benning / 2014-11-2 / USD 39.95

The biggest challenge facing many game programmers is completing their game. Most game projects fizzle out, overwhelmed by the complexity of their own code. Game Programming Patterns tackles that exac......一起来看看 《Game Programming Patterns》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具