SSP からトークン承認を取り消す

·7 分で読める·SSP Editorial Team 著
SSP wallet から ERC-20 のトークン承認を取り消すイラスト。allowance がゼロにリセットされ、SSP Key がトランザクションを共同署名する様子。

SSP からトークン承認を取り消す

EVM チェーン上で swap、デポジット、NFT の出品を承認するたびに、あなたは dApp に対して、特定の ERC-20 トークンを自分に代わって動かす許可を与えています。これらの許可——承認 (approvals) や allowance と呼ばれます——はトランザクションが確定したあとも on-chain に残り続けます。数か月後、3 月に信用したコントラクトが、6 月になってもそのトークンを引き出す権利を持ったままになっているかもしれません。対処はシンプルです。必要なくなった承認を取り消してください。本記事では、SSP からそれを行う方法を解説します。SSP は self-custodial な 2-of-2 wallet で、すべてのトランザクション(取り消しを含む)は SSP Key と共同署名されます。

この概念がまだ新しいなら、まず トークン承認:あなたが与え続けている権限 を読んでください。なぜ承認が存在するのか、なぜ無制限の allowance が DeFi における既定の攻撃面なのかを説明しています。本記事はその「掃除編」です。

簡単なおさらい

approve(spender, amount) という呼び出しに署名すると、そのトークンのコントラクトは「spender(典型的にはルーター、vault、マーケットプレイスのコントラクト)が、あなたのアドレスから当該トークンを最大 amount まで移動できる」という事実を記録します。多くの dApp は将来の操作で gas を節約させるため、2^256 - 1——実質的に無制限——を要求してきます。この便利さは同時にリスクでもあります。あとから spender コントラクトが侵害されたり、あなたが dApp を使わなくなっても allowance が残っていれば、攻撃者はいつでも残高全額を引き抜けます。

取り消しは、その付与を取り消します。過去の送金を巻き戻すものでも、何かを「削除」するものでもありません。allowance を 0 に戻すだけです。

取り消しは技術的にどう動くか

取り消しもまた、ひとつのトランザクションにすぎません。同じトークンのコントラクトに対して、元の承認を与えたのと同じチェーン上で approve(spender, 0) を呼び出します。この単一の関数呼び出しが、コントラクト内の allowance[owner][spender] マッピングに新たな 0 を書き込み、古い値を上書きします。

押さえておくべき技術的な要点:

  • チェーンごと・トークンと spender の組ごとに、1 回の取り消しが必要Ethereum 上で USDC の spender を承認し、Polygon 上でも同じ spender を承認していたなら、取り消しトランザクションは 2 回——チェーンごとに 1 回ずつ——必要です。Allowance はチェーン間で共有されません。
  • 取り消しは独立したトランザクション。送金と同じく gas を消費します。手数料をまかなうために、当該チェーンのネイティブ資産(Ethereum なら ETH、Polygon なら MATIC、等々)を用意しておきましょう。
  • 思ったより安く済むことがある。取り消しは単純な書き込みで、しばしば swap よりも安く済みます。Base のような Layer 2 ではほとんど数セントです。
  • SSP は引き続き共同署名する。SSP は 2-of-2 wallet なので、取り消しのトランザクションも他のトランザクションと同じフローを通ります。Extension が起票し、SSP Key がレビューして共同署名します。あなたの保護は片付け作業そのものにも及びます——単一の端末が一方的に取り消すことはできず、単一の端末が「取り消しを装った何か」を承認させられることもありません。

取り消しのふたつのルート

SSP から承認を取り消す方法は同等に正当なものが 2 つあります。状況に合わせて選んでください。

ルート 1:信頼できるブロックエクスプローラを使う

これは手動で透明な経路です。取り消したいトークンと spender が正確に分かっているとき、あるいは第三者ツールに接続したくないときに役立ちます。

  1. 適切なエクスプローラでそのトークンのコントラクトページを開きます:
    • Ethereum:etherscan.io
    • Polygon:polygonscan.com
    • Base:basescan.org
    • BNB Smart Chain:bscscan.com
    • Avalanche:snowtrace.io
  2. Contract タブを開き、次に Write Contract に進みます(そのトークンが proxy コントラクトなら Write as Proxy ——主要なステーブルコインの多くは proxy です)。
  3. approve 関数を探します。入力は spender(取り消したいアドレス)と amount(新しい allowance)です。
  4. amount0 に設定します。Spender アドレスは貼り付けてください。以前の取引履歴からコピーすること。記憶で打ち込まないこと。
  5. ウォレットを接続します。ほとんどのエクスプローラは WalletConnect に対応しており、これが SSP を接続するための推奨手段です。Extension で接続を承認してください。
  6. Write をクリックします。エクスプローラが approve(spender, 0) のトランザクションを組み立て、SSP に渡します。SSP の extension が呼び出しの詳細を表示し、SSP Key が共同署名し、取り消しがブロードキャストされます。

