以太幣交易所 以太幣交易所
Ctrl+D 以太幣交易所
ads
首頁 > SAND > Info

打破區塊鏈的不可篡改性:代理模式如何實現智能合約升級?_Beacon

Author:

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

代理模式使智能合約能夠升級其邏輯,同時維持其鏈上地址和狀態值。對代理合約的調用會通過delegateCall的方式執行來自邏輯合約的代碼,以修改代理合約的狀態。

本文將為大家概述代理合約的類型、相關的安全事件和建議,以及使用代理合約的最佳實踐。

可升級的合約和代理模式簡介

我們都知道區塊鏈的「不可篡改」特質,智能合約代碼在部署于區塊鏈上后就無法被修改。

因此當開發者想為邏輯升級、修復錯誤或因安全更新試圖更新合約代碼時,他們必須部署一個新的合約,并會生成一個新的合約地址。

想要解決這個問題,就可以用代理模式。

代理模式實現了合約的可升級性,并且不會改變合約的部署地址,這也是目前最普遍的合約升級模式。

代理模式是一個可升級的合約系統,包括代理合約和邏輯實現合約。

代理合約處理用戶交互和數據及合約狀態存儲。用戶對代理合約的調用會通過delegatecall()執行來自邏輯合約的代碼,從而改變代理合約的狀態。升級則是通過更新在代理合約預定存儲槽里記錄的邏輯合約地址來實現。

較為常規的三種代理模式分別是透明代理、UUPS代理和Beacon代理。

透明代理

在透明代理模式中,升級功能是在代理合約中實現的。代理合約的管理員角色被賦予了操作代理合約的直接權限,以更新代理對應的邏輯實現地址。沒有管理員權限的調用者則會把他們的調用委托給實現合約。

注意:代理合約管理員不能是邏輯實現合約的關鍵角色,甚至也不能是普通用戶,因為代理管理員無法與實現合約進行交互。

Alpha Quark CEO: 打破行業壁壘 Alpha Quark 讓人人都可參與知識版權價值投資:3月1日晚,由Gate.io主辦的直播專訪節目《酒局幣赴》邀請到Alpha Quark 首席執行官Terry Kim直播分享近期最新發展。

Terry Kim表示,Alpha Quark (AQT) 是一個供用戶購買或出售代幣化知識產權資產的市場。當前知識產權是最具有價值的資產之一,但由于傳統的資本市場門檻高,參與渠道少,對于普遍的個人投資者或是機構來講,都難以參與其中,而Alpha Quark致力于解決這一市場的限制。Alpha Quark借助于區塊鏈技術,通過打造Wiprex平臺,以數字貨幣的形式,打破行業壁壘,使得更多人也能參與其中并擁有、使用知識產權或通過此舉達到增值的目的。Terry Kim還透露Alpha Quark與眾多海內外流媒體建立了合作關系。目前,Wiprex持有超過200+的韓國頂流音樂版權,包括Bigbang,G-Dragon,BlackPink,Zion.T等韓國頂流明星的歌曲版權。[2021/3/1 18:04:45]

UUPS代理

在UUPS(UniversalUpgradeableProxyStandard)模式中,合約升級功能是在邏輯合約中實現的。由于升級機制存儲在邏輯合約中,升級過后的版本可以刪除升級相關的邏輯,以禁止未來的升級。在這種模式下,所有對代理合約的調用都會被轉發給邏輯實現合約。

高盛前高管:黃金與比特幣的相關性正被打破:金色財經報道,高盛前對沖基金經理、Real Vision創始人兼首席執行官Raoul Pal發推文稱,正如MicroStrategy創始人Michael Saylor此前預期的那樣,黃金與比特幣的相關性正在被打破。大家注意,預計接下來比特幣與美元以及與股票之間的相關性也將被打破。[2020/10/23]

Beacon代理

