以太坊智能合約升級策略 - 權威指南
來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。本文是對以太坊中可升級智能合約領域的各種實現策略的總結 ,目的是匯總迄今為止的相關資源,以協助我們在設計智能合約時,考慮如何對其進行升級和更新。## 100%可升級機制目前有兩種主要策略用來實現可升級的智能合約:- 使用代理合約- 將邏輯和資料分離成不同的合約。 這兩種方法要解決的根本問題是如何更新合約的邏輯,同時仍然保留對合約狀態的訪問。## 代理合約代理合約使用`delegatecall`作業碼將函數調用轉寄到可更新的目標合約。 由於delegatecall保留了函數調用的狀態,因此可以更新目標合約的邏輯,並且狀態將保留在代理合約中以供更新後的目標合約的邏輯使用。 與delegatecall一樣,msg.sender將保持代理合約的調用者身份。由於最近的拜占庭硬分叉,現在可以擷取函數調用的返回大小了,因此與[Nick Johnson](https://medium.com/@weka)首次提出的方法相比,目前這種方法可以通用。 在[Daonomic](https://medium.com/@daonomic)的文章中可以看到一個通用代理合約的例子,你可以更詳細地瞭解這個機制。 ## 分離邏輯和資料合約這中方法到將智能合約拆分兩個合約:- 包含資料(變數,結構,映射等)以及getter/setter的資料合約- 包含如何更新這些資料的商務邏輯的邏輯合約邏輯合約通過setter更新資料,而資料合約只允許邏輯合約調用setter。 這允許在保持資料不變的同時更換實現邏輯,從而實現完全可升級的系統。通過引導使用者使用新的邏輯合約(通過諸如ENS的解析器)並更新資料合約的許可權來允許新的邏輯合約執行setter,就可以實現合約的更新。查看[@Thomas Wiesner](https://github.com/tomw1808)的視頻以更好地瞭解這一機制。 ## 使用索引值對資料模型分離邏輯和資料合約這種策略的工作原理與上述類似,只是不使用最終期望資料結構(struct,mapping等)來定義合約資料模型,所有資料都被抽象化並儲存在索引值對中,然後使用一個標準的命名系統以及sha256散列演算法用於尋找資料值。可以查閱[David Rugendyke](https://medium.com/@darcius)的文章以更好地理解這種機制。 ## 部分可升級策略建立一個完全可升級的合約聽起來不錯,但需要一個很大的妥協:保證合約的不可變性。 因此在很多情況下實現部分可升級的合約可能是更合理的選擇。在此策略中,智能合約的核心功能可以保留為不可升級。 其他可能不太完整或更複雜的組件則採用可升級策略實施。這方面已經有一些很好的案例:- 以太坊名稱服務[ENS](https://github.com/ethereum/ens):ENS核心合約是一個非常簡單的合約,不能更改。 網域名稱註冊商則可以由管理員升級。 網域名稱註冊商是一個合約工廠,如果使用一個新的域管理器,它可以與以前的所有 資料狀態重新連結,而不會有太多麻煩。- [0xProject](https://0xproject.com/) :603DEX(去中心化證券交易所)核心智能合約可以完全升級,而代理合約(每個使用者一個)保持不變。 0x“代理”合約(不同於前面介紹的Proxy 原則)包含使用者資金和相關設定。 由於這個原因,它不是0x合約系統的可升級部分。 ## 其他挑戰- 在所有情況下,都需要對是否保持智能合約的不變性進行取捨。- 建立可選的可升級智能合約系統對使用者來說是可能並且有價值的,但是增加了複雜性。- 對Solidity編譯器的更改可能會破壞新舊合約之間的相容性。- 制定可升級策略時需要考慮gas開銷。 ## 結論沒有一個策略是完美的,選擇正確的策略取決於要實施的智能合約。 所有策略都非常複雜,智能合約設計人員應該對他們所選擇的可升級策略非常瞭解,以避免安全性漏洞。- 為了建立一個可升級的智能合約,代理機制似乎是最好的全面策略,因為它允許程式員將可升級機制 與合約設計區分開來,這使得一切變得更容易,並且會產生更少的錯誤,而錯誤是我們需要升級合約的主要原因。- 在最簡單的核心邏輯不變的情況下,採用部分升級策略也是保持使用者信任的好主意。- 首先設計不可升級的智能合約系統,然後制定可升級的策略,這是一種實用且理想的方式。## 參考資源__思路與觀點__- 2018-02-01 Zeppelin Solution : [Zeppelin與智能合約開發的演變](https://epicenter.tv/episode/220/) - 2016-2017: [Stackexchange關於可升級的智能合約的問答](https://ethereum.stackexchange.com/questions/2404/upgradeable-smart-contracts)- ConsenSys : [以太坊智能合約最佳實務](https://consensys.github.io/smart-contract-best-practices/general_philosophy/)- Evoluchain : [Evoluchain](https://consensys.github.io/smart-contract-best-practices/general_philosophy/) __代理合約__- 2018-02-22 Jorge Izquierdo : [ERC DelegateProxy #897](https://github.com/ethereum/EIPs/pull/897)- 2018-02-15 經濟學 : [可升級的以太坊智能合約](https://medium.com/@daonomic/upgradeable-ethereum-smart-contracts-d036cb373d6) , [Github項目](https://github.com/0v1se/contracts-upgradeable)- 2018-01-11 B9lab團隊 : [upgradable - Github項目](https://github.com/b9lab/upgradeable)- 2018-01-10 Manuel Araoz : [olidity-proxy - Github項目](https://github.com/maraoz/solidity-proxy/)- 2017-06-02 @Ownage : [Ether-routher - Github項目](https://github.com/ownage-ltd/ether-router)- 2017-05-24 Nick Johnson : [瘋狂的區塊鏈科學:100%可升級的合約](https://www.reddit.com/r/ethereum/comments/4kt1zp/mad_blockchain_science_a_100_upgradeable_contract/) , [Gist File](https://gist.github.com/Arachnid/4ca9da48d51e23e5cfe0f0e14dd6318f)- 2017-03-15 Jorge Izquierdo : [Solidity代碼部署進階技術](https://blog.aragon.one/advanced-solidity-code-deployment-techniques-dc032665f434)- 2017-03-07 Manuel Araoz : [Solidity中的代理庫](https://blog.zeppelin.solutions/proxy-libraries-in-solidity-79fbe4b970fd)- 2017-02-13 Jorge Izquierdo : [Solidity中庫驅動的開發](https://blog.aragon.one/library-driven-development-in-solidity-2bebcaf88736)- 2017-01-21 Tjaden Hess : [可升級的智能合約](https://ethereum.stackexchange.com/questions/2404/upgradeable-smart-contracts)- 2016-06-16 @Martin Swende : [隱式方法代理技巧 ](http://martin.swende.se/blog/EVM-Assembly-trick.html)__分離邏輯和資料合約__- 2017-12-09 @Thomas Wiesner : [升級鏈上智能合約](https://vomtom.at/upgrade-smart-contracts-on-chain/)- 2017-11-13傑克坦納: [可升級的智能合約](https://docs.google.com/presentation/d/1veuPxAQD88z5holb-6SjWLhyDABuzNeVPZpZvzemJ3A) , [Github項目](https://github.com/AvanceHub/upgradable)- 2017-08-21 Lukas K : [可升級的智能合約](https://medium.com/aigang-network/upgradable-smart-contracts-what-weve-learned-at-aigang-b181d3d4b668)。 我們學習了在區塊鏈上建立保險- 2016-08-16 @nikolai : [Dapp-a-day 6:可升級的通證合約](https://steemit.com/ethereum/@nikolai/dapp-a-day-6-upgradeable-tokens)- @monax : [Solidity 1:solidity五種合約模型](https://monax.io/docs/solidity/solidity_1_the_five_types_model/)- @monax : [Solidity 7:更新Solidity合約](https://monax.io/docs/solidity/solidity_7_updating_solidity_contracts/)- @Z.com-cloud-blockchain : [合約版本升級解決方案](https://guide.blockchain.z.com/en/docs/problem/versionup/solution/)__使用索引值對資料模型分離邏輯和資料合約__- 2018-01-20 Hassan Abdel-Rahman :[Solidity可升級合約](https://medium.com/cardstack/upgradable-contracts-in-solidity-d5af87f0f913)- 2017-11-22 David Rugendyke : [可升級Solidity合約設計](https://medium.com/rocket-pool/upgradable-solidity-contract-design-54789205276d),[Github項目](https://github.com/rocket-pool/rocketpool/blob/master/contracts/RocketUpgrade.sol)- 2017-06-29 Chandan Gupta : [Solidity可升級合約介面設計](https://medium.com/@nrchandan/interfaces-make-your-solidity-contracts-upgradeable-74cd1646a717) , [Github項目](https://github.com/nrchandan/lms)- 2016-06-08 Elena Dimitrova : [在Solidity中編寫可升級合約](https://blog.colony.io/writing-upgradeable-contracts-in-solidity-6743f0eecc88) [原文連結](https://blog.indorse.io/ethereum-upgradeable-smart-contract-strategies-456350d0557c)> 如果你希望馬上開始學習以太坊DApp開發,可以訪問匯智網提供的出色的線上互動教程:>>- [以太坊DApp實戰開發入門](http://xc.hubwiz.com/course/5a952991adb3847553d205d1?affid=go7878)>- [去中心化電商DApp實戰開發](http://xc.hubwiz.com/course/5abbb7acc02e6b6a59171dd6?affid=go7878)589 次點擊 ∙ 1 贊