![見出し画像](https://assets.st-note.com/production/uploads/images/134691106/rectangle_large_type_2_130072690e579d9d8b391c16dba22abf.png?width=800)
Solana Bootcamp③ メタデータ付きトークンの作成
1 実行方法について
実行方法はこちらのnoteのやり方と同じです。
こちらの「3.createTokenWithMetadata.ts」を実行するだけです。
![](https://assets.st-note.com/img/1710887063371-tpBMPeQAaw.png?width=800)
2 概要
今回の概要は、「メタデータ付きのトークンの作成」です。
![](https://assets.st-note.com/img/1710887355318-FLMJcMi0XE.png?width=800)
大きなステップとしては、
①ミントアカウントの作成
②トークンミントの初期化
③メタデータの作成
から構成されています。
3 トークンミントアカウントの作成
1 アカウントの作成
まずは、トークンの必要最低限の設定を保持するためのアカウントを作ります。
アカウントを作るときの方法は、いつも通り、「SystemProgram.createAccount」を使っています。
![](https://assets.st-note.com/img/1710887580347-c3zHKCHU3Z.png?width=800)
2 スペースの設定
アカウントに必要なスペースを設定します。
これは、トークンの内容や権限のある者、残高などを保持する必要があるためです。
![](https://assets.st-note.com/img/1710887881562-5UnnLi9xlK.png?width=800)
具体的には、「MintLayout」のスペースを確保しています。
![](https://assets.st-note.com/img/1710888160125-UuS9qhaiSX.png?width=800)
3 レント免除分のLamports
レント免除分のLamportsについては、スペースのサイズに応じて決定しています。
![](https://assets.st-note.com/img/1710888234029-qsjGguO5tK.png?width=800)
4 プログラムID
トークンアカウントのプログラムIDは、「TokenProgram」のIDになります。
前回のアカウントは、「SystemProgram」のIDでした。
![](https://assets.st-note.com/img/1710888428574-qVs9J3AXRu.png?width=800)
なお、TokenProgramは、こちらになります。
![](https://assets.st-note.com/img/1710888617039-7z981IfN0l.png?width=800)
具体的には、こちらになります。
![](https://assets.st-note.com/img/1711058865534-C7YqYNNF7I.png?width=800)
4 トークンミントの初期化
トークンミントの初期化とは、トークンの基本的な属性を設定するプロセスです。
1 メソッドについて
これは、「createInitializedMint2Instruction」メソッドを使用しています。
![](https://assets.st-note.com/img/1710889037191-Jqim9Zq6a9.png?width=800)
これは、「@solana/spl-token」からインポートしています。
![](https://assets.st-note.com/img/1710889145732-tCqHVAkhof.png?width=800)
2 引数について
引数は、下のように、設定しています。
①トークンミントアカウントの公開鍵
②Decimals(ブロックチェーンでよく出てくる、小数点以下の桁数)
③ミント権限の公開鍵
④フリーズ権限の公開鍵
![](https://assets.st-note.com/img/1710889271315-VQCkOSW9uf.png?width=800)
5 PDAの抽出
1 概要
「PublicKey.findProgramAddressSync」を用いて、メタデータ用のアカウントを抽出しています。
PDA(プログラム派生アドレス)を使用しています。
![](https://assets.st-note.com/img/1711054030540-OqrLcG4aVA.png?width=800)
なお、PDAの詳細については、こちらの記事もご参照ください。
なお、ここで使われている、「PublicKey」は「@solana/web3.js」からインポートしています。
![](https://assets.st-note.com/img/1711054148519-nUHkMo5Mao.png?width=800)
2 引数① シードについて
PDAには「シード」と「プログラムID」が必要です。
今回のシードは、下の3つから構成されているようです。
①"metadata"の文字列をバイト配列に変換したもの
②METADATA_PROGRAM_IDをバイト配列に変換したもの
③mintKeypair.publicKeyをバイト配列に変換したもの
これにより、シードが一意であり、再現可能であることを保証しています。
![](https://assets.st-note.com/img/1711054457231-9Bi1CmRp6M.png?width=800)
3 引数② プログラムID
引数には、「METADATA_PROGRAM_ID」を指定しています。
![](https://assets.st-note.com/img/1711054934490-DWzdxZMt4J.png?width=800)
これは、「@metaplex-foundation/mpl-token-metadata」からインポートした、「PROGRAM_ID」であることがわかります。
![](https://assets.st-note.com/img/1711055043506-gDDspBgEBd.png?width=800)
より具体的には、このようになっています。
![](https://assets.st-note.com/img/1711055180163-sjFi8KBTLP.png?width=800)
具体的には、こちらがそのプログラムです。
![](https://assets.st-note.com/img/1711055260504-cZ7n6oJJsX.png?width=800)
つまり、今回はこのようになっています。
![](https://assets.st-note.com/img/1711055466584-sR30PzE0Fm.png?width=800)
ちなみに、後ほど抽出したPDAを見てみると、所有者が「Metaplex Token Metadata」になっていることも確認できます。
![](https://assets.st-note.com/img/1711055655986-n3NZiTntQI.png?width=800)
6 メタデータアカウントの設定
1 メソッドについて
メソッドは、「createCreateMetadataAccountV3Instruction」を使っています。
![](https://assets.st-note.com/img/1711053513038-GiqIjphyOL.png?width=800)
引数としては、大まかに2つをとっていることがわかります。
![](https://assets.st-note.com/img/1711053712568-rBjglmkbzY.png?width=800)
ちなみに、こちらは「@metaplex-foundation/mpl-token-metadata」からインポートしています。
![](https://assets.st-note.com/img/1711053541319-RHqaBtxmm4.png?width=800)
2 引数① アカウントの設定
一つ目の引数群としては、アカウントの設定を行っています。
メタデータや、それに紐づけるミントアカウント、権限のあるアカウントなどを下のように紐づけています。
![](https://assets.st-note.com/img/1711055875083-SYJK1rEhhm.png?width=800)
3 引数③ メタデータ情報
メタデータの情報として、大きく、次の3つを設定しています。
![](https://assets.st-note.com/img/1711056056000-htWnlcTfIQ.png?width=800)
大まかには、こちらの3つを設定しています。
![](https://assets.st-note.com/img/1711056206083-1MV1YWYxRS.png?width=800)
さらに、dataの詳細はこちらです。
![](https://assets.st-note.com/img/1711056806487-vyaKeORdoE.png?width=800)
詳細は省きますが、これらの内容は、chatGPTなどでも出てきます。
ちなみに、これらの詳細については、
![](https://assets.st-note.com/img/1711056934674-4LIqExtAYU.png?width=800)
この辺りで設定していました。
![](https://assets.st-note.com/img/1711056995729-WMZtqRZxUy.png?width=800)
7 トランザクションの構築について
トランザクションの構築は「buildTransaction」を使用しています。
これは、前回までと違っていますね。
![](https://assets.st-note.com/img/1711057126679-fXwRbJxesO.png?width=800)
ただ、中身を見てみると、前回までと同じであることがわかります。
そのため、詳細は省きます。
![](https://assets.st-note.com/img/1711057256692-X3dwwXLjIE.png?width=800)
8 try-catch文について
ここも前回と異なり、try-catch文を使っています。
より実務的になりましたね。
トランザクションをブロックチェーンに送り、その結果に応じて、分岐させています。
![](https://assets.st-note.com/img/1711057541531-6FItG0VLRe.png?width=800)
成功した場合は、publicKeyを下のように、ファイルに保存しています。
![](https://assets.st-note.com/img/1711057775109-h1eFW7KxdR.png?width=800)
失敗した場合は、「extractSignatureFromFailedTransaction」メソッドを実行しているようです。
これによって、署名を抽出できるので、エラーを確認することができます。
![](https://assets.st-note.com/img/1711058049536-YWGZDdSPxI.png?width=800)
「extractSignatureFromFailedTransaction」メソッドは、ヘルパー関数なので、詳細は省きます。
ただ、今回は、「fetchLogs」は引数に設定していないので、署名だけを抽出したいのだとわかります。
![](https://assets.st-note.com/img/1711058130501-HZZYJtbpk6.png?width=800)
今回は以上です。
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