资讯专栏INFORMATION COLUMN

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

WilsonLiu95 / 1887人阅读

摘要:前言以太坊是一个巨大的状态机,在网络中,每一个全节点都保存着以太坊状态机的全部历史,只要愿意,我们可以查询到任何时刻的状态黄皮书中,而账户状态便是其中的状态,这部分功能由主要由代码中的包提供基本概念账户地址在以太坊中,无论是外部账户还是合约

前言

以太坊是一个巨大的状态机,在网络中,每一个全节点都保存着以太坊状态机的全部历史,只要愿意,我们可以查询到任何时刻的状态(黄皮书中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

账户操作

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

stateDB找到账户对应的stateObject,若不存在,则从trie树中,通过读取底层数据库构建新的stateObject,访问过的stateObject会缓存起来

stateObject账户进行操作,可能会涉及对余额的操作,如AddBalance()调用,也有可能对存储空间的操作,如SetState(),或者对合约代码的操作如SetCode()

在区块构建完成时,计算每个账户新的MPT树的各个节点Hash,并存入数据库,完成修改。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/24381.html

相关文章

  • 以太源码分析—交易执行

    摘要:前言以太坊是一个运行智能合约的平台,被称作可编程的区块链,允许用户将编写的智能合约部署在区块链上运行。交易执行以太坊是一个基于交易的状态机,一笔交易可以使以太坊从一个状态切换到另一个状态,即交易的执行伴随着状态的改变。 前言 以太坊是一个运行智能合约的平台,被称作可编程的区块链,允许用户将编写的智能合约部署在区块链上运行。而运行合约的主体便是以太坊虚拟机(EVM) 区块 交易 合约 ...

    Lowky 评论0 收藏0
  • 以太源码分析—挖矿与共识

    摘要:下面来看看具体是怎么实现接口的可以看到,启动了多个线程调用函数,当有线程挖到时,会通过传入的通道传出结果。可以看到在主要循环中,不断递增的值,调用函数计算上面公式中的左边,而则是公式的右边。 前言 挖矿(mine)是指矿工节点互相竞争生成新区块以写入整个区块链获得奖励的过程.共识(consensus)是指区块链各个节点对下一个区块的内容形成一致的过程在以太坊中, miner包向外提供挖...

    walterrwu 评论0 收藏0
  • 以太智能合约开发第二篇:理解以太相关概念

    摘要:原文发表于以太坊智能合约开发第二篇理解以太坊相关概念很多人都说比特币是区块链,以太坊是区块链。它是以太坊智能合约的运行环境。是由以太坊节点提供。以太坊社区把基于智能合约的应用称为去中心化的应用。 原文发表于:以太坊智能合约开发第二篇:理解以太坊相关概念 很多人都说比特币是区块链1.0,以太坊是区块链2.0。在以太坊平台上,可以开发各种各样的去中心化应用,这些应用构成了以太坊的整个生态...

    yibinnn 评论0 收藏0
  • 理解以太DApp及开发工具

    摘要:一理解以太坊工具以太坊有很多工具,随着时间的推移有些会过时,但早期的网络文章会有介绍,从而与目前的工具造成时差上的迷惑,有些工具是随着工程化的需要逐渐流行起来的。可视化的以太坊钱包,可以管理账户发布合约。 一、理解以太坊工具 以太坊有很多工具,随着时间的推移有些会过时,但早期的网络文章会有介绍,从而与目前的工具造成时差上的迷惑,有些工具是随着工程化的需要逐渐流行起来的。有必要梳理以下:...

    tinna 评论0 收藏0
  • 以太创世区块与链配置载入分析

    摘要:本文首发于深入浅出区块链社区原文链接以太坊创世区块与链配置载入分析,原文已更新,请读者前往原文阅读。以太坊允许通过创世配置文件来初始化创世区块,也可使用选择使用内置的多个网络环境的创世配置。再准备两个以太坊账户,以便在创世时存入资产。 本文首发于深入浅出区块链社区原文链接:以太坊创世区块与链配置载入分析,原文已更新,请读者前往原文阅读。 创世区块作为第零个区块,其他区块直接或间接引用到...

    姘搁『 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<