16
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ERC721の拡張機能である『ERC721A』について理解しよう!

Last updated at Posted at 2023-07-08

はじめに

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

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

今回はERC721Aについてまとめていきます。
以前勉強会をした時に使用した資料をもとに解説していきます。

勉強会と使用したスライドは以下になります。

勉強会の動画もあります。

概要

ERC721Aは名前の通りERC721の拡張機能です。

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

また、ERC721Aについてより詳しく知りたい人は以下の記事を参考にしてください。

ERC20とERC721の違い

7.png

まずはERC20ERC721の違いを説明しています。

8.png

簡単に違いを挙げるとすると、以下になります。

ERC20
トークン同士に違いはないため交換できる。
例)お金

ERC721
トークン同士に違いがあるため交換できない。
例)アート作品

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

9.png

もう少し詳しく説明すると、ERC721はそれぞれユニークなトークンIDというものを持っています。
そのためそれぞれトークンIDが異なるため、同じ価値として交換ができないということです。

10.png

他の説明として、ERC20トークンは「誰がいくつ持っているか」、ERC721は「誰が何を持っているか」という違いがあります。
これは、ERC20トークンは代替性(交換できる)があり、ERC721は非代替性(交換できない)という特徴による説明です。

ERC721Enumerable

ERC721の拡張機能である、ERC721Enumerableの説明をしています。

18.png
21.png
22.png

ERC721Enumerableを簡単に説明すると、「あるアドレスが所有しているNFTの一覧を取得できる、ERC721の拡張機能。ただ、ガス代が高い...」となります。
ERC721規格だとあるアドレスがどのNFTを所有しているかの一覧を取得することはできません。
一方、ERC721Enumerableを使用することで、あるアドレスがどのNFTを所有しているかの一覧を取得できるようになります。
しかし、その代償で一部の機能を実行する際にガス代が多くかかってしまいます...。

23.png

ERC721Enumerableには、上記の2つの課題があります。

更新するデータが多い
あるアドレスがどのNFTを所有しているかの一覧を取得ために、1つの動作ごとに書き換えるデータが多くなってしまいます。

ガス代が高い
課題1つ目に直結する部分ですが、書き換えるデータが多くなる分ガス代がより多くかかってしまいます。

24.png

では実際どのようなデータを更新しているのでしょうか?
NFTのMint(発行)時には以下の3つのデータを更新しています。

  1. Mint(発行)されているトークンの総量がいくつか?
  2. あるアドレスが幾つのトークンを持っているか?
  3. どのアドレスがどのトークンを所有しているか?

2と3はERC721規格では存在しないデータであり、更新処理が結構手間なのでガス代が多くかかってしまいます。

25.png

ではここで、ERC721Enumerableの処理を図を用いて説明します。
画像のように3つのNFTをMintしようとしています。
青枠内の数字が「Mintされているトークン総量」で、白枠内の数字が「アドレスが所有するトークン量」です。
Mintのたびに更新されているのが確認できます。

26.png

Mintのたびに更新されるということは、その都度ガス代がかかるということです。

27.png

ここで以下のような疑問が浮かびます。
Mint処理をまとめてしまってガス代を1度だけかかるようにすれば良くね?
ちまちま数字を更新するのではなく、一気に更新してしまおうという発想です。

ERC721Aとは

この章ではERC721Aの説明をしています。

30.png

ERC721Aを簡単に説明すると上記になります。
ERC721Enumerableとの違いは「ガス代を節約できる」点です。

31.png

実はERC721AはNFTプロジェクトである「Azuki」から提案された独自実装になります(「Azuki」の「A」?)。
ERC721Enumerableを使用していたときは、トークンを1つ1つMintする必要があり、その度にトランザクションが発生していました。
一方、ERC721Aを使用すると一度のトランザクションで、複数のNFTをMintすることができます。
これによりガス代が節約できます。
ジェネラティブNFTなど、連続したトークンIDのNFTを1つのアドレスでMintすることがある場合に役立ちます。

34.png

上図は、ERC721EnumerableERC721Aのガス代の比較表です。
MintするNFTが増加するにつれてガス代の価格の比率が広がっていることが確認できます。

ERC721Aの仕組み

では、ERC721Aがどのような仕組みになっているか確認していきましょう。

NFTに紐づいているアドレス

35.png

ERC721の場合、1つのNFT(トークンID)に対して所有しているアドレスが1対1で紐づきます。

36.png

一方、ERC721Aだと、トークンIDが連続している場合所有しているアドレスは一部しか紐づきません。

37.png

図を見ていただくとわかりますが、「0xA...」というアドレスがトークンIDの1~5を所有していますが、その一番若い数字のトークンIDしか紐づいていません。
これがガス代を節約している仕組みです。
ERC721の場合は5回データを書き換える必要がありますが、ERC721Aの場合は1回で済んでしまいます。
(もちろんトークンIDが連続していない場合は1つずつデータを記録する必要があります)

アドレスが所有しているNFTの一覧取得

では、あるアドレスが所有しているNFTの一覧の取得はどのように実行しているのでしょうか?

38.png

やり方はシンプルで、先頭から1つずつ確認していき、該当するアドレスが出現したときにそのトークンIDを取得しています。
このとき、図のようにトークンID2はどのアドレスにも直接紐づいていないですが、直近で紐づいているアドレスが「0xA...」のため、所有者は「0xA...」であることがわかります。
トークンID6もこれと同じようにして、どのアドレスが所有者かわかります。

所有者の変更

NFTを販売したり、他のアドレスに送ったときどのように変更されるのか見ていきましょう!

39.png

まずは、図のようにトークンID3のNFTを「0xA...」から「0xC...」に送ります。
これで完了!

40.png

とはいかないです...。
なぜならトークンID45はどのアドレスにも直接紐づいていません。
そのため、トークンID3の所有者のアドレスを参照してしまい、トークンID45の所有者も「0xC...」となってしまいます。

41.png

これを避けるために、トークンID3の所有者のアドレスを変更したのち、トークンID4を「0xA...」に紐づける必要があります。
これで更新は完了です!

まとめ

最後にまとめていきます。
42.png

ERC721Aはあるアドレスが所有しているNFTの一覧を取得することができます。
また、複数のNFTを一度にMintでき、ガス代の節約ができます。
個人的な感想としては、ERC721Enumerableはデータの読み込みのコストを削減し、ERC721Aはデータの書き込みのコストを削減していると思いました。
ERC721Enumerableは配列として、「誰がどのトークンID」を所有しているかというデータを持っているため、読み込み速度は速いです(配列から取得すれば良いため)。
しかし、その分データの書き込みが頻繁に発生してしまいます。
一方、ERC721Aはデータの書き込み頻度を下げることでガス代の節約の実現ができています。
しかし、「誰がどのトークンID」を所有しているか確認するために、全てのトークンIDを確認する必要があります。
これはトークンIDの数にもよりますが、若干時間がかかります。
ERC721Aは読み込みに時間がかかってもガス代は発生しないため、やはりERC721Aの方を使用する方がメリットが多いように感じています。

最後に

今回はERC721Aについてまとめてきました。
実装については今後追記していきます。
いかがだったでしょうか?
質問などがある方は以下のTwitterのDMなどからお気軽に質問してください!

Twitter @cardene777

採用強化中!

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

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

16
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?