Solana Suiteを使ってCompressed NFTをMintする

Solana Suiteを使ってCompressed NFTをMintする

·

2 min read

この記事は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の秘密鍵で署名を行います。

メタデーター名
nameAnimals Collection
symbolANIC
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の秘密鍵で署名を行います。

メタデーター名
nameLion
symbolANIC-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();
  • 実際に生成したLion NFTのXRAYのURLです。
    (*SolscanがcNFTにまだ対応していないため、対応しているエクスプロラーを使います)

  • 完全なソースコードです。

まとめ

どうでしょうか?結構簡単ではなかったでしょうか。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,
);