Solidity
可升級的智能合約
如果合約發行者想有辦法升級合約程式碼,讓賬戶數據和其他東西結轉,乙太坊能提供嗎?這也可以在不更改合約地址的情況下完成,還是總是需要部署新合約?
是否存在“附件”機制來為合約添加一些新功能而無需完全重寫?
是的。您可以使用多種方法將 a 升級
Contract1
到Contract2
,使其狀態(數據和余額)保持與以前相同的地址。這是如何運作的? 一種方法是使用帶有
fallback
函式的代理合約,其中每個方法呼叫/trx 都委託給實現合約(其中包含所有邏輯)。委託呼叫類似於正常呼叫,不同之處在於所有程式碼都在呼叫者(代理)的上下文中執行,而不是在被呼叫者(實現)的上下文中執行。正因為如此,執行合約程式碼的轉移將轉移代理的餘額,對合約儲存的任何讀取或寫入都將從代理的儲存讀取或寫入。
在這種方法中,使用者只與代理合約互動,我們可以在保持代理合約不變的情況下更改實現合約。
該
fallback
函式將在任何請求上執行,將請求重定向到實現並返回結果值(使用操作碼)。這是一個基本的解釋,足以讓我們使用可升級的合約。如果您想深入研究代理合約程式碼和不同的代理模式,請查看這些文章。
如何編寫可升級的智能合約?
OpenZeppelin提供了很棒的CLI 工具和JS 庫來處理上述所有復雜的
proxy
合約,將其連結到實現(邏輯)合約並管理您使用 CLI 部署的所有合約,以實現開箱即用的可升級性。您唯一需要做的就是編寫合約,並使用 OpenZeppelin CLI 或庫來部署合約。