qweweq

  • 元家昕
  • 更新于 2024-05-29 16:24
  • 阅读 19

使用OpenZeppelin Upgrades插件部署的智能合约可以被升级,可以在保留其地址、状态和余额下,修改其合约代码,同时。这允许你迭代地将新功能添加到项目中,或修复你在生产中可能发现的任何错误。

在本教程中,我们将展示使用OpenZeppelin Hardhat Upgrades和Gnosis Safe多签钱包,进行合约创建、测试和部署,以及使用Gnosis Safe多签升级,教程包含以下内容:

  1. 创建一个可升级的合约
  2. 在本地测试该合约
  3. 将合约部署到公共网络上
  4. 将升级的控制权转移到Gnosis 多签账号中
  5. 创建新的实现版本
  6. 在本地测试升级
  7. 部署新的实现
  8. 升级合约

设置环境

我们将首先创建一个新的npm项目。

mkdir mycontract && cd mycontract
npm init -y

我们将安装Hardhat。\ 运行Hardhat时,选择 创建一个空的hardhat.config.js 的选项:

npm install --save-dev hardhat
npx hardhat
888    888                      888 888               888
888    888                      888 888               888
888    888                      888 888               888
8888888888  8888b.  888d888 .d88888 88888b.   8888b.  888888
888    888     "88b 888P"  d88" 888 888 "88b     "88b 888
888    888 .d888888 888    888  888 888  888 .d888888 888
888    888 888  888 888    Y88b 888 888  888 888  888 Y88b.
888    888 "Y888888 888     "Y88888 888  888 "Y888888  "Y888

Welcome to Hardhat v2.0.3

✔ What do you want to do? · Create an empty hardhat.config.js
Config file created

安装Hardhat Upgrades插件:

npm install --save-dev @openzeppelin/hardhat-upgrades

我们使用ethers,所以还需要安装:

npm install --save-dev @nomiclabs/hardhat-ethers ethers

然后需要配置Hardhat以使用@nomiclabs/hardhat-ethers@openzeppelin/hardhat-upgrades,以及设置编译器版本为solc 0.7.3,在你的hardhat.config.js文件中添加插件并设置solc版本,如下所示:

hardhat.config.js

// hardhat.config.js
require("@nomiclabs/hardhat-ethers");
require('@openzeppelin/hardhat-upgrades');

/**
 * @type import('hardhat/config').HardhatUserConfig
 */
module.exports = {
  solidity: "0.7.3",
};

创建可升级的合约

我们将使用来自OpenZeppelin 学习教程的Box合约。在项目根目录下创建一个contracts目录,然后在contracts目录下用以下Solidity代码创建Box.sol

注意,可升级的合约使用initialize函数而不是构造函数来初始化状态。为了保持简单,我们将使用公共的store函数来初始化我们的状态,该函数可以从任何账户多次调用,而不是使用受保护的单次调用的initialize函数。

Box.sol

// contracts/Box.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;

contract Box {
    uint256 private value;

    // Emitted when the stored value changes
    event ValueChanged(uint256 newValue);

    // Stores a new value in the contract
    function store(uint256 newValue) public {
        value = newValue;
        emit ValueChanged(newValue);
    }

    // Reads the last stored value
    function retrieve() public view returns (uint256) {
        return value;
    }
}

在本地测试合约

记得应该始终适当地测试我们编写的合约。\ 为了测试可升级的合约,我们应该为实现合约创建单元测试,同时创建更高级别的测试,以测试通过代理的交互。

我们在测试中使用chai expect,所以也需要安装以下:

npm install --save-dev chai

我们将为实现合约创建单元测试。在项目根目录下创建一个test目录,然后在test目录下创建Box.js,并复制以下JavaScript:

测试脚本Box.js

// test/Box.js
// Load dependencies
const { expect } = require('chai');

let Box;
let box;

// Start test block
describe('Box', function () {
  beforeEach(async function () {
    Box = await ethers.getContractFactory("Box");
    box = await Box.deploy();
    await box.deployed();
  });

  // Test case
  it('retrieve returns a value previously stored', async function () {
    // Store a value
    await box.store(42);

    // Test if the returned value is the same one
    // Note that we need to use strings to compare the 256 bit integers
    expect((await box.retrieve()).toString()).to.equal('42');
  });
});

我们还可以创建通过代理进行交互的测试。\ 注意:我们不需要在这里重复我们的单元测试,这是为了测试代理交互和测试升级。

\

本文由 AI 翻译,欢迎小伙伴们来校对

  • 翻译
  • 学分: 0
  • 标签:
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
元家昕
元家昕
0x8301...D236
江湖只有他的大名,没有他的介绍。