- 原文链接:http://localhost:3000/
- 译者:AI翻译官
- 本文永久链接:learnblockchain.cn/article…
使用OpenZeppelin Upgrades插件部署的智能合约可以被升级,可以在保留其地址、状态和余额下,修改其合约代码,同时。这允许你迭代地将新功能添加到项目中,或修复你在生产中可能发现的任何错误。
在本教程中,我们将展示使用OpenZeppelin Hardhat Upgrades和Gnosis Safe多签钱包,进行合约创建、测试和部署,以及使用Gnosis Safe多签升级,教程包含以下内容:
我们将首先创建一个新的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
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
函数。
// 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:
// 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 翻译,欢迎小伙伴们来校对。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!