openzeppelin升级体验

创建项目

npm install -g @openzeppelin/cli
oz --version
mkdir hello-oz  
cd hello-oz
npm init -y
oz init
npm install @openzeppelin/upgrades --save

部署

在contracts文件夹中创建HelloOz.sol文件

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.0;
import "@openzeppelin/upgrades/contracts/Initializable.sol";


contract HelloOz is Initializable {
    string public name;
    uint256 public dec;
    uint256 public inc;

    function initialize(string memory _name) initializer public {
        name = _name;
    }

    function decrement(uint256 x) public returns (uint256) {
        return dec = x - 1;
    }

    function increment(uint256 x) public returns (uint256) {
        return inc = x + 1;
    }
}

编译合约

部署合约上链

这里根据networks.js随便跑一个节点,这里用hardhat代替

部署完之后可以在.openzeppelin/dev-.json中看到部署的信息。其中implementation就是逻辑合约的地址。

这里模拟溢出做演示。 首先使用

设置x为0,并计算。然后

查看计算结果

可以看到,0-1结果溢出了。然后我们来升级合约。

升级

安装一个库

修改代码如下

使用

进行更新

提示我们0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f已经更新。再用刚才的例子测试

发现它提示溢出了。可以看到,合约地址不变。但是逻辑已经更新。

参考: How to create an upgradeable smart contract using OpenZeppelin SDK | by Paulina Błaszkiewicz | Coinmonks | Medium

Last updated