トークンは、多様なカテゴリの資産に対する所有権を表すデジタル資産です。トークン化により、財産権のデジタル化が可能になります。Solana上のトークンは、SPL(Solana Program Library)トークンと呼ばれます。
このセクションでは、Solana上でトークンがどのように表現されるかの基本概念について説明します。コード例については、SPLトークンの基礎セクションを参照してください。
重要なポイント
-
Token Programsには、ネットワーク上のトークン(代替性トークンと非代替性トークンの両方)とやり取りするためのすべての命令ロジックが含まれています。
-
mint accountは特定のトークンを表し、総供給量やミント権限(トークンの新しい単位を作成する権限を持つアドレス)などのトークンに関するグローバルメタデータを保存します。
-
token accountは、特定の所有者の特定のmint accountに対するトークンの個別所有権を追跡します。
-
associated token accountは、所有者とmint accountのアドレスから派生したアドレスで作成されたtoken accountです。
Token Programs
Solanaエコシステムには、2つの主要なToken Programsがあります。以下は両方のプログラムのソースコードです。
Token Program(オリジナル)
- 基本的なトークン機能(ミント、転送など)
- 不変で広く使用されている
Token Extension Program(Token 2022)
- オリジナルのToken Programのすべての機能を含む
- 「拡張機能」を通じて機能を追加
Token Programsには、ネットワーク上のトークン(代替性トークンと非代替性トークンの両方)とやり取りするためのすべての命令ロジックが含まれています。Solana上のすべてのトークンは、実質的にToken Programが所有するデータアカウントです。
Token Program
mint account
Solana上のトークンは、Token Programが所有するmint accountのアドレスによって一意に識別されます。このアカウントは特定のトークンのグローバルカウンターとして機能し、以下のようなデータを保存します:
- Supply: トークンの総供給量
- Decimals: トークンの小数点精度
- Mint authority: トークンの新しい単位を作成し、供給量を増やすことが許可されたアカウント
- Freeze authority: Token Account内のトークンを凍結し、転送や焼却を防ぐことが許可されたアカウント
Mint Account
各mint accountに保存される詳細情報は以下の通りです。
pub struct Mint {/// Optional authority used to mint new tokens. The mint authority may only/// be provided during mint creation. If no mint authority is present/// then the mint has a fixed supply and no further tokens may be/// minted.pub mint_authority: COption<Pubkey>,/// Total supply of tokens.pub supply: u64,/// Number of base 10 digits to the right of the decimal place.pub decimals: u8,/// Is `true` if this structure has been initializedpub is_initialized: bool,/// Optional authority to freeze token accounts.pub freeze_authority: COption<Pubkey>,}
参考として、USDC Mint AccountへのSolana Explorerリンクを示します。
Token Account
Token Programは、各トークン単位の個別の所有権を追跡するためにtoken accountを作成します。token accountには以下のようなデータが保存されます。
- Mint: token accountが保持するトークンの単位
- Owner: token accountからトークンを転送することが許可されたアカウント
- Amount: token accountが現在保持しているトークンの数量
Token Account
各token accountに保存される詳細情報は以下の通りです。
pub struct Account {/// The mint associated with this accountpub mint: Pubkey,/// The owner of this account.pub owner: Pubkey,/// The amount of tokens this account holds.pub amount: u64,/// If `delegate` is `Some` then `delegated_amount` represents/// the amount authorized by the delegatepub delegate: COption<Pubkey>,/// The account's statepub state: AccountState,/// If is_native.is_some, this is a native token, and the value logs the/// rent-exempt reserve. An Account is required to be rent-exempt, so/// the value is used by the Processor to ensure that wrapped SOL/// accounts do not drop below this threshold.pub is_native: COption<u64>,/// The amount delegatedpub delegated_amount: u64,/// Optional authority to close the account.pub close_authority: COption<Pubkey>,}
ウォレットが保持したいトークン(mint)ごとにtoken accountが必要であり、ウォレットアドレスがtoken accountのオーナーとして設定されます。各ウォレットは同じトークン(mint)に対して複数のtoken accountを所有できますが、token accountは1つのオーナーのみを持ち、1つのトークン(mint)の単位のみを保持できます。
Account Relationship
各token accountのデータには、token
accountに対する権限を持つ者を識別するownerフィールドが含まれていることに注意してください。これは、すべてのtoken
accountに対してToken
Programである基本的なAccountタイプで指定されるプログラムオーナーとは異なります。
Associated Token Account
Associated Token Accountは、特定のミントと所有者に対するtoken accountのアドレスを見つけるプロセスを簡素化します。Associated Token Accountは、特定のミントと所有者に対する「デフォルト」のtoken accountと考えてください。
Associated Token Accountは、所有者のアドレスとmint accountのアドレスから派生したアドレスで作成されます。Associated Token Accountは、特定のアドレスを持つtoken accountに過ぎないことを理解することが重要です。
これにより、Solana開発における重要な概念であるProgram Derived Address (PDA)が導入されます。PDAは、事前定義された入力を使用してアドレスを決定論的に導出するため、アカウントのアドレスを簡単に見つけることができます。
Associated Token Account
各ウォレットは、同じミントからのトークンを保持するために、独自のtoken accountが必要であることに注意してください。
アカウント関係の拡張
Token CLIの例
spl-token
CLIは、SPLトークンを試すのに役立ちます。以下の例では、Solana Playgroundのターミナルを使用して、ローカルインストールなしでブラウザ内で直接CLIコマンドを実行します。
トークンとアカウントの作成には、アカウントのrentデポジットとトランザクション手数料のためのSOLが必要です。Solana
Playgroundを初めて使用する場合は、Playgroundウォレットを作成し、Playgroundターミナルで*shsolana airdrop*コマンドを実行してください。また、公開webファウセットからdevnet
SOLを取得することもできます。
$solana airdrop 2
*shspl-token --help*を実行すると、利用可能なすべてのコマンドが表示されます。
$spl-token --help
spl-token CLIをローカルにインストールするには、次のコマンドを実行します。
$cargo install spl-token-cli
*shspl-token*のドキュメントで、さらに多くの例を見つけることができます。
ターミナル出力に表示されるアカウントアドレスは、以下の例とは異なります。操作を進める際は、Playgroundターミナルのアドレスを使用してください。例えば、*shcreate-token*コマンドは、Playgroundウォレットをミント権限として持つmint
accountアドレスを出力します。
新しいトークンを作成する
新しいトークン(mint account)を作成するには、次のコマンドを実行します:
$spl-token create-token
出力は次のようになります:
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
新しいmint accountは供給量ゼロで開始されます。現在の供給量を確認するには:
$spl-token supply <TOKEN_ADDRESS>
新しいトークンの*shsupply*コマンドは0を返します:
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
新しいMint Accountの作成には、2つのinstructionsを含むトランザクションが必要です。以下はSolana PlaygroundでのJavascriptの例です。
-
System ProgramがMint Accountデータ用のスペースを持つ新しいアカウントを作成し、所有権をToken Programに転送します。
-
Token Programが新しいアカウントのデータをMint Accountとして初期化します
Token Accountを作成する
特定のmintのトークンを保持するには、token accountを作成します:
$spl-token create-account <TOKEN_ADDRESS>
コマンド例:
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
出力:
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1
*shcreate-account*コマンドは、ウォレットアドレスを所有者とするassociated token
accountを作成します。
異なる所有者でtoken accountを作成するには:
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
注:<TOKEN_ADDRESS>はtoken accountのmint accountを指定します。
コマンド例:
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
出力:
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt
associated token accountの作成には、Associated Token Programを呼び出す1つのinstructionが必要です。Solana PlaygroundのJavaScriptの例を参照してください。
Associated Token ProgramはCross Program Invocationsを使用して以下を実行します:
- System Programを呼び出して、提供されたPDAをアドレスとして使用して新しいアカウントを作成します
- Token Programを呼び出して、token accountデータを初期化します
associated token accountアドレスではなく新しいkeypairでtoken accountを作成するには、2つのinstructionsを含むトランザクションを送信します。Solana PlaygroundのJavaScriptの例を参照してください。
-
System Programがtoken accountデータ用のスペースを持つ新しいアカウントを作成し、所有権をToken Programに転送します。
-
Token Programがデータをtoken accountとして初期化します
トークンのミント
トークンの新しい単位を作成するには、token accountにトークンをミントします:
$spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]
コマンド例:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100
出力:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG
別のtoken accountにトークンをミントするには:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
出力:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7
Token ProgramのMintTo
instructionは新しいトークンを作成します。ミント権限者がトランザクションに署名する必要があります。このinstructionはtoken
accountにトークンをミントし、mint
accountの総供給量を増加させます。Solana PlaygroundのJavaScriptの例を参照してください。
トークンの転送
token accounts間でトークンを転送するには:
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>
コマンド例:
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
出力:
Transfer 100 tokensSender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o
Token ProgramのTransfer
instructionはトークン転送を処理します。送信者のToken
Accountの所有者がトランザクションに署名する必要があります。このinstructionはToken
Account間でトークンを移動します。Solana PlaygroundのJavaScriptの例をご覧ください。
送信者と受信者の両方が、特定のトークン(mint)用のtoken accountを必要とします。送信者は、同じトランザクション内で受信者のtoken accountを作成するinstructionsを含めることができます。
トークンメタデータの作成
Token Extensions Programを使用すると、メタデータ(名前、シンボル、画像リンク)をMint Accountに直接保存できます。
メタデータ拡張機能を持つトークンを作成するには:
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata
出力:
Creating token BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP under program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEbTo initialize metadata inside the mint, please run `spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>`, and sign with the mint authority.Address: BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczPDecimals: 9Signature: 5iQofFeXdYhMi9uTzZghcq8stAaa6CY6saUwcdnELST13eNSifiuLbvR5DnRt311frkCTUh5oecj8YEvZSB3wfai
メタデータを初期化するには:
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>
トークンURIはオフチェーンメタデータにリンクします。JSONフォーマットの例はこちらをご覧ください。
コマンド例:
spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP "TokenName" "TokenSymbol" "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"
メタデータはSolana Explorerで確認できます。
詳細については、Metadata Extension Guideをご覧ください。Token Extensionsの詳細については、Token ExtensionsのGetting Started GuideおよびSPLドキュメントをご覧ください。
Is this page helpful?