トークン Approve(承認)は ERC20 トークンとスマートコントラクトがやり取りするための標準的な仕組みですが、2024〜2026 年で最大の DeFi 攻撃ベクトルでもあります。本記事では Approve の仕組みと撤回操作を詳しく解説します。先に結論を述べると、DeFi との取引のたびに Approve の残骸が生まれる可能性があり、長期間撤回しないと大きなリスクが積み重なります。毎月 Revoke.cash で監査し、不要な承認を撤回することは DeFi ユーザーに欠かせない習慣です。日常のメイン・サブ口座は バイナンス公式サイト の入口からメインアカウントを登録し、Android では バイナンス公式アプリ をインストール、iPhone ユーザーは海外 Apple ID への切り替えについて iOS インストールガイド を参考にしてください。
1. Approve の仕組みの原理
ERC20 トークンの二つの送金方式:
ERC20 トークン規格には二種類の送金方式が設計されています。
- transfer:ユーザーが自分で送金する(あなたが他人に USDC を送る)
- transferFrom:コントラクトが代理で送金する(スマートコントラクトがあなたの口座から USDC を引き出す)
transferFrom を使うには先に Approve が必要:
ステップ1:ユーザーが USDC コントラクトの approve(spender, amount) を呼び出す
- spender = コントラクトアドレス
- amount = 承認する数量
ステップ2:コントラクトが transferFrom(user, recipient, amount) を呼び出す
- amount の範囲内でなければ成功しない
例えば Uniswap を使う場合:
ステップ1:ユーザーが Uniswap Router に USDC の引き出しを Approve する(一度に 1000 USDC を Approve)
ステップ2:ユーザーが Uniswap 上で USDC → ETH の交換を開始する
ステップ3:Uniswap Router が USDC.transferFrom を呼び出して USDC を引き出す
ステップ4:Uniswap Router がユーザーに対応する数量の ETH を送る
Approve は DeFi と ERC20 トークンをやり取りする際の基盤となる仕組みです。
Q:取引のたびに毎回 Approve し直す必要がありますか?
必要ありません。Approve は永続的です:
- ユーザーが Uniswap に 1000 USDC を Approve すると → その 1000 USDC の枠は永久に存在する
- ユーザーが Uniswap 上で何度も取引しても、1000 USDC を超えなければ再度 Approve する必要はない
- Approve はユーザーが自分で Revoke するか、枠を使い切るまで終わらない
これがApprove の蓄積リスクの根本原因です:長期間撤回しない → 大量の過去の Approve が残り続ける。
2. Approve の二つの種類
限定承認(Limited Approval):
- ユーザーが特定の数量(例:1000 USDC)を承認する
- コントラクトは最大 1000 USDC しか引き出せない
- 使い切ったら再度 Approve が必要
無制限承認(Unlimited Approval / MaxUint256):
- ユーザーが 2^256-1 の数量(実質無制限)を承認する
- コントラクトは無制限に引き出せる
- 二度と Approve し直す必要がない
なぜ無制限承認が存在するのか:
- Gas の節約:ユーザーは一度だけ Approve すればよい(50〜200 ドルの Gas を節約)
- ユーザー体験:取引のたびに Approve する手間を避けられる
- DApp のデフォルト設定:Uniswap、SushiSwap などはデフォルトで無制限 Approve になっている
無制限承認のリスク:
- プロトコルがハッキングされると、ユーザーのウォレット内のトークンが無制限に引き出される可能性がある
- フィッシングコントラクトに Approve すると、残りの資産がすべて奪われる可能性がある
- 気づきにくい(ユーザーは自分から確認しない)
実際の事例:
2024 年 12 月、あるユーザーが 2022 年に Uniswap 上で USDC を Unlimited で Approve していました。2024 年 12 月、そのユーザーのウォレットに 5 万 USDC が振り込まれ、2 時間後に悪意あるコントラクト(Uniswap V3 になりすました悪質な Router)が transferFrom を呼び出してすべて奪い去りました。事後調査により、フィッシングコントラクトが過去の Approve の抜け穴を悪用して攻撃を仕掛けたことが判明しました。
Q:限定承認と無制限承認、どちらを選ぶべきですか?
安全重視派(推奨):取引のたびに具体的な数量を手動で Approve する
- メリット:安全性が高く、一度の損失を抑えられる
- デメリット:毎回 Gas を消費する(5〜30 ドル)
利便性重視派:デフォルトで無制限承認
- メリット:Gas を節約でき、一度の Approve で長く使える
- デメリット:プロトコルがハッキングされた場合の損失が大きい
主流の戦略:
- 高額トークン(1万ドル超):限定承認 + 使い終わったらすぐ撤回
- 少額トークン(1万ドル未満):無制限承認 + 定期監査
3. Approve 攻撃の主な形態
形態1:フィッシングサイトによる Approve 攻撃
フィッシングサイトの UI は本物そっくりで、ユーザーがウォレットを接続するとApprove トランザクションに署名させられます:
- 表向き:「ウォレットの検証」や「エアドロップの受け取り」を要求
- 実際:USDC / USDT / WETH を悪意あるコントラクトに Approve させられる
- その後:悪意あるコントラクトが transferFrom で承認済みトークンをすべて奪い去る
形態2:Permit 署名攻撃
EIP-2612 で導入された permit 関数は、署名(オンチェーンでない)による承認を可能にします:
- ユーザーが Permit メッセージに署名する
- コントラクトがその署名を使って permit + transferFrom を呼び出す
- ユーザーのウォレットのトークンが引き出される(事前の Approve 不要)
Permit 攻撃の危険性:
- ユーザーが署名する際 Gas を消費しない(オンチェーンでない)
- ウォレットの署名画面での Permit の表示が分かりにくい
- ユーザーが「無害な署名」だと誤解する可能性がある
形態3:過去の Approve を通じたプロトコルのハッキング
過去に Approve したプロトコルがハッキングされる:
- ユーザーが 2 年前にあるプロトコルに Approve した
- そのプロトコルがハッカーに乗っ取られる(秘密鍵の流出/コントラクトのアップグレードの乗っ取り)
- ハッカーがそのプロトコルを通じて transferFrom を呼び出し、承認済みトークンをすべて引き出す
形態4:悪質な Token Drainer
フィッシングサイトの署名画面で複数の Approve を一度に承認させる:
- 一回の署名に複数の USDC / USDT / WETH の承認が含まれている
- ユーザーは具体的な承認内容を見分けられない
- 一回の署名でウォレット内の複数のトークンが承認されてしまう
Q:Permit 署名は Approve より危険ですか?
はい、Permit の方がより危険です:
| 項目 |
Approve |
Permit |
| オンチェーン |
あり |
なし(署名のみ) |
| Gas 消費 |
あり |
なし |
| ウォレットの表示 |
比較的明確 |
分かりにくい |
| 撤回方法 |
Revoke のオンチェーン取引 |
撤回不可(コントラクトの nonce を変更する必要あり) |
| ユーザーの警戒度 |
高い |
低い |
どんな Permit 署名も、対象トークン・数量・受取先をよく確認する必要があります。
4. Revoke による Approve の撤回を詳しく解説
主な撤回ツール:
Revoke.cash(最も主流、推奨):
- URL:revoke.cash
- 対応チェーン:イーサリアム + 主要 EVM チェーン
- 操作:ウォレットを接続 → 承認一覧を確認 → Revoke をクリックして撤回
Etherscan Token Approval:
- URL:etherscan.io/tokenapprovalchecker
- イーサリアムメインネットのみ
- 承認の詳細を表示
Solscan Approval(Solana):
- URL:solscan.io/account-token-approval
- Solana のみ
- SPL トークンの承認を撤回
Revoke.cash の操作手順:
1. revoke.cash にアクセス
2. 「Connect Wallet」をクリック(MetaMask / Rabby を接続)
3. すべての承認が自動的に読み込まれる(トークン/プロトコル別に分類)
4. 一覧を確認:
- トークン名(USDC、USDT、WETH など)
- 承認先(コントラクトアドレス + 有名プロトコル名)
- 承認数量(具体的な数値または Unlimited)
- リスク評価(赤 = 高リスク、緑 = 既知のプロトコル)
5. 「Revoke」をクリックして疑わしい承認を撤回
6. MetaMask のポップアップで署名 + Gas を支払う
7. オンチェーン反映を待つ(5〜30 秒)
Revoke の Gas コスト:
| チェーン |
1件あたりの撤回 Gas |
| イーサリアムメインネット |
5〜30 ドル |
| Polygon |
0.01 ドル未満 |
| Arbitrum / Optimism / Base |
0.1〜1 ドル |
| BNB Chain |
0.05〜0.30 ドル |
| Solana |
0.01 ドル未満 |
Q:Approve を撤回するには Gas が必要ですか?
はい。Revoke はオンチェーン取引なので、Gas の支払いが必要です。ただし:
- イーサリアムメインネットは Gas が比較的高い(1件あたり5〜30 ドル)
- L2/その他のチェーンは Gas が非常に低い
最適化のアドバイス:
- ネットワークが混雑していない時間帯に撤回する(深夜/週末)
- 複数の承認を一度にまとめて撤回する(時間を節約)
- 高リスクの承認を優先的に撤回する
5. Approve の定期監査の標準フロー
監査頻度:
| ユーザータイプ |
監査頻度 |
| アクティブな DeFi ユーザー(週5回以上やり取り) |
毎月 |
| 中程度の DeFi ユーザー(月5〜20回やり取り) |
3か月ごと |
| 低頻度の DeFi ユーザー(月5回未満やり取り) |
6か月ごと |
監査手順:
ステップ1:ウォレットを Revoke.cash に接続する
ステップ2:承認をリスク別に分類する
リスクレベル順に並べる:
- 高リスク:未知のコントラクトへの Unlimited 承認
- 中リスク:既知のプロトコルへの Unlimited 承認
- 低リスク:既知のプロトコルへの限定承認
ステップ3:不要な承認を撤回する
撤回の原則:
- 未知のコントラクトへの承認はすべて撤回する
- もう使っていないプロトコルの承認を撤回する(例:1年以上やり取りがないもの)
- 主に使っているプロトコルの承認は残す(Uniswap、Aave など)
ステップ4:必要な承認の記録を残す
残す承認の記録項目:
- プロトコル名
- コントラクトアドレス
- 承認数量
- 用途
ステップ5:毎回の監査後に確認する
- 撤回後、Revoke.cash にその承認が表示されなくなっているか
- Etherscan でコントラクトの allowance(user, spender) = 0 になっているか確認する
Q:撤回する前に、あるプロトコルが「既知」かどうかをどう判断すればいいですか?
判断方法:
- プロトコル名:Revoke.cash に表示されるプロトコル名(例:「Uniswap V3 Router」)
- コントラクトアドレス:Etherscan で検索し、コントラクトが検証済みか、主流プロトコルかを確認する
- DefiLlama のプロトコルページ:TVL と運営期間を確認する
- 公式ドキュメント:プロジェクト側が公表しているコントラクトアドレス
識別できないコントラクト + Unlimited 承認 = 高リスク、すぐに撤回してください。
6. チェーンごとの Approve 管理
イーサリアムメインネット + EVM 互換チェーン:
- 仕組みは同じ:ERC20 規格 + Approve / transferFrom
- ツール:Revoke.cash が共通で使える
- Gas コスト:イーサリアムメインネットが最も高く、L2/Polygon/BSC は安い
Solana チェーン:
- 仕組みが異なる:SPL トークンは「Token Account」モデルを使う
- Approve / transferFrom はない:Solana は「署名承認」を使う
- 撤回ツール:Solscan/Phantom 内蔵の Revoke
ビットコインチェーン:
- スマートコントラクトなし:BTC には Approve が不要
- Lightning/Liquid などのレイヤー2:異なる仕組みがある
Move 系(Sui/Aptos):
- 仕組みが異なる:Object モデル
- 異なる撤回ロジックが必要
Q:Solana に Approve のリスクはありますか?
あります。Solana の「署名承認」も類似のリスクがあります:
- フィッシングサイトがユーザーに「Token Approval」への署名を促す
- ユーザーが署名すると、悪意あるコントラクトがトークンを引き出せる
- 撤回は Solscan またはウォレット内で操作する必要がある
主な Solana のフィッシング:
- 「無料 NFT Mint」ページ
- 「Solana エアドロップ」の受け取り
- Jupiter/Raydium を装った偽サイト
防御の原則はイーサリアムと同じです。
7. Approve 最適化のベストプラクティス
1. 毎回 Approve は具体的な数量で行う
MetaMask の Approve 表示を設定する:
- MetaMask で Approve に署名する際、デフォルトの Unlimited を具体的な数量に変更する
- 例:100 USDC を取引するなら、100 USDC を Approve する(Unlimited ではなく)
2. メイン・サブウォレットの分離
- メインウォレット(資産の80%):いかなるコントラクトにも Approve しない
- サブウォレット(資産の20%):日常の DeFi のやり取りに使う
- エアドロップ狩りウォレット(資産の1%未満):高リスクなテスト用
3. 古いプロトコルの承認を撤回する
毎月の監査:
- 6か月以内使っていないプロトコルの承認を撤回する
- 廃止されたプロトコルの承認を撤回する
- 疑わしいドメインの承認を撤回する(過去に合法に見えたものでも)
4. 「まとめ署名」に警戒する
- 一つの取引に複数の Approve が含まれる
- ユーザーが見分けにくい
- 一度の署名ですべて失う可能性
5. 署名解析ツールを使う
- Rabby Wallet:署名の実際の効果を表示する
- Pocket Universe:有料、詳細な解析
- Wallet Guard:フィッシングサイト + 署名の警告
Q:すべての Approve を一括で撤回できますか?
「一括で全て撤回」という機能はありません:
- 各 Approve は独立したオンチェーン取引です
- 一つずつ撤回する必要があります
- 複数の撤回を同じブロック内にまとめることは可能(ただし依然として複数の取引)
一部のツールはバッチ「キュー」機能を提供:
- Revoke.cash:複数の承認を選択 → 順に署名 → 順にオンチェーン反映
- 1件ごとに Gas を消費する
8. 特殊なケース:NFT の Approve
NFT にも Approve の仕組みがあります:
- setApprovalForAll:あるコントラクトに、特定の NFT コレクションのすべてを管理する権限を与える
- 例:OpenSea で NFT を出品する → OpenSea コントラクトに setApprovalForAll する必要がある
NFT Approve のリスク:
- Unlimited な性質:setApprovalForAll は「そのコレクションのすべての NFT への無制限承認」
- プロトコルのハッキング:OpenSea/Blur などがハッキングされると、すべてのユーザーの NFT が引き出される可能性がある
- フィッシングのシナリオ:OpenSea/Blur を装ってユーザーに setApprovalForAll させる
実際の事例:
2024 年 5 月、あるユーザーが OpenSea を装った偽サイトで setApprovalForAll に署名し、悪意あるコントラクトに自分の BAYC NFT を管理する権限を与えてしまいました。その後 BAYC は即座に攻撃者のアドレスへ移され、損失は約 12 万ドルに上りました。
NFT Approve の撤回:
- Revoke.cash が対応
- Etherscan Token Approval Checker が対応
- 操作は ERC20 の Approve 撤回と同様
Q:OpenSea/Blur で NFT を売るには承認が必須ですか?
はい。主要な NFT マーケットプレイスでは出品に承認が必須です:
- OpenSea:OpenSea コントラクトに setApprovalForAll
- Blur:Blur コントラクトに setApprovalForAll
- Magic Eden:Magic Eden コントラクトに setApprovalForAll
安全な方法:
- NFT を売り終えたらすぐに setApprovalForAll を撤回する
- 再出品する際にまた承認する
- 手間はかかるが安全
9. よくある FAQ
Q:Approve 一回あたり最低どれくらいの Gas がかかりますか?
イーサリアムメインネットの標準的な Approve Gas:
- 基本の Approve:約 46000 Gas
- 現在の Gas Price が 30 Gwei のとき:約 5 ドル
L2/Polygon/BSC 上の Approve は通常 1 ドル未満です。
Q:撤回した Approve は再び有効にできますか?
直接有効にすることはできません。撤回後は「一度も承認していない」状態と同じになり、再度 Approve する必要があります:
- 署名し直し + オンチェーン反映 + Gas の支払い
Q:すべての ERC20 トークンに Approve が必要ですか?
はい。すべての ERC20 規格トークンは Approve の仕組みに従います:
- USDC/USDT/WETH/DAI などのステーブルコイン
- UNI/LINK/AAVE などのガバナンストークン
- あらゆるプロジェクトのトークン
例外:
- ETH(イーサリアムのネイティブコイン):Approve 不要(直接 transfer)
- BTC:Approve 不要(スマートコントラクトなし)
- Solana SPL:仕組みが異なる(「署名承認」)
Q:Approve するとトークンはロックされますか?
されません。Approve はトークンをロックしません:
- Approve は単にコントラクトによる引き出しを「許可」するだけ
- トークンは依然としてユーザーのウォレットにあり、通常通り使える
- ユーザーはいつでもトークンを送金できる(Approve があっても)
Approve は「クレジットカードの限度額」に似ています:お店に信用枠を与えるだけで、お金は自分の銀行口座に残っています。
Q:Permit 署名はどうやって撤回しますか?
Permit 署名は直接「撤回」できませんが、間接的な方法があります:
- コントラクトの nonce を変更する:コントラクトの incrementNonce を呼び出して Permit を無効化する
- ウォレットを使わない:Permit には有効期限があり、期限切れで自動的に無効になる
- 新しいウォレットを作る:資産を新しいウォレットに完全に移す
Permit の安全性の鍵は予防にあります:Permit の署名をする前に毎回よく確認してください。
Q:USDT と USDC の Approve のリスクは同じですか?
全体的には似ていますが、細部の違いがあります:
- USDT:approve(spender, X) をする前にまず approve(spender, 0) が必要(標準的な ERC20 にはこの手順は不要)
- USDC:標準的な ERC20 + Permit 対応(EIP-2612)
- DAI:初期バージョンは Permit に対応(独自の実装)
Q:あるウォレットの過去すべての Approve 履歴を確認できますか?
できます:
- Etherscan:アドレスページ → "Token Txns" → Approve でフィルター
- Revoke.cash:現在有効な承認のみ表示(撤回済みは表示されない)
- DeBank:アドレスのプロフィール + 承認履歴
Q:Approve を撤回するとすぐに反映されますか?
はい。Revoke がオンチェーンで確定するとすぐに反映されます:
- オンチェーンの allowance(user, spender) が即座に 0 になる
- コントラクトは transferFrom を再度呼び出せなくなる
- 全ノードが同期される(5〜30 秒)
Q:複数のウォレットの承認を一括で Revoke できますか?
できません。各ウォレットは独立しています:
- 各ウォレットを個別に Revoke.cash に接続する必要がある
- 承認一覧を個別に監査する
- 個別に撤回する
複数ウォレットを持つユーザー:毎月各ウォレットを個別に監査してください。
データソース
- ERC20 標準プロトコル(EIP-20)
- EIP-2612 Permit 標準
- Revoke.cash ツールドキュメント
- SlowMist の Approve フィッシング事例集
- Chainalysis のオンチェーン事件分析
リスク注意:本記事は独立した第三者による整理であり、投資助言を構成するものではありません。Approve は DeFi における主要な攻撃ベクトルであり、定期的な監査と撤回は基本的なセキュリティ実践です。すべてのデータは 2026 年4月時点のものです。