如何利用delegatecall進行以太坊智能合約升級

2021-10-20 21:10:55

以太坊智能合約升級

在以太坊[2]智能合約的开發過程中,對於一些復雜的合約开發,要开發出完美沒有bug的智能合約[3],要求是相當高的。即使編寫出來的智能合約能完美沒有bug,也很難保證以後的需求和應用業務邏輯一成不變。所以,在开發智能合約的同時,就要考慮好以後的合約更新和升級問題。

思路

以太坊智能合約的更新和升級,其中一種思路就是:在智能合約的編寫過程中,要做到數據和應用邏輯的分離。簡單來說,就是把數據和應用邏輯分別放在2個獨立的合約裏(本文稱之為數據合約和業務合約)。我們在升級合約時,保證存放數據的數據合約裏的數據結構不改變,改變的只是存放應用邏輯的業務合約。這樣才能保證原有的業務數據不被破壞和能夠繼續使用。

Solidity[4]有三種合約間的調用方式 call、delegatecall 和 callcode。其中,delegatecall可作為智能合約升級的一個較好的途徑。關於合約間的調用方式 call、delegatecall 和 callcode,詳見我另一篇文章<<圖文並茂詳細介紹Solidity的三種合約間的調用方式 call、delegatecall 和 callcode>>,有興趣的同學們可以看一下。原文鏈接:https://blog.csdn.net/powervip/article/details/104330170

例子

假設我們要計算一個求和公式:numC = numA + numB 我把數據numA、numB、numC作為數據存放在數據合約contract A中,把求和的業務邏輯放在數據合約contract B中。為了演示合約升級,我故意把contract B中的業務邏輯函數calcSum()中的加法運算故意寫成乘法運算,以便後面進行合約升級。代碼不是很復雜,代碼如下:

如何利用delegatecall進行以太坊智能合約升級

圖1 升級前的合約代碼

我們先部署合約A,再部署合約B。通過合約A的setNumA()函數把NumA設為1,通過合約A的setNumB()函數把NumB設為2,再復制合約A的地址 0x692a70D2e424a56D2C6C27aA97D1a86395877b3A。

然後,我們部署合約B,並把合約A的地址粘貼到函數run_sum()的參數欄中,見下圖。運行函數run_sum()(直接點擊函數名即可)。這時候,我們再點擊numC,會看到numC的值為2。顯然,這不是我們想要的求和結果。

如何利用delegatecall進行以太坊智能合約升級

圖2 部署合約B,並把合約A的地址粘貼到函數run_sum()的參數欄中

我們把函數calcSum()的 return a * b; 這句注釋掉,把 return a + b; 這句的注釋去掉,變成下面的代碼:

如何利用delegatecall進行以太坊智能合約升級
圖3 升級後的合約代碼

先刪掉合約B(點擊合約B地址欄右邊的"x"),重新編譯和部署合約B,並把合約A的地址粘貼到函數run_sum()的參數欄中重新運行run_sum()。這時候,我們再點擊numC,會看到numC的值為3。合約B升級成功,由原來的乘法運算升級為加法運算。合約A原來的NumA和NumB的內容完美地保留了下來。

如果你覺得這篇文章寫得還可以,請幫忙點個贊,謝謝!你的鼓勵,我的動力!

本文作者:powervip[1]

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

參考資料

[1]

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

[2]

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

[3]

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

[4]

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

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。

推薦文章

btc日內再次下跌 短线應當如何處理?

盡管以太坊現貨ETF獲批是個好消息,但市場反應卻不如預期。在消息公布後,以太坊價格出現了小幅下跌,...

加密蓮
107 3個月前

7月23日、BTC(合約)ETH(合約)行情分析及操作策略

昨日收益還是不錯的,日內給出的現價空單分別止盈我們目標點位,恭喜跟上的朋友喫肉。時間一晃到月底了,...

倪老師
106 3個月前

幣圈院士:血與淚的教訓!交易者為何總是撞死在同一棵樹上?

幣圈院士談。交易市場中的幾種“死法” 在幣圈市場鱗次櫛比的海洋,風起雲湧,時常讓人感到驚手不及。在...

幣圈院士
111 3個月前

7月23:Mt. Gox 比特幣錢包在市場緊縮的情況下轉移了價值 28.2 億美元的 BTC

7月23:Mt. Gox 比特幣錢包在市場緊縮的情況下轉移了價值 28.2 億美元的 BTC一個引...

168超神
106 3個月前

悅盈:比特幣68000的空完美落地反彈繼續看跌 以太坊破前高看回撤

一個人的自律中,藏着無限的可能性,你自律的程度,決定着你人生的高度。 人生沒有近路可走,但你走的每...

我是周悅盈
88 3個月前

btc完美盈利 晚間波動較大注意

昨日btc空單完美給到,最大化走出一千七百點空間~ btc: 日內开盤下跌繼續測試66000一线,...

加密蓮
95 3個月前