ethereumアプリ開発フレームワークtruffleを使用してテストネットRinkebyにNFTをデプロイ!

ethereumアプリ開発フレームワークtruffleを使用してテストネットRinkebyにNFTをデプロイ!

ethereumアプリ開発フレームワークtruffleを使用してテストネットRinkebyにNFTをデプロイ!

ethereumアプリ開発フレームワークtruffleを使用してテストネットRinkebyにNFTをデプロイ!

新しいプロジェクトとして始めます。

$ mkdir mynft && cd mynft
$ npm init -y
OpenZepplineのコントラクトをインストールします。
npm install --save-dev @openzeppelin/contracts
ここでデベロップメントツールとしてTruffleをインストール、しかしRemixやOpenZepplinCLIも使用できます(できるよう)。
npm install truffle

コントラクトアーティファクトを開始

プロジェクトをinitしてコントラクトとコンフィギュレーションをネットワークにつなげられるようにします。

npx truffle init
ERC721PresetMinterPauserAutoIdを使用してプリセットしていきます。これは、Mint(自動トークンIDとメタデータURIを使用)、一時停止、および書き込みができるようにプリセットされたERC721です。build/contractsへとコピーします。
$ mkdir -p build/contracts/
$ cp node_modules/@openzeppelin/contracts/build/contracts/* build/contracts/

migrationsフォルダの中に 2_deploy.js というファイルを作成し下記を入力

// migrations/2_deploy.js
// SPDX-License-Identifier: MIT
const ERC721PresetMinterPauserAutoId = artifacts.require("ERC721PresetMinterPauserAutoId");

module.exports = function(deployer) {
  deployer.deploy(ERC721PresetMinterPauserAutoId, "My NFT","NFT", "https://my-json-server.typicode.com/abcoathup/samplenft/tokens/");
};

https://my-json-server.typicode.com/abcoathup/samplenft/tokens/の中身

[
  {
    "id": 0,
    "description": "My NFT",
    "external_url": "https://forum.openzeppelin.com/t/create-an-nft-and-deploy-to-a-public-testnet-using-truffle/2961",
    "image": "https://twemoji.maxcdn.com/svg/1f40e.svg",
    "name": "My NFT 0"
  },
  {
    "id": 1,
    "description": "My NFT",
    "external_url": "https://forum.openzeppelin.com/t/create-an-nft-and-deploy-to-a-public-testnet-using-truffle/2961",
    "image": "https://twemoji.maxcdn.com/svg/1f40e.svg",
    "name": "My NFT 1"
  },
  {
    "id": 2,
    "description": "My NFT",
    "external_url": "https://forum.openzeppelin.com/t/create-an-nft-and-deploy-to-a-public-testnet-using-truffle/2961",
    "image": "https://twemoji.maxcdn.com/svg/1f40e.svg",
    "name": "My NFT 2"
  }
]

コントラクトをデプロイ

下記コマンドでTruffleコンソールをブロックチェーンデベロップメントとともに開きます。

$npx truffle develop

上記コマンドの出力、最終行がTruffleコンソール

PS C:\Users\Dell\blockchain\mynft> npx truffle develop
Truffle Develop started at http://127.0.0.1:9545/

Accounts:
(0) 0xc1b7545c988f6bb83eb3acca36f8f7392f25652e
(1) 0x5af8f9c797b74e16c87df6d1547c6e1a1cff3920
(2) 0x857c4154c40e121811582e4f8abdd941d0ecbd82
(3) 0x3c9812325d2b804810500eb44f4207e2959ade29
(4) 0xdc8093887048a0f4bbd22150589450c82502484c
(5) 0x497d9b73c31ff28ca0b7086a66e2191a0c2ff3d8
(6) 0x20288f6fa8eedbb6e345980f55f74d6d623a236d
(7) 0x18f3116d0ef753c4faa70204ae344df6d3beb6b1
(8) 0x8359fdbcca2ca7a2c2e2256da2c3492caa83c65f
(9) 0xfdb15a2d8495c0e0b7dabd29c41cf141fd40fdb0

Private Keys:
(0) b6fb1968667165ecf4fd6d69c0e4520fe1981bd0a947ba05f07c27b74ccfab48
(1) c1b9b09715e63ab2c4f897c5821fc1c630f3c90c0b14a8268803ab4533a929fd
(2) 67d9ad487374de3ab2ad5f4fdb2a6c8a2ebe02644ba0e3c23f9dd6b7225d51cd
(3) 322208a1ef0535556c39fa8f8db76a8beb53658871f2de41a2c27afca3d9ec4e
(4) 070415b746fedcba93fd2fafbec3386a0ba5578d734f8c69ac367caad29d5963
(5) 4249af394d9c42b473dd58ebbae07f50ea74550aa2973f87b86595ad997bc7ff
(6) 8678d3b4cbf65885ea09b203580750bfe9a88908a99b38ce67b8b21f31160621
(7) e310f2cfa63f5145618babd3b8a678fa2b72550383e3ac82b4464ef3a502fa1a
(8) 64312a5402c11975893379cb6d7a3047abfe108234e59e950034ea47023ebe8c
(9) b454ff6092b9e630e051826d677c818d6f2088e3b7b7729347ad8f96346164f6

Mnemonic: exclude actress scare electric flower betray lab problem album dress attend level

⚠️  Important ⚠️  : This mnemonic was created for you by Truffle. It is not secure.
Ensure you do not use it on production blockchains, or else you risk losing funds.

truffle(develop)>

新しいNFTをmigrateを使ってデプロイできます。

※まずはTruffleでテストネット接続の確認を行わなければいけない

truffle(develop)> migrate

Compiling your contracts...
===========================
> Compiling .\contracts\Migrations.sol
> Compiling .\contracts\Migrations.sol
> Artifacts written to C:\Users\Dell\blockchain\mynft\build\contracts
> Compiled successfully using:
   - solc: 0.8.10+commit.fc410830.Emscripten.clang



Starting migrations...
======================
> Network name:    'develop'
> Network id:      5777
> Block gas limit: 6721975 (0x6691b7)


1_initial_migration.js
======================

   Replacing 'Migrations'
   ----------------------
   > transaction hash:    0xd66ef8d941a30b67ca0b917e2828b095a3e3186e5433acde0bef74cbf3376b4b
   > Blocks: 0            Seconds: 0
   > contract address:    0x1165c39aD8dc9311eA6A371f9594500AB2d79dBE
   > block number:        1
   > block timestamp:     1638622373
   > account:             0xc1B7545c988F6bb83Eb3ACCa36F8F7392F25652E
   > balance:             99.999502292
   > gas used:            248854 (0x3cc16)
   > gas price:           2 gwei
   > value sent:          0 ETH
   > total cost:          0.000497708 ETH


   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:         0.000497708 ETH


2_deploy.js
===========

Error: Migration C:\Users\Dell\blockchain\mynft\migrations\2_deploy.js invalid or does not take any parameters    
    at Migration._load (C:\Users\Dell\blockchain\mynft\node_modules\truffle\build\webpack:\packages\migrate\Migration.js:50:1)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at Migration.run (C:\Users\Dell\blockchain\mynft\node_modules\truffle\build\webpack:\packages\migrate\Migration.js:217:1)
    at Object.runMigrations (C:\Users\Dell\blockchain\mynft\node_modules\truffle\build\webpack:\packages\migrate\index.js:150:1)
    at Object.runFrom (C:\Users\Dell\blockchain\mynft\node_modules\truffle\build\webpack:\packages\migrate\index.js:110:1)
    at Object.run (C:\Users\Dell\blockchain\mynft\node_modules\truffle\build\webpack:\packages\migrate\index.js:87:1)
    at runMigrations (C:\Users\Dell\blockchain\mynft\node_modules\truffle\build\webpack:\packages\core\lib\commands\migrate.js:258:1)
    at Object.run (C:\Users\Dell\blockchain\mynft\node_modules\truffle\build\webpack:\packages\core\lib\commands\migrate.js:223:1)
    at Command.run (C:\Users\Dell\blockchain\mynft\node_modules\truffle\build\webpack:\packages\core\lib\command.js:183:1)
- Fetching solc version list from solc-bin. Attempt #1
√ Downloading compiler. Attempt #1.
- Blocks: 0            Seconds: 0
- Saving migration to chain.

デプロイしたコントラクトを使用

truffle(develop)> nft = await ERC721PresetMinterPauserAutoId.deployed()
undefined

トークンとのやり取り

トークンのメタデータを呼び出しできます。

トークンメタデータ

truffle(develop)> await nft.name()
'My NFT'
truffle(develop)> await nft.symbol()
'NFT'
truffle(develop)> await nft.baseURI()
'https://my-json-server.typicode.com/abcoathup/samplenft/tokens/'

Mint

ミンターの役割を持つアカウントから、特定のアカウントにミントトークンへのトランザクションを送信できます。
私たちの場合、ミンターの役割が与えられているトークンをデプロイしたアカウントからミントしています。

トークンID0の1つのNFTを作成します。

truffle(develop)> await nft.mint("0x0445c33bdce670d57189158b88c0034b579f37ce")
{ tx:
   '0xd301a60dbb8ac187687f6639f200d4e6f2cfa065923092b3940330e35a26421d',
  receipt:
   { transactionHash:
      '0xd301a60dbb8ac187687f6639f200d4e6f2cfa065923092b3940330e35a26421d',
     transactionIndex: 0,
     blockHash:
      '0x3ad3cfcb26da0c969e9d5a5414a5e90a91a3a862c9e9082afc38a0ec0f1a5d00',
     blockNumber: 5,
     from: '0x0445c33bdce670d57189158b88c0034b579f37ce',
     to: '0xdee9411430c7dd9b67fc6da723de729adab50ad7',
     gasUsed: 156470,
...

メタデータのためにオーナーとトークンURIの確認ができます。

truffle(develop)> await nft.ownerOf(0)
'0x0445c33BdCe670D57189158b88c0034B579f37cE'
truffle(develop)> await nft.tokenURI(0)
'https://my-json-server.typicode.com/abcoathup/samplenft/tokens/0'

メタデータ

今回使われるEIP-721には、名前、記号、および各tokenIDを指し示すトークンURIが含まれています。tokenURIは、指定されたトークンIDの名前、説明、および画像を含むJSONファイルを指すことができます。
⚠️NFTを存在させるためにはメタデータを永久持続的に保存する場所が必要となります。 
イメージはライセンスCC BY 4.0(クリエイティブコモンセンス)の元twemoji Graphicsをtwitter/twemojiで使用

テストネットへのデプロイ

OpenSeaがRinkebyのテストネットをサポートしているのでRinkebyにデプロイします。

まずは truffle-config.js へrinkeby情報の追加

infuraのネットワークをrinkebyにするyoutubeはこちら

    rinkeby: {
      provider: () => new HDWalletProvider(mnemonic, `https://rinkeby.infura.io/v3/${projectId}`),
      network_id: 4,       // Rinkeby's id
      gas: 8500000,        
      gasPrice: 1000000000,  // 1 gwei (in wei) (default: 100 gwei)
      confirmations: 2,    // # of confs to wait between deployments. (default: 0)
      timeoutBlocks: 200,  // # of blocks before a deployment times out  (minimum/default: 50)
      skipDryRun: true     // Skip dry run before migrations? (default: false for public nets )
    },

rinkebyへデプロイ

$ npx truffle console --network rinkeby
truffle(rinkeby)> migrate

Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.



Starting migrations...
======================
> Network name:    'rinkeby'
> Network id:      4
> Block gas limit: 10000000 (0x989680)


1_initial_migration.js
======================

   Deploying 'Migrations'
   ----------------------
   > transaction hash:    0xf817c3bb3b44349da50d90ef41317b64207eef76c5546a3348a8d8043a2d4d12
   > Blocks: 1            Seconds: 30
   > contract address:    0x1C883F26d124148c2E632539B4c37A6beD5eCD6f
   > block number:        6572315
   > block timestamp:     1590740195
   > account:             0x77737a65C296012C67F8c7f656d1Df81827c9541
   > balance:             3.986111900199984594
   > gas used:            164163 (0x28143)
   > gas price:           1 gwei
   > value sent:          0 ETH
   > total cost:          0.000164163 ETH

   Pausing for 2 confirmations...
   ------------------------------
   > confirmation number: 1 (block: 6572316)
   > confirmation number: 2 (block: 6572317)

   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:         0.000164163 ETH


2_deploy.js
===========

   Deploying 'ERC721PresetMinterPauserAutoId'
   ------------------------------------------
   > transaction hash:    0x169e09cf7d50c226339493237b1d0981af0eed44698d35a132674105c311cb6e
   > Blocks: 0            Seconds: 9
   > contract address:    0x5c5c53D13aD8725cFE551D6E9dB93e9a9D38D78D
   > block number:        6572320
   > block timestamp:     1590740270
   > account:             0x77737a65C296012C67F8c7f656d1Df81827c9541
   > balance:             3.982371884199984594
   > gas used:            3697675 (0x386c0b)
   > gas price:           1 gwei
   > value sent:          0 ETH
   > total cost:          0.003697675 ETH

   Pausing for 2 confirmations...
   ------------------------------
   > confirmation number: 1 (block: 6572321)
   > confirmation number: 2 (block: 6572322)

   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:         0.003697675 ETH


Summary
=======
> Total deployments:   2
> Final cost:          0.003861838 ETH

Mint

truffle(rinkeby)> nft = await ERC721PresetMinterPauserAutoId.deployed()
undefined

アカウント

truffle(rinkeby)> accounts
[ '0x77737a65C296012C67F8c7f656d1Df81827c9541',
truffle(rinkeby)> await nft.mint("0x77737a65C296012C67F8c7f656d1Df81827c9541")
{ tx:
   '0xce8132ff0ffce128b8508d396fb0625a12c839fd1ee886eab5b4ddaf2755ca6f',
  receipt:
   { blockHash:
      '0x3f546e5caa9142d89dc3a87e7d369ba175629b480840d8bf88bd146f205e62de',
     blockNumber: 6572543,
     contractAddress: null,
     cumulativeGasUsed: 1410693,
     from: '0x77737a65c296012c67f8c7f656d1df81827c9541',
     gasUsed: 149870,

OpenSea

Rinkebyの中のコントラクトアドレスの確認

truffle(rinkeby)> nft.address
'0x5c5c53D13aD8725cFE551D6E9dB93e9a9D38D78D'

参考リンク

(再実施でウォレット情報を入れずに途中エラーになっているので正しく整合性がないですが下記は前回実施)

https://rinkeby-api.opensea.io/asset/0xB6C8BC5A485253dD56f7661416Cc23AEB7902E5E/0/validate/

今回の参考はこちら

Create an NFT and deploy to a public testnet, using Truffle

コメントを残す

メールアドレスが公開されることはありません。