按字节码找合约:ERC-7744 代码索引与克隆合约识别
以太坊上大量合约是克隆出来的:同一个模板部署一万次,每个实例地址不同,但运行代码逐字节相同。想找到“和某个合约用同一套代码的所有合约”,靠地址是数不过来的。ERC-7744 提出代码索引(Code Index):一张以字节码哈希为键、合约地址为值的公共索引表。该提案在 ercs 仓库的状态是 Last Call(最后召集),创建于 2024 年 7 月 16 日。
索引表怎么工作
参考实现的结构极简:一个映射 mapping(bytes32 => address),键是合约的 codehash。核心函数是 register(container)——把某个合约登记进索引,用的是它的 container.codehash;命中已有登记时,若旧登记仍是有效容器,则发出携带旧地址与新地址的错误并回滚,防止同一份代码挂到不同“标签”下。查询侧用 get:给一个字节码哈希,返回登记过的代表地址。这使几类应用成为可能:按代码签名与白名单(“这份代码审计过”)、去中心化的合约分发、以及发现同源代码的部署规模。

容器校验与 EIP-7702 的例外
能被登记的“容器”有门槛:必须有代码(code 长度大于零、codehash 非零),并且不能是 EIP-7702 委托地址。实现里用一段内联汇编检查账户代码的前三个字节是否等于 0xef0100——这是 EIP-7702 给外部账户挂上委托指针的固定前缀。为什么要排除?因为 7702 账户显示的代码只是委托跳转外壳,把它当成“这份代码的代表地址”会指错对象:真正执行的代码住在别处。这个细节对读索引的人同样重要:索引回答的是“谁的账户代码就是这段字节码”,不回答“谁在执行这段代码”。
识别克隆与仿冒的实际用法
对 NFT 用户,这张表提供两个视角。正向:一个用工厂克隆部署的系列,所有分片合约可以被聚出来,核对“我的合约确实和主合约同一份代码”,代理壳、克隆模板一目了然。反向:如果你发现某个陌生地址和知名合约的 codehash 完全一致,说明它是同源代码的另一次部署,需要看初始化参数与存储数据才能判断关系;而若名字、页面蹭着知名品牌、代码哈希却对不上任何登记的正规代码,那是典型的仿冒信号——同名不同码,比同码不同名危险得多。
使用边界
从一次排查讲起
一个常见排查场景:你收到一条钓鱼站链接,页面和某个知名 NFT 市场几乎一样,引导你连接的“合约”地址也从没见过。先别急着拉黑地址,用两步判断。第一步,取该地址的 codehash,查 ERC-7744 式索引和区块浏览器:正规市场或正规项目的代理合约往往登记过,命中说明代码至少是同一份;第二步,如果 codehash 查无此码,再和正规合约的字节码逐段对比。这里要避一个坑:代理合约模式(如 ERC-1967 存储槽指向实现合约)下,壳子地址的代码和“真正干活”的实现代码是两段字节码,光看壳子的 codehash 相同只能说明同一款壳,需要顺存储槽读出实现地址再比实现。反过来说,同源代码也可能被复制后改了构造函数里的 owner 与初始化参数,代码哈希一致只证明逻辑一致,证明不了控制权干净。字节码索引是缩小怀疑面的工具,不是信任判决。
最后给一个检索习惯:把常用正规合约的 codehash 抄进自己的笔记,之后遇到任何“新地址”先比哈希再查背景,比每次从零核验快一个数量级,也更难被换皮仿冒绕过。
索引是公共表,登记与否取决于有没有人登记,空缺不等于代码有问题;同一代码可能只登记了其中一个地址。Last Call 阶段意味着接口接近冻结但仍可能变动,接入前以规范最新版本为准。字节码相同不代表权限配置相同——铸造权、暂停权在存储与 owner 手里,识别风险时 codehash 只是第一层。本文为机制说明,不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。