この記事はモバイルファクトリー 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 (以下 コスト) 増加することが知られています。
今回 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
ソースコード
実験結果
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日完走できました。それでは皆さん良いお年を!
-
@openzeppelin/contracts の最新版は v3 系ですが、v3 系は Enumerable がデフォルトで組み込まれていて実験に適さないので v2 系↩