合约的代理与升级
合约主要有3种代理模式:
一、透明代理Transparent
contract TransparentAdminUpgradeableProxy { address implementation; address admin; fallback() external payable { require(msg.sender != admin); implementation.delegatecall.value(msg.value)(msg.data); } function upgrade(address newImplementation) external { if (msg.sender != admin) fallback(); implementation = newImplementation; } }
这种模式直观好理解,代理合约负责升级,实现合约负责具体逻辑。
二、UUPS
// 代理合约
contract UUPSProxy { address implementation; fallback() external payable { implementation.delegatecall.value(msg.value)(msg.data); } }
// 实现合约要extend抽象接口 abstract contract UUPSProxiable { address implementation; address admin; function upgrade(address newImplementation) external { require(msg.sender == admin); implementation = newImplementation; } }
代理合约是空的,几乎不包含任何逻辑;实现合约既要有具体业务逻辑,还要有升级逻辑。
升级时,调用代理合约的upgrade方法, 会deletegatecall到实现合约的upgrade方法; 因为delegate实现合约会运行在代理合约的上下文中,所以实现合约的upgrade方法修改implementation属性,实际上就修改了代理合约的implementation属性。
三、钻石模式
1个代理合约,会有多份实现合约
透明代理 | UUPS | 钻石模式 | |
优点 | 容易理解 | gas费用低 | |
缺点 |
运行gas费高,每次函数调用,都要从存储中找admin 代理部署gas费高, |
新代理合约必须记得实现upgrade,否则再也无法升级 | |
openzepplin实现方式 | contract MERC1967Proxy is Proxy, ERC1967Upgrade |
参考:https://blog.openzeppelin.com/the-state-of-smart-contract-upgrades
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)