Beacon代理模式允許多個代理合約通過引用Beacon合約來共享同一個邏輯實現。Beacon合約為調用的代理合約提供邏輯實現合約的地址,當升級到一個新的邏輯實現地址時,只需要更新Beacon合約里記錄的地址即可。

代理誤用和安全事件

開發人員可以利用代理模式合約來實現可升級的合約系統。然而,代理模式也有一定的操作門檻,如果使用不當,可能會給項目帶來堪稱毀滅性的安全問題。以下部分展示了與代理誤用相關的事件,以及代理帶來的中心化風險。

代理管理的密鑰泄露

代理管理員控制著透明代理模式的升級機制,如果管理員的私鑰被泄露,攻擊者可以升級邏輯合約并在代理狀態上執行他們自己的惡意邏輯。

2021年3月5日,PAIDNetwork遭受了由于私鑰管理不善而引起的“鑄幣”攻擊。PAIDNetwork被攻擊者利用,攻擊者竊取了代理管理員的私鑰并觸發了升級機制以更改邏輯合約。

升級后,攻擊者可以銷毀用戶的PAID,并為自己鑄造了一批PAID,隨后再將其出售。代碼本身并不存在安全漏洞,而是攻擊者從管理員那里獲取了升級合約的私鑰。

梓岑:真正的瘋狂要在減半之后 供求平衡被打破后到來:針對本次減半行情,HelloEOS創始人梓岑對金色財經表示:對減半行情高度懷疑很正常,對大多數人而言,看不到,看不懂,看不起,來不及,這個認知路徑在減半這件事上同樣適用。減半行情同樣貌似“反常理”,很多人都需要真正經歷過才能體會減半的威力。

而2020年的這次減半,更有里程碑式的意義,比特幣的實際通脹將降低至1.8%左右,史上首次低于美元的增發比例。減半之前,實際上只是二級市場追“預期”而已,增量供給并沒有變化。真正的瘋狂要在減半之后,供求平衡真正被打破之后才會到來。[2020/3/3]

未初始化的UUPS代理實現

對于UUPS代理模式,在代理合約的初始化過程中,初始參數由調用者傳給代理合約,再由代理合約調用邏輯合約里的initialize()函數實現初始化。

initialize()函數通常被“initializer”修飾符保護,以限制該函數只能被調用一次。在調用initialize()函數后,從代理合約的角度看,邏輯合約被初始化了。

然而,從邏輯合約的角度來看,邏輯合約并沒有被初始化,因為initialize()并沒有在邏輯合約中被直接調用。鑒于邏輯合約本身未被初始化,任何人都可以調用initialize()函數來初始化它,將狀態變量設置為一個惡意的值,并有可能接管邏輯合約。

邏輯合約被接管的影響取決于系統中的合約代碼。在最壞的情況下,攻擊者可以將UUPS代理模式中的邏輯合約升級為惡意合約,并執行“自毀”函數調用,這可能導致整個代理合約變得毫無用處,合約中的資產將永久丟失。

案例

①ParityMultisigFreeze:未初始化邏輯合約。攻擊者觸發了許多錢包的初始化,并通過調用selfdestruct()將以太幣鎖定在合約中。

動態 | Zcash社區決定打破210萬ZEC獎勵規定 將繼續資助ZEC的開發:根據Zcash基金會近日宣布最新的投票結果,Zcash社區已經同意新的挖礦獎勵分配方法,將繼續資助其隱私加密資產ZEC的開發。此前根據Zcash原有計劃,礦工會拿出部分出塊獎勵捐贈給開發者,以支持他們繼續對ZEC進行開發,而支持資金的上限為210萬ZEC。原本該資助計劃應已達到規定上限,但社區發起最新投票,考慮是否繼續這一資助計劃。根據投票結果顯示,該資助計劃將會繼續,Zcash的挖礦獎勵中20%給基金會,礦工獲得剩余的80%。而Zcash的開發公司ECC獲得基金會中7%的挖礦獎勵,基金會實際拿5%,其余8%挖礦獎勵用于捐贈給開發人員。

