This EIP specifies a new opcode, which returns the keccak256 hash of a contract's code.
Many contracts need to perform checks on a contract's bytecode, but do not necessarily need the bytecode itself. For instance, a contract may want to check if another contract's bytecode is one of a set of permitted implementations, or it may perform analyses on code and whitelist any contract with matching bytecode if the analysis passes.
Contracts can presently do this using the
0x3c) opcode, but this is expensive, especially for large contracts, in cases where only the hash is required. As a result, we propose a new opcode,
EXTCODEHASH, which returns the keccak256 hash of a contract's bytecode.
A new opcode,
EXTCODEHASH, is introduced, with number
takes one argument from the stack, zeros the first 96 bits
and pushes to the stack the keccak256 hash of the code of the account
at the address being the remaining 160 bits.
In case the account does not exist or is empty (as defined by EIP-161)
0 is pushed to the stack.
In case the account does not have code the keccak256 hash of empty data
is pushed to the stack.
The gas cost of the
EXTCODEHASH is 400.
As described in the motivation section, this opcode is widely useful, and saves on wasted gas in many cases.
The gas cost is the same as the gas cost for the
BALANCE opcode because the
execution of the
EXTCODEHASH requires the same account lookup as in
Only the 20 last bytes of the argument are significant (the first 12 bytes are
ignored) similarly to the semantics of the
EXTCODEHASH distincts accounts without code and non-existing accounts.
This is consistent with the way accounts are represented in the state trie.
This also allows smart contracts to check whenever an account exists.
# Backwards Compatibility
There are no backwards compatibility concerns.
# Test Cases
EXTCODEHASHof the account without code is
c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470what is the keccack256 hash of empty data.
EXTCODEHASHof non-existent account is
EXTCODEHASHof an precompiled contract is either
A + 2**160is
EXTCODEHASHof an account that selfdestructed in the current transaction.
EXTCODEHASHof an account that selfdestructed and later the selfdestruct has been reverted.
EXTCODEHASHof an account created in the current transaction.
EXTCODEHASHof an account that has been newly create and later the creation has been reverted.
EXTCODEHASHof an account that firstly does not exist and later is empty.
EXTCODEHASHof an empty account that is going to be cleared by the state clearing rule.
Copyright and related rights waived via CC0 (opens new window).