はじめに
初めまして。
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に興味がある」、「スマートコントラクトの開発に携わりたい」など、少しでも興味を持っている方はまずはお話ししましょう!