はじめに

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

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

今回は、ERC20のメタデータをERC721のメタデータのように変更する拡張機能であるERC1046についてまとめていきます!

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

ERC721については以下を参考にしてください。

概要

ERC721は、イーサリアムブロックチェーン上で非代替可能トークン(NFT)を作成するための標準規格です。 これにより、異なるデジタルアセットやコレクティブルなアイテムを一意に識別し、所有権をトークンとして表現できます。 ERC721は、それぞれのトークンに関連するメタデータを扱うためのtokenURI関数を導入しました。

tokenURIは、各ERC721トークンのメタデータを格納しているJSON形式のURIを返す関数です。 メタデータには、サムネイル画像、タイトル、説明、アセットのプロパティなどが含まれます。 これにより、NFTの詳細情報を外部に格納し、スマートコントラクトを軽量に保ちながら、トークンを見る際に必要な情報を提供することができます。

メタデータは以下のようなJSON形式で表現されます。

json
{
    "title": "Asset Metadata",
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "description": "Identifies the asset to which this NFT represents"
        },
        "description": {
            "type": "string",
            "description": "Describes the asset to which this NFT represents"
        },
        "image": {
            "type": "string",
            "description": "A URI pointing to a resource with mime type image/* representing the asset to which this NFT represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive."
        }
    }
}

引用: https://eips.ethereum.org/EIPS/eip-721

ERC20は、イーサリアム上で最も一般的なトークン標準規格であり、通常のトークン(代替可能トークン)を作成します。 これまでのERC20では、トークンのメタデータを直接スマートコントラクト内に含めることが一般的でした。 しかし、ERC721のメタデータ処理の利点を活用するために、このERCではERC20にもtokenURI関数を導入しています。 これにより、ERC20トークンもURIを通じてメタデータを外部に保存できるようになります。

metadata.png

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

ERC20のメタデータは、「name」、「symbol」、「decimals」などの値です。

ERC1155は、複数のトークンタイプを1つのスマートコントラクトで管理するための標準規格です。 つまり、非代替可能トークン(ERC721)と代替可能トークン(ERC20)の両方の特性を持つことができます。 このERCでは、ERC1155もtokenURI関数を拡張し、ERC721とERC20との相互運用性を強化しています。

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

これらのトークン標準が同じtokenURI関数を持つことで、以下の利点があります。

  1. コントラクトがどのタイプのトークン(ERC20、ERC721、ERC1155)かを判別できます。 これにより、スマートコントラクトとトークンのタイプを効率的に特定することができます。

  2. ユーザーに対してトークンの詳細情報を提供する方法が統一されます。 例えば、アセットリストページや専用のトークンページで、トークンのメタデータを表示する際に同じメカニズムを使用できます。

  3. トークンの機能を特定する際に、メタデータを使用してより多くの情報を取得できます。 トークンの用途や特性を理解しやすくなります。

metadata2.png

これらの相互運用性とメタデータの統一化は、トークンエコシステムの柔軟性と拡張性を向上させ、ユーザーにとってもより使いやすい環境を提供します。

仕様

相互運用メタデータ

javascript
interface InteroperabilityMetadata {
    erc1046?: boolean | undefined;

    erc721?: boolean | undefined;

    erc1155?: boolean | undefined;
}

これらのフィールドはすべてオプションであり、必要に応じてどれか1つもしくは複数のフィールドを含めることができます。 これにより、あるトークンがどのタイプのトークンであるかを効率的に判別し、ウォレットや他のプラットフォームにとって使いやすくすることができます。 また、「すべてのフィールドがbool値である必要はない」と明示されています。

erc1046

このフィールドがtrueの場合、ERC1046のトークンメタデータであることを示します。 false場合、このフィールドは省略されます。 このフィールドがtrueに設定されていると、ウォレットに対してこのアドレスをERC20トークンとして扱うよう指示されます。

erc721

このフィールドがtrueの場合、ERC721のトークンメタデータであることを示します。 false場合、このフィールドは省略されます。 このフィールドがtrueに設定されていると、ウォレットに対してこのアドレスをERC721トークンとして扱うよう指示されます。

erc1155

