Bible Network Crypto DeFi Onchain RWA AI Agent Stablecoin Chain SAFU CryptoTax DeFAI AGI Claude Me Claude Skill Claude Design Claude Cowork
獨立知識媒體
與任何項目無關聯
鏈上數據,讀懂市場最真實的聲音
onchain-bible.com
最新
當交易被壓縮成一個證明:ZK-Rollup 讓鏈上分析師還能看見什麼?  ·  3 億美元被永久鎖死:可升級合約的代理模式,為什麼「方便升級」跟「安全」互相矛盾  ·  USDC 一週鑄造 50 億美元,代表買盤要進場了嗎?相關係數告訴你答案沒那麼簡單  ·  MVRV 跟 SOPR,你是不是也只看了其中一個?兩個指標合起來看才是完整答案  ·  25.7 億美元的假交易量:教你用兩個鏈上判準,自己動手抓出洗盤交易  ·  史上最長礦工資本投降剛結束:Hash Ribbon 指標到底在算什麼?
smart-contracts

3 億美元被永久鎖死:可升級合約的代理模式,為什麼「方便升級」跟「安全」互相矛盾

30 秒速讀
Parity 多簽錢包因為一個未初始化的函式庫被意外觸發自毀,3 億美元從此永久鎖死——代理模式的方便升級,跟安全,從一開始就是同一枚硬幣的兩面。

完整解析 +
01 · 為什麼發生?

既然代理模式風險這麼多,為什麼業界不乾脆放棄可升級設計,全部改用不可變合約?

因為不可變合約有它自己的代價,只是這個代價換了一種形式呈現。如果一個協議管理著數億美元資產,程式碼卻完全無法修改,一旦後續發現任何邏輯漏洞(即使是很小的),唯一的補救方式就是部署一個全新合約、要求所有使用者手動遷移資產——這個過程本身既緩慢又充滿摩擦,使用者可能因為疏忽或不信任新合約而滯留在有漏洞的舊版本裡,實際承受的風險未必比代理模式更低。

這也是為什麼業界至今沒有形成「可升級 vs. 不可變,哪個絕對比較好」的共識,而是傾向把選擇框架成「這個協議需要多快的反應速度來修 bug,跟這個協議願意為了升級彈性犧牲多少去中心化程度」的權衡問題。像 Uniswap 這類核心合約選擇不可變,是因為協議邏輯相對穩定、且社群高度重視「合約規則一旦部署就不會被單方面更動」這個承諾;而許多仍在快速迭代的新協議,則傾向選擇代理模式,用集中化的升級能力換取應對突發漏洞的反應速度。

02 · 運作原理是什麼?

Parity 事件裡「函式庫合約沒被初始化」是什麼意思?為什麼沒初始化會導致這麼嚴重的後果?

在可升級合約的架構裡,實作合約(或函式庫合約)本身的建構子(constructor)通常不會被直接使用,因為代理合約是透過 DELEGATECALL 借用實作合約的程式碼、卻使用自己的儲存空間——這代表實作合約自己的儲存狀態理論上應該保持空白,真正的初始化動作要透過另一個叫做 initialize() 的函式,在部署後手動呼叫才能完成。問題就出在這裡:如果開發者忘記呼叫這個初始化函式,或者這個函式沒有做好「只能被呼叫一次」的保護,任何人都可能搶先呼叫它,把自己設成該合約的擁有者。

Parity 事件裡,正是因為這個函式庫合約的初始化函式從未被正確鎖定,一名使用者(很可能只是出於好奇或誤操作)呼叫了初始化函式,把自己設成擁有者,接著又觸發了該合約內建的 selfdestruct 功能,把整個函式庫的程式碼從鏈上抹除。因為所有依賴這個函式庫的代理錢包,本質上只是把呼叫轉發過去、自己完全不儲存邏輯,函式庫一旦消失,這些錢包就變成一個個指向空氣的空殼,裡面的資產再也沒有任何程式碼能夠讀取或轉移。

03 · 如何應用

一般使用者除了在 Etherscan 上查「Read as Proxy」,還有沒有其他方式判斷一個代理合約的升級權限有沒有被妥善管理?

