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:从对象到结果的阅读路线
- 地址状态快照:用地址状态快照直接回答搜索意图并形成可执行核验信息。
- 0x结果解释:用0x结果解释直接回答搜索意图并形成可执行核验信息。
- 代理合约追踪:用代理合约追踪直接回答搜索意图并形成可执行核验信息。
- 历史状态边界:用历史状态边界直接回答搜索意图并形成可执行核验信息。
怎样交接这次eth_getCode复核
交接包包含地址状态快照的原始对象、0x结果解释使用的字段和代理合约追踪产生的结果,同时注明网络与版本。第二人先独立重放,再比较答案。
eth_getCode:先固定不会漂移的判断
- eth_getCode按地址和区块标签返回该状态下的字节码,EOA或没有代码的地址通常返回0x。
- 非空代码只能证明该地址在目标状态拥有运行时代码,不能仅凭长度判断源码、代理实现或合约业务安全。
- 检查代理合约还需读取实现槽、验证目标实现与管理员权限;历史查询则依赖节点能够提供对应区块状态。(有限确认)
eth_getCode的证据出处
- eth_getCode的一级来源 1:Ethereum.org JSON-RPC。用于正式字段、流程或产品说明
- eth_getCode的一级来源 2:Ethereum Execution APIs。用于实现路径、比较基准或风险边界
与eth_getCode直接相邻的站内主题
- ERC-165如何判断合约接口?:补充第1项相邻知识。
- ERC-1271如何验证合约签名?:补充第2项相邻知识。
eth_getCode的当前部署若与文档不一致,应先确认版本再操作。
eth_getCode:不能从本文外推的结论
自毁、创建和链重组会使不同区块的代码结果变化,必须把区块哈希与响应一起保存。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。