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

news2025/1/16 13:31:57

一、作用以及优点

  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发起,否则交易会报错;

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256510.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

游戏引擎学习第36天

仓库 :https://gitee.com/mrxiao_com/2d_game 回顾之前的内容 在这个程序中,目标是通过手动编写代码来从头开始制作一个完整的游戏。整个过程不使用任何库或现成的游戏引擎,这样做的目的是为了能够全面了解游戏执行的每一个细节。开发过程中&#xff0…

试题转excel;pdf转excel;试卷转Excel,word试题转excel

一、问题描述 一名教师朋友,偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运,几百道题几乎需要一个下午的时间 关键这些事,枯燥无聊费眼睛,实在是看起来就很蠢的工作 就想着做一个工具,可以自动处理…

16-01、JVM系列之:内存与垃圾回收篇(一)

JVM系列之:内存与垃圾回收篇(一) ##本篇内容概述: 1、JVM结构 2、类加载子系统 3、运行时数据区之:PC寄存器、Java栈、本地方法栈一、JVM与JAVA体系结构 JAVA虚拟机与JAVA语言并没有必然的联系,它只是与特…

2030. gitLab A仓同步到B仓

文章目录 1 A 仓库备份 到 B 仓库2 B 仓库修改main分支的权限 1 A 仓库备份 到 B 仓库 #!/bin/bash# 定义变量 REPO_DIR"/home/xhome/opt/git_sync/zz_xx_xx" # 替换为你的本地库A的实际路径 REMOTE_ORIGIN"http://192.168.1.66:8181/zzkj_software/zz_xx_xx.…

服务器上部署前端页面-实现IP+端口/index.html在线访问你的网页

首先一点,不管是那个框架开发的网页前端,最后都需要Build,构建完毕以后都是原始的HTML CSS JS 三样文件! 所以不管用原始的三剑客(HTML CSS JS)开发的前端还是用各类框架开发的前端界面(只是让开发简单…

树莓派 PICO RP2040 MACOS 使用

文章参考: Developing in C on the RP2040: macOS | Wellys Dev 这里会提示报错:ln: /bin/picotool: Operation not permitted 参考:Mac ln命令报错:Operation not permitted_ln operation not permitted-CSDN博客 放在 usr/lo…

顶顶通电话机器人开发接口对接大语言模型之实时流TTS对接介绍

大语言模型一般都是流式返回文字,如果等全部文字返回了一次性去TTS,那么延迟会非常严重,常用的方法就是通过标点符号断句,返回了一句话就提交给TTS。随着流TTS的出现,就可以直接把大模型返回的文字灌给流TTS&#xff0…

git使用-创建本地仓库、绑定远程仓库

文章目录 1. 创建git仓库2. commit提交到本地3. 创建远程仓库4. 关联远程仓库5. push代码至远程仓库6. 完成初始化 git作为版本控制工具,在开发过程中经常使用到。这里以github为例,简单介绍下仓库的创建及绑定,方便忘记了能快速的想起来。 1…

JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)

目录 JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码) 一、为什么要使用Array.sort() 二、Array.sort() 的使用与技巧 1、基础语法 2、返回值 3、…

为什么Unity里的变体数和UWA工具测出来的不一样

1)为什么Unity里的变体数和UWA工具测出来的不一样 2)使用TextureArray为什么会导致L1 Cache Miss率变高 3)Gfx.PresentFrame耗时异常高 4)AO方案中哪个更适合移动端 这是第412篇UWA技术知识分享的推送,精选了UWA社区的…

汽车免拆案例 | 2007款宝马650i车发动机偶尔无法起动

故障现象 一辆2007款宝马650i车,搭载N62B48B发动机,累计行驶里程约为26万km。车主反映,发动机偶尔无法起动,故障频率较低,十几天出现1 次,且故障出现时起动机不工作。 故障诊断  接车后试车,…

DataEase 是开源的 BI 工具

DataEase 是开源的 BI 工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务的改进与优化。DataEase 支持丰富的数据源连接,能够通过拖拉拽方式快速制作图表, DataEase 的优势: 开源开放:零门槛&#xf…

【C#设计模式(17)——迭代器模式(Iterator Pattern)】

前言 迭代器模式可以使用统一的接口来遍历不同类型的集合对象,而不需要关心其内部的具体实现。 代码 //迭代器接口 public interface Iterator {bool HashNext();object Next(); } //集合接口 public interface Collection {Iterator CreateIterator(); } //元素迭…

在LabVIEW中如何利用FPGA提升算法性能

在LabVIEW中利用FPGA的性能进行算法开发,能极大提升数据处理和实时计算的速度。LabVIEW提供了针对FPGA的开发工具,如LabVIEW FPGA Module,可以使开发者将算法部署到FPGA硬件上,从而实现并行计算和低延迟操作。以下是如何在LabVIEW…

Day7 苍穹外卖项目 缓存菜品、SpringCache框架、缓存套餐、添加购物车、查看购物车、清空购物车

目录 1.缓存菜品 1.1 问题说明 1.2 实现思路 1.3 代码开发 1.3.1 加入缓存 1.3.2 清除缓存 1.3.2.1 新增菜品优化 1.3.2.2 菜品批量删除优化 1.3.2.3 修改菜品优化 1.3.2.4 菜品起售停售优化 1.4 功能测试 1.4.1 加入缓存 1.4.2 菜品修改 1.5 代码提交 2.缓存套餐 2.1 Spring C…

HCIA-openGauss_2_2连接与认证

设置客户端认证策略 设置配置文件参数 gssql客户端连接-确定连接信息 客户端工具通过数据库主节点连接数据库,因此连接前,需要获取数据库主节点的在服务器的IP地址及数据库主节点的端口号信息。 步骤1:以操作系统用户omm登录数据库主节点。…

上海理工大学《2024年867自动控制原理真题》 (完整版)

本文内容,全部选自自动化考研联盟的:《上海理工大学867自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2024年真题 Part1:2024年完整版真题 2024年真题

SpringMVC纯注解快速开发

此文章适合具有一定的java基础的同学看哦,如果有看不懂的基本代码还是先补补java基础哦。 此教程带您不使用xml文件而是纯注解开发,易懂、快捷、迅速,从0开始搭建,很快就能构建起一个SpringMVC项目,能学到两种使用tom…

Linux-音频应用编程

ALPHA I.MX6U 开发板支持音频,板上搭载了音频编解码芯片 WM8960,支持播放以及录音功能!本章我们来学习 Linux 下的音频应用编程,音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升,但是笔者仅向大家介绍 Li…

【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作

💯 欢迎光临清流君的博客小天地,这里是我分享技术与心得的温馨角落 💯 🔥 个人主页:【清流君】🔥 📚 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 📚 🌟始终保持好奇心&…