0

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

 2 years ago
source link: https://nicodechal.github.io/2020/10/18/ethereum-yellow-paper-1/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

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

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

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

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

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

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

B≡(...,(T0,T1,...))B\equiv(...,(T_0,T_1,...)) B≡(...,(T​0​​,T​1​​,...))

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

  1. 按顺序执行区块中的交易们,改变以太坊的状态,即 σ=Υ(Υ(σ,T0),T1)...\mathbf{\sigma} = \Upsilon(\Upsilon(\mathbf{\sigma},T_0), T_1)...σ=Υ(Υ(σ,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)...) Π(σ,B)≡Ω(B,Υ(Υ(σ,T​0​​),T​1​​)...)

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

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

区块奖励函数定义如下:

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

σ′[BHc]b=σ[BHc]b+(1+∥BU∥32)Rb\mathbf{\sigma'}[{B_H}_c]_b=\sigma[{B_H}_c]_b + (1 + \frac{\parallel B_\mathbf{U}\parallel}{32})R_b σ​′​​[B​H​​​c​​]​b​​=σ[B​H​​​c​​]​b​​+(1+​32​​∥B​U​​∥​​)R​b​​

∀U∈BU:σ′[Uc]b=σ′[Uc]b+(1+18(Ui−BHi))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 ∀​U∈B​U​​​​:σ​′​​[U​c​​]​b​​=σ​′​​[U​c​​]​b​​+(1+​8​​1​​(U​i​​−B​H​i​​​​))R​b​​

Rb=5×1018Wei=5EtherR_b=5\times10^{18}\ Wei=5\ Ether R​b​​=5×10​18​​ Wei=5 Ether

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK