# [ERC7538] ERC20とERC1155のトークンをより細かい単位で管理する仕組みを理解しよう！

> ERC20とERC1155はイーサリアムのブロックチェーン上で使われるトークン標準です。これらはデジタル資産やトークンを作成し、交換するためのルールを定義しています。

- URL: https://cardene.dev/articles/cc3162c299ac176ab5bc
- 公開日: 2024-03-25
- 更新日: 2024-03-25
- トピック: Blockchain
- タグ: ethereum, solidity, smartcontract, ブロックチェーン

## はじめに

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

https://cryptogames.co.jp/

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

https://cryptospells.jp/

今回は、**ERC20**と**ERC1155**標準に`multiplier`フィールドを導入し、より細かくトークンを管理する仕組みを提案している**ERC7538**についてまとめていきます！

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

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

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

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

## 概要

#### 基礎概念
**ERC20**と**ERC1155**はイーサリアムのブロックチェーン上で使われるトークン標準です。
これらはデジタル資産やトークンを作成し、交換するためのルールを定義しています。
- **ERC20**は主に独立したトークンに焦点を当て、一般的には通貨のような単一の資産を表します。
- **ERC1155**はより複雑で、複数のトークンタイプを1つのコントラクトで管理できるように設計されており、ゲームのアイテムなどのコレクションに適しています。

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

https://chaldene.net/erc20

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

https://chaldene.net/erc1155

**ERC1046**はトークンのメタデータを拡張するための提案で、トークンに関する追加情報（例えば、そのトークンが何を表しているかなど）を提供することを目的としています。

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

[\[ERC1046\] ERC20のメタデータをERC721のようにする仕組みを理解しよう！](/articles/90e8e7f6f1646f8c8cfe)

#### 提案の説明
あなたが質問したEIPは、**ERC1046**に準拠したトークンタイプ（**ERC20**や**ERC1155**など）に**乗数フィールド**を導入することを提案しています。
この乗数フィールドはメタデータスキーマに追加され、ユーザーが見るトークンの残高表示方法に影響を与えます。

**乗数フィールドの目的**は、トークンの実際の数量とは異なる方法でユーザーに残高を表示することです。
例えば、この乗数を使って、実際の残高が`1,000`トークンであっても、ユーザーには「`10`」と表示させることができます。
これは、トークンの価値表現を調整するためや、ユーザーインターフェース上での表示をより直感的にするために有用です。

#### なぜ重要か？
この提案が重要な理由は、より柔軟なトークン表示を可能にし、デベロッパーがトークンの表現をユーザーのニーズや特定のコンテキストに合わせて調整できるようにするからです。
トークンエコノミーが複雑化している現在、このような柔軟性はユーザーエクスペリエンスを向上させる上で非常に重要です。

:::message
このEIPはトークンのメタデータを拡張し、トークンの表示方法に新たな柔軟性をもたらすことを目指しています。
これにより、デベロッパーはユーザーインターフェースをよりユーザーフレンドリーにし、トークンの使用や理解を容易にすることができます。
:::

## 動機

多くのプロジェクトでは、代替可能なトークン（fungible tokens）と非代替可能なトークン（non-fungible tokens, NFTs）の両方が必要になります。
ここで言う「**代替可能**」とは、各トークンが同一であり、互いに交換可能な性質のことです。
一方、「非代替可能」は各トークンがユニークであり、他のトークンとは異なる属性を持つことを意味します。

### トークンの種類
**代替可能なトークン**は、一般的に通貨やポイントなど、同一の価値を持つアイテムを表します。
例えば、1ETHは他の1ETHと全く同じ価値を持ちます。
**非代替可能なトークン**は、アート作品やコレクターズアイテムなど、固有の特性や価値を持つアイテムに使用されます。
これらは各々が独自の識別情報を持っており、他のNFTとは異なります。

### 問題点
既存のトークン標準は、これらのニーズを広範囲にサポートしていますが、一部の特殊な要件に対応していない場合があります。

#### 分数トークンの不足
多くの標準では、トークンを分割して小さな単位での取引をサポートしていません。
例えば、トークンを`0.5`単位で`transfer`することができない場合があります。

