Solana Web3

Solana トークンを作ってみよう

[Solana Developer Bootcamp 2024] https://www.youtube.com/watch?v=amAq-WHAFs8 で紹介されていた

「Project 5: Creating a Token」をやってみたいと思います。

トークンとは?

これまでSolanaで取引手数料の支払いなどに使っているSOLは、Solana上に組み込まれたネイティブトークンです。

しかし、トランプコインのようなさまざまなトークンを目にしたことがあるかもしれません。

Solanaでは、これらのトークンを「SPLトークン」と呼びます(SOL以外のすべてのトークンがこれに該当します)。

SPLは「Solana Program Library」の略で、トークンを作成したり転送したりするためのプログラムを含む一連のスマートコントラクトを指します。

なお、「SPLトークン」という言葉は少し長いため、以降は単に「トークン」と呼びます。

トークンはSOL以外のさまざまなものを表現するために使われます。たとえば:

  • USDCのようなステーブルコイン
  • NFT
  • 株式
  • 商品
  • 犬トークン

USDCとは?

USドルのような法定通貨に価値が連動しているトークン

などが挙げられます。

これらのトークンは「トークンミント」と呼ばれる仕組みで生成されます。

トークンミントとは、特定のトークンを作り出す工場のようなものだと思ってください。

その工場(トークンミント)は、「ミント権限者」と呼ばれる人物によって運営されています。

ミント権限者は、新しいトークンを発行するすべての取引に署名する必要があります。

トークンプログラムを使って独自のミントを作成する際には、自分自身をミント権限者として設定することになります。

ミント権限者は、新しく作成するSPLトークンを任意のアドレス(自分自身のアドレスを含む)に発行することができます。

アカウントがトークンを受け取る際、通常のアカウントはSOLしか保管できないため、それらのトークンを保管するための専用のATA(Associated Token Account)アカウントが必要になるため作成します。

ATA(Associated Token Account)は、ウォレットアドレス, トークンミントアドレスなどを元に生成されたPDA(プログラム派生アドレス: Program Derived Address)です。

例えば、太郎くんのUSDCトークンアカウントは、彼女のウォレットアドレスとUSDCミントアドレスを基にしたPDAを調べることで、いつでも見つけることができます。

トークンを作る

トークンを作るためにはコマンドラインツールを利用します。

また、「Token Extensions」と呼ばれる新しいトークンプログラムを使用します。これにより、便利な機能をトークンに追加することができます。

その中の一つがメタデータ機能で、これを使うと例えば名前や説明などのトークンの情報(メタデータ)を、トークンの中に直接含めることができます。

必要なツール

https://solana.com/ja/docs/intro/installation

こちらの手順を行ってください。

手順が完了したら、今回使うツールがインストールできているか確認しましょう。

Solana CLI

solana --version
出力結果
solana-cli 2.0.22 (src:faea52f3; feat:607245837, client:Agave)

ディレクトリを作成

mkdir new-token
cd new-token

ポイント

好きな名前でいいです。

ミント権限者を作成

ミント権限者でない場合、トークンを発行することはできないため、ミント権限用のキーペア(ウォレット)を作成します。

solana-keygen grind --starts-with bos:1
出力結果
Searching with 14 threads for:
        1 pubkey that starts with 'bos' and ends with ''
Searched 1000000 keypairs in 0s. 0 matches found.
Searched 2000000 keypairs in 1s. 0 matches found.
Wrote keypair to .json

これでミント権限用のキーペアが作成されました。

bos6y21waDwbvyzvCPW8B2xwFThmorDVktWqQ4N4qjT.jsonというファイルが作成されています。

ファイル名に当たる`bos6y21waDwbvyzvCPW8B2xwFThmorDVktWqQ4N4qjT`が公開鍵でファイル内容が秘密鍵になります。

注意

このファイル内容の秘密鍵を知られると権限を奪われることになり、あなたが作成したトークンを不正には発行されてしまうため、大事に保管してください。

Solanaにその鍵ペアを使用してすべてのトランザクションに署名させるように設定しましょう。

solana config set --keypair /path/to/bosXXX.json

/path/to/bosXXX.jsonの部分は上記の内容で置き換えてください。

出力結果
Config File: /Users/uedive/.config/solana/cli/config.yml
RPC URL: https://api.devnet.solana.com 
WebSocket URL: wss://api.devnet.solana.com/ (computed)
Keypair Path: bos6y21waDwbvyzvCPW8B2xwFThmorDVktWqQ4N4qjT.json 
Commitment: confirmed 

