比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > Pol幣 > Info

鉆石代理合約最佳安全實踐_Amon

Author:

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

代理合約是智能合約開發者的重要工具。如今,合約系統里已有多種代理模式和對應的使用規則。我們之前已經概述了可升級的代理合約安全最佳實踐。

本文我們將介紹了另一種在開發者社區頗受青睞的代理模式,即鉆石代理模式。

鉆石代理合約,也被稱為“鉆石”,是以太坊智能合約的一種設計模式,由以太坊改進提案(EIP)2535引入。

鉆石模式通過將合約的功能分割成較小的合約(也被形象地稱為“切面”),允許合約擁有無限的功能。鉆石充當代理,將函數調用路由到適當的切面。

鉆石模式的設計可以解決以太坊網絡的最大合約大小限制問題。通過將一個大型合約分解成較小的切面,鉆石模式允許開發人員建立更復雜和功能豐富的智能合約而不受大小限制影響。

與傳統的可升級合約相比,鉆石代理提供了巨大的靈活性。它們允許合約部分升級,增加、替換或刪除選定的部分函數,而不觸及其他部分。

本文提供了EIP-2535的概述,包括與廣泛使用的透明代理模式和UUPS代理模式的比較,以及它對開發者社區的安全考慮。

在EIP-2535的背景下,"鉆石 "是一個代理合約,其功能實現由不同的邏輯合約提供,稱為“切面”。

想像一下,真正的鉆石有不同的側面,叫做切面(facet),那么相應的以太坊鉆石合約也有不同的切面。每一個鉆石借用功能的合約都是不同的側面或切面(facet)。

鉆石標準使用類比的方式擴展了“鉆石切割”的功能 ,用于增加,替換,或刪除切面和功能。

此外,鉆石標準提供了稱為“鉆石放大鏡(Diamond  Loupe)”的功能,返回關于切面的信息和鉆石存在的功能。

與傳統的代理模式相比,“鉆石”等同于代理合約,而不同的“切面”對應于實現合約。一個鉆石代理的不同切面可以共享內部函數、庫和狀態變量。鉆石的關鍵組成部分如下:

DTrader社區入選Bitget第五位鉆石節點:據官方消息,Bitget經過嚴格篩選,今日誕生第五位鉆石節點:DTrader社區。Desirable Trader,簡稱DT社區或燈塔社區,旨在為行業用戶提供交易全方位的咨詢,幫助用戶養成自有交易系統,打造行業良好生態圈。Bitget將為鉆石節點頒布榮譽金幣,目前鉆石席位僅余5個。鉑金節點與黃金節點同步限量招募,平臺將優先開放3個月以上穩定合作伙伴的申請,更多節點申請與詳情前往官網查看。[2020/7/2]

作為代理的中央合約,將函數調用路由到適當的切面。它包含一個函數選擇器到“切面”地址的映射。

實現特定功能的單個合約。每個切面都包含一組可以被鉆石調用的函數。

是在EIP-2535中定義的一組標準函數,提供關于鉆石中使用的切面和函數選擇器的信息。鉆石放大鏡允許開發者和用戶檢查和了解鉆石的結構。

用于添加、替換或刪除鉆石中的切面及其相應的功能選擇器的函數。只有授權的地址(例如,鉆石的所有者或多簽名的合約)才能進行鉆石切割。

與傳統代理類似,當鉆石代理上有一個函數調用時,代理的fallback函數(回退函數)就會被觸發。與鉆石代理的主要區別是,在回退函數中,有一個selectorToFacet映射,存儲并確定哪個邏輯合約地址有被調用的函數的實現。然后,它使用delegatecall來執行該函數,就像傳統的代理一樣。

所有的代理都使用fallback()函數,將函數調用委托給外部地址。下面是鉆石代理的實現和傳統代理的實現。

