読了時間:12分
概要
ERC-721規格に準拠したデジタルコレクティブルは、『Cryptokitties』の登場以来、大きな人気を博しており、ここ数ヶ月で広く普及する段階へと進んでいます。このガイドでは、OpenZeppelin規格を使用してNFT(ERC-721)を作成・展開する方法について解説します。
動画による解説をご希望ですか?ラデクと一緒に、20分でERC-721(NFT)を作成・デプロイする方法を学びましょう。
主な業務内容
- 非代替性トークン(NFT)とその活用事例について学ぶ
- 作成するERC-721トークンのメタデータを作成する
- ファイルを分散型ストレージシステム(IPFS)にアップロードしてください
- Remix.IDE を使用して ERC-721 トークンを作成・展開する
必要なもの
- Quicknodeのエンドポイント(こちらから無料で作成できます)
- テスト用ETHが入ったWeb3ウォレット(例:MetaMask、Coinbase Wallet、Phantom、またはWalletConnect対応のウォレットなど)(Multi-Chain Quicknode Faucetから入手可能です)
- IPFS CLIがインストールされました
- 最新のウェブブラウザ(例:Chrome)
非代替性トークン(NFT)とは何ですか?
「代替可能(Fungible)」とは、同一である、あるいは互いに置き換え可能であることを意味します。例えば、イーサリアムのトークン、つまり特定のトークンクラスのすべての構成要素は、同じ価値を持っています。カルダノのトークンについても同様です。代替可能なトークンは、1対1で互いに置き換え可能です。
こうした点を踏まえると、NFTは唯一無二のものであり、一つひとつが異なります。すべてのトークンには、独自の特性と価値があります。NFTとなり得るものには、トレーディングカード、芸術作品、航空券などがあります。これらはすべて互いに明確に区別でき、互いに置き換えることはできません。非代替性トークン(NFT)を希少な収集品と捉えてみてください。それぞれが独自の特性や特異な属性、そして多くの場合、メタデータを持っています。
ERC-721とは何ですか?
ERCは「Ethereum Request for Comment」の略で、721は提案の識別番号です。ERCはイーサリアムエコシステムにおけるアプリケーションレベルの標準規格であり、ERC-20のようなトークンのスマートコントラクト標準となることもあります。ERCの提案者は、イーサリアムコミュニティとの合意形成を図る責任を負っており、提案がコミュニティによって審査・承認されると、それが標準規格となります。最新のERC提案については、こちらで確認できます。 ERC-721は、スマートコントラクト内でNFTを追跡・転送するための機能を提案するために作成されました。
ERC-721は、EVM(イーサリアム仮想マシン)互換のブロックチェーン上で非代替性トークン(NFT)を構築する方法を規定したオープンスタンダードです。これはNFTのための標準インターフェースであり、NFTの取り扱いを容易にする一連のルールを定めています。NFTにはERC-721型だけでなく、ERC-1155トークンもあります。
ERC-721規格で定義されている関数およびイベントの一覧は以下の通りです:
ERC-721の機能
balanceOf:この関数は、特定のアドレスが所有するNFT(非代替性トークン)の数を返すために使用されます。
ownerOf:この関数は、特定のトークンの所有者のアドレスを返します。各ERC721トークンは一意であり、IDによって表されます。この関数により、ユーザーやアプリケーションは、その一意のIDに基づいてトークンの所有者を特定することができます。
safeTransferFrom(データなし):この関数は、特定のトークンの所有権をあるアドレスから別のアドレスへ安全に譲渡します。この関数は、受取人がスマートコントラクトであるかどうかを確認します。受取人がスマートコントラクトである場合、譲渡を受け入れるためには特定の関数(onERC721Received)を実装している必要があります。
transferFrom:この関数は、トークンの所有権をあるアドレスから別のアドレスへ移転するために使用されます。通常、送信者がトークンの移転を承認されている場合に使用されます。
承認:この機能は、特定のトークンを転送するために、あるアドレスに対して承認を与えるために使用されます。これにより、所有者が他の当事者に自身に代わってトークンを転送することを許可する「委任転送」が可能になります。
getApproved: この関数は、特定のトークンに対して承認済みのアドレスを取得するために使用されます。そのトークンに承認済みのアドレスがない場合、この関数はnullのアドレスを返します。
setApprovalForAll:この関数を使用すると、1つ以上のトークンの所有者は、オペレーターが自身のすべてのトークンを管理できるよう承認したり、その承認を取り消したりすることができます。
isApprovedForAll: この関数は、あるオペレーターが所有者のすべてのトークンを管理する権限を承認されているかどうかを確認するために使用されます。
safeTransferFrom(データ付き):この関数は、safeTransferFrom(データなし)と似ていますが、データパラメータが追加されています。受信者がスマートコントラクトである場合、この追加データを使用して、転送中に追加情報を渡すことができます。また、この関数は、受信者がスマートコントラクトであるかどうか、および onERC721Received 関数を実装しているかどうかを確認します。
ERC-721関連のイベント
転送:このイベントは、トークンの所有権があるアドレスから別のアドレスへ移行した際に発生します。このイベントには、送信者(from)、受信者(to)、および転送された特定のトークン(ID による)に関する詳細が含まれます。このイベントにより、UI や他のコントラクトなどの外部リスナーが、転送に対して反応できるようになります。
承認:このイベントは、特定のトークンの転送についてあるアドレスが承認された際に発生します。このイベントには、トークンの現在の所有者(owner)、トークンの転送が可能になった承認済みアドレス(approved)、および転送が承認された特定のトークン(ID による)が含まれます。このイベントにより、アプリケーションはトークンの承認状況を追跡し、それに応じて対応することができます。
ApprovalForAll:このイベントは、所有者がオペレーターに対し、自身のすべてのトークンを管理する権限を承認または取り消した際に発生します。このイベントには、所有者のアドレス(owner)、オペレーターのアドレス(operator)、およびオペレーターが承認されたかどうかを示すブール値(approved)が含まれます。このイベントにより、アプリケーションは、特定の所有者のすべてのトークンを管理する権限を付与されたアドレスを追跡することができます。
非代替性トークン(NFT)の活用事例
-
デジタルアート(または実物アート):アート作品は、NFTの最も一般的な活用例です。デジタルアートのオークションは、NFTの最初の活用事例であり、現在も成長を続けています。
-
ゲーム:ゲーム内課金やゲームの収集アイテムの提供。
-
不動産:不動産のトークン化、スマートコントラクト、および売買の執行。
-
金融:ローン、先物取引などの金融商品や、その他の責任。
-
ソフトウェア製品:著作権侵害防止とプライバシー保護を確実にするためのソフトウェアライセンス。
-
コンサートチケット・スポーツ観戦チケット:チケット販売における不正行為を防止し、ファンが過去の体験を一か所で確認できるようにするため。
-
KYCコンプライアンス:特定のユーザーのKYC用にトークンを作成する。
テスト用ETHを入手する
ERC-721トークンとは何か、その仕組みがわかったところで、次は独自のトークンをどのように作成・展開できるかを見ていきましょう。
イーサリアム・セポリア・テストネットにコントラクトをデプロイします。開始するには、MetaMaskブラウザ拡張機能(またはPhantom、WalletConnect対応など、互換性のある他のWeb3ウォレット)と、テスト用のETHが必要です。テスト用ETHは、Quicknode Multi-Chain Faucetから入手できます。ウォレットを接続するか、アドレスを貼り付けて「Continue」をクリックしてください。 ボーナスを獲得するためにツイートをシェアするよう促されます(お勧めします!)。そうでない場合は、「No thanks, just send me 0.05 ETH」をクリックしてください。なお、EVMファウセットを利用するには、イーサリアムメインネット上に0.001 ETHの残高が必要ですのでご注意ください。

