メインコンテンツへスキップ

NFTのミント方法(NFTチュートリアルシリーズの2/3)

ERC-721
Alchemy
Solidity
スマートコントラクト
初級
Sumi Mudgil
2021年4月22日
14 分の読書

Beeple (opens in a new tab): 6900万ドル 3LAU (opens in a new tab): 1100万ドル Grimes (opens in a new tab): 600万ドル

いずれもAlchemyの強力なAPIを使ってNFTをミントしています。 このチュートリアルでは、<10分で同じことを行う方法を説明します。

「NFTのミント」とは、ブロックチェーン上にERC-721トークンのユニークなインスタンスを公開することです。 このNFTチュートリアルシリーズのパート1で作成したスマートコントラクトを使って、Web3のスキルを駆使し、NFTをミントしてみましょう。 このチュートリアルが終わるころには、あなた(とウォレット)が望むだけNFTをミントできるようになります。

さあ、始めましょう。

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

NFTスマートコントラクトの作成に関する最初のチュートリアルに沿って進めている場合、すでにEthers.jsを使用した経験があるはずです。 Web3はEthersと同様、イーサリアムブロックチェーンへのリクエストを簡単に作成するために使用されるライブラリです。 このチュートリアルでは、自動再試行と堅牢なWebSocketサポートを提供する拡張Web3ライブラリであるAlchemy Web3 (opens in a new tab)を使用します。

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

1npm install @alch/alchemy-web3

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

scriptsディレクトリ内にmint-nft.jsファイルを作成し、以下のコード行を追加してください。

1require("dotenv").config()
2const API_URL = process.env.API_URL
3const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
4const web3 = createAlchemyWeb3(API_URL)

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

コントラクトABI (Application Binary Interface) は、スマートコントラクトと対話するためのインターフェイスです。 コントラクトABIの詳細はこちら (opens in a new tab)をご覧ください。 Hardhatは自動的にABIを生成し、MyNFT.jsonファイルに保存します。 これを使用するには、mint-nft.jsファイルに以下のコード行を追加してコンテンツを解析する必要があります。

1const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")

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

1console.log(JSON.stringify(contract.abi))

mint-nft.jsを実行し、コンソールに出力されたABIを確認するには、ターミナルに移動して以下を実行します。

1node scripts/mint-nft.js

ステップ4: IPFSを使用してNFTのメタデータを設定する

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

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

NFTが真に分散化されるように、便利なIPFS APIおよびツールキットであるPinataを使用して、NFTのアセットとメタデータを保存します。 Pinataのアカウントをお持ちでない場合は、こちら (opens in a new tab)から無料アカウントにサインアップし、メールアドレスの認証手続きを完了してください。

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

  • 「Files」ページに移動し、ページの左上にある青い「Upload」ボタンをクリックします。

  • 画像をPinataにアップロードします。これがあなたのNFTの画像アセットになります。 アセットには自由に名前を付けてかまいません。

  • アップロード後、「Files」ページのテーブルにファイル情報が表示されます。 CID列も表示されます。 隣にあるコピーボタンをクリックすると、CIDをコピーできます。 アップロードしたファイルは https://gateway.pinata.cloud/ipfs/<CID> で確認できます。 例えば、私たちが使用した画像はIPFS上のこちら (opens in a new tab)にあります。

視覚的に学習したい方のために、上記の手順を以下にまとめます。

Pinataに画像をアップロードする方法

さて、Pinataにもう一つドキュメントをアップロードします。 しかしその前に、それを作成する必要があります。

ルートディレクトリに nft-metadata.json という新しいファイルを作成し、以下のJSONコードを追加してください。

1{
2 "attributes": [
3 {
4 "trait_type": "品種",
5 "value": "マルプー"
6 },
7 {
8 "trait_type": "目の色",
9 "value": "モカ"
10 }
11 ],
12 "description": "世界で最も愛らしくて繊細な子犬です。",
13 "image": "ipfs://QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb",
14 "name": "ラムセス"
15}
すべて表示

JSON内のデータは自由に変更してかまいません。 attributesセクションは削除したり、追加したりできます。 最も重要なのは、imageフィールドがあなたのIPFS画像の場所を指していることを確認することです。さもなければ、あなたのNFTには(とてもかわいい!) 犬の写真が含まれてしまいます。

