ERC-20の承認メカニズムとは何か、その設計が無限承認を「デフォルト慣行」にする理由は?
ERC-20トークン標準にはapprove()関数があり、保有者が特定のアドレス(通常はスマートコントラクト)が代わりに一定量のトークンを動かすことを事前承認できます。ほとんどのDeFiのインターフェースはデフォルトでuint256の最大値を要求します——一度の承認で無制限に使えますが、そのトークンの将来の全残高を露出させるコストがあります。
承認の濫用に最もよくある攻撃シナリオは何か?
コントラクトの脆弱性ハック:承認したプロトコルがコードの脆弱性で侵害されて、攻撃者が承認を使ってすべての承認ユーザーのウォレットから大規模に資金を引き出します。フィッシングサイトの悪意ある承認:Uniswapを偽装した偽サイトでApproveを実行し、実際には悪意のあるコントラクトアドレスを承認することになります。廃棄されたプロトコル:長期間使用していない古いプロトコルを承認し、そのコントラクトが後に悪意ある行為者に取得・引き継がれます。
正確な承認と無限承認の実際の違いは何か、毎回正確な承認が必要か?
正確な承認(カスタム金額):コントラクトがこの操作に必要な正確な金額までしか動かせないよう承認します。コントラクトがハッキングされても損失の上限はその金額です。無限承認:一度の承認で繰り返し承認不要のスムーズなUX。実際のアドバイス:ほとんどのDeFiユーザーは毎回正確な承認を選ぶ必要はありませんが、規模の小さいプロトコルの使用時、大額のトークンを移動する時、初めて使用するプロトコルの時には強く推奨されます。
Revoke.cashなどのツールの安全性は?これらのツールを使うこと自体にリスクがあるか?
Revoke.cashはオープンソースで広く監査・使用されているツールです。主な機能はオンチェーンの承認記録を読み、approve(contract, 0)の取り消しトランザクションを送るのを助けることです——あなた自身のウォレット内で完全に署名される操作で、Revoke.cashのサーバーは秘密鍵を見ることができません。正しいrevoke.cashドメインを確認し、署名が必要な各トランザクションを検証することが重要です。
Uniswap、Aave、その他のDeFiプロトコルで初めて操作をするとき、ほぼ確実に「Approve」というボタンをクリックしている。多くの人はこれを必要なステップとして流してしまうが、この小さな承認には多くの人が理解していないセキュリティリスクが潜んでいる。あなたはスマートコントラクトに対して、アカウント内の全トークンを移動させる恒久的・無制限の権限を与えたかもしれない。そしてその承認は、あなたが積極的に取り消すまで永遠に有効なまま残る。
EthereumのERC-20トークン標準では、トークンは自分のウォレットアドレスに存在し、誰も直接取り出すことはできない。しかしDeFiプロトコル(例:UniswapのSwapコントラクト)は、あなたに代わってウォレットから流動性プールにトークンを移動させる必要がある。そのためには、まずそのコントラクトへのアクセスを承認する必要がある。approve(contract_address, amount)関数は、トークンコントラクトに対してこう伝える——「このアドレスが私のトークンを最大X枚移動させることを許可する」。問題は、ほとんどのDeFi UIが承認トランザクションとGasコストを削減するために、デフォルトで無制限承認(uint256の最大値 = 2¹⁵⁶ − 1)を要求していることだ。これは事実上「このコントラクトが私の全トークンを永遠に移動させることを許可する」という意味になる。
「Uniswapは信頼しているから、この承認は問題ない」と思うかもしれない。しかし問題はここにある:プロトコルへの攻撃は現実のリスクだ。 あるコントラクトに無制限承認を与えた後、そのコントラクトが攻撃者に侵害された場合、攻撃者はそれを使ってあなたのトークン残高全体を一度の操作で引き出せる。しかも、あなたはその承認をしていたことすら覚えていないかもしれない。これは理論的な話ではなく、DeFiの歴史において実際に何度も発生してきた損失パターンだ。承認はトランザクションが完了しても自動的に消えない——あなたが積極的に取り消すまで永続する。
いくつかのツールを使えば、数分で全ての未取消し承認を確認できる。Revoke.cash:ウォレットを接続すると、コントラクト名・承認量(有限または無制限)・最終使用日時を含む全承認記録を自動でリストアップし、ワンクリックで取り消せる。Etherscan Token Approval Checker:Etherscanでアドレスを検索し、Token Approvalsページで確認・取り消しが可能。DeBank:資産トラッカーとして承認管理機能も備える。承認の取り消し自体がオンチェーントランザクションなのでGasが必要で、取り消し1件につき1トランザクションかかる。
いくつか身につけるべき習慣がある。まず、無制限承認より正確な承認を選ぶ:ほとんどのDeFiインターフェースは2つのオプションを提供しているので、「Custom amount」を選んでそのトランザクションに必要な額だけを承認する。コントラクトが侵害されても、損失に上限が生まれる。次に、定期的に承認を見直して整理する:定期的に(例えば四半期ごと)Revoke.cashでスキャンし、使わなくなったプロトコルへの承認を取り消す。第三に、承認前にコントラクトアドレスを確認する:承認しようとしているのがターゲットプロトコルの公式コントラクトアドレスであることを確認する。フィッシングサイトが悪意あるアドレスに差し替えることは、最もよくある攻撃の入口の一つだ。
多くのDeFi操作を経た後、ほとんどの人は大量の承認履歴を蓄積している——その多くは無制限で、使わなくなったか、すでに閉鎖・ハックされたプロトコルへのものだ。これらの「ゾンビ承認」はあなたの資産の潜在的な露出面だ。秘密鍵が漏れていなくても、コントラクトへの攻撃によって資金を失う可能性がある。 今日5分でRevoke.cashにアクセスして承認を整理することは、最もコストが低く効果が高いDeFiセキュリティ対策の一つだ。DeFi初心者へ:正確な承認量を選び、使用後に取り消す習慣を身につけることは、事後対処よりもはるかに重要だ。