该课时需要购买课程后观看

区块链应用开发系统课 - Vibe Coding 实战

登录后购买

深入理解智能合约升级

Tiny熊 Tiny熊 2026-06-05
26次播放
2026-06-05

视频 AI 总结: 该视频深入讲解了智能合约升级的核心原理与实现方案。核心思想是利用代理合约与 delegatecall 实现逻辑与存储分离,从而在不改变用户地址的前提下升级代码。视频详细分析了升级中必须解决的存储布局冲突(通过 EIP-1967 将关键变量放在指定槽位避免覆盖)、函数选择器冲突(通过透明代理或 UUPS 模式解决)、初始化问题,并介绍了批量升级的信标代理、大型合约的钻石代理以及继承关系中的变量冲突(使用 gap 或命名空间存储)。最后通过 Remix 演示了从简单代理到完整可升级合约的操作流程。

视频中提出的关键信息:

  • 合约一旦部署不可更改,但可通过代理模式实现“伪升级”,即用户交互的代理地址不变,逻辑合约可替换。
  • 升级的核心技术是 delegatecall:逻辑合约的代码在代理合约的存储上下文中执行。
  • 存储布局冲突:代理合约中保存实现地址的变量不能放在普通变量位置,否则会被逻辑合约的变量覆盖。采用 EIP-1967 将实现地址存储在固定槽位(如 0x360894a13ba1a321..)解决。
  • 函数选择器冲突:代理合约中的升级函数(如 upgradeTo)可能与逻辑合约中某函数有相同的 4 字节选择器,导致该逻辑函数无法被调用。解决方案:
    • 透明代理:将管理员单独区分,管理员调用走升级逻辑,普通用户全部走 fallback 委托。
    • UUPS:将升级逻辑放在实现合约中(编译器自动禁止同一合约内函数选择器重复),代理只做简单委托。
  • 初始化问题:原构造函数无法为代理合约初始化状态,额外定义 initialize 函数并用修饰器防止重复初始化。
  • 变量继承冲突:父合约新增变量会覆盖子合约已有变量的槽位。解决方式是在父合约中预留 gap 空槽,或使用命名空间存储模式(OpenZeppelin 新版采用)。
  • 批量升级(克隆工厂场景):使用信标代理(Beacon Proxy),代理从 Becon 合约读取当前实现地址,只需修改 Becon 的指针即可统一升级所有代理。
  • 大型合约:使用钻石代理(Diamond Proxy),按功能拆分逻辑到多个实现合约,通过函数选择器映射到不同实现,并通过命名空间隔离存储。