こんにちは!TEDASKのToshiです。
前回のテストネット用のトークンを取得する方法に続いて、テストネットに独自コントラクトでNFTを作成し、自分のウォレットに作成したNFTを転送するまでのやり方を今回はご紹介したいと思います。
今回はSepoliaテストネットを利用しますので、もしまだSepoliaのトークンを取得していない場合は、次の記事を見ながらSepoliaのトークンを取得するところから始めましょう。
事前準備
Sepoliaのトークンを取得したら、次に以下の用意が必要です。
- 画像ファイルを読み込ませるためのサーバーもしくはGitHub
- NFT化するための画像
- SepoliaETHの残高
1.画像ファイルを読み込ませるためのサーバーもしくはGitHub
画像をNFTにする場合、もしその画像そのものをNFT化してしまうと、変換処理が多くなりガス代も多く掛かってしまうため、メタデータに画像ファイルのURL(置き場)をNFT化することでガス代を抑えるやり方が一般的です。
そのため、この画像のパスが変わってしまった場合(使っていたドメイン+サーバーを解約したとか)は、画像が表示されなくなってしまうため、一度配置した画像のURLは変わらないことが前提となります。
ですので今回は、レンタルサーバーではなくGitHubの公開リポジトリを利用して画像ファイルを配置したいと思います。
2.NFT化するための画像
当然ですが、NFT化するための画像を用意します。
一応注意ですが、試験とは言え著作権があるような画像は著作権違反になるため利用しないようにして下さい。また大事な作品なども、ここでの公開はおすすめしませんので、簡易的に作った画像を用意しましょう。
3.SepoliaETHの残高
今回は本番のイーサリアムネットワークではなく、テストネットにNFTを作成するのですが、テストネットでもガス代は掛かるため事前にSepoliaETHというトークンを取得しておく必要があります。
SepoliaETHトークンの取得については次の記事で紹介しています。
GitHubに画像データとメタデータを配置
もしGitHubを使ったことが無くレンタルサーバーが良いというかたは、ファイルの作りかはまでは一緒ですので、参考にして下さい。

まずnewでリポジトリを作成します。

名前はなんでもいいですが、自分で分かる名前にしておきます。またPublicを指定します。

ローカルにimagesフォルダとmetadataフォルダを作成します。

imagesフォルダにNFT化するための画像を入れます。名前はなんでもいいのですが、半角英数字にします。

次にmetadataフォルダに先ほどの0(拡張子なし)のファイルを作成します。これは後ほどTokenIDというIDをMint(ウォレットに転送)するときに入力するのですが、そのIDと対応する必要がありますので、まずは最小単位の「0」というファイルを作成します。
ちなみに画像名もこのメタデータのファイル名と合わせた方がわかりやすいという人は、画像のファイル名も0.pngや0.jpgなどに変更しても良いです。
{ "name": "test NFT", "description": "test description", "image": "test.png", "attributes": [ { "trait_type": "test category", "value": "test value" } ] }
メタデータの内容は、決まっているのるパラメータに合わせますが、今回はこの内容で作成しますので、内容は適宜ご自身のものに書き換えてください。ちなみに、lmageだけはまだURLがまだ決まっていないので、仮でファイル名だけ入力しておきます。
では一旦この状態でGitHubにPushしてしまいます。

データが反映されています。

画像も確認できたので、次にURLを取得します。

リポジトリ画面の「Settings」をクリックします。

左メニューの「Pages」をクリックします。
「Build and deployment」の「Branch」をNoneからmainに切り換えて、「Save」をクリックします。
すると、「Your site is live at」と表示されるので、そのURLにアクセスします。

そうすると「404」ページが表示されますが、とりあえず大丈夫です。

つぎに生成されたURL/images/test.png(ご自身で作ったファイル名)にアクセスします。
画像が表示されればOKですので、そのURLを先ほどのメタデータファイル(0)に貼り付けて、githubのデータを更新します。(面倒な場合はgithub上から直接更新しても良いです。)
{ "name": "test NFT", "description": "test description", "image": "{{YOUR URL}}/nft_remix/images/test.png", "attributes": [ { "trait_type": "test category", "value": "test value" } ] }
これで準備OKです!
Remix IDEでNFTを作成
いよいよ画像をNFT化しますので、ブラウザ上でプログラムが実行できるRemix IDEにアクセスします。

初めてアクセスすると、アンケートのようなダイアログが表示されるので、とりあえずLearningを選択すれば良いかと思います。

メイン画面に移ったら、「Workplace」の左横のメニューアイコンをクリックして「Create using template」をクリックします。

テンプレート一覧が表示されるので、「OpenZepperin」の「ERC721 contract with:」mintable、burnableが記載されているテンプレートの「Create」をクリックします。

