自分用に雑にNFTを作る
zennにも書いた
自分専用の簡易NFTを手軽に作成できるようにしておくとTwitter Blue登録者などは気軽にNFT設定できるようになったりして何かと便利。
以下では自分のためだけの最低限のNFTの実装/デプロイ/mintの方法を記す。
事前準備
メタデータファイルの準備
NFTのメタデータ(json)とアイコン画像を適当な場所に配置しておく。
画像を適当な場所に配置する。これは王道だとIPFSだけど正直自分用ならS3でもなんでもいい。自分の場合はよくわからんIPFS事業者よりGitHubの方が長生きする気がするのでこんな感じで、自分のGitHubページにディレクトリを掘って画像を配置した。ファイル名としては0.jpgとか数字の方が後々の管理コスト的には良いと思う。 メタデータファイルとしては下記。
code:0
{
"description": "icon for twitter",
"name": "@razokulover"
}
descriptionとnameはご自由に。imageのところは先ほどアップロードした画像のURLを指定すること。そして一番重要なのはこのファイル名をNFTのIDだけ(拡張子は無し)にすること。
NFTのIDは0から順に1ずつ自動でインクリメントされていく。そしてそのIDと後ほど出てくる_baseURI()に設定したURL情報を使って自動でNFTのURLが生成されることになる。
NFTの実装
https://scrapbox.io/files/63c254eb2cbaf0001de8e771.png
左ナビゲーションのファイルアイコンをクリック。FILE EXPLORER > WORKSPACESの+ボタンが見えるはずなのでクリック。するとCreate Workspaceというのが出てくるはず。そこでChoose a templateを選択しERC721というのを選ぶ。そのままOKをクリック。
するとcontractsやscriptsといったディレクトリやMyToken.sol(名前は違うことがあるかも)といったファイルが生成されているはず。
contracts/MyToken.solをMyNFT.solにリネームする。
そんでそのファイルに下記のコードをペタッと貼り付ける。
code:sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyNFT is ERC721, Ownable {
constructor() ERC721("MyNFT", "MNT") {}
function _baseURI() internal pure override returns (string memory) {
}
function safeMint(address to, uint256 tokenId) public onlyOwner {
_safeMint(to, tokenId);
}
}
重要なのは_baseURI()のところ。ここで自分の場合は先ほどアップロードしたmetadataのディレクトリまでのURLを指定している。このコードを使う人はここを任意のmetadataのファイルがあるディレクトリのurlに差し替えればよい。
こうしておくことで後ほどNFTをmintした時にhttps://yuheinakasaka.github.io/twitter-icons/metadata/0.jsonとかhttps://yuheinakasaka.github.io/twitter-icons/metadata/1.jsonといったtokenURIでアクセスされるようにできる。
あとは一旦cmd + sを叩くと自動でセーブされコンパイルもされるはず。もし失敗した場合は左ナビゲーションのSolidity CompilerでCOMPILERのバージョンをソースコードのversion(上記の場合は0.8.9)に合わせてCompile MyNFT.solというボタンを押す。これでいけるはず。
NFTのデプロイ
左ナビゲーションのDEPLOY & RUN TRANSACTIONSを開く。
ENVIRONMENTをクリックしてInjected Provider - MetaMaskを選ぶ。この時自分のMetaMaskはテストネット(Goerliとか)にしておく。Goerliが見つからない場合はGörli Testnet 接続方法 - Qiitaでも見てうまいことやっておくこと。 この後のデプロイやmint時にテスト用のETHが必要になるが、Goerli用のfaucet(Goerli Faucet)あたりから取得しておく。 とりあえずENVIRONMENTは下記のようになってれば正解。
https://scrapbox.io/files/63c257f301b6a0001df50ac7.png
あとはCONTRACT(Compiled by Remix)がMyNFT - contracts/MyNFT.solとなっていることを確認してDeployをクリックする。するとMetaMaskが立ち上がるのでConfirmする。
数十秒経つとテストネットへのデプロイが完了となる。
NFTのMint
あとはNFTを自分のウォレットにMintする。
先ほどのRemixのDEPLOY & RUN TRANSACTIONSのDeployボタンの下方にDeployed Contractsというのが出ていると思う。
こんな感じ↓
https://scrapbox.io/files/63c2596776288b001df566ad.png
ここから先ほどデプロイしたContractへNFTのmintリクエストを飛ばすことで自分のウォレットにNFTを鋳造する。
オレンジ色のボタンの中にsafeMintというのがあると思うのでそこの↓矢印をクリックする。するとtoとtokenIdという入力フォームが出てくるはず。
toには自分のウォレットアドレス、tokenIdには初めてなら0を入力する。
あとはtransactボタンを押す。するとMetaMaskが立ち上がるので間違いないか確認した上でConfirmする。
そこでSafe Mintという履歴が表示されていれば成功。下記のような感じ。
https://scrapbox.io/files/63c25a9f36579e001e0b9737.png
メインネットへ
デプロイ以降の作業をあとはテストネットのGoerliではなくメインネットに変更して行うだけでよい。これで晴れて自分の好きな画像を自分用のNFTとしてゲットできる。
必要経費
ブロックチェーンに何かを書き込んだりするにはガス代が必要。今回の場合はコントラクトのデプロイとNFTのMintにそれぞれガス代がかかる。
メインネットへデプロイするために必要なガス代は$60前後。mintするにも数千円。大体1万円くらい。高いですね。
リンク
Remixの画像が多いので参考になるかも
OpenZeppelin製のコントラクトメーカー。
自分のmetadataと画像をおいているGitHubリポジトリ。
今回のコードの自分用。テストネットでしか試してないからGoerliのEtherscanのURLを貼っておく。
Etherscanでコントラクトのコードを表示させる方法について。
NFTがちゃんとmintされているとOpenSeaのテストネット版でこんな感じで確認できる。