此前,關于是否繼續資助ZEC的開發一事社區進行了長達數月的討論,對于ECC和Zcash基金會來說,繼續開發Zcash并且為其提供開發資金可以幫助他們雇傭更多頂級人才,尤其是在它面臨國際監管機構越來越多的審查的時候。然而,對于其他人來說,投票意味著違背了在ZEC推出時的承諾,在最開始的時候,創始人的獎勵規定會被限制在210萬ZEC(總供應量的10%)。為了遵守這個要求,在2019年7月創始團隊成員還分叉了Zcash,創造了Ycash。(CoinDesk)[2020/2/2]

②HarvestFinance、Teller、KeeperDAO和Rivermen都使用了未初始化的邏輯合約,這將允許攻擊者任意設置合約的初始化參數,并在delegatecall()期間執行selfdestruct()將代理合約銷毀。

存儲沖突

在一個可升級的合約系統中,代理合約不會聲明狀態變量,而是使用偽隨機存儲槽來存儲重要數據。

代理合約將邏輯合約狀態變量的值保存在它們被聲明的相對位置。如果代理合約聲明了它自己的狀態變量,這時代理和邏輯合約都試圖使用同一個存儲槽,就會發生存儲沖突。

聲音 | 德勤陳嘉升:推動數字貨幣的跨境交易有助于打破國家間的壁壘:金色財經報道,在世界數字貨幣論壇啟動全球發布會上,德勤合伙人陳嘉升表示,數字貨幣將成為世界上的新趨勢之一,最熱門的趨勢是自由貿易、經濟自由和全球化。必須推動數字貨幣的跨境交易,這有助于打破國家間的壁壘,還有助于促進所有結算和交易。對于審計和會計制度未來變化所需要做的準備工作,這是一個具有挑戰性的世界性問題。

數字貨幣是一個新事物,對國家而言最具挑戰性的是法律制度、法規,尤其是審計和會計,例如稅收(許多國家沒有針對數字貨幣的特定稅收法規和規章,有時需要圍繞此領域建立法規)。關于審計和會計標準,由于數字貨幣是無形的,因此對審計公司對帳單中的金額具有挑戰性。展望未來,該領域的審計師將為世界范圍內的所有此類或數字貨幣的審計師提供更具體的指導。[2019/12/26]

OpenZeppelin庫提供的代理合約不會在合約中聲明狀態變量,而是基于EIP1967標準,將需要存儲的數值保存到特定的存儲槽中,以防止沖突。

案例

北京時間2022年7月23日,去中心化音樂平臺Audius遭到黑客攻擊,該事件是由于在代理合約中引入新的邏輯,從而產生存儲沖突所導致的。

代理合約聲明了一個proxyAdmin地址狀態變量,在執行邏輯合約代碼時,其值會被錯誤地讀取。

項目方私自定義的proxyAdmin的值被錯誤的當成了initialized和initializing的值,使得initializer修飾符返回了錯誤的結果,進而允許攻擊者再次調用initialize()函數并將管理合約的權限授予自己。攻擊者隨后更改了投票參數并通過了他們的惡意提案,以竊取Audius資產。

在邏輯合約里調用delegatecall()或不信任的合約

假設delegatecall()存在于一個邏輯合約中,而合約沒有正確驗證調用目標。在這種情況下,攻擊者可以利用該函數來執行對其控制的惡意合約的調用,以破壞邏輯實現或執行自定義邏輯。

同樣地,邏輯合約中若有一個不受限制的address.call()函數,一旦攻擊者惡意提供地址和數據字段,就可以利用其充當代理合約。

案例

PickleFinance、Furucombo以及dYdX攻擊事件。

