Alert Source Discuss
Standards Track: Core

EIP-1052: EXTCODEHASH 操作码

Authors Nick Johnson <arachnid@notdot.net>, Paweł Bylica <pawel@ethereum.org>
Created 2018-05-02
Requires EIP-161

摘要

该 EIP 指定了一个新的操作码,它返回合约代码的 keccak256 哈希值。

动机

许多合约需要对合约的字节码执行检查,但不一定需要字节码本身。 例如,合约可能想要检查另一个合约的字节码是否是一组允许的实现之一,或者它可能对代码执行分析,并且如果分析通过,则将任何具有匹配字节码的合约列入白名单。

合约目前可以使用 EXTCODECOPY (0x3c) 操作码来执行此操作,但这种方式成本很高,特别是对于大型合约,在只需要哈希值的情况下。 因此,我们提出了一个新的操作码 EXTCODEHASH,它返回合约字节码的 keccak256 哈希值。

规范

引入了一个新的操作码 EXTCODEHASH,编号为 0x3fEXTCODEHASH 从堆栈中获取一个参数,将前 96 位清零,并将剩余 160 位的地址上的帐户的代码的 keccak256 哈希值推送到堆栈。

如果帐户不存在或为空(如 EIP-161 中所定义),则将 0 推送到堆栈。

如果帐户没有代码,则将空数据的 keccak256 哈希值 (即 c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470) 推送到堆栈。

EXTCODEHASH 的 gas 成本为 400。

理由

正如在动机部分中描述的那样,此操作码用途广泛,并且在许多情况下可以节省浪费的 gas。

gas 成本与 BALANCE 操作码的 gas 成本相同,因为 EXTCODEHASH 的执行需要与 BALANCE 中相同的帐户查找。

参数中只有最后 20 个字节是重要的(前 12 个字节被忽略),类似于 BALANCE (0x31)、EXTCODESIZE (0x3b) 和 EXTCODECOPY (0x3c) 的语义。

EXTCODEHASH 区分没有代码的帐户和不存在的帐户。 这与状态 trie 中表示帐户的方式一致。 这也允许智能合约检查帐户是否存在。

向后兼容性

不存在向后兼容性问题。

测试用例

  1. 没有代码的帐户的 EXTCODEHASHc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 这是空数据的 keccak256 哈希值。
  2. 不存在的帐户的 EXTCODEHASH0
  3. 预编译合约的 EXTCODEHASHc5d246...0
  4. 如果 AEXTCODEHASHX,那么 A + 2**160EXTCODEHASHX
  5. 当前事务中 selfdestructed 的帐户的 EXTCODEHASH
  6. selfdestructed 并且稍后 selfdestruct 已被还原的帐户的 EXTCODEHASH
  7. 在当前事务中创建的帐户的 EXTCODEHASH
  8. 新创建的并且稍后创建已被还原的帐户的 EXTCODEHASH
  9. 首先不存在然后为空的帐户的 EXTCODEHASH
  10. 将要通过状态清除规则清除的空帐户的 EXTCODEHASH

实现

待定

版权

CC0 下放弃版权及相关权利。

Citation

Please cite this document as:

Nick Johnson <arachnid@notdot.net>, Paweł Bylica <pawel@ethereum.org>, "EIP-1052: EXTCODEHASH 操作码," Ethereum Improvement Proposals, no. 1052, May 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-1052.