コンテンツへスキップ
0%

ERC721 vs. ERC721A: NFTのバッチミント

Albert Hu @thatguyintech headshot

執筆者 Albert Hu

2022年3月16日 公開読了時間 3 分

NFTクリエイターの多くが知っているように、Ethereumのmainnetにスマートコントラクトをデプロイするには非常に大きなコストがかかります。

しかし、ブロックチェーンエンジニアやNFTチームが考慮すべきコストは、スマートコントラクトのデプロイコストだけではありません成功するNFTコレクションやコレクティブルアバタープロジェクトを作るには、コミュニティを構築し、ユーザーがNFTをミント取引利用しやすくすることも含まれます。

ここでは、コミュニティがNFTのミントコストのガス代を節約できる、強力なNFTスマートコントラクトの最適化手法について見ていきましょう。

ERC721Aコントラクトによるバッチミントの実装です。

ERC721Aとは

1月6日、Azuki NFT開発チームはERC721A(ERC721 NFT規格の新しい実装)を公開し、バッチミントの可能性を示しました。

ERC721A実装を紹介するAzukiチーム
ERC721A実装を紹介するAzukiチーム

ERC721Aスマートコントラクトの実装を解説したブログ記事の中で、@locationtba氏と**@2pmflow**氏は、最も一般的に使われるNFTスマートコントラクトのスターターコードであるOpenZeppelinのERC721Enumerableコントラクトを使ってバッチミントした場合と、新しいAzukiのERC721Aコントラクトを使ってバッチミントした場合とで、どれだけガス代が節約できるかの試算を示しています。

NUMBER MINTED
GAS USED (ENUMERABLE)
GAS USED (ERC721A)
GAS SAVED

Mint 1

154,814

76,690

78,124

Mint 2

270,339

78,819

191,520

Mint 3

384,864

80,948

303,916

Mint 4

501,389

83,077

418,312

Mint 5

616,914

85,206

531,708

この表は、ミント数が増えるにつれてERC721Aで使用されるガス量が、はるかに小さい一定の割合でしか増えないことを示しています。

NFTをミントする際のガス代の増加は次のとおりです。

  • Azuki ERC721Aコントラクトを使う場合:追加ミント1件あたり約2kガス
  • OpenZeppelinのERC721Enumerableコントラクトを使う場合:追加ミント1件あたり約115kガス

この結果は実に驚異的です。

ERC721Enumerableコントラクトでトークン1個をミントするのにかかる代金で、ERC721Aコントラクトなら最大5個(あるいはそれ以上)のトークンをミントできることになります。

ユーザーがミント代を最大80%節約できるとしたら、それを望まない人はいないでしょう。

さらに良い点があります。

個々の取引においてNFTのミント価格が下がるだけでなく、人気コレクションのドロップ時にEthereumネットワークに影響を与えるネットワーク混雑ガス価格の急騰も抑えられます。

なかなか興味深い話です。

複数NFTミント時のガス削減効果を検証する

自分でも実際に確認したかったので、NFTを作成する基本的なNFTコントラクトを2つ実装しました。

  1. ERC721Enumerableでミントするスマートコントラクト
  2. ERC721Aでミントするスマートコントラクト

次に、それぞれのミント関数を呼び出し、各トランザクションのガス代を記録しました。

結果は以下の通りです。

これらのテストのコードは、GitHubリポジトリdemo-erc721aから確認できます。

ここで示された複数NFTのミントにかかるガス代は、Azukiのブログ記事に示されている数値とはやや異なりますが、近い値であり、1件・2件・複数件とミント数が増えるにつれてガス代が増加するという傾向は一致しています。

バッチミントによるNFTのガス削減効果が検証できました。✅

ERC721Aスマートコントラクトはバッチミントでどのようにガス代を節約しているのか

ERC721Aは、コントラクト設計に影響を与えるいくつかの前提を置いています。

  1. トークンIDは常に0から連番で増加することです。ほとんどのNFTプロジェクトはすでにこの方式を採用しており、Azukiもこの前提を明示しています。
  2. NFTのミントにかかるガス代の削減を、他のERC721呼び出しの最適化よりも優先することです。ミント時にEthereumネットワークの混雑が発生しますし、ミントはユーザーがNFTコレクションに対して抱く最初の印象でもあります。ミントが簡単であるほど、評判は良くなります。

これらの前提のもと、ERC721Aは次のようなコントラクトの最適化を行っています。

  1. トークンメタデータの無駄な保存を削減する
  2. 所有権状態の更新を、ミントされたNFT1個ごとではなく、バッチミント1回ごとに限定する

これらの最適化がどのように行われているかを見ていく前に、どのようなトランザクションが最もガス代がかかるのかを理解しておく必要があります。

書き込みトランザクションの処理量を減らすことでガス代を節約できる

ブロックチェーン上のトランザクションは、大きく分けて書き込みと読み込みの2種類があります。

書き込みは、ブロックチェーンの状態を変更・更新するとき(例:送金、メッセージの書き込み、NFTの取引)に発生します。

読み込みは、既存のデータを取得して参照するときに発生します。

ユーザーは読み込み関数よりも書き込み関数の方に常に多くのガス代を支払います

したがって、書き込みトランザクションの回数を減らすか、書き込みトランザクションに必要な処理量を減らせば、たとえ後で読み込みトランザクションの処理量が増えたとしても、ユーザーが支払うNFTミントコストは削減されます。

そして、これがまさにERC721Aが実現していることです。

NFTのミントに関して言えば、ストレージが多いほど問題も多く、ストレージが少ないほど問題も少ないのです。

