SuperAPI AI 工具集

upgrade-stylus-contracts

编程与开发

查看项目

更新于 10-16 03:11

技能介绍

用途:指导在 Arbitrum 上用 OpenZeppelin 代理模式实现 Stylus(Rust/WASM)智能合约的可升级改造。Stylus 与 Solidity 共享状态树、存储模型和账户系统,因此 EVM 代理模式同样适用,Solidity 代理可委托给 Stylus 实现,反之亦可。

主要能力:提供三种代理模式。UUPS 适合多数项目,升级逻辑在实现合约中,代理更轻;Beacon 让多个 BeaconProxy 共享一个 UpgradeableBeacon,更新信标即可一次性升级全部代理;基础代理 Erc1967Proxy/Erc1967Utils 用作自定义模式的底层构件。支持 UUPSUpgradeable、IErc1822Proxiable、Erc1967Proxy 等类型。

使用方式:实现合约在 #[storage] 结构体中组合 UUPSUpgradeable 与访问控制(如 Ownable);构造函数调用 self.uups.constructor() 并初始化访问控制;通过代理调用 initialize 执行 self.uups.set_version();实现 IUUPSUpgradeable(upgrade_to_and_call 需访问控制,upgrade_interface_version 委托给 self.uups)与 IErc1822Proxiable(proxiable_uuid 委托给 self.uups)。代理是带构造参数和 #[fallback] 的薄 Erc1967Proxy,部署时传入 ABI 编码的 setVersion 调用数据,可用 cargo stylus deploy 或部署合约。

上下文检测:Stylus 不支持 immutable,UUPS 改用唯一存储槽中的 logic_flag 布尔值;实现构造时置 true,经代理 delegatecall 时读到 false,only_proxy() 据此确保升级函数只能通过代理调用,并校验 ERC-1967 实现槽非零且代理版本与实现 VERSION_NUMBER 匹配。

限制与安全:升级函数须自行加访问控制;存储字段不得重排、删除或改类型,只能在末尾追加;Stylus 嵌套结构体各从自身确定槽位开始,与 Solidity 继承的扁平布局不同。须正确初始化,否则可能出现无主、未初始化或无法升级的合约。WASM 合约每 365 天或 Stylus 协议升级后需重新激活,否则不可调用。Stylus Rust 合约暂无自动存储布局校验,需靠结构体比对与 devnet 测试。示例见 rust-contracts-stylus 仓库 examples/ 目录。