Solidity

在編寫智能合約時儲存數據/資訊的最佳方式是什麼?

  • July 28, 2020

智能合約是不可變的。除非我們 100% 確定我們的智能合約毫無例外地功能齊全,否則我們永遠不想將其推送到主網中。這就是我們有公共測試網的原因。

我正在編寫一個將資訊儲存在數組中的智能合約。在我將合約部署到主網並開始在區塊鏈中使用和保存資訊後,我擔心一些事情。隨著時間的推移,我的要求可能會改變(這是假設的),我必須更新我的契約,然後在主網中重新部署。既然我開始使用新部署的地址,我該如何檢索保存在主網舊合約地址中的資訊?

有沒有辦法將保存的資訊從舊契約地址連結到新地址?

克服這種情況的最佳方法是什麼?

你至少有幾個選擇。

可升級的合約和代理模式

是的,合約是不可變的,但合約可以以各種方式引用其他合約。所以你可以做的是使用一種稱為可升級合約的模式。通常這意味著您有一個儲存狀態(實際數據)並且不會更改且無法升級的合約。但是你還有另一個實現實際邏輯的合約。儲存合約只是指向邏輯合約,並且可以更改指針。

這裡有更多資訊:https ://medium.com/cardstack/upgradable-contracts-in-solidity-d5af87f0f913和實際實現:https ://docs.openzeppelin.com/upgrades/2.6/

這個方案也有變化,各種代理模式等等。

手動複製合約數據

如果您的原始契約有問題,您可以簡單地更改它並將數據複製到新契約。最直接的方法是將這種支持添加到新合約中,並簡單地從舊合約中讀取數據,並在部署時使用自定義腳本插入新合約。如果有大量數據(由於 gas 成本)或儲存的數據很複雜,這可能不是一個可行的解決方案。

新合約從舊合約中讀取數據

另一種選擇是新合約直接使用舊合約的數據。因此,每當有人從新合約中請求數據時,新合約都會從舊合約中檢索數據,同樣用於儲存數據。

這不是一個很好的方法,因為它使邏輯複雜且容易出錯。

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