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
已经更新。再用刚才的例子测试

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