NFT ERC721のMINTの仕方(イーサリアム用NFT解説書 part2)
NFT ERC721のMINTの仕方(イーサリアム用NFT解説書 part2)
今回のやり方、Alchemyの強力なAPIを使用してNFTを作成したやり方は下記の通りに大きな売り上げとなったNFTも使用しているとのこと。
Beeple: $69 Million 3LAU: $11 Million Grimes: $6 Million
このチュートリアルでは、10分以内に同じことを行う方法を説明します。
「NFTの作成」とは、ERC-721トークンの一意のインスタンスをブロックチェーンに公開することです。このNFT解説書シリーズのパート1のスマートコントラクトを使用して、web3スキルを柔軟にし、NFTを作成しましょう。
Let’s get started!
ステップ 1: インストールWEB3
NFTスマートコントラクトの作成に関する最初のチュートリアルに従った場合は、Ethers.jsの使用経験がすでにあります。 Web3は、イーサリアムブロックチェーンへのリクエストの作成を容易にするために使用されるライブラリであるため、イーサリアムに似ています。このチュートリアルでは、Alchemy Web3を使用します。これは、自動再試行と堅牢なWebSocketサポートを提供する拡張されたweb3ライブラリです。
プロジェクトのホームディレクトリで下記コマンドの実施:
npm install @alch/alchemy-web3
ステップ 2: MINT-NFT.JSファイルの作成
scriptsディレクトリに mint-nft.jsファイルを作成して下記を追加します。:
require("dotenv").config() const API_URL = process.env.API_URL const { createAlchemyWeb3 } = require("@alch/alchemy-web3") const web3 = createAlchemyWeb3(API_URL)
ステップ 3: コントラクトABIの取得
私たちのコントラクトABI(Application Binary Interface)は、スマートコントラクトと対話するためのインターフェイスです。コントラクトABIについて詳しくは、こちらをご覧ください。 Hardhatは自動的にABIを生成し、MyNFT.jsonファイルに保存します。これを使用するには、次のコード行をmint-nft.jsファイルに追加してコンテンツを解析する必要があります。
const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")
mint-nft.jsを実行し、コンソールに出力されたABIを確認するには、ターミナルに移動して実行します。
node scripts/mint-nft.js
ステップ4:IPFSを使用してNFTのメタデータを構成する
パート1のチュートリアルを思い出すと、mintNFTスマートコントラクト関数はtokenURIパラメーターを取り込んで、NFTのメタデータを記述したJSONドキュメントに解決する必要があります。これがNFTに命を吹き込み、次のような構成可能なプロパティを持たせることができます。名前、説明、画像、およびその他の属性として。
Interplanetary File System(IPFS)は、分散ファイルシステムにデータを保存および共有するための分散型プロトコルおよびピアツーピアネットワークです。
便利なIPFSAPIおよびツールキットであるPinataを使用して、NFTアセットとメタデータを保存し、NFTが真に分散化されていることを確認します。ピニャータアカウントをお持ちでない場合は、こちらから無料アカウントに登録し、メールを確認する手順を完了してください。
アカウントを作成したら
- [ファイル]ページに移動し、ページの左上にある青い[アップロード]ボタンをクリックします。
- 画像をピニャータにアップロードします—これはNFTの画像アセットになります。アセットには自由に名前を付けてください
- アップロードすると、[ファイル]ページの表にファイル情報が表示されます。 CID列も表示されます。 CIDの横にあるコピーボタンをクリックすると、CIDをコピーできます。アップロードは、https://gateway.pinata.cloud/ipfs/ で確認できます。
- たとえば、IPFSで使用した画像はここにあります。
動画はこちら。
次に、もう1つのドキュメントをPinataにアップロードします。しかし、それを行う前に、それを作成する必要があります!
ルートディレクトリに、nft-metadata.jsonという名前の新しいファイルを作成し、次のjsonコードを追加します。
{ "attributes": [ { "trait_type": "Breed", "value": "Maltipoo" }, { "trait_type": "Eye color", "value": "Mocha" } ], "description": "The world's most adorable and sensitive pup.", "image": "https://gateway.pinata.cloud/ipfs/QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb", "name": "Ramses" }
jsonのデータを自分に合った形に変更します。属性セクションを削除または追加できます(詳細項目は別途ポストで予定)。最も重要なことは、画像フィールドがIPFS画像の場所を指していることを確認してください。そうでない場合はできません。
こちらは今回のサンプルです。NFTのpinatagatewayから経由して表示されています。
https://gateway.pinata.cloud/ipfs/QmY974RbrFB3PNGc5baRdj4avENyE1Jbz4Ns5duv1c3DKG
jsonファイルの編集が完了したら、画像をアップロードしたときと同じ手順に従って、ファイルを保存してPinataにアップロードします。
ステップ5:コントラクトのインスタンスを作成する
ここで、コントラクトを操作するには、コードにそのインスタンスを作成する必要があります。そのためには、コントラクトの導入に使用したアドレスを検索することで、導入またはEtherscanから取得できるコントラクトアドレスが必要になります。

