本文是對以太坊中可升級智能合約領域的各類實現策略的總結,目的是彙總迄今爲止的相關資源,以幫助咱們在設計智能合約時,考慮如何對其進行升級和更新。html
目前有兩種主要策略用來實現可升級的智能合約:git
這兩種方法要解決的根本問題是如何更新合同的邏輯,同時仍然保留對合同狀態的訪問。程序員
代理合約使用delegatecall
操做碼將函數調用轉發到可更新的目標合約。 因爲delegatecall保留了函數調用的狀態,所以能夠更新目標合約的邏輯,而且狀態將保留在代理合約中以供更新後的目標合約的邏輯使用。 與delegatecall同樣,msg.sender將保持代理合約的調用者身份。github
因爲最近的拜占庭硬分叉,如今能夠獲取函數調用的返回大小了,所以與Nick Johnson首次提出的方法相比,目前這種方法能夠通用。 在Daonomic的文章中能夠看到一個通用代理合約的例子,你能夠更詳細地瞭解這個機制。算法
這中方法到將智能合約拆分兩個合約:安全
邏輯合約經過setter更新數據,而數據合約只容許邏輯合約調用setter。這容許在保持數據不變的同時更換實現邏輯,從而實現徹底可升級的系統。數據結構
經過引導用戶使用新的邏輯合約(經過諸如ENS的解析器)並更新數據合約的權限來容許新的邏輯合約執行setter,就能夠實現合約的更新。app
查看@Thomas Wiesner的視頻以更好地瞭解這一機制。ide
這種策略的工做原理與上述相似,只是不使用最終指望數據結構(struct,mapping等)來定義合約數據模型,全部數據都被抽象化並存儲在鍵值對中,而後使用一個標準的命名系統以及sha256散列算法用於查找數據值。函數
能夠查閱David Rugendyke的文章以更好地理解這種機制。
建立一個徹底可升級的合約聽起來不錯,但須要一個很大的妥協:保證合約的不可變性。 所以在不少狀況下實現部分可升級的合約多是更合理的選擇。
在此策略中,智能合約的核心功能能夠保留爲不可升級。 其餘可能不太完整或更復雜的組件則採用可升級策略實施。
這方面已經有一些很好的案例:
沒有一個策略是完美的,選擇正確的策略取決於要實施的智能合約。 全部策略都很是複雜,智能合約設計人員應該對他們所選擇的可升級策略很是瞭解,以免安全漏洞。
思路與觀點
代理合約
分離邏輯和數據合約
使用鍵值對數據模型分離邏輯和數據合約
若是你但願立刻開始學習以太坊DApp開發,能夠訪問匯智網提供的在線互動教程:
轉自:http://blog.hubwiz.com/2018/04/27/ethereum-contract-upgrade-strategy/#more