付费视频,请购买课程( ¥2,000.00 )后再观看
深入合约升级
视频主要讲解了合约升级的概念、必要性以及实现方法,包括迁移和代理合约等技术手段。 通过代码演示和理论分析,详细介绍了合约升级过程中可能遇到的问题及其解决方案。
1、合约升级的基本概念 合约一旦部署便不可修改,但合约代码可能存在错误或需要添加新功能,因此需要考虑合约升级的可能性。 合约升级的两种主要方法:迁移和代理合约。迁移是将数据从旧合约迁移到新合约,而代理合约则是通过委托调用来实现逻辑合约的升级。
2、迁移方法的具体操作 如果旧合约存在问题,可以禁用其功能以减少损失,然后编写新合约并读取旧合约的状态数据。 如果数据量较小,可以一次性将所有数据迁移到新合约;如果数据量大或复杂,可以让用户自行迁移。
3、代理合约的实现 代理合约通过委托调用(delegate call)将逻辑合约的代码在代理合约的上下文中执行,从而保留数据并实现逻辑升级。 代理合约和逻辑合约的存储布局必须一致,否则会导致数据冲突。 使用fallback函数可以实现对所有方法的统一委托调用,从而支持新增方法。
4、透明代理与UUPS 透明代理(Transparent Proxy)通过分离管理员和普通用户的调用逻辑,避免函数选择器冲突。 UUPS(Universal Upgradeable Proxy Standard)将所有调用统一委托到逻辑合约,并在逻辑合约中实现升级逻辑。 透明代理的优点是逻辑清晰,缺点是每次调用需要检查角色;UUPS的优点是gas成本更低,缺点是代码结构较复杂。
5、其他代理模式与注意事项 钻石代理(Diamond Proxy)适用于大型合约,将不同方法分散到多个逻辑合约中实现。 信标代理(Beacon Proxy)通过一个中心合约管理所有代理合约的逻辑实现地址,便于统一升级。 代理合约的初始化需要通过单独的init方法实现,因为构造函数无法在委托调用中生效。
6、实际部署与工具 使用OpenZeppelin的升级插件可以简化可升级合约的部署和升级流程。 用户交互的是代理合约,但逻辑合约的状态改变不会影响代理合约。