IPFSへのファイルの追加
NFTコントラクトを作成する前に、NFT用のアート作品をホストし、メタデータファイルを作成する必要があります。このため、ピアツーピア型の分散型ファイル保存・共有システムであるIPFSを使用します。 IPFSプロトコルを利用するには、いくつかの方法があります。自身のシステム上でIPFSをセットアップして運用することもできますが、より簡単な解決策としてQuicknodeを利用することも可能です。Quicknodeは、基盤となるインフラストラクチャを管理することで、IPFSへのアクセスを簡素化します。このアプローチにより、コンテンツの作成に集中でき、データピンニングのためのローカルIPFSノードの維持管理という負担から解放されます。Quicknodeを利用すれば、技術的な複雑さはすべて代行されます。
IPFSへのファイルアップロード方法として、標準のIPFS CLIを使用する方法と、簡素化されたQuicknode IPFSサービスを使用する方法の2つについて解説します。
標準的な方法:IPFS CLI を使用する
IPFS ドキュメントのインストールガイドに従って、お使いのオペレーティングシステムに合わせて IPFS CLI をダウンロードしてインストールしてください。
以下に、画像およびメタデータファイルをホストするための手順を示します。
ステップ 1: IPFS リポジトリの作成
ターミナルまたはコマンドプロンプトのウィンドウで、以下のコマンドを入力して、IPFSリポジトリを起動してください。
ipfs init
ステップ 2: IPFS デーモンの起動
IPFSデーモンを起動し、別のターミナルまたはコマンドプロンプトウィンドウを開いて、以下のコマンドを入力してください。
IPFS デーモン
ステップ3:IPFSへの画像の追加
最初のターミナルウィンドウを開き、画像(ここでは art.png)を IPFS に追加します。
ipfs add art.png