在這幾起事件中,存在漏洞的合約獲得了用戶token的批準,并且合約內存在一個由用戶提供調用合約地址和數據的call()/delegatecall(),攻擊者將能夠調用具有transferFrom()功能的合約,以提取用戶余額。在dYdX事件中,dYdX執行了他們自己的白帽攻擊以保護資金。

最佳實踐

一般情況

僅在必要的時候才使用代理模式

不是每個合約都需要升級。如上文所示,使用代理模式涉及很多風險。“可升級”的屬性也會引起信任問題,因為代理管理員可以在沒有得到社區同意的情況下升級合約。我們建議僅在必要時才將代理模式整合到項目中。

不要修改代理庫

代理合約庫很復雜,尤其是處理存儲管理和升級機制的部分。修改中的任何錯誤都會影響代理和邏輯合約的工作。我們在審計過程中發現的大量與代理有關的高嚴重性bug都是由不正確的代理庫修改造成的。Audius事件就是一個典型的例子,展示了代理合約修改不當所帶來的后果。

代理合約操作管理要點

初始化邏輯合約

攻擊者可以接管一個未初始化的邏輯合約,并有可能借此破壞代理合約系統。因此請在部署后初始化邏輯合約,或者在邏輯合約的構造函數中使用_disableInitializers()來自動禁用初始化。

確保代理管理賬戶的安全

一個可升級的合約系統通常需要一個“代理管理員”的特權角色來管理合約的升級。如果管理密鑰泄露,攻擊者可以自由地將合約升級為惡意合約,就可以竊取用戶的資產。我們建議謹慎管理代理管理賬戶的私鑰,以避免任何被黑客攻擊的潛在風險。可以使用多簽名錢包來防止單點的密鑰管理失敗。

為透明代理管理使用單獨的賬戶

代理管理和邏輯治理應該是獨立的地址,以防止丟失與邏輯實現的交互。如果代理管理和邏輯治理引用同一個地址,就不會轉發任何調用來執行特權功能,從而禁止治理功能的更改。

代理合約存儲相關

在代理合約中聲明狀態變量時要小心謹慎

正如Audius黑客事件中所解釋的那樣,代理合約在聲明自己的狀態變量時必須謹慎。在代理合約中以正常方式聲明的狀態變量會在讀寫數據時造成數據沖突。如果代理合約需要一個狀態變量,請將該值保存在一個類似EIP1967的存儲槽中,以防止在執行邏輯合約代碼時發生沖突。

維護邏輯合約的變量聲明順序和類型

每個版本的邏輯合約都必須保持狀態變量相同的順序和類型,并且需要在現有變量的末尾添加新的狀態變量。否則,委托調用會導致代理合約讀取或覆蓋不正確的存儲值,而且舊的數據可能與新聲明的變量相關聯,這會給應用程序帶來嚴重的問題。

在基礎合約中包含存儲間隙

邏輯合約需要在合約代碼中包含存儲間隙,以便在部署新的邏輯實現時預測到新的狀態變量。在添加新的狀態變量后,需要適當地更新間隙的大小。

不在構造函數或聲明過程中設置狀態變量的值

在聲明期間或構造函數中分配狀態變量只會影響邏輯合約中的值,不會影響代理合約。非不可變的參數應該使用initialize()函數來分配。

合約繼承

可升級合約只能繼承自其他可升級合約

與不可升級的合約相比,可升級的合約具有不同的結構。例如,構造函數與改變代理狀態不兼容,它使用initialize()函數來設置狀態變量。

任何繼承另一個合約的合約都需要使用其繼承合約的initialize()函數來分配各自的變量。當使用OpenZeppelin庫或編寫自己的代碼時,確保可升級的合約只能繼承其他的可升級合約。

不要在邏輯合約中實例化新合約

通過Solidity創建實例化的合約將不可升級。合約應單獨部署,并將其地址作為參數傳遞給可升級的邏輯合約,以實現可升級狀態。

Parent合約初始化風險

