程序維護中的一個基本問題是——缺陷修復總會以%的機率引入新的bug。所以整個過程是前進兩步,后退一步。——布魯克斯《人月神話》
1.合約升級的必要性
智能合約本質上是程序,既然是程序,缺陷就不可避免。即便是經過大量測試和審計的智能合約,仍然可能會有漏洞。合約的漏洞如果被攻擊者利用,可能造成用戶資產的損失,導致嚴重的后果。漏洞的修復往往需要通過合約升級來實現。除了漏洞修復,新特性的加入也需要合約升級。因此合約的可升級性非常有必要。本期Rust智能合約養成日記,將為大家介紹Rust合約的升級方式。
2.Solidity合約常見升級方式
以太坊中,智能合約具有不可變性,一旦被部署到鏈上,沒有人可以改變它。
那么如果合約存在漏洞或合約需要添加新功能,該如何修改合約的代碼?解決方案是將新的合約部署到區塊鏈上。
該方法面臨的挑戰是,solidity每次部署合約后,合約都會被分配一個唯一的地址。因此所有用到了該合約的DApps都需要修改合約地址來適配新的合約。此外,舊版本合約中的狀態需要遷移到新版本合約中,狀態較為復雜的合約遷移的工作量很大,容易出錯,而且復制數據的Gas費用高。
美內華達州法官批準Prime Trust的破產管理請求:金色財經報道,根據周二監管機構的一份聲明,美國內華達州地方法院法官批準了一項請愿書,將加密貨幣托管機構Prime Trust置于州監管機構的破產管理之下。監管機構在請愿書中表示,Prime 未能達到要求,并欠客戶數百萬美元。
根據7月14日提交的文件,內華達州第八司法地區法院的法官表示,法院在審查了支持請愿書的要點和權限以及相關證據(包括被告的同意)后,找到了批準請愿書的充分理由。最初的請愿書試圖接管該公司的日常運營,并徹底檢查其所有財務狀況,以確定保護Prime客戶的最佳選擇,即恢復公司并將其交由私人管理或者清算。[2023/7/19 11:03:23]
因此,我們通常采用數據和邏輯分離的架構,將數據保存在一個不處理任何邏輯的合約中,所有的邏輯在另一個合約中實現。通常合約升級修改的是邏輯,使用該架構只需要升級邏輯合約,不需要擔心狀態遷移。
為了解決這個問題,可以使用代理合約,具體架構如下圖所示。
BlockFi最大債權人為Ankura Trust,其次為FTX US和美國證券交易委員會:11月28日消息,據BlockFi破產申請表顯示,Ankura Trust Company, LLC是其最大債權人,擁有價值約7.29億美元的無擔保債權,其次是FTX US和美國證券交易委員會,無擔保債權分別為2.75億美元和3000萬美元。FTX US似乎源于今年早些時候向BlockFi提供的信貸額度,而美國證券交易委員會則是與BlockFi與其達成的多方調查和解金額有關。(The Block)[2022/11/28 21:07:48]
代理合約用來來存儲數據,并且使用delegatecall調用邏輯合約A,這樣合約A讀寫的數據都存儲在代理合約中。如果需要升級邏輯合約,部署新的合約B,然后發一條交易給代理合約,讓代理合約指向新的邏輯合約B即可。
3.NEAR合約升級常用方法
接下來我們將以StatusMessage項目為例,給大家介紹NEAR合約的常用升級方法,如下是StatusMessage的合約代碼
Jack Dorsey資助過的比特幣非營利組織?trust增加一位創始成員:7月21日消息,比特幣非營利組織 ?trust 增加一位創始成員 Vladimir Fomene,Fomene 是一位喀麥隆軟件工程師,擅長 JavaScript 和 Rust 領域,將在 ?trust 主要致力于比特幣開發工具包(BDK)。?trust 最初由 Jack Dorsey 和 Jay-Z 于 2021 年 2 月捐贈 500 枚比特幣資助,旨在通過教育和獎勵比特幣開發人員來去中心化比特幣軟件開發。(CoinDesk)[2022/7/21 2:29:50]
我們先將編譯好的合約部署在測試網上。
transaction如下
接著我們調用set_status方法,向合約中存儲數據
Coinbase全球營銷主管John Russ決定離職:10月15日,Coinbase全球營銷主管John Russ發推表示,已決定從Coinbase離職。John Russ表示,該決定是對此前Coinbase首席執行官Brian Armstrong的“遠離”言論的回應。此前9月30日消息,Brian Armstrong發文稱,希望Coinbase專注于建設業務,最大限度遠離社會激進主義和。該番言論隨后引發公司內容員工及其他領域人員不滿。此后,Coinbase業務和數據副總裁Dan Yoo將離職,且已有5%的Coinbase員工已接受遣散費。[2020/10/16]
transaction如下
接下來我們詳細討論兩種不同的合約升級情況
3.1合約數據結構未被修改
動態 | 澳大利亞初創公司TrustED將在幣安鏈上推出其區塊鏈網絡:據Medium消息,5月19日,澳大利亞區塊鏈初創公司TrustED宣布與幣安達成協議,將在幣安鏈(Binance Chain)推出其區塊鏈網絡。據悉,TrustED致力于通過區塊鏈技術為學術證書提供透明度。[2019/5/19]
例如我們增加一個函數:
編譯后使用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私鑰丟失的風險。
除此之外,開發者在做合約遷移時,還可以考慮以下幾點建議
在遷移函數前加入#,確保執行遷移函數前不加載狀態。
遷移完成后盡量刪除遷移函數,確保遷移函數只被調用一次。
新增的數據結構在遷移時完成初始化。
Tags:USTTRUTRUSTCOINustc幣還有價值嗎trustwallet幣不見了trustwallet什么錢包GOD Beast coin
3月底,BNBChain上的DEX2.0協議DDDX公布了第二輪項目伙伴名單,包括Beefy,Autofarm和dForce在內的12個BNBChain上的知名項目陸續宣布參與DDDX協議的ve.
1900/1/1 0:00:00DAO行業進展雙周報第18卷——1月22日至2月5日 速覽: lDeepDAO.io:在DAO中投票或提議的人數現在超過50萬。lMaker的KYC/AML監管研究引起了對去中心化的擔憂.
1900/1/1 0:00:00*本報告由CabinVC撰寫,與TinTin聯合發布。2022年3月,美聯儲加息靴子落地,符合市場預期,加密市場宏觀情況改善,行情企穩.
1900/1/1 0:00:002022年3月21日WorldMobile發起投票,本次投票在所有Cardano原生Token中,WMT獲得最為廣大用戶喜愛的Token.
1900/1/1 0:00:001.前言 北京時間2022年03月13日,知道創宇區塊鏈安全實驗室監測到BSC上Paraluni項目遭到攻擊,黑客獲利約170萬美金。知道創宇區塊鏈安全實驗室將對本次事件深入跟蹤并進行分析.
1900/1/1 0:00:00近兩年,NFT的熱度持續攀升,還入選了《柯林斯詞典》2021年度熱詞第一名。在明星效應和賺錢效應的刺激下,NFT正以不可阻擋之勢風靡全球.
1900/1/1 0:00:00