---
title: "NFTの作り方"
description: "Metamask、Solidity、Hardhat、Pinata、Alchemyを使ってEthereumブロックチェーン上に独自のNFTを作成・デプロイするステップバイステップガイド。"
---

# NFTの作り方

このチュートリアルでは、EthereumとInter Planetary File System（IPFS）を使ってNon Fungible（ERC721）Tokenのスマートコントラクトを作成し、デプロイする手順を説明します。

_このガイドの所要時間：約15分_

たとえ世間から隔絶した生活をしていたとしても、主要なニュースメディアがこぞってNFTの台頭を取り上げていることには気づいているはずです。

NFTによってブロックチェーンが一般の注目を集めるようになった今、自分自身でEthereumブロックチェーン上にNFT（ERC-721 Token）を発行することで、この盛り上がりの正体を理解する絶好の機会です！

このチュートリアルでは、[Metamask](https://metamask.io/)、[Solidity](https://docs.soliditylang.org/en/v0.8.0/)、[Hardhat](https://hardhat.org/)、[Pinata](https://pinata.cloud/)、[Alchemy](https://alchemy.com/?r=affiliate:68212b46-a5c5-4f4c-bc8b-73f50536fcaf)を使ってSepoliaテストネットワーク上にERC-721スマートコントラクトを作成・デプロイする手順を説明します（これらの用語の意味がまだわからなくても問題ありません。追って説明します）。このチュートリアルのPart IIでは、作成したスマートコントラクトを使って[NFTをミントする方法](/blog/how-to-mint-an-nft-using-web3-js)を、Part IIIでは[MetamaskでNFTを表示する方法](/blog/how-to-view-your-nft-in-your-mobile-wallet)を解説します。

途中で疑問が出てきた場合は、いつでも[Alchemyサポートセンター](https://www.alchemy.com/support)を訪れてください！

## ステップ1：Ethereumネットワークに接続する

Ethereumブロックチェーンにリクエストを送る方法は数多くありますが、ここでは最も簡単な方法として、ブロックチェーン開発者向けプラットフォーム兼APIである[Alchemy](https://alchemy.com/?r=affiliate:68212b46-a5c5-4f4c-bc8b-73f50536fcaf)の無料アカウントを使用します。これにより、自分でノードを立てることなくEthereumチェーンと通信できます。

このチュートリアルでは、スマートコントラクトのデプロイの裏側で何が起きているかを把握するために、Alchemyのモニタリング・分析用開発者ツールも活用します。まだAlchemyアカウントを持っていない場合は、[こちら](https://alchemy.com/?r=affiliate:68212b46-a5c5-4f4c-bc8b-73f50536fcaf)から無料で登録できます。

## ステップ2：アプリを作成する（とAPIキーを取得する）

Alchemyアカウントを作成したら、アプリを作成することでAPIキーを発行できます。これにより、Sepoliaテストネットワークへのリクエストが可能になります。テストネットワークについて詳しく知りたい場合は、[このガイド](https://www.alchemy.com/docs/choosing-a-web3-network)を参照してください。

1. Alchemyダッシュボードのナビゲーションバーで「Apps」にカーソルを合わせ、「Create App」をクリックして「Create App」ページに移動します

<ImageBlock
  src="https://media.alchemy.com/1704631152-create-a-new-app.jpg"
  alt="Alchemyダッシュボード: Appsメニューから新しいアプリを作成する"
  width={2880}
  height={1640}
  caption="新しいアプリを作成"
/>

2. アプリに名前を付け（今回は「My First NFT!」としました）、簡単な説明を記入し、Environmentで「Staging」を選択し（アプリの管理に使われます）、ネットワークで「Sepolia」を選択します。

<ImageBlock
  src="https://media.alchemy.com/1704802198-name-your-app.png"
  alt="テストネットワークセレクターがある従来のAlchemyダッシュボードのアプリ作成画面"
  width={1518}
  height={912}
  caption="アプリの名前と説明を入力"
/>

3. 「Create app」をクリックすれば完了です！アプリが下の表に表示されるはずです。

## ステップ3：Ethereumアカウント（アドレス）を作成する

トランザクションを送受信するにはEthereumアカウントが必要です。このチュートリアルでは、Ethereumアカウントアドレスを管理するためのブラウザ上の仮想ウォレットであるMetamaskを使用します。Ethereum上でのトランザクションの仕組みについてさらに理解を深めたい場合は、Ethereum財団による[このページ](https://ethereum.org/en/developers/docs/transactions/)を確認してください。

Metamaskアカウントは[こちら](https://metamask.io/download.html)から無料でダウンロード・作成できます。アカウントを作成する際、またはすでにアカウントを持っている場合は、必ずSepoliaテストネットワークに切り替えてください（本物のお金を扱わないようにするためです）。

<ImageBlock
  src="https://media.alchemy.com/1704802303-download-and-create-a-metamask-account.png"
  alt="テストネットワークセレクターがある従来のMetaMaskウォレットセットアップ画面"
  width={712}
  height={1194}
  caption="Metamaskをダウンロードしてアカウントを作成"
/>

## ステップ4：フォーセットからetherを受け取る

スマートコントラクトをテストネットワークにデプロイするには、偽のEthが必要です。Ethを入手するには、[Sepoliaフォーセット](/faucets/ethereum-sepolia)にアクセスし、Sepoliaアカウントアドレスを入力してSepolia Ethをリクエストしてください。しばらくするとMetamaskアカウントにEthが届くはずです！

## ステップ5：残高を確認する

残高が反映されているかを確認するために、[Alchemyのコンポーザーツール](https://www.alchemy.com/composer/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D)を使って`eth_getBalance`リクエストを送ってみましょう。これによりウォレット内のEth残高が返されます。Metamaskアカウントアドレスを入力して「Send Request」をクリックすると、次のようなレスポンスが返されるはずです：

\{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"\}

**注：** この結果はethではなくweiで表示されています。weiはetherの最小単位として使われます。weiからethへの換算は次の通りです：1 eth = 10¹⁸ wei。したがって、0xde0b6b3a7640000を10進数に変換すると10¹⁸となり、これは1 ethに相当します。

これで、偽のお金がすべて手元にあることが確認できました！🤑

## ステップ6：プロジェクトを初期化する

まず、プロジェクト用のフォルダを作成する必要があります。[コマンドライン](https://www.computerhope.com/jargon/c/commandi.htm)を開き、次のように入力してください：

プロジェクトフォルダの中に入ったら、npm initを使ってプロジェクトを初期化します。npmがまだインストールされていない場合は、[こちらの手順](https://nodejs.org/en/download/)に従ってください（[Node.js](https://nodejs.org/en/download/)も必要になるので、こちらもダウンロードしてください！）。

インストール時の質問にどう答えても特に問題ありませんが、参考までに私たちが答えた内容は以下の通りです：

package.jsonを承認すれば準備完了です！

ステップ7：[Hardhat](https://hardhat.org/getting-started/#overview)をダウンロードする

Hardhatは、Ethereumソフトウェアのコンパイル、デプロイ、テスト、デバッグを行うための開発環境です。本番チェーンにデプロイする前に、ローカルでスマートコントラクトや[アプリ](https://www.alchemy.com/dapps/top/defi-dapps)を構築する開発者を支援します。

ターミナルを開き、my-nftプロジェクトフォルダの中にいることを確認した上で、次を実行してください：

[インストール手順](https://hardhat.org/getting-started/#overview)についての詳細はこちらのページをご覧ください。

## ステップ8：Hardhatプロジェクトを作成する

プロジェクトフォルダ内で次を実行してください：

すると、ウェルカムメッセージと実行したい操作を選択するオプションが表示されます。「create an empty hardhat.config.js」を選択してください：

これにより、プロジェクトのセットアップ（ステップ13で）を記述する**hardhat.config.js**ファイルが生成されます。

## ステップ9：プロジェクトフォルダを追加する

プロジェクトを整理するために、2つの新しいフォルダを作成します。コマンドラインでプロジェクトのルートディレクトリに移動し、次のように入力してください：

**contracts/**はNFTスマートコントラクトのコードを保管する場所です

scripts/はスマートコントラクトのデプロイやそれとのやり取りに使うスクリプトを保管する場所です

## ステップ10：コントラクトを書く

環境構築が完了したので、いよいよ本題であるスマートコントラクトのコードを書いていきます！

my-nftプロジェクトをお好みのエディタで開いてください（私たちは[VSCode](https://code.visualstudio.com)を使っています）。スマートコントラクトは[Solidity](https://www.alchemy.com/overviews/solidity)という言語で書かれており、これを使ってMyNFT.solスマートコントラクトを記述します。

1. 「contracts」フォルダに移動し、MyNFT.solという新しいファイルを作成してください

2. 以下が私たちのNFTスマートコントラクトのコードで、[OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc721)ライブラリのERC721実装をベースにしています。以下の内容をコピーしてMyNFT.solファイルに貼り付けてください。

<CalloutBlock>

注：スマートコントラクトを通じてNFTに価格を設定したい場合は、[このチュートリアル](https://www.alchemy.com/docs/reference/nft-api-endpoints)を参照してください。

</CalloutBlock>

1. OpenZepplinのコントラクトライブラリからクラスを継承しているため、コマンドラインで次を実行してライブラリをフォルダにインストールしてください：

**textnpm install @openzeppelin/contracts@3.1.0-solc-0.7**

さて、このコードは実際には何をしているのでしょうか？1行ずつ見ていきましょう。

5〜7行目で、私たちのコードは3つの[OpenZepplin](https://openzeppelin.com)スマートコントラクトクラスを継承しています：

- @[openzeppelin](https://www.alchemy.com/dapps/openzeppelin)/contracts/token/ERC721/ERC721.solには、私たちのNFTスマートコントラクトが継承するERC721標準の実装が含まれています（有効なNFTであるためには、スマートコントラクトがERC721標準のすべてのメソッドを実装している必要があります）。継承されるERC721関数について詳しく知りたい場合は、[こちら](https://eips.ethereum.org/EIPS/eip-721)のインターフェース定義を確認してください。

- @openzeppelin/contracts/utils/Counters.solは、1ずつしか増減できないカウンターを提供します。私たちのスマートコントラクトでは、このカウンターを使ってミントされたNFTの総数を管理し、新しいNFTに固有のIDを割り当てます。スマートコントラクトを使ってミントされる各NFTには固有のIDが割り当てられる必要があります――ここでは、その固有IDは単に存在するNFTの総数によって決まります。例えば、このスマートコントラクトで最初にミントするNFTのIDは「1」、2番目にミントするNFTのIDは「2」となります。

- @openzeppelin/contracts/access/Ownable.solは、スマートコントラクトに[アクセス制御](https://docs.openzeppelin.com/contracts/3.x/access-control)を設定し、スマートコントラクトの所有者（あなた）だけがNFTをミントできるようにします。なお、アクセス制御を含めるかどうかは完全に任意です。誰でもこのスマートコントラクトを使ってNFTをミントできるようにしたい場合は、10行目のOwnableと17行目のonlyOwnerを削除してください。

10〜28行目には、私たちのカスタムNFTスマートコントラクトがあります。驚くほど短く、カウンター、コンストラクタ、そして1つの関数だけで構成されています！これは、私たちが継承しているOpenZepplinのコントラクトが、ownerOf（NFTの所有者を返す）やtransferFrom（NFTの所有権を移転する）など、NFTを作成するために必要なほとんどのメソッドを実装してくれているおかげです。

14行目で、"MyNFT"と"NFT"という2つの文字列をERC721コンストラクタに渡していることに気づくでしょう。1つ目の変数はスマートコントラクトの名前、2つ目はそのシンボルです。これらの変数名はお好きに付けて構いません！

最後に、16行目から始まるmintNFT\(\)関数によってNFTをミントできます！この関数は2つの変数を受け取ることに注目してください：

- address recipientは、新しくミントされたNFTを受け取るアドレスを指定します

- string memory tokenURIは、NFTのメタデータを記述したJSONドキュメントを指す文字列です。NFTのメタデータこそがNFTに命を吹き込むものであり、名前、説明、画像、その他の属性といった追加のプロパティを持たせることができます。このチュートリアルのPart 2では、このメタデータの設定方法について説明します。

**mintNFT**は継承したERC721ライブラリのいくつかのメソッドを呼び出し、最終的には新しくミントされたNFTのIDを表す数値を返します。

## ステップ11：MetaMaskとAlchemyをプロジェクトに接続する

Metamaskウォレット、Alchemyアカウントを作成し、スマートコントラクトも書き終えたので、いよいよこの3つを接続します。

仮想ウォレットから送信されるすべてのトランザクションには、固有の秘密鍵を使った署名が必要です。この権限をプログラムに与えるために、秘密鍵（とAlchemy APIキー）を環境ファイルに安全に保存します。

トランザクションの送信について詳しく知りたい場合は、web3を使ったトランザクション送信についての[このチュートリアル](https://docs.alchemy.com/docs/how-to-send-transactions-on-ethereum)を確認してください。

まず、プロジェクトディレクトリにdotenvパッケージをインストールします：

次に、プロジェクトのルートディレクトリに**.env**ファイルを作成し、Metamaskの秘密鍵とAlchemy APIのHTTP URLを追加します。

注：.envファイルの名前は必ず.envにしてください！xx.envのように名前を変更しないでください

- [こちらの手順](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key)に従って、Metamaskから秘密鍵をエクスポートしてください

- Alchemy APIのHTTP URLの取得方法は以下を参照し、クリップボードにコピーしてください

<ImageBlock
  src="https://media.alchemy.com/1704631290-copy-your-alchemy-api-key.gif"
  alt="Alchemyダッシュボード: .envファイル用にアプリのHTTP API URLをコピーする"
  width={843}
  height={480}
  caption="Alchemy APIキーをコピー"
/>

**.env**は次のようになるはずです：

## ステップ12：Ethers.jsをインストールする

Ethers.jsは、[標準的なJSON-RPCメソッド](https://www.alchemy.com/docs)をより使いやすいメソッドでラップすることで、Ethereumとのやり取りやリクエストを容易にするライブラリです。

Hardhatでは、追加のツールや機能拡張のために[プラグイン](https://hardhat.org/plugins/)を統合するのが非常に簡単です。今回はコントラクトのデプロイに[Ethersプラグイン](https://hardhat.org/plugins/nomiclabs-hardhat-ethers.html)を活用します（[Ethers.js](https://github.com/ethers-io/ethers.js/)には非常に使いやすいコントラクトデプロイ用のメソッドが用意されています）。

プロジェクトディレクトリで次のように入力してください：

次のステップでは、**hardhat.config.js**内でもethersを読み込む必要があります。

## ステップ13：hardhat.config.jsを更新する

ここまででいくつかの依存パッケージやプラグインを追加してきたので、今度は**hardhat.config.js**を更新して、これらすべてをプロジェクトが認識できるようにする必要があります。

**hardhat.config.js**を次のように更新してください：

## ステップ14：コントラクトをコンパイルする

ここまでの作業が正しく進んでいるか確認するために、コントラクトをコンパイルしてみましょう。compileタスクはHardhatに組み込まれているタスクの1つです。

コマンドラインから次を実行してください：

SPDXライセンス識別子がソースファイルに指定されていない旨の警告が出るかもしれませんが、心配ありません――それ以外は問題なく動作しているはずです！もし問題があれば、Alchemyダッシュボードからサポートチケットを開くことができます。

## ステップ15：デプロイスクリプトを書く

コントラクトの記述と設定ファイルの準備が整ったので、いよいよコントラクトのデプロイスクリプトを書いていきます。

**scripts/**フォルダに移動し、**deploy.js**という新しいファイルを作成して、次の内容を追加してください：

Hardhatは、これらのコード行それぞれが何をしているかについて、[Contractsチュートリアル](https://hardhat.org/tutorial/testing-contracts.html#writing-tests)の中で見事に説明しています。ここではその説明をそのまま採用しています。

[ethers.js](https://www.alchemy.com/dapps/ethers-js)における**ContractFactory**は、新しいスマートコントラクトをデプロイするための抽象化であり、ここでのMyNFTは私たちのNFTコントラクトのインスタンスを生成するためのファクトリです。**hardhat-ethers**プラグインを使用する場合、**ContractFactory**と**Contract**のインスタンスはデフォルトで最初のsignerに接続されます。

**ContractFactory**に対して**deploy\(\)**を呼び出すとデプロイが開始され、**Contract**に解決される**Promise**が返されます。これは、私たちのスマートコントラクトの各関数に対応するメソッドを持つオブジェクトです。

## ステップ16：コントラクトをデプロイする

いよいよスマートコントラクトをデプロイする準備が整いました！プロジェクトディレクトリのルートに戻り、コマンドラインで次を実行してください：

すると、次のような出力が表示されるはずです：

[Sepolia Etherscan](https://sepolia.etherscan.io)にアクセスし、自分のコントラクトアドレスを検索すると、正常にデプロイされたことが確認できるはずです。トランザクションは次のような見た目になります：

<ImageBlock
  src="https://media.alchemy.com/1704803201-ropsten-etherscan.png"
  alt="NFTスマートコントラクトのデプロイ成功を確認するEtherscanのトランザクション表示"
  width={2880}
  height={1646}
  caption="アドレスのデプロイに成功しました"
/>

**From**アドレスはあなたのMetamaskアカウントアドレスと一致し、Toアドレスには「Contract Creation」と表示されるはずです。トランザクションをクリックすると、**To**フィールドにコントラクトアドレスが表示されます：

<ImageBlock
  src="https://media.alchemy.com/1704803309-nft-deployed-successfully.png"
  alt="やった!NFTスマートコントラクトをEthereumチェーンにデプロイできました🎉"
  width={2880}
  height={1538}
  caption="やった!NFTスマートコントラクトをEthereumチェーンにデプロイできました🎉"
/>

裏側で何が起きているかを把握するために、[Alchemyダッシュボード](https://dashboard.alchemy.com/signup?referral=affiliate:68212b46-a5c5-4f4c-bc8b-73f50536fcaf)のExplorerタブに移動してみましょう。複数のAlchemyアプリを持っている場合は、必ずアプリでフィルタリングして「MyNFT」を選択してください。

<ImageBlock
  src="https://media.alchemy.com/1704803382-navigate-to-the-explorer-tab-in-our-alchemy-dashboard.jpg"
  alt="コントラクトデプロイ時に発行されたJSON-RPC呼び出しを一覧表示するAlchemyダッシュボードのExplorerタブ"
  width={2880}
  height={1636}
  caption="Alchemyダッシュボードの Explorerタブに移動"
/>

ここでは、**.deploy\(\)**関数を呼び出した際に、HardhatやEthersが裏側で行った一連のJSON-RPC呼び出しを確認できます。

ここで特に重要な2つを挙げると、**`eth_sendRawTransaction`**は実際にスマートコントラクトをSepoliaチェーンに書き込むためのリクエストで、**`eth_getTransactionByHash`**はトランザクションハッシュをもとにそのトランザクションに関する情報を読み取るためのリクエストです（トランザクション送信時によく見られるパターンです）。

トランザクションの送信について詳しく知りたい場合は、[Web3を使ったトランザクション送信](https://docs.alchemy.com/docs/how-to-send-transactions-on-ethereum)についてのこちらのチュートリアルを確認してください。

このチュートリアルのPart Iはここまでです。Part IIでは、実際に[NFTをミントする](/blog/how-to-mint-an-nft-using-web3-js)ことでスマートコントラクトとやり取りし、Part IIIでは[MetamaskでNFTを表示する方法](/blog/how-to-view-your-nft-in-your-mobile-wallet)を説明します！🤑
