在以太坊黄皮书学习笔记的前两篇中,我们探讨了以太坊作为“世界计算机”的宏伟愿景,并初步接触了其核心的状态树(State Tree)、交易树(Transactions Tree)和收据树(Receipts Tree)这三大默克尔帕特里夏树(Merkle Patricia Trie, MPT)结构,这些数据结构共同构成了以太坊区块链的“骨架”,记录了系统的历史状态和所有发生过的行为。
本篇笔记,我们将深入到这个“骨架”的“灵魂”——状态转换函数(State Transition Function, Δ),理解了Δ,我们才能真正明白一笔交易是如何被系统处理,并最终改变世界状态的。
什么是状态转换函数(Δ)?
以太坊的状态可以被看作是一个巨大的、分布式的数据库,这个数据库存储了所有账户的余额、代码、存储等信息,而状态转换函数Δ,就是这个数据库的“操作规则”。
Δ函数描述了一个“状态”如何根据一笔“交易”,转变为一个新的“状态”,这个过程可以抽象为一个数学表达式:
S(t) = Δ(S(t-1), T(t))
这个公式的含义是:
S(t):在区块t被执行之后,以太坊的最终状态。S(t-1):在区块t被执行之前,以太坊的初始状态。T(t):区块t中包含的所有交易集合。- 状态转换函数,它接收旧状态和一笔交易,输出一个中间状态,它会将这个中间状态与下一笔交易再次作为输入,直到区块中的所有交易都被处理完毕。
Δ函数是以太坊确定性保证的核心,只要输入(初始状态和交易)相同,无论在哪个节点上运行,输出(最终状态)都必然是相同的,这正是所有节点能够达成共识、维护同一个账本的基础。
Δ函数的内部:一笔交易的完整生命周期
黄皮书用极其严谨和形式化的语言定义了Δ函数,我们可以将其分解为处理单笔交易 T 的几个关键步骤,这正是以太坊虚拟机执行交易的底层逻辑。
假设我们要处理一笔交易 T = (nonce, gasprice, startgas, to, value, data, v, r, s),其处理流程如下:
步骤 1:交易验证
在执行交易之前,必须先验证其有效性,这一步是确保交易发起者拥有足够的权限和资源。
- 检查签名:根据交易中的
v, r, s值,使用椭圆曲线算法恢复出发送者的地址,如果恢复出的地址与交易from字段不匹配,则交易无效。 - 检查 nonce:查询发送者账户
A的当前 nonce 值,如果交易中的nonce不等于账户A的当前 nonce,则交易无效。 - 检查余额与 Gas:查询发送者账户
A的当前余额,如果账户余额不足以支付value(转账金额) +gasprice * startgas(预估的总费用),则交易无效。 - 检查 Gas Limit:如果交易的
startgas大于区块的gaslimit,则交易无效。
如果以上任何一项检查失败,交易将被标记为无效,状态不会发生改变,但交易发起者仍需支付一部分 Gas(用于支付验证成本)。
步骤 2:初始化执行环境
交易验证通过后,EVM 将为这笔交易创建一个独立的执行环境,也称为“沙箱”。
- 创建接收者账户:如果交易
to字段为空(即创建合约交易),则创建一个新的合约账户,新账户的nonce为 1,code为空,storage为空。to不为空,则目标账户B必须已经存在。 - 转移 Ether:从发送者账户
