区块链是不可篡改的,那智能合约可以升级吗?

Bitget下载

注册下载Bitget下载,邀请好友,即有机会赢取 3,000 USDT

APP下载   官网注册

bitget消息:我们对区块链的第一印象是不可篡改的,而合约一旦部署了确实无法修改。这与传统的开发区别很大,万一上线后还要修改功能怎么办?

在这里,可以为大家提供一个合约升级的设计思路,这里面有一个技术基础是要求合约之间互相能够调用。

我们知道,一个合约部署后地址是固定 的,如果再部署一次,地址就变了。所谓的合 约升级是为了让用户无感知,也就是对外公布 的合约地址是不能变的。

因此,合约升级其实是一个“伪升级”,但某些时候这些“伪升级”也有必要。将合约拆分为代理合约、逻辑合约、存储合约 三部分。

我们再来介绍一下这个图形中各个合约所起的作用。

1) 代理合约(proxy contract):负责对外提供调用,调用内部的逻辑处理合约。2) 逻辑合约(logic contract):负责完成数据处理的工作。3) 存储合约(storage contract):负责存储实际要存储的数据。

在这里,为大家提供一个简易版合约升级的例子,用一个代理合约和一个数据合约来完成简单的合约升级。数据合约 data_demo 如下:

再实现一个 call_demo 合约来调用它。

因为两个合约都需要用到 Bank 结构体,所以部署在一个文件中(示例使用 15-data.sol)比较 方便。下面说说调用的事情,模拟场景是假设认为 datademo 部署一次相当于部署了一个银行, calldemo 通过更换银行地址来实现在不同的银行之间切换。

部署及测试步骤如下。 步骤 01:选择 datademo 合约。因为一个代码文件中存在两个合约,所以需要在【合约列表】下拉框中选择【datademo -browser/15-data.sol】合约。

步骤 02:部署一个“小叶银行”,在【name】输入框中输入“小叶银行”,然后在 【amount】输入框中输入“10000”,表示货币发行量 10000。

合约部署后,可以单击下方箭头所示按钮获得合约地址,笔者的合约地址为:0x08970FEd061E7747C-D9a38d680A601510CB659FB。

步骤 03:部署 calldemo 合约。 将前一步复制的地址,填入【Deploy】输入框,部署 calldemo 合约,然后单击【getData】按钮可以获得“小叶银行”的数据。

步骤 04:重复上述步骤,再部署一个“叶开银行”,货币发行量 90000。

同理,获得另一个 data_demo 合约的地址为:0xdC04977a2078C8FFDf086D618d1f961B6C546222

步骤 05:切换银行地址后,再查看数据。将新银行的地址粘贴到【upgrade】输入框内,单击【upgrade】按钮,之后再单击【getData】按钮就可以看到银行信息切换了。

通过这个例子,我们可以看到 upgrade 针对不同的数据合约会做切换,对用户来说调用的入口 始终是 call_demo。