はじめに
先日,自分のWindowsマシンにWSL2でUbuntu環境を作り,そこにHyperledgerBesuのブロックチェーンを構築。そこに極めて簡単なコントラクトをデプロイして遊んだのだった。これである。
https://qiita.com/oldEng/items/557ceb29a7849e92b5f2
これがなかなか面白く,老技術者に箱庭的愉楽を与えてくれたのだった。せっかく作った箱庭にもう少し植栽がほしくなり,まずはERC20トークンをデプロイしたのがこれ。
https://qiita.com/oldEng/items/537ce540c4ee48b5acc1
最近,NFTをやる人が増えてきて,この老技術者に2周りも若い人が教えを請いに来る。
ERC721.solはNFTじゃないんだぞ,なんて言っても当然だがわかってもらえない。
そこで実際にNFTを発行すれば,なるほどーとなるはず。と今宵こんなものを書き始めたのでした。
コード
ERC721のシンプルなコードを書いてみる。
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
contract Nft is ERC721, ERC721URIStorage, ERC721Enumerable, ReentrancyGuard {
uint256 private latestTokenId = 1;
constructor(string memory name, string memory symbol)
ERC721(name, symbol)
{}
function mint(string memory _tokenURI) public {
uint256 tokenId = latestTokenId;
_mint(msg.sender, tokenId);
_setTokenURI(tokenId, _tokenURI);
latestTokenId++;
}
function _burn(uint256 tokenId)
internal
override(ERC721, ERC721URIStorage)
{
super._burn(tokenId);
}
function tokenURI(uint256 tokenId)
public
view
override(ERC721, ERC721URIStorage)
returns (string memory)
{
return super.tokenURI(tokenId);
}
function _beforeTokenTransfer(
address _from,
address _to,
uint256 _tokenId
) internal override(ERC721, ERC721Enumerable) {
super._beforeTokenTransfer(_from, _to, _tokenId);
}
function supportsInterface(bytes4 _interfaceId)
public
view
override(ERC721, ERC721Enumerable)
returns (bool)
{
return super.supportsInterface(_interfaceId);
}
}
こいつをRemixにNew File「ERC721Token.sol」として貼り付けて,Compile ERC721Token.solというボタンを押す。
アカウントを用意してトークンコントラクトをデプロイ
Metamaskを拡張機能から立ち上げ,NFTTestというアカウントを用意。
こちらのアカウントIDを確認し,
DEPLOY & RUN TRANSACTIONSで下図のラインの部分を確認し,
ENVIRONMENTやCONTRACTを確認し,ACCOUNTに先ほどのNFTTestのアカウントIDが入っているか確認。
DEPLOYの右のVマークをクリックし,
NAMEにトークン名(ここではNFTtakaとした。takaとはわが幼名なり),SYMBOLにはトークン記号(ここではNFTとした)。
DEPLOYの下のこの2箇所の記入が終わったらtransact。
こういうのが出たら「確認」。
こういう可愛いのが出たらデプロイ成功である。
ここまでで,ERC721トークンのコントラクトが私のローカルのブロックチェーンにデプロイされた。
NFTの発行
次にこのトークンを発行する。
この記事の前に書いたこちらを参考にIPFS上に写真をアップロード。
こんな画像のNFTを作ることにする。
右上のMoreをつつくと出てくるShare linkを押す。
こんなのが出たらCopy。いまコピーしたのがNFTのキモであるURIである。コンテンツの存在証明だ。別の場所に置いたり,画像を差し替えたり改変したらもはや同じURIにはならない。
URLじゃなくてURIですよ。URI=Uniform Resource Identifierです。場所とコンテンツをハッシュ関数にぶち込んで作るという。
ちなみにURL=uniform resource locator,こっちは場所を表すだけ。
RemixのDeployed Contractsの一番下のやつの左の「>」マークを押し,出てきたmintの右の「v」マークをつつき,出てきた欄に先ほどコピーしたURIを貼り付ける。貼り付けたらtransact。
MetaMaskがポップアップしてこういうのが出たら確認ボタンを押す。
可愛いキツネが出たら無事NFTが発行完了。
Remixに出ているNFTコントラクトのアカウントIDをコピー。
こんなのが出るのでトークンコントラクトアドレスに先ほどコピーしたNFTコントラクトのアカウントIDを
貼り付けるとトークンシンボルは「NFT」と自動で入る。
トークンの小数桁数は0にして,「カスタムトークンを追加」を押す。
無事NFTが発行された。
NFTを移転
さっそくプレゼントしよう。KITTYtaka01という怪しい名前のアカウントのIDをコピー。
RemixのtransferFromの右の「v」マークを押しtoにKITTYtaka01のアカウントIDを張り付け,
FromにはNFTTestのアカウントIDをコピペ。
tokenIdに1を入れてtransact。
MetaMaskがPopupしてこんなのが出るので「確認」。
上記と同様にKITTYtaka01にカスタムトークンを追加。
トークンをインポート。
NFTが届いた。
こちらのアカウントにはNFTがなくなっている。