ERC-1155 マルチトークン規格
最終更新: 2025年10月22日
はじめに
さまざまな種類のトークンを管理するコントラクトにおける標準的なインターフェイスです。 デプロイされた単一のコントラクトには、代替可能トークン、非代替性トークン、またはその他の構成(例:半代替性トークン)の任意の組み合わせを含めることができます。
マルチトークン標準とは?
この規格は、代替性か非代替性かを問わず、あらゆる種類のトークンを表現し、管理できるスマートコントラクトのインターフェイスを開発するというシンプルな発想に基づいて策定されたものです。 このようにして、ERC-1155トークンは、ERC-20トークンおよびERC-721トークンと同じ機能を、さらに両方を同時に実行することができます。 このため、ERC-20およびERC-721の両規格における機能や効率性が向上し、明らかな実装エラーを訂正することができます。
ERC-1155トークンは、EIP-1155 (opens in a new tab)で詳しく説明されています。
前提条件
このページをよりよく理解するために、まずトークン標準、ERC-20、およびERC-721についてお読みになることをお勧めします。
ERC-1155の機能と特徴:
- バッチ転送: 1回の呼び出しで複数のアセットを転送します。
- バッチ残高: 1回の呼び出しで複数のアセットの残高を取得します。
- バッチ承認: 1つのアドレスに対するすべてのトークンを承認します。
- フック: トークン受信フック。
- NFTサポート: 供給量が1の場合、NFTとして扱います。
- 安全な転送ルール: 安全な転送のためのルールセットです。
バッチ転送
この規格におけるバッチ転送は、通常のERC-20の場合とほぼ同様です。 通常のERC-20 transferFrom関数を見てみましょう。
1// ERC-202function transferFrom(address from, address to, uint256 value) external returns (bool);34// ERC-11555function safeBatchTransferFrom(6 address _from,7 address _to,8 uint256[] calldata _ids,9 uint256[] calldata _values,10 bytes calldata _data11) external;すべて表示ERC-1155における唯一の違いは、値を配列として渡し、さらにIDの配列も渡す点です。 例えば、ids=[3, 6, 13]、values=[100, 200, 5]と指定した場合、以下のような転送が実行されます。
- ID 3のトークン100個を
_fromから_toへ転送します。 - ID 6のトークン200個を
_fromから_toへ転送します。 - ID 13のトークン5個を
_fromから_toへ転送します。
ERC-1155では、transferは存在せず、transferFromのみ利用できます。 通常のtransferのように使用するには、fromアドレスを、関数を呼び出しているアドレスに設定します。
バッチ残高
同様に、ERC-20のbalanceOf呼び出しにも、バッチ処理に対応する関数があります。 確認のために、まずERC-20の関数を見ておきましょう:
1// ERC-202function balanceOf(address owner) external view returns (uint256);34// ERC-11555function balanceOfBatch(6 address[] calldata _owners,7 uint256[] calldata _ids8) external view returns (uint256[] memory);残高の呼び出しがよりシンプルになり、1回の呼び出しで複数の残高を取得できるようになりました。 所有者の配列と、その後にトークンIDの配列を指定すればよいです。
例えば、_ids=[3, 6, 13]と_owners=[0xbeef..., 0x1337..., 0x1111...]が与えられた場合、戻り値は次のようになります。
1[2 balanceOf(0xbeef...),3 balanceOf(0x1337...),4 balanceOf(0x1111...)5]バッチ承認
1// ERC-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);すべて表示承認プロセスは、ERC-20とは若干異なります。 特定の数量を承認するのではなく、setApprovalForAllを使って、オペレーターを承認済みまたは未承認に設定します。
現在の状態はisApprovedForAllを介して読み取ることができます。 推測されたとおり、これはAll or Nothing型の操作です。 承認するトークンの数やトークンの種類を指定することはできません。
これは、シンプルさを実現するために敢えて採用された設計です。 ひとつのアドレスに対し、すべて承認することだけが可能です。
受信フック
1function onERC1155BatchReceived(2 address _operator,3 address _from,4 uint256[] calldata _ids,5 uint256[] calldata _values,6 bytes calldata _data7) external returns(bytes4);EIP-165 (opens in a new tab)がサポートされているため、ERC-1155はスマートコントラクトの受信フックのみをサポートします。 このフック関数は、合い言葉として事前に定義されたbytes4の値(以下の形式を持つ)を返す必要があります。
1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))受信側のコントラクトがこの値を返すと、コントラクトがこの転送を受け入れ、ERC-1155のトークンに対する処理方法を理解していると見なされます。 これにより、コントラクト内部で未処理のトークンが溜まっていくことがなくなります!
NFTサポート
供給されるトークンの数が1である場合、このトークンは事実上非代替性トークン(NFT)だと言えます。 ERC-721規格と同じように、メタデータのURLを定義することが可能です。 URLはクライアントによって読み取り、変更が可能です。詳細はこちら (opens in a new tab)をご覧ください。
安全な転送ルール
すでに他の記事において、いくつかの安全転送ルールについて紹介しました。 ここでは、最も重要なルールについて確認しておきましょう:
- 呼び出し元は、
_fromアドレスのトークンを使用することが承認されているか、または_fromと等しくなければなりません。 - 以下に該当する場合、転送の呼び出しは取り消されます:
_toアドレスが0であること。_idsの長さが_valuesの長さと一致しないこと。_ids内のいずれかのトークンの保有者の残高が、受信者に送られる_values内のそれぞれの量よりも少ないこと。- その他のエラーが発生した。
注: フックを含むすべてのバッチ関数は、バッチではないバージョンとしても存在します。 これは、実際にはひとつの資産のみを転送するケースが最も一般的になると予想されるために、ガスの効率性を考慮した設計上の選択です。 この記事では、安全転送ルールの場合も含めて、簡潔な説明のためにバッチ関数のみを取り上げました。 各関数の名称は、「Batch」を削除すれば同一です。