「OK」をクリックします。

ファイルが自動で生成されるので、生成作業が落ち着いたら「contracts」フォルダの中の「MyToken.sol」をクリックします。
ソースコードが記述されているのがわかります。
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract MY_NFT is ERC721, ERC721Burnable, Ownable { constructor(address initialOwner) ERC721("MY_NFT", "MYNFT") Ownable(initialOwner) {} function _baseURI() internal pure override returns (string memory) { return "{{YOUR URL}}/nft_remix/metadata/"; } function safeMint(address to, uint256 tokenId) public onlyOwner { _safeMint(to, tokenId); } }
ソースコードに上記のコードで不足している、function _baseURI()の部分を追記します。{{YOUR URL}}の部分は先ほどGitHubで作ったページURLです。metadataはメタデータファイルが入っているディレクトリです。
MY_NFTやMYNFTの部分は自由ですので、ご自身の分かる名前に適宜変更してください。

Cntl+sで保存すると、自動でコンパイルが始まり、ファイルが生成されます。チェックマークが表示されていればOKです。

左メニューの「DEPLOY & RUN TRANSACTIONS」メニューをクリックします。

「ENVIRONMENT」をクリックしたら「Injected Provider – MetaMask」をクリックします。

MetaMaskの接続が必要になるので、パスワードで接続します。このとき、MetaMask上で、Sepoliaが選択されていることを事前に確認しておきます。

「接続」をクリック。

このようにSepoliaが表示されていればOKです。また、MyToken.solが表示されているを確認し、「Deploy」ボタンの横に、自分のウォレットアドレスを入力したら、「Deploy」をクリックします。

MetaMaskが立ち上がり、コントラクトを展開と表示されるので、「確認」をクリックします。

デプロイが完了すると、コンソールにチェックマークがついて、デプロイ完了したことが分かります。
これでNFTか作成されました。
ただ、作成しただけ、自分のウォレットにはNFTはまだ存在しない状態なので、次に作成したNFTを自分のウォレットに送る作業(Mint)をします。
作成したNFTをMintする(転送する)

Deployが完了したのを確認して、画面左下の「Deployed Contracts」の下にあるコントラクトの詳細をクリックします。

「safeMint」の矢印をクリックします。

to:にはMetaMaskのウォレットアドレスを入力、tokenId:には0(画像のファイル名)を入力したら、「transact」をクリックします。

そうすると、再度MetaMaskが立ち上がるので、「確認」をクリックします。

コンソールにチェックマークが付けばNFTの転送が完了です!
OpenSeaのテストネットサイトでNFTを確認
問題なく送られているかをOpenSeaのテストネットサイトで確認してみましょう!

検索窓に、自分のウォレットアドレス(MetaMaskのウォレットアドレス)を入力して、「アカウント」が表示されたら、ウォレットアドレスをクリックします。

「名前なし」のアカウントが表示されると思うので、そのまま下にスクロールします。

このように、上手く言っていれば、画像が表示されます。
他の画像の無いデータもみえていますが、これはメタデータ関係で間違った分のデータたちです。

画像をクリックして詳細を見てみます。

実際にご自身でデプロイ、ミントをすれば対応会見が分かると思うのですが、一応まとめると
TEDASK_NFTの部分は、今回の説明で言うと、REMIX IDEのcontact MY_NFTの部分です。
test NFT 2はメタデータ内に書いた「name」の部分です。
所有者がyouとなっていますが、OpenSeaに自分のウォレットアドレスでアカウントログインをすれば、youと表示されています。

説明はメタデータのdescriptionで書いた内容です。
特性はメタデータのattributesで書いた内容が反映されています。
以上がOpenSeaのテストネットサイトでの確認方法です。
MetaMaskでのNFTの確認方法
自分のウォレットアドレスにNFTをMintしているので、もちろんMetaMaskでも確認ができます。

アドオンのMetaMaskを立ち上げたら、NFTタブを開きます。

先ほどのNFTがあるのが確認できます。画像をクリックします。

詳細が表示されました。
以上がMetaMaskでの確認方法です。
まとめ
以上が、独自コントラクトでNFTを作成して、自分のウォレットにNFTを転送するまでの作業を紹介しました。
今回はあくまで、とりあえずNFTを作成することに重点をおいたので、コントラクトの細かいオプションなどには触れていません。
今後はもう少しコントラクトの詳細に触れたり、同じトークンを複数作って他の人に送るなどの方法についても紹介で来たらと思っています。
私もまだまだ勉強中の身ですので、間違いや疑問点などあればコメントいただけたら嬉しく思います。
以上、「【WEB3】Remix IDEをつかってテストネットに独自コントラクトでNFTをデプロイ(作成)して自分のウォレットに転送(Mint)する方法」でした!
コメント