程序維護中的一個基本問題是——缺陷修復總會以%的機率引入新的bug。所以整個過程是前進兩步,后退一步。——布魯克斯《人月神話》
1.合約升級的必要性
智能合約本質上是程序,既然是程序,缺陷就不可避免。即便是經過大量測試和審計的智能合約,仍然可能會有漏洞。合約的漏洞如果被攻擊者利用,可能造成用戶資產的損失,導致嚴重的后果。漏洞的修復往往需要通過合約升級來實現。除了漏洞修復,新特性的加入也需要合約升級。因此合約的可升級性非常有必要。本期Rust智能合約養成日記,將為大家介紹Rust合約的升級方式。
2.Solidity合約常見升級方式
以太坊中,智能合約具有不可變性,一旦被部署到鏈上,沒有人可以改變它。
那么如果合約存在漏洞或合約需要添加新功能,該如何修改合約的代碼?解決方案是將新的合約部署到區塊鏈上。
該方法面臨的挑戰是,solidity每次部署合約后,合約都會被分配一個唯一的地址。因此所有用到了該合約的DApps都需要修改合約地址來適配新的合約。此外,舊版本合約中的狀態需要遷移到新版本合約中,狀態較為復雜的合約遷移的工作量很大,容易出錯,而且復制數據的Gas費用高。
SBP與礦企Crusoe Energy進行試點,旨在最大限度減少甲烷排放:4月27日消息,代幣化環保能源初創公司Sustainable Bitcoin Protocol(SBP)與加密貨幣礦企Crusoe Energy一起試點,以改進挖礦對環境影響。SBP表示,通過第三方審計,SBP將驗證Crusoe的廢氣采購和技術是否符合可驗證地減少溫室氣體排放和促進清潔能源轉型的標準,這個過程仍然會排放溫室氣體,但最大限度減避免了甲烷排放。[2023/4/27 14:31:30]
因此,我們通常采用數據和邏輯分離的架構,將數據保存在一個不處理任何邏輯的合約中,所有的邏輯在另一個合約中實現。通常合約升級修改的是邏輯,使用該架構只需要升級邏輯合約,不需要擔心狀態遷移。
為了解決這個問題,可以使用代理合約,具體架構如下圖所示。
代理合約用來來存儲數據,并且使用delegatecall調用邏輯合約A,這樣合約A讀寫的數據都存儲在代理合約中。如果需要升級邏輯合約,部署新的合約B,然后發一條交易給代理合約,讓代理合約指向新的邏輯合約B即可。
Fireblocks與Capital Trust Group合作發行數字債券:金色財經報道,加密托管技術提供商Fireblocks與Capital Trust Group合作,幫助后者稱為新西蘭第一家在公共區塊鏈平臺 Polygon 上以證券代幣形式推出數字債券的投資管理公司。該數字債券名為“Private Jet Residence Securities Token(PJST)”,主要用于支持超豪華私人飛機和高爾夫球場項目,Fireblocks在該項目中主要負責安全鑄造、銷毀、自我托管并將債券分發給投資者,一旦投資者完成購買,債券的所有權將記錄在區塊鏈上。此外,Capital Trust Group還宣布與Power-All Networks Ltd. (PAN)達成合作,旨在將實物資產數字化并為傳統業務帶來創新。(digitaljournal)[2023/2/12 12:02:24]
3.NEAR合約升級常用方法
接下來我們將以StatusMessage項目為例,給大家介紹NEAR合約的常用升級方法,如下是StatusMessage的合約代碼
Russell Coin羅素幣即將上線ZBG:據官方消息,Russell Coin羅素幣,將于2021年3月初上線ZBG交易平臺。
羅素幣(Russell Coin, 簡稱RC)于2017年11月21日創世,總量2100萬個。RC科學的采用了完全去中心化的主節點獎勵計劃,POW挖礦納稅給主節點的激勵機制,結合最新X20R算法,達到電腦挖礦能耗更低,環形加密匿名性更強。更多活動詳情請訪問官網。[2021/2/26 17:55:11]
我們先將編譯好的合約部署在測試網上。
transaction如下
接著我們調用set_status方法,向合約中存儲數據
Crust市場負責人:Crust提供了Web3?態系統的去中?化存儲?絡:在10月17日由Polkaworld主辦的“波卡中國行”深圳站上,Crust市場負責人Steve談到,Crust提供了Web3?態系統的去中?化存儲?絡,?持包括IPFS在內的多種存儲層協議,并對應?層提供接?。Crust的技術棧還能夠?持去中?化計算層。Crust旨在構建?個重視數據隱私和所有權的分散式云?態系統。Crust將于近期開展其有獎勵測試網的招募活動,并預留了不少于30萬代幣的等值獎勵用于第一階測試網的礦工激勵。[2020/10/17]
transaction如下
接下來我們詳細討論兩種不同的合約升級情況
3.1合約數據結構未被修改
例如我們增加一個函數:
安全公司:朝鮮黑客組織Lazarus設計網絡釣魚攻擊計劃,涉及500萬人:互聯網安全研究公司Cyfirma最近的一份報告稱,朝鮮黑客組織Lazarus設計了一個網絡釣魚計劃,涉及美國、英國、新加坡、日本、印度和韓國等國的約500萬個人和企業。Cyfirma預計,這次襲擊將在這個周末進行,為期兩天,不僅會影響到各國公民,還會影響到中小企業甚至大型企業。
注:2019年初,聯合國曾援引Group IB的報告稱,朝鮮黑客組織Lazarus被指控制造了五起加密貨幣竊案,攻擊目標分別為Yapizon(韓國,損失3816 BTC,合530萬美元)、Coinis(韓國,損失不詳)、YouBit(韓國,損失17%資產)、Coincheck(日本,損失5.23億NEM,合5.34億美元)、Bithumb(韓國,損失3200萬美元),五次攻擊獲利總額高達5.71億美元。(Decrypt)[2020/6/20]
編譯后使用deploy重新部署:
編譯后使用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私鑰丟失的風險。
除此之外,開發者在做合約遷移時,還可以考慮以下幾點建議
在遷移函數前加入#,確保執行遷移函數前不加載狀態。
遷移完成后盡量刪除遷移函數,確保遷移函數只被調用一次。
新增的數據結構在遷移時完成初始化。
“我們不是歷史的創造者,我們是歷史造就的。”——小馬丁·路德·金,《愛的力量》協作通過組織發生,每個時代都有自己的形式.
1900/1/1 0:00:00憑借獨到的金融市場眼光,頂峰AscendEX致力在全球范圍內廣泛甄選具有應用價值潛質的優秀區塊鏈項目。精準的市場定位和嚴格的遴選標準,讓頂峰AscendEX穩居全球加密交易平臺投資回報率前列.
1900/1/1 0:00:00*本報告由CabinVC撰寫,與TinTin聯合發布。2022年3月,美聯儲加息靴子落地,符合市場預期,加密市場宏觀情況改善,行情企穩.
1900/1/1 0:00:00“波卡知識圖譜”是我們針對波卡從零到一的入門級文章,我們嘗試從波卡最基礎的部分講起,為大家提供全方位了解波卡的內容,當然這是一項巨大的工程,也充滿了挑戰.
1900/1/1 0:00:00“一樣東西不按照你的計劃行事,并不意味著它就毫無用處。”——托馬斯·愛迪生 互聯網再次發生變化。 在過去的十年中,基于互聯網的服務趨向于集中化.
1900/1/1 0:00:002022年3月14日Cardano生態2022主題云峰會圓滿結束,此次活動由IOHK、WorldMobile、DreamLabs聯合舉辦,以“Cardano生態迎爆發,龍頭生態面對面”為主題.
1900/1/1 0:00:00