2026/4/17 11:09:09
网站建设
项目流程
门户网站开发流程,莱芜新闻最新事件,网站优化外包顾问,软件开发的八个流程目录
1.在REMIX中集成透明升级合约
2.在HARDHAT中集成透明升级合约 合约一旦部署#xff0c;是不可以更改了#xff0c;项目初期必须提前设计#xff0c;决定是否需要升级#xff0c;否则是无法升级的#xff0c;只要提前用代理模式#xff0c;就能升级。演示一下升级的…目录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分别编译和部署BoxV1BoxV2合约然后部署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.jsconst 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成功了