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

NFTの作成とデプロイ方法(NFTチュートリアルシリーズ 1/3)

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

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)をご覧ください。

  1. ナビゲーションバーの「Apps」にマウスを合わせて、「Create App)」をクリックし、Alchemyダッシュボードの「Create App」ページに移動してください。

アプリを作成

  1. アプリに名前を付け(私たちは「My First NFT!」にしました)、簡単な説明を記述し、「Ethereum」チェーンを選択して、ネットワークに「Sepolia」を設定します。 マージ以降、他のテストネットは非推奨となっています。

アプリを設定して公開する

  1. 「Create app」をクリックします。 アプリが下の表に表示されます。

ステップ3: イーサリアムアカウント (アドレス) を作成する

トランザクションの送受信には、イーサリアムアカウントが必要です。 このチュートリアルでは、イーサリアムアカウントアドレスを管理するためにブラウザの仮想ウォレットであるMetamaskを使用します。 イーサリアム上のトランザクションの仕組みについてさらに詳しく知りたい場合は、イーサリアム・ファウンデーションのこちらのページをご覧ください。

MetaMaskアカウントは、こちら (opens in a new tab)から無料でダウンロードして作成できます。 アカウントを作成後、またはすでにアカウントをお持ちの場合は(実際に支払いが発生しないように)右上の「Sepolia Test Network」に切り替えてください。

Sepoliaをネットワークとして設定

ステップ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」をクリックすると、次のようなレスポンスが表示されます。

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

この結果はETHではなく、wei単位です。 weiはETHの最小単位として使われています。 「wei」 から「ETH」への変換は次の通りです: 1 eth = 1018 wei 。 例えば、0xde0b6b3a7640000を10進数に変換すると1*1018 weiとなり、1ETHに相当します。

ふう! 私たちの偽物のお金はすべてそこにあります。

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

まず、プロジェクトのフォルダを作成する必要があります。 コマンドラインに移動し、次のように入力します。

mkdir my-nft
cd my-nft

プロジェクトフォルダに入ったら、 npm initを使用してプロジェクトを初期化します。 まだnpmをインストールしていない場合は、これらの手順 (opens in a new tab)に従ってください (Node.js (opens in a new tab)も必要なので、そちらもダウンロードしてください!)。

npm init

インストール時の質問に対する回答方法は自由です。参考までに過去の回答方法は次のとおりです。

「package.json」を承認してください。これで準備が完了しました。

ステップ7: Hardhat (opens in a new tab)をインストールする

Hardhatは、イーサリアムのソフトウェアをコンパイル、デプロイ、テスト、デバッグするための開発環境です。 デベロッパーがライブチェーンにデプロイする前に、スマートコントラクトや分散型アプリケーション(Dapp)をローカルに構築する際に役立ちます。

「my-nft」プロジェクトの中で実行してください。

npm install --save-dev hardhat

インストール手順 (opens in a new tab)の詳細については、このページをご覧ください。

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

プロジェクトフォルダ内で以下を実行します。

npx hardhat

ウェルカムメッセージと、次に何をするのかを選択できるオプションが表示されます。 「create an empty hardhat.config.js」を選択してください。

「hardhat.config.js」というファイルが生成され、ここでプロジェクトのセットアップの全てを指定します (ステップ13)。

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

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

mkdir contracts
mkdir scripts
  • 「contracts/」は、NFT スマートコントラクトコードを保持する場所です。

  • 「scripts/」 は、スマートコントラクトをデプロイして対話するスクリプトを保持する場所です。

ステップ10: コントラクトを作成する

環境が整ったので、もっと面白いこと、つまり_スマートコントラクトのコード作成_に取り掛かりましょう!

お気に入りのエディタ (私たちはVSCode (opens in a new tab)が好きです) でmy-nftプロジェクトを開いてください。 スマートコントラクトは、Solidityと呼ばれる言語で記述されています。MyNFT.solスマートコントラクトの作成にこの言語を使用します。

  1. contractsフォルダに移動し、MyNFT.solという名前の新しいファイルを作成します

  2. 以下は、OpenZeppelin (opens in a new tab)ライブラリのERC-721実装をベースにした、私たちのNFTスマートコントラクトのコードです。 以下の内容をコピーして、MyNFT.solファイルに貼り付けます。

  3. 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パッケージをインストールします。

