程序維護中的一個基本問題是——缺陷修復總會以%的機率引入新的bug。所以整個過程是前進兩步,后退一步。——布魯克斯《人月神話》
1.合約升級的必要性
智能合約本質上是程序,既然是程序,缺陷就不可避免。即便是經過大量測試和審計的智能合約,仍然可能會有漏洞。合約的漏洞如果被攻擊者利用,可能造成用戶資產的損失,導致嚴重的后果。漏洞的修復往往需要通過合約升級來實現。除了漏洞修復,新特性的加入也需要合約升級。因此合約的可升級性非常有必要。本期Rust智能合約養成日記,將為大家介紹Rust合約的升級方式。
2.Solidity合約常見升級方式
以太坊中,智能合約具有不可變性,一旦被部署到鏈上,沒有人可以改變它。
那么如果合約存在漏洞或合約需要添加新功能,該如何修改合約的代碼?解決方案是將新的合約部署到區塊鏈上。
該方法面臨的挑戰是,solidity每次部署合約后,合約都會被分配一個唯一的地址。因此所有用到了該合約的DApps都需要修改合約地址來適配新的合約。此外,舊版本合約中的狀態需要遷移到新版本合約中,狀態較為復雜的合約遷移的工作量很大,容易出錯,而且復制數據的Gas費用高。
FTX US已申請NYDFS信托章程,即將成立信托公司FTX Trust:5月12日消息,FTX US已申請美國紐約金融服務部(NYDFS)頒發的信托章程,申請信托章程意味著平臺可以行使受托權,而僅獲得 BitLicensee 許可證則不能擁有這一權限。有限目的信托公司可以在紐約從事貨幣轉移,而無需獲得單獨的紐約貨幣轉移許可證。監管部門批準后,FTX.US 將允許為紐約民眾提供加密服務。
此外,FTX 還表示已任命Marissa MacDonald為 FTX Trust Company, LLC 的首席合規官,該公司是 FTX US 即將成立的紐約州有限目的信托公司。[2022/5/12 3:09:44]
因此,我們通常采用數據和邏輯分離的架構,將數據保存在一個不處理任何邏輯的合約中,所有的邏輯在另一個合約中實現。通常合約升級修改的是邏輯,使用該架構只需要升級邏輯合約,不需要擔心狀態遷移。
為了解決這個問題,可以使用代理合約,具體架構如下圖所示。
INX宣布與日本金融集團GMO Trust合作推出日元及美元穩定幣:9月22日消息,受監管的加密交易平臺INX宣布與日本金融集團GMO旗下的GMO信托公司建立伙伴關系。根據合作協議,INX Limited的子公司INX Digital將為投資者推出受監管的日元穩定幣GYEN,及美元穩定幣ZUSD。(Finance Magnates )[2021/9/22 16:57:49]
代理合約用來來存儲數據,并且使用delegatecall調用邏輯合約A,這樣合約A讀寫的數據都存儲在代理合約中。如果需要升級邏輯合約,部署新的合約B,然后發一條交易給代理合約,讓代理合約指向新的邏輯合約B即可。
3.NEAR合約升級常用方法
接下來我們將以StatusMessage項目為例,給大家介紹NEAR合約的常用升級方法,如下是StatusMessage的合約代碼
我們先將編譯好的合約部署在測試網上。
Hex Trust推出針對NFT的許可托管服務:3月3日消息,數字資產保管商Hex Trust已推出NFT Safe服務來托管NFT。該公司表示,此平臺支持以太坊以及ERC-721和ERC-1155標準的NFT。(CoinDesk)[2021/3/3 18:12:27]
transaction如下
接著我們調用set_status方法,向合約中存儲數據
transaction如下
Crust Network激勵測試網第十階段將進行2項重要測試:1月17日消息,波卡生態中的分布式存儲項目Crust Network官方發文公布其激勵測試網“盈利方舟”(Profit Ark)進展。官方表示,第九階段激勵性測試網運行成功。到第十階段,開發團隊將在測試網上進行2項重要測試:1.將驗證器總數增加至400-500個,以測試鏈的運行成本和性能;2.在Profit Ark結束的前一天,將測試創新的A/B在線升級機制。該機制擴展了Polkadot的鏈上升級機制,允許sWorker模塊隨鏈進行升級。[2021/1/17 16:22:42]
接下來我們詳細討論兩種不同的合約升級情況
3.1合約數據結構未被修改
例如我們增加一個函數:
編譯后使用deploy重新部署:
動態 | Signature Bank和Prime Trust達成合作,結合雙方技術服務機構區塊鏈行業:商業銀行Signature Bank今天宣布與Prime Trust建立合作關系。Prime Trust是一家以技術為驅動的金融機構,旨在為數字經濟提供基礎設施解決方案。Prime Trust的Prime結算網絡(Prime Settlement Network)是多資產交易對手結算平臺之一,它將利用Signature Bank基于區塊鏈的數字支付平臺Signet?,為該銀行和Prime Trust的機構客戶提供實時支付和結算服務。(BusinessWire)[2020/1/6]
編譯后使用deploy重新部署:
接著我們調用get_status方法讀取之前寫入的數據
原來合約中的數據能成功讀取:
這是因為NEAR合約可以重復部署,如果一個賬戶已經部署過合約,再次調用neardeploy命令可以將新的合約代碼部署到該賬戶上。如果我們只修改合約邏輯,不涉及數據結構的修改,可以直接使用neardeploy部署新的代碼。
3.2合約數據結構被修改
我們將該合約升級,修改了原來的數據結構,去除了records,新增了taglines和bios
我們嘗試再次重新部署:
合約還是成功部署了:
但是我們調用get_tagline方法讀取存儲的數據:
會發現出錯了,錯誤提示如下:
Cannotdeserializethecontractstate.
具體的transaction見:
https://explorer.testnet.near.org/transactions/4hQQ1zAwU5bsbfb6tA6DQDqjmFcHsBwaBctdHaPiCKHu
這是因為合約的狀態是以序列化數據的形式進行持久化存儲的,重新部署合約后,代碼中的數據結構變了,狀態沒有變,新的數據結構匹配不上舊狀態,就出錯了。
3.3Migrate升級智能合約
NEAR提供了Migrate方法去幫助我們對合約進行升級,針對3.2中所出現的錯誤,我們在新的合約中加入migrate方法:
代碼中的#表示在migrate函數執行前不要加載狀態。接著,我們重新部署合約,但是在部署的同時調用migrate方法
如下所示,該合約被成功部署:
我們嘗試調用合約新增的方法get_tagline去獲取新增的數據taglines
可以看到方法被成功調用,舊的合約數據也被遷移到新的合約
4.合約升級的安全考量
合約安全升級首先要考慮權限控制,一般合約只能由開發者或DAO升級。上一期Rust智能合約養成日記合約安全之權限控制介紹了特權函數的訪問控制,一般合約的升級函數為onlyowner函數,確保只能由owner調用。
我們推薦盡可能將合約的owner設置為DAO,通過提案和投票來共同管理合約。因為owner設置為個人賬戶,合約高度中心化,owner可以隨意修改合約數據,還存在owner私鑰丟失的風險。
除此之外,開發者在做合約遷移時,還可以考慮以下幾點建議
在遷移函數前加入#,確保執行遷移函數前不加載狀態。
遷移完成后盡量刪除遷移函數,確保遷移函數只被調用一次。
新增的數據結構在遷移時完成初始化。
Tags:USTTRUSTTRUIMETrust Wallettrustwallet官網下載arbitrum幣交易所TIMESERIES價格
PocketNetwork是提供中繼服務的基礎設施中間件協議,它利用分布在全球的27,000多個全節點為37個區塊鏈的Web3應用程序提供RPC中繼服務.
1900/1/1 0:00:00本文來自PythNetwork,由Odaily星球日報譯者Katie辜編譯。 目前,已有八家區塊鏈基礎設施公司增加了對PythNetwork的支持,其中包括新加入的Syndica,還有Evers.
1900/1/1 0:00:00加密資產是證券嗎?對于這個核心問題的答案將對加密行業產生許多影響,從監管和合規到內幕交易執法等方面.
1900/1/1 0:00:00伴隨著DeFi的繁榮,加密數據分析的市場也方興未艾。已實現對一個DeFi項目的初步解析。筆者在使用諸多分析工具后,整理了比較好用的,且市面上推薦度比較高的五類DeFi數據分析工具:看DeFiTo.
1900/1/1 0:00:00“波卡知識圖譜”是我們針對波卡從零到一的入門級文章,我們嘗試從波卡最基礎的部分講起,為大家提供全方位了解波卡的內容,當然這是一項巨大的工程,也充滿了挑戰.
1900/1/1 0:00:00Polkadot生態研究院出品,必屬精品 背景 時間又來到了新年的伊始,過去的2021給我們留下了深刻的印象,新冠疫情依舊在全球范圍內蔓延.
1900/1/1 0:00:00