Qmで始まるハッシュをコピーし、その先頭に「https://ipfs.io/ipfs/」というプレフィックスを追加してください。次のような形式になるはずです:https://ipfs.io/ipfs/QmQEVVLJUR1WLN15S49rzDJsSP7za9DxeqpUzWuG4aondg
ステップ4:JSONファイルをIPFSに追加する
「nft.json」という名前のJSONファイルを作成し、画像と同じディレクトリに保存してください。
JSONファイル形式:
{
"name": "NFT Art",
"description": "This image shows the true nature of NFT.",
"image": "https://ipfs.io/ipfs/QmZzBdKF7sQX1Q49CQGmreuZHxt9sVB3hTc3TTXYcVZ7jC"
}
それでは、JSONファイルを追加してください。
ipfs add nft.json
Qmで始まるハッシュを取り出し、その先頭に「https://ipfs.io/ipfs/」を付け加えます。その結果は、次のような形になるはずです。https://ipfs.io/ipfs/QmUFbUjAifv9GwJo7ufTB5sccnrNqELhDMafoEmZdPPng7
このURLを保存しておいてください。NFTを発行する際に必要になります。
QuicknodeのIPFSソリューション:より手軽な代替案
Quicknode IPFSの価格詳細については、こちらの料金プランをご覧ください。
よりシンプルな方法をお探しなら、QuicknodeのIPFSサービスが、NFTアセットのアップロードに最適な、使いやすく効率的なソリューションを提供します。Quicknodeを利用すれば、インフラ管理の煩わしさから解放され、ローカルのIPFSノードの維持管理に時間を割くことなく、コンテンツそのものに集中することができます。
IPFSでQuicknodeを使い始めるには、以下の手順に従ってください:
手順 1:Quicknode へのログイン
Quicknodeにログインし、左側のサイドバーから「IPFS」オプションを選択してください:

ステップ 2:Quicknode を使って IPFS に画像を追加する
画像ファイルをドラッグ&ドロップするか、Finder/ファイルエクスプローラーのウィンドウからクリックして選択することで、すばやくアップロードできます。このガイドでは、以下の画像を使用します。

アップロード後、「ファイル」タブでファイル名をクリックし、「IPFS URLをコピー」ボタンをクリックしてください。以下のスクリーンショットのように操作してください。
https://qn-shared.quicknode-ipfs.com/ipfs/QmQEVVLJUR1WLN15S49rzDJsSP7za9DxeqpUzWuG4aondg

