Contract-Development
智能合約如何持久化數據和升級智能合約程式碼
我已經完成了關於 Solidity 和區塊鏈本身的課程,還有一些我還不清楚的概念。誰能證實這些假設?:
- 當我們部署一個智能合約時,它的程式碼變得不可變,但是分配了一塊記憶體,即所謂的儲存記憶體。
- 當有人想要呼叫一個合約函式時,一個新的交易會被排入交易池以供某人“執行”(通過將其包含在 POW 中的探勘塊中)。當礦工這樣做時,合約函式被執行,它可以改變合約的狀態(我們之前談到的儲存記憶體)。
除了這兩個問題之外,還有一個關於更新契約的問題讓我感到困惑:
如果我們想更新我們的合約,我們不能更新我們之前部署的合約程式碼,因為它是不可變的。因此,必須部署一個新合約,並為該合約生成一個新地址。但是,我們在之前的契約中擁有的所有數據(儲存)會發生什麼?一切都失去了嗎?無論如何將其遷移到新契約?
對於前兩個問題,這是我所知道的:
- 是的,不是的,當你創建一個新合約時,你將該合約的字節碼發送到乙太坊,這樣每個人都會知道這個合約,這樣你就可以使用 geth 將合約字節碼儲存在其他地方。因此,通過合約創建交易,字節碼始終位於乙太坊上,但您必須將合約字節碼儲存在其他地方,否則您將不得不查找創建合約的第一筆交易。(資源:https ://ethereum.stackexchange.com/a/69651/50595 )
- 這已經回答了你的問題:https ://ethereum.stackexchange.com/a/66463/50595
額外的問題:就像你上面說的契約是不可變的,這意味著一旦它在區塊鏈上,你就不能刪除它,字節碼將永遠保留在那裡。遷移到新合約的唯一方法是告訴所有人遷移到新地址。 所以要格外小心智能合約的安全性。我總是想像我正在編寫一個價值數百萬美元的韌體,而不僅僅是一個簡單的智能合約。
P/S:如果您希望您的契約可升級,您可以按照本教程進行操作:https ://simpleaswater.com/upgradable-smart-contracts/ 。我不太喜歡可升級的智能合約,但你的選擇。