手把手部署以太坊可升级智能合约

如何部署以太 坊可升级智能合约

为什么要升级合约?
根据设计,智能合约是不可变的。另一方面,软件质量在很大程度上取决于升级和修补源代码以生成迭代版本的能力。尽管基于区块链的软件从技术的不变性中获益匪浅,但修复错误和潜在的产品改进仍然需要一定程度的可变性。OpenZeppelin Upgrades 通过为智能合约提供易于使用、简单、健壮和可选的升级机制来解决这一明显的矛盾,该机制可以由任何类型的治理控制,无论是多重签名钱包、简单地址还是复杂的 DAO。

首次部署
需要部署三个合约,分别是逻辑合约,代理管理合约,代理合约。逻辑合约就是我们自己的业务合约,需要满足OpenZeppelin可升级合约的条件。以下业务合约以逻辑合约为例进行说明。
本文使用remix部署合约,如需快速部署请参考:【翻译】用 Hardhat 进行升级部署(Using with Hardhat) | 登链社区

第一步,逻辑合约
首先部署逻辑合约。

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;
import “@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol”;
import “@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol”;
import “@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol”;
import “@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol”;

contract Logic is Initializable, OwnableUpgradeable {
function initialize() public initializer {
__Ownable_init();
}

mapping(string => uint256) private logic;

event logicSetted(string indexed _key, uint256 _value);

function SetLogic(string memory _key, uint256 _value) external {
    logic[_key] = _value;
    emit logicSetted(_key, _value);
}

function GetLogic(string memory _key) public view returns (uint256){
    return logic[_key];
}

function GetInitializeData() public pure returns(bytes memory){
    return abi.encodeWithSignature("initialize()");
}

}
选中逻辑合约并部署。
image.png

在这里插入图片描述

逻辑合约地址:0x358AA13c52544ECCEF6B0ADD0f801012ADAD5eE3

第二步,管理合约
部署管理合约,用于升级逻辑合约。
image.png

在这里插入图片描述

管理合约地址:0xd2a5bC10698FD955D1Fe6cb468a17809A08fd005

第三步,代理合约
代理合约,用于存储逻辑合约数据。
在这里插入图片描述

部署需要参数如下:

逻辑合约地址:0x358AA13c52544ECCEF6B0ADD0f801012ADAD5eE3
管理合约地址:0xd2a5bC10698FD955D1Fe6cb468a17809A08fd005
逻辑合约初始化二进制码:0x8129fc1c(逻辑合约里以提供该二进制码的方法,默认为无参)
image.png

代理合约地址:0xddaAd340b0f1Ef65169Ae5E41A8b10776a75482d

如何实现升级
至此,可升级合约已部署完成,开始测试

测试逻辑合约方法
注意:此处应调用代理合约而不是直接调用业务合约

首先选中业务合约,使用At Address填入代理合约地址(0xddaAd340b0f1Ef65169Ae5E41A8b10776a75482d)后生成已代理的可升级合约。
image.png

image.png

此处应使用生成出的合约,而不是部署的合约!
image.png

调用SetLogic方法,传入(“test”,1)用于查询。
调用GetLogic方法,传入(“test”)返回的为1。
修改逻辑合约并部署
先将旧的逻辑合约GetLogic方法替换,替换后为要部署的新逻辑合约。

function GetLogic(string memory _key) public view returns (uint256){
return logic[_key] + 99;
}
image.png

部署新的业务合约,结束后应有三个逻辑合约实例

image.png

新的逻辑合约地址:0xb27A31f1b0AF2946B7F582768f03239b1eC07c2c

替换旧的逻辑合约
此时调用部署好的管理合约进行升级,此合约提供了两个升级方法

upgrade,需要传入proxy地址,新的逻辑实现地址。
upgradeAndCall,需要传入roxy地址,新的逻辑实现地址,初始化调用数据。
由于数据是保存在代理合约中,这份数据已经初始化过了,不需要再初始化,所以调用upgrade方法即可,传入参数如下:

代理合约地址:0xddaAd340b0f1Ef65169Ae5E41A8b10776a75482d
新的逻辑合约地址:0xb27A31f1b0AF2946B7F582768f03239b1eC07c2c
image.png

测试新逻辑合约
此时升级已完成,也是最后一步。

此时不需要修改任何地方,只需要使用已经传入代理合约地址的At Address方法。