これからトークンをdevnetという開発環境で作っていくため、以下のコマンドを実行してください。

solana config set --url devnet
出力結果
Config File: /Users/uedive/.config/solana/cli/config.yml
RPC URL: https://api.devnet.solana.com 
WebSocket URL: wss://api.devnet.solana.com/ (computed)
Keypair Path: bos6y21waDwbvyzvCPW8B2xwFThmorDVktWqQ4N4qjT.json 
Commitment: confirmed 


ミント権限者のアカウントを作成しましたが、このアカウントはブロックチェーン上にデータを書き込んだりアカウント作成を作成するのに必要なSOLが必要です。

devnetでは開発用にSOLを手に入れる方法があります。

以下のサイトにアクセスしてください。

https://faucet.solana.com

以下の3点を設定し、Confirm Airdropを押してください。

SOLが手に入ったかどうか以下のコマンドで確認します。

solana balance
出力結果
1 SOL

ポイント

このSOLはdevnet専用であり、実際には全く価値がないものになります。

実際にトークンを作成したい場合はこのウォレットにSOLを送金してくる必要があります。

ここまでをまとめると、新しく作成する独自トークンのミント権限者を作成し、トークン作成に使うためのSOLを1SOL送っています。

トークンミントの作成

トークンミントとは、特定のトークンを作り出す工場や造幣局のようなものであると説明しました。

今、このトークンミントの権限者を作成したのでトークンミントを作成していきます。

このアドレスがトークンミントアドレスであることをわかりやすくするために、トークンミントにはmntで始まる特別なアドレスを設定します。

solana-keygen grind --starts-with mnt:1
出力結果
Searching with 14 threads for:
        1 pubkey that starts with 'mnt' and ends with ''
Wrote keypair to mntRiDwjhWvaVoJnaWsejLTeqbApWUfT21bZxkTgC9D.json

このアドレス(mntRiDwjhWvaVoJnaWsejLTeqbApWUfT21bZxkTgC9D)がトークンミントを配置するためのアドレスになります。

造幣局を建てる土地のようなものでしょうか。

ではこのアドレスにトークンミントを配置します。

spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata mntRiDwjhWvaVoJnaWsejLTeqbApWUfT21bZxkTgC9D.json

ポイント

最後のトークンミントアドレスは自分のものを指定してください。

出力結果
Creating token mntRiDwjhWvaVoJnaWsejLTeqbApWUfT21bZxkTgC9D under program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
To initialize metadata inside the mint, please run `spl-token initialize-metadata mntRiDwjhWvaVoJnaWsejLTeqbApWUfT21bZxkTgC9D <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>`, and sign with the mint authority.

Address:  mntRiDwjhWvaVoJnaWsejLTeqbApWUfT21bZxkTgC9D
Decimals:  9

Signature: 5WuaAVkXLhcoTEf3F5CphFC7W1cwvza9fmYh4eVYA85xX1SKK7pGYLz9KNu1oXRCrF9wBYQUDqxQsWSKqZA3T4NJ

これで新しいトークンがSolana上に作成されました。

ポイント

Decimals: 9

これはトークンの最小単位を示しています。(小数点9桁)
これまでにSOLを扱ったことがある人は1SOLを送るために10億lamportを送っていたと思います。
新しく作成するトークンでも同じことをするために設定されます。

これはブロックチェーン特有のものではなく、金融プログラミング全般における慣習です。

現実世界で誰かに2.50ドルを送るとき、実際には250セントを送っているのと同じです。

日本ではこの概念がないため少しわかりづらいですが、そういうものだと思ってください。

コンピューターがバイナリ(0, 1)で処理されるため小数をうまく処理できないことからこのような対応があるようです。

Solana Explorerというトランザクションなどを監視できるサイトでこのトークンミントが実際に作成されていることを確認します。

https://explorer.solana.com/?cluster=devnet

UnknownTokenが発行されています。

また、Token-2022 Mintとなっていますが、これがトークンの拡張機能を使っていることを表しています。(最新バージョンのトークンと思って貰えばいいです。)

Current Supply: トークンをミント(生成)していないため0です。

これはまだメタデータを設定していないため名無しの状態になっていて不完全な状態です。

これを修正するためにメタデータを追加します。

メタデータの設定

メタデータの設定のためには、トークンの画像ファイルとJSONファイルをインターネット上の公開されている場所にアップロードする必要があります。

