[ERC7410] spenderが自らのトークンallowance量を変更する仕組みを理解しよう！

# はじめに

初めまして。
**CryptoGames**というブロックチェーンゲーム企業でエンジニアをしている **cardene（かるでね）** です！
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

https://cryptogames.co.jp/

代表的なゲームは**クリプトスペルズ**というブロックチェーンゲームです。

https://cryptospells.jp/

今回は、**ERC20**トークンの**spender**が、自らのトークンの`allowance`量を変更することができる仕組みを提案している**ERC7410**についてまとめていきます！

:::note info
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
:::

https://eips.ethereum.org/EIPS/eip-7410

他にも様々なEIPについてまとめています。

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4

# 概要

**ERC20**というのは、イーサリアム上で標準的なトークンを作成するための規格です。
この規格は、トークンの送信や残高の確認などの基本的な機能を定義しています。
また、「`allowance`」という機能があります。
これは、トークンの所有者が他のアドレス（**spender**と呼ばれます）に対して、自分のトークンをある量まで使う（または送る）許可を与えることができる機能です。

この規格で提案されているのは、「**decreaseAllowanceBySpender**」という新しい機能を**ERC20**に追加することです。
この機能の目的は、**spender**が既に許可されているトークンの量を、所有者の介入なしに減らす（または完全に削除する）ことを可能にすることです。
これにより、より柔軟なトークン管理が可能になります。

具体的には、トークンの所有者があるアドレスに対して`100`トークンの使用を許可したとします。
しかし、何らかの理由で、そのアドレスにはもうその全量が必要なくなったとします。
この時、**decreaseAllowanceBySpender**機能を使うと、そのアドレス自身が許可された量を減らすことができます。
たとえば、`50`トークンに減らしたり、完全に`0`に設定したりすることができるわけです。

この機能の利点は、トークンの流動性と安全性を高めることにあります。
許可されたトークンの量を必要に応じて調整できるため、不必要に多くのトークンが第三者によって使われるリスクを減らすことができます。
また、トークンの所有者が毎回介入して許可を変更する必要がないため、より効率的なトークンの運用が可能になります。

:::note info
**ERC20**については以下の記事を参考にしてください。
:::

https://chaldene.net/erc20

# 動機

**ERC20**トークンでは、トークンの所有者が「**spender**」として知られる他のアドレスに、自分のトークンを代わりに使う権限を与えることができます。
これは「許可（`allowance`）」と呼ばれる機能です。
しかし、この許可されたトークン量を減らすプロセスは、現在のところトークンの所有者だけが行うことができます。
これにはいくつかの問題があります。
例えば、トークンの所有者がトレジャリーウォレットや複数の署名が必要なウォレット（マルチシグネチャウォレット）の場合、一度に多くの許可を与えてしまった後でその許可を減らすのは時間がかかり、複雑なプロセスを要することがあります。

この問題を解決し、セキュリティ対策を強化するために、新しいERC提案は**spender**が自分から許可されたトークン量を減らしたり、取り消したりすることを可能にします。
これにより、将来的にハックなどのリスクが発生した場合に、追加のセキュリティ層を提供することができます。
また、トークンの所有者側から許可を減らすために全員の合意や複雑な手続きを必要とすることなく、より柔軟に許可を管理できるようになります。

:::note info
この提案はspenderがより積極的にトークンの使用許可をコントロールできるようにし、セキュリティを向上させると同時に、トークンの所有者にとっての管理負担を軽減します。
これは、**ERC20**トークンのセキュリティと利便性の両方を向上させることを目的としています。

# 仕様

このERCを使用するコントラクトは、**IERC7410**インタフェースを実装する必要があります。

## インターフェース

```ts
pragma solidity ^0.8.0;

/**
 * @title IERC-7410 Update Allowance By Spender Extension
 * Note: the ERC-165 identifier for this interface is 0x12860fba
 */
interface IERC7410 is IERC20 {

    /**
     * @notice Decreases any allowance by `owner` address for caller.
     * Emits an {IERC20-Approval} event.
     *
     * Requirements:
     * - when `subtractedValue` is equal or higher than current allowance of spender the new allowance is set to 0.
     * Nullification also MUST be reflected for current allowance being type(uint256).max.
     */
    function decreaseAllowanceBySpender(address owner, uint256 subtractedValue) external;

}
```

このコードは、`IERC7410`という新しいインターフェースを定義しています。
このインターフェースは`IERC20`を拡張しており、**ERC20**トークンの機能に「**spenderによる許可の減少**」を追加することを目的としています。
ここでいう「**spender**」とは、トークンの所有者に代わってトークンを使用する権限を持つアドレスのことです。

### `decreaseAllowanceBySpender`関数
この関数は、呼び出し元（**spender**）が特定のトークン所有者（**owner**）から与えられた許可（`allowance`）を減らすために使用します。
引数には`owner`のアドレスと減少させたい`subtractedValue`（減少値）が必要です。
許可の減少後に`IERC20-Approval`イベントが発行されます。
要件として、`subtractedValue`が現在の許可量以上の場合、新しい許可量は`0`に設定されます。
また、現在の許可量が`type(uint256).max`（最大値）の場合、そのnullification（無効化）も反映されなければなりません。

