eth_getCode返回0x说明什么? 图 1
eth_getCode返回0x说明什么? · 图 1

eth_getCode 回答某地址在指定区块是否有 EVM 字节码,不回答这个地址永远是外部账户还是可信合约。0x 只说明该区块上下文没有可返回代码,还要考虑网络、区块标签和合约生命周期。

发出可复现请求

    {"jsonrpc":"2.0","id":7,"method":"eth_getCode","params":["0x111111125421ca6dc452d289314280a0f8842a65","0x12D687"]}

非空结果形如 0x60806040…,可计算 bytecode hash 与已知部署比较。结果为 0x 时,依次检查地址校验、chainId、指定区块是否早于部署,以及节点是否保留该历史状态;不要立刻下结论说它是 EOA。

代理合约多走一步

对 EIP-1967 代理,eth_getCode 读到 proxy runtime code。还应以 eth_getStorageAt 读取 implementation slot 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc,取低二十字节作为实现地址,再对实现地址调用 eth_getCode。Beacon 或自定义代理要按各自规范追踪。

字节码不能证明什么

代码非空不代表源码已验证、管理员可信或逻辑不会升级;0x 也可能来自错误网络或归档能力不足。安全检查还需核对部署交易、代理管理员、实现版本和目标调用方法。

比较升级前后代码时,在两个固定区块分别请求 proxy 与 implementation,并计算完整字节码哈希。长度相同不能证明实现相同,浏览器显示 Verified 也只代表源码匹配某段代码。若实现槽在目标高度无法读取,应先确认节点的归档能力,不能回退到 latest 冒充历史结论。

eth_getCode:从对象到结果的阅读路线

  1. 地址状态快照:用地址状态快照直接回答搜索意图并形成可执行核验信息。
  2. 0x结果解释:用0x结果解释直接回答搜索意图并形成可执行核验信息。
  3. 代理合约追踪:用代理合约追踪直接回答搜索意图并形成可执行核验信息。
  4. 历史状态边界:用历史状态边界直接回答搜索意图并形成可执行核验信息。

怎样交接这次eth_getCode复核

交接包包含地址状态快照的原始对象、0x结果解释使用的字段和代理合约追踪产生的结果,同时注明网络与版本。第二人先独立重放,再比较答案。

eth_getCode:先固定不会漂移的判断

  1. eth_getCode按地址和区块标签返回该状态下的字节码,EOA或没有代码的地址通常返回0x。
  2. 非空代码只能证明该地址在目标状态拥有运行时代码,不能仅凭长度判断源码、代理实现或合约业务安全。
  3. 检查代理合约还需读取实现槽、验证目标实现与管理员权限;历史查询则依赖节点能够提供对应区块状态。(有限确认)

eth_getCode的证据出处

与eth_getCode直接相邻的站内主题

eth_getCode的当前部署若与文档不一致,应先确认版本再操作。

eth_getCode:不能从本文外推的结论

自毁、创建和链重组会使不同区块的代码结果变化,必须把区块哈希与响应一起保存。