该文本详细说明了以太坊 Spurious Dragon 硬分叉的规范,主要围绕账户状态变化和 Gas 费用调整。它规定了账户创建时 nonce 的递增规则、非零价值转移对非存在账户的 Gas 费用收取,以及“空账户”和“死亡账户”的处理逻辑,包括何时账户会变为非存在状态。还提到了一个共识 bug 及其修复。
FORK_BLKNUM: 2,675,000CHAIN_ID: 1 (主网)a. 账户创建交易和 CREATE 操作在初始化代码执行之前,递增其 nonce,使其超出正常起始值 一 (对于普通网络,这仅为 1,但默认起始 nonce 非零的测试网会不同)。
b. 尽管 CALL 和 SUICIDE 在目标不存在时会收取 25,000 gas,但现在只有当操作转移大于零的值且目标账户处于 dead 状态时,才会收取费用。
c. 任何账户都不能从不存在状态改变状态到存在但empty状态。如果操作会导致这种情况,则该账户应保持不存在。
d. 在交易结束时,任何被该交易执行触及的、现在处于empty状态的账户,应转变为不存在(即被删除)。
其中:
当账户参与任何可能改变状态的操作时,即被视为触及。这包括但不限于作为零值转移的接收方。
当账户没有代码、nonce 为零且余额为零时,即被视为empty。
当账户不存在或处于empty状态时,即被视为dead。
在交易结束时指紧随 suicide 列表执行之后,在确定用于填充收据的 state trie root 之前。
账户改变状态时:
SUICIDE 操作的目标或退款方,涉及零或更多值;CALL 操作或消息调用交易的来源或目标,转移零或更多值;CREATE 操作或合约创建交易的来源或创建方,赋予零或更多值;在当前的 Ethereum 协议中,需要注意的是,很少有状态变更最终会导致在交易执行后账户为空。实际上,目前只有四种情况需要实现跟踪:
CALL 向空账户转移零值;SUICIDE 向空账户转移零值;与 #158 相同,只是避免了一些边缘情况,因为我们没有破坏不变量:
CREATE 避免 nonce 为零,以避免 CREATEd 账户在其创建过程中途被回收的任何奇怪之处。
2016年11月24日,由于两种实现方案在状态回滚的情况下行为不同,导致了一个共识 bug。[3] 规范经过修订,澄清了当状态回滚时,空账户删除也会回滚。
详情:Geth 未能回滚空账户删除,当导致空账户删除的交易以 out-of-gas 异常结束时。Parity 中发现了另一个问题,即 Parity 客户端在涉及对预编译合约的 out-of-gas 调用时,在一个更有限的上下文中错误地未能回滚空账户删除;新的 Geth 行为与 Parity 匹配,并且在大约一周后状态清理过程完成后,空账户将不再是普遍关注的问题。
- 原文链接: github.com/nerolation/EI...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!