暗号資産のトークン承認とAllowance:確認・取り消し方
ERC-20の承認がスマートコントラクトに許可する操作、無制限Allowanceやpermit署名、承認を取り消す際の注意点を解説します。
このガイドの内容ウォレット接続とトークン承認は別の権限です
短い要約
ERC-20の`approve`は、通常トークンをすぐ送る命令ではありません。特定のspenderコントラクトが後から`transferFrom`で使える数量を記録します。ウォレットをサイトから切断してもオンチェーンのAllowanceが残ることがあり、値をゼロにしても完了済みの送金は取り消せません。
ウォレット接続とトークン承認は別の権限です
サイトにウォレットを接続すると、アプリは通常公開アドレスを確認し、署名を要求できます。それだけで、保有するすべてのERC-20を移動する権限が渡るわけではありません。トークン承認はトークンコントラクト内に別途記録されます。MetaMaskもサイト接続の解除とトークン承認の取り消しを区別しています。
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のAllowanceを設定すると、一般的なERC-20では残高と未使用Allowanceの小さい方が利用上限になります。権限が1回の取引だけを指すとは限りません。コントラクトは複数回transferFromを呼べます。承認したコントラクトや呼び出し経路が悪用されれば、想定外の移動につながることがあります。規格外のトークン動作や追加制限も確認してください。
承認は通常トークンコントラクトへのオンチェーン取引で、ネットワーク手数料が発生することがあります。アプリによって承認とスワップを別々に行う場合も、署名型の権限を後続取引と組み合わせる場合もあります。「承認」というボタン名だけで判断せず、署名内容とネットワークを確認してください。
無制限Allowanceは即時出金を意味しません
ウォレットの「Unlimited」は、トークンの最大整数に近いAllowanceを表すことがよくあります。無限のトークンが生まれたり、承認時に残高が送金されたりするわけではありません。ただし同じトークンとチェーンで、後からウォレットに入った残高にもspenderの権限が及ぶ可能性があります。最大値を減算せず保持する実装もあるため、トークンの動作を確認しましょう。
アプリは承認手順を減らすため大きな上限を求めることがありますが、利便性とリスクを一緒に考える必要があります。spenderコントラクトの脆弱性や運用権限の悪用により、以前の承認が後日使われる場合があります。Ethereum.orgの取り消しガイドは、資産をウォレットに戻した後も広いAllowanceが関係し得ることを説明しています。
上限を小さくすればすべての危険がなくなるわけではありません。偽トークンや誤ったspenderを承認すれば小さな上限でも損失につながり、取引ごとに承認すれば手数料や操作ミスの機会が増えます。使う予定の数量、アプリを使う頻度、spenderへの信頼、権限を再確認できるかを合わせて検討しましょう。