メインネット用の本格的なプロダクショントークンを作成する場合、ArweaveやIPFSのような分散型ストレージサービスを使用することを検討するでしょう。

それは基本的にブロックチェーンのようなもので、JSONファイルや画像などのデータを保存するための仕組みです。

一方で、Solanaは従来のブロックチェーンのように、トランザクションを処理するためのブロックチェーンです。

これらの分散型ストレージサービスは、誰にも所有されておらず、攻撃にも強いため、データを非常に長期間オンラインで保存するように設計されています。

ただ今回はテストトークンなのでGitHubを使います。

ここで重要なのは、HTML形式などになっていない状態である必要があります。リンクが画像ファイルやJSONファイルを直接開けるようになっている必要があるということです。

そのリンクをウェブブラウザで開いたときに、画像の場合は画像ファイルが表示され、JSONの場合はJSONデータが表示されることを確認してください。

GitHubで画像をアップロード

githubで任意のPublicリポジトリを作成します。作成後uploading an existing file.から適当な画像を保存します。

次のような画像を作成しました。

この画像を右クリックして画像アドレスをコピーしてください。これが直接開くためのリンクになります。

metadata.jsonを作成

これがメタデータになります。

上記で取得した画像のパスを含めて以下のようなファイルを用意してください。

metadata.json
{
  "name": "Example My Token",
  "symbol": "EXMY",
  "description": "Example token description.",
  "image": "https://raw.githubusercontent.com/uedive/ExampleToken/refs/heads/main/EXAMPLE%20MY%20TOKEN.png",
}

メタデータをトークンに設定する

spl-token initialize-metadata mntRiDwjhWvaVoJnaWsejLTeqbApWUfT21bZxkTgC9D 'Example My Token' 'EXMY' https://raw.githubusercontent.com/uedive/ExampleToken/refs/heads/main/EXAMPLE%20MY%20TOKEN.png
出力結果
Signature: UVRgYrCydFdbWTFLyGHSaM7PFxryeMWtpLmG9s8wmagEBEF4JoFaKtURUeSAF8jMQEhuHW7HMChNDLJZmwEB19P

以下の例のように自分が設定した情報が登録されていれば成功です。

このトークンミントを使用してトークンを発行(ミント)できるようになりました。

トークンをミントする

ミント権限者とトークンミントが作成できたので任意のアカウントにトークンをミントすることができます。

トークンを保存するためには、ミント権限者の個人アカウントにトークンアカウントが必要になります。

トークンアカウントを作成

上記でも少し説明していますが、トークンを保持するには自分のアカウントとトークンミントアドレスを元に作成したPDA(プログラム派生アドレス)であるAssociated Token Accountが必要になります。

以下のコマンドで作成します。

spl-token create-account  mntRiDwjhWvaVoJnaWsejLTeqbApWUfT21bZxkTgC9D
出力結果
Creating account AJj4kbc3ehoRizJwkkrwasLyQH5GYrCAhc4dnfZWzY79

Signature: 3UzZYm1aNCqz3gi6JXVx9MmWBBgjKD9LnGVAdnuJF17fE1zc71jeA4NeCMavL3WMNBA3pM77M41NLMvLa7XYahaS

ミント

1000トークンを発行するには以下のコマンドを利用します。

spl-token mint mntRiDwjhWvaVoJnaWsejLTeqbApWUfT21bZxkTgC9D 1000
出力結果
Minting 1000 tokens
  Token: mntRiDwjhWvaVoJnaWsejLTeqbApWUfT21bZxkTgC9D
  Recipient: AJj4kbc3ehoRizJwkkrwasLyQH5GYrCAhc4dnfZWzY79

Signature: jDdXBJfmSTg6g6wqAfGzwUkte42Rzo99UA797rn1CCftiHX5PyjPkxp7KcJzoy93pqpog85wggHLtAw2FAVUfTq

Solana Explorerでミントアカウントを確認してみるとCurrent Supply1000になっています。このトークンが全部で1000発行されているという意味になり、今流通しているトークンの総量がわかります。

次に自分のアカウントを確認してみます。

上記で作成したbosで始まるアドレスがこれに当たります。

今回作成したトークンを1000持っていることがわかります。

また、Balance(SOL)を確認してください。今は0.99443876になっています。

最初に1SOL入手したので全部で0.005SOL程度(175円くらい)使われています。

これらのトークンを転送したり、バーン(焼却)したり、委任したりと、Solanaトークンで通常行うすべての操作が可能です。

-Solana, Web3
-,