撤銷代幣授權後,還需要做一次EIP-7702 委派核對。allowance = 0回答的是某個 spender(獲准代你動用該代幣的地址)還能動用多少代幣;地址是否仍指向一份智慧帳戶程式碼,要另外讀取。這篇先建立「公開地址+鏈+delegate+查核時間」清冊,再對決定關閉、且由 MetaMask 自身支援的智慧帳戶保存操作交易與同鏈回查結果。
準備完整公開地址、曾使用的 EVM 網路清單,以及該網路官方文件提供的 chain ID 與可信 HTTPS RPC 網址。RPC 是向節點讀取鏈上資料的入口;下面的唯讀查碼以已安裝 curl 的終端機操作。查詢階段不連錢包、不簽名,也不輸入助記詞或私鑰。以下依官方文件整理,沒有使用讀者帳戶簽署交易。
若助記詞或私鑰曾交給他人,或資金一入帳就被轉走,先停下例行關閉操作,也不要急著補 Gas。這些是疑似金鑰外洩的警訊,不是個案原因診斷;遇到掃款程式時,新補入的資金也可能被拿走,處理邊界見文末的外洩段落。沒有這些警訊、仍由你控制的帳戶,真正關閉時才準備可操作該地址的 MetaMask,以及該鏈支付 Gas 的原生代幣。

