如果一個合約沒有代理模式、無法升級,是不是就代表比較安全?
方向上是對的,但不是絕對的。不可升級的合約,確實排除了「團隊事後把邏輯整個換掉」這條攻擊路徑——部署上鏈的程式碼會永遠維持原樣,這是它相對於可升級合約的明確優勢。以 Uniswap V3 為例,其核心合約(Factory、Pool、NFT 部位管理器)就是刻意設計成不可升級,並經過三年以上的實戰考驗,這種設計哲學本身就是一種安全承諾。
但不可升級不等於沒有任何管理權限風險——有些合約雖然邏輯本身不能被替換,卻仍然保留了其他形式的管理員權限,例如暫停合約運作、調整手續費參數、凍結特定帳戶等功能,這些權限一樣可能被集中在少數人手上濫用。所以查證的重點不能只停在「這是不是代理合約」,還要進一步檢查合約裡還留有哪些 onlyOwner 或類似修飾詞保護的函式,那些函式能做到什麼事,才是完整的圖像。
多簽(multisig)聽起來已經比單一把私鑰安全很多,是不是只要看到多簽就可以放心?
多簽確實比單一 EOA 地址安全,這個方向沒有錯——它要求多把獨立金鑰共同簽署才能執行操作,單一一把私鑰外洩不足以造成損失,這正是 Multichain 事件裡缺乏的那層保護。但多簽本身的安全性,還取決於幾個容易被忽略的細節:第一是門檻設定,一個「2 of 5」的多簽,代表只需要五把金鑰裡的任兩把就能通過,如果這五把金鑰的實際控制者互相認識、彼此關係密切(例如都是同一個團隊的核心成員),這個多簽在對抗「內部合謀」這種風險時,實質保護力會遠低於表面上的「五方制衡」印象。
第二是這些金鑰的持有者,是不是真的各自獨立掌握、各自妥善保管——如果某幾把金鑰的持有人,實際上是把私鑰都交給了同一個人或同一套系統代管,多簽在紙面上看起來門檻很高,實際上的攻擊面,可能跟單一把私鑰沒有太大差別。查證多簽時,值得進一步去看這個多簽錢包過去的簽署歷史,是不是每次都由不同的地址完成簽署,這比單純看到「這是一個多簽地址」更能反映真實的分散程度。
時間鎖(timelock)延遲個一兩天生效,真的能有效阻止惡意升級嗎?
時間鎖的保護力,取決於延遲期間有沒有真的被拿來做「有意義的監控」,而不是延遲本身自動產生保護效果。如果一項升級提案在時間鎖裡等待的 48 小時中,沒有任何人、任何監控系統在檢查這段期間內排隊等待執行的提案內容,那麼這 48 小時只是一段純粹的等待,不會自動變成防禦——這也是為什麼有些安全研究者會強調,時間鎖只有在「有人確實在看」的前提下,才真正發揮保護作用,而不是把時間鎖本身當成萬靈丹。
另外值得留意的是,時間鎖的延遲機制通常依賴區塊鏈的時間戳(block.timestamp)來計算,而區塊鏈驗證者對時間戳有小範圍(通常在正負 15 秒內)的操縱空間——雖然這個誤差範圍遠遠小於 24 到 48 小時的延遲設計,不足以讓攻擊者實質繞過時間鎖,但這提醒我們,時間鎖提供的是「機率上大幅提高被發現的機會」,而不是密碼學等級、絕對不可能被繞過的數學保證。真正該做的,是善用這段公開的延遲期,主動去查詢協議的治理論壇或多簽錢包紀錄,看看有沒有已經進入排隊、卻還沒執行的升級提案,而不是假設時間鎖已經自動幫你把關完畢。
我把資金存進一個協議前,實際上該按什麼順序去查這些治理權限相關的細節?
第一步先確認合約是不是代理合約——到 Etherscan 打開合約頁面的「Contract」分頁,看有沒有「This is a proxy contract」的橫幅。如果不是代理合約,可以進一步查有沒有其他 onlyOwner 保護的高風險函式(例如暫停、凍結帳戶、調整參數);如果是代理合約,代表下一步一定要查升級權限握在誰手上。
第二步是查出 owner 或 admin 地址,把這個地址複製到 Etherscan 搜尋,看它是一般的 EOA 錢包、還是 Gnosis Safe 這類多簽合約。如果是 EOA,代表升級權限集中在單一把私鑰,風險等級最高;如果是多簽,繼續查它的簽署門檻(例如幾之幾)跟過去的簽署歷史,確認實際參與簽署的地址是否真的多元、獨立。第三步,如果查到時間鎖合約,去查它設定的延遲時間長短,並主動去協議的治理論壇或區塊鏈瀏覽器上,看看有沒有已經排隊、尚未執行的升級提案——這三個步驟合起來,能讓你在存入資金前,對「這個協議的邏輯有沒有可能在未經你同意的情況下被換掉、換掉需要幾個人同意、你有沒有機會提前發現」這幾個問題,有一個具體、可驗證的答案,而不是只靠「這個協議聽起來很大、應該很安全」這種模糊印象。
2023 年 7 月 6 日,跨鏈橋協議 Multichain(前身為 Anyswap)在短短數小時內被轉出約 1.26 億美元資產,橫跨 Fantom、Moonriver、Dogechain 等多條鏈上的橋接資金池幾乎同時遭到掏空。區塊鏈安全公司 CertiK 事後證實,這起事件的成因是私鑰遭到入侵,並直接表示「這屬於私鑰外洩,不在我們過去執行的審計範圍之內」——而 CertiK 確實審計過 Multichain 兩次,都沒有標記出任何重大問題。這句話點出了一個大多數 DeFi 用戶容易忽略的事實:智能合約審計驗證的是程式碼邏輯有沒有漏洞,卻通常不會告訴你,誰握有可以繞過那些邏輯、直接動用資金的鑰匙,以及那把鑰匙握在多少人手上、被保護得有多嚴密。
大多數人以為智能合約一旦部署上鏈就不能再更動,但實務上,DeFi 協議裡有相當比例的合約採用「代理模式」(proxy pattern)——使用者實際互動的合約地址(代理合約)本身邏輯很簡單,只負責把每一筆呼叫轉發到另一個存放實際業務邏輯的地址(實作合約)。協議團隊只要把代理合約指向一個新的實作合約地址,就能在不改變使用者互動地址的前提下,整個換掉背後執行的程式碼。這個設計原本是為了修復漏洞、升級功能時不需要用戶重新遷移資產,立意良善,但它同時也代表:任何一個可升級合約,背後一定存在某個角色,握有「換掉這個合約邏輯」的權限——這個權限如果落入攻擊者手上,效果等同於直接控制了整個協議,不需要在原本的程式碼裡找到任何邏輯漏洞。根據 2026 年 OWASP 智能合約十大風險清單,「代理與可升級性漏洞」的排名已經從前一年的第 7 名上升到第 3 名,反映的正是這類攻擊面正變得愈來愈受攻擊者重視。
要查一個合約是不是代理合約,最直接的方法是到 Etherscan 打開這個合約的頁面,切到「Contract」分頁——如果這是一個代理合約,通常會看到一條寫著「This is a proxy contract」的提示橫幅,Etherscan 會自動讀取 EIP-1967 標準規範存放實作合約地址的固定儲存槽(位址為 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bb),並把目前指向的實作合約地址顯示給你。如果看到這個橫幅,代表你正在互動的邏輯,隨時可能被協議團隊換掉——你今天核准的行為模式,不保證明天依然成立。
確認是代理合約之後,下一步是找出「誰有權限執行升級」,通常這個角色會被稱為 admin 或 owner。在合約頁面上找到管理相關的函式(例如 owner() 或 admin()),呼叫後會回傳一個地址,把這個地址複製貼到 Etherscan 上查詢:如果查到的是一般的外部持有帳戶(EOA,也就是一般錢包地址),代表升級權限掌握在單一把私鑰手上,一旦這把私鑰外洩或持有人惡意行事,整個協議的邏輯都能被瞬間替換——這正是 Multichain 事件裡發生的狀況;如果查到的地址本身也是一個合約,而且是像 Gnosis Safe 這類多簽錢包,代表升級需要多把獨立金鑰共同簽署才能執行,單一把金鑰外洩不足以造成升級;如果進一步接到一個時間鎖合約(TimelockController),代表就算多簽都同意了升級,也必須等待一段公開的延遲期(常見為 24 到 48 小時)才會正式生效,這段時間讓外部監控者有機會提前發現異常提案並示警。
Multichain 用的是多方計算(MPC)技術管理私鑰,理論上私鑰會被拆分成多個碎片、分散給不同節點保管,藉此避免單點故障。但根據事後追蹤,2023 年 5 月,Multichain 執行長「趙俊」在中國遭警方帶走約談,團隊隨後證實已經失去跟他的聯繫方式,而他正是掌握操作 MPC 節點伺服器存取金鑰的人——換句話說,這套理論上分散的私鑰系統,實際運作上仍然高度依賴單一個人。7 月 6 日,橋接資金池開始出現異常提領,從最初一筆僅 2 美元的測試性轉帳,兩小時內演變成 3,100 萬美元的 WBTC 被轉出,隨後 Moonriver 與 Dogechain 橋接池也相繼遭到掏空,過程中沒有動用任何程式碼漏洞,也不需要繞過任何智能合約邏輯——只需要那把本該分散保管、實際上卻集中在一人手中的金鑰。