上記の例では、コントラクトアドレスは 0xF794f2B2b463b8BFDaBdd129fA957236639E1cba
次に、web3コントラクト方式を使用して、ABIとアドレスを使用してコントラクトを作成します。 mint-nft.jsファイルに、以下を追加します。:
const contractAddress = "0xF794f2B2b463b8BFDaBdd129fA957236639E1cba" const nftContract = new web3.eth.Contract(contract.abi, contractAddress)
ステップ 6: .ENVファイルの設定
ここで、トランザクションを作成してイーサリアムチェーンに送信するために、イーサリアムアカウントのパブリックアドレスを使用してアカウントナンスを取得します(以下で説明します)。
Public keyを.envファイルに追加します – チュートリアルのパート1を完了してPublick keyを追加すると.envファイルは次のようになります。 PUBLIC_KEYはコントラクト作成元のアドレスです。
API_URL = "htAPI_URL = "https://eth-ropsten.alchemyapi.io/v2/your-api-key" PRIVATE_KEY = "your-private-account-address" PUBLIC_KEY = "your-public-account-address"
ステップ7: 自分のトランザクションを作成する。
まず、mintNFT(tokenData)という名前の関数を定義し( mint-nft.js に追加し)、次のようにしてトランザクションを作成します。
- .envファイルからPRIVATE_KEYとPUBLIC_KEYを取得します。
- 次に、アカウントナンスを把握する必要があります。 nonce仕様は、アドレスから送信されたトランザクションの数を追跡するために使用されます。これは、セキュリティの目的とリプレイ攻撃を防ぐために必要です。住所から送信されたトランザクションの数を取得するには、getTransactionCountを使用します。
- 最後に、次の情報を使用してトランザクションを設定します。
‘from’:PUBLIC_KEY —トランザクションの発信元はパブリックアドレスです
‘to’:contractAddress —やり取りしてトランザクションを送信する契約
‘nonce’:nonce —私たちのアドレスから送信されたトランザクションの数を持つアカウントnonce
‘gas’:estimatedGas —トランザクションを完了するために必要な推定ガス
‘data’:nftContract.methods.mintNFT(PUBLIC_KEY、md).encodeABI()—このトランザクションで実行したい計算—この場合はNFTを作成しています
mint-nft.jsファイルは次のようになります。
require('dotenv').config(); const API_URL = process.env.API_URL; const PUBLIC_KEY = process.env.PUBLIC_KEY; const PRIVATE_KEY = process.env.PRIVATE_KEY; const { createAlchemyWeb3 } = require("@alch/alchemy-web3"); const web3 = createAlchemyWeb3(API_URL); const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json"); const contractAddress = "0xF794f2B2b463b8BFDaBdd129fA957236639E1cba"; const nftContract = new web3.eth.Contract(contract.abi, contractAddress); async function mintNFT(tokenURI) { const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, 'latest'); //get latest nonce //the transaction const tx = { 'from': PUBLIC_KEY, 'to': contractAddress, 'nonce': nonce, 'gas': 500000, 'data': nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI() }; }
ステップ8:トランザクションに署名する
トランザクションを作成したので、送信するには署名する必要があります。ここで秘密鍵を使用します。
web3.eth.sendSignedTransactionは、トランザクションハッシュを提供します。これを使用して、トランザクションがマイニングされ、ネットワークによってドロップされていないことを確認できます。トランザクションの署名セクションで、トランザクションが正常に完了したかどうかを確認できるように、エラーチェックを追加しました。
require("dotenv").config() const API_URL = process.env.API_URL const PUBLIC_KEY = process.env.PUBLIC_KEY const PRIVATE_KEY = process.env.PRIVATE_KEY const { createAlchemyWeb3 } = require("@alch/alchemy-web3") const web3 = createAlchemyWeb3(API_URL) const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json") const contractAddress = "0xF794f2B2b463b8BFDaBdd129fA957236639E1cba" const nftContract = new web3.eth.Contract(contract.abi, contractAddress) async function mintNFT(tokenURI) { const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce //the transaction const tx = { from: PUBLIC_KEY, to: contractAddress, nonce: nonce, gas: 500000, data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(), } const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY) signPromise .then((signedTx) => { web3.eth.sendSignedTransaction( signedTx.rawTransaction, function (err, hash) { if (!err) { console.log( "The hash of your transaction is: ", hash, "\nCheck Alchemy's Mempool to view the status of your transaction!" ) } else { console.log( "Something went wrong when submitting your transaction:", err ) } } ) }) .catch((err) => { console.log(" Promise failed:", err) }) }
ステップ9:MINTNFTを呼び出し、ノードコントラクトを実行します-INTERACT.JS
Pinataにアップロードしたmetadata.jsonを覚えていますか?ピニャータからハッシュコードを取得し、以下をパラメータとして関数mintNFT https://gateway.pinata.cloud/ipfs/ に渡します。
下記がハッシュコードの取得の仕方:
https://gateway.pinata.cloud/ipfs/ を別のウィンドウに読み込んで、コピーしたハッシュコードがmetadata.jsonにリンクしていることを再確認してください。ページは以下のスクリーンショットのようになります。
このような感じで出力されるはず。
全体として、コードは次のようになります。
require("dotenv").config() const API_URL = process.env.API_URL const PUBLIC_KEY = process.env.PUBLIC_KEY const PRIVATE_KEY = process.env.PRIVATE_KEY const { createAlchemyWeb3 } = require("@alch/alchemy-web3") const web3 = createAlchemyWeb3(API_URL) const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json") const contractAddress = "0xF794f2B2b463b8BFDaBdd129fA957236639E1cba" const nftContract = new web3.eth.Contract(contract.abi, contractAddress) async function mintNFT(tokenURI) { const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce //the transaction const tx = { from: PUBLIC_KEY, to: contractAddress, nonce: nonce, gas: 500000, data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(), } const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY) signPromise .then((signedTx) => { web3.eth.sendSignedTransaction( signedTx.rawTransaction, function (err, hash) { if (!err) { console.log( "The hash of your transaction is: ", hash, "\nCheck Alchemy's Mempool to view the status of your transaction!" ) } else { console.log( "Something went wrong when submitting your transaction:", err ) } } ) }) .catch((err) => { console.log("Promise failed:", err) }) } mintNFT( "https://gateway.pinata.cloud/ipfs/QmULAkzbWqAEt72wkLExyAHuuSNgPCJfijidQaX4sefmbd" )
次に、node scripts /mint-nft.jsを実行してNFTをデプロイします。数秒後、ターミナルに次のような応答が表示されます。
The hash of your transaction is: = Check Alchemy's Mempool to view the status of your transaction!
次に、Alchemy mempoolにアクセスして、トランザクションのステータス(保留中、マイニング中、ネットワークによってドロップされたかどうか)を確認します。取引が取り下げられた場合は、Ropsten Etherscanを確認して、取引ハッシュを検索することも役立ちます。


以上です!TokenTrackerのところにMyNFT(NFT)となりました‼またトランザクション詳細のTokenTransferredにERC-721となっております。これで、イーサリアムブロックチェーンにNFTを導入して作成しました
mint-nft.jsを使用すると、ウォレットが望む数のNFTを作成できます。 NFTのメタデータを記述した新しいtokenURIを必ず渡してください(そうしないと、IDが異なる同一のメタデータを大量に作成することになります)。