npm install dotenv --save

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

  • MetaMaskから秘密鍵をエクスポートするには、これらの手順 (opens in a new tab)に従ってください

  • HTTP Alchemy API URLを取得し、クリップボードにコピーするには、以下を参照してください。

Alchemy API URLをコピー

これで、.envは次のようになります:

API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY="your-metamask-private-key"

これらの変数を実際にコードに接続するために、ステップ13で hardhat.config.jsファイル内のこれらの変数を参照します。

.env をコミットしないでください!.envファイルを他人と共有したり公開したりすると、シークレットの情報が漏洩することになるので、決して共有したり公開したりしないようにしてください。バージョン管理を使用している場合は、.envgitignore (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)には非常にクリーンなコントラクトデプロイメントメソッドがあります)。

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

npm 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を以下のようにアップデートします。

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

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

コマンドラインで以下を実行します。

npx hardhat compile

SPDXライセンス識別子がソースファイルで提供されていないという警告が表示される場合がありますが、心配する必要はありません。警告が表示されないのがベストですが、 うまくいかない場合は、いつでもAlchemy Discord (opens in a new tab)でメッセージを送ることができます。

ステップ15: デプロイスクリプトを作成する

コントラクトの作成と設定ファイルの作成が完了したら、いよいよコントラクトのデプロイのためのスクリプトを作成します。

scripts/フォルダに移動してdeploy.jsという名前の新しいファイルを作成し、以下の内容を追加します:

Hardhatは、コントラクトのチュートリアル (opens in a new tab)で、これらのコードの各行が何をするかを非常にうまく説明しています。ここではその説明を採用しました。

const MyNFT = await ethers.getContractFactory("MyNFT");

ethers.jsのContractFactoryは新しいスマートコントラクトをデプロイするための抽象化であり、ここでのMyNFTはNFTコントラクトのインスタンスのためのファクトリです。 hardhat-ethersプラグインを使用する場合、 ContractFactoryおよびContractインスタンスはデフォルトで最初の署名者に接続されます。

const myNFT = await MyNFT.deploy();

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

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

ようやく、スマートコントラクトをデプロイする準備が整いました。 プロジェクトディレクトリのルートに戻り、コマンドラインで以下を実行します。

npx hardhat --network sepolia run scripts/deploy.js

次のような画面が表示されるはずです。

Contract deployed to address: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650

Sepolia etherscan (opens in a new tab)にアクセスし、コントラクトアドレスを検索すると、正常にデプロイされたことを確認できるはずです。 すぐに表示されない場合は、しばらくお待ちください。 トランザクションは以下のようなものになります。

Etherscanでトランザクションアドレスを表示

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

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

おめでとうございます。 イーサリアム(テストネット)チェーンにNFTスマートコントラクトをデプロイできました。

内部で何が起こっているのかを理解するために、Alchemyダッシュボード (opens in a new tab)のExplorerタブに移動してみましょう。 Alchemyのアプリが複数ある場合は、必ずアプリでフィルタリングして、「MyNFT」を選択してください。

AlchemyのExplorerダッシュボードで「内部」で行われた呼び出しを表示

ここでは、Hardhat/Ethersが.deploy()関数を呼び出した際に、内部で行ったJSON-RPCの呼び出しを見ることができます。 ここで特筆すべき重要な2つのリクエストは、実際にSepoliaチェーンにスマートコントラクトを書き込むためのリクエストであるeth_sendRawTransactionと、ハッシュが与えられたトランザクションに関する情報を読み取るためのリクエスト (トランザクション送信時の典型的なパターン) であるeth_getTransactionByHashです。 トランザクションの送信についてさらに詳しく知るには、Web3を使用したトランザクション送信に関するこのチュートリアルをご覧ください。

チュートリアルのパート1は以上です。 パート2では、NFTをミントしてスマートコントラクトと実際にやり取りしパート3ではイーサリアムウォレットでNFTを表示する方法をご紹介します!

ページの最終更新: 2026年3月3日

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