Skip to content

以太坊图解

以太坊(Ethereum)是一个分布式的计算机,由大量分布式节点组成,其中的每一个节点,都可以执行字节码(也就是所谓智能合约),然后把结果存在区块链上。整个网络是分布式的,应用可以保存状态信息,应用有了状态信息,就可以根据状态提供丰富多彩的服务。以太坊没有中心化的节点,第三方不能干预整个网络的运行,可以看作是永不停机的世界计算机。

1. 以太坊-世界计算机

picture 35

上图描述了以太坊的功能。 它把一台虚拟计算机放到了区块链上。 图中彩色方块是用哈希值串联起来的区块,每一个区块中有交易列表,交易在计算机中执行,并且导致计算机状态的变化。

以太坊中把这个虚拟计算机的状态叫做“世界状态”, 世界状态可以看作“世界计算机”的存储区域。 世界状态通过执行以太坊区块中的交易来不断变化。每一个区块添加到链的尾部,都会导致世界的状态发生变化。世界状态由各个节点独立在数据库中维护。

  1. 从这个视角看,这种状态管理的方式,类似git,每一个区块都是一个新的版本。每一个区块都可以得到一个当前所有账户的状态。 最后一个区块,就是当前系统中所有账户的当前状态。
  2. 世界计算机在以太坊的每一个节点上运行,每一个节点上的世界状态都一样。 交易触发的代码会在所有节点的虚拟机上运行一遍。

2. 账户

picture 27

世界状态由所有账户的状态构成。 有两种账户,分别是外部账户和合约账户。账户的属性包括,余额(balance)、交易次数(nonce),code(代码)、存储(stroge)。 code和 storage只有合约账户有。外部账户用私钥控制,合约账户由合约代码控制。

每一个内部账户都有自己独立的storage区域。以太坊中的智能合约代码,一旦部署,是无法升级修改的。codeHash确保代码不会被修改。

上图中只画了两个账户,实际的世界状态中有很多账户。

3. 交易

以太坊的交易由网络用户发起,交易有两种,一种是普通消息调用,另外一种是创建内部账户(会生成一个新的地址,初始化智能合约)。

picture 28

上图展示了交易执行后, 世界状态中多了一个内部账户。

4. EVM 虚拟机

picture 30

作为世界计算机, 不仅仅有存储, 还有执行智能合约代码的虚拟机。称之为EVM。合约代码在EVM中执行,可以导致存储(世界状态)的变化。

智能合约开发使用高级语言,在部署到以太坊上时候,会编译成EVM可以识别的二进制串。合约一旦部署,就需要在所有维护世界状态的节点执行。注意不是在一个节点执行,而是一旦交易列表中有合约相关操作,则操作对应的代码要在所有节点执行,以太坊节点通过执行合约相关代码来更新世界状态。

对世界计算机的使用是收费的,每次执行需要预付费(术语叫gas),执行过程中不断扣减费用。扣完了预付费后,指令将不能再执行,智能合约的调用失败。 这种机制也增进了系统的可靠性。 如果智能合约中出了bug,写了一个死循环,至少还能欠费停下来。

5. 访问以太坊

picture 29

外部用户通过以太坊节点,使用web3 API访问以太坊。

6. 数据结构

picture 21

上图展示了以太坊的主要数据结构。最左侧是一个以太坊的区块,包括区块头和区块体。在区块头里面除了parentHash作为区块指针外,还有几个哈希值:

  1. stateRoot:其值是这个区块内所有交易执行后世界状态的哈希值。
  2. receiptsRoot:其值是这个区块所有交易的执行结果的哈希值。
  3. transactionRoot:其值是这个区块所有交易的哈希值。
  4. ommersHash(UncleHash): 是对区块体中的叔块列表的哈希。

区块体中存放交易列表和叔块列表。

右侧的几棵merkle tree(世界状态,交易状态, 交易等),不会在区块中存储,而是会在节点的数据库中保存。 用区块中的哈希值来保证各个节点的merkle tree状态都一致。

7. 参考资料

  1. getting-deep-into-ethereum-how-data-is-stored-in-ethereum
  2. 以太坊黄皮书
  3. 以太坊白皮书
  4. DanFinlay-intro_to_ethereum