主页 > 创建imtoken钱包流程 > 2018-09-20 以太坊智能合约升级实践2

2018-09-20 以太坊智能合约升级实践2

创建imtoken钱包流程 2023-01-18 19:12:45

作为参考,truffle下可以发布一个可更新的合约MyContract,但是ZeppelinOS包装了一切,实现细节我们无法理解,所以我提取了所有必要的合约代码,进行了适当的修改,然后演示了如何在remix环境下实现智能合约的升级功能,关于合约升级功能的原理,需要参考以下两篇文章:

一、智能合约升级模式介绍——入门

2. 智能合约升级深度剖析——继承存储

如何部署可以通过remix升级的智能合约,需要参考这篇文章 1.拉取代码

混帐克隆

2.打开并导入代码

只需点击左上角的文件夹图标即可导入以太坊交易系统,如下图

以太坊交易系统_以太坊交易今日价格_国外以太坊币交易网站

图 1 导入文件

3.部署UpgradeabilityProxyFactory合约

以太坊交易系统_以太坊交易今日价格_国外以太坊币交易网站

本合约用于发布合约初始版本,生成合约调用的代理接口

打开UpgradeabilityProxyFactory.sol,然后在运行面板,选择Registry,点击deploy

如下所示:

以太坊交易系统_以太坊交易今日价格_国外以太坊币交易网站

图 2 部署 UpgradeabilityProxyFactory

4.部署第一版合约MyContract_V1

这个合约就是我们实际需要用到的业务合约

在remix中打开MyContract.sol文件,选择MyContract_V1,点击deploy,如下图

以太坊交易系统_以太坊交易今日价格_国外以太坊币交易网站

国外以太坊币交易网站_以太坊交易今日价格_以太坊交易系统

图 3 部署 MyContract_V1

5.创建合约代理

通过调用UpgradeabilityProxyFactory合约的createProxy,可以创建运营业务合约的代理地址

直接在发布后MyContract_V1上复制其地址0xbbf289d846208c16edc8474705c748aff07732db,然后打开发布后的UpgradeabilityProxyFactory,调用函数createProxy,参数:"0xca35b7d915458ef540ade6068dfe2f44e8fa733c","0xbbf289d846208c16edc8474705c748aff07732db",其中第一个参数是当前jvm的第一个地址,表示当前admin用户地址,以后只有admin地址可以更新合约,但不能执行合约; 第二个参数是MyContract_V1的合约地址,如下图:

以太坊交易系统_以太坊交易今日价格_国外以太坊币交易网站

图 4 创建合约代理

点击g_proxy,此时我们可以得到代理地址0x755014Da263Fc47d238078Bb47d217F743E5B6a5以太坊交易系统,合约的调用和升级将通过该地址实现

6.通过代理调用第一版合约

如图,打开文件MyContract.sol,选择MyContract_V1,在At address中填写代理地址:0x755014Da263Fc47d238078Bb47d217F743E5B6a5,然后点击At address强制代理到MyContract_V1

以太坊交易今日价格_国外以太坊币交易网站_以太坊交易系统

以太坊交易系统_以太坊交易今日价格_国外以太坊币交易网站

图5 代理强制转换为MyContract_V1

要调用这个新生成的MyContract_V1,必须改变调用者的地址,否则会调用失败,如图,我们先选择另外一个地址,然后调用initialize,参数127,execute; 然后检查x的值是127

以太坊交易系统_以太坊交易今日价格_国外以太坊币交易网站

图6 通过代理调用第一版合约

本来,合约调用是通过合约部署的地址来调用的。 这里通过代理方式调用的好处是无论合约如何升级,代理地址都不会改变,保证了调用接口的一致性

7.部署新版本合约

在remix中打开MyContract.sol文件,调用者账号选择第一个,然后选择MyContract_V2,点击deploy,如下图

以太坊交易系统_以太坊交易今日价格_国外以太坊币交易网站

以太坊交易今日价格_国外以太坊币交易网站_以太坊交易系统

图7 部署新版本合约

它的MyContract_V2的地址是0x08970fed061e7747cd9a38d680a601510cb659fb

8.通过代理更新合约版本

我们需要先强制代理地址为AdminUpgradeabilityProxy,在remix中选择文件AdminUpgradeabilityProxy.sol,选择AdminUpgradeabilityProxy,在At地址中填写代理地址:0x755014Da263Fc47d238078Bb47d217F743E5B6a5,然后点击At地址强制代理为AdminUpgradeability,如下图所示:

以太坊交易系统_以太坊交易今日价格_国外以太坊币交易网站

图 8 将代理转换为 AdminUpgradeabilityProxy

然后调用其函数upgradeTo更新合约,参数为MyContract_V2地址0x08970fed061e7747cd9a38d680a601510cb659fb

9.通过代理调用新版本合约

如图,打开文件MyContract.sol,选择MyContract_V2,在At address中填写代理的地址:0x755014Da263Fc47d238078Bb47d217F743E5B6a5,然后点击At address强制代理到MyContract_V2

以太坊交易今日价格_以太坊交易系统_国外以太坊币交易网站

以太坊交易系统_以太坊交易今日价格_国外以太坊币交易网站

图 9 将代理转换为 MyContract_V2

和MyContract_V1的调用一样,调用者的地址一定要改,否则会调用失败。 如图所示,我们先选择另一个地址,然后查看x的值为127,说明升级合约后数据仍然有效; 然后调用increment,然后查看x的值为128,说明合约升级成功

以太坊交易系统_以太坊交易今日价格_国外以太坊币交易网站

图10 调用合约MyContract_V2

一般来说:

1、我们发布了3个合约,分别是UpgradeabilityProxyFactory、MyContract_V1和MyContract_V2

2、通过UpgradeabilityProxyFactory创建合约代理,获取代理地址0x755014Da263Fc47d238078Bb47d217F743E5B6a5

3、强制将代理地址转换为MyContract_V1和MyContract_V2,用于业务逻辑合约调用

4.强制将代理地址转换为AdminUpgradeabilityProxy来升级合约

5. 上面1、2、4中合约发布转换时的调用者地址属于一开始定义的admin地址,调用者地址一定不能是合约发布时admin的地址在 3 中调用。