合约升级方案
基于 Openzeppelin V3 文档 https://docs.openzeppelin.com/contracts/3.x/upgradeable
定义合约的时候要继承 ERC721Upgradeable
contract MyCollectible is ERC721Upgradeable
安装 upgrade 插件,文档 https://docs.openzeppelin.com/upgrades-plugins/1.x/
$ npm install --save-dev @openzeppelin/hardhat-upgrades @nomiclabs/hardhat-ethers ethers
升级合约的时候使用 hardhat 的 upgrades 插件
// scripts/deploy-my-collectible.js
const { ethers, upgrades } = require("hardhat");
async function main() {
const MyCollectible = await ethers.getContractFactory("MyCollectible");
const mc = await upgrades.deployProxy(MyCollectible);
await mc.deployed();
console.log("MyCollectible deployed to:", mc.address);
}
main();
更详细的流程可以这篇教程 https://forum.openzeppelin.com/t/openzeppelin-upgrades-step-by-step-tutorial-for-hardhat/3580
当创建一个新的可升级合约实例时,OpenZeppelin升级插件实际上部署了三个合约。 ● 你写的合约,也就是所谓的包含逻辑的合约实现。 ● 一个ProxyAdmin,作为代理的管理员。 ● 一个指向实现合约的代理,也就是你实际交互的合约。
升级则包括以下步骤。 ● 部署新的实现合约 ● 向代理发送一个事务,将其实现地址更新为新的实现地址。
注意:合约的逻辑可以被升级,但是 store 还是在 proxy 里,是无法升级的
为什么可升级的合约不能有构造函数? proxy admin 的作用是什么?
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!