はじめに
初めまして。
CryptoGamesというブロックチェーンゲーム企業でエンジニアをしている cardene(かるでね) です!
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。
代表的なゲームはクリプトスペルズというブロックチェーンゲームです。
今回はERC721Aについてまとめていきます。
以前勉強会をした時に使用した資料をもとに解説していきます。
勉強会と使用したスライドは以下になります。
勉強会の動画もあります。
概要
ERC721Aは名前の通りERC721の拡張機能です。
ERC721については以下を参考にしてください!
また、ERC721Aについてより詳しく知りたい人は以下の記事を参考にしてください。
ERC20とERC721の違い
まずはERC20とERC721の違いを説明しています。
簡単に違いを挙げるとすると、以下になります。
ERC20
トークン同士に違いはないため交換できる。
例)お金
ERC721
トークン同士に違いがあるため交換できない。
例)アート作品
ERC20については以下を参考にしてください。
もう少し詳しく説明すると、ERC721はそれぞれユニークなトークンIDというものを持っています。
そのためそれぞれトークンIDが異なるため、同じ価値として交換ができないということです。
他の説明として、ERC20トークンは「誰がいくつ持っているか」、ERC721は「誰が何を持っているか」という違いがあります。
これは、ERC20トークンは代替性(交換できる)があり、ERC721は非代替性(交換できない)という特徴による説明です。
ERC721Enumerable
ERC721の拡張機能である、ERC721Enumerableの説明をしています。
ERC721Enumerableを簡単に説明すると、「あるアドレスが所有しているNFTの一覧を取得できる、ERC721の拡張機能。ただ、ガス代が高い...」となります。
ERC721規格だとあるアドレスがどのNFTを所有しているかの一覧を取得することはできません。
一方、ERC721Enumerableを使用することで、あるアドレスがどのNFTを所有しているかの一覧を取得できるようになります。
しかし、その代償で一部の機能を実行する際にガス代が多くかかってしまいます...。
ERC721Enumerableには、上記の2つの課題があります。
更新するデータが多い
あるアドレスがどのNFTを所有しているかの一覧を取得ために、1つの動作ごとに書き換えるデータが多くなってしまいます。
ガス代が高い
課題1つ目に直結する部分ですが、書き換えるデータが多くなる分ガス代がより多くかかってしまいます。
では実際どのようなデータを更新しているのでしょうか?
NFTのMint(発行)時には以下の3つのデータを更新しています。
- Mint(発行)されているトークンの総量がいくつか?
- あるアドレスが幾つのトークンを持っているか?
- どのアドレスがどのトークンを所有しているか?
2と3はERC721規格では存在しないデータであり、更新処理が結構手間なのでガス代が多くかかってしまいます。
ではここで、ERC721Enumerableの処理を図を用いて説明します。
画像のように3つのNFTをMintしようとしています。
青枠内の数字が「Mintされているトークン総量」で、白枠内の数字が「アドレスが所有するトークン量」です。
Mintのたびに更新されているのが確認できます。
Mintのたびに更新されるということは、その都度ガス代がかかるということです。
ここで以下のような疑問が浮かびます。
「Mint処理をまとめてしまってガス代を1度だけかかるようにすれば良くね?」
ちまちま数字を更新するのではなく、一気に更新してしまおうという発想です。
ERC721Aとは
この章ではERC721Aの説明をしています。
ERC721Aを簡単に説明すると上記になります。
ERC721Enumerableとの違いは「ガス代を節約できる」点です。
実はERC721AはNFTプロジェクトである「Azuki」から提案された独自実装になります(「Azuki」の「A」?)。
ERC721Enumerableを使用していたときは、トークンを1つ1つMintする必要があり、その度にトランザクションが発生していました。
一方、ERC721Aを使用すると一度のトランザクションで、複数のNFTをMintすることができます。
これによりガス代が節約できます。
ジェネラティブNFTなど、連続したトークンIDのNFTを1つのアドレスでMintすることがある場合に役立ちます。
上図は、ERC721EnumerableとERC721Aのガス代の比較表です。
MintするNFTが増加するにつれてガス代の価格の比率が広がっていることが確認できます。
ERC721Aの仕組み
では、ERC721Aがどのような仕組みになっているか確認していきましょう。
NFTに紐づいているアドレス
ERC721の場合、1つのNFT(トークンID)に対して所有しているアドレスが1対1で紐づきます。
一方、ERC721Aだと、トークンIDが連続している場合所有しているアドレスは一部しか紐づきません。
図を見ていただくとわかりますが、「0xA...」というアドレスがトークンIDの1~5を所有していますが、その一番若い数字のトークンIDしか紐づいていません。
これがガス代を節約している仕組みです。
ERC721の場合は5回データを書き換える必要がありますが、ERC721Aの場合は1回で済んでしまいます。
(もちろんトークンIDが連続していない場合は1つずつデータを記録する必要があります)
アドレスが所有しているNFTの一覧取得
では、あるアドレスが所有しているNFTの一覧の取得はどのように実行しているのでしょうか?
やり方はシンプルで、先頭から1つずつ確認していき、該当するアドレスが出現したときにそのトークンIDを取得しています。
このとき、図のようにトークンID2はどのアドレスにも直接紐づいていないですが、直近で紐づいているアドレスが「0xA...」のため、所有者は「0xA...」であることがわかります。
トークンID6もこれと同じようにして、どのアドレスが所有者かわかります。
所有者の変更
NFTを販売したり、他のアドレスに送ったときどのように変更されるのか見ていきましょう!
まずは、図のようにトークンID3のNFTを「0xA...」から「0xC...」に送ります。
これで完了!
とはいかないです...。
なぜならトークンID4と5はどのアドレスにも直接紐づいていません。
そのため、トークンID3の所有者のアドレスを参照してしまい、トークンID4と5の所有者も「0xC...」となってしまいます。
これを避けるために、トークンID3の所有者のアドレスを変更したのち、トークンID4を「0xA...」に紐づける必要があります。
これで更新は完了です!
まとめ
ERC721Aはあるアドレスが所有しているNFTの一覧を取得することができます。
また、複数のNFTを一度にMintでき、ガス代の節約ができます。
個人的な感想としては、ERC721Enumerableはデータの読み込みのコストを削減し、ERC721Aはデータの書き込みのコストを削減していると思いました。
ERC721Enumerableは配列として、「誰がどのトークンID」を所有しているかというデータを持っているため、読み込み速度は速いです(配列から取得すれば良いため)。
しかし、その分データの書き込みが頻繁に発生してしまいます。
一方、ERC721Aはデータの書き込み頻度を下げることでガス代の節約の実現ができています。
しかし、「誰がどのトークンID」を所有しているか確認するために、全てのトークンIDを確認する必要があります。
これはトークンIDの数にもよりますが、若干時間がかかります。
ERC721Aは読み込みに時間がかかってもガス代は発生しないため、やはりERC721Aの方を使用する方がメリットが多いように感じています。
最後に
今回はERC721Aについてまとめてきました。
実装については今後追記していきます。
いかがだったでしょうか?
質問などがある方は以下のTwitterのDMなどからお気軽に質問してください!
採用強化中!
CryptoGamesでは一緒に働く仲間を大募集中です。
この記事で書いた自分の経験からもわかるように、裁量権を持って働くことができて一気に成長できる環境です。
「ブロックチェーンやWeb3、NFTに興味がある」、「スマートコントラクトの開発に携わりたい」など、少しでも興味を持っている方はまずはお話ししましょう!






