Everledger將利用區塊鏈技術為鉆石產業提供“碳抵減”服務:區塊鏈公司Everledger正在利用其技術幫助鉆石行業抵減其碳足跡(Carbon Footprint)。該公司已總部分位于印度、美國兩地的Shairu & Atit Diamonds聯合推出了一個新平臺,新的平臺允許鉆石行業的參與者選擇性的購買碳減排項目所釋放的信用額度,這些項目一般通過種樹、減少森林砍伐、提供清潔用水和投資可再生能源來抵消其溫室氣體排放。(CoinDesk)[2020/4/22]

值得注意的是它們的匯編代碼塊非常相似,因此唯一的區別是鉆石代理委托調用中的切面地址和傳統代理委托調用中的impl地址。

而其主要區別在于:在鉆石代理中,切面的地址是由調用者的msg.sig(函數選擇器)到切面的地址的hashmap決定的,而在傳統代理中,impl地址不依賴于調用者的輸入。

鉆石代理fallback 函數

傳統的代理fallback 函數

SelectorToFacet映射決定了哪個合約包含了每個函數選擇器的實現。項目工作人員經常需要添加、替換或刪除這種函數選擇器到實現合約的映射。EIP-2535規定:為了達到此目的,必須有一個 diamondCut() 函數。下面是一個示例接口。

每個FacetCut結構都包含一個切面地址和四字節的功能選擇器數組,以在鉆石代理合約中進行更新。FaceCutAction允許人們添加、替換和刪除功能選擇器。diamondCut()函數的實現應該包括足夠的訪問控制,防止存儲槽的碰撞,在失敗時進行恢復等。

動態 | 區塊鏈直播平臺DLive成為niTROn SUMMIT 2020鉆石贊助商:據官方最新信息,區塊鏈直播平臺DLive成為niTROn SUMMIT 2020鉆石贊助商。由波場TRON官方舉辦的世界區塊鏈行業年度綜合性峰會niTROn SUMMIT 2020將在2020年2月29號至3月1號兩日于韓國首爾舉行。該峰會匯聚全球頂尖開發者、交易所、項目方、礦池、投資方,共同交流區塊鏈未來發展方向。DLive于2018年9月上線,平臺直播內容包括游戲、聊天、音樂、美食以及其他生活體驗類內容。平臺目前專注深挖網游競技直播內容,用戶主要來自美國、英國等英文國家。就在前不久,2019年12月31日,DLive正式加入波場TRON生態,與波場TRON正式達成戰略合作關系。[2020/1/15]

為了查詢一個鉆石代理有哪些功能,使用哪些切面,我們使用了“鉆石放大鏡”。“鉆石放大鏡”是一個特殊的切面,它實現了EIP-2535中定義的以下接口:

facets()函數應該返回所有切面的地址和它們的四字節的函數選擇器。facetFunctionSelectors()函數應該返回一個特定切面所支持的所有函數選擇器。facetAddresses()函數應該返回一個鉆石所使用的所有切面地址。

facetAddress()函數應該返回支持給定選擇器的切面,如果沒有找到,則返回address(0)。請注意,不應該有一個以上的切面地址具有相同的功能選擇器。

鑒于鉆石代理將不同的函數調用委托給不同的實現合約,正確管理存儲槽以防止沖突是至關重要的。EIP-2535提到了幾種存儲槽管理方法。

動態 | SEC對據稱是基于鉆石投資的3000萬美元加密貨幣騙局采取行動:據coindesk報道,美國證券交易委員會(SEC)已采取行動,對據稱是基于鉆石投資的3000萬美元加密貨幣騙局采取行動。委員會指控被告Jose Angel Aman將一項名為Argyle Coin的加密業務作為龐氏騙局,利用新招募人員的投資來回報之前的投資者。美國佛羅里達州南區地方法院法官Robin L. Rosenberg現在批準了SEC對Aman和Argyle Coin以及其他公司發出的臨時限制令和暫時凍結資產的請求。[2019/5/22]