先把代幣額度與帳戶委派分成兩份紀錄
ERC-20 規格中的 allowance(owner, spender),是在代幣合約裡查 owner 給 spender 的剩餘額度。單筆撤銷的驗收可以照ERC-20 授權撤銷教學做;原本那張表要保留,它不能代替這次的委派清冊。
EIP-7702 規格則讓原本由私鑰控制的 EOA(外部帳戶)在自己的帳戶程式碼寫入 0xef0100 加上 20 bytes 的 delegate 地址。當交易呼叫這個已委派帳戶時,會沿指標取得 delegate 的程式碼,並在你的帳戶脈絡中執行,按那份程式碼的邏輯處理操作。delegate 記的是程式碼所在地址,不是代幣 spender 或轉帳的收款欄位。因此,一筆 allowance 歸零不會自動清除這個指標。
這篇完成的是狀態核對,以及你已決定關閉時的官方操作。格式正確、名稱認得或地址符合官方資料,都不足以判斷是否值得保留委派;它們沒有檢查實作的安全性與你的使用需求。清冊可以先填「尚未決定」,不必在盤點當下作保留判斷。
同一公開地址,每條鏈各開一列;多個地址也各查一次。你要驗收的是「這個地址在這條鏈、這個區塊的程式碼」,不要把某條鏈的結果複製到其他鏈。還不熟悉地址與智能合約,可先補讀以太幣與智能合約入門。
一、在 Delegations 找線索,先留下完整地址
自行輸入 https://revoke.cash,用完整公開地址搜尋,進入帳戶頁的 Delegations 分頁。Revoke.cash 官方說明確認這裡可檢視 EIP-7702 委派,不能在這個分頁直接撤銷;需要回錢包內處理。
把看到的網路、完整 delegate 地址與顯示名稱抄下,連同查詢時間及時區保存。若介面有縮寫地址,從該列的地址連結到同鏈區塊瀏覽器取完整值;拿不到全文就標「delegate 待核實」。介面標籤只是線索,下一節會用原始查碼結果交叉核對。空列表、頁面錯誤、找不到分頁或無法辨認網路,都先記「工具未完成查詢」,不要填成沒有委派。
每個「地址+鏈」各一份 公開地址〔完整 0x 地址〕 網路名稱/chain ID〔 〕 查詢工具、RPC 來源〔 〕 查詢時間與時區〔 〕/查詢區塊〔 〕 原始 code〔 〕/完整 delegate〔 〕 顯示名稱、官方合約依據〔 〕 處置:尚未決定/自行決定保留/準備關閉/未知實作待查 關閉交易雜湊/同鏈瀏覽器網址〔 〕 交易狀態/交易區塊〔 〕 回查時間與時區/回查區塊〔 〕 回查 code/回查 delegate〔 〕 驗收狀態、未解原因、下次查核日期〔 〕 另附 allowance 清冊位置〔 〕
二、EIP-7702 委派核對:用 eth_getCode 讀自己的地址
依 Ethereum JSON-RPC 文件,eth_chainId 回傳鏈 ID,eth_blockNumber 回傳節點目前區塊,eth_getCode 則接受「地址、區塊」兩個參數。以下只讀資料。把 RPC_URL 的示意網址換成你已核實的節點;第一個結果的 result 是十六進位 chain ID,先換算後與目標鏈的官方值比對,不符就停止。
RPC_URL='https://請替換為已核實的HTTPS-RPC網址'
curl -sS --fail -H 'Content-Type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' \
"$RPC_URL"
curl -sS --fail -H 'Content-Type: application/json' \
--data '{"jsonrpc":"2.0","id":2,"method":"eth_blockNumber","params":[]}' \
"$RPC_URL"
下面是自行構造的最小回應示意,並非即時查詢結果。id 對應請求編號;真正要抄的是 result 的值。
{"jsonrpc":"2.0","id":1,"result":"0x1"}
{"jsonrpc":"2.0","id":2,"result":"0x100"}
第一行的 chain ID 0x1 換成十進位是 1;可在同一終端機執行 printf '%d\n' 0x1 查看換算結果,再與目標鏈官方資料核對。第二行的區塊 0x100 是十進位 256,可用 printf '%d\n' 0x100 驗算。實際操作請換成自己的回應;傳給 eth_getCode 的區塊參數仍要保留 0x,這組示意就是 "0x100"。
第二個結果的 result 是十六進位區塊號,保留 0x 原樣抄下。下一段兩個中文佔位值都要替換:第一個是你自己的完整公開地址,第二個是剛取得的區塊號。這裡查的是自己的 EOA 地址,別換成 delegate 或代幣合約。保存請求、原始回應、查詢時間與時區,並把區塊號寫回清冊。
curl -sS --fail -H 'Content-Type: application/json' \
--data '{"jsonrpc":"2.0","id":3,"method":"eth_getCode","params":["0x請填自己的40碼公開地址","0x請填剛取得的區塊號"]}' \
"$RPC_URL"
第三個請求若回傳示意 {"jsonrpc":"2.0","id":3,"result":"0x"},code 就是 result 裡的 0x,不是整段 JSON。若 result 是以 0xef0100 開頭的較長字串,保存完整字串,依下方格式判讀。
若回應包含 error、沒有有效 result,或 HTTP/終端機報錯,就記「查碼失敗」並保存訊息;缺資料不能當成空程式碼。不會使用終端機或尚未取得可信節點時,也先留作待查,不把列表當成完成驗收。
依 EIP-7702 的指標格式,對取得的 code 分成以下結果。這是格式辨識,並沒有審計 delegate 的程式碼是否安全:
0xef0100後接恰好 40 個十六進位字元:合計 23 bytes,表示有委派指標;把後面 40 碼加回0x記為完整 delegate。若和列表不同,保留兩邊結果,核對地址、鏈與查詢區塊。0x:表示這次在指定區塊讀到的程式碼為空,記「該區塊無委派指標」。它不表示所有代幣授權都已撤銷,也不證明金鑰未外洩。- 其他非空 code:記「非本篇格式/待查」,保留全文。不要硬截最後 40 碼當 delegate,也不要把一般合約帳戶當成普通 EOA 繼續操作。
使用另一個可信節點交叉核對時,先確認相同 chain ID,再讀相同地址、相同區塊;不同時間各讀 latest,未必是在比同一份狀態。若節點無法讀該歷史區塊,保留錯誤,換可提供該區塊狀態的節點,別改成另一個區塊後仍稱為同區塊比較。
三、確認是 MetaMask 支援的實作,再逐鏈關閉
先把 delegate 對上MetaMask 官方 Delegator 合約段落;該頁列出的實作地址是 0x63c0c19a282a1b52b07dd5a65b58948a07dae32b。接著開啟 MetaMask 官方部署清單:在 Deployments Chains 的 Mainnets 或 Testnets 找到清冊的同一網路,再到 Deployments → v1.3.0 → EIP7702StatelessDeleGatorImpl,核對整個地址是否與前面查出的 delegate 一致;可把兩邊英文字母都轉小寫後逐碼比對。不要誤抄同表的 DelegationManager 或其他 Impl。把網路所屬主網/測試網、版本、實作名稱、完整地址及官方 URL 記入清冊。
還要交叉核對官方切換指南 Questions 裡的網路清單。例如 Ethereum 主網同時列在部署清單的 Mainnets 與指南的網路清單;Sepolia 則須找測試網項目,不能用主網項目代替。同鏈部署有官方記載、delegate 符合該實作,而且依下方第 1 步進入錢包後確實看得到該帳戶、該鏈已啟用的開關,才進入第 2 步關閉。這是本文限定官方流程適用範圍的核對條件,不是程式碼安全保證。清單沒有該鏈、找不到版本或同鏈部署依據、地址不符或控制缺失,任一項都先填「適用性待查」,不進入簽署。
MetaMask 文件明說,它目前只支援自己的智慧帳戶合約。若 delegate 是別家實作、來源不明,或錢包沒有對應網路控制,就記「非本流程支援/待官方協助」,保存完整地址與 code,向原錢包官方支援查清解除方式。不要為了找一個關閉鈕,把助記詞匯入陌生網站,也不要先升級成另一個智慧帳戶來掩蓋原來的狀態。
先核對上述官方資料,再依官方切回標準帳戶指南操作。以下選擴充套件版;每次只處理清冊中的一條鏈,先保存關閉前的 code 與區塊,再進入錢包:
- 點畫面頂端的帳戶選擇器,核對公開地址;在該帳戶同列點三點選單,進 Account details → Smart account。
- 依上面的條件確認同鏈適用性與已啟用開關後,才把該網路的智慧帳戶開關切到關閉。不要把另一條鏈的關閉狀態當成這一列已完成。
- 在確認畫面核對帳戶、網路,以及切回 Standard account/EOA 的動作;讀取 Network fee,確認有該鏈所需原生代幣;若費用不足,先保存狀態,補入前再次檢查金鑰外洩與掃款警訊。若帳戶、網路或動作不同,按 Cancel;資訊看不清楚就先取消。
- 核對後才按 Confirm。保存交易雜湊與同鏈瀏覽器連結,等它進區塊後記下交易狀態及區塊;尚未進區塊就標待確認。找不到控制、費用不足或簽署失敗時,把版本與完整訊息留在這一列。