ステップ3:Quicknode を使用して JSON ファイルを IPFS に追加する
という名前のJSONファイルを作成します nft.json, 内のIPFS URLを 画像 フィールドに入力し、保存します。保存後、前の手順と同様に、JSONファイルをIPFSにアップロードしてください。
{
"name": "NFT Art",
"description": "This image shows the true nature of NFT.",
"image": "https://qn-shared.quicknode-ipfs.com/ipfs/QmQEVVLJUR1WLN15S49rzDJsSP7za9DxeqpUzWuG4aondg"
}
アップロード後、「ファイル」タブでファイル名をクリックし、IPFS URLをコピーしてください。URLは以下のような形式になっているはずです。
https://qn-shared.quicknode-ipfs.com/ipfs/QmeVHZzKGEDbEbG5MVz4hUucNf4qZTRfW18AgdJNTrv22m
このURLを保存しておいてください。NFTを発行する際に必要になります。
独自のトークンの作成
利便性とセキュリティの観点から、NFTの作成にはOpenZeppelinのERC-721コントラクトを使用します。OpenZeppelinを使えば、ERC-721インターフェースをすべて自作する必要はありません。代わりに、ライブラリコントラクトをインポートして、その関数を利用することができます。
Ethereum RemixIDE にアクセスして、新しい Solidity ファイルを作成してください。例えば、「MyToken.sol」といったファイル名で作成します。
新しいSolidityスクリプトに、以下のコードを貼り付けてください:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts@5.0.0/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts@5.0.0/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts@5.0.0/token/ERC721/extensions/ERC721Burnable.sol";
import "@openzeppelin/contracts@5.0.0/access/Ownable.sol";
contract MyToken is ERC721, ERC721URIStorage, ERC721Burnable, Ownable {
constructor(address initialOwner)
ERC721("MyToken", "MTK")
Ownable(initialOwner)
{}
function safeMint(address to, uint256 tokenId, string memory uri)
public
onlyOwner
{
_safeMint(to, tokenId);
_setTokenURI(tokenId, uri);
}
// The following functions are overrides required by Solidity.
function tokenURI(uint256 tokenId)
public
view
override(ERC721, ERC721URIStorage)
returns (string memory)
{
return super.tokenURI(tokenId);
}
function supportsInterface(bytes4 interfaceId)
public
view
override(ERC721, ERC721URIStorage)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
}
上記のコードの説明:
1行目:SPDXライセンスタイプを「MIT」として指定しています。これは、コードがMITライセンスの下で提供されていることを示しています。MITライセンスは、使用、改変、配布に関する制限が極めて少ない、寛容なオープンソースライセンスです。
2行目:Solidityのバージョンを^0.8.20として宣言しています。これは、コードがSolidityバージョン0.8.20、またはそれとの互換性のあるバージョンを使用して記述されていることを示しています。
4行目~7行目:OpenZeppelinライブラリから必要な契約をインポートしています。
-
ERC721.sol:このコントラクトはOpenZeppelinライブラリからインポートされたもので、ERC721規格の基本的な実装を表しています。ERC721は、非代替性トークン(NFT)の規格です。
-
ERC721URIStorage.sol:このコントラクトはERC721を拡張し、NFTに関連付けられたメタデータURIを保存・管理する機能を追加しています。メタデータURIは通常、そのNFTに関する追加情報を指し示します。
-
ERC721Burnable.sol:このコントラクトもERC721を拡張しており、NFTをバーン(破棄)する機能を追加しています。NFTを流通から永久に削除するための関数を提供しており、所有者のみがこれを呼び出すことができます。
-
Ownable.sol:このコントラクトはアクセス制御に使用されます。これにより、コントラクト内で特別な権限を持つ所有者を指定することができます。所有者は、他のユーザーにはできない特定のアクションを実行することができます。
9行目:名前が MyToken また、ERC721、ERC721URIStorage、およびOwnableの各コントラクトを拡張していることも明記されています。つまり、この MyToken 契約は、これらの契約で定義された機能やプロパティを継承します。
10行目:ここからコンストラクタ関数が始まります。コンストラクタとは、Solidityにおける特別な関数であり、コントラクトのデプロイ時に1回だけ実行されます。このコンストラクタは1つの引数を受け取り、 最初の所有者、これはイーサリアムのアドレスです。
11行目:この行では、引数「MyToken」と「MTK」を指定して、ERC721コントラクトのコンストラクタを呼び出しています。これにより、名前を「MyToken」、シンボルを「MTK」とするNFTコントラクトが初期化されます。
12行目:この行では、Ownableコントラクトのコンストラクタを呼び出し、MyTokenコントラクトの初期所有者を、initialOwnerとして指定されたアドレスに設定します。
15行目:関数の宣言 safeMint 3つの引数(to:NFTトークンの受信者のアドレス、tokenId:トークンの一意の識別子、uri:トークンに関連付けられたJSONファイルのURI)を指定して呼び出します。この関数は、契約の所有者(によって指定される)のみが呼び出すことができます。 onlyOwner 修飾子)。
19行目: _safeMint ERC721コントラクトから継承された関数です。この関数は新しいトークンを作成し、指定された受信者のアドレスに割り当てます。
20行目:トークンに関連付けられたトークンURI(メタデータURI)を、 _setTokenURI から継承された関数 ERC721URIStorage 契約。URIは、指定されたtokenIdとuriに基づいて設定されます。
25行目~32行目:Solidityで必要とされるオーバーライドを実装する。 ERC721 そして ERC721URIStorage 契約。 tokenURI これは、指定された tokenId に関連付けられたメタデータ URI を取得する関数です。この関数は public および view としてマークされており、読み取り専用の関数であり、誰でも呼び出すことができることを示しています。
34行目~41行目:によって必須とされる supportsInterface 関数を実装しています。 ERC721 そして ERC721URIStorage 契約。この関数は、指定された interfaceId がその契約でサポートされているかどうかを確認し、その結果に応じてブール値を返します。
これらの機能とコントラクトを組み合わせることで、このコードは「」という名前のカスタムERC721トークンコントラクトを作成します。 MyToken. このコントラクトにより、コントラクト所有者は安全に新しいトークンを鋳造し、それらにメタデータURIを関連付けることができ、ERC721規格で定義された必要なインターフェースをサポートしています。
それでは、必要に応じて、少し時間を取ってスマートコントラクトを自分の詳細に合わせてカスタマイズしてください。以下の行を更新することで、トークン名とシンボルを変更できます - ERC721("MyToken", "MTK").
作業が完了したら、スマートコントラクトをコンパイルし、以下を使用してデプロイしてください。 インジェクテッド・プロバイダー (コントラクトをコンパイルする前に、Metamaskで「Sepoliaテストネット」が選択されていることを確認してください)。その後、ウォレットアドレスを、すぐそばにあるボックスに貼り付けてください。 デプロイ ボタンをクリックして、 最初の所有者 コンストラクタ関数のパラメータ。最後に、[クリック] デプロイ Remix.IDE上で。

