比特幣價格 比特幣價格
Ctrl+D 比特幣價格
ads
首頁 > Gate.io > Info

UST:Rust智能合約養成日記(9)_NEAR

Author:

Time:1900/1/1 0:00:00

程序維護中的一個基本問題是——缺陷修復總會以%的機率引入新的bug。所以整個過程是前進兩步,后退一步。——布魯克斯《人月神話》

智能合約本質上是程序,既然是程序,缺陷就不可避免。即便是經過大量測試和審計的智能合約,仍然可能會有漏洞。合約的漏洞如果被攻擊者利用,可能造成用戶資產的損失,導致嚴重的后果。漏洞的修復往往需要通過合約升級來實現。除了漏洞修復,新特性的加入也需要合約升級。因此合約的可升級性非常有必要。本期Rust智能合約養成日記,將為大家介紹Rust合約的升級方式。2.Solidity合約常見升級方式

以太坊中,智能合約具有不可變性,一旦被部署到鏈上,沒有人可以改變它。

那么如果合約存在漏洞或合約需要添加新功能,該如何修改合約的代碼?解決方案是將新的合約部署到區塊鏈上。

慢霧:CoinsPaid、Atomic與Alphapo攻擊者或均為朝鮮黑客組織Lazarus:7月26日消息,慢霧發推稱,CoinsPaid、Atomic與Alphapo攻擊者或均為朝鮮黑客組織Lazarus Group。慢霧表示,TGGMvM開頭地址收到了與Alphapo事件有關TJF7md開頭地址轉入的近1.2億枚TRX,而TGGMvM開頭地址在7月22日時還收到了通過TNMW5i開頭和TJ6k7a開頭地址轉入的來自Coinspaid熱錢包的資金。而TNMW5i開頭地址則曾收到了來自Atomic攻擊者使用地址的資金。[2023/7/26 16:00:16]

該方法面臨的挑戰是,solidity每次部署合約后,合約都會被分配一個唯一的地址。因此所有用到了該合約的DApps都需要修改合約地址來適配新的合約。此外,舊版本合約中的狀態需要遷移到新版本合約中,狀態較為復雜的合約遷移的工作量很大,容易出錯,而且復制數據的Gas費用高。

Trust Wallet:目前舊錢包仍有潛在被攻擊的風險:金色財經報道,近日,Trust Wallet 宣布修復了一個漏洞,該漏洞會影響在去年 11 月 13 日至 11 月 23 日期間使用該項目的瀏覽器擴展程序創建數字錢包的用戶。該修復程序僅適用于 11 月 23 日之后創建的瀏覽器錢包。Trust Wallet 在一篇博客文章中說,為了擺脫這個漏洞,用戶必須將他們的資產從受影響的錢包地址遷移到新的、不受影響的錢包地址。在這種情況下,我們采取了一切可能的措施來通知用戶并幫助他們降低潛在攻擊的風險。[2023/4/24 14:24:00]

因此,我們通常采用數據和邏輯分離的架構,將數據保存在一個不處理任何邏輯的合約中,所有的邏輯在另一個合約中實現。通常合約升級修改的是邏輯,使用該架構只需要升級邏輯合約,不需要擔心狀態遷移。

Gate.io即將開啟TrustBase認購Startup項目:據官方公告,Gate.io將于5月18日12:00 至5月18日18:00開啟Startup項目TrustBase認購通道,6小時內有效下單同等對待。用戶需要達到VIP1和以上級別才能參與認購,VIP等級越高的用戶認購額度越高。用戶下單后到結束認購后2小時內,請務必保證現貨交易賬戶中有不低于認購金額的足夠金額,金額不足將自動排除在有效訂單之外。[2021/5/15 22:05:34]

為了解決這個問題,可以使用代理合約,具體架構如下圖所示。

代理合約用來來存儲數據,并且使用delegatecall調用邏輯合約A,這樣合約A讀寫的數據都存儲在代理合約中。如果需要升級邏輯合約,部署新的合約B,然后發一條交易給代理合約,讓代理合約指向新的邏輯合約B即可。

Miller Opportunity Trust將向灰度GBTC投資超過3億美元:2月7日消息,由Miller Value Funds監管的米勒機會信托(Miller Opportunity Trust)向美國證券交易委員會(SEC)提交文件披露,將通過數字資產管理巨頭灰度將約15%的基金投資于比特幣,由于該公司的總持有量估計在22.5億美元左右,其比特幣配置將超過3億美元。(CryptoPotato)[2021/2/7 19:09:12]

3.NEAR合約升級常用方法

接下來我們將以StatusMessage項目為例,給大家介紹NEAR合約的常用升級方法,如下是StatusMessage的合約代碼

