基于openzeppelin插件的智能合约升级

一、作用以及优点

  1. 部署可升级合约,插件自动部署proxy和proxyAdmin合约,帮助管理合约升级和交互;
  2. 升级已部署合约,通过插件快速升级合约,脚本开发方便快捷;
  3. 管理代理管理员的权限,只有proxyAdmin的owner才有权限升级,权限可转移;
  4. 插件自动检测合约是否可升级,无需人工check代码,高效快捷;

二、使用方法--基于hardhat框架(引用:官网文档

2.1 安装插件

通过以下命令来安装需要的插件:

npm install --save-dev @openzeppelin/hardhat-upgrades @nomiclabs/hardhat-ethers ethers

安装完成后,将其加载到您的 Hardhat 配置文件中:

// hardhat.config.js

require('@openzeppelin/hardhat-upgrades');

2.2 插件使用

Hardhat 用户将能够编写使用该插件部署或升级合约的脚本,并管理代理管理员权限:

deployProxy完成的工作:

验证实现合约是可安全升级的;

  • 为项目部署ProxyAdmin合约,如果不存在的话;
  • 部署实现合约;
  • 部署并实例化代理合约;

upgradeProxy完成的工作:

  • 验证新的实现合约是可安全升级的,并且和之前的实现合约兼容;
  • 升级代理以使用新的实现合约;

插件会追踪.openzeppelin目录下的文件,每个网络一个文件,文件内记录了ProxyAdmin合约地址,Proxies合约和实现合约地址,文件的名称是{unknown-chainId}.json。如果属于某个网络的json文件已存在,那么ProxyAdmin合约不再重新部署。如果属于某个网络的json文件不存在,那么直接升级到新的实现合约会报错:

升级时必须有unknown-chainId.json文件提供上下文信息。

2.3 注意事项

编写升级合约时需要注意:

不要给变量设置初始值,如果必须要设置的话,需要使用 /// @custom:oz-upgrades-unsafe-allow state-variable-immutable 注释在合约代码中标记,或者在升级脚本中使用state-variable-assignment,例如:await upgrades.upgradeProxy(contract.address, BoxV2, {unsafeAllow: ['state-variable-assignment', 'delegatecall']})来禁用检查;

不要改变变量名,如果非要改变变量名,需要使用/// @custom:oz-renamed-from x 来禁用检查;

不要改变变量类型;

升级交易必须由ProxyAdmin合约的owner发起,否则交易会报错;

更多注意事项和使用技巧可查看官方文档:官方文档

相关推荐
狙击主力投资工具1 天前
26年5月4日本周复盘总结,好票机会,下周大盘方向,热门板块方向,操作建议,实用干货
人工智能·区块链
长安链开源社区2 天前
长安链开发大赛 在期待什么样的作品?
web3·区块链
Blockchain Learning2 天前
去中心化身份(DID)模型解析:区块链如何重塑身份管理?
大数据·去中心化·区块链
BlockChain8882 天前
以太坊开发入门:从 0 到 1 搭建第一个 DApp
区块链·智能合约
haizhongjien2 天前
初始化代币发行数量并设置好锁仓和释放信息
区块链
财***权8602 天前
期权手续费一览表最新的标准
区块链
BlockChain8882 天前
AI+区块链深度探索:算法与账本的共生时代
人工智能·算法·区块链
中冕—霍格沃兹软件开发测试2 天前
区块链交易最终一致性测试的核心挑战与实践框架
微服务·架构·单元测试·区块链·集成测试·旅游
开源Z2 天前
WeDPR v3.0 适配国密(SM)区块链节点部署实战:填坑官方文档未覆盖的配置
区块链·密码学·可信计算技术
Web3VentureView2 天前
SYNBO走进以太坊中国高校行复旦大学专场:链接Web3下一代开发者
人工智能·web3·区块链·加密货币·synbo