ERC-20 的授權機制是什麼,為什麼它的設計讓無限授權成為「默認慣例」?
ERC-20 代幣標準有一個 approve() 函數,允許持有者預先批准某個地址(通常是智能合約)可以代替自己動用一定數量的代幣。這是必要的:DeFi 協議本身無法直接觸碰你的代幣,需要你先「開門」。無限授權成為默認慣例的原因:若每次操作都授權精確金額,用戶每次換幣前都要先送一筆 Approve 交易(花 Gas),非常不方便。為了改善用戶體驗,大多數 DeFi 的介面默認請求 uint256 最大值(幾乎無限大),讓你只需要授權一次就可以無限次使用——代價是這一次授權暴露了你未來在這個代幣的全部餘額。這個「用戶體驗 vs 安全性」的取捨,是無限授權廣泛存在的根本原因。
授權被濫用最常見的攻擊場景是什麼?
合約漏洞被駭:你授權的協議(例如某個 DeFi 借貸協議)因為程式碼漏洞被攻擊者控制,攻擊者利用這個授權對所有已授權用戶的錢包進行大規模提取——即使你沒有在攻擊發生時使用這個協議,只要過去授權過,你的錢包就在攻擊範圍內。釣魚網站的惡意授權:你訪問了一個偽裝成 Uniswap 或 OpenSea 的假網站,在那裡執行了「Approve」——實際上你授權的是一個惡意合約地址,獲得了授權後它立刻把你的代幣全部轉走。廢棄或不再維護的協議:你授權過一個很久沒有更新的 DeFi 協議,它的合約後來被惡意行為者收購或接管,然後利用舊授權清空相關錢包。
精確授權和無限授權在實際操作中有什麼差別,每次都要精確授權嗎?
精確授權(Custom Amount):你授權合約最多動用這次操作所需的確切金額。好處:即使合約被駭,損失上限就是你授權的那個金額。壞處:每次換幣前都需要先發送一筆 Approve 交易(多一筆 Gas 費),操作更繁瑣。無限授權:一次授權,之後無需再 Approve,用戶體驗順暢;但風險是持續暴露。實際建議:大多數 DeFi 用戶不需要在每次操作都選精確授權,但有幾個場景強烈建議精確授權:第一,你使用的是規模較小或知名度較低的協議(被駭風險更高);第二,你要移動的是大額代幣;第三,這是你第一次使用某個協議,不確定其安全性。對於高信任度的主流協議(Uniswap v3、Aave 等),無限授權的對應風險相對可控——但定期清理仍然是好習慣。
Revoke.cash 等工具的安全性如何,用這些工具本身會不會有風險?
Revoke.cash 是開源的、被廣泛審計和使用的工具,它的主要功能是讀取你的鏈上授權記錄並幫你發送 approve(contract, 0) 的撤銷交易——這是完全在你自己的錢包裡簽署的操作,Revoke.cash 的伺服器看不到你的私鑰。幾個使用時的注意事項:第一,確認你訪問的是 revoke.cash 的正確域名,而不是釣魚仿冒站;第二,每一筆「撤銷」操作都是你的 MetaMask 或其他錢包要你確認簽名的交易,確認前仔細看清楚交易內容;第三,撤銷授權不影響你在那個協議上的任何現有資產或倉位——它只是撤銷了「未來的提款許可」。整體上,Revoke.cash 本身是安全的工具,但使用任何 Web3 工具時都應確認訪問正確的網址並驗證每一筆需要簽名的交易。
每次你在 Uniswap、Aave 或任何 DeFi 協議上做第一筆操作時,你幾乎一定按過一個叫「Approve」的按鈕。大多數人把它看成一個流程上必要的步驟而快速略過——但這個小小的授權,背後隱藏著一個很多人不了解的安全風險:你可能已經給了一個智能合約永久、無限地動用你帳戶裡所有代幣的權限,而且這個授權在你不主動撤銷之前,永遠有效。
在以太坊的代幣標準(ERC-20)下,你的代幣存在你自己的錢包地址,沒有人可以直接取走。但 DeFi 協議(例如 Uniswap 的換幣合約)需要能夠「代替你」把代幣從你的錢包移到流動性池。這需要你先「授權(Approve)」那個合約可以動用你的代幣。`approve(contract_address, amount)` 這個函數,告訴代幣合約:「我允許這個地址,最多動用我 X 數量的代幣。」問題在於,大多數 DeFi 的 UI 為了減少用戶的授權次數和 Gas 費,預設會要求你授權無限量(uint256 最大值 = 2¹⁵⁶ − 1)——等於說:「我允許這個合約,永遠可以動用我所有的代幣。」
你可能想說:「我信任 Uniswap,所以這個授權沒關係。」問題是:協議本身被駭是真實存在的風險。如果你授權了一個合約無限額度,且那個合約後來因為漏洞被攻擊者控制,攻擊者就可以用那個合約,一次性把你錢包裡對應代幣的全部餘額轉走——而你甚至可能還不知道你曾經授權過那個合約。這不是理論風險,而是 DeFi 歷史上多次發生的真實損失模式。授權不會因為你「完成操作」或「交易成功」而自動消失——它是永久的,直到你主動去撤銷。
有幾個工具可以讓你在幾分鐘內看到所有未撤銷的授權。Revoke.cash:連接你的錢包,自動列出所有授權記錄,包含授權對象(哪個合約)、授權額度(有限或無限)、最後使用時間,可以一鍵撤銷。Etherscan Token Approval Checker:在 Etherscan 搜尋你的地址,進入「Token Approvals」頁面,同樣可以查詢和撤銷。DeBank:加密錢包資產追蹤工具,也有授權管理功能。撤銷授權本身是一筆鏈上交易,需要支付 Gas 費;每撤銷一個授權就是一筆交易。
幾個值得養成的習慣。第一,優先選擇「精確授權」而非「無限授權」:大多數 DeFi 介面提供兩個選項,選「Custom amount」把授權額度設為你這次交易需要的確切金額。這樣即使合約被駭,損失也有上限。第二,定期審查和清理授權:每隔一段時間(例如每季)用 Revoke.cash 掃描一次,撤銷已不再使用的協議的授權。第三,操作前確認合約地址:確保你在 Approve 時授權的是目標協議的官方合約地址,而不是被釣魚網站嫁接的惡意地址——這是釣魚攻擊最常見的入口之一。
大多數人在 DeFi 操作了很多次之後,帳戶裡積累了大量的歷史授權記錄,其中很多是「無限額度」的授權——給了已經很久沒用的協議,甚至是已經關閉或被駭的協議。這些殭屍授權是你資金的潛在暴露面,就算你的私鑰沒有外洩,合約被駭一樣可以讓你損失資金。今天用 Revoke.cash 花五分鐘做一次授權清理,是成本最低、效益最高的 DeFi 安全衛生操作之一。對剛開始接觸 DeFi 的人:養成每次授權都選精確金額、用完就撤銷的習慣,比事後補救重要得多。