このフィールドがtrueの場合、ERC1155のトークンメタデータであることを示します。 false場合、このフィールドは省略されます。 このフィールドがtrueに設定されていると、ウォレットに対してこのアドレスをERC1155トークンとして扱うよう指示されます。

ERC20拡張機能

ERC20インタフェース拡張

javascript
pragma solidity ^0.8.0;

interface ERC20TokenMetadata /* is ERC20 */ {
    function tokenURI() external view returns (string);
}

tokenURI

ERC721トークンのようなトークンURIを取得する関数。 トークンURIとは、トークンの詳細情報やメタデータを格納するためのURI(Uniform Resource Identifier)のことです。 この関数を呼び出すことで、トークンに関連するメタデータを取得することができます。

メタデータはJSON形式で提供される必要があります。 さらに、このJSONデータはERC1046のERC-20 Token Metadata Schemaをサポートしている必要があります。 ERC1046は、ERC20トークンにメタデータを拡張するための標準規格です。

このインターフェースは、ERC20トークンに対してERC721のようなトークンURIを提供し、メタデータの取得を簡素化することを可能にします。 これにより、ウォレットやDAppなどのプラットフォームは、トークンの詳細情報を簡単に表示できるようになります。 また、ERC1046のスキーマをサポートすることで、トークンのメタデータの一貫性と相互運用性を確保することができます。

ERC-20 Token Metadata Schema

javascript
interface ERC20TokenMetadata {
    interop: InteroperabilityMetadata;
    
    name?: string;
    
    symbol?: string;

    decimals?: number;
    
    description?: string;
    
    image?: string;
    
    images?: string[];
    
    icons?: string[];
}

interop

トークンの相互運用性に関する情報を表現するためのフィールド。 詳細は別のインターフェースで定義される「InteroperabilityMetadata」に記載されています。 これにより、トークンの種類を区別し、それに対応するURIを取得できます。

name

ERC20トークンの名称を表す文字列。 トークンの名前を取得するための関数がERC20トークン内に存在する場合、このフィールドの値はその関数の返り値と一致する必要があります。

symbol

ERC20トークンのシンボルを表す文字列。 トークンのシンボルを取得するための関数がERC20トークン内に存在する場合、このフィールドの値はその関数の返り値と一致する必要があります。

decimals

ERC20トークンの小数点以下の桁数を表す整数値。 トークンの小数点以下の桁数を取得するための関数がERC20トークン内に存在する場合、このフィールドの値はその関数の返り値と一致する必要があります。 ただし、そのような関数が存在しない場合はデフォルト値として18が設定されます。

description

ERC20トークンに関する簡潔な説明を表す文字列。 このフィールドは、任意のマークアップや改行を含まない1段落の説明を提供します。

image

ERC20トークンを表現するための画像のURIを表す文字列。 画像はimage/*というMIMEタイプを持つリソースを指すURIであり、トークンを視覚的に表現します。 画像がビットマップ形式の場合、幅は320から1080ピクセルの範囲内にあるべきです。 また、アスペクト比は1.91:1から4:5までの範囲内です。

images

ERC20トークンを表現するための複数の画像のURIを表す文字列の配列。 上記のimageフィールドと同様の要件が適用されます。

icons

ERC20トークンのアイコンを表現するための複数の画像のURIを表す文字列の配列。 アイコンは、アスペクト比が1:1であり、透明な背景を使用するビットマップ形式の画像です。 幅は320から1080ピクセルの範囲内にあり、高さは幅と等しいです。

これらのメタデータフィールドによって、ERC20トークンに関するさまざまな情報を一貫して表現できるようになります。 これにより、ウォレットやDAppなどのプラットフォームは、トークンを視覚的に表現するための画像を取得したり、トークンの名前やシンボルを表示したりできます。

ERC721拡張機能

Extension to the ERC-721 Metadata Schema

javascript
interface ERC721TokenMetadataInterop extends ERC721TokenMetadata {
    interop: InteroperabilityMetadata;
}

ERC1155拡張機能

ERC-1155 Interface Extension

javascript
pragma solidity ^0.8.0;

interface ERC1155TokenMetadataInterop /* is ERC1155Metadata */ {
    function tokenURI() external view returns (string);
}

