ミント手数料を 532 USD から 19 USD に値下げ記事　第一

# 概要
最近、弊社はミント NFT プロジェクトを実装しましたが、オンチェーンで満たす必要がある条件がたくさんあります。これには、一度に多数のNFTを一括ミントする必要性が含まれます。コードをデプロイして実行すると、すべて問題ありません。ただし、一度に大量のNFTをミントするとガス料金が非常に高額になるという問題があります。具体的には、50 NFT あたり約 532 米ドルの費用がかかります。

ガス代を安くする方法は以下の記事で紹介しています。
記事は 2 つの部分に分かれています
1.	スマートコントラクトタイプの変更によりガス料金を532ドルから159ドルに削減
2.	ランダム方式を変更することでガソリンを159ドルから19ドルにさらに削減

# 目次
**1\.  パート 1: スマートコントラクトタイプの変更により、ガス料金を 532 USD から 159 USD に削減**
- マートコントラクトのロジック
- ミント後の手数料
- 原因の判明
- 実行して結果を確認する

**2\.  パート 2: ランダムな方法を変更することで、ガソリンを 159 米ドルから 19 米ドルにさらに削減**
- 結論

# 内容
## パート 1: スマートコントラクトタイプの変更により、ガス料金を 532 USD から 159 USD に削減

### スマートコントラクトのロジック
1.	ユーザーが請求できる、請求できるNFTの数を確認する
2.	セッションが開かれていること、セッション内の NFT の数を確認する
3.	ランダムな文字、文字数を確認

### mint後の手数料
1.	ミント1NFT：25USD 約3500円
2.	ミント50NFT： 532USD 約75000円

ガス料金を見てみると、Mint 50 NFTだけで500ドル以上かかることに本当に驚きました。したがって、これらのNFTが無料でmintされたとしても、mintにそれほどの手数料を費やすことができる人はほとんどいません。

### 原因判明
スマート コントラクト コードを実装する場合、hardhat-gas-reporter プラグインを使用してガスを確認できます (使用方法はhttps://www.npmjs.com/package/hardhat-gas-reporterで参照できます)。

ただし、オンチェーン テスト ツールhttps://dashboard.tenderly.co/を使用します。
上記のページに移動し、検索ボックスに「トランザクション ハッシュ」と入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049331/4283a421-30ee-b60c-d45a-462e7fafb472.png)

「ガスプロファイラー」タブを選択すると、各機能で使用されるガス量の詳細が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049331/34e1f0e7-82cf-67fc-1afd-f892fcdfdccd.png)

ここでは、mintBatch 関数が 50NFT をミントするのに約 7497614 ガスのコストがかかることがわかります。
mintBatch 関数をクリックすると、サブ関数の詳細が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049331/df81c225-5a81-ed01-ec30-489dccdcb52d.png)

MintBatch は 50 回実行され (_mintNormalType)、次のように表示されます。各 _mintNormalType のガスの数は約 150000 ガスです。

以下に、_mintNormalType 関数の詳細を示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049331/eea472ad-8c36-c788-46b2-f031e733dd9f.png)

この関数では、ランダムおよび処理ロジックが約 25% (約 42,000 ガス) を占め、残りが _mint 関数です。

ERC721Enumerable 標準を使用して、ユーザーのすべての NFT を簡単に取得します (tokenOfOfOwnerByIndex 関数)。しかし、これも問題であり、ERC721Enumerableは、_beforeTokenTransferと_addTokenToOwnerEnumerationを使用して、ユーザーに従ってNFTのtokenIdを保存します。したがって、ミントを作成するたびに、これらの値がチェックされて割り当てられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049331/2f833478-c940-2b74-77f2-60f035495d6f.png)

確認したところ、_beforeTokenTransfer は _mintNormalType の約 60% である約 96000 ガスを使用していることがわかりました。

コードの最適化（要件の削除とERC721Enumerableの削除）を試みたところ、50NFT鋳造時のガス量は約2910730ガスでした。

|  | ガス | USD |
|:-----------|------------:|:------------:|
| 実装前       | 7343814        | 532         |
| 実装後     | 2910730      | 210       |

最適化後、ガスは約 60% 削減されましたが、それでも予想に比べて非常に多かったです。

やることがなくなってきたときに、opensea テストネットでコレクションを作成しました。
そこでopenseaが作ったスマートコントラクトを見に行ったのですが、驚きました。 Opensea は ERC721 標準を使用せず、ERC721A を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049331/f150b550-cc7a-a0e6-c8f1-6fb5c9d59fe2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049331/2740d834-068d-cdc4-5d7f-0ca34eada293.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049331/e3da7677-cb07-0d28-9435-f2d26a988e63.png)

ERC721Aについて勉強してみました。大量鋳造時のガス削減については以下の記事がとても詳しく書かれています。
https://medium.com/@dumbnamenumbers/your-guide-to-erc721a-july-2022-f81f0be84a54
実装の詳細とその仕組みを説明するには、上のページにアクセスしてください。

ここでは、誰でも ERC721A がどのように機能するかを簡単に理解できるように説明します
。たとえば、下の画像には 2 つのバッチ ミント コールがあり、1 つはアリスによる 1 回のコールでトークン #100、#101、#102 をミントするためのコールで、もう 1 つは によるコールです。ボブはトークン #103 と #104 を鋳造します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049331/7cb2c256-2af5-cb71-4c5e-b5236d17deff.png)

