区块见闻 区块见闻
Ctrl+D收藏区块见闻
首页 > MATIC > 正文

ALL:如何利用 delegatecall 进行以太坊智能合约升级_CaliCoin

作者:

时间:

本文作者:powervip

以太坊智能合约升级

在以太坊智能合约的开发过程中,对于一些复杂的合约开发,要开发出完美没有bug的智能合约,要求是相当高的。即使编写出来的智能合约能完美没有bug,也很难保证以后的需求和应用业务逻辑一成不变。所以,在开发智能合约的同时,就要考虑好以后的合约更新和升级问题。

思路

以太坊智能合约的更新和升级,其中一种思路就是:在智能合约的编写过程中,要做到数据和应用逻辑的分离。简单来说,就是把数据和应用逻辑分别放在2个独立的合约里(本文称之为数据合约和业务合约)。我们在升级合约时,保证存放数据的数据合约里的数据结构不改变,改变的只是存放应用逻辑的业务合约。这样才能保证原有的业务数据不被破坏和能够继续使用。

Solidity有三种合约间的调用方式call、delegatecall和callcode。其中,delegatecall可作为智能合约升级的一个较好的途径。关于合约间的调用方式call、delegatecall和callcode,详见我另一篇文章<<图文并茂详细介绍Solidity的三种合约间的调用方式call、delegatecall和callcode>>,有兴趣的同学们可以看一下。原文链接:https://blog.csdn.net/powervip/article/details/104330170

例子

假设我们要计算一个求和公式:numC=numAnumB我把数据numA、numB、numC作为数据存放在数据合约contractA中,把求和的业务逻辑放在数据合约contractB中。为了演示合约升级,我故意把contractB中的业务逻辑函数calcSum()中的加法运算故意写成乘法运算,以便后面进行合约升级。代码不是很复杂,代码如下:

图1升级前的合约代码

我们先部署合约A,再部署合约B。通过合约A的setNumA()函数把NumA设为1,通过合约A的setNumB()函数把NumB设为2,再复制合约A的地址0x692a70D2e424a56D2C6C27aA97D1a86395877b3A。

然后,我们部署合约B,并把合约A的地址粘贴到函数run_sum()的参数栏中,见下图。运行函数run_sum()。这时候,我们再点击numC,会看到numC的值为2。显然,这不是我们想要的求和结果。

图2部署合约B,并把合约A的地址粘贴到函数run_sum()的参数栏中

我们把函数calcSum()的returna*b;这句注释掉,把returnab;这句的注释去掉,变成下面的代码:

国际货币基金组织主席:最终幸存下来的加密资产可能会对人们如何储蓄产生重大影响:据bitcoinist消息,国际货币基金组织(IMF)主席拉加德(Christine Lagarde)在其新的博客文章中表示,最终幸存下来的加密资产可能会对我们如何储蓄,投资和支付账单产生重大影响。拉加德指出了加密货币能够进行快速和廉价的跨境金融交易的好处,并称比特币的基础技术——分布式账本技术可能会改变金融市场的运作方式。此外,拉加德指出,智能合约的革命性,可以移除中间商,而区块链技术能够安全地存储重要文件。最后,拉加德指出,在发展中的经济体,这种进步可以帮助确保产权,增加市场信心并促进投资。[2018/4/18]

图3升级后的合约代码

环球银行金融电信协会与七家中央证券存管机构签署一项协议备忘录,以研究区块链如何用于交易后流程:环球银行金融电信协会(SWIFT)与七家中央证券存管机构签署了一项协议备忘录,以研究区块链如何用于交易后流程,如代理投票等。这七家机构分别是美国纳斯达克 Nasdaq Market Technology、俄罗斯国家结算存管公司(National Settlement Depository)、瑞士SIX Securities Services,南非Strate,阿布扎比证券交易所,阿根廷的Caja de Valores和智利的Depores de Central Valores。[2018/1/16]

先删掉合约B,重新编译和部署合约B,并把合约A的地址粘贴到函数run_sum()的参数栏中重新运行run_sum()。这时候,我们再点击numC,会看到numC的值为3。合约B升级成功,由原来的乘法运算升级为加法运算。合约A原来的NumA和NumB的内容完美地保留了下来。

如果你觉得这篇文章写得还可以,请帮忙点个赞,谢谢!你的鼓励,我的动力!

我的github:https://github.com/powervip

参考资料

powervip:https://learnblockchain.cn/people/5018

以太坊:https://learnblockchain.cn/article/1201

智能合约:https://learnblockchain.cn/article/1258

Solidity:https://learnblockchain.cn/docs/solidity/

免责声明:作为区块链信息平台,本站所发布文章仅代表作者个人观点,与链闻ChainNews立场无关。文章内的信息、意见等均仅供参考,并非作为或被视为实际投资建议。

本文来源于非小号媒体平台:

登链社区

现已在非小号资讯平台发布105篇作品,

非小号开放平台欢迎币圈作者入驻

入驻指南:

/apply_guide/

本文网址:

/news/10423871.html

免责声明:

1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险

2.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场

上一篇:

每周编辑精选WeeklyEditors&#039;Picks

标签:NUMCALALLSUMNUME币CaliCoinWALLY币Sumokoin

MATIC热门资讯
MIN:Kalamint (KALAM)_ALA

一、项目介绍 Kalamint是CleanNFT领域的先驱者,也是LPoS区块链Tezos上的首批市场.

ONT:DAOrayaki|Forefront:塑造社区的贡献区_CRONA币

DAOrayakiDAO研究奖金池:资助地址:?0xCd7da526f5C943126fa9E6f63b7774fA89E88d71投票进展:DAOCommittee4/7通过 赏金总量:60U.

ETF:这四个问题将导致SEC永远不会批准「现货BTC ETF」?_比特币

来自|TheBlock,编译|PANews在经历了大约六年左右漫长等待之后,美国第一个比特币交易所交易基金(ETF)将在本周二推出.

FEX:AOFEX關於【“ 玩賺NFT&GameFi,交易領1,000USDT福利金" 】活動獎勵已發放的公告_UMA

尊敬的用戶: 活動獎勵已發放,獲得獎勵的用戶在用戶中心?-?賬戶資產?查詢發放記錄。再次恭喜所有獲獎用戶!活動詳情:AOFEX關於開啟“玩賺NFT&GameFi,交易領1,000USDT.

WWW:XT关于恢复MINA充提的公告_WWW价格

尊敬的XT用户: MINA钱包升级已完成,XT现已恢复MINA充值与提币业务,暂停期间给您带来的不便,敬请谅解.

HTT:AOFEX關於暫停BSC鏈網絡幣種充提業務的公告_WWW

尊敬的用戶: 由於BSC鏈節點臨時維護,AOFEX現已暫停BSC鏈網絡幣種充值和提現業務。待節點維護完成且網絡穩定後,AOFEX將第一時間恢複,具體時間將以公告形式另行通知.