加密代幣授權與額度:如何檢查及撤銷 ERC-20 授權
了解 ERC-20 授權容許智能合約做甚麼、無限額度和 permit 簽署如何運作,以及撤銷授權能改變和不能改變的事。
本指南內容連接錢包和授權代幣是兩種不同權限
簡短摘要
ERC-20 的 `approve` 通常不會即時轉出代幣,而是在代幣合約記錄某個 spender 日後可透過 `transferFrom` 使用的額度。中斷錢包與網站的連線,不一定會清除鏈上授權;把額度設為零亦不能撤回已完成的轉帳。
連接錢包和授權代幣是兩種不同權限
連接網站通常讓應用程式查看公開地址並要求錢包簽署,但這本身不代表它獲准轉走所有 ERC-20 代幣。代幣額度會另行記錄在代幣合約。MetaMask 也把中斷 dapp 連線與撤銷代幣授權視為不同操作。
ERC-20 allowance 對應代幣合約、區塊鏈、持有人地址和 spender 地址。在 Ethereum 授予的額度,不等於 Polygon 上同名代幣的授權,也不等於另一種代幣的授權。若只記得「我授權過這個網站」,便容易忽略哪條鏈、哪個代幣仍保留額度。
本文範圍是 Ethereum 及相容網絡上的 ERC-20 approve、allowance 和 transferFrom。原生 ETH 轉帳、NFT 的 setApprovalForAll、其他代幣標準和錢包登入連線都使用不同權限模式。密鑰備份和復原是另一個議題,可參閱助記詞備份與錢包復原指南。
`approve`記錄使用上限,不會直接轉送代幣
ERC-20 持有人可以在代幣合約呼叫 approve(spender, amount),容許指定 spender 使用不超過該額度的代幣。標準的 transferFrom 讓 spender 代持有人轉移代幣。因此 approve 本身通常不會改變餘額,但後續合約呼叫可消耗 allowance。這是ERC-20 標準定義的授權流程。
例如錢包持有 300 枚代幣,並向某個路由合約授權 80 枚,一般 ERC-20 spender 的可用量受剩餘額度和持有人餘額中較小者限制。授權不一定只用於一筆交易:合約可以多次呼叫 transferFrom。若已授權的合約或原定呼叫路徑遭濫用,代幣可能以持有人意料之外的方式移動。代幣的非標準行為和額外限制也要核對。
授權通常是發往代幣合約的鏈上交易,可能需要支付網絡費。有些應用把授權和兌換分成不同交易;有些會把簽署型權限與後續交易組合。不要只憑「Approve」按鈕的名稱判斷,要查看錢包要求簽署的內容和所選網絡。
無限額度不代表即時提款
錢包顯示「Unlimited」通常表示接近代幣最大整數值的額度。這不會創造無限代幣,也不會在授權時立即轉走餘額。不過,同一鏈上同一代幣日後進入錢包時,spender 仍可能使用保留的額度。部分實作會保留最大值而不扣減,故應了解代幣如何處理這個值。
應用程式可能為減少重複授權而要求較大額度,但方便與風險要一併考慮。若 spender 合約有漏洞,或其控制權遭濫用,舊授權可能在日後被使用。Ethereum.org 撤銷指南解釋,將資產轉回錢包後,寬鬆額度仍可能帶來風險。
較小額度也不會消除所有風險。授權假代幣或錯誤 spender,即使額度不大亦可能造成損失;每次交易都重新授權則會增加費用和操作失誤機會。應考慮預計使用數量、使用頻率、對 spender 的信任程度,以及能否重新檢查授權。

