LoginSignup
3
1

More than 1 year has passed since last update.

ローカルのブロックチェーンにNFT発行する暗き老技術者あり

Last updated at Posted at 2022-05-26

はじめに

先日,自分のWindowsマシンにWSL2でUbuntu環境を作り,そこにHyperledgerBesuのブロックチェーンを構築。そこに極めて簡単なコントラクトをデプロイして遊んだのだった。これである。
https://qiita.com/oldEng/items/557ceb29a7849e92b5f2

これがなかなか面白く,老技術者に箱庭的愉楽を与えてくれたのだった。せっかく作った箱庭にもう少し植栽がほしくなり,まずはERC20トークンをデプロイしたのがこれ。
https://qiita.com/oldEng/items/537ce540c4ee48b5acc1

最近,NFTをやる人が増えてきて,この老技術者に2周りも若い人が教えを請いに来る。
ERC721.solはNFTじゃないんだぞ,なんて言っても当然だがわかってもらえない。
そこで実際にNFTを発行すれば,なるほどーとなるはず。と今宵こんなものを書き始めたのでした。

コード

ERC721のシンプルなコードを書いてみる。

ERC721Token.sol
//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というボタンを押す。
image.png

アカウントを用意してトークンコントラクトをデプロイ

Metamaskを拡張機能から立ち上げ,NFTTestというアカウントを用意。
image.png
こちらのアカウントIDを確認し,

image.png

DEPLOY & RUN TRANSACTIONSで下図のラインの部分を確認し,
image.png

ENVIRONMENTやCONTRACTを確認し,ACCOUNTに先ほどのNFTTestのアカウントIDが入っているか確認。
DEPLOYの右のVマークをクリックし,
NAMEにトークン名(ここではNFTtakaとした。takaとはわが幼名なり),SYMBOLにはトークン記号(ここではNFTとした)。
DEPLOYの下のこの2箇所の記入が終わったらtransact。

こういうのが出たら「確認」。

image.png

こういう可愛いのが出たらデプロイ成功である。

image.png

ここまでで,ERC721トークンのコントラクトが私のローカルのブロックチェーンにデプロイされた。

NFTの発行

次にこのトークンを発行する。
この記事の前に書いたこちらを参考にIPFS上に写真をアップロード。

こんな画像のNFTを作ることにする。

image.png

右上のMoreをつつくと出てくるShare linkを押す。
image.png

こんなのが出たらCopy。いまコピーしたのがNFTのキモであるURIである。コンテンツの存在証明だ。別の場所に置いたり,画像を差し替えたり改変したらもはや同じURIにはならない。
URLじゃなくてURIですよ。URI=Uniform Resource Identifierです。場所とコンテンツをハッシュ関数にぶち込んで作るという。
ちなみにURL=uniform resource locator,こっちは場所を表すだけ。

image.png

RemixのDeployed Contractsの一番下のやつの左の「>」マークを押し,出てきたmintの右の「v」マークをつつき,出てきた欄に先ほどコピーしたURIを貼り付ける。貼り付けたらtransact。

image.png

MetaMaskがポップアップしてこういうのが出たら確認ボタンを押す。

image.png

可愛いキツネが出たら無事NFTが発行完了。
Remixに出ているNFTコントラクトのアカウントIDをコピー。
image.png

MetaMaskで「トークンをインポート」を押すと
image.png

こんなのが出るのでトークンコントラクトアドレスに先ほどコピーしたNFTコントラクトのアカウントIDを
貼り付けるとトークンシンボルは「NFT」と自動で入る。
トークンの小数桁数は0にして,「カスタムトークンを追加」を押す。
image.png

こういうのが出るので,「トークンをインポート」。
image.png

無事NFTが発行された。

image.png

NFTを移転

さっそくプレゼントしよう。KITTYtaka01という怪しい名前のアカウントのIDをコピー。

image.png

RemixのtransferFromの右の「v」マークを押しtoにKITTYtaka01のアカウントIDを張り付け,
FromにはNFTTestのアカウントIDをコピペ。

image.png

tokenIdに1を入れてtransact。

image.png

MetaMaskがPopupしてこんなのが出るので「確認」。

image.png

可愛いのが出る。
image.png

上記と同様にKITTYtaka01にカスタムトークンを追加。

image.png

トークンをインポート。

image.png

NFTが届いた。

image.png

こちらのアカウントにはNFTがなくなっている。

image.png

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1