JSONファイルの編集が終わったら保存し、画像をアップロードしたのと同じ手順でPinataにアップロードしてください。

nft-metadata.jsonをPinataにアップロードする方法

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

さて、コントラクトとやりとりするには、コード内でそのインスタンスを作成する必要があります。 そのためにはコントラクトアドレスが必要ですが、これはデプロイメントから取得するか、コントラクトのデプロイに使用したアドレスをBlockscout (opens in a new tab)で検索することで取得できます。

Etherscanでコントラクトアドレスを表示

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

次に、ABIとアドレスを使い、Web3のcontractメソッド (opens in a new tab)でコントラクトを作成します。 mint-nft.jsファイルに、以下を追加します。

1const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
2
3const nftContract = new web3.eth.Contract(contract.abi, contractAddress)

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

さて、イーサリアムチェーンにトランザクションを作成して送信するために、あなたの公開イーサリアムアカウントアドレスを使用してアカウントのノンス(後述)を取得します。

あなたの公開鍵を.envファイルに追加してください。チュートリアルのパート1を完了している場合、.envファイルは次のようになっているはずです:

1API_URL = "https://eth-sepolia.g.alchemy.com/v2/あなたのAPIキー"
2PRIVATE_KEY = "あなたのプライベートアカウントアドレス"
3PUBLIC_KEY = "あなたのパブリックアカウントアドレス"

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

まず、mintNFT(tokenData)という名前の関数を定義し、以下のようにトランザクションを作成します。

  1. .envファイルから_PRIVATE_KEY_と_PUBLIC_KEY_を取得します。

  2. 次に、アカウントのノンスを確認する必要があります。 ノンスの仕様は、あなたのアドレスから送信されたトランザクション数を追跡するために使用されます。これは、セキュリティ上の目的と、リプレイ攻撃 (opens in a new tab)を防ぐために必要です。 あなたのアドレスから送信されたトランザクション数を取得するには、getTransactionCount (opens in a new tab)を使用します。

  3. 最後に、以下の情報でトランザクションをセットアップします。

  • 'from': PUBLIC_KEY — トランザクションの発信元である、私たちの公開アドレス

  • 'to': contractAddress — やりとりを行い、トランザクションを送信したいコントラクト

  • 'nonce': nonce — 私たちのアドレスから送信されたトランザクション数を含むアカウントのノンス

  • 'gas': estimatedGas — トランザクションを完了するために必要な推定ガス量

  • 'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI() — このトランザクションで実行したい計算、この場合はNFTのミント

mint-nft.jsファイルは次のようになっているはずです:

1 require('dotenv').config();
2 const API_URL = process.env.API_URL;
3 const PUBLIC_KEY = process.env.PUBLIC_KEY;
4 const PRIVATE_KEY = process.env.PRIVATE_KEY;
5
6 const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
7 const web3 = createAlchemyWeb3(API_URL);
8
9 const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json");
10 const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778";
11 const nftContract = new web3.eth.Contract(contract.abi, contractAddress);
12
13 async function mintNFT(tokenURI) {
14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, 'latest'); //get latest nonce
15
16 //トランザクション
17 const tx = {
18 'from': PUBLIC_KEY,
19 'to': contractAddress,
20 'nonce': nonce,
21 'gas': 500000,
22 'data': nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI()
23 };
24 }
すべて表示

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

トランザクションを作成したので、次に送信するために署名する必要があります。 ここで秘密鍵を使用します。

web3.eth.sendSignedTransactionはトランザクションハッシュを返します。これを使用して、トランザクションがマイニングされ、ネットワークによってドロップされなかったことを確認できます。 トランザクション署名のセクションでは、トランザクションが正常に実行されたかどうかを知るために、エラーチェックを追加していることにお気づきでしょう。

