news 2026/4/16 13:49:01

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在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

成功了

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:06:48

杨建允:AI搜索趋势对教育培训行业获客的影响

AI搜索正重塑教育培训行业的获客逻辑。一、AI搜索带来的核心变革1.精准获客‌:AI通过分析用户搜索历史、兴趣偏好等,实现精准客户画像。例如,教育机构可针对“小升初辅导”“雅思备考”等需求,AI搜索可定向优化相关内容&#xff0…

作者头像 李华
网站建设 2026/4/16 0:58:45

10分钟玩转Hunyuan3D-1:零代码生成专属3D虚拟宠物终极指南

10分钟玩转Hunyuan3D-1:零代码生成专属3D虚拟宠物终极指南 【免费下载链接】Hunyuan3D-1 腾讯开源的Hunyuan3D-1项目,创新提出两阶段3D生成方法,实现快速、高质量的文本到3D和图像到3D转换,融合Hunyuan-DiT模型,优化艺…

作者头像 李华
网站建设 2026/4/16 12:30:16

以太坊Fusaka(经济篇)—— 交易费腰斩再腰斩,Layer2成本“雪崩“?

【导读】以太坊的Fusaka升级,官方路线图里最醒目的关键词之一不是「TPS」,也不是「DeFi」,而是一个看起来有点抽象的东西:Blob。它和我们平时嘴里的Gas不一样,却正在悄悄改变以太坊整条经济曲线——尤其是Layer2的手续…

作者头像 李华
网站建设 2026/4/16 1:38:09

测试工程师的“第二曲线”技能探索

为什么测试工程师需要“第二曲线”?‌ 在查尔斯汉迪的“第二曲线”理论中,任何职业或组织都应在上升期主动探索新路径,避免因依赖原有模式而走向衰退。软件测试行业正处在这个拐点:随着DevOps和持续集成成为常态,传统…

作者头像 李华
网站建设 2026/4/13 8:57:01

48小时攻克测试岗——闪电面试极速备战手册

当机会来敲门 2025年的科技招聘市场依然充满变数,一个突如其来的面试机会可能改变你的职业轨迹。对于软件测试工程师而言,"闪电面试"既是挑战也是机遇——它考验着你的知识储备、应变能力和专业素养。本文专为测试从业者设计,帮你…

作者头像 李华
网站建设 2026/4/16 7:40:31

量化投资绩效分析自动化:告别手动Excel计算,5分钟生成专业报告

量化投资绩效分析自动化:告别手动Excel计算,5分钟生成专业报告 【免费下载链接】backtrader 项目地址: https://gitcode.com/gh_mirrors/bac/backtrader 还在为繁琐的量化策略绩效分析而头疼吗?手动在Excel中计算夏普比率、最大回撤等…

作者头像 李华