https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6aca0d66-b1c1-45ba-a5f2-388f11c2554f/eUW6Ka67NY2FSWV5M29yQ.png

はじめに

Metaverseのブランドを標榜し、1月13日に行われたPhase1セールで8700個のNFTが即完売したAzukiプロジェクト。このAzuki NFTは独自のERC721規格であるERC721Aを利用することでセール時のトランザクション手数料を大幅に削減することができました。

イーサリアムをはじめとしたEVMエコシステムにおけるNFTの代表的な規格であるERC721は、暗号資産のようなFungibleなトークンと比べて、多くのトランザクション手数料(いわゆるGas代)が発生します。

AzukiはERC721の内部構造をプロジェクトに最適化することで、発行時の手数料の少ないERC721互換のNFTを実現しています。本記事ではこのERC721Aについて解説していきます。なお、ソースコードはEtherscan上で公開されているもの、およびGitHubで公開されているものをベースにします。

ERC721Aの3つの特徴

ERC721Aの特徴を3つのパートに分けて説明していきます。

ERC721Enumerableのインターフェースは保持

ERC721は、あるトークンから所有するアカウントの情報を持つ規格ではありますが、あるアカウントが所有するトークンの一覧をストレージのデータとして保持しているわけではありません。つまり、自身を含むスマートコントラクト上から、あるアカウントのトークン一覧を参照することができません。

そこで、ERC721EnumerableというERC721の拡張規格が提案されており、OpenZeppelin等にも広く利用されています。ERC721Enumerableでは、トークン一覧参照のためのデータをストレージに保存することで一覧情報を参照できるようにします。したがってシンプルなERC721に比べて、余分にストレージを利用することになるため、ERC721Enumerableを実装する場合は、transferやmintに必要となるgasが増加することになります。

Enumerableつまり、スマートコントラクトでの一覧表示の必要性の低い一点物のアートNFTや、一部ゲームのようにオフチェーンでの参照を前提とするエコシステムを構築する場合には、Enumebrableをあえて選択しないことで、mintや将来的なtransferのコストを下げる選択が考えられます。

Azukiは、将来的なオンチェーンエコシステムを鑑み、ERC721Enumerableを外すという選択はしませんでした。後述するように、単純な所有情報すらも発行時のストレージ利用に手を加えているため、全てのトークンの中から保有しているトークンを走査するというアプローチでERC721Enumerableを実現しています。

複数のNFTをmintする際の手数料を削減

ERC721Aの目玉機能として、mintつまり新規発行時に複数同時に発行する場合のgasを大幅に削減できることを謳っています。

まず、スマートコントラクトの記憶領域であるストレージに情報を保存する際にgasを使用します。このgasに対してトランザクション作成時に指定するgas priceを掛け算することでトランザクションの手数料が発生します。

ERC721の場合、トークンIDに対してオーナー情報をスマートコントラクトのストレージ上に記録するため、トークンIDの数だけストレージを使用しmintやtransferの際にgasを使用します。

ERC721はトークンの数だけストレージを使用する