ERC-1155 Metadata Schema

ERC1155を実装し、そのトークンメタデータURIを使用するコントラクトは、メタデータURIに以下の拡張を使用することが推奨されます。

javascript
interface ERC1155TokenMetadataInterop extends ERC1155TokenMetadata {
    interop: InteroperabilityMetadata;
}

「相互運用性メタデータ」(InteroperabilityMetadata)と呼ばれるインターフェースを参照します。 相互運用性メタデータには、トークンの相互運用性に関する情報が含まれています。 具体的には、ERC20トークンメタデータ拡張で説明したようなフィールド(erc1046、erc721、erc1155)が含まれています。 これにより、ERC1155TokenMetadataInteropを利用するコントラクトは、トークンのURIを解釈する際に、適切な規格(ERC20、ERC721、ERC1155)を認識できるようになります。 ERC1155トークンのメタデータスキーマに対するこの拡張によって、トークン間のURIの区別を明確にし、相互運用性を向上させることができます。 これにより、異なる規格を持つERC1155トークンをより効率的に取り扱うことができるようになります。

その他の推奨事項

ガス代を節約するため、コントラクトはname()、symbol()、decimals()のオプションの関数を実装しないことが推奨されます。 代わりに、これらの情報はメタデータURIにのみ含めるようにすることが推奨されます。 また、decimalsが18である場合は、デフォルトデータであるためメタデータにdecimalsフィールドを含めないことが推奨されます。

補足

このERCは、開発者に対してERC20トークンへのメタデータの追加を簡単にし、全体のエコシステムには最小限の影響のみに抑えることを目的としています。 パラメータの名前を共通化することで、コードの再利用が容易になります。

トークン間の相互運用性を実現することは重要であり、トークンのタイプを区別することが簡単ではない場合があります。 相互運用性を実現するためにはERC165を使用することもできますが、静的な呼び出しはウォレットやウェブサイトにとって時間がかかり、柔軟性が制限される場合があります。 そのため、トークンURIに相互運用性データを含めることで、柔軟性が向上し、パフォーマンスが向上します。

後方互換性

このEIPは完全な互換性を持っており、ERC20トークンの機能を拡張するだけであり、オプション機能であるため、完全に後方互換性があります。 また、ERC721およびERC1155トークンに対しても後方互換性を保つための推奨事項があります。

セキュリティ

サーバーサイドリクエストフォージェリ(SSRF)への注意が必要です。 ウォレットはURIに対して任意のリクエストを送信する際に注意を払う必要があります。 ウォレットは、特定のスキームやポートをホワイトリストに登録することでURIを検証することが推奨されます。 脆弱なウォレットは、例えばローカルにホストされたredisデータベースのデータを改ざんされる可能性があります。

引用

Tommy Nicholas (@tomasienrbc), Matt Russo (@mateosu), John Zettler (@JohnZettler), Matt Condon (@shrugs), Gavin John (@Pandapip1), "ERC-1046: tokenURI Interoperability," Ethereum Improvement Proposals, no. 1046, April 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-1046.

考察

ERC1046は、ERC20のメタデータをERC721のようにする拡張機能です。 ERC20では、メタデータをコントラクト内で管理しているため、コントラクト外で管理できるようにもできるとのことで面白いと思いました。 ただ、実際に活用できる場面が浮かんできません。 どのような場面でこの規格が役立つかもわかっていないため、あまり使われない規格なのではないかと思います。 ぜひ活用場面をが思い浮かぶ人はコメントしてください!

最後に

今回は「ERC20のメタデータをERC721のメタデータのように変更する拡張機能であるERC1046」についてまとめてきました! いかがだったでしょうか?

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

採用強化中!

CryptoGamesでは一緒に働く仲間を大募集中です。

この記事で書いた自分の経験からもわかるように、裁量権を持って働くことができて一気に成長できる環境です。 「ブロックチェーンやWeb3、NFTに興味がある」、「スマートコントラクトの開発に携わりたい」など、少しでも興味を持っている方はまずはお話ししましょう! ぜひTwitterのDMか上記Wantedlyから連絡ください!