このルートは冗長ですが、何に署名したかについて一切の曖昧さがありません。

ルート 2:専用の取り消しツールを使う

ほとんどのユーザにとってはこちらが実用的です。revoke.cash はこの用途で広く使われているオープンソースツールです。サポートチェーンを横断してあなたのアドレスをスキャンし、有効な allowance をすべて一覧化し、リスクの高いもの(無制限の数量、見覚えのないコントラクト)を強調表示し、接続したウォレット経由で——個別または一括で——取り消せるようにします。

流れ:

  1. ブラウザで直接 revoke.cash を開きます。本物のドメインをブックマークし、そのブックマーク経由でのみ訪問してください。取り消しツールのフィッシング模倣サイトが存在するのは、まさにユーザがその場で署名する準備ができた状態で到着するからです。
  2. WalletConnect で接続し、QR コードをスキャンするか URI を SSP に貼り付けます。
  3. チェーンセレクタを監査したいチェーンに切り替えます。revoke.cash がそのチェーン上のあなたの承認を取得します。
  4. 一覧を確認します。各行に、トークン、spender、allowance の数量、そして通常は dApp のラベルが表示されます。
  5. もう使っていない項目の隣にある Revoke をクリックします。各取り消しは独立した approve(spender, 0) トランザクションで、SSP が共同署名します。

実用的な監査ワークフロー

年に 1〜2 回、20 分を確保してこれを実施してください:

  1. WalletConnect で SSP を revoke.cash に接続
  2. 使用したことのある各チェーンで、有効な承認を確認。歴史的に承認グラフがもっとも濃い Ethereum から始め、Polygon、Base、BNB Smart Chain、Avalanche の順に進みます。
  3. リスクの高いものから対処。無制限 allowance と知らない dApp 名で並べ替えるか、ざっと眺めます。2024 年に一度 swap しただけで以後触っていないプロトコルは絶好の候補。まったく特定できないコントラクトもそうです。
  4. 取り消す。SSP extension でトランザクシ���ンを確認すると、SSP Key が共同署名を求めてきます。取り消しがブロードキャストされます。
  5. SSP Key で共同署名。これが宛先を再確認する場面です。SSP Key には呼び出し先コントラクトと関数が表示されます——どちらも意図したとおりか確認してください。
  6. チェーンごとに繰り返す。Allowance はチェーンごとです。Ethereum で取り消したからといって Polygon がきれいになるとは思わないこと。

ゼロからやり直す必要はありません。目的は、いまも使っているコントラクトの allowance は残し、その他をゼロにすることです。

注意点

  • ドメインの衛生。必ず公式ドメイン revoke.cash を使ってください。フィッシングのクローンはまさにこのワークフローを狙います。ユーザがすでにトランザクション署名のモードに入っているからです。ブックマークし、接続前に URL バーを確認してください。
  • チェーン単位の現実。Ethereum で USDC の承認を取り消しても、ポートフォリオでは「同じトークン」に見えても Polygon 側の USDC 承認はそのままです。各チェーンを明示的に巡回してください。
  • gas の予算。取り消しには gas がかかります。Ethereum では蓄積した取り消しの合計が無視できないことがあります。gas が落ち着いているときに行ってください。Layer 2 ではコストは無視できる程度です。
  • 常に spender を検証。「取り消し」トランザクションに署名する前に、その呼び出し内の spender アドレスが、取り消そうとしたコントラクトと一致していることを確認してください。悪意あるサイトは、見た目だけ取り消し UI を装い、実際には攻撃者へ新しい承認を発行することがあり得ます。SSP Key のプロンプトで関数名(approve)と数量(0)を読むことが、最後の防衛線です。
  • permit は別物。USDC や DAI の派生など一部のトークンは permit ——承認のように振る舞う off-chain 署名——をサポートします。revoke.cash は把握できる範囲で permit ベースの付与も表示します。見覚えのないものは on-chain allowance と同じ扱いをしてください。

片付けにおける 2-of-2 の強み

しばしば見落とされる点はここです。SSP における取り消しは、単一端末上の単一クリックではありません。Extension が取り消しを起票しても、単独でブロードキャストはできません。SSP Key の共同署名が必要で、その共同署名のステップこそ、実際に何が送信されようとしているかを確認するタイミングです。仮に extension が侵害されて、実態としては新規の承認である悪意ある「取り消し」を送ろうとした場合、SSP Key は本当の関数と本当の数量を自身の画面に表示します。2 つの端末、問題を捕まえる 2 つの機会です。

定期的な承認の衛生は、ほとんどのユーザが省略してしまう、DeFi で最もレバレッジの高い習慣です。カレンダーにリマインダを入れ、監査を行い、安心して眠ってください。シリーズの続きもどうぞ——チェーン固有の細部を固めたいなら SSP における Ethereum から、そしてなぜこれが重要なのかを思い出すために トークン承認:あなたが与え続けている権限 に立ち戻ってください。

この記事をシェアする

関連記事