NFTの作成とデプロイ方法(NFTチュートリアルシリーズのパート1/3)
NFTがブロックチェーンを世間の注目を集める中、イーサリアムのブロックチェーン上で独自のNFTコントラクト(ERC-721トークン)を公開することで、その熱狂を自ら理解する絶好の機会です!
Alchemyは、Makersplace(最近Christie'sで6,900万ドルのデジタルアートワーク販売記録を樹立)、Dapper Labs(NBA Top ShotとCrypto Kittiesのクリエイター)、オープンシー(世界最大のNFTマーケットプレイス)、Zora、Super Rare、NFTfi、Foundation、Enjin、Origin Protocol、Immutableなど、NFT分野のビッグネームを支えていることを非常に誇りに思っています。
このチュートリアルでは、メタマスク (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ではメタマスクでNFTを表示する方法を説明します。
もちろん、途中で質問がある場合は、遠慮なくAlchemyのディスコード (opens in a new tab)で質問するか、AlchemyのNFT APIドキュメント (opens in a new tab)にアクセスしてください!
ステップ1:イーサリアムのネットワークに接続する
イーサリアムのブロックチェーンにリクエストを送信する方法はたくさんありますが、簡単にするために、独自のノードを実行せずにイーサリアムのチェーンと通信できるブロックチェーン開発者プラットフォームおよびAPIであるAlchemy (opens in a new tab)の無料アカウントを使用します。
このチュートリアルでは、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:イーサリアムのアカウント(アドレス)を作成する
トランザクションを送受信するには、イーサリアムのアカウントが必要です。このチュートリアルでは、イーサリアムのアカウントのアドレスを管理するためにブラウザで使用される仮想ウォレットであるメタマスクを使用します。イーサリアムでのトランザクションの仕組みについて詳しく知りたい場合は、イーサリアム財団のこちらのページを確認してください。
こちら (opens in a new tab)からメタマスクをダウンロードして、無料でアカウントを作成できます。アカウントを作成する際、またはすでにアカウントを持っている場合は、右上のネットワークを「Sepolia Test Network」に切り替えてください(実際の資金を扱わないようにするためです)。
ステップ4:フォーセットからイーサを追加する
スマート・コントラクトをテストネットにデプロイするには、テスト用のETHが必要です。ETHを取得するには、AlchemyがホストするSepoliaフォーセット (opens in a new tab)にアクセスし、ログインしてアカウントのアドレスを入力し、「Send Me ETH」をクリックします。すぐにメタマスクのアカウントにETHが表示されるはずです!
ステップ5:残高を確認する
残高があることを再確認するために、Alchemyのコンポーザーツール (opens in a new tab)を使用してeth_getBalance (opens in a new tab)リクエストを送信してみましょう。これにより、ウォレット内のETHの量が返されます。メタマスクのアカウントのアドレスを入力して「Send Request」をクリックすると、次のようなレスポンスが表示されるはずです。
{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}
注 この結果はETHではなくWeiで表示されています。Weiはイーサの最小単位として使用されます。WeiからETHへの変換は、1 eth = 1018 Weiです。したがって、0xde0b6b3a7640000を10進数に変換すると1*1018 Weiになり、これは1 ETHに相当します。
ふう!テスト用の資金がすべて揃いました。
ステップ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 name: (my-nft)
version: (1.0.0)
description: My first NFT!
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/thesuperb1/Desktop/my-nft/package.json:
{
"name": "my-nft",
"version": "1.0.0",
"description": "My first NFT!",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
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」を選択します。
888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888 888 888 "88b 888P" d88" 888 888 "88b "88b 888 888 888 .d888888 888 888 888 888 888 .d888888 888 888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. 888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 👷 Welcome to Hardhat v2.0.11 👷 ? What do you want to do? … Create a sample project ❯ Create an empty hardhat.config.js Quit
これにより、プロジェクトのすべての設定を指定する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スマート・コントラクトを作成します。
-
contractsフォルダに移動し、MyNFT.solという新しいファイルを作成します。 -
以下は、オープンツェッペリン (opens in a new tab)ライブラリのERC-721実装に基づいたNFTスマート・コントラクトのコードです。以下の内容をコピーしてMyNFT.solファイルに貼り付けます。
//[https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721) に基づくコントラクト // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; contract MyNFT is ERC721URIStorage, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIds; constructor() ERC721("MyNFT", "NFT") {} function mintNFT(address recipient, string memory tokenURI) public onlyOwner returns (uint256) { _tokenIds.increment(); uint256 newItemId = _tokenIds.current(); _mint(recipient, newItemId); _setTokenURI(newItemId, tokenURI); return newItemId; } } -
オープンツェッペリンのコントラクトライブラリからクラスを継承しているため、コマンドラインで
npm install @openzeppelin/contracts^4.0.0を実行して、ライブラリをフォルダにインストールします。
では、このコードは正確に_何をする_のでしょうか?行ごとに分解してみましょう。
スマート・コントラクトの先頭で、3つのオープンツェッペリン (opens in a new tab)のスマート・コントラクトクラスをインポートします。
-
@openzeppelin/contracts/token/ERC721/ERC721.solには、NFTスマート・コントラクトが継承するERC-721標準の実装が含まれています。(有効なNFTであるためには、スマート・コントラクトがERC-721標準のすべてのメソッドを実装している必要があります。)継承されたERC-721関数について詳しく知りたい場合は、こちら (opens in a new tab)のインターフェース定義を確認してください。
-
@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は、スマート・コントラクトにアクセス制御 (opens in a new tab)を設定し、スマート・コントラクトの所有者(あなた)のみがNFTをミントできるようにします。(注:アクセス制御を含めるかどうかは完全に好みの問題です。誰でもスマート・コントラクトを使用してNFTをミントできるようにしたい場合は、10行目のOwnableと17行目のonlyOwnerという単語を削除してください。)
インポート文の後に、カスタムのNFTスマート・コントラクトがあります。これは驚くほど短く、カウンター、コンストラクタ、および単一の関数のみが含まれています!これは、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のメタデータは、名前、説明、画像、その他の属性などの構成可能なプロパティを持たせることで、NFTに命を吹き込むものです。このチュートリアルのパート2では、このメタデータを構成する方法について説明します。
mintNFTは、継承されたERC-721ライブラリからいくつかのメソッドを呼び出し、最終的に新しくミントされたNFTのIDを表す数値を返します。
ステップ11:メタマスクとAlchemyをプロジェクトに接続する
メタマスクのウォレット、Alchemyアカウントを作成し、スマート・コントラクトを作成したので、これら3つを接続する時が来ました。
仮想ウォレットから送信されるすべてのトランザクションには、固有の秘密鍵を使用した署名が必要です。プログラムにこの権限を提供するために、秘密鍵(およびAlchemy APIキー)を環境ファイルに安全に保存できます。
トランザクションの送信について詳しく知りたい場合は、Web3を使用したトランザクションの送信に関するこちらのチュートリアルを確認してください。
まず、プロジェクトディレクトリにdotenvパッケージをインストールします。
npm install dotenv --save
次に、プロジェクトのルートディレクトリに.envファイルを作成し、メタマスクの秘密鍵とHTTP Alchemy API URLを追加します。
-
こちらの手順 (opens in a new tab)に従って、メタマスクから秘密鍵をエクスポートします。
-
以下の手順でHTTP Alchemy API URLを取得し、クリップボードにコピーします。
.envは次のようになります。
API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key (opens in a new tab)" PRIVATE_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)には非常にクリーンなコントラクトデプロイメソッドがいくつかあります)。
プロジェクトディレクトリで次のように入力します。
npm install --save-dev @nomiclabs/hardhat-ethers ethers@^5.0.0
次のステップで、hardhat.config.jsでもethersをリクワイアします。
ステップ13:hardhat.config.jsを更新する
これまでにいくつかの依存関係とプラグインを追加しましたが、プロジェクトがそれらすべてを認識できるようにhardhat.config.jsを更新する必要があります。
hardhat.config.jsを次のように更新します。
/**
* @type import('hardhat/config').HardhatUserConfig
*/
require('dotenv').config();
require("@nomiclabs/hardhat-ethers");
const { API_URL, PRIVATE_KEY } = process.env;
module.exports = {
solidity: "0.8.1",
defaultNetwork: "sepolia",
networks: {
hardhat: {},
sepolia: {
url: API_URL,
accounts: [`0x${PRIVATE_KEY}`]
}
},
}
ステップ14:コントラクトをコンパイルする
これまでのところすべてが機能していることを確認するために、コントラクトをコンパイルしてみましょう。コンパイルタスクは、組み込みのHardhatタスクの1つです。
コマンドラインから以下を実行します。
npx hardhat compile
ソースファイルにSPDXライセンス識別子が提供されていないという警告が表示される場合がありますが、心配する必要はありません。他のすべてが正常であることを願っています!そうでない場合は、いつでもAlchemyのディスコード (opens in a new tab)でメッセージを送信できます。
ステップ15:デプロイスクリプトを作成する
コントラクトが作成され、構成ファイルの準備が整ったので、コントラクトのデプロイスクリプトを作成する時が来ました。
scripts/フォルダに移動し、deploy.jsという新しいファイルを作成して、次の内容を追加します。
async function main() {
const MyNFT = await ethers.getContractFactory("MyNFT")
// デプロイを開始し、コントラクトオブジェクトに解決されるPromiseを返す
const myNFT = await MyNFT.deploy()
await myNFT.deployed()
console.log("Contract deployed to address:", myNFT.address)
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error)
process.exit(1)
})
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)にアクセスしてコントラクトのアドレスを検索すると、正常にデプロイされたことが確認できるはずです。すぐに表示されない場合は、時間がかかることがあるため、しばらくお待ちください。トランザクションは次のようになります。
Fromアドレスはメタマスクのアカウントのアドレスと一致し、Toアドレスには「Contract Creation」と表示されます。トランザクションをクリックすると、Toフィールドにコントラクトのアドレスが表示されます。
やったー!イーサリアム(テストネット)チェーンにNFTスマート・コントラクトをデプロイしました!
内部で何が起こっているかを理解するために、Alchemyダッシュボード (opens in a new tab)のExplorerタブに移動しましょう。複数のAlchemyアプリがある場合は、アプリでフィルタリングして「MyNFT」を選択してください。
ここでは、.deploy()関数を呼び出したときにHardhat/Ethersが内部で行ったいくつかのJSON-RPC呼び出しを確認できます。ここで注目すべき2つの重要な呼び出しは、スマート・コントラクトを実際にSepoliaチェーンに書き込むためのリクエストであるeth_sendRawTransactionと、ハッシュを指定してトランザクションに関する情報を読み取るためのリクエストであるeth_getTransactionByHash(トランザクションを送信する際の典型的なパターン)です。トランザクションの送信について詳しく知りたい場合は、Web3を使用したトランザクションの送信に関するこちらのチュートリアルを確認してください。
このチュートリアルのパート1は以上です。パート2では、NFTをミントすることで実際にスマート・コントラクトと対話します。そしてパート3では、イーサリアムのウォレットでNFTを表示する方法を紹介します!