簽署前核對網絡、代幣、spender 和額度
簽署前核對四點:所選網絡是否與應用說明一致;代幣合約地址是否正確,而不是只看代號;spender 地址是否與項目官方資料或可核實的合約資料相符;額度是否配合預定操作,還是留下長期且寬泛的權限。
不要從私訊、QR code、客服聊天或未核實廣告的連結連接錢包。釣魚網站可以仿冒真實應用。請從已儲存的官方網址或項目官方資料開始;即使合約顯示名稱熟悉,也不要因此信任地址。區塊瀏覽器的驗證標記亦不代表合約安全。
硬件簽署裝置可協助把私鑰與一般瀏覽器分開,但不能替你判斷 spender 或額度是否安全。若裝置不能以可理解的方式顯示要求,請先停止簽署,並查看錢包供應商的官方說明。裝置顯示的細節有限,能核實的內容也會有限。
`permit`改變授權途徑,但仍會建立權限
部分 ERC-20 支援ERC-2612 permit。持有人可簽署 typed data,而毋須提交一般 approve 交易;其他人可提交該簽署以設定 allowance。標準訊息包含持有人、spender、額度、nonce 和 deadline,並以域資料把簽署連繫至區塊鏈和合約。
ERC-2612 的 deadline 是提交簽署 permit 的最後時刻,不代表成功設定的 allowance 會在該時刻自動到期。額度可能一直保留,直至被使用、修改或撤銷。部分代幣採用不同的 permit 設計或額外期限,所以不要把所有標為「permit」的提示都當成 ERC-2612。
簽署可讓另一個帳戶代付網絡費,但不代表所有簽署只是無害的登入確認。若錢包沒有清楚顯示代幣、spender、額度和時間條件,或資料與應用說明不符,請拒絕並查閱官方資料。尚未提交的簽署亦可能在期限前由他人提交。
中斷網站連線不會撤銷鏈上額度
登出或中斷錢包連線只會改變瀏覽器工作階段或連線權限。已記錄在代幣合約的 ERC-20 allowance 仍可能存在。相反,撤銷額度亦不會抹去網站已知的公開地址或過往鏈上紀錄。MetaMask 的中斷連線指南也說明這個分別。
撤銷通常要提交鏈上交易,把該代幣和 spender 的額度設為零。交易會產生網絡費,確認前舊權限仍可能有效。之後更新授權清單或重新查詢代幣合約,確認同一錢包、區塊鏈、代幣和 spender 的額度確實為零。MetaMask 授權指南和 Ethereum.org 說明按網絡檢查授權的方法;無論使用哪個工具,都要核對官方網域和所選網絡。
每條鏈各自保存狀態。在 Ethereum 把額度設為零,不會自動更改其他網絡上的同類授權。逐一檢查相關帳戶、代幣合約、spender 和網絡,並在交易確認後覆核結果。撤銷工具不需要助記詞或私鑰。
撤銷只阻止日後使用,不能逆轉已完成的轉帳
確認額度為零後,該 allowance 不能再支持新的 transferFrom。但撤銷不會逆轉已完成的轉帳、從收款地址取回代幣,亦不會移除無關合約權限。若代幣已被可疑 spender 轉走,單靠撤銷不能保證資產復原。
若錢包私鑰外洩,攻擊者仍可用其他方式簽署交易。其他 spender 或代幣的授權、NFT operator 權限、permit 簽署和合約專屬權限亦可能繼續存在。只在你實際檢查過的錢包和網絡範圍內解讀結果。
撤銷 spender 後,下次兌換、存入或贖回時可能需要重新授權。操作前檢查該權限會否用於未完成交易或仍在使用的協議倉位;必要時查閱協議官方說明。重點是了解權限改變後會如何影響後續操作。
修改額度時要考慮 ERC-20 的競態條件
ERC-20 建議介面在把非零 allowance 改成另一個非零值前先設為零。若 spender 的交易排在舊授權和新授權之間,它可能使用超出持有人預期的數量。例如把額度從 100 改為 25 時,spender 若先用掉舊的 100,之後新的 25 也可能再被使用。
先把額度設為零並確認,再設定新值,可以減少舊值與新值同時有效的機會;但不能撤回零值交易確認前已使用的舊額度。兩個步驟可能各自收取費用,代幣行為也可能不同。遵循錢包或代幣的官方安全更新流程,並等待確認後才進行下一步。
不確定現有額度時,先在所選網絡查詢代幣合約。若錢包顯示空值或意料之外的代幣,確認你沒有查看另一條鏈或另一個地址。持有人地址和代幣合約地址都必須與目標授權相符。
用簡短流程檢查錢包和代幣權限
- 確認項目官方網域和目前所選網絡。
- 核對代幣合約和 spender 地址,並比較額度與預定操作所需數量。
- 閱讀錢包顯示的實際交易或 typed data;不理解的要求不要簽署。
- 在相關網絡檢查已用完或不再信任的 spender;需要時把額度設為零並確認結果。
- 比較錢包時,除了網絡支援,也要看它能否清楚顯示授權,以及更新和復原說明是否容易理解。
硬件錢包是密鑰保管和簽署檢查的一種選擇,不保證合約安全,也不能阻止使用者批准過大的額度。不要把判斷交給簽署畫面;自己核對 spender、代幣、網絡和額度。了解授權會獨立於網站連線保留,也有助比較錢包功能的實際保障範圍和限制。
常見問題
Q1中斷錢包連線會清除已有代幣授權嗎?
不會。網站連線是錢包工作階段,ERC-20 allowance 則是代幣合約中的鏈上狀態。需要時應在相關網絡和代幣上另行檢查並撤銷 spender 權限。
Q2把 allowance 設為零,可以取回已轉走的代幣嗎?
不可以。確認後只能阻止日後使用,不能逆轉已完成的轉帳。其他授權和私鑰是否外洩亦要另行檢查。
Q3所有加密代幣和 NFT 都使用 ERC-20 allowance 嗎?
不是。本文只涵蓋 ERC-20 的approve和transferFrom。NFT operator 授權、原生資產、其他代幣標準和鏈特定權限都要依各自規則檢查。
資料來源與延伸閱讀
回報問題
我們會準備一封包含本文連結的電郵。寄出後,Mark 才會收到你的回報
快速檢查
讀完指南後,用 3 道題檢查一下
問題 01
ERC-20 的 `approve(spender, amount)`主要設定甚麼?
選擇答案即可查看解釋