當初始化Parent合約時,__{ContractName}_init函數將初始化其Parent合約。調用多個__{ContractName}_init可能導致Parent合約的第二次初始化。注意__{ContractName}_init_unchained()將只初始化{ContractName}的參數,而不會調用其Parent合約的初始化器。

然而,這并不是一個值得推薦的做法,因為所有的Parent合約都需要被初始化,不初始化所需的合約會導致以后的執行問題。

邏輯合約的實現

避免使用selfdestruct()或對不信任的合約執行selegatecall()/call()

如果合約中存在selfdestruct()或delegatecall(),攻擊者就有可能利用這些函數來破壞邏輯實現或執行自定義邏輯。開發者應驗證用戶的輸入,不允許合約執行對不信任合約的delegatecall/calls。此外,不建議在邏輯合約中使用delegatecall(),因為在多個合約的代理鏈中管理存儲布局會很麻煩。

寫在最后

代理合約通過使協議在部署后能夠更新其代碼邏輯,來繞過區塊鏈的不可篡改特質。然而,開發代理合約仍然需要十分謹慎,不正確的實現可能會導致項目安全與邏輯問題。

總的來說,最佳實踐是使用權威提供的且經過廣泛測試的解決方案,因為透明、UUPS和Beacon代理模式每個都有針對各自用例的經過驗證的升級機制。除此之外,升級代理的特權角色也應該被安全地管理,以防止攻擊者改變代理邏輯。

邏輯實現合約也應注意不要使用delegatecall(),這樣可以防止攻擊者執行某些惡意代碼,如selfdestruct()。

雖然遵循最佳實踐可以確保代理合約部署的穩定,同時保持可升級的靈活性,但所有代碼都容易出現可能危及項目的新安全或邏輯問題。因此所有的代碼最好由具備審計和保護代理合約協議經驗的安全專家團隊進行審計。

Tags:BeaconUPSAudiusBeacon幣是什么幣UPS價格UPS幣Audius幣是什么幣

SAND
網易霸道裁員引群嘲,風雨飄搖下,區塊鏈員工會更慘嗎?_區塊鏈

網易惡意裁員事件一大早占據各大平臺頭條,隨后網易發出“道歉信”,再次引爆輿論,質疑其道歉毫無誠意。事件起因是網易被裁員工對網易的一篇控訴文章,詳細描述了網易的諸多惡行,短時間內形成刷屏效應.

1900/1/1 0:00:00
鏈游發展新思路:Crypto Game資產租賃模型設想雛形_NFT

Jonas是瓜哥面基過的小伙伴,認識有一段時間了,都是從金融行業轉型到WEB3的從業者,大家一起多次深入溝通討論過鏈游的方方面面.

1900/1/1 0:00:00
元宇宙中DeFi的可能性和局限性_元宇宙

現在,元宇宙是最熱門的討論話題。元宇宙和DeFi將改變我們與世界互動的方式。根據技術的發展速度,許多過時的系統都試圖根據這些先進技術的進一步實施而進行調整.

1900/1/1 0:00:00
一夜上頭條 幕后金主、合規與否等十個問題看懂EDX Markets_EDX

2022年6月兩家做市商巨頭CitadelSecurities和VirtuFinancial表示,正在富達投資和嘉信理財的幫助下開發一種加密產品,增加數字資產的獲取渠道.

1900/1/1 0:00:00
“小圖片”故事已完結?一文淺談NFT的轉型之路_NFT

非同質化代幣NFT在2021年經歷了一波熱潮,許多人選擇將這些彩色圖片作為他們Web3身份的象征.

1900/1/1 0:00:00
一起聊聊祛魅做市商_DODO

FTX爆雷,帝國坍塌,一系列頭部平臺遭受重創,做市商和借貸成為重災區:Alameda作為加密貨幣行業最大的做市商之一,在這場鬧劇中覆滅.

1900/1/1 0:00:00
ads