見出し画像

EthereumでNFT(ERC721)を作ってみる

Udemyの講座にある、Become Ethereum Blockchain DeveloperをベースにERC721トークンを作っていく。

結構簡単である。

Remixでコントラクトを記述する


OpenzeppelinのWizardで、「ERC721」で「Mintable-Auto Increment Ids」「URI Storage」を指定する。するとベースのコードができあがる。
  ※ constructorの引数である、Mytoken、MTKは変更する。


pragma solidity ^0.8.19;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract NftCar is ERC721, ERC721URIStorage, Ownable {
    uint256 private _nextTokenId;

    constructor(address initialOwner)
        ERC721("NFTCar", "HMC")
        Ownable(initialOwner)
    {}

    function _baseURI() internal pure override returns (string memory) {
        return "https://XXXXXXXXXXXXXXXXXXXXXXXXXXX"; //トークンの実態であるJsonファイルが配置されるURL
    }

    function safeMint(address to, string memory uri) public onlyOwner payable {
        uint256 tokenId = _nextTokenId++;
        _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);
    }
}

トークンのメタデータを作る

トークンの実態は、メタデータ。JSON形式で記載する。コントラクト上では、tokenURIとなる。記載内容は、以下に記載されている。

{
    "name": "Sports Car #1",
    "description": "This is NFT Test/Demonstration. ",
    "image": "https://XXXX.jpg",
    "external_url": "https://XXXXXXX",
    "attributes": [
        {
            "trait_type": "Artefact", 
            "value": "SportsCar"
        },
        {
            "trait_type": "Collection", 
            "value": "Genesis"
        }
    ]
}

画像データを作る


生成AIで作ってしまえば簡単。公開するOpenSeaの画像の最大サイズは、1000x1000の模様。このサイズより大きい場合には、OpenSeaに表示されない。

メタデータ・画像データの公開


今回はIPFSでなく、簡易的にGoogleDriveをWEBサーバ化して公開する。
DriveToWebでは、複数階層のフォルダを認識しなかったため、直下にすべて保存。なお、運用面を考えると、このファイルを永続化することが課題

メタデータのフォーマットはここにある。今回は、詳細に記述せず。


コントラクトのデプロイ・MINT


Remixを使って、テストネットへデプロイする。今回は、Sepoliaテストネットワークへデプロイする。デプロイされたコントラクトを使って、トークンを発行する(MINT)。このとき、メタデータのファイルを指定する。

NFTの確認


Sepoliaテストネットへデプロイされた結果を確認する。

デプロイされたコントラクト・アドレスをもとに、OpenSeaを確認する。
この結果は以下の通り



この記事が気に入ったらサポートをしてみませんか?