#### 時間によるインフレーション・デフレーション
一部のトークンは、時間が経つにつれて量を増減させる必要があります。
これは、経済的なインセンティブを管理したり、供給を調整するために使用されますが、現在使用されている標準ではこのような機能を直接サポートしていない場合があります。

#### 非標準的なインクリメントでの`transfre`
プロジェクトによっては、特定の小数点以下の数量でトークンを転送するなど、従来の整数単位ではない方法でトークンを操作したい場合があります。

### なぜこれが重要か？
これらの機能は、ゲーム、デジタルアート、デジタル資産管理など、多様なアプリケーションでのトークンの利用を想定しているプロジェクトにとって特に重要です。
分数トークンのサポートにより、より細かい価値の交換が可能になり、インフレーションやデフレーション機構によっては、経済システム内でのトークン価値の動的な調整が可能になります。
非標準的なインクリメントでの`trasnfer`を許可することにより、より柔軟なトークン操作が実現します。

:::message
現在のトークン標準がプロジェクトの要求する柔軟性を完全には提供できていないことを指摘しています。
これにより、分数単位でのトークン取引、トークンの価値変動の管理、非標準的な単位でのトークン`transfer`といったニーズを満たすための新しいアプローチや標準の開発が求められています。
:::

## 仕様

乗数フィールドを使用するトークンでは、`MultiplierMetadata`インターフェイスが、そのトークンのメタデータ（tokenURIが指すJSONファイル）内に実装されている必要があります。

:::message
#### トークンURIとは？
トークンURI（Uniform Resource Identifier）は、トークンのメタデータが格納されている場所のアドレスです。
これはウェブ上のURLと似ており、メタデータを格納するJSONファイルへのリンクを提供します。
:::

:::message
#### MultiplierMetadataインターフェイスとは？
`MultiplierMetadata`インターフェイスは、**ERC1046**標準に基づいて、特定のトークンに対する「**乗数（multiplier）**」フィールドを含むメタデータの実装を要求するものです。
乗数は、トークンの表示バランスを調整するために使用されます。
例えば、実際のトークンの数量に乗数を適用して、ユーザーインターフェイス上での表示を変更することができます。
:::

```ts
interface MultiplierMetadata {
    /**
     * The positive multiplier for generating user-facing representation.
     * Defaults to 1 if undefined.
     * This is an EXACT VALUE, base 10. Beware of floating-point error!
     **/
    multiplier: string | undefined;

    /**
     * Decimals are no longer supported
     **/
    decimals: never;
}
```


ブロックチェーン（特にイーサリアム）上のトークンのメタデータを定義するためのインターフェース、`MultiplierMetadata`について説明しています。
このインターフェースは、トークンの表示方法に影響を与える「**乗数（multiplier）**」を導入することを提案しています。

### 乗数（multiplier）
#### 目的
ユーザーに対して表示されるトークンの量を調整します。
これは実際のトークンの数量とは異なる、ユーザーにとってより理解しやすいまたは意味のある数値を表示するために使用されます。
#### デフォルト値
`multiplier`が定義されていない場合、そのデフォルト値は`1`です。
これは、特に乗数を指定しない場合には、トークンの数量に変更がないことを意味します。
#### 表記
乗数は「**正確な値**」（EXACT VALUE）であり、基数10（10進数）で表されます。
これは、浮動小数点数による誤差を避けるための注意喚起です。
浮動小数点数の計算は誤差を引き起こす可能性があるため、乗数は文字列形式で扱い、精度の高い数値計算を行う必要があります。

### decimalsの非サポート
このインターフェイスでは、`decimals`（小数点以下の桁数を定義する従来の方法）はサポートされていません。
これは、`multiplier`によって表示量の調整が行われるため、従来の`decimals`メソッドの必要がなくなるためです。

#### メソッドの非存在
トークンコントラクトにおいて、`multiplier`を使用する場合、`decimals`という名前のメソッドを持つことは禁じられています。
これは、`multiplier`と`decimals`が異なる方法で表示量を調整するため、同時に存在すると混乱を招く可能性があるからです。

