如何使用OpenZeppelin的可升级合约
已经部署的智能合约可以使用OpenZeppelin升级插件通过修改代码但保留原合约地址、状态和余额来进行升级。这点允许我们迭代自己的项目来添加新功能或修复发现的Bug。
正常情况下以太坊的智能合约是不能改变的。合约一旦创建就没办法改变。
但是,在很多场景下,人们还是希望可以修改合约。想象一下传统合约的参与双方,如果双方都同意改变,他们就可以改变合约。在以太坊上,人们也会希望通过修改合约来修复他们发现的Bug或添加其他功能。
如果不升级合约,可以通过以下方法来修复合约中发现的Bug。
- 重新部署一个新合约;
- 手工迁移所有的老合约到新合约,这个成本很高需要消耗gas费;
- 使用新合约地址更新所有老的合约;
- 通知所有用户并且说服他们开始使用新部署的合约。
使用升级插件进行升级
无论何时通过OpenZeppelin升级插件的deployProxy部署的新合约,后面都可以升级该合约实例。默认情况下,只有原来部署合约的地址有权升级它。
deployProxy 会做以下工作:
- 部署合约实现;
- 部署ProxyAdmin 合约;
- 部署proxy合约并且执行初始化函数。
// contracts/Box.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
contract Box {
uint256 private _value;
// Emitted when the stored value changes
event ValueChanged(uint256 value);
// Stores a new value in the contract
function store(uint256 value) public {
_value = value;
emit ValueChanged(value);
}