我們先將編譯好的合約部署在測試網上。

transaction如下

接著我們調用set_status方法,向合約中存儲數據

transaction如下

接下來我們詳細討論兩種不同的合約升級情況

3.1合約數據結構未被修改

例如我們增加一個函數:

編譯后使用deploy重新部署:

編譯后使用deploy重新部署:

接著我們調用get_status方法讀取之前寫入的數據

原來合約中的數據能成功讀取:

這是因為NEAR合約可以重復部署,如果一個賬戶已經部署過合約,再次調用neardeploy命令可以將新的合約代碼部署到該賬戶上。如果我們只修改合約邏輯,不涉及數據結構的修改,可以直接使用neardeploy部署新的代碼。

3.2?合約數據結構被修改

我們將該合約升級,修改了原來的數據結構,去除了records,新增了taglines和bios

我們嘗試再次重新部署:

合約還是成功部署了:

但是我們調用get_tagline方法讀取存儲的數據:

會發現出錯了,錯誤提示如下:

Cannotdeserializethecontractstate.

具體的transaction見:

https://explorer.testnet.near.org/transactions/4hQQ1zAwU5bsbfb6tA6DQDqjmFcHsBwaBctdHaPiCKHu

這是因為合約的狀態是以序列化數據的形式進行持久化存儲的,重新部署合約后,代碼中的數據結構變了,狀態沒有變,新的數據結構匹配不上舊狀態,就出錯了。

3.3?Migrate升級智能合約

NEAR提供了Migrate方法去幫助我們對合約進行升級,針對3.2中所出現的錯誤,我們在新的合約中加入migrate方法:

代碼中的#表示在migrate函數執行前不要加載狀態。接著,我們重新部署合約,但是在部署的同時調用migrate方法

如下所示,該合約被成功部署:

我們嘗試調用合約新增的方法get_tagline去獲取新增的數據taglines

可以看到方法被成功調用,舊的合約數據也被遷移到新的合約

4.合約升級的安全考量

合約安全升級首先要考慮權限控制,一般合約只能由開發者或DAO升級。上一期Rust智能合約養成日記合約安全之權限控制介紹了特權函數的訪問控制,一般合約的升級函數為onlyowner函數,確保只能由owner調用。

我們推薦盡可能將合約的owner設置為DAO,通過提案和投票來共同管理合約。因為owner設置為個人賬戶,合約高度中心化,owner可以隨意修改合約數據,還存在owner私鑰丟失的風險。

除此之外,開發者在做合約遷移時,還可以考慮以下幾點建議

在遷移函數前加入#,確保執行遷移函數前不加載狀態。

遷移完成后盡量刪除遷移函數,確保遷移函數只被調用一次。

新增的數據結構在遷移時完成初始化。

Tags:USTTRUSTANEARcrust幣價格tru幣有沒有價值StarbaseUniverseNEAR幣創始團隊

Gate.io
BIT:Bitfinex To Support HUMAN (Polygon)_TOK

BitfinexhasopeneddepositsforHUMANToken(Polygon)from23/03/22at10:00AMUTC.

1900/1/1 0:00:00
DOG:鏈游界王炸巨作 一個足夠炫酷的NFT賽犬游戲震撼問世_RUN

如果說2021年是GameFi和元宇宙爆發的第一年,那么2022年將是Gamefi+Socialfi多彩蓬勃發展的一年。各種Gamefis層出不窮,許多人可以通過玩游戲賺錢.

1900/1/1 0:00:00
BIT:又有兩家交易所跑路:一天暴雷一個,真正的良心交易所何在?_BITW

3月31日,多個社群群友反應,Tbit交易所老板失聯,提幣已無法到賬,又一老交易所宣告跑路。 來源:朋友圈社群截圖 04月01日,CoinW交易所被爆用戶高頻交易被風控,平臺可隨意劃走用戶賬戶資.

1900/1/1 0:00:00
ING:Gate.io’s Current Lending & Single-Asset Vault Volume Reaches 3,207,180 ?USDT?_GAT

Thesingle-currencyminingpoolUSDThasthehighestlendingvolumetoday,reaching3,207.

1900/1/1 0:00:00
區塊鏈:一文讀懂Layer2的數據可用性_ROL

原文作者:ZKCross原文標題:《DataAvailabilityinLayer-2Blockchains》 原文編譯:麟奇.

1900/1/1 0:00:00
KEX:BKEX 關于上線 BFLOKI(Burn Floki) 的公告_BKKG

尊敬的用戶:?????????BKEX即將上線BFLOKI,詳情如下:上線交易對:BFLOKI/USDT??幣種類型:BEP20交易功能開放時間:2022年4月1日22:00充提時間請留意后續公.

1900/1/1 0:00:00
ads