Development of ERC-721 using Truffle


ERC-20が「代替可能」トークンを発行する場合、ERC-721は「代替不可能」トークンを発行する.今日はERC-721を使ってNFTを発行する実践を行います.

GitHub, Etherscan(smart contract)


github repository
smart contract

開発環境


truffle , opensea testnet , etherscan rinkeby , pinata

ネットワーク設定のテスト

truffle-config.jsファイルにはいくつかの設定が必要です.
1. solc作成する契約のエンティティとコンパイルバージョンをチェックして変更します."0.8.7", "london"
compilers: {
  solc: {
    version: "0.8.7",
    evmVersion: "london",
  },
},
  • HDWalletProvider
  • const HDWalletProvider = require("@truffle/hdwallet-provider");
    const fs = require("fs");
    const mnemonic = fs.readFileSync(".secret").toString().trim();
    .secretメモリキーを含むファイルを作成します..gitignoreファイルをGithubリポジトリにアップロードするには、.secretファイルを.secretに作成する必要があります.
  • networks:rinkebyを使用するために既存のropstenのコメントをキャンセルします.リファレンス
  • rinkeby: {
    	provider: () =>
    		new HDWalletProvider(
    			mnemonic,
    			`https://rinkeby.infura.io/v3/{infura에서 받은 api key}`, 1), // 3번째 인자는 메타마스크 계정의 인덱스이다. 
    	network_id: 4, // Rinkeby's id
    	gas: 4500000,
    	gasPrice: 10000000000,
    	confirmations: 2, 
    	timeoutBlocks: 200,
    	skipDryRun: true, 
    },

    インテリジェント契約の作成


    vsコードにMyNFTs.solファイルを作成し、以下のコードを記述します.Openzeppelinライブラリを使用するため、追加のインストールが必要です.
    npm install @openzeppelin/contracts
    //Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.7;
    
    import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
    import "@openzeppelin/contracts/utils/Counters.sol";
    import "@openzeppelin/contracts/access/Ownable.sol";
    import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
    
    contract MyNFTs is ERC721URIStorage, Ownable {
        using Counters for Counters.Counter;
        Counters.Counter private _tokenIds;
    
        constructor() public ERC721("MyNFTs", "MNFT") {}
    
        function mintNFT(address recipient, string memory tokenURI)
            public onlyOwner
            returns (uint256)
        {
            _tokenIds.increment();
    
            uint256 newItemId = _tokenIds.current();
            _mint(recipient, newItemId);
            _setTokenURI(newItemId, tokenURI);
    
            return newItemId;
        }
    }

    移行ファイルの設定


    配置を調整するには、移行ファイルを設定する必要があります.migrationフォルダの下にある既存のファイル1_initial_migration.jsを変更します.以下に示します.
    const Migrations = artifacts.require('Migrations');
    const MyNFTs = artifacts.require('MyNFTs.sol'); // 추가
    
    module.exports = function (deployer) {
    	deployer.deploy(Migrations);
    	deployer.deploy(MyNFTs); // 추가
    };

    インテリジェント契約のコンパイル、導入


    NFTをOpen Citestネットワークにアップロードするために、ネットワークはrinkebyを使用します.端末に次のコマンドを記述すると、コンパイル後に配置されます.
    truffle migrate --compile-all --network rinkeby
    
    端末からコンパイル後の導入までのプロセスが表示されます.

    MyNFTSのtransaction hashをコピーし、イーサスキャンで検索すると、確認が次のように取得されます.

    contract verify & publish


    contract verify&publishを行うと、イーサスキャンで関数を起動できます.確認したばかりの取引では、下記のように契約先をクリックします.

    契約セクションをクリックして検証します.

    契約コードを作成する場合は、truffle-flattenerを使用してインポートしたopenzeppelinコードをすべて挿入します.再びvsコードに戻り、flatフォルダを作成し、端末に次のコマンドを順次入力します.
    npm install truffle-flattener --save
    truffle-flattener ./contracts/MyNFTs.sol > ./flat/MyNFTs.sol
    確認flatフォルダMyNFTs.solOpenzeppelinのすべてのコード.コード全体をコピーして、エーテルスキャンのverifyを行えばいいです.
    ただし、コピーしたソースコードを入力してもエラーが発生します.

    これはtruffle-platlerを使用してSPDX部分重複にアクセスしたときに発生する問題です.sol-mergerを使用すると、重複するSPDXは自動的に削除されますが、適用されませんので、手動で重複する部分は削除されます.
    verify&publishが完了すると、イーサスキャンで関数を実行できます.以下の操作を行うことでmintNFS関数を使用してNFTを発行してみます.

    メタデータ・ファイルの作成


    mintNFT関数には2つのパラメータが含まれています.1つ目はNFT受信者のアドレスで、2つ目はtokenURIです.ここではtokenUIの作成作業を行います.
    まずvs codetest.json作成ファイルに戻ります.次のように入力します.
    {
    	"name": "Loyal Duck #001",
    	"description": "Made on December 18, 2021",
    	"image": "https://imagedelivery.net/v7-TZByhOiJbNM9RaUdzSA/2c6f93b0-891f-42b4-a017-bcf85c03cb00/public",
    	"attributes": [
    		{
    			"trait_type": "TYPE",
    			"value": "Cute"
    		}
    	]
    }
    生成されたjsonファイルをpinataにアップロードします.以前の実験ではnft.storagestorage providersを用いたが,決定には48時間かかるためPinaを用いた.

    ファイルをアップロードした後、CIDセクションをコピーします.

    mintNFT


    イーサスキャンに戻りmintnftを続行します.
    最初のパラメータ(受信者)にNFTを受信するアドレスを入力し、2番目のパラメータ(tokenURI)にフィナタからのCIDを入力し、Writeをクリックしてガス料金を支払う.


    OpenSea Testnets


    前にmintNFT関数を実行してNFTを発行します.確認のために.
    Open氏テストネットワークに移動します.以下の動画で確認できます.
    メタデータで記述された属性はオープンテストネットワークでよく表示されている.


    発展回顧(KPT)


    KEEP(仕事とコードの面での良い経験)


    以前はインターンシップを遅らせることが多かったのですが、今回のインターンシップを通じてほとんどの場所を解決することができ、とても有益でした.特にganacheからrinkebyにネットワーク環境を変更した結果、財布の設定やガス代の誤りが発生し、これらの誤りを解決する過程が面白かった.メタデータを直接記述する部分もNFT作成のプロセスをより具体的に見ることができ、非常に良い部分です.個人的にはNFTを発行するのが一番楽しい仕事です.

    PROBLEM(操作とコードの面での悪い体験)


    仕事をしながらブログを書いたほうがいいです.すべての仕事が終わって、整理した後、仕事よりブログに多くの時間を費やしました.

    TRY(後で試すアクションアイテムを設定)


    現在、関数を1回実行している間にNFTが発行されています.しかし,NFTを大量に発行できるため,さらに学習した後に大量のNFTを発行するためにいくつかのコードを記述することが望ましい.