:::message
`MultiplierMetadata`インターフェイスは、トークンのユーザーインターフェイス上での表示をより柔軟に管理する新しい方法を提供します。
これにより、トークンの実際の数値を変更することなく、ユーザーに表示される量を調整することが可能になります。
また、このアプローチは、特に計算の精度を維持しながら、ユーザーがトークンの量をより直感的に理解できるようにするためのものです。
:::

## 補足

#### 文字列による数値表現
ブロックチェーンでは、特にスマートコントラクト内での数値の扱いにおいて、正確性が非常に重要です。
浮動小数点数を使用すると、計算中に丸め誤差が発生することがあり、これが予期せぬ結果を招くことがあります。
文字列を使用して数値を表現すると、このような誤差を避けることができ、必要に応じて高い精度を保持できます。

#### 乗数の使用と小数点の非サポート
従来の多くのトークン標準（例えば**ERC20**）では、`decimals`メソッドを使用してトークンの価値を小数点で表現します。
しかし、この新しいアプローチでは、`decimals`の代わりに`multiplier`を導入しています。
これは、トークンのユーザーが見る表現において、基本単位を10のべき乗以外の値で増減させることができるようにするためです。
これにより、インフレーション（価値の下落）やデフレーション（価値の上昇）を扱ったり、`0.5`のような非標準的なインクリメントでトークンを転送することが容易になります。

#### ERC-1046の利用とガス効率
**ERC1046**はトークンのメタデータを拡張するための標準であり、ここでの文脈では、乗数を使った数値表現のサポートを含めることでガス（イーサリアムネットワークでの計算コスト）効率の向上を図っています。
乗数を使用することで、トークンの取引や計算がよりガス効率的になるケースが多いとされています。
これは、複雑な算術演算を行う代わりに、よりシンプルな数値操作を行うことができるからです。

#### 総合的な理解
このアプローチは、トークンの柔軟性と効率性を向上させることを目指しています。
文字列による数値表現と乗数の導入により、高精度な計算と柔軟な価値表現が可能になり、**ERC1046**の利用によってこれらの改善が効率的に実装されています。
この方法は、特に価値の表現や転送において、従来の方法に比べてより適応性が高いソリューションを提供します。

## 互換性

このEIPは、**ERC1046**互換のトークン標準や**ERC1046**の「`decimals`」というメソッドがある場合には互換性がありません。

## セキュリティ

ブロックチェーンのトークンにおける「**`multiplier`フィールド**」の扱いに関する警告と指示です。

#### `multiplier`フィールドの不正確な扱い
`multiplier`フィールドが不正確に扱われると、四捨五入の誤差が生じる可能性があります。
このような誤差は、悪意のあるアクターによって悪用される可能性があります。
そのため、スマートコントラクトは乗数を正確に処理する必要があります。

#### `multiplier`の正の値
`multiplier`は正の値でなければなりません（「`0`」は正の値とはみなされません）。
これは、表示上の問題を避けるためです。
例えば、`multiplier`が`0`や負の値であると、ユーザーインターフェイス上でトークンの量を正しく表示できなくなる可能性があります。

#### 大きなまたは小さな`multiplier`による表示上の課題
特に大きなまたは小さな`multiplier`は、ウォレット（トークンを管理・表示するアプリケーション）に表示上の課題をもたらす可能性があります。
しかし、ウォレットは、ユーザーインターフェースやユーザーエクスペリエンス、追加のセキュリティ問題を引き起こさないように、完全な数値を表示するよう努めるべきです。

:::message
トークンの`multiplier`フィールドは慎重に扱う必要があり、正の値を使用して正確に計算すること、また表示上の問題を避けるために適切な値を選択することが重要です。
これにより、トークンの安全性とユーザーエクスペリエンスが保たれます。
:::

## 引用

Gavin John (@Pandapip1), "ERC-7538: Multiplicative Tokens [DRAFT]," Ethereum Improvement Proposals, no. 7538, October 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7538.

## 最後に

今回は「**ERC20**と**ERC1155**標準に`multiplier`フィールドを導入し、より細かくトークンを管理する仕組みを提案している**ERC7538**」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下の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