除了確認升級控制地址是不是多簽錢包,還可以進一步查這組多簽的簽署門檻設定——例如「5 個簽署人裡需要 3 個同意」跟「2 個簽署人裡需要 1 個同意」代表的安全水準差異很大,門檻設得太低,多簽的保護效果就跟單一密鑰差不了多少。這個資訊通常能在多簽錢包(例如 Gnosis Safe)的官方介面查到,會列出目前的簽署人清單與所需門檻。

另一個值得查的線索是「是否有時間鎖(timelock)機制」——時間鎖代表即使升級指令已經被送出,也必須等待一段公開的延遲期(例如 48 小時)才會真正生效,這段期間內,社群或使用者理論上可以觀察到即將發生的升級內容,如果發現不對勁,還有機會提前把資產撤出。如果一個協議的升級是「送出交易後立刻生效」,代表使用者完全沒有反應時間,這跟有時間鎖保護的協議,實際承擔的風險等級是不同量級的。這些資訊通常需要交叉查閱合約程式碼、官方文件與治理論壇,沒有單一頁面會直接總結給你看,但值得在存入大額資產前花時間確認。

04 · 我該怎麼做?

如果我發現一個我持有資產的協議是可升級合約、升級權限也不是多簽,我應該立刻撤出資產嗎?

不一定需要立刻恐慌性撤出,但這確實是一個值得認真評估的風險訊號,而不是可以忽略的技術細節。可升級合約本身不等於危險——許多信譽良好、長期運作穩定的協議也採用代理模式,關鍵差異在於「升級權限的治理品質」,而不是「有沒有採用可升級設計」這個二元判斷。如果升級權限雖然不是多簽,但控制地址本身是知名機構的錢包、且有公開透明的治理紀錄可查,風險評估會跟一個完全匿名、無從查證背景的控制地址截然不同。

比較務實的做法,是把「升級權限治理品質」納入你原本已經在做的盡職調查清單裡——跟審計報告、TVL 規模、團隊背景放在同一個檢查層級,而不是單獨拿出來做非黑即白的判斷。如果評估下來覺得風險超出自己能接受的範圍,逐步減少曝險部位,會比因為單一風險因素就立刻清倉更務實;但如果同時發現升級權限集中、又缺乏時間鎖、團隊背景也難以查證,這種多重風險因素疊加的情況,確實應該提高警覺、認真考慮降低部位。

完整內容 +

智能合約設計上有一個根本特性:一旦部署,程式碼就無法更改,這是「不可篡改」信任保證的基礎。但現實中的協議需要持續修 bug、加新功能,於是「代理模式」(proxy pattern)成為業界標準解法——讓合約在保持不可篡改的表面之下,實際邏輯仍然可以替換。這篇文章會拆解代理模式怎麼運作、為什麼它同時是便利與風險的來源,並用三個造成真實損失的案例,說明這個設計選擇具體會怎麼出錯。

代理模式的核心機制:DELEGATECALL

每一個可升級合約都仰賴同一個底層機制:DELEGATECALL 指令碼。當使用者呼叫代理合約(proxy contract)的某個函式時,代理合約不會自己執行邏輯,而是透過 DELEGATECALL 把呼叫轉發給另一個「實作合約」(implementation contract),但執行時使用的是代理合約自己的儲存空間(storage)。這代表實作合約的程式邏輯可以隨時替換成新版本,只要新版本邏輯依然依附在同一個代理地址上,使用者的呼叫入口跟資產儲存位置完全不需要變動——這正是「升級」得以實現、卻又不破壞合約地址不變性的關鍵。

三種主流模式的差異:UUPS、Transparent、Beacon

