この記事はSolana Advent Calendar 2023 20日目の記事です。
Solana SuiteというSolanaのクライアントSDKを開発していますfukaoiといいます。今回はそのSolana Suiteを使って、Solana界隈でホットなCompressed NFTをMintしてみたいと思います。
Compressed NFT(cNFT)とは?
cNFTは、従来のNFT(通常のNFT)と比較して、データの保存方法が異なります。通常のNFTでは、NFTのメタデータの大部分をオンチェーンに保存していましたが、Solanaのストレージ利用料が高価であるため、cNFTではオフチェーンに保存する方式を採用しました。オフチェーンに保存した際に、ハッシュ値をオンチェーン上に作成したマークルツリーに保存することで、コストを大幅に削減しました。また、検索性も向上しました。
Collectionとは?
Collectionは、SolanaのNFTをグループ化するための仕組みです。有名なNFTプロジェクトであるMad Ladsを例に挙げると、販売用のNFTとコレクションNFTの2種類が存在しています。コレクションNFTは、そのグループを代表するNFTであり、その中に販売用のNFTが属する形を取ります。
Regular NFTではCollectionの作成は任意でしたが、cNFTではCollectionの指定が必要になりました。cNFTをMintする際には何らかのCollectionに属することになります。
実装してみる
Solana Suiteを使って、cNFTの実装方法について説明したいと思います。Solanaのネットワークはdevnetを使用します。(* Solana Suiteではデフォルト設定でdevnetが指定されています)
cNFTモジュールのインストール
$ npm i @solana-suite/compressed-nft
cNFTを発行するアカウント(Keypair)の作成
import { Account } from '@solana-suite/compressed-nft';
const owner = Account.Keypair.create();
/*
Keypair {
secret: 'CsfK6FvY5D6Pcq12a2Rb1T7wZvk7DMHdeRdJTyn3MViF2hWiaUmSN4eYqa37cpUX66daCyaZhQEyTeuBM6dDkpb',
pubkey: 'HUqoYvBzfKpth5Wx8EaUz83n4XwoBrmMQdCRZVxTxCqH'
}
*/
作成したownerアカウントには手数料分のSOLがありませんので、devnetで利用するたにSOLをAirdropしたいと思います。
Airdropモジュールのインストール
$ npm i @solana-suite/airdrop
ownerアカウントに1SOLリクエストする
import { Airdrop } from '@solana-suite/airdrop';
await Airdrop.request(owner.pubkey);
cNFTを格納するためのスペースを作成する
マークルツリーを使いオンチェーン上にスペースを作成します。今回は少数のcNFTしかMintしないので、8個だけ格納できるスペースを生成します。ownerの秘密鍵で署名を行います。
指定可能なスペースサイズは、
8
16,000
1,00,000
16,700,000
67,000,000
1,000,000,000
があります。
import { CompressedNft} from '@solana-suite/compressed-nft';
const spaceInst = await CompressedNft.createSpace(owner.secret, 8);
Collection用のNFTをMintする
今回は作成するCollection NFTは、以下の情報でMintします。コレクションの所有者もownerなのでownerの秘密鍵で署名を行います。
メタデーター名 | 値 |
name | Animals Collection |
symbol | ANIC |
filePath | ./animals.jpeg |
const collectionInst = await CompressedNft.mintCollection(
owner.secret,
{
filePath: './animals.jpeg',
name: 'Animals Collection',
symbol: 'ANIC',
}
);
SolanaネットワークにSubmitする
Solana Suiteは自分でSolanaネットワークへのSubmitタイミングをコントロールできます。createSpace()
, mintCollection()
を呼び出したタイミングではまだsubmitしていないため、sumbit関数を呼ぶ必要があります。
await [spaceInst, collectionInst].submit();
配列で渡すことで、トランザクション数を1回にまとめることができます。ほんの少しですがトランザクション手数料の削減になります。
実際に生成したCollection NFTのSolcanのURLです。
上で説明した"スペース"、"Collection NFT"は最初に一度作成するだけでOKです。
cNFTをMintする
スペース、Collection NFTが用意できたので、目的のcNFTを生成します。cNFTもCollection NFTと同じようなメタデーターが設定できます。ここでもownerの秘密鍵で署名を行います。
メタデーター名 | 値 |
name | Lion |
symbol | ANIC-LION |
filePath | ./lion.jpeg |
const mintInst = await CompressedNft.mint(
owner.secret,
{
filePath: 'linon.jpeg',
name: 'Lion',
symbol: 'ANIC-LION',
},
space, // spaceInstに含まれているspaceアカウント
mintCollection, // collectionInstに含まれいるcollectionアカウント
}
await mintInst.submit();
まとめ
どうでしょうか?結構簡単ではなかったでしょうか。Solana Suiteは、Webエンジニアが迅速にWeb3サービスを開発できることを目指したSDKです。そのため、Solanaの知識がない方でも扱いやすいように設計されています。Solanaは非常に優れたブロックチェーンであり、これを機にSolana Suiteを使用して気軽に触れていただけると嬉しいです。
おまけ
cNFTとは関係ありませんが、Solana SuiteのレスポンスはRustなどの関数型言語で一般的に使用されるResult Typeで実装されています。関数からの応答は、以下のようにエラーハンドリングすることができます。また、内部で発生した例外はTry()を使用してResult Typeに変換されます。
const res = await mintInst.submit();
if (res.isOk) {
// success
} else if (res.isErr) {
// error
}
const res = await mintInst.submit();
res.unwrap(); // 無理やり値 or エラー内容を取り出す
await mintInst.submit().match(
(value: string) => // success,
(error: Error) => // error,
);