Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-1985: 某些 EVM 参数的合理限制

Authors Alex Beregszaszi (@axic), Paweł Bylica (@chfast)
Created 2018-08-01
Discussion Link https://ethereum-magicians.org/t/eip-1985-sane-limits-for-certain-evm-parameters/3224

摘要

为某些 EVM 参数引入显式值范围 (例如 gas limit、区块号、区块时间戳、在 EVM 中返回/复制数据时的大小字段)。 由于各种(实际)原因,其中一些已经具有隐式值范围。

动机

拥有这样的显式值范围可以帮助创建兼容的客户端实现, 在某些情况下,它还可以提供小的速度改进, 并且可以通过消除不切实际的极端情况来减少创建共识关键测试用例所需的工作量。

规范

如果 block.number >= {FORK_BLOCK},则引入以下值范围。 它们限制了下面列出的指令的结果(即推送到堆栈的值)。

  1. gasgas limit区块 gas limit00x7fffffffffffffff2**63 - 19223372036854775807)之间的范围。 它影响以下指令:
    • GASLIMIT (0x45),
    • GAS (0x5a).
  2. 区块号时间戳00x7fffffffffffffff2**63 - 19223372036854775807)之间的范围。 它影响以下指令:
    • TIMESTAMP (0x42),
    • NUMBER (0x43).
  3. 账户地址00xffffffffffffffffffffffffffffffffffffffff2**160 - 11461501637330902918203684832716283019655932542975)之间的范围。 即,地址占据 256 位值的低 160 位,其余高 96 位必须为零。 它影响以下指令:
    • ADDRESS (0x30),
    • ORIGIN (0x32),
    • CALLER (0x33),
    • COINBASE (0x41),
    • CREATE (0xf0),
    • CREATE2 (0xf5).
  4. 缓冲区大小代码大小内存大小00xffffffff2**32 - 14294967295)之间的范围。 它影响以下指令:
    • CALLDATASIZE (0x36),
    • CODESIZE (0x38),
    • EXTCODESIZE (0x3b),
    • RETURNDATASIZE (0x3d),
    • MSIZE (0x59),
    • PC (0x58).

理由

这些限制是:

  • EVMC 提议
  • 由某些客户端部分实现,例如 AlethgethParityethereumjs
  • [以太坊测试套件] 中的某些测试用例允许
  • 并且也隐含地被某些假设所允许,例如由于 gas limit,这些值中的某些值不能超过某个限制

本文档中提出的大部分限制以前已在 EVMC 中进行过探索和测试。

使用 2**63 - 1 常量来限制某些范围:

  • 允许使用有符号 64 位整数类型来表示它, 这有助于没有无符号类型的编程语言,
  • 使算术更简单(例如,检查 gas 不足的情况很简单,如 gas_counter < 0)。

时间戳

[黄皮书] 将区块中的时间戳定义为“等于 Unix 的 time() 在此区块开始时的合理输出的标量值”。 IEEE Std 1003.1-2001 (POSIX.1) 将该定义留给实现定义。

地址

地址的大小在[黄皮书]中指定为 20 字节。 例如,COINBASE 指令被指定为返回 Hc ∈ 𝔹20,它有 20 个字节。

内存大小

内存扩展成本不是线性的,而是由以下公式确定: cost = cost_per_word * number_of_words + (number_of_words ^ 2 / 512)

扩展到超过 2^32 - 1 字节将花费 35184774742016 gas。 这个数字符合上面施加的 gas limit (2 ^ 63 - 1),并且在一个交易中将花费大约 35184 Ether 来耗尽它,gas 成本为 1 GWei,这可以在主网上实现。

但是,从 VM 设计的角度来看,设置限制 2^32 - 1 是有益的,我们认为限制内存应该通过仔细选择区块 gas limit 来完成。

代码大小

EIP-170 已经实现了 0x6000 的代码大小限制,但即使在此之前,实际上也不可能部署大小超过 2**32 - 1 字节的代码 blob。

比较当前的实现

  • 时间戳在 AlethgethParity 中实现为 64 位值
  • 区块 gas limit 在 Alethgeth 中实现为 64 位
  • 内存、缓冲区和代码大小在 geth 中实现为 64 位值

向后兼容性

所有这些限制主要通过区块 gas limit 来强制执行。 由于超出范围的情况会导致交易失败,因此行为不应发生变化。

测试用例

待定

实现

待定

参考文献

  • EIP-92 建议将交易 gas limit 限制在 2**63 - 1,并且对其他限制进行了长时间的讨论。
  • EIP-106 建议将区块 gas limit 限制在 2**63 - 1

待办事项

  1. gas limit 是否适用于调用指令的 gas 参数?

版权

Copyright and related rights waived via CC0.

Citation

Please cite this document as:

Alex Beregszaszi (@axic), Paweł Bylica (@chfast), "EIP-1985: 某些 EVM 参数的合理限制 [DRAFT]," Ethereum Improvement Proposals, no. 1985, August 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-1985.