EIP-1167EIP接口Final(2018-06-22)最小代理(Clone)
用固定的 45 字节字节码创建只做 delegatecall 的极简代理,部署成本从几十万 Gas 降到约 4 万。
适用链:全部 EVM 链
为什么重要:工厂模式批量创建同类合约(每个用户一个金库、每个订单一个合约)的成本可以降低一个数量级。
函数签名与选择器
选择器是签名的 keccak256 前 4 字节;事件则是完整的 32 字节 topic0。 点一下即可复制。
| 签名 / 字段 | 选择器 / topic0 | 说明 |
|---|---|---|
| 运行时字节码 | — | 3d602d80600a3d3981f3363d3d373d3d3d363d73 + 实现地址(20字节) + 5af43d82803e903d91602b57fd5bf3 |
| 部署成本 | — | 约 41,000 gas,与实现合约大小无关。 |
| storage / 余额 | — | 每个 clone 有独立存储与余额,但逻辑代码与实现合约共享。 |
代码模板
链上克隆(assembly)
链上克隆(assembly)Solidity
更省心的做法是用 OpenZeppelin 的 Clones 库,以及 ERC-1167 的 CREATE2 变体(cloneDeterministic)拿固定地址。
实现与使用时的常见陷阱
- ✕clone 不能有构造函数逻辑,初始化必须靠单独的 initialize 函数,且要防止被重复调用。
- ✕实现合约应禁用初始化(构造函数里 _disableInitializers()),否则实现合约本身可能被劫持。
- ✕clone 的地址不包含实现地址,升级实现只对新建的 clone 生效,已存在的不会变。
相关标准
同属「接口」的其他标准