当前位置: 首页 > news >正文

在REMIX中运用OpenZeppelin集成透明升级合约和在HARDHAT中集成透明升级合约演示

在REMIX中运用OpenZeppelin集成透明升级合约和在HARDHAT中集成透明升级合约演示

目录

1.在REMIX中集成透明升级合约

2.在HARDHAT中集成透明升级合约


       合约一旦部署,是不可以更改了,项目初期必须提前设计,决定是否需要升级,否则是无法升级的,只要提前用代理模式,就能升级。演示一下升级的过程。BoxV1升级到BoxV2过程。

1.在REMIX中集成透明升级合约

BoxV1.sol代码:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import "@openzeppelin/contracts/proxy/utils/Initializable.sol";
contract BoxV1 is Initializable {uint public x;function initialize(uint _val) external initializer {x = _val; // set initial value in initializer}function call() external {x += 1;}function showInvoke() external pure returns (bytes memory) {return abi.encodeWithSelector(this.initialize.selector, 1);}
}

BoxV2.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import "@openzeppelin/contracts/proxy/utils/Initializable.sol";
contract BoxV2 is Initializable {uint public x;function initialize(uint _val) external initializer {x = _val; // set initial value in initializer}function call() external {x *= 2;}function showInvoke() external pure returns (bytes memory) {return abi.encodeWithSelector(this.initialize.selector, 1);}
}

TPUProxy.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
contract TPUProxy is TransparentUpgradeableProxy {constructor(address _logic,address _initialOwner,bytes memory _data) payable TransparentUpgradeableProxy(_logic, _initialOwner, _data) {}function proxAdmin() external view returns (address) {return _proxyAdmin();}function getImplementation() external view returns (address) {return _implementation();}
}

在remix,分别编译和部署BoxV1,BoxV2合约

然后部署TPUProxy合约,部署前注意填写数据

参数解释:

参数类型作用
_logicaddress业务逻辑合约地址(如BoxV1)
_initialOwneraddress管理员地址(可以升级合约的人)
_databytes初始化数据(调用逻辑合约initialize函数)

_logic的值是复制BoxV1的地址

然后点击部署,部署TPUProxy时就已经调用了BoxV1的initialize(1)方法,在 TPUProxy 的存储上下文中,执行 BoxV1.initialize(1),initializer 来自 Initializable,该函数只能调用一次。

复制TPUProxy合约地址

然后挂载到BoxV1上

       Remix 的界面会把 “At Address 绑定的操作入口” 和 “直接部署的合约” 放在同一区域,显示名称都是 “BoxV1”,操作本质:给 TPUProxy 套了个 BoxV1 的 “操作界面”,用 BoxV1 的按钮控制代理

现在要升级到BoxV2,只能由管理合约来升级

找管理员合约

可以对应上的。如果发现ProxyAdmin合约地址跟proxAdmin按钮显示的地址不一样,明显就是错了,那么不管填写什么值,都会报错。

参数意思怎么填
proxy要升级的代理地址你的 TPUProxy 地址
implementation新逻辑合约地址你的 BoxV2 地址
data升级后要执行的函数 calldata0x(不执行)或 abi.encode(...)

然后点击“transact",意思是发起一笔区块链交易,请求将代理合约(TPUProxy)的逻辑升级到新版本(如 BoxV2),并在升级后立即执行指定的初始化或迁移函数。

接下来,把代理合约挂载到BoxV2中,因为TPUProxy已经变了,我们再次复制这个TPUProxy合约地址

点击”Ar Address

点击“x:显示的值是之前Boxv1的值,状态没丢,然后点“call",发现值已经是乘法,升级成功了

完成合约。

     用户/前端始终与 同一个地址 交互:TPUProxy,即使升级了 10 次逻辑合约,这个地址永远不会变,看这个TPUProxy地址,始终都没变。

2.在HARDHAT中集成透明升级合约

   首先安装依赖

npm install --save-dev @openzeppelin/hardhat-upgrades
或
yarn add -D @openzeppelin/hardhat-upgrades

在hardhat.config.ts文件添加依赖

require("@nomicfoundation/hardhat-toolbox");
require("@openzeppelin/hardhat-upgrades")

把BoxV1.sol和BoxV2.sol复制到hardhat中

然后在test目录下新建BoxV1.js文件

const hre = require("hardhat");
async function deploy() {const BOXV1 = await hre.ethers.getContractFactory("BoxV1");// 通过v1版本部署代理const v1 = await hre.upgrades.deployProxy(BOXV1, [1], {initializer: "initialize",});await v1.waitForDeployment();console.log(await v1.getAddress());console.log(await v1.x());await v1.call();console.log(await v1.x());
}
deploy();

然后在package.json文件所在目录,打开命令提示符,输入

#清理可能的缓存
npx hardhat clean
#重新编译
npx hardhat compile
#启动节点
npx hardhat node

启动另一个命令窗口,输入

npx hardhat run test\BoxV1.js --network localhost

复制BoxV1.js变成BoxV2.js

const hre = require("hardhat");
async function deploy() {//V2版本工厂const BOXV2 = await hre.ethers.getContractFactory("BoxV2");// 通过v2版本部署代理const v2 = await hre.upgrades.upgradeProxy("0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512",BOXV2);await v2.waitForDeployment();console.log(await v2.getAddress());console.log(await v2.x());await v2.call();console.log(await v2.x());
}
deploy();

再次要命令行执行

npx hardhat run test\BoxV2.js --network localhost

成功了

http://www.jsqmd.com/news/346986/

相关文章:

  • 三种机器深度学习神经网络模型实现(课程报告+数据+源代码)CNN、VGG-16、LSTM
  • 代码源广附2026寒
  • 三端毕设项目推荐-springboot基于B_S架构的积分制零食自选平台基于web的积分制零食自选销售平台【附源码+文档,调试定制服务】
  • 理论+实战:通过开发一个LabVIEW TCP Server端工具来学习下TCP的通信
  • 信息安全毕业设计创新的项目选题怎么选
  • Unity3D 智慧城市管理平台
  • 2026年基因数据开发者防讼攻略:软件测试从业者专业指南
  • 中科科仪图像分析软件交互及UI界面设计
  • COMSOL 仿真二次谐波产生:从理论到实践
  • 2026年音频测试设备厂家推荐排行榜:覆盖智能音响、耳机、喇叭、麦克风、马达及声振异音检测的精准测评解决方案 - 品牌企业推荐师(官方)
  • 【计算机毕业设计案例】基于python+CS架构的医院财务管理系统在线完成财务报表、预算管理、成本分析(程序+文档+讲解+定制)
  • 实用指南:【Linux】深入理解Linux进程:从概念到实践
  • 2.5记录
  • 2026年革命:太空辐射环境测试如何重塑软件可靠性——软件测试从业者的专业解析
  • 题解:洛谷 P1260 工程规划
  • 数据中台建设指南:从0到1构建企业级大数据平台
  • 【计算机毕业设计案例】基于springboot+B_S架构的积分制零食自选平台(程序+文档+讲解+定制)
  • 夜に駆ける
  • app尝试做一个文字生成语音的功能
  • 基于springboot的人格测试网站系统
  • 2026基于springboot的在线招聘系统
  • Solution - P2292 [HNOI2004] L 语言
  • app内手机防盗功能基本开发完成
  • 系统思考与组织效率
  • 做员工福利平台的公司有哪些?企业福利平台该怎么选,深度解析 - 速递信息
  • 大四毕业生亲测有效的降AI实战笔记,免费降AI指令+专业将AI工具,轻松降低AI率
  • 2026年河北画室集训实力推荐榜:纵横美术/大画室/小画室/联考成绩/小班教学深度解析,专业口碑与高分保障之选 - 品牌企业推荐师(官方)
  • 2026年 屏蔽箱厂家推荐排行榜:屏蔽室/屏蔽柜/射频屏蔽箱/OTA屏蔽箱等全品类专业屏蔽设备实力品牌深度解析 - 品牌企业推荐师(官方)
  • [豪の算法奇妙冒险] 代码随想录算法训练营第四十一天 | 121-买卖股票的最佳时机、122-买卖股票的最佳时机Ⅱ、123-买卖股票的最佳时机Ⅲ
  • JAVA - 并发之内存模型