1require("dotenv").config()
2const API_URL = process.env.API_URL
3const PUBLIC_KEY = process.env.PUBLIC_KEY
4const PRIVATE_KEY = process.env.PRIVATE_KEY
5
6const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
7const web3 = createAlchemyWeb3(API_URL)
8
9const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")
10const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
11const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
12
13async function mintNFT(tokenURI) {
14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce
15
16 //トランザクション
17 const tx = {
18 from: PUBLIC_KEY,
19 to: contractAddress,
20 nonce: nonce,
21 gas: 500000,
22 data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(),
23 }
24
25 const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)
26 signPromise
27 .then((signedTx) => {
28 web3.eth.sendSignedTransaction(
29 signedTx.rawTransaction,
30 function (err, hash) {
31 if (!err) {
32 console.log(
33 "トランザクションのハッシュ: ",
34 hash,
35 "\nAlchemyのメンプールでトランザクションのステータスを確認してください!"
36 )
37 } else {
38 console.log(
39 "トランザクションの送信中に問題が発生しました:",
40 err
41 )
42 }
43 }
44 )
45 })
46 .catch((err) => {
47 console.log(" Promiseが失敗しました:", err)
48 })
49}
すべて表示

ステップ9: mintNFTを呼び出し、node mint-nft.jsを実行する

Pinataにアップロードしたmetadata.jsonを覚えていますか? Pinataからそのハッシュコードを取得し、https://gateway.pinata.cloud/ipfs/<metadata-hash-code>をパラメータとしてmintNFT関数に渡します。

ハッシュコードを取得する方法は次のとおりです。

PinataでNFTメタデータのハッシュコードを取得する方法PinataでNFTメタデータのハッシュコードを取得する方法

別のウィンドウで https://gateway.pinata.cloud/ipfs/<metadata-hash-code> を読み込み、コピーしたハッシュコードがあなたのmetadata.jsonにリンクしていることを再確認してください。 ページは下のスクリーンショットのようになっているはずです。

ページにJSONメタデータが表示されるはずですページにJSONメタデータが表示されるはずです

すべてをまとめると、コードは次のようになります。

1require("dotenv").config()
2const API_URL = process.env.API_URL
3const PUBLIC_KEY = process.env.PUBLIC_KEY
4const PRIVATE_KEY = process.env.PRIVATE_KEY
5
6const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
7const web3 = createAlchemyWeb3(API_URL)
8
9const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")
10const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"
11const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
12
13async function mintNFT(tokenURI) {
14 const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce
15
16 //トランザクション
17 const tx = {
18 from: PUBLIC_KEY,
19 to: contractAddress,
20 nonce: nonce,
21 gas: 500000,
22 data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(),
23 }
24
25 const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)
26 signPromise
27 .then((signedTx) => {
28 web3.eth.sendSignedTransaction(
29 signedTx.rawTransaction,
30 function (err, hash) {
31 if (!err) {
32 console.log(
33 "トランザクションのハッシュ: ",
34 hash,
35 "\nAlchemyのメンプールでトランザクションのステータスを確認してください!"
36 )
37 } else {
38 console.log(
39 "トランザクションの送信中に問題が発生しました:",
40 err
41 )
42 }
43 }
44 )
45 })
46 .catch((err) => {
47 console.log("Promiseが失敗しました:", err)
48 })
49}
50
51mintNFT("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP")
すべて表示

さて、node scripts/mint-nft.jsを実行して、NFTをミントしましょう。 数秒後、ターミナルに次のような応答が表示されるはずです。

1トランザクションのハッシュ: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8
2
3Alchemyのメンプールでトランザクションのステータスを確認してください!

次に、Alchemyメンプール (opens in a new tab)にアクセスして、トランザクションのステータス(ペンディング、マイニング済み、またはネットワークによるドロップ)を確認します。 トランザクションがドロップされた場合は、Blockscout (opens in a new tab)でトランザクションハッシュを検索して確認することも役立ちます。

EtherscanでNFTトランザクションハッシュを表示EtherscanでNFTトランザクションハッシュを表示

以上です。 これで、イーサリアムブロックチェーン上でNFTをデプロイし、ミントしました

mint-nft.jsを使えば、あなた(とウォレット)が望むだけNFTをミントできます。 必ずNFTのメタデータを記述した新しいtokenURIを渡すようにしてください(そうしないと、IDが違うだけで同一のものを大量に作ってしまうことになります)。

おそらく、ウォレットで自分のNFTを披露したいと思うでしょう。そのために、ぜひパート3: ウォレットでNFTを表示する方法もチェックしてください。

最終更新: 2026年2月23日

このチュートリアルは役に立ちましたか?