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.