四、EIP-7702 委派核對的結案條件:同鏈再查碼
先保存交易收據,再重跑前面的查詢:重新確認 chain ID,取得不早於操作交易區塊的新區塊號,用它讀取同一公開地址的 code。若瀏覽器顯示十進位交易區塊,可先把 RPC 區塊轉成十進位再比大小。純示意:交易在區塊 255,回查區塊是 0x100,用 printf '%d\n' 0x100 得到 256;256 ≥ 255,符合高度條件。若回查是 0xfe,換算為 254,仍早於交易,須等節點追上後重取區塊,不能拿來驗收。查碼請求仍使用帶 0x 的區塊號。把回查時間、區塊、code 與 delegate 寫回原列;另回 Delegations 看介面是否一致。兩邊不一致就保留差異,不覆蓋原始紀錄。
EIP-7702 的清除機制,是有效授權把目標設為零地址後清空帳戶程式碼;不是向零地址轉帳。規格也明寫,已處理的委派指標不會因後續交易執行失敗而回滾。因此,瀏覽器的 Success 或 Failed 標籤都不能單獨作為解除證據,最後仍要讀回鏈上的帳戶程式碼。本篇不提供手工簽署授權或陌生合約的救援交易。
原本有指標、回查 code 是 0x,就記「在回查區塊已清空」。若仍指向原 delegate、改成另一個 delegate,或變成其他非空 code,都記「未達清空驗收」,保存完整值;再核對地址、鏈、交易區塊與節點資料。原因未明時,不要連續簽一串看不懂的「修復」。如果原本就查到 0x,記錄該次狀態即可,不需要為了完成清冊多送一筆關閉交易。
這份清冊是指定區塊的鏈上狀態,不能拿來證明尚未提交的鏈下簽名都已失效,也不能證明之後不會再次出現委派。日後重新啟用或換實作,再新增一筆查核紀錄,保留前後版本;allowance 清冊仍要另外維護。
遇到失竊警訊,先把它從例行清理中分出來
前面提到的疑似外洩警訊若出現,將這一列轉為「疑似金鑰外洩」,不要把關閉智慧帳戶當成恢復安全。Revoke.cash 的外洩處理指引指出,撤銷無法收回攻擊者已取得的金鑰;需要在乾淨裝置建立全新錢包,處理剩餘資產。遇到掃款程式時,反覆補 Gas 也可能被拿走。
收尾時,把每列分成「尚未決定」「自行決定保留委派」「回查區塊已清空」「未知實作待查」「工具或網路未查完」「疑似金鑰外洩」。替待查列填上卡住的欄位、官方支援案件與下一次查核日期。只有有原始結果的地址與鏈才能結案,其餘保留待查。

接著閱讀
左右滑動查看更多推薦






