李万胜聊区块链2018-04-26 20:38:20
以太坊概述:
整个以太坊其实就是一个状态机,每一笔的转账发生,意味着某一个账号发生了变化,也意味着整个以太坊的状态放生了变化。
上图中公式1表示一个交易T,在当前时刻t的状态σ的情况下,通过交易状态变更函数Υ将状态转向了一个新的状态,这里面需要注意的是这个状态的变更只有在交易T被打包到区块中,并被全网共识之后,才会改变整个以太坊的状态。
公式2表示在某一时刻t,以太坊将一个区块B,通过区块状态变更函数Π将以太坊的状态转向了一个新的状态。
公式3表示区块内数据实质就是将多个交易T0,T1…打包的数据
公式4表示,一个以太坊的全局状态变更,就是先根据当前的区块的多个交易改变以太坊的块内状态,然后把状态变更施加在本区块之前的所有区块上,然后形成当前的最终状态。
因此以太坊区块链是一个严谨的可以用数公式表达的状态机。在状态的迁移过程中,执行了旷工奖励,token转账,智能合约指令等任务。
全局状态:整个以太坊的全局状态可以通过公式5来描述,公式5的意思是当前的全局状态是一个所有账号与账号状态的对应关系的集合,并且账号状态不能是空集合。公式6中就是对单个账号与账号状态的对应关系的描述,其中对应关系的key是账号的KEC
hash值,20个字节,对应关系的value是一个集合的RLP序列化。
账号状态是4个元素的集合:
nonce:是一个标量,表示从这个账号转出的交易的个数或者智能合约创建个数,表达式为公式7
balance:以Wei为单位的账号的余额,表达式为公式8
storageRoot:存储树的根节点。账号内的数据会以Merkle Patricia树的形式存储。表达式为公式10
codeHash:本账号EVM 代码的hash值,这个代码创建之后就无法修改,当本账号收到一个消息之后会执行该代码。代码存储在状态机数据库中,codeHash就是这个代码在数据库中的索引。
账号状态的代码表示如下:我选用的是go语言版本的以太坊的源码,有兴趣的同学可以下载源码研究一下。
你会发现以太坊使用stateObject这个结构体来表示账号的状态实体,这个在黄皮书中并没有明确的定义,由此说明根据以太坊的技术黄皮书,大家可以实现自己的以太坊公链,曾经有位大牛就是用C++实现了一个新版本的以太坊全节点代码。以太坊的黄皮书只是一个架构设计,具体的实现语言只是技术选型而已。
我们今天只概括性的讲一下以太坊的状态迁移函数和状态表达函数,里面的很多子函数的讲解,留在下一节详细展开,你会发现最后以太坊的状态表达和状态变迁可以细化到一个个数学公式。而大家可以使用不同的代码,根据数学公式来实现属于自己的区块链公链。我们当前正在设计开发的公链,就是将以太坊的状态机区块链和IPFS这样的存储协议组合起来,解决当前公链无存储能力的问题,同时将公链应用于细分的领域。
好了,下一节我们将讲解公式中6中使用到的RLP封装函数,至于REC这个hash函数,属于一个比较基础的知识,不仅仅是以太坊独有的函数,因此大家请自行检索材料,应该会有很多相关的资料。