EIP-7637: 优化 EOA EXTCODEHASH
修改 EOA 账户的 EXTCODEHASH 输出值为 `0x`
Authors | Jame (@ZWJKFLC) |
---|---|
Created | 2024-02-26 |
Discussion Link | https://ethereum-magicians.org/t/eip-7637-extcodehash-optimize/18946 |
Requires | EIP-1052 |
摘要
本提案是对 EIP-1052 的优化,
对于具有余额但没有代码的地址,codehash 仍然应该是 0x
。
当地址 add.code == 0x
且 add.balance != 0
时,需要 add.codehash==0
而不是 add.codehash==keccak256("")
动机
EIP-1052 的提出是为了节省 gas 费用。但是,由于设置规范中的一些缺陷,在实际应用中,由于安全问题,它们实际上不会被使用。为了使 EIP-1052 真正有用,应该对其进行优化。
如果有人基于 EIP-1052 的提案使用它,并且没有注意到 add.balance != 0
时的变化,则可能会出现安全问题。
规范
EXTCODEHASH
的行为按以下方式更改:
- 调用
EXTCODEHASH
时,具有余额但没有代码的地址的 codehash 仍然是0x
理由
EIP-1052 为了包含 BALANCE
的功能,让没有余额的地址的 EXTCODEHASH
为 0x
,有余额的地址的 EXTCODEHASH
为 keccak256("")
。
合约地址可以提前计算出来。无论是 CREATE
还是 CREATE2
,都可能存在合约未创建但有余额的情况。为了安全起见,实际上你只能使用 keccak256(add.code) == keccak256("")
或 add.code.length ==0
而不是 add.codehash == 0
,这使得 EIP-1052 的初衷变得毫无意义。
例如,uniswap V2 使用存储的地址来确定合约是否存在。如果 EXTCODEHASH
得到优化,则可以节省大量 gas。
如果有人使用 add.codehash==0
来确定是否已创建合约,由于直觉和许多文档中缺乏细节,他们不会想到具有余额的地址的 codehash 会从 0x
变为 keccak256("")
。如果此时有人恶意攻击,将会造成一些不良影响。
向后兼容性
使用 codehash 来确定非合约地址是否具有余额将不可用
参考实现
execution-specs 的代码参考
修改后
def extcodehash(evm: Evm) -> None:
address = to_address(pop(evm.stack))
charge_gas(evm, GAS_CODE_HASH)
account = get_account(evm.env.state, address)
if account == EMPTY_ACCOUNT:
codehash = U256(0)
else:
codehash = U256.from_be_bytes(keccak256(account.code))
if codehash == U256(hexstr="c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"):
codehash = U256(0)
push(evm.stack, codehash)
evm.pc += 1
源代码
def extcodehash(evm: Evm) -> None:
address = to_address(pop(evm.stack))
charge_gas(evm, GAS_CODE_HASH)
account = get_account(evm.env.state, address)
if account == EMPTY_ACCOUNT:
codehash = U256(0)
else:
codehash = U256.from_be_bytes(keccak256(account.code))
push(evm.stack, codehash)
evm.pc += 1
安全注意事项
使用 codehash 来确定非合约地址是否具有余额将不可用
版权
版权及相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Jame (@ZWJKFLC), "EIP-7637: 优化 EOA EXTCODEHASH [DRAFT]," Ethereum Improvement Proposals, no. 7637, February 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7637.