程序維護中的一個基本問題是——缺陷修復總會以%的機率引入新的bug。所以整個過程是前進兩步,后退一步。——布魯克斯《人月神話》
1.合約升級的必要性
智能合約本質上是程序,既然是程序,缺陷就不可避免。即便是經過大量測試和審計的智能合約,仍然可能會有漏洞。合約的漏洞如果被攻擊者利用,可能造成用戶資產的損失,導致嚴重的后果。漏洞的修復往往需要通過合約升級來實現。除了漏洞修復,新特性的加入也需要合約升級。因此合約的可升級性非常有必要。本期Rust智能合約養成日記,將為大家介紹Rust合約的升級方式。
2.Solidity合約常見升級方式
以太坊中,智能合約具有不可變性,一旦被部署到鏈上,沒有人可以改變它。
那么如果合約存在漏洞或合約需要添加新功能,該如何修改合約的代碼?解決方案是將新的合約部署到區塊鏈上。
該方法面臨的挑戰是,solidity每次部署合約后,合約都會被分配一個唯一的地址。因此所有用到了該合約的DApps都需要修改合約地址來適配新的合約。此外,舊版本合約中的狀態需要遷移到新版本合約中,狀態較為復雜的合約遷移的工作量很大,容易出錯,而且復制數據的Gas費用高。
以太坊官方將Lido質押服務狀態更新為“Trustless”:金色財經報道,據Lido Finance官推披露,以太坊官方已將將Lido質押服務狀態更新為“Trustless”,即該服務不需要信任任何人來托管密鑰或分配獎勵,此前該服務狀態一直是“Trusted”。截至目前,Lido質押服務仍需要在獲得許可的情況下才能作為質押池Node Operator加入。[2023/6/18 21:45:38]
因此,我們通常采用數據和邏輯分離的架構,將數據保存在一個不處理任何邏輯的合約中,所有的邏輯在另一個合約中實現。通常合約升級修改的是邏輯,使用該架構只需要升級邏輯合約,不需要擔心狀態遷移。
為了解決這個問題,可以使用代理合約,具體架構如下圖所示。
代理合約用來來存儲數據,并且使用delegatecall調用邏輯合約A,這樣合約A讀寫的數據都存儲在代理合約中。如果需要升級邏輯合約,部署新的合約B,然后發一條交易給代理合約,讓代理合約指向新的邏輯合約B即可。
數字資產托管商Hex Trust獲得迪拜虛擬資產監管局頒發的MVP許可證:11月24日消息,數字資產托管商 Hex Trust于 11 月 24 日從迪拜虛擬資產監管局 ( VARA ) 獲得了最低可行產品 (MVP) 許可證。Hex Trust 現在可以提供的服務范圍包括虛擬資產托管服務、經紀交易商服務和 Staking 服務。
此前幣安也已獲得迪拜虛擬資產監管局 (VARA) 頒發的最小可行產品 (MVP) 許可證。[2022/11/24 8:04:41]
3.NEAR合約升級常用方法
接下來我們將以StatusMessage項目為例,給大家介紹NEAR合約的常用升級方法,如下是StatusMessage的合約代碼
我們先將編譯好的合約部署在測試網上。
Web3人才網絡Braintrust通過代幣私募融資1億美元,Coatue領投:12月9日消息,Web3人才網絡Braintrust通過代幣私募融資1億美元,Coatue領投,Tiger Global、True Ventures、Blockchain Ventures、HashKey等參投。
據悉,Braintrust旨在將公司與Web3領域的技術人員聯系起來,該公司聲稱擁有70多萬名社區成員。根據周四的公告,Braintrust將使用這些資金來擴大其網絡,并通過贈款為社區項目提供資金。該公司表示,其70多萬會員都有資格申請旨在改善網絡的項目資助。(The Block)[2021/12/9 7:28:57]
transaction如下
接著我們調用set_status方法,向合約中存儲數據
日本LasTrust推出新服務,可在區塊鏈上頒發數字畢業證書:日本LasTrust公司推出了一項在區塊鏈上提供數字畢業證書的服務。該服務使用鏈上證書發布平臺CloudCerts對傳統的畢業證書進行數字化,此舉旨在減少在COVID-19疫情期間接受證書時的面對面接觸。(Brave New Coin)[2020/7/21]
transaction如下
接下來我們詳細討論兩種不同的合約升級情況
3.1合約數據結構未被修改
例如我們增加一個函數:
編譯后使用deploy重新部署:
Kingdom Trust希望將其托管的2萬多項資產代幣化:總部位于美國南達科他州的金融托管公司Kingdom Trust管理著超過130億美元的資產,該公司正密切關注代幣化行業。
Kingdom Trust首席執行官Ryan Radloff在接受采訪時透露,該公司希望該公司希望將目前提供托管服務的2萬多項替代資產、加密資產和遺留資產代幣化。作為用戶數量達六位數、支持超過2萬項資產的老牌托管機構,Radloff聲稱,Kingdom Trust具有獨特的優勢,可以利用新興的代幣化行業。“除了比特幣,我們已經托管2萬項其他資產,我們現在還管理130億美元的其他資產。”盡管希望站在代幣化的最前沿,但Radloff表示,Kingdom Trust將等待一個市場領先的代幣化平臺出現,然后再投入其中,并補充稱,該公司將專注于在短期內重點發展其最近推出支持比特幣和遺留資產的退休賬戶。(Cointelegraph)[2020/5/31]
編譯后使用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:USTTRUTRUSTNEARCUSTTRUBGR價格trustwallet安卓版下載near幣未來會漲到多少
作為全球最受歡迎的公鏈之一,波場TRON自創立以來始終保持高速發展,生態建設全面開花,各項數據突飛猛進.
1900/1/1 0:00:00據最新消息,USDD存款挖礦現已上線JustLend,用戶只需在JustLend存入USDD就可獲得JST+USDD存款挖礦獎勵.
1900/1/1 0:00:00滑點也被稱為滑價,是指交易預期價格和交易執行價格之間的差異。例如,交易者小A想以40000USDT的價格買入1BTC,下單后最終成交價為40050USDT.
1900/1/1 0:00:00美國司法部在2022年2月的一份聲明中宣布,在控制了被盜資金的錢包后,它已成功扣押了2016年對加密交易所Bitifinex的黑客攻擊中流失的大部分比特幣.
1900/1/1 0:00:00在ETHDenver的一周里,我們看到了兩個與零知識證明相關的趨勢。開發者社區對zk應用的興趣濃厚.
1900/1/1 0:00:00瑞士盧加諾,2022年3月3日–Tether是支持區塊鏈技術的科技公司,驅動著市值最大的穩定幣(USD?),今天宣布與充滿活力的瑞士城市盧加諾合作.
1900/1/1 0:00:00