﻿---
title: "ERC-20承認競合"
description: "ERC-20の支出者は、置き換え承認が確定する前に古い利用許可額を使い、その後で新しい利用許可額も使う可能性があります。競合の仕組みと、承認をより安全に変更・取り消す方法を解説します。"
image: "https://wiki.fcontext.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://wiki.fcontext.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ERC-20承認競合

> 教育目的の参考情報であり、投資助言ではありません。投資により損失が生じる可能性があります。

<a id="answer"></a>

## 直接の答え

ERC-20承認競合は、所有者が`approve(spender, newAmount)`を呼び出して、ゼロではない利用許可額を別のゼロではない額に置き換えるときに起こり得ます。支出者は保留中の変更を確認し、まず`transferFrom`で古い利用許可額を使い、置き換え承認が確定した後に新しい利用許可額も使う可能性があります。

そのためERC-20仕様は、クライアントインターフェースが同じ支出者に新しい値を設定する前に、まず利用許可額を`0`にすることを推奨しています。各トランザクションは順番に確定を待つ必要があります。トークンが対応している場合は、アトミックな`increaseAllowance`または`decreaseAllowance`の呼び出しにより、ゼロではない利用許可額を直接置き換えずに済みます。

<a id="mechanism"></a>

## 仕組み

ERC-20では、`approve`は上書きとして定義されています。つまり、成功した`approve(spender, amount)`は支出者の利用許可額を`amount`に設定します。一方、`transferFrom(owner, recipient, amount)`を使うと、その支出者は所有者のトークンを移動でき、通常は残りの利用許可額が減ります。保留中のトランザクションでは実行順序が確保されないため、支出者は所有者による承認変更より先に実行される送金を送信できる場合があります。

危険なのは`N -> M`への移行で、`N > 0`かつ`M > 0`の場合です。置き換え承認が実行される前に支出者が`N`を使い切ると、その後の承認によって新たに`M`の利用許可額が設定されます。したがって、この一連の流れで使われる最大額は、所有者のトークン残高とトークンの実装を上限として`N + M`になり得ます。

<a id="example"></a>

## 例

Aliceは、あるプロトコルに`100`トークンの支出を承認しています。`approve(protocol, 50)`を送信し、残りの利用許可額を`50`に引き下げようとします。そのトランザクションが確定する前に、プロトコルの支出者が`transferFrom(Alice, recipient, 100)`を送信し、先に実行させます。その後、Aliceの承認によって利用許可額が`50`に設定され、支出者は別の送金でそれを使えます。二回の送金は合計`150`トークンになります。

より安全な置き換え手順は、`approve(protocol, 0)`を送信して確定を待ち、その結果の利用許可額と残高を確認してから、新しい承認がまだ適切な場合にのみ`approve(protocol, 50)`を送信することです。ゼロ化トランザクションの確定前に支出者が古い利用許可額を使った場合、Aliceは残高の変化を確認し、新たな`50`を承認する前に中止できます。

<a id="risks"></a>

## リスク

- 利用許可額を`0`にしても、すでに実行された支出を取り消すことはできず、ゼロ化トランザクションの確定前に古い利用許可額が使われることも防げません。
- 最初の確定を待たず、ゼロ化と置き換えの承認をまとめて送信すると、実行順序のリスクが再び生じます。
- `increaseAllowance`と`decreaseAllowance`は基本のERC-20標準には含まれません。検証済みのトークンコントラクトが対応している場合にのみ使用してください。
- 無制限の利用許可額が有効な間は、所有者の全トークン残高が危険にさらされる可能性があります。署名前にチェーン、トークンコントラクト、支出者、金額を確認してください。
- 一部のトークンには標準とは異なる承認動作があります。ウォレットのシミュレーションとトランザクションのcalldataを確認し、各手順の後でオンチェーンの利用許可額を確認してください。

<a id="misconceptions"></a>

## よくある誤解

- 「最新の承認トランザクションは古い承認を即座に置き換える。」状態が変わるのは、そのトランザクションがオンチェーンで実行されたときだけです。
- 「利用許可額を引き下げれば、今後の支出総額は新しい額までに制限される。」支出者は変更が実行される前に古い利用許可額を使う可能性があります。
- 「最初にゼロにすれば、それ以上トークンが流出しないことが保証される。」ゼロ化トランザクションが確定するまで、古い利用許可額は引き続き使用できます。
- 「すべてのERC-20に`increaseAllowance`と`decreaseAllowance`がある。」これらは任意の拡張機能であり、ERC-20の要件ではありません。
- 「ウェブサイトとの接続を解除すればトークン承認も取り消される。」ウォレットの接続状態と、トークンコントラクトのオンチェーン利用許可額は別のものです。

<a id="related"></a>

## 関連トピック

- [正規トークンとラップドトークンを見分ける方法](/ja/crypto/canonical-vs-wrapped-token/)
- [メンプール](/ja/crypto/mempool/)
- [Permit2署名のリスク](/ja/crypto/permit2-signature-risk/)
- [Reduce-only注文](/ja/crypto/reduce-only-order/)
- [ウォレット承認](/ja/crypto/wallet-approval/)

<a id="sources"></a>

## 出典

- [ERC-20: Token Standard](https://eips.ethereum.org/EIPS/eip-20) - Ethereum Improvement Proposals (参照日: 2026-08-20)
- [ERC20 | OpenZeppelin Docs](https://docs.openzeppelin.com/contracts/4.x/api/token/erc20) - OpenZeppelin (参照日: 2026-08-20)

Source: https://wiki.fcontext.com/ja/crypto/erc20-approval-race-condition/index.mdx
