Solidity

可升級的智能合約

  • June 30, 2021

如果合約發行者想有辦法升級合約程式碼,讓賬​​戶數據和其他東西結轉,乙太坊能提供嗎?這也可以在不更改合約地址的情況下完成,還是總是需要部署新合約?

是否存在“附件”機制來為合約添加一些新功能而無需完全重寫?

是的。您可以使用多種方法將 a 升級Contract1Contract2,使其狀態(數據和余額)保持與以前相同的地址。

這是如何運作的? 一種方法是使用帶有fallback函式的代理合約,其中每個方法呼叫/trx 都委託給實現合約(其中包含所有邏輯)。 在此處輸入圖像描述

委託呼叫類似於正常呼叫,不同之處在於所有程式碼都在呼叫者(代理)的上下文中執行,而不是在被呼叫者(實現)的上下文中執行。正因為如此,執行合約程式碼的轉移將轉移代理的餘額,對合約儲存的任何讀取或寫入都將從代理的儲存讀取或寫入。

在這種方法中,使用者只與代理合約互動,我們可以在保持代理合約不變的情況下更改實現合約。

在此處輸入圖像描述

fallback函式將在任何請求上執行,將請求重定向到實現並返回結果值(使用操作碼)。

這是一個基本的解釋,足以讓我們使用可升級的合約。如果您想深入研究代理合約程式碼和不同的代理模式,請查看這些文章。

如何編寫可升級的智能合約?

OpenZeppelin提供了很棒的CLI 工具JS 庫來處理上述所有復雜的proxy合約,將其連結到實現(邏輯)合約並管理您使用 CLI 部署的所有合約,以實現開箱即用的可升級性。

您唯一需要做的就是編寫合約,並使用 OpenZeppelin CLI 或庫來部署合約。

注意:在 您需要如何編寫契約以及如何升級契約方面,您應該注意一些限制。在這篇文章中還有一些解決這些限制的方法。

引用自:https://ethereum.stackexchange.com/questions/2404