### 関数の修飾子
`decreaseAllowanceBySpender`関数は`public`または`external`である必要があります。
これは、関数がコントラクト外部からアクセス可能であることを意味します。

### イベント発行
この関数が呼び出されると、`Approval`イベントが必ず発行されなければなりません。
これにより、許可の変更が透明になり、ブロックチェーン上で追跡可能になります。

### `supportsInterface`メソッド
`supportsInterface`メソッドは、インターフェースが特定の機能をサポートしているかどうかを確認するために使用されます。
この場合、`0x12860fba`が`IERC7410`インターフェースの識別子として与えられ、このインターフェースをサポートしている場合には`true`を返す必要があります。

このインターフェースの導入により、**ERC20**トークンの許可管理がより柔軟になり、セキュリティが強化されます。
**spender**が自身に与えられた許可を直接調整できるようになることで、トークンの所有者が不在であっても、不必要に高い許可を速やかに減らすことが可能になります。
これにより、トークンシステム全体のセキュリティリスクが低減されます。

# 補足

### `decreaseAllowanceBySpender`関数の導入
- **目的**
    - この機能は、**spender**（トークンを使う権限を持つアドレス）に、自らの許可（`allowance`）を取り消したり、減少させたりする自律性を与えます。
    - これにより、**spender**は自分自身に与えられた認証レベルをより直接的にコントロールできるようになります。
- **設計選択の背景**
    - スペンダーにより多くの直接的な制御を提供することは、より安全で柔軟なトークンの使用を可能にすることを目指しています。

### `subtractedValue`の要件
- **セキュリティ実装**
    - `subtractedValue`（減らす量）が現在の許可量よりも低い必要があります。
    - これは、許可量を減少させるプロセスを安全に実施するためのものです。
- **nullificationの達成**
    - `subtractedValue`が現在の許可量に等しいか、それを超える場合、新しい許可量は`0`に設定されます。
    - このアプローチは、許可の減少を簡素化すると同時に、追加のセキュリティ層を提供します。

### 命名規則の維持
- **一貫性と理解の容易さ**
    - **ERC20**の承認に関する命名パターンを維持するという決定は、**ERC20**標準を理解している開発者にとっての一貫性と理解の容易さを促進することを目的としています。

### 設計の理由
この設計の選択は、トークンのセキュリティと管理の柔軟性を高めることを目的としています。
**spender**が自らの許可レベルを管理できるようにすることで、トークンシステム内の潜在的なリスクや不便を減少させることができます。
また、開発者が既存の**ERC20**標準との一貫性を維持しながら、新しい機能を容易に理解し統合することができるようにすることも、この設計の重要な部分です。

# 互換性

この規格は**ERC20**と互換性があります。

# 実装

以下に実装コードが格納されています。

https://eips.ethereum.org/assets/eip-7410/ERC7410.sol

# セキュリティ

このERCを使用するユーザーは、所有者（**owner**）に対して許可されたトークンの量を減らす時に、その量を慎重に検討する必要があります。

:::note info
あるトークンの所有者が、別のアドレス（ここでは「**spender**」と呼びます）に自分のトークンを使う権限を与えたとします。
この新しいERCの規格では、**spender**は自分に与えられた使用許可（`allowance`）を、所有者の介入なしに自分で減らすことができます。
:::

このプロセスにおいて重要なのは、**spender**がどれだけのトークン量を減らすかを慎重に考えることです。
これは、以下のいくつかの理由があります。

- **セキュリティ**
    - 不必要に高い許可量は、セキュリティリスクを高める可能性があります。
    - もし**spender**のアカウントが攻撃者によって制御された場合、許可されているトークンの量が多いほど、悪用される可能性が高くなります。
    - したがって、必要な量だけ許可し、不要になったら減らすことが重要です。

- **効率性と節約**
    - **spender**は、トークンの使用計画に基づいて、減らすトークンの量を決定するべきです。
    - これにより、所有者と**spender**間の信頼関係が保持され、トークンの無駄遣いを防ぐことができます。

- **透明性と説明責任**
    - トークンの使用許可を調整することは、ブロックチェーン上で記録され、公開されます。
    - これにより、トークンの流れがより透明になり、関係者間での説明責任が高まります。

:::note info
このERCを利用する時には、**spender**が所有者に対してどれだけのトークン使用許可を減らすかを慎重に考えることが、セキュリティ、効率、そして透明性を確保する上で非常に重要になります。
:::

# 引用

Mohammad Zakeri Rad (@zakrad), Adam Boudjemaa (@aboudjem), Mohamad Hammoud (@mohamadhammoud), "ERC-7410: ERC-20 Update Allowance By Spender [DRAFT]," Ethereum Improvement Proposals, no. 7410, July 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7410.

# 最後に

今回は「**ERC20**トークンの**spender**が、自らのトークンの`allowance`量を変更することができる仕組みを提案している**ERC7410**」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下のTwitterのDMなどからお気軽に質問してください！

[Twitter @cardene777](https://twitter.com/cardene777)

他の媒体でも情報発信しているのでぜひ他も見ていってください！

https://chaldene.net/

https://zenn.dev/heku

https://cardene.substack.com/

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4