デプロイ前に「この契約は抽象的な可能性があります」というエラーメッセージが表示された場合は、「契約」タブで適切な契約が選択されていることを確認してください。
Metamaskで取引を確認してください:

それでは、Remixの「Deployed Contracts」セクションに移動し、デプロイ済みのコントラクトを展開してください。そこには多数の関数やメソッドが表示されます。その中の safeMint 機能について、以下の詳細を追加してください:
- 「_to」の欄にウォレットのアドレスを入力してください。
- _tokenIdフィールドに任意のビッグナンバーの値を入力してください。最初に鋳造されるトークンを表すため、「1」を使用することをお勧めします。
- ~については _uri このフィールドには、前の手順で使用したメソッドに対応するJSONファイルのURIを入力してください:
- 標準のIPFS CLIを使用した場合:「標準的な方法:IPFS CLIの使用」のセクションで、IPFSにファイルをアップロードした後に取得したURIを使用してください。これは、https://ipfs.io/ipfs/というプレフィックスが付いたIPFSリンクの後に、ファイルのハッシュが続く形式になります。
- QuicknodeのIPFSサービスを選択した場合:「Quicknode IPFSソリューション:より簡単な代替手段」のセクションでファイルをアップロードした後、Quicknodeから提供されたURIを使用してください。Quicknodeはファイルごとに一意のURIを生成しますので、それをここに挿入してください。

「transact」をクリックし、MetaMaskから取引を確認してください。数分かかる場合がありますが、Etherscanなどのブロックエクスプローラーを使って、取引が実行されたことをいつでも確認できます。これで、Sepoliaチェーン上にNFTが作成されました。
次のようなその他の詳細を確認できます。 名前, 記号, ownerOf、または tokenURI 先ほど述べたトークンIDを入力することで。

結論
ご自身のNFTを作成されたこと、おめでとうございます!アーティストの友人たちが作品をイーサリアムブロックチェーン上に公開できるよう手助けしたり、ご自身もアーティストになってみてはいかがでしょうか。その他の例については、OpenZeppelinのウィザードをご覧ください。
イーサリアムに関する記事やガイドをもっと読みたい方は、ぜひニュースレターにご登録ください。ご意見やご感想がございましたら、Twitterからお気軽にお寄せください。また、Discordコミュニティサーバーでは、これまで出会った中で最もクールな開発者たちが集まっていますので、いつでもお気軽にチャットで交流してください :)
皆様からのフィードバックを心よりお待ちしております!❤️
ご意見や新しいトピックに関するご要望などがありましたら、ぜひお知らせください。皆様からのご連絡を心よりお待ちしております。
