Mobile Factory Tech Blog

技術好きな方へ!モバイルファクトリーのエンジニアたちが楽しい技術話をお届けします!

ERC721 の extension の違いによるコストの比較

この記事はモバイルファクトリー Advent Calendar 2020 25日目の記事です。長かったアドベントカレンダーもこれがラストです。今年も25日まで毎日技術記事を楽しみに過ごせました。


こんにちは、ブロックチェーンチームのソフトウェアエンジニア id:odan3240 です。

ERC721 の extension

ERC721 は Ethereum における Non-Fungible Token (以下 NFT) の規格です。ERC721 には様々な extension が存在しており、OpenZeppelin では次の種類の extension が実装されています。

  • Mintable
    • NFT を mint できる
  • Burnable
    • NFT を burn できる
  • Enumerable
    • NFT を数えられる
  • Metadata
    • NFT とオフチェーンのメタデータを繋げられる
  • Pausable
    • NFT の転送を停止できる

この中でも Enumerable は NFT を数えられるようになる一方で、gas used (以下 コスト) 増加することが知られています。

speakerdeck.com

今回 Enumerable 以外の extension に対してコストの増加を調べたので、これを共有します。

実験の設定

実験の各パターンは次の通りです。Mintable をベースに他の extension を追加しています。

  • Basic (Mintable)
  • CaseBurnable (Mintable + Burnable)
  • CaseEnumerable (Mintable + Enumerable)
  • CaseMetadata (Mintable + Metadata)
  • CasePausable (Mintable + Pausable)

バージョン

  • solidity: 0.5.17
  • Ethereum の hardfork: Muir Glacier
  • @openzeppelin/contracts: 2.5.1 1

ソースコード

github.com

実験結果

deploy/mint/transferFrom の各コストは次の通りです。

deploy mint transferFrom
Basic 2,113,681 67,978 61,602
CaseBurnable 2,259,122 67,978 61,602
CaseEnumerable 2,455,003 153,561 92,696
CaseMetadata 2,538,433 67,978 61,624
CasePausable 2,541,757 67,978 62,497

わかりやすく gas price が 70Gwei、円と ETH のレートが 62608円/ETH としてコストを日本円に換算すると次のようになります。

deploy mint transferFrom
Basic ¥9,263 ¥298 ¥270
CaseBurnable ¥9,901 ¥298 ¥270
CaseEnumerable ¥10,759 ¥673 ¥406
CaseMetadata ¥11,125 ¥298 ¥270
CasePausable ¥11,139 ¥298 ¥274

すでに知られているように Enumerable を実装するとトークンの mint/transferFrom のコストが約2倍に増加することがわかりました。 また deploy のコストについては、各 extension を実装すると増加し、Pausable を実装するのが約1.2倍と一番大きな増加率になることがわかりました。

まとめ

ERC721 の extension の違いによるコストの増加について調べました。

deploy はどの extension でもコストが増加しました。トークンの mint/transferFrom については Enumerable を実装するとコストが増加しました。

どの extension を ERC721 に実装するかは作りたいトークンの要件にもよりますが、実装すると何かしらのコストが増加する可能性を考慮しておくと良さそうです。


無事にモバイルファクトリー Advent Calendar 2020は25日完走できました。それでは皆さん良いお年を!


  1. @openzeppelin/contracts の最新版は v3 系ですが、v3 系は Enumerable がデフォルトで組み込まれていて実験に適さないので v2 系