見出し画像

Solana Bootcamp③ メタデータ付きトークンの作成

1 実行方法について

実行方法はこちらのnoteのやり方と同じです。

こちらの「3.createTokenWithMetadata.ts」を実行するだけです。

2 概要

今回の概要は、「メタデータ付きのトークンの作成」です。

大きなステップとしては、

①ミントアカウントの作成
②トークンミントの初期化
③メタデータの作成

から構成されています。

3 トークンミントアカウントの作成

1 アカウントの作成

まずは、トークンの必要最低限の設定を保持するためのアカウントを作ります。

アカウントを作るときの方法は、いつも通り、「SystemProgram.createAccount」を使っています。

2 スペースの設定

アカウントに必要なスペースを設定します。

これは、トークンの内容や権限のある者、残高などを保持する必要があるためです。

具体的には、「MintLayout」のスペースを確保しています。

3 レント免除分のLamports

レント免除分のLamportsについては、スペースのサイズに応じて決定しています。

4 プログラムID

トークンアカウントプログラムIDは、「TokenProgram」のIDになります。

前回のアカウントは、「SystemProgram」のIDでした。

なお、TokenProgramは、こちらになります。

具体的には、こちらになります。

https://solscan.io/account/TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA?cluster=devnet

4 トークンミントの初期化

トークンミントの初期化とは、トークンの基本的な属性を設定するプロセスです。

1 メソッドについて

これは、「createInitializedMint2Instruction」メソッドを使用しています。

これは、「@solana/spl-token」からインポートしています。

2 引数について

引数は、下のように、設定しています。

①トークンミントアカウントの公開鍵
②Decimals(ブロックチェーンでよく出てくる、小数点以下の桁数)
③ミント権限の公開鍵
④フリーズ権限の公開鍵

5 PDAの抽出

1 概要

「PublicKey.findProgramAddressSync」を用いて、メタデータ用のアカウントを抽出しています。

PDA(プログラム派生アドレス)を使用しています。

なお、PDAの詳細については、こちらの記事もご参照ください。

なお、ここで使われている、「PublicKey」「@solana/web3.js」からインポートしています。

2 引数① シードについて

PDAには「シード」「プログラムID」が必要です。

今回のシードは、下の3つから構成されているようです。

①"metadata"の文字列をバイト配列に変換したもの
②METADATA_PROGRAM_IDをバイト配列に変換したもの
③mintKeypair.publicKeyをバイト配列に変換したもの

これにより、シードが一意であり、再現可能であることを保証しています。

3 引数② プログラムID

引数には、「METADATA_PROGRAM_ID」を指定しています。

これは、「@metaplex-foundation/mpl-token-metadata」からインポートした、「PROGRAM_ID」であることがわかります。

より具体的には、このようになっています。

具体的には、こちらがそのプログラムです。

https://solscan.io/account/metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s?cluster=devnet

つまり、今回はこのようになっています。

ちなみに、後ほど抽出したPDAを見てみると、所有者「Metaplex Token Metadata」になっていることも確認できます。

https://solscan.io/account/8LJz9AmsxcrMGPhXbUv82oDEdSYzAYu38Mf7GAEVVVAV?cluster=devnet


6 メタデータアカウントの設定

1 メソッドについて

メソッドは、「createCreateMetadataAccountV3Instruction」を使っています。

引数としては、大まかに2つをとっていることがわかります。

ちなみに、こちらは「@metaplex-foundation/mpl-token-metadata」からインポートしています。

2 引数① アカウントの設定

一つ目の引数群としては、アカウントの設定を行っています。

メタデータや、それに紐づけるミントアカウント権限のあるアカウントなどを下のように紐づけています。

3 引数③ メタデータ情報

メタデータの情報として、大きく、次の3つを設定しています。

大まかには、こちらの3つを設定しています。

https://metaplex-foundation.github.io/metaplex-program-library/docs/token-metadata/index.html#CreateMetadataAccountArgsV3

さらに、dataの詳細はこちらです。

https://metaplex-foundation.github.io/metaplex-program-library/docs/token-metadata/index.html#DataV2

詳細は省きますが、これらの内容は、chatGPTなどでも出てきます。

ちなみに、これらの詳細については、

この辺りで設定していました。

7 トランザクションの構築について

トランザクションの構築は「buildTransaction」を使用しています。

これは、前回までと違っていますね。

ただ、中身を見てみると、前回までと同じであることがわかります。

そのため、詳細は省きます。

8 try-catch文について

ここも前回と異なり、try-catch文を使っています。

より実務的になりましたね。

トランザクションをブロックチェーンに送り、その結果に応じて、分岐させています。

成功した場合は、publicKeyを下のように、ファイルに保存しています。

失敗した場合は、「extractSignatureFromFailedTransaction」メソッドを実行しているようです。

これによって、署名を抽出できるので、エラーを確認することができます。

「extractSignatureFromFailedTransaction」メソッドは、ヘルパー関数なので、詳細は省きます。

ただ、今回は、「fetchLogs」は引数に設定していないので、署名だけを抽出したいのだとわかります。

今回は以上です。

サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