image.png

生成后将有四个逻辑合约实例:
1.首次部署的逻辑合约,2.代理后的逻辑合约,3.部署的新逻辑合约,4.以升级的逻辑合约
image.png

调用生成的新逻辑合约中的GetLogic方法,传入(“test”),此时应返回100,这证明您的合约以成功升级,因为旧的逻辑合约传入了(1),修改后的逻辑合约中GetLogic方法在返回值上加上了(99),若为99证明升级失败。
image.png

至此,可升级的代理合约就部署并测试完成。
不知道你懂了没有,反正我是懂了,这篇文章挺好,转载过来,分享给大家,欢迎交流分享:wx:54516204

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenStack 部署是一个非常复杂的过程,需要掌握多种技术和工具。以下是一份 OpenStack 部署详细手把手教程,帮助你快速部署 OpenStack。 1. 准备环境 在开始部署 OpenStack 之前,你需要准备一组物理机或虚拟机,并且安装好 CentOS 7 操作系统。这些机器应该之间可以互相通信,你可以使用一个专用的管理网络。此外,你还需要为 OpenStack 分配 IP 地址和域名。 2. 安装必要的软件 在所有节点上安装必要的软件和工具,包括 Python、epel-release、yum-utils、git 等。你可以使用以下命令进行安装: ``` yum install -y python epel-release yum-utils git ``` 3. 安装 MariaDB 数据库 OpenStack 使用 MariaDB 数据库来存储数据,你需要在一个节点上安装 MariaDB,并且创建相应的数据库和用户。你可以使用以下命令进行安装: ``` yum install -y mariadb mariadb-server python2-PyMySQL systemctl enable mariadb systemctl start mariadb mysql_secure_installation ``` 在执行 `mysql_secure_installation` 命令时,你需要输入一个密码来保护你的数据库。 4. 安装 RabbitMQ 消息队列 OpenStack 使用 RabbitMQ 作为消息队列,你需要在一个节点上安装 RabbitMQ。你可以使用以下命令进行安装: ``` yum install -y rabbitmq-server systemctl enable rabbitmq-server systemctl start rabbitmq-server rabbitmqctl add_user openstack RABBIT_PASS rabbitmqctl set_permissions openstack ".*" ".*" ".*" ``` 在执行 `rabbitmqctl add_user` 命令时,你需要输入一个密码来保护你的 RabbitMQ 服务。在执行 `rabbitmqctl set_permissions` 命令时,你需要指定用户的权限。 5. 安装 Memcached 缓存服务 OpenStack 使用 Memcached 缓存服务来提高性能,你需要在所有节点上安装 Memcached。你可以使用以下命令进行安装: ``` yum install -y memcached python-memcached systemctl enable memcached systemctl start memcached ``` 6. 配置 OpenStack 源 在所有节点上配置 OpenStack 源,并且安装相应的软件包。你可以使用以下命令进行配置: ``` yum install -y centos-release-openstack-queens yum-config-manager --enable openstack-queens yum update ``` 7. 配置网络 OpenStack 需要使用 Neutron 网络服务来管理网络,你需要在所有节点上配置网络。具体的配置方法因环境而异,可以参考 OpenStack 的官方文档进行配置。 8. 安装 OpenStack 在所有节点上安装 OpenStack 相关的组件和服务。这个过程比较复杂,需要涉及到多个组件和配置文件。你可以参考 OpenStack 的官方文档进行安装和配置。 以下是一些常用的组件和服务: - Keystone:OpenStack 的身份认证服务,用于管理用户、角色和权限等。 - Glance:OpenStack 的镜像服务,用于管理虚拟机镜像。 - Nova:OpenStack 的计算服务,用于创建和管理虚拟机。 - Neutron:OpenStack 的网络服务,用于管理虚拟网络。 - Cinder:OpenStack 的存储服务,用于管理块存储。 - Swift:OpenStack 的对象存储服务,用于管理对象存储。 9. 验证 OpenStack 在 OpenStack 安装完成后,你需要对其进行验证,确保各个服务都能够正常工作。你可以使用 OpenStack 的 Dashboard 来进行验证,也可以使用命令行工具(如 nova、glance、neutron 等)进行验证。 以上是 OpenStack 部署详细手把手教程的大致步骤,具体的操作方法和步骤因环境而异,需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值