NFTの発行(ERC721)
NFTとは何ですか?
NFT(Non-Fungible Token)は、それぞれにシリアル番号が割り当てられたデジタルトークンであり、例えば、100に制限されたデジタルチケットやトレーディングカードに便利です。
ERC721は、NFTスマートコントラクトを作成するための標準です。NFTおよびERC721の標準については、こちらをクリックしてください。
NFTには「メタデータ」を関連付ける必要があり、一般的な外部URLを指定する形式である必要があります。
NFTには多くの種類があり、メタデータに書き込むことができる内容には実質的な制限がありません。画像タイプのNFTは世界で人気がありますが、NFT自体が価値があるかのように誤解される部分があり、NFTの価値はそのNFTの法的価値とは異なります。誰かがそのNFTを条件として保証する場合にのみ。保証をする会社が消えると、NFTの価値が失われるか、自分がその権利を持っていることを証明しなければなりません。
このチュートリアルでは、画像タイプのNFTを持つERC721スマートコントラクトをG.U.Sandbox Chainにデプロイし、その作品をMintします。
前提条件
- ERC721Basic SDK
- NFT画像
ERC721 SDKの使用方法
ERC721 SDKのインストール
空のフォルダーを準備します
mkdir test-erc721
cd test-erc721
npmプロジェクトを素早く初期化します
npm init -y
G.U.SDKのnpmサーバーを設定します
echo > .npmrc
echo @gusdk:registry=https://gusdk.gu.net/ >> .npmrc
この時点で、ディレクトリの内容は次のようになります。
DIRECTORY ROOT
├── .npmrc
└── package.json
ERC20 SDKとethersをインストールします
npm install @gusdk/erc721-basic ethers@v5
ERC721 SDKを使用して新しいトークンをデプロイする
src
フォルダーを作成し、deploy.js
ファイルを作成します
mkdir src && cd src && echo > deploy.js
次のようにdeploy.jsの内容を変更します:
const { ERC721Basic__factory } = require("@gusdk/erc721-basic")
const { ethers } = require("ethers")
async function deploy() {
const provider = new ethers.providers.JsonRpcProvider({ url: "https://sandbox1.japanopenchain.org:8545/" })
const signer = new ethers.Wallet(YOUR_PRIVATE_KEY, provider);
const factory = new ERC721Basic__factory(signer)
const erc721 = await factory.deploy(
YOUR_TOKEN_NAME, // 例: "TEST"
YOUR_TOKEN_SYMBOL, // 例: "TEST"
);
return erc721.address
}
deploy().then(address => console.log(address));
次のコマンドを実行します
node deploy.js
注意: 上記のトークンアドレスを書き留めるのを忘れないでください
NFTメタデータのアップロード
作品の詳細情報は通常、ブロックチェーンに記録されません。ブロックチェーンの外、つまり、ブロックチェーンの外で説明されます。このデータは中央集権型のストレージサーバーに保存することができますが、サーバーを削除すると画像が消えてしまいます。Web3.0のマナーに従って分散ストレージにアップロードしましょう。分散ストレージへのアップロードは@gusdk/gu-uploader-basicを使用して簡単です。
インストール
npm install @gusdk/uploader-basic tslib
NTF.Storageにサインアップ 分散型ストレージとしてIPFSを使用します。IPFS(InterPlanetary File System)は、Protocol Labsによって開発中のP2Pネットワーク上で動作するハイパーメディアプロトコルおよびその実装です。IPFSを簡単に利用できるサービスとして、NFT.Storageを使用します。
:::注意
IPFSの分散型ストレージに画像などのメタデータを保存しても、そのデータはIPFSサーバーで誰かがあなたのコンテンツをピン留めしていない限り、世界から消えてしまいます。製品で使用する場合は、NFT.StorageなどのIPFSサーバーサービスを使用するか、自分でIPFSサーバーを設定し、少なくとも1つのIPFSサーバーでピン留めする必要があります。
:::
登録後、APIキーを取得します
画像をアップロード
src
フォルダーの下にupload.js
ファイルを作成します
echo > upload.js
以下のコードを含むupload.jsを変更します:
const { GUUploaderBasic } = require('@gusdk/uploader-basic')
async function upload() {
const sdk = new GUUploaderBasic({ nftStorageToken: "YOUR_API_KEY" })
const cid = await sdk.storeMetadata({
name: '作品名を入力してください',
description: "作品の詳細を入力してください",
imagePath: "/path/to/your/work.jpg"
})
return cid
}
upload().then(cid => console.log(cid))
次のコマンドを実行します
node upload.js
次のようなレスポンスが表示されます:
Token {
ipnft: 'bafyreihy7g6qap2gphinbdwy47w367yqsfhphgtlfgrqsujrztlxilq3em',
url: 'ipfs://bafyreihy7g6qap2gphinbdwy47w367yqsfhphgtlfgrqsujrztlxilq3em/metadata.json'
}
注意:
- URLは、NFTをMintする際のURIになります
- CID(コンテンツ識別子)を書き留めてください。これは、メタデータへのリンクです。それは次のIPFSのゲートウェイのいずれかで閲覧できます。例:https://[YOUR_CID].ipfs.nftstorage.link/metadata.json
Mint
srcフォルダーの下にmint.jsを作成します
echo > mint.js
以下のコードを含むmint.jsを変更します:
const { ERC721Basic__factory} = require("@gusdk/erc721-basic")
const { ethers } = require("ethers")
async function mint(uri) {
const provider = new ethers.providers.JsonRpcProvider({ url: "https://sandbox1.japanopenchain.org:8545/" })
const signer = new ethers.Wallet(YOUR_PRIVATE_KEY, provider);
const erc721basic = ERC721Basic__factory.connect(YOUR_TOKEN_ADDRESS, signer);
const tx = await erc721basic.safeMint(signer.address, uri)
await tx.wait()
}
const uri = "ipfs://[YOUR_CID]/metadata.json"
mint(uri)
次のコマンドを実行します:
node mint.js
トークン残高を確認する
src
フォルダーの下にbalance.js
を作成します
echo > balance.js
以下のコードを含むbalance.js
を変更します:
const { ERC721Basic__factory} = require("@gusdk/erc721-basic")
const { ethers } = require("ethers")
async function balance(walletAddress) {
const provider = new ethers.providers.JsonRpcProvider({ url: "https://sandbox1.japanopenchain.org:8545/" })
const erc721basic = ERC721Basic__factory.connect(YOUR_TOKEN_ADDRESS, provider);
return await erc721basic.balanceOf(walletAddress)
}
const walletAddress = YOUR_WALLET_ADDRESS
balance(walletAddress).then(balance => console.log(balance))
次のコマンドを実行します:
node balance.js
他の機能については、リファレンスをご覧ください。