Alert Source Discuss
Standards Track: Core

EIP-2681: 将账户 nonce 限制为 2^64-1

Authors Alex Beregszaszi (@axic)
Created 2020-04-25

摘要

将账户 nonce 限制在 02^64-1 之间。

动机

账户 nonce 目前被指定为任意长度的无符号整数。在状态见证中处理任意长度的数据并非最佳选择,因此本 EIP 将允许证明以更优化的方式表示 nonce。

此外,这可能对交易格式有利,至少有三个其他提案正在寻求对此进行改进。

最后,这有助于客户端进行小的优化,因为 nonce 不再需要保留为 256 位数字。

规范

从创世区块开始追溯引入两个新的限制:

  1. 认为任何 nonce 大于或等于 2^64-1 的交易都是无效的。
  2. 当账户 nonce 为 2^64-1 时,CREATECREATE2 指令的执行以结果 0 被压入堆栈结束。在这种情况下,initcode 执行的 Gas 不会被扣除。

理由

  1. 任何 nonce 都不太可能达到或超过建议的限制。如果有人想通过外部交易达到该限制,则至少需要花费 21000 * (2^64-1) = 387_381_625_547_900_583_915_000 gas。

  2. 必须注意的是,过去在 Morden 测试网中,每个新账户都有 2^20 的起始 nonce,以便区分来自主网的交易。 自从 EIP-155 引入了一种使用链标识符的更优雅的方式以来,这种重放保护模式已经过时。

  3. 大多数客户端已经认为 nonce 字段是 64 位的,例如 go-ethereum。

  4. nonce 为 2^64-1 的交易无效的原因是,否则在包含后,发送方账户的 nonce 将超过 2^64-1

向后兼容性

虽然这是一个破坏性的更改,但不应看到任何实际效果:

  1. 当前状态中没有账户的 nonce 超过该值。截至 2020 年 11 月,账户 0xea674fdde714fd979de3edf0f56aa9716b898ec8 负责最高的账户 nonce,约为 2900 万。

  2. go-ethereum 已经部分实现了此限制(state.Account.Noncetypes.txdata.AccountNonce 将其作为 64 位数字)。

安全注意事项

无。

版权

版权及相关权利通过 CC0 放弃。

Citation

Please cite this document as:

Alex Beregszaszi (@axic), "EIP-2681: 将账户 nonce 限制为 2^64-1," Ethereum Improvement Proposals, no. 2681, April 2020. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2681.