NFTの作成とデプロイ方法(NFTチュートリアルシリーズ 1/3)
NFTによってブロックチェーンが世間の目に触れるようになった今、イーサリアムブロックチェーン上に自分のNFTコントラクト(ERC-721トークン)を公開することで、自身のモチベーションを高める絶好の機会となります。
Alchemyは、Makersplace (最近、クリスティーズで6900万ドルの記録的なデジタルアート作品の販売を達成)、Dapper Labs (NBA Top Shot & Crypto Kittiesの制作者)、OpenSea (世界最大のNFTマーケットプレイス)、Zora、Super Rare、NFTfi、Foundation、Enjin、Origin Protocol、Immutableなど、NFT分野のビッグネームを支えていることを非常に誇りに思っています。
このチュートリアルでは、MetaMask (opens in a new tab)、Solidity (opens in a new tab)、Hardhat (opens in a new tab)、Pinata (opens in a new tab)、Alchemy (opens in a new tab)を使用して、Sepoliaテストネット上でERC-721スマートコントラクトを作成し、デプロイする手順を説明します (これらの意味がまだ分からなくても心配はいりません — これから説明します!)。
チュートリアルのパート2では、スマートコントラクトを使用してNFTをミントする方法について、パート3では、MetaMaskでNFTを表示する方法について説明します。
もちろん、いつでも質問があれば、Alchemy Discord (opens in a new tab)でお気軽にお問い合わせいただくか、AlchemyのNFT APIドキュメント (opens in a new tab)をご覧ください!
ステップ1: イーサリアムネットワークに接続する
イーサリアムのブロックチェーンにリクエストを送信する方法はいくつかありますが、簡単にするために、Alchemy (opens in a new tab)の無料アカウントを使用します。Alchemyは、独自のノードを実行することなくイーサリアムチェーンと通信できる、ブロックチェーン開発者向けのプラットフォームおよびAPIです。
このチュートリアルでは、スマートコントラクトのデプロイメントの仕組みを理解するために、Alchemyの開発者用ツールも活用します。 まだAlchemyアカウントをお持ちでない場合は、こちら (opens in a new tab)から無料で登録できます。
ステップ2: アプリ (およびAPIキー) を作成する
Alchemyのアカウントを作成した後、アプリを作成することでAPIキーを生成することができます。 これにより、Sepoliaテストネットワークへのリクエストが可能になります。 テストネットについてさらに詳しく知りたい場合は、こちらのガイド (opens in a new tab)をご覧ください。
- ナビゲーションバーの「Apps」にマウスを合わせて、「Create App)」をクリックし、Alchemyダッシュボードの「Create App」ページに移動してください。
- アプリに名前を付け(私たちは「My First NFT!」にしました)、簡単な説明を記述し、「Ethereum」チェーンを選択して、ネットワークに「Sepolia」を設定します。 マージ以降、他のテストネットは非推奨となっています。
- 「Create app」をクリックします。 アプリが下の表に表示されます。
ステップ3: イーサリアムアカウント (アドレス) を作成する
トランザクションの送受信には、イーサリアムアカウントが必要です。 このチュートリアルでは、イーサリアムアカウントアドレスを管理するためにブラウザの仮想ウォレットであるMetamaskを使用します。 イーサリアム上のトランザクションの仕組みについてさらに詳しく知りたい場合は、イーサリアム・ファウンデーションのこちらのページをご覧ください。
MetaMaskアカウントは、こちら (opens in a new tab)から無料でダウンロードして作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は(実際に支払いが発生しないように)右上の「Sepolia Test Network」に切り替えてください。
ステップ4: フォーセットからイーサを追加する
テストネットワークにスマートコントラクトをデプロイするには、偽のETHが複数必要になります。 ETHを入手するには、AlchemyがホストするSepoliaフォーセット (opens in a new tab)にアクセスし、ログインしてアカウントアドレスを入力し、「Send Me ETH」をクリックします。 MetamaskアカウントにETHが表示されるはずです。
ステップ5: 残高を確認する
残高があることを再確認するために、Alchemyのcomposerツール (opens in a new tab)を使用してeth_getBalance (opens in a new tab)リクエストを実行してみましょう。 このリクエストをすると、ウォレット内のETHの額が返されます。 MetaMaskアカウントアドレスを入力して「Send Request」をクリックすると、次のようなレスポンスが表示されます。
1{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}注 この結果はETHではなく、wei単位です。 weiはETHの最小単位として使われています。 「wei」 から「ETH」への変換は次の通りです: 1 eth = 1018 wei 。 例えば、0xde0b6b3a7640000を10進数に変換すると1*1018 weiとなり、1ETHに相当します。
ふう! 私たちの偽物のお金はすべてそこにあります。
ステップ6: プロジェクトを初期化する
まず、プロジェクトのフォルダを作成する必要があります。 コマンドラインに移動し、次のように入力します。
1mkdir my-nft2cd my-nftプロジェクトフォルダに入ったら、 npm initを使用してプロジェクトを初期化します。 まだnpmをインストールしていない場合は、これらの手順 (opens in a new tab)に従ってください (Node.js (opens in a new tab)も必要なので、そちらもダウンロードしてください!)。
1npm initインストール時の質問に対する回答方法は自由です。参考までに過去の回答方法は次のとおりです。
1 package name: (my-nft)2 version: (1.0.0)3 description: 初めてのNFT!4 entry point: (index.js)5 test command:6 git repository:7 keywords:8 author:9 license: (ISC)10 About to write to /Users/thesuperb1/Desktop/my-nft/package.json:1112 {13 "name": "my-nft",14 "version": "1.0.0",15 "description": "初めてのNFT!",16 "main": "index.js",17 "scripts": {18 "test": "echo \"Error: no test specified\" && exit 1"19 },20 "author": "",21 "license": "ISC"22 }すべて表示「package.json」を承認してください。これで準備が完了しました。
ステップ7: Hardhat (opens in a new tab)をインストールする
Hardhatは、イーサリアムのソフトウェアをコンパイル、デプロイ、テスト、デバッグするための開発環境です。 デベロッパーがライブチェーンにデプロイする前に、スマートコントラクトや分散型アプリケーション(Dapp)をローカルに構築する際に役立ちます。
「my-nft」プロジェクトの中で実行してください。
1npm install --save-dev hardhatインストール手順 (opens in a new tab)の詳細については、このページをご覧ください。
ステップ8: Hardhatプロジェクトを作成する
プロジェクトフォルダ内で以下を実行します。
1npx hardhatウェルカムメッセージと、次に何をするのかを選択できるオプションが表示されます。 「create an empty hardhat.config.js」を選択してください。
1888 888 888 888 8882888 888 888 888 8883888 888 888 888 88848888888888 8888b. 888d888 .d88888 88888b. 8888b. 8888885888 888 "88b 888P" d88" 888 888 "88b "88b 8886888 888 .d888888 888 888 888 888 888 .d888888 8887888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.8888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y8889👷 Hardhat v2.0.11へようこそ 👷10? 何を行いますか? …11サンプルプロジェクトを作成する12❯ 空のhardhat.config.jsを作成する13終了すべて表示「hardhat.config.js」というファイルが生成され、ここでプロジェクトのセットアップの全てを指定します (ステップ13)。
ステップ9: プロジェクトフォルダを追加する
プロジェクトを整理するために、2つの新しいフォルダを作成します。 コマンドラインでプロジェクトのルートディレクトリに移動し、次のように入力します。
1mkdir contracts2mkdir scripts-
「contracts/」は、NFT スマートコントラクトコードを保持する場所です。
-
「scripts/」 は、スマートコントラクトをデプロイして対話するスクリプトを保持する場所です。
ステップ10: コントラクトを作成する
環境が整ったので、もっと面白いこと、つまり_スマートコントラクトのコード作成_に取り掛かりましょう!
お気に入りのエディタ (私たちはVSCode (opens in a new tab)が好きです) でmy-nftプロジェクトを開いてください。 スマートコントラクトは、Solidityと呼ばれる言語で記述されています。MyNFT.solスマートコントラクトの作成にこの言語を使用します。
-
contractsフォルダに移動し、MyNFT.solという名前の新しいファイルを作成します -
以下は、OpenZeppelin (opens in a new tab)ライブラリのERC-721実装をベースにした、私たちのNFTスマートコントラクトのコードです。 以下の内容をコピーして、MyNFT.solファイルに貼り付けます。
1//[https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721) をベースにしたコントラクト2// SPDX-License-Identifier: MIT3pragma solidity ^0.8.0;45import "@openzeppelin/contracts/token/ERC721/ERC721.sol";6import "@openzeppelin/contracts/utils/Counters.sol";7import "@openzeppelin/contracts/access/Ownable.sol";8import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";910contract MyNFT is ERC721URIStorage, Ownable {11 using Counters for Counters.Counter;12 Counters.Counter private _tokenIds;1314 constructor() ERC721("MyNFT", "NFT") {}1516 function mintNFT(address recipient, string memory tokenURI)17 public onlyOwner18 returns (uint256)19 {20 _tokenIds.increment();2122 uint256 newItemId = _tokenIds.current();23 _mint(recipient, newItemId);24 _setTokenURI(newItemId, tokenURI);2526 return newItemId;27 }28}すべて表示 -
OpenZeppelinのコントラクトライブラリからクラスを継承しているため、コマンドラインで
npm install @openzeppelin/contracts^4.0.0を実行して、ライブラリをフォルダにインストールします。
では、このコードは一体何を_している_のでしょうか? 一行ずつ分解してみましょう。
スマートコントラクトの冒頭で、3つのOpenZeppelin (opens in a new tab)スマートコントラクトクラスをインポートします:
-
@openzeppelin/contracts/token/ERC721/ERC721.solには、ERC-721標準の実装が含まれており、NFTスマートコントラクトはこれを継承しています。 (有効なNFTであるためには、スマートコントラクトはERC-721標準のすべてのメソッドを実装する必要があります。) 継承されたERC-721関数の詳細については、こちら (opens in a new tab)のインターフェース定義をご確認ください。
-
@openzeppelin/contracts/utils/Counters.solは、1つずつ増減するカウンタを提供しており、 私たちのスマートコントラクトは、ミントされたNFTの合計数を追跡し、新しいNFTにユニークなIDを設定するためにカウンタを使用しています。 (スマートコントラクトを使用してミントされた各NFTには、ユニークなIDが割り当てられている必要があります。ここでは、ユニークIDは、存在するNFTの合計数によって決定されます。 例えば、スマートコントラクトでミントした最初のNFTには「1」のIDが付与され、2番目のNFTには「2」のIDが付与されます。)
-
@openzeppelin/contracts/access/Ownable.solは、スマートコントラクトにアクセス制御 (opens in a new tab)を設定するので、スマートコントラクトの所有者 (あなた) のみがNFTをミントできます。 (注: アクセス制御の実装は完全に任意です。 スマートコントラクトを使って誰でもNFTをミントできるようにしたい場合は、10行目の「Ownable」、17行目の「onlyOwner」を削除します。)
インポートステートメントの後にカスタムNFTスマートコントラクトがありますが、非常に短いもので、カウンタ、コンストラクタ、単一の関数しか含まれていません。 これは、継承したOpenZeppelinコントラクトのおかげです。このコントラクトには、NFTの所有者を返すownerOfや、NFTの所有権をあるアカウントから別のアカウントに移転するtransferFromなど、NFTの作成に必要なメソッドのほとんどが実装されています。
ERC-721コンストラクタでは、「MyNFT」と「NFT」の2つの文字列を渡すことに気づくでしょう。 最初の変数はスマートコントラクトの名前で、2番目の変数はそのシンボルです。 これらの変数にはそれぞれに自由に名前を付けることができます。
最後に、NFTをミントできるmintNFT(address recipient, string memory tokenURI)関数があります! この関数には2つの変数が必要です。
-
address recipientは、新しくミントされたNFTを受け取るアドレスを指定します -
string memory tokenURIは、NFTのメタデータを記述するJSONドキュメントに解決されるべき文字列です。 NFTのメタデータは、名前、説明、画像、その他の属性など、設定可能なプロパティを持つことができます。 チュートリアルのパート2では、このメタデータの設定方法について説明します。
mintNFTは、継承されたERC-721ライブラリからいくつかのメソッドを呼び出し、最終的に新しくミントされたNFTのIDを表す数値を返します。
ステップ11: MetaMaskとAlchemyをプロジェクトに接続する
ここまででMetaMaskウォレットとAlchemyアカウントを作成し、スマートコントラクトを書きました。次はこの3つのアカウントを繋げていきましょう。
仮想ウォレットから送信されるすべてのトランザクションには、固有の秘密鍵を使用した署名が必要です。 この許可をプログラムに与えるために、秘密鍵(とAlchemyのAPIキー)を環境ファイルに安全に格納する作業を行います。
トランザクションの送信について詳しく知るには、web3を使用したトランザクション送信に関するこのチュートリアルをご覧ください。
まず、プロジェクトディレクトリにdotenvパッケージをインストールします。
1npm install dotenv --save次に、プロジェクトのルートディレクトリに.envファイルを作成し、MetaMaskの秘密鍵とHTTP Alchemy API URLを追加します。
-
MetaMaskから秘密鍵をエクスポートするには、これらの手順 (opens in a new tab)に従ってください
-
HTTP Alchemy API URLを取得し、クリップボードにコピーするには、以下を参照してください。
これで、.envは次のようになります:
1API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key"2PRIVATE_KEY="your-metamask-private-key"これらの変数を実際にコードに接続するために、ステップ13で hardhat.config.jsファイル内のこれらの変数を参照します。
.env をコミットしないでください!.envファイルを他人と共有したり公開したりすると、シークレットの情報が漏洩することになるので、決して共有したり公開したりしないようにしてください。バージョン管理を使用している場合は、.env を gitignore (opens in a new tab)ファイルに追加してください。ステップ12: Ethers.jsをインストールする
Ethers.jsは、標準のJSON-RPCメソッドをよりユーザーフレンドリーなメソッドでラップすることで、イーサリアムとの対話やリクエストを容易にするライブラリです。
Hardhatでは、追加のツールや拡張機能のためのプラグイン (opens in a new tab)を非常に簡単に統合できます。 コントラクトのデプロイにはEthersプラグイン (opens in a new tab)を活用します(Ethers.js (opens in a new tab)には非常にクリーンなコントラクトデプロイメントメソッドがあります)。
プロジェクトのホームディレクトリで以下を実行します。
1npm install --save-dev @nomiclabs/hardhat-ethers ethers@^5.0.0次のステップのhardhat.config.jsでもEthers(.js)が必要になります。
ステップ13: hardhat.config.jsを更新する
ここまでで、いくつかの依存関係とプラグインを追加しました。次に、プロジェクトがそれらすべてを認識できるように、hardhat.config.jsをアップデートする必要があります。
hardhat.config.jsを以下のようにアップデートします。
1 /**2 * @type import('hardhat/config').HardhatUserConfig3 */4 require('dotenv').config();5 require("@nomiclabs/hardhat-ethers");6 const { API_URL, PRIVATE_KEY } = process.env;7 module.exports = {8 solidity: "0.8.1",9 defaultNetwork: "sepolia",10 networks: {11 hardhat: {},12 sepolia: {13 url: API_URL,14 accounts: [`0x${PRIVATE_KEY}`]15 }16 },17 }すべて表示ステップ14: コントラクトをコンパイルする
ここまでの作業がうまくいっていることを確認するために、コントラクトをコンパイルしてみましょう。 コンパイルは、組み込みのHardhatタスクの1つです。
コマンドラインで以下を実行します。
1npx hardhat compileSPDXライセンス識別子がソースファイルで提供されていないという警告が表示される場合がありますが、心配する必要はありません。警告が表示されないのがベストですが、 うまくいかない場合は、いつでもAlchemy Discord (opens in a new tab)でメッセージを送ることができます。
ステップ15: デプロイスクリプトを作成する
コントラクトの作成と設定ファイルの作成が完了したら、いよいよコントラクトのデプロイのためのスクリプトを作成します。
scripts/フォルダに移動してdeploy.jsという名前の新しいファイルを作成し、以下の内容を追加します:
1async function main() {2 const MyNFT = await ethers.getContractFactory("MyNFT")34 // デプロイを開始し、コントラクトオブジェクトに解決されるプロミスを返す5 const myNFT = await MyNFT.deploy()6 await myNFT.deployed()7 console.log("コントラクトがデプロイされたアドレス:", myNFT.address)8}910main()11 .then(() => process.exit(0))12 .catch((error) => {13 console.error(error)14 process.exit(1)15 })すべて表示Hardhatは、コントラクトのチュートリアル (opens in a new tab)で、これらのコードの各行が何をするかを非常にうまく説明しています。ここではその説明を採用しました。
1const MyNFT = await ethers.getContractFactory("MyNFT");ethers.jsのContractFactoryは新しいスマートコントラクトをデプロイするための抽象化であり、ここでのMyNFTはNFTコントラクトのインスタンスのためのファクトリです。 hardhat-ethersプラグインを使用する場合、 ContractFactoryおよびContractインスタンスはデフォルトで最初の署名者に接続されます。
1const myNFT = await MyNFT.deploy();ContractFactoryのdeploy()を呼び出すとデプロイメントが開始し、 Contractを解決するためのPromiseが返されます。 これは、スマートコントラクトの各関数に対するメソッドを持つオブジェクトです。
ステップ16: コントラクトをデプロイする
ようやく、スマートコントラクトをデプロイする準備が整いました。 プロジェクトディレクトリのルートに戻り、コマンドラインで以下を実行します。
1npx hardhat --network sepolia run scripts/deploy.js次のような画面が表示されるはずです。
1Contract deployed to address: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650Sepolia etherscan (opens in a new tab)にアクセスし、コントラクトアドレスを検索すると、正常にデプロイされたことを確認できるはずです。 すぐに表示されない場合は、しばらくお待ちください。 トランザクションは以下のようなものになります。
FromアドレスはあなたのMetaMaskアカウントのアドレスと一致し、Toアドレスには「Contract Creation」と表示されます。 このトランザクションをクリックすると、Toフィールドにコントラクトアドレスが表示されます。
おめでとうございます。 イーサリアム(テストネット)チェーンにNFTスマートコントラクトをデプロイできました。
内部で何が起こっているのかを理解するために、Alchemyダッシュボード (opens in a new tab)のExplorerタブに移動してみましょう。 Alchemyのアプリが複数ある場合は、必ずアプリでフィルタリングして、「MyNFT」を選択してください。
ここでは、Hardhat/Ethersが.deploy()関数を呼び出した際に、内部で行ったJSON-RPCの呼び出しを見ることができます。 ここで特筆すべき重要な2つのリクエストは、実際にSepoliaチェーンにスマートコントラクトを書き込むためのリクエストであるeth_sendRawTransactionと、ハッシュが与えられたトランザクションに関する情報を読み取るためのリクエスト (トランザクション送信時の典型的なパターン) であるeth_getTransactionByHashです。 トランザクションの送信についてさらに詳しく知るには、Web3を使用したトランザクション送信に関するこのチュートリアルをご覧ください。
チュートリアルのパート1は以上です。 パート2では、NFTをミントしてスマートコントラクトと実際にやり取りし、パート3ではイーサリアムウォレットでNFTを表示する方法をご紹介します!
最終更新: 2025年12月5日