なるほど、これは巧妙な発想です。

Unit ID
Owner

#100

Alice

#101

<not set>

#102

<not set>

#103

Bob

#104

<not set>

ERC721Aコントラクトが所有権メタデータを設定する必要があるのは、Aliceのバッチについて1回、Bobのバッチについて1回の、計2回だけです。

ただし、これは明示的な所有者アドレスが設定されていないtokenIDを転送する場合、コントラクトが明示的な所有者アドレスを持つ最初のNFTに到達するまで全tokenIDに対してループを実行し、転送権限を持つ所有者を見つけたうえで新しい所有者を設定する必要があることを意味します。つまり、正しいグループ分けを維持するために、所有権状態を複数回変更することになります。

以下は転送シナリオをシミュレートしてガス代を記録するテストです。

Mint 1
Mint 2
Mint 3
Mint 4
Mint 5

t0

71355

92043

92043

92043

92043

t1

91197

111885

111885

117345

t2

93927

114615

114615

t3

96657

111885

t4

99387

この表の読み方は、まずx軸、次にy軸の順に見ていきます。例えば、

  • 「NFTを1個バッチミントしてから、tokenID 0を転送する」
  • 「NFTを3個バッチミントしてから、tokenID 1を転送する」
  • 「NFTを5個バッチミントしてから、tokenID 4を転送する」

といった具合です。

この結果から、大きなミントバッチの途中にあるtokenID(t1、t2など)を転送する方が、バッチの端にあるtokenID(t0、t4など)を転送するよりもコストがかかることがわかります。

なお、この簡単な実験ではミント後の単一転送のコストのみを追跡しています。

バッチミント後の転送コストを抑える回避策

NFTバッチ全体を転送する際の総コストを最小化する、興味深い解決策を紹介します(原典はWilliam Entriken氏 @fulldecent)。

  1. バッチミント時には常に許可されている最大数のNFTをミントする。
  2. 転送する際は、まず奇数番号のトークンを昇順で行う。
  3. その後、偶数番号のトークンを転送する。
その後の転送を安価に実行できるようにする
その後の転送を安価に実行できるようにする

この方法が有効なのは、\_addressDataマッピングの値を埋めることで、その後の転送を安価に実行できるようになるためです。

ERC721Aコントラクトを利用しているNFTプロジェクトの例

現在ERC721Aコントラクトを使用しているプロジェクト一覧は以下の通りです。

  • @AzukiZen
  • @cerealclubnft
  • @TheLostGlitches
  • @standardweb3
  • @KittyCryptoGang
  • @XRabbitsClub
  • @WhaleTogether
  • @pixelpiracynft
  • @dastardlyducks
  • @MissMetaNFT
  • @StarcatchersNFT
  • @LivesOfAsuna
  • @richsadcatnft
  • @themonkeypoly
  • @womenofcrypto_
  • @TravelToucans
  • @HuhuNFT

バッチミント向けのERC721Aの代替案

さらに踏み込んでみたい方は、ERC721規格をさらに最適化した新しい仕組みであるERC721Psiも確認してみてください。

ERC721規格のさらに新しい最適化であるERC721Psi
ERC721規格のさらに新しい最適化であるERC721Psi

この記事ではERC721Psiについて詳しくは扱いませんが、その仕組みについてもっと知りたい方は、@thatguyintechにツイートで知らせてください。改めて詳しく取り上げます。

Alchemyを使ったサンプルプロジェクトのデプロイも検討できます。

ERC721Aコントラクトは依然としてNFTと言えるのか

結論から言うと、そうです。ERC721Aコントラクトは間違いなくNFTです。

ERC721規格またはERC1155規格のインターフェースを実装しているコントラクトは、非代替性トークン(NFT)または準代替性トークンとみなされます。

ERC721Aは、ERC721規格の拡張・最適化版です。

これはERC721EnumerableやERC721Psiについても同様です。

これらはすべてERC721ファミリーの一部です。

ERC721Aトークンをバーンする方法

ウォレット内のNFTやトークンを処分したいが、他の人に譲るつもりも、売るつもりもない場合は、誰も使用していない特定のウォレットアドレスに送ることでバーン(焼却)できます。

多くの人は覚えやすいため、同じバーンアドレスを使いたがります。

例えば、0アドレスです。

0x0000000000000000000000000000000000000000

ただし、ERC721A NFTの場合、0アドレスに転送してNFTをバーンすることはできません。バッチでミントされたトークンの大半は、デフォルトで0アドレスにマッピングされているためです。

ERC721A NFTをバーンする際は、別のアドレスを選んでください。それで問題ありません。

例えば、よく使われる別のバーンアドレスとして「0xdead」アドレスがあります。0x000000000000000000000000000000000000dEaD

ERC721AコントラクトでNFTをバッチミントしますか?

ERC721Aコントラクトは、NFTをバッチミントすることで、コミュニティのガス代を節約し、Ethereumネットワークの不要な混雑を防ぐ強力な手段です。

どのようなNFTプロジェクトを構築しているか、そして私たちがどのようにお手伝いできるか、ぜひ教えてください。デプロイ、モニタリング、通知、そして次のNFTコレクションのマーケティングをサポートするツールを用意しています。

お待ちしています。@Alchemyにツイートするか、DMを送ってお気軽にお話しください。

Background gradient

ブロックチェーンで魔法を生み出す

Alchemyは、最も強力なweb3開発者向けプロダクトとツールを、豊富なリソース、コミュニティ、そして卓越したサポートと組み合わせて提供します。