以太坊可以看做基于交易的状态机,任意时刻,使用 σ 表示以太坊的当前状态,即为任意时刻以太坊中各个账户信息的一个表,包含了以太坊中所有账户的剩余以太币数量等和账户相关的信息,可以使用 σ[a] 的方式取到账户 a 的相关信息,每个账户包含下面 4 个字段:
nonce
: σ[a]n 一个普通账户发起一个交易,该值就加 1,一个合约账户每创建一个合约,该值加 1。
balance
: σ[a]b 会取到 a 的余额。
storageRoot
: σ[a]s 一个指向 一个 Map 对象的哈希指针( Map 的 key 和 value 都是 256 位的整型数据,使用 MPT 存储,暂不展开)。
codeHash
: σ[a]c 表示账户包含的代码的哈希值。
下面是比较抽象的以太坊的状态转移方程
σt+1≡Υ(σt,T)
前一个状态 σt 基于交易 T 进行任意的计算得到下一个状态 σt+1。Υ 表示的是交易级的状态转移方程。
σt+1≡Π(σt,B)
这个则是区块级的状态转移方程。其中 B 表示一个包含一些交易的区块(下面的描述省略了区块中的其他信息)。
B≡(...,(T0,T1,...))
区块级的状态转移包含两个部分:
- 按顺序执行区块中的交易们,改变以太坊的状态,即 σ=Υ(Υ(σ,T0),T1)...
- 进行区块的奖励分配,这里使用 Ω 表示
所以有
Π(σ,B)≡Ω(B,Υ(Υ(σ,T0),T1)...)
奖励分配函数只会改变以太坊状态中的两个部分。
- 当前区块的受益人的余额(用 BHc 表示当前区块的区块头中的受益人字段的值,即受益人的账户)。
- 当前区块包含的叔块们的余额(由于区块中只会包含叔块的头部,所以用 U 表示区块包含的叔块头的集合,每个叔块头中的受益人字段用 Uc 表示)。
区块奖励函数定义如下:
Ω(B,σ)≡σ′:σ′=σ except:
σ′[BHc]b=σ[BHc]b+(1+32∥BU∥)Rb
∀U∈BU:σ′[Uc]b=σ′[Uc]b+(1+81(Ui−BHi))Rb
Rb=5×1018 Wei=5 Ether
R0 代表一个区块的基础收益,所以,挖出一个区块
- 首先会奖励区块的受益人区块的基础收益,即为 5Ether,然后区块每包含一个叔块头,可以获得区块基础收益的 321 ( ∥BU∥ 代表区块包含的叔块头的数量 )。
- 对于被包含的叔块的受益人,首先分配一个基础的区块收益,然后根据叔块到当前块的距离,减少一部分收益,这部分为叔块到当前块距离的 81 ( 这里 Ui≤BHi,就是说越远的叔块包含后的收益越少,以太坊规定只有距离当前块距离不大于 6 的叔块可以被包含到当前区块)。