這個切面可以在結構中聲明狀態變量。這個切面可以使用任意數量的結構,每個結構有不同的存儲位置。每個結構在合約存儲中都有一個特定的位置。切面可以聲明他們自己的狀態變量,但不能與其他切面所聲明的狀態變量的存儲位置相沖突。EIP-2535中提供了一個樣本庫和鉆石存儲合約,如下圖所示:

App存儲是鉆石存儲的一個更專精的版本。這種模式被用來更方便、更容易地共享切面的狀態變量。一個App存儲結構被定義為包含一個應用程序所需的任意數量和類型的狀態變量。一個切面總是將AppStorage結構聲明為第一個也是唯一一個狀態變量,位于存儲槽的第0位。然后不同的切面可以從該結構中訪問變量。

此外也有其他的存儲槽管理策略,包括鉆石存儲和AppStorage的混合。比如有些結構在不同的切面之間共享,有些則是特定切面所特有的。在所有情況下,防止意外的存儲槽碰撞是非常重要的。

與透明代理和UUPS代理的比較

目前Web3開發者社區使用的兩種主要代理模式是透明代理模式和UUPS代理模式。在這一節中,我們簡要比較了鉆石代理模式與透明代理和UUPS代理模式。

鉆石行業巨頭與區塊鏈創業公司D1 Mint Limited合作推出鉆石代幣:據cointelegraph消息,兩家鉆石行業巨頭已同意與區塊鏈創業公司D1 Mint Limited合作推出鉆石代幣D1 Coin。D1 Mint Limited已簽署了第一份購買協議,從戴比爾斯集團(De Beers Group)的KGK鉆石公司購買價值2000萬美元的1500種投資級別鉆石,鉆石的原石由全球最大的鉆石礦業公司Alrosa提供。D1使用定價算法來確定加密投資者可以在任何時間以何種價格從其鉆石儲備兌換其選定鉆石,并使用新技術來解釋傳統的行業參數,如形狀,克拉,切割和凈度。[2018/5/25]

1.EPI-2535:https://eips.ethereum.org/EIPS/eip-2535#Facets,%20State%20Variables%20and%20Diamond%20Storage

2.EPI-1967:https://eips.ethereum.org/EIPS/eip-1967    

3.Diamond proxy reference implementation: https://github.com/mudgen/Diamond    

4.OpenZeppelin implementation: https://github.com/OpenZeppelin/openzeppelin-contracts/tree/v4.7.0/contracts/proxy

代理和可升級的解決方案是較復雜的系統,OpenZeppelin為UUPS、透明及Beacon可升級代理提供代碼庫及全面的文檔。然而對于鉆石代理模式,雖然OpenZeppelin肯定了它的好處,但他們仍然決定不把EIP-2535鉆石的實現納入他們的庫中。

因此,使用現有的第三方庫或自行實現該解決方案的開發者在實施時必須格外謹慎。在此我們編寫了一份安全最佳實踐清單,供開發者社區參考。

通過將合約邏輯分解成更小、更容易管理的模塊,開發人員可以更容易地測試和審計他們的代碼。

此外,這種方法允許開發人員專注于構建和維護合約的特定方面,而不是管理一個復雜的、單一的代碼庫。最終的結果是一個更加靈活和模塊化的代碼庫,可以很容易地在不影響合約其他部分的情況下被更新和修改。

資料來源:Aavegotchi Github

當鉆石代理合約被部署時,它必須將DiamondCutFacet合約的地址添加到鉆石代理合約中,并實現diamondCut() 函數。diamondCut()函數用于添加、刪除或替換切面和函數,沒有DiamondCutFacet和diamondCut(),鉆石代理無法正常工作。

資料來源:Mugen’s Diamond-3-Hardhat

在智能合約中向存儲結構添加新的狀態變量時,必須將其添加到結構的末端。在結構的開頭或中間添加新的狀態變量會導致新的狀態變量覆蓋現有的狀態變量數據,而新的狀態變量之后的任何狀態變量都可能會引用錯誤的存儲位置。

 AppStorage模式要求為鉆石代理聲明一個且僅有一個結構,并且該結構為所有切面所共享。如果需要多個結構,應該使用DiamondStorage模式。

 不要將結構直接放在另一個結構中,除非確定不打算向內部結構添加更多狀態變量。如果不覆蓋結構之后所聲明的變量存儲槽,就無法在升級中向內部結構添加新的狀態變量。

