メインコンテンツまでスキップ

NFTの発行(ERC721)

NFTとは何ですか?

NFT(Non-Fungible Token)は、それぞれにシリアル番号が割り当てられたデジタルトークンであり、例えば、100に制限されたデジタルチケットやトレーディングカードに便利です。

ERC721は、NFTスマートコントラクトを作成するための標準です。NFTおよびERC721の標準については、こちらをクリックしてください。

NFTには「メタデータ」を関連付ける必要があり、一般的な外部URLを指定する形式である必要があります。

caution

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

他の機能については、リファレンスをご覧ください。