ERC721A は、所有者データを 2 回設定するだけで済みます。1 回はアリスのバッチ用、もう 1 回はボブのバッチ用です。したがって、1 人のユーザーに対して複数のトークンを作成すると、非常に経済的になります。
ただし、これは、明示的な所有者アドレスなしで tokenID を転送する場合、コントラクトは、明示的な所有者アドレスを持つ最初の NFT に到達するまですべての tokenID に対してループを実行して所有者を見つける必要があることも意味します。新しい所有者。
ここからはERC721Aを使用する場合に重要な3つのポイントを指摘したいと思います。
1.	一度により多くのNFTを鋳造すると鋳造手数料が削減されます
2.	初回送金時の手数料が高くなります
3.	2回目以降の送金手数料はERC721を利用した場合と同額となります。

## 実行して結果を確認する
ERC721A をプロジェクトに適用し、テストしたところ、驚くべき結果が得られました。
以下は、一度に50個のNFTを鋳造するコストです。

| NFT種類 | ガス | USD |
|:-----------|------------:|:------------:|
| ERC721       | 7343814        | 532         |
| ERC721A     | 1753653      | 159       |

ERC721 から ERC721A を使用するように変更するだけで、一度に 50 NFT の鋳造コストを最大 73% 節約できます。
1 ユーザーあたり 1 トークンの転送コストは次のとおりです。
-	転送トークンID 1

| NFT種類 | 初回 | ２回目 |
|:-----------|------------:|:------------:|
| ERC721       | 62190        | 40290         |
| ERC721A     | 68971      | 46574       |

-	転送トークンID 50

| NFT種類 | 初回 | ２回目 |
|:-----------|------------:|:------------:|
| ERC721       | 62190        | 40290         |
| ERC721A     | 192343      | 46574       |

ここから、ERC721A での転送には初回の転送料金が高くなり、ユーザー数が増えるほど初回の転送料金も高くなることがわかります。

## パート 2: ランダムな方法を変更することで、ガソリンを 159 米ドルから 19 米ドルにさらに削減

ガソリンを532ドルから159ドルに減らしても、まだ高いことがわかりました。そこで、スマートコントラクトのロジックを変更することにしました。ランダム部分を移動し、スマートコントラクトからバックエンドへのNFTのタイプを選択し、ランダム出所とミントを順番に使用してコストを最適化しました。ランダム出所を使用して、ランダム トークンが完全に透明であることを確認します。
参考リンク:
-	https://dev.to/brodan/learning-nft-provenance-by-example-a-bored-ape-investigation-hfe
-	https://boredapeyachtclub.com/#/provenance
-	https://provenance.thebearnbear.com/

手順:
-	私が取り組んでいるプロジェクトには、合計7777のNFTがあります。 7777 個の NFT に対応する 7777 個の画像をランダムに実行し、SHA-256 アルゴリズムに従ってこれらすべての画像をハッシュして、対応するハッシュを作成します。 (リンクツール: https://github.com/rizwanmoulvi/Mass-NFT-Image-Hashing-Tool )

たとえば、この画像では、SHA-256 ハッシュを使用すると、ハッシュは715e42b354a68eec3951d79a5ad9a427e9d341577a6beb3cf7abec9c9a8aeb9dになります。
-	7777 個のハッシュ化されたハッシュを 1 つの文字列に連結します。
715e42b354a68eec3951d79a5ad9a427e9d341577a6beb3cf7abec9c9a8aeb9dc2784e4d5ca6013e417d35929a174de3eb6061399d372cdd5ce5de9ca6a06612cd8068ce15e1209ce4e35c311474425b10b454b9db0edfed5c72ca17ff209d8d3488094ade5900d9056b204e5f560c372d852ae3d53839d32a0eeb2f6a6ef94c0852a3a849bad882278c9789b8761771089d0e0a1efff2e730d84c2760671225….. .
-	次に、SHA-256 を使用してこの文字列を再度ハッシュし、最終的な証明ハッシュを取得します。
  	cb53ba5c86fec562c9b91e4576c1875ab48c941d9428e974aa5d130c953e7fc5
-	すべてのハッシュと最終証明ハッシュは公開され、不変となり、鋳造時のすべての NFT の透明性を確保します。
-	私が取り組んでいるプロジェクトでは、NFT の機密性を確保するために、NFT が鋳造された後に画像、メタデータ、ハッシュなどの情報のみを表示し、ユーザーが次の画像に頼って鋳造を決定することができないようにしています。リンク来歴： https: //dao.hlpeace.jp/ja/provenance

最適化後に一度に50個のNFTを鋳造するコストです。

| NFT種類 | ガス | USD |
|:-----------|------------:|:------------:|
| ERC721       | 1753653        | 159         |
| ERC721A  ＋　+ランダムな出所   | 209556      | 19       |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049331/2b3f3011-eb91-e2a6-760f-04cc8136f880.png)

Random Provenanceを適用して実際に実行した後の1 Claim 50NFTの詳細は次のとおりです。ファンクションミントのコストは 140819 ガスのみです。したがって、ランダム ロジックを変更した後、鋳造コストは約 22% 削減されました。

### 結論
ランダム出所、逐次鋳造を組み合わせて使用することで、オリジナルと比較して鋳造コストが最大 96% 削減されましたが、最初の送金手数料が ERC721 よりも高くなるのが限界です。