以太坊世界状态 ( World State ) 转移概览

以太坊 Yellow Paper 学习笔记(一)

Posted by Nicodechal on 2020-10-18

以太坊可以看做基于交易的状态机,任意时刻,使用 σ\sigma 表示以太坊的当前状态,即为任意时刻以太坊中各个账户信息的一个表,包含了以太坊中所有账户的剩余以太币数量等和账户相关的信息,可以使用 σ[a]\sigma[a] 的方式取到账户 aa 的相关信息,每个账户包含下面 4 个字段:

  1. nonce: σ[a]n\mathbf{\sigma}[a]_n 一个普通账户发起一个交易,该值就加 1,一个合约账户每创建一个合约,该值加 1。
  2. balance: σ[a]b\mathbf{\sigma}[a]_b 会取到 aa 的余额。
  3. storageRoot: σ[a]s\mathbf{\sigma}[a]_s 一个指向 一个 Map 对象的哈希指针( Map 的 key 和 value 都是 256 位的整型数据,使用 MPT 存储,暂不展开)。
  4. codeHash: σ[a]c\mathbf{\sigma}[a]_c 表示账户包含的代码的哈希值。

下面是比较抽象的以太坊的状态转移方程

σt+1Υ(σt,T)\mathbf{\sigma_{t+1}}\equiv\Upsilon(\mathbf{\sigma_t},T)

前一个状态 σt\mathbf{\sigma_t} 基于交易 TT 进行任意的计算得到下一个状态 σt+1\mathbf{\sigma_{t + 1}}Υ\Upsilon 表示的是交易级的状态转移方程。

σt+1Π(σt,B)\mathbf{\sigma_{t+1}}\equiv\Pi(\mathbf{\sigma_t}, B)

这个则是区块级的状态转移方程。其中 BB 表示一个包含一些交易的区块(下面的描述省略了区块中的其他信息)。

B(...,(T0,T1,...))B\equiv(...,(T_0,T_1,...))

区块级的状态转移包含两个部分:

  1. 按顺序执行区块中的交易们,改变以太坊的状态,即 σ=Υ(Υ(σ,T0),T1)...\mathbf{\sigma} = \Upsilon(\Upsilon(\mathbf{\sigma},T_0), T_1)...
  2. 进行区块的奖励分配,这里使用 Ω\Omega 表示

所以有

Π(σ,B)Ω(B,Υ(Υ(σ,T0),T1)...)\Pi(\mathbf{\sigma}, B)\equiv\Omega(B, \Upsilon(\Upsilon(\mathbf{\sigma},T_0), T_1)...)

奖励分配函数只会改变以太坊状态中的两个部分。

  1. 当前区块的受益人的余额(用 BHcB_{H_c} 表示当前区块的区块头中的受益人字段的值,即受益人的账户)。
  2. 当前区块包含的叔块们的余额(由于区块中只会包含叔块的头部,所以用 U\mathbf{U} 表示区块包含的叔块头的集合,每个叔块头中的受益人字段用 UcU_c 表示)。

区块奖励函数定义如下:

Ω(B,σ)σ:σ=σ except:\Omega(B,\mathbf{\sigma})\equiv\sigma':\sigma' = \sigma\space{ except}:

σ[BHc]b=σ[BHc]b+(1+BU32)Rb\mathbf{\sigma'}[{B_H}_c]_b=\sigma[{B_H}_c]_b + (1 + \frac{\parallel B_\mathbf{U}\parallel}{32})R_b

UBU:σ[Uc]b=σ[Uc]b+(1+18(UiBHi))Rb\forall_{U\in B_{\mathbf{U}}}:\mathbf{\sigma'}[U_c]_b=\mathbf{\sigma'}[U_c]_b + (1 + \frac{1}{8}(U_i-B_{H_i}))R_b

Rb=5×1018 Wei=5 EtherR_b=5\times10^{18}\ Wei=5\ Ether

R0R_0 代表一个区块的基础收益,所以,挖出一个区块

  1. 首先会奖励区块的受益人区块的基础收益,即为 5Ether,然后区块每包含一个叔块头,可以获得区块基础收益的 132\frac1{32}BU\parallel B_\mathbf{U}\parallel 代表区块包含的叔块头的数量 )。
  2. 对于被包含的叔块的受益人,首先分配一个基础的区块收益,然后根据叔块到当前块的距离,减少一部分收益,这部分为叔块到当前块距离的 18\frac1{8} ( 这里 UiBHiU_i\le B_{H_i},就是说越远的叔块包含后的收益越少,以太坊规定只有距离当前块距离不大于 6 的叔块可以被包含到当前区块)。