EIP-2681: 将账户 nonce 限制为 2^64-1
Authors | Alex Beregszaszi (@axic) |
---|---|
Created | 2020-04-25 |
摘要
将账户 nonce 限制在 0
到 2^64-1
之间。
动机
账户 nonce 目前被指定为任意长度的无符号整数。在状态见证中处理任意长度的数据并非最佳选择,因此本 EIP 将允许证明以更优化的方式表示 nonce。
此外,这可能对交易格式有利,至少有三个其他提案正在寻求对此进行改进。
最后,这有助于客户端进行小的优化,因为 nonce 不再需要保留为 256 位数字。
规范
从创世区块开始追溯引入两个新的限制:
- 认为任何 nonce 大于或等于
2^64-1
的交易都是无效的。 - 当账户 nonce 为
2^64-1
时,CREATE
和CREATE2
指令的执行以结果0
被压入堆栈结束。在这种情况下,initcode 执行的 Gas 不会被扣除。
理由
-
任何 nonce 都不太可能达到或超过建议的限制。如果有人想通过外部交易达到该限制,则至少需要花费
21000 * (2^64-1) = 387_381_625_547_900_583_915_000
gas。 -
必须注意的是,过去在 Morden 测试网中,每个新账户都有
2^20
的起始 nonce,以便区分来自主网的交易。 自从 EIP-155 引入了一种使用链标识符的更优雅的方式以来,这种重放保护模式已经过时。 -
大多数客户端已经认为 nonce 字段是 64 位的,例如 go-ethereum。
-
nonce 为
2^64-1
的交易无效的原因是,否则在包含后,发送方账户的 nonce 将超过2^64-1
。
向后兼容性
虽然这是一个破坏性的更改,但不应看到任何实际效果:
-
当前状态中没有账户的 nonce 超过该值。截至 2020 年 11 月,账户
0xea674fdde714fd979de3edf0f56aa9716b898ec8
负责最高的账户 nonce,约为 2900 万。 -
go-ethereum 已经部分实现了此限制(
state.Account.Nonce
和types.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.