[Web3]NFTの変化についてERCトークン規格と一緒に考えてみよう

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960668/7133fa2e-b237-88b1-0692-29dddd2c3215.jpeg)
## はじめに
初めまして！GMOメディアの松崎です！
普段、業務ではゲソてんbyGMO(ゲソてん)というゲームプラットフォームサービスの開発を行なっています。
ゲソてんでは、12月21日よりブロックチェーンゲームパーク(BCGP)というweb3ゲームプラットフォームが登場ました。(https://gesoten.com/bcg/)
Play to Earnを実現をどのように行なっているのか、今回はNFTに関して考えてみながら、NFTを作成する時に、よく用いるイーサリアムのブロックチェーンのトークン規格というものがあります。
今回は復習を兼ねて、トークン規格やERCトークンについて考えてみたいと思います。
![](https://storage.googleapis.com/zenn-user-upload/64afae86c26b-20240627.png)

## まずイーサリアムって何のためにあるんだっけ？
イーサリアムはプラットフォームと通貨の両方の意味を持っています。
イーサリアムはビットコインなどと同じく、ブロックチェーン技術に基づく暗号通貨でしたが、目的や技術的な特徴が違います。
ビットコインはインターネット上で使うことができる通貨として、中央集権的な金融システムに依存せずにピアツーピアでの取引を可能にすることを目的としています。
一方で、イーサリアムは分散アプリケーションのプラットフォームであり、ブロックチェーン上に様々なアプリケーションを載せることができるプラットフォームを作ることを目的としています。技術的な特徴はスマートコントラクトを実行できることです。イーサリアムは、NFTを開発・展開するための主要なプラットフォームの1つです。スマートコントラクトを使用することで、デジタル資産をトークン化し、所有権や権利をブロックチェーン上で管理することができます。

## EIPとERC
EIPとはイーサリアムコミュニティに情報を提供したり、イーサリアムやそのプロセス環境の新機能を記述する設計文書で、タイプは3つに分かれています。
EIPのタイプはERCを区別することが大切です。EIPはイーサリアムの改善提案のことです。イーサリアムコミュニティに情報を提供したり、イーサリアムやそのプロセスに環境の新機能を提供する設計文書です。

1つ目はスタンダードトラックEIPでイーサリアムの実装の変更に関することがここに記されます。
ブロックに関することや、プロトコルに関する情報、トランザクションについてなどがここに記されます。スタンダードトラックEIPは4つのサブカテゴリに分かれていて、その中にERCという、アプリケーションレベルの標準と規則を定めるためのカテゴリがあります。提案された順番で数字が割り振られています。
２つ目はMeta EIPで全員に関係することはここに記されます。
3つ目はインフォメーションEIPで新機能を提供するものではなく、人によっては必要なものです。

## ERC721(Non-Fungible Token Standard)
ERC721は、NFTを追跡、移転するための基本的な機能提供を目的にしています。スマートコントラクト内でのNFTの標準機能(API)を規定したものです。
ERC721に関するドキュメントでは、ERC721スマートコントラクト内でユニークな整数(ID)で識別されると書かれています。この識別番号はコントラクトが動いている間は変更すべきではないと書かれています。この識別番号がtokenIdですね。そしてこのtokenIdはEthereumブロックチェーン上の特定の資産に対してユニークな識別子です。
つまり、NFTコントラクトアドレスとスマートコントラクトで管理されるこのtokenIdを紐づける情報がERC721ということです。

NFTにコンテンツ情報などのJSONデータを紐づけることができます。ここにコンテンツデータのURIや`name`(トークンの名前)、`discription`(トークンの説明)、`image`(トークンの画像を表すURL)などを含めることが可能です。
NFTの標準規格としてはERC721が一番最初に出たものなので、ずっとERC721を使い続けているというプロジェクトも多いと感じています。
**「ERC721はtokenIdがユニークであるため、ownerOf関数を使用して簡単にどのアドレスがNFTを保持しているのか調べることができます。」**
```
ownerOf(uint256 tokenId) → address owner
```

## ERC1155（Multi Token Standard）
ERC721ではNFTの追跡が行いやすいと書きましたが、一方でトークンがユニークであるがために、複数のトークンを一度に操作する際にガス代が高くなります。また単一のトランザクションとして処理されるために非効率であるため非効率であるというデメリットがありました。
しかし、特にゲームなどでは、同じNFTを複数一度に発行したいという時に役に立つのがERC1155の規格です。
NFTを複数発行するには、`mintBatch`関数を使用する方法があります。`onlyOwner`があることで、コントラクトの所有者ではないアドレスがこの関数を呼び出すとトランザクションは失敗します。
```
function mintBatch(
    address to, //　トークンを受け取るアドレス
    uint256[] memory ids,
    uint256[] memory amounts,
    bytes memory data
) public onlyOwner {
    _mintBatch(to, ids, amounts, data);
}
```

ERC721では、`ownerOf`関数で所有者のアドレスを簡単に調べることができましたが、ERC1155の規格ではこれは困難になります。ERC1155では1つのtokenIdに複数のウォレットアドレスが紐づいていることが原因です。
ウォレットアドレスがわかっていれば`balanceOf`関数でそのアドレスが特定のトークンIDをどれだけ保有しているかを調べることができますが、逆にtokenIdからすべての保有者を調べるのは困難です。
```
function checkTokenBalance(address account, uint256 id) public view returns (bool) {
        return balanceOf(account, id) > 0;
    }
```

## ERC4907(Rental NFT、EIP-721の拡張）
NFTはゲームやコミュニティの参加など、様々な用途で使用されています。ERC4907はレンタルNFTを作成するための規格で、ERC721やERC1155とは異なり、使用者と所有者の両方の情報を持つ必要があります。また、利用期限も設定されます。
`setUser(address user, uint64 expires)`を用いてNFTの使用者と使用期間を設定することができ、`userOf(uint256 tokenId)`で特定のトークンIDに対する現在の使用者を取得することができます。
`userExpires(uint256 tokenId)`で特定のトークンIDの使用権が切れる時刻を取得できます。
利用用途としては、NFTを保持していることで使えるゲーム内のアイテムや、参加できるコミュニティを、あまりコストをかけずに体験することが可能になります。

## ERC6672（Multi-redeemable NFTs）
ERC6672は特典を複数回引換可能なNFTのトークン規格です。ユースケースとしてはNFTチケットが考えられます。
1つのNFTで、入場チケットとしての役割、グッズとの引換、サイン会など様々な特典を実現できるNFTです。今後、様々なイベントで使用されることが期待される規格です。

## まとめ
- EIPはイーサリアムコミュニティに情報を提供したり、イーサリアムやそのプロセス環境の新機能を記述する設計文書で、ERCはアプリケーションレベルの標準と規則を定めるためのものです
- ERC721は、1ウォレットアドレスに1つのtokenIdが紐づくため、誰が保有しているのか追跡しやすいというメリットがありますが、1つのトークンごとにトランザクションが発生するため、多くのトークンを発行するとガス代が高くなるというデメリットもあります
- 逆にERC1155は1つのtoken idに対して複数のウォレットアドレスが紐づいているため誰が保有しているのか追跡するのが困難ですが、1回のトランザクションで複数のtokenをやり取りできるためガス代を抑えられることから、大量発行するNFTでは、有効な規格であると言えます
- ERC4907は、レンタルNFTのトークン規格です。NFTを持っていることで入れるコミュニティや使用できるゲームアイテムなどがあるためコストをあまりかけずにNFTの体験をしてみたいユーザーには有効な規格です
- ERC6672は1つのNFTに対して複数の特典を紐づけることができるNFTです

## さいごに
今回はNFTのトークン規格に関して中心に書いてみました。次回はもう少し実装に寄せてまとめていきたいと思います。最近NFTの注目度はあまり高くないですが、様々なプロジェクトで再び盛り上がってほしいです。
最後まで読んでいただきありがとうございました。

## 参考
- [bitFlyer コラム イーサリアムとは](https://bitflyer.com/ja-jp/s/learn/ethereum)
- [EIP-1: EIP Purpose and Guidelines](https://eips.ethereum.org/EIPS/eip-1)
- [ERC-6672: Multi-redeemable NFTs](https://eips.ethereum.org/EIPS/eip-6672)
- [ERC-1155 マルチトークン規格](https://ethereum.org/ja/developers/docs/standards/tokens/erc-1155/)
- [ERC1155を使った フルスタック Getting Started](https://tech.hashport.io/3343/)
- [【NFT実装】7つの罠がある！ERC-1155とERC-721の違いによる実装の注意点](https://qiita.com/okamu_/items/6dc57360d5bb262da546)
- [ERC4907規格によるレンタル可能なNFTの作成](https://zenn.dev/thirdweb_jp/articles/19d40cd5a1032f)
- [ERC-4907: Rental NFT, an Extension of EIP-721](https://eips.ethereum.org/EIPS/eip-4907)
- [[ERC6672] いろんなイベントでNFTと物理/デジタルアイテムを交換しよう！](https://qiita.com/cardene/items/783911914c3aa61d9f5e)
- [書籍:エンジニアのためのWeb3開発入門]