本节会把状态做一个详细的介绍,前三节介绍的都是关于全局状态的概述和设计的公式的定义。首先看公式1,全局状态的描述可以看做是每个账号的KEC
hash值与每个账号状态的映射关系,账号状态有分四个属性:交易数,余额,存储内容的TRIE值,代码的hash值,其中他们的取值范围在公式里给出了详细的定义,分别是2^256范围内的数值和32位的字节序。
公式2是对空账户的数学公式定义,这个翻译一下就是:账户没有代码,没有交易,没有余额。以太坊的账户分为两种,一种是我们人来操作的,用来管理资产的账户,这种是没有代码的,另一种是智能合约的账号,这种账号下是有代码的。
公式3是对死账号的定义:账号状态内容没有任何属性或者是空账号,那么可以把这种称为死账号。
公式4,5是对账号状态内容存储的hash树根的TRIE定义,在前面的一节中我们已经给出TRIE函数的精确定义以及算法公式,这里需要解释的是公式6,公式6是对公式5的一种变形操作,公式5的操作就是KEC
计算hash和
RLP进行封装,封装的对象是K,V。公式6的意思是,如果K,V不是一个具体的数值,而是一个树形结构或者列表结构,那么就把公式5的计算方式应用于这个树的具体节点和元组。因此公式4,5,6是对账号属性中,storageRoot的精准定义。
公式7是对账号下代码内容的hash运算,对于普通账号,是不涉及智能合约代码的,因此一般是空集合的一个hash值,对于智能合约账号,这段值就是对智能合约代码的内容的hash运算结果。
如果公式比较抽象,那么上图以结构图的形式详细的展示了全局状态的数据结构:全局状态是所有非空账号与账号状态之间的对应关系,账号状态包括四项内容,每项内容的含义以及数据结构也已经通过图像表示。
我们知道以太坊的状态是会发生迁移的,随着智能合约的执行和账号之间eth额度的转让,整个状态机的状态是经常发生变化的。以太坊状态的具体变化需要一些列的数学公式来定义,我们这里先简单的通过图的形式给大家一个总体的概念和印象,这个图我就不自己手画,盗用一下网上的内容吧:
此图充分说明,在状态发生变化时,只需要将发生过变化的节点的hash值从下往上重新计算,得到新的state root,并且全网对运算结果达成共识,那么这样一次状态转移就算成功,智能合约或者eth转账算是成功执行。
网友评论