如何利用delegatecall進行以太坊智能合約升級
以太坊智能合約升級
在以太坊[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()中的加法運算故意寫成乘法運算,以便後面進行合約升級。代碼不是很復雜,代碼如下:
我們先部署合約A,再部署合約B。通過合約A的setNumA()函數把NumA設為1,通過合約A的setNumB()函數把NumB設為2,再復制合約A的地址 0x692a70D2e424a56D2C6C27aA97D1a86395877b3A。
然後,我們部署合約B,並把合約A的地址粘貼到函數run_sum()的參數欄中,見下圖。運行函數run_sum()(直接點擊函數名即可)。這時候,我們再點擊numC,會看到numC的值為2。顯然,這不是我們想要的求和結果。
我們把函數calcSum()的 return a * b; 這句注釋掉,把 return a + b; 這句的注釋去掉,變成下面的代碼:
先刪掉合約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/
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。
7月23:Mt. Gox 比特幣錢包在市場緊縮的情況下轉移了價值 28.2 億美元的 BTC
7月23:Mt. Gox 比特幣錢包在市場緊縮的情況下轉移了價值 28.2 億美元的 BTC一個引...
悅盈:比特幣68000的空完美落地反彈繼續看跌 以太坊破前高看回撤
一個人的自律中,藏着無限的可能性,你自律的程度,決定着你人生的高度。 人生沒有近路可走,但你走的每...
登鏈社區
文章數量
6粉絲數
0