解決方法是將新的狀態變量添加到存儲映射結構中,而不是直接將“結構”放置在“結構”中。映射中的變量存儲槽計算方式不同,在存儲中不連續。

數組的大小將受到結構大小的影響。當一個新的狀態變量被添加到一個結構中時,它會改變該結構的大小和布局。

如果該結構被用作數組中的一個元素,這可能會導致問題。如果結構的大小和布局發生變化,那么數組的大小和布局也會發生變化,這可能會導致索引或其他依賴結構大小和布局一致的操作出現問題。

 與其他代理模式類似,每個變量都應該有一個唯一的存儲槽。否則,同一位置的兩個不同結構會相互覆蓋。

initialize()函數通常用于設置重要的變量,如特權角色的地址。如果在合約部署時沒有初始化,惡意行為者可以調用并控制合約。

建議在初始化/設置函數上加入適當的訪問控制,或者確保該函數在合約部署時被調用,不能被再次調用。

如果合約中的任何一個切面能夠調用selfdestruct()函數,它就有可能破壞整個合約,導致資金或數據損失。這在鉆石代理模式中極其危險,因為多個切面可以訪問代理合約的存儲和數據。

目前,我們看到越來越多的項目在他們的智能合約中采用鉆石代理模式。與傳統代理相比,它具有靈活性和其他優勢。

然而,額外的靈活性也可能意味著給攻擊者提供了更廣泛的攻擊面。我們希望這篇文章對開發者社區了解鉆石代理模式的機制及其安全考慮有所幫助。

同時,項目團隊應該進行嚴格的測試和第三方審計,以減少與實施鉆石代理合約有關的漏洞風險。

CertiK中文社區

企業專欄

閱讀更多

金色早8點

Odaily星球日報

金色財經

Block unicorn

DAOrayaki

曼昆區塊鏈法律

Tags:AmonDIAdiamondAMOPolkamonDIAH幣BNB DiamondSamoyedcoin

Pol幣
Bankless:Optimistic Rollup的繁榮與困境_MIS

作者:Jack Inabinet,編譯:Kate, Marsbit在過去的幾年里,以太坊的第二層網絡實現了巨大的增長.

1900/1/1 0:00:00
比特幣生態或是下輪牛市焦點?5大邏輯支撐其迅速崛起_以太坊

作者:木沐,白話區塊鏈 以太坊未來在很多方面包括市值都有可能超過比特幣,但這其實與沒爆發過的比特幣生態的成長速度、和其成為下輪大行情的焦點不沖突.

1900/1/1 0:00:00
BAYC持有者自述:我是如何成為鉆石手的?_BAYC

原文作者:Zeneca 原文編譯:Jaleel,BlockBeats關于 BAYC,作為一個超過兩年的持有者,我有許多想法和觀點:許多人可能并未見證其早期.

1900/1/1 0:00:00
誰在看好 Azuki?八大巨鯨動向分析_MENT

 Azuki Elementals 刷屏并引發社區爭議,導致 Elementals 跌破發行價,Azuki 地板價一度跌破 9 ETH.

1900/1/1 0:00:00
金色Web3.0日報 | Tether在以太坊網絡增發10億枚USDT_USD

DeFi數據 1、DeFi代幣總市值:424.22億美元 DeFi總市值及前十代幣 數據來源:coingecko2、過去24小時去中心化交易所的交易量33.

1900/1/1 0:00:00
Coinbase:平臺上的數字資產不屬于SEC的管轄范圍_COIN

作者:Nikhilesh De,CoinDesk;編譯:松雪,金色財經美國加密貨幣交易所 Coinbase 在針對監管機構訴訟的首次法律回應中聲稱.

1900/1/1 0:00:00
ads