区块链开发必备(1)——合约升级方案

  • Wade
  • 更新于 2022-11-10 19:19
  • 阅读 2709

合约升级方案

基础

基于 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,作为代理的管理员。 ● 一个指向实现合约的代理,也就是你实际交互的合约。

image.png

升级则包括以下步骤。 ● 部署新的实现合约 ● 向代理发送一个事务,将其实现地址更新为新的实现地址。

image.png

注意:合约的逻辑可以被升级,但是 store 还是在 proxy 里,是无法升级的

FAQ

为什么可升级的合约不能有构造函数? proxy admin 的作用是什么?

点赞 5
收藏 4
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Wade
Wade
CTO of Footprint Analytics (https://www.footprint.network/) | data scientist | crypto investor | ex-degen