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
,编号为 0x3f
。 EXTCODEHASH
从堆栈中获取一个参数,将前 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 中表示帐户的方式一致。
这也允许智能合约检查帐户是否存在。
向后兼容性
不存在向后兼容性问题。
测试用例
- 没有代码的帐户的
EXTCODEHASH
是c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
这是空数据的 keccak256 哈希值。 - 不存在的帐户的
EXTCODEHASH
是0
。 - 预编译合约的
EXTCODEHASH
是c5d246...
或0
。 - 如果
A
的EXTCODEHASH
是X
,那么A + 2**160
的EXTCODEHASH
是X
。 - 当前事务中 selfdestructed 的帐户的
EXTCODEHASH
。 - selfdestructed 并且稍后 selfdestruct 已被还原的帐户的
EXTCODEHASH
。 - 在当前事务中创建的帐户的
EXTCODEHASH
。 - 新创建的并且稍后创建已被还原的帐户的
EXTCODEHASH
。 - 首先不存在然后为空的帐户的
EXTCODEHASH
。 - 将要通过状态清除规则清除的空帐户的
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.