---
title: "web3.jsを使ったNFTのミント方法"
description: "Web3.jsを使ってNFTをミントする手順を解説。デジタルアセットの世界を簡単に活用できます。"
---

# web3.jsを使ったNFTのミント方法

このチュートリアルでは、Web 3とPart I: How to Create an NFTで作成したスマートコントラクトを使って、Ethereumブロックチェーン上にNFTをミントする方法を説明します

_このガイドの所要時間の目安：約10分_

また、NFTチュートリアルシリーズの他の記事もぜひご覧ください：

- 🪄  [How to mint an NFT with Ether.js](https://www.alchemy.com/blog/how-to-mint-an-nft-with-ethers-js)
- 👛  [How to view your NFT in your mobile wallet](https://www.alchemy.com/blog/how-to-view-your-nft-in-your-mobile-wallet)
- 💸  [How to set a price on an NFT](https://www.alchemy.com/blog/how-to-set-a-price-on-an-nft)
- 💻  [NFT minter tutorial: How to create a full stack dApp](https://www.alchemy.com/blog/nft-minter-tutorial-how-to-create-a-full-stack-dapp)

「NFTをミントする」とは、ERC721トークンの一意のインスタンスをブロックチェーン上に公開する行為を指します。このNFTチュートリアルシリーズのPart Iで[Sepoliaネットワークへのスマートコントラクトのデプロイ](https://www.alchemy.com/blog/how-to-create-an-nft)に成功したので、web3のスキルを活かしてNFTをミントしていきましょう！

このチュートリアルを終える頃には、このコードを使って好きなだけNFTをミントできるようになります。それでは始めましょう！

## ステップ1：Web3をインストールする

[NFTスマートコントラクトの作成](https://www.alchemy.com/docs#create-and-deploy-your-smart-contract-using-hardhat)に関する最初のチュートリアルを進めていれば、Ethers.jsを使った経験がすでにあるはずです。Web3はEthersと似ており、Ethereumブロックチェーンへのリクエスト作成を容易にするためのライブラリです。このチュートリアルでは、自動リトライと堅牢なWebSocketサポートを提供する拡張web3ライブラリである[Alchemy Web3](https://www.alchemy.com/docs)を使用します。

プロジェクトのホームディレクトリで以下を実行します：

## ステップ2：mint-nft.jsファイルを作成する

scriptsディレクトリ内にmint-nft.jsファイルを作成し、以下のコードを追加します：

## ステップ3：コントラクトABIを取得する

コントラクトABI（Application Binary Interface）は、スマートコントラクトとやり取りするためのインターフェースです。[Hardhat](https://www.alchemy.com/dapps/hardhat)が自動的にABIを生成し、MyNFT.jsonファイルに保存します。これを使用するには、**mint-nft.js**ファイルに以下のコードを追加して内容をパースする必要があります：

ABIを確認したい場合は、コンソールに出力できます：

**mint-nft.js**を実行してABIをコンソールに出力するには、ターミナルで以下を実行します

## ステップ4：IPFSを使ってNFTのメタデータを設定する

Part Iのチュートリアルを覚えていれば、mintNFTスマートコントラクト関数はtokenURIパラメータを受け取り、これがNFTのメタデータを記述するJSONドキュメントに解決される必要があることを思い出すでしょう。このメタデータこそがNFTに命を吹き込むものであり、名前、説明、画像、その他の属性といった設定可能なプロパティを持たせることができます。

<CalloutBlock>

Interplanetary File System（IPFS）は、分散ファイルシステムでデータを保存・共有するための分散型プロトコルであり、ピアツーピアネットワークです。

</CalloutBlock>

NFTが真に分散化されていることを保証するため、NFTのアセットとメタデータの保存には、便利なIPFS APIおよびツールキットである[Pinata](https://pinata.cloud/)を使用します。[Pinata](https://www.alchemy.com/dapps/pinata)のアカウントを持っていない場合は、[pinata.cloud](https://pinata.cloud/)で無料アカウントに登録し、メール認証の手順を完了してください。

アカウントを作成したら：

- 右上の「Pinata Upload」ボタンに移動します
- Pinataに画像をアップロードします—これがNFTの画像アセットになります。アセットの名前は自由に付けて構いません
- アップロード後、ページ上部に緑色のポップアップが表示され、アップロードのハッシュを確認できます—そのハッシュコードをコピーしてください。アップロードしたものは以下で確認できます：`https://gateway.pinata.cloud/ipfs/<hash-code>`

視覚的に理解したい方向けに、上記の手順をまとめました。次に、Pinataにもう一つドキュメントをアップロードします。ただし、その前にそのドキュメントを作成する必要があります！

<ImageBlock
  src="https://media.alchemy.com/1704625396-pinata-upload.gif"
  alt="Pinataダッシュボード:NFT画像アセットをIPFSにアップロード"
  width={844}
  height={480}
  caption="Pinataへのファイルアップロード"
/>

ルートディレクトリ内にnft-metadata.jsonという新しいファイルを作成し、以下のjsonコードを追加します：

​jsonの内容は自由に変更して構いません。attributesセクションの項目を削除したり追加したりできます。最も重要なのは、image欄がIPFS画像の場所を指すようにすることです—そうしないと、NFTには（とても可愛い！）犬の写真が含まれることになります。

jsonファイルの編集が終わったら保存し、画像のアップロード時と同じ手順でPinataにアップロードします。

<ImageBlock
  src="https://media.alchemy.com/1704625535-upload-json-file-to-pinata.gif"
  alt="Pinataダッシュボード:NFTメタデータJSONファイルをアップロード"
  width={844}
  height={480}
  caption="PinataへのJSONファイルアップロード"
/>

## ステップ5：コントラクトのインスタンスを作成する

コントラクトとやり取りするには、コード内でそのインスタンスを作成する必要があります。そのためには、コントラクトのデプロイ時に取得したコントラクトアドレス、または[Etherscan](https://sepolia.etherscan.io/)でコントラクトをデプロイしたアドレスを検索して取得したものが必要です。

<ImageBlock
  src="https://media.alchemy.com/1704625679-create-an-instance-of-contract.png"
  alt="Etherscan:デプロイ済みNFTコントラクトアドレスの検索"
  width={2880}
  height={1510}
  caption="コントラクトのインスタンスを作成"
/>

上記の例では、コントラクトアドレスは0x81c587EB0fE773404c42c1d2666b5f557C470eEDです。

次に、web3の[contractメソッド](https://web3js.readthedocs.io/en/v1.2.0/web3-eth-contract.html?highlight=constructor#web3-eth-contract)を使い、ABIとアドレスを使ってコントラクトを作成します。**mint-nft.js**ファイルに以下を追加します：

## ステップ6：.envファイルを更新する

Ethereumチェーンにトランザクションを作成・送信するために、パブリックなEthereumアカウントアドレスを使用してアカウントの**nonce**を取得します（後述します）。

**.env**ファイルにパブリックキーを追加してください—チュートリアルのPart 1を完了していれば、**.env**ファイルは以下のようになっているはずです：

## ステップ7：トランザクションを作成する

まず、`mintNFT(tokenData)`という関数を定義し、以下の手順でトランザクションを作成します：

1. .envファイルから**PRIVATE_KEY**と**PUBLIC_KEY**を取得します。
1. 次に、アカウントのnonceを調べる必要があります。nonceは、あなたのアドレスから送信されたトランザクション数を追跡するために使われ、セキュリティ上の理由や[リプレイ攻撃](https://www.alchemy.com/docs)を防ぐために必要です。アドレスから送信されたトランザクション数を取得するには、[getTransactionCount](https://www.alchemy.com/docs)を使用します。
1. 最後に、以下の情報を使ってトランザクションを設定します：
1. **'from': PUBLIC_KEY**：トランザクションの発信元は自分のパブリックアドレスです
1. **'to': contractAddress**：やり取りしトランザクションを送信するコントラクトです
1. **'nonce': nonce**：自分のアドレスから送信されたトランザクション数を示すアカウントnonceです
1. **'gas': estimatedGas**：トランザクションの完了に必要な推定ガス量です
1. **'maxPriorityFeePerGas': estimatedFee**：ガスあたりの入札推定手数料です
1. **'data': nftContract.methods.mintNFT\(PUBLIC_KEY, md\).encodeABI\(\)**：このトランザクションで実行したい計算内容—この場合はNFTのミントです

`mint-nft.js`ファイルは、今頃以下のようになっているはずです：

<CalloutBlock>

**複数のNFTをミントするには：** 単一のコマンドでx個のNFTをミントするには、ミント処理をラップする関数の中で0からx-1まで実行する単純なforループを使用します。これにより、ラッパーのmint関数が呼び出されるたびに、x個のNFTを効率的にミントできるようになります。

</CalloutBlock>

## ステップ8：トランザクションに署名する

トランザクションを作成したので、次はそれを送信するために署名する必要があります。ここでプライベートキーを使用します。

`web3.eth.sendSignedTransaction`はトランザクションハッシュを返してくれるので、これを使ってトランザクションがマイニングされたか、ネットワークにドロップされずに済んだかを確認できます。トランザクション署名のセクションでは、トランザクションが正常に完了したかどうかを把握できるよう、エラーチェックを追加していることにお気づきでしょう。‍

## ステップ9：mintNFTを呼び出しnode contract-interact.jsを実行する

Pinataにアップロードしたmetadata.jsonを覚えていますか？Pinataからそのハッシュコードを取得し、以下をmintNFTの呼び出しに渡します [https://gateway.pinata.cloud/ipfs/](https://gateway.pinata.cloud/ipfs/%3Chash-code%3E)​

ハッシュコードの取得方法は以下の通りです：

<ImageBlock
  src="https://media.alchemy.com/1704625935-get-the-hashcode-on-pinata.gif"
  alt="Pinataダッシュボード:アップロード済みメタデータのIPFSハッシュをコピー"
  width={844}
  height={480}
  caption="Pinataでハッシュコードを取得"
/>

<CalloutBlock>

コピーしたハッシュコードが`metadata.json`に正しくリンクしているかどうか、[https://gateway.pinata.cloud/ipfs/](https://gateway.pinata.cloud/ipfs/%3Chash-code%3E)を別ウィンドウで開いて再確認してください。ページは以下のスクリーンショットのようになるはずです：

</CalloutBlock>

<ImageBlock
  src="https://media.alchemy.com/1704626043-returned-hashcode-on-pinata.png"
  alt="Pinata IPFSゲートウェイから返されたNFTメタデータJSON"
  width={2878}
  height={1714}
  caption="Pinataで返されたハッシュコード"
/>

すべてをまとめると、コードは以下のようになるはずです：

では、`node scripts/mint-nft.js`を実行してNFTをデプロイしましょう。数秒後、ターミナルに以下のようなレスポンスが表示されるはずです：

次に、[Alchemy mempool](https://dashboard.alchemy.com/mempool)にアクセスして、トランザクションの状態（保留中、マイニング済み、またはネットワークにドロップされたか）を確認してください。トランザクションがドロップされた場合は、[Sepolia Etherscan](https://sepolia.etherscan.io/)でトランザクションハッシュを検索して確認するのも有用です。

<ImageBlock
  src="https://media.alchemy.com/1704626257-search-for-transaction-hash.png"
  alt="NFTミント取引ハッシュのブロックエクスプローラー検索"
  width={2846}
  height={1586}
  caption="取引ハッシュを検索"
/>

以上です！これでEthereumブロックチェーン上にNFTをデプロイし、ミントすることができました 🎉

`mint-nft.js`を使えば、あなたの心（と財布）が望むだけNFTをミントできます！ただし、NFTのメタデータを記述する新しい`tokenURI`を必ず渡すようにしてください—そうしないと、IDだけ異なる同一のNFTを量産することになります。

おそらく、ウォレット内でNFTを見せびらかしたいと思っていることでしょう😉—ぜひPart III：[How to View Your NFT in Your Wallet](/blog/how-to-view-your-nft-in-your-mobile-wallet)もご覧ください。