署名前にチェーン・トークン・spender・数量を確認します
署名前に4点を確認します。選択中のネットワークがアプリの案内と一致するか、銘柄名だけでなくトークンコントラクトのアドレスが正しいか、spenderアドレスが公式資料や確認可能なコントラクト情報と一致するか、そして上限が予定した操作に対して妥当かを見ます。
DM、QRコード、サポートチャット、未確認広告のリンクからウォレットを接続しないでください。フィッシングサイトは本物に似た画面を表示します。保存した公式アドレスやプロジェクトの公式資料からアクセスし、表示名が見覚えのあるものでもコントラクトアドレスを信頼しないでください。ブロックエクスプローラーの検証表示も安全性の保証ではありません。
ハードウェア署名端末は通常のブラウザーから秘密鍵を分離する助けになりますが、承認するspenderや数量が安全かどうかは別に判断する必要があります。端末が要求内容を理解できる形で表示しない場合は署名を止め、ウォレット提供元の公式説明を確認してください。読める詳細が少なければ確認できる範囲も限られます。
`permit`は承認の経路を変えますが、権限は作ります
一部のERC-20はEIP-2612のpermitをサポートします。通常のapprove取引の代わりに、所有者がtyped dataへ署名し、別の人がその署名を送信してAllowanceを設定できます。標準メッセージには所有者、spender、数量、nonce、deadlineが含まれ、チェーンとコントラクトに結びついたドメイン情報も使われます。
ERC-2612のdeadlineは署名をpermit呼び出しとして提出できる最終時刻です。成功したpermitで既に設定されたAllowanceが、その時刻に自動で失効するという意味ではありません。Allowanceは使用、変更、取り消しまで残ることがあります。独自のpermit方式や追加期限を持つトークンもあるため、画面に「permit」と表示された署名をすべてERC-2612と同じだと考えないでください。
署名によって別のアカウントに手数料を支払わせることはできますが、署名が無害なログイン確認になるわけではありません。ウォレットがトークン、spender、数量、期限を明確に表示しない場合や、サイトの説明と異なる場合は拒否し、公式資料を確認してください。まだ提出されていない署名も、期限前に誰かが提出できる可能性があります。
サイトを切断してもオンチェーンAllowanceは取り消されません
ログアウトやウォレット接続の解除は、ブラウザーのセッションや接続権限を変えます。トークンコントラクトに保存済みのAllowanceは残ることがあります。反対にAllowanceを取り消しても、サイトが知っている公開アドレスや過去のオンチェーン履歴は消えません。MetaMaskの接続解除ガイドもこの違いを説明しています。
取り消しは通常、そのトークンとspenderのAllowanceをゼロにするオンチェーン取引を送ります。手数料が必要で、確認されるまでは以前の権限が有効な場合があります。その後、承認一覧を更新するかトークンコントラクトを再照会し、同じウォレット、チェーン、トークン、spenderの値がゼロか確かめます。MetaMaskの承認ガイドとEthereum.orgはネットワーク別の承認確認方法を案内しています。使うツールの公式ドメインと選択ネットワークを確認してください。
各チェーンは別々に状態を保存します。EthereumのAllowanceをゼロにしても、別ネットワーク上の同じトークンの権限は変わりません。該当するアカウント、トークン、spender、チェーンを確認し、取引が反映された後に結果を再確認します。取り消しツールがシードフレーズや秘密鍵を求めることはありません。
取り消しで止められるのは今後の使用で、過去の送金ではありません
Allowanceがゼロになった状態の確認後は、その権限に基づく新たなtransferFromはできません。しかし完了済みの送金を戻したり、受取人からトークンを回収したり、無関係なコントラクト権限を消したりはできません。不審な承認でトークンが既に移動した場合、Allowanceの取り消しだけで回復するとは限りません。
ウォレットの秘密鍵が漏れていれば、攻撃者は別の方法で取引に署名できます。同じトークンの別spender、別トークンの承認、NFTのoperator権限、permit署名、コントラクト固有の権限も個別に残ることがあります。権限一覧は確認した正確なウォレットとチェーンの範囲で読みましょう。
spenderを取り消すと、次回のスワップ、預け入れ、償還で新しい承認が必要になる場合があります。取り消す前に、未完了の取引や利用中のポジションでその権限が使われていないかを確認し、必要ならプロトコルの公式ヘルプを参照します。変更後の動作を理解して権限を管理することが大切です。
上限の変更ではERC-20の競合条件を考慮します
ERC-20規格は、0でないAllowanceを別の0でない値へ変更する前に、一度ゼロにするUIを推奨しています。古い承認と新しい承認の間にspenderの取引が入ると、想定より多く使われる可能性があるためです。たとえば100から25へ変える際、spenderが新しい25の設定前に古い100を使うと、両方の値が順番に利用される余地が生じます。
まずゼロにして確認後に新しい上限を設定すれば、古い値と新しい値が重なって有効になる可能性を減らせます。ただしゼロの取引が確認される前に古いAllowanceが使われることは取り消せません。2段階分の手数料がかかることがあり、トークンの動作も異なります。ウォレットやトークンの公式な安全手順に従い、次の操作の前に確認を待ちましょう。
現在のAllowanceが分からないときは、変更前に選択中のネットワークでトークンコントラクトの状態を照会します。表示が空または予想外なら、別のチェーンやアドレスを見ていないか確認します。所有者アドレスとトークンコントラクトの両方が対象と一致している必要があります。
ウォレットとトークン権限を短い手順で確認する
- プロジェクトの公式ドメインと選択中のチェーンを確認します。
- トークンコントラクトとspenderのアドレスを確認し、予定した操作に対して上限が大きすぎないか見ます。
- ウォレットが表示する実際の取引またはtyped dataを読みます。理解できない要求には署名しません。
- 使い終えたspenderや信頼しなくなったspenderのAllowanceを該当ネットワークで確認し、必要ならゼロにして結果を再確認します。
- ウォレットを選ぶときはチェーン対応だけでなく、承認内容の表示、更新方針、バックアップと復元の説明も比べます。
ハードウェアウォレットは鍵の保管と署名確認の選択肢であり、契約の安全性や広い上限の承認を保証するものではありません。署名画面に判断を任せず、spender、トークン、ネットワーク、数量を自分で確認します。承認がサイト接続とは別に残ると理解すれば、ウォレットの保護機能と限界も比べやすくなります。
よくある質問
Q1ウォレット接続を切ると既存のトークン承認も消えますか?
いいえ。サイト接続はウォレットのセッションで、ERC-20のAllowanceはトークンコントラクトのオンチェーン状態です。必要に応じて対象チェーンとトークンのspender権限を別途確認し、取り消してください。
Q2Allowanceをゼロにすれば既に移動したトークンを取り戻せますか?
いいえ。変更確認後の追加使用を止めるだけで、完了済みの送金は戻せません。他の承認や秘密鍵の漏えいも別に確認してください。
Q3すべての暗号資産トークンやNFTがERC-20のAllowanceを使いますか?
いいえ。この記事はERC-20のapproveとtransferFromが対象です。NFTのoperator承認、ネイティブ資産、別のトークン規格、チェーン固有の権限はそれぞれの規則を確認してください。
出典
問題を報告
この記事のリンクを含むメールを準備します。送信すると Mark に報告が届きます
クイックチェック
記事を読み終えたら、3問で確認しましょう
問題 01
ERC-20の`approve(spender, amount)`が主に設定するものは何ですか?
答えを選ぶと解説を確認できます