ESSAY / NOTE

使用hardhat快速部署可升级的智能合约演示学习案例

本案例仅供参考学习,目前漏洞尚未研究请勿用于项目实例 官方教程 https://docs.openzeppelin.com/upgrades-plugins/1.x/hardhat-upgrades env $(cat .env) npx hardhat run --network ropsten scripts/deploy_box_v1.js Downloading compiler 0.8.10 Compiled 2 Solidity files successfully Box deployed to: 0xc1524bCbC56162F272Db68Bc1379039a95546085 部署完成三个合约 ProxyAdmin 0xad6c3eff51E8ecEde381E55Bd7Ee34274896A97A TransparentUpgradeableProxy 提供透明可升级代理和uups,我们案例使用透明代理 0xc1524bCbC56162F272Db68Bc1379039a95546085 Box 开源Box合约 需要彻底科学上网 内部api有可能通不过 多试几次还不行就要用remix里的flattener插件合成一个文件再去浏览器verify 0x29B500C91f5a50C5c6BE6ccF346f986Db037574b env $(cat .env) npx hardhat verify --network ropsten 0x29B500C91f5a50C5c6BE6ccF346f986Db037574b 运行命令报错 我们更新下插件 yarn add @nomiclabs/hardhat-ethers yarn add @nomiclabs/hardhat-etherscan yarn add @openzeppelin/hardhat-upgrades npm i -s @nomiclabs/hardhat-etherscan@3.0.1 版本降级 暂未使用 注意在 hardhat.config.js 中添加引入 https://www.npmjs.com/package/@openzeppelin/hardhat-upgrades
require('@openzeppelin/hardhat-upgrades');
部署完成后在etherscan执行 more options -> Is this a proxy? 升级到v2 env $(cat .env) npx hardhat run --network ropsten scripts/upgrade_box_v2.js 升级后再次执行 etherscan执行 more options -> Is this a proxy? 更新合约 相关代码 https://github.com/t4sk/hello-oz-upgradeable Box.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

contract Box {
    uint public val;

    // 不支持构造函数 constructor

    function initialize(uint _val) external {
        val = _val;
    }
}
BoxV2.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

contract BoxV2 {
    uint public val;

    // function initialize(uint _val) external {
    //     val = _val;
    // }

    function inc() external {
        val += 1;
    }
}
scripts/deploy_box_v1.js
const { ethers, upgrades } = require("hardhat");


async function main() {
    const Box = await ethers.getContractFactory("Box");

    const box = await upgrades.deployProxy(Box, [42], {
        initializer: "initialize",
    });

    await box.deployed();

    console.log("Box deployed to:", box.address);  
}

main();
scripts/upgrade_box_v2.js
const { ethers, upgrades } = require("hardhat");

// 代理合约地址
const PROXY = "0xc1524bCbC56162F272Db68Bc1379039a95546085";


async function main() {
    const BoxV2 = await ethers.getContractFactory("BoxV2");
    await upgrades.upgradeProxy(PROXY, BoxV2);
}

main();