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;
    }
}

编译合约

oz compile

部署合约上链

oz create

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

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

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

oz send-tx

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

oz call

查看计算结果

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

升级

安装一个库

oz link @openzeppelin/contracts-ethereum-package

修改代码如下

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.0;
import "@openzeppelin/upgrades/contracts/Initializable.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol";
contract HelloOz is Initializable {
    string public name;
    uint256 public dec;
    uint256 public inc;
    using SafeMath for uint256;
    function initialize(string memory _name) initializer public {
        name = _name;
    }
    function decrement(uint256 x) public returns (uint256) {
            return dec = x.sub(1);
        }
    function increment(uint256 x) public returns (uint256) {
            return dec = x.add(1);
        }
}

使用

oz upgrade

进行更新

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

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

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

Last updated