業界目前主要有三種代理模式實作方式,風險輪廓各不相同。UUPS(EIP-1822)把升級邏輯寫在實作合約本身,代理合約做到極簡,好處是節省 gas,代價是每一版新實作都必須正確保留升級函式——如果哪一版部署時漏掉了,合約會被永久鎖死、再也無法升級。Transparent Proxy 由 OpenZeppelin 推廣,把管理員權限跟一般使用者呼叫分開處理,避免函式選擇器衝突,但升級權限集中在管理員地址,一旦這組地址遭到入侵,攻擊者就能直接替換邏輯合約。Beacon Proxy 則引入第三個元件——信標合約(beacon contract),多個代理實例共用同一個信標,升級信標一次就能同步更新所有依賴它的代理,適合大量部署相同邏輯的場景,但代價是「信標管理權限」形同整個系統的根層級權限,一旦信標被升級成惡意版本,所有依賴它的代理會同時遭殃。

三個真實案例:同樣的設計選擇,不同的失敗方式

2017 年的 Parity 多簽錢包事件,是這個設計模式最早、也最慘痛的教訓之一:一個被多個錢包共用的函式庫合約,因為從未被正確初始化,被一名使用者意外觸發了 selfdestruct 指令,導致這個函式庫瞬間消失,而所有依賴它的代理錢包因為邏輯合約已經不存在,永久失去可執行的程式碼——總計約 3 億美元的資產從此被永久鎖死,無法動用。2024 年的 Radiant Capital 事件則展示了代理權限被入侵的直接後果:攻擊者透過入侵多簽簽署人,取得了升級借貸池合約的權限,執行 transferOwnership() 並把邏輯合約換成惡意版本,造成約 5,000 萬美元損失。同年的 IoTeX 跨鏈橋事件則更直接——攻擊者呼叫 upgrade() 函式,直接把實作合約替換成移除了所有安全檢查的惡意版本,造成約 440 萬美元損失。三起事件手法各異,但共同點是:代理模式把「誰能改變合約邏輯」這個問題,簡化成了「誰控制那把升級鑰匙」。

這跟你的錢有什麼關係

下次要把資產存入某個 DeFi 協議前,除了看它是不是已經上線一段時間、有沒有經過審計,也值得多做一步:到 Etherscan 上查該合約地址,看「Contract」分頁裡是否顯示「Read as Proxy」——如果是,代表這是一個可升級合約,接著追蹤它指向的實作合約地址,並查詢升級權限目前掌握在哪個地址手上。如果控制地址是一般外部帳戶(EOA)而非多簽錢包,或者看不出有時間鎖(timelock)機制讓升級不能瞬間生效,這代表這個協議的核心邏輯,理論上可以在你毫無預警的情況下被單一把私鑰徹底改寫——這跟合約有沒有經過審計是兩個完全不同的風險維度,審計檢查的是「目前這版程式碼寫得對不對」,卻管不到「未來換上的那版程式碼會不會是好人寫的」。

資料來源:Smart Contract Upgrade Security: Proxy Pattern Risks — Nomos LabsUpgradeable Contracts Done Right: Proxy Patterns Explained — AutheoERC-1967: Proxy Storage Slots — Ethereum Improvement Proposals
圖解
代理合約 DELEGATECALL 運作機制圖呈現使用者呼叫代理合約、代理合約透過 DELEGATECALL 轉發邏輯執行給實作合約、以及升級鑰匙掌握在誰手上這個關鍵治理節點Proxy Pattern: How DELEGATECALL WorksUser CallFixed addressProxy ContractHolds storage & assetsDELEGATECALLImplementationSwappable logic onlyUpgrade KeyEOA or Multisig?Real cases: Parity ($300M locked), Radiant ($50M), IoTeX ($4.4M)Onchain Bible · onchain-bible.com
歡迎截圖分享,轉載請註明來源
提問
請至少輸入 10 個字
相關文章
以太坊有 4,100 萬個智能合約,但只要 11 個地址就能控制其中一半
smart-contracts · 08/29
當交易被壓縮成一個證明:ZK-Rollup 讓鏈上分析師還能看見什麼?
advanced · 09/03
USDC 一週鑄造 50 億美元,代表買盤要進場了嗎?相關係數告訴你答案沒那麼簡單
data-analysis · 09/03
MVRV 跟 SOPR,你是不是也只看了其中一個?兩個指標合起來看才是完整答案
data-analysis · 08/31
更多相關主題