メインコンテンツへスキップ
Change page

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の機能と特徴:

バッチ転送

この規格におけるバッチ転送は、通常のERC-20の場合とほぼ同様です。 通常のERC-20 transferFrom関数を見てみましょう。

1// ERC-20
2function transferFrom(address from, address to, uint256 value) external returns (bool);
3
4// ERC-1155
5function safeBatchTransferFrom(
6 address _from,
7 address _to,
8 uint256[] calldata _ids,
9 uint256[] calldata _values,
10 bytes calldata _data
11) external;
すべて表示

ERC-1155における唯一の違いは、値を配列として渡し、さらにIDの配列も渡す点です。 例えば、ids=[3, 6, 13]values=[100, 200, 5]と指定した場合、以下のような転送が実行されます。

  1. ID 3のトークン100個を_fromから_toへ転送します。
  2. ID 6のトークン200個を_fromから_toへ転送します。
  3. ID 13のトークン5個を_fromから_toへ転送します。

ERC-1155では、transferは存在せず、transferFromのみ利用できます。 通常のtransferのように使用するには、fromアドレスを、関数を呼び出しているアドレスに設定します。

バッチ残高

同様に、ERC-20のbalanceOf呼び出しにも、バッチ処理に対応する関数があります。 確認のために、まずERC-20の関数を見ておきましょう:

1// ERC-20
2function balanceOf(address owner) external view returns (uint256);
3
4// ERC-1155
5function balanceOfBatch(
6 address[] calldata _owners,
7 uint256[] calldata _ids
8) 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-1155
2function setApprovalForAll(
3 address _operator,
4 bool _approved
5) external;
6
7function isApprovedForAll(
8 address _owner,
9 address _operator
10) 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 _data
7) 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)をご覧ください。

安全な転送ルール

すでに他の記事において、いくつかの安全転送ルールについて紹介しました。 ここでは、最も重要なルールについて確認しておきましょう:

  1. 呼び出し元は、_fromアドレスのトークンを使用することが承認されているか、または_fromと等しくなければなりません。
  2. 以下に該当する場合、転送の呼び出しは取り消されます:
    1. _toアドレスが0であること。
    2. _idsの長さが_valuesの長さと一致しないこと。
    3. _ids内のいずれかのトークンの保有者の残高が、受信者に送られる_values内のそれぞれの量よりも少ないこと。
    4. その他のエラーが発生した。

: フックを含むすべてのバッチ関数は、バッチではないバージョンとしても存在します。 これは、実際にはひとつの資産のみを転送するケースが最も一般的になると予想されるために、ガスの効率性を考慮した設計上の選択です。 この記事では、安全転送ルールの場合も含めて、簡潔な説明のためにバッチ関数のみを取り上げました。 各関数の名称は、「Batch」を削除すれば同一です。

参考リンク

この記事は役に立ちましたか?