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/
Pretty! This has been a really wonderful post. Many thanks for providing these details.