コンテンツへスキップ
0%

SolanaのAssociated Token Accountとは?

Petar Todorov headshot

執筆者 Petar Todorov

2023年1月26日 公開読了時間 2 分

Solana Account Modelは、すべてのオンチェーンデータを整理・保存する仕組みであり、Associated Token Account(ATA)はそのモデルを構成する重要な要素の一つです。本記事では、ATAとは何か、その仕組み、そして自分でAssociated Token Accountを作成する方法について解説します。

Associated Token Accountとは

Associated Token AccountはSolana Associated Token Account Programを通じて作成され、特定のトークン、その残高、そして所有者に関する情報を保持します。 これはProgram Derived Addressの一種です。

各用語の意味は以下の通りです。

  • Associated Token Account - トークンに紐づいたアカウント(Solana Token Programを想起してください)
  • Program Derived Address - Solanaのプログラム、具体的にはAssociated Token Account Programから「派生(derive)」して作られたアドレス

Associated Token Accountと、それらの間の送金はどのように機能するか

Associated Token Account間の送金は、アカウント同士で直接行われると同時に、それらのウォレットアドレスを介して間接的にも行われます。

トークンアカウントはEthereumにおけるERC-20トークンに相当しますが、根本的な違いがあります。Ethereumのスマートコントラクトはそれ自体の状態とコードを所有しますが、Solanaのトークンアカウントはコードのみを保持し、その状態(トークン残高など)はそのトークンの各所有者ごとに作成されるAssociated Token Accountに「エクスポート」されます。

ここまでの内容を、USDCを例に簡単に確認してみましょう。

  • Solana上のUSDCはトークンアカウントである
  • トークンアカウントはSystem Programによって作成されるが、SPL Token ProgramによってToken mintとして初期化される
  • USDCトークンが初期化された後、ユーザーは送金を開始できる
  • USDCトークンを保有するユーザーは、Associated Token Account Program(ATP)を通じて作成されたAssociated Token Accountを持つ
  • 2者間のUSDCのやり取りは、両ユーザーのATA間で行われる
Solana上でAssociated Token Account間を流れるUSDC送金の図
Solana上のAssociated Token Account

USDCの送金は、ユーザーのATA間で直接行われると同時に、Solanaノード上のウォレットアドレスを介して間接的にも行われます。これらの送金は、同じToken mintのシードでATAが作成されているユーザー同士でなければなりません。

Associated Token Account Programとは

Solana Program Libraryの一部であるAssociated Token Account Programは、すべてのATAの親プログラムであり、ユーザーのウォレットと、そのユーザーが権限を持つATAとをマッピングします。さらに、ATA Programは、あるユーザーが別のユーザーにトークンを送りたい場合、受取人がそのトークンに対応するATAを持っていなくても、確実にトークンを受け取れるようにします。この場合、スマートコントラクトがRPCノード上で実行される際に、プログラムが自動的にATAアカウントを作成します。

Associated Token Account ProgramのソースコードはRustで書かれており、GitHubで確認できます。

以下は、TypeScriptにおいてATAが内部でどのように作成されるかを示したものです。

Solana上でAssociated Account Programを作成するソースコード
Solana上でAssociated Account Programを作成するソースコード

Associated Token Account Programはどのように動作するか

ATA Programの内部で行われている処理は以下の通りです。

1. 定数のIDを取得する

まず、`TOKEN_PROGRAM_ID` と `SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID` の定数を取得します。プログラムIDとは、そのプログラムのアドレスを指す言い方です。

2. findAssociatedTokenAddress関数を取得する

次に、`findAssociatedTokenAddress` 関数に進みます。この関数はpublicKeyを返し、これが新しく作成されるATAのアドレスとなります。

3. findProgramAddressメソッドを呼び出す

この関数の本体では、`findProgramAddress` メソッドが呼び出され、以下の2つの引数が渡されます。

  • シードの配列
  • SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID

ATAはProgram Derived Address(PDA)の一形態であるため、プログラムに引数を渡すことでアカウントを作成できます。PDAの作成にはシードを引数として渡すことが含まれ、この場合、それらは以下の通りです。

  1. wallet_address - ATA内の資金を所有するアカウントのアドレス(authority)
  2. token_program_id - SPL Token ProgramのプログラムID
  3. token_mint_address - ATAに保存されるToken accountのアドレス

Associated Token Account ProgramのIDはSPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_IDです。

Associated Token Accountの作成方法

Associated Token Accountの作成は、Solana上でspl-token-cliを使ってcreate-tokenを呼び出すだけです。ATAの作成には、それが「紐づく」対象のトークンがすでに存在していることが前提となります。

Solana上でAssociated Token Accountを作成する
Solana上でAssociated Token Accountを作成する

このコードは `create-account` コマンドを呼び出し、これは `<TOKEN_MINT_ADDRESS>` を引数として受け取ります。

Associated Token Accountを作成するには、以下の4つのステップに従う必要があります。

  1. SOLの送金 - System ProgramがATAを初期化し、rent-exemptにする
  2. 空き領域の確保 - System ProgramがATAに空き領域を割り当てる
  3. 所有権の移転 - System Programがアカウントの所有権をSPL Associated Token Account Programに移転する
  4. アカウントの初期化 - このプロセスはアカウントの初期化をまとめ、トークンアドレス、新しく作成されたATAアドレス、そしてその所有者を設定する

ownerとauthorityの違いは何か

ownerとは、ATAを制御するSolanaプログラムの種類であり、一方authorityとは、owner programにトランザクションを送信し、authorityに代わってATA内のデータを変更させるアカウント(ウォレット)です。

Associated Token Accountのコストはいくらか

デフォルトでは、Associated Token Accountは作成時にrent-exemptとしてマークされる必要があるため、アカウントが保持すべき最低額は少なくとも0.00203928 SOLとなります。System ProgramはこのSOLをATAに送金し、トランザクションを開始したアカウントから差し引かれます。

この初期手数料以外は、それ以降のやり取りにかかるコストはSolana上の通常のトランザクションと変わりません。

Associated Token Accountの確認方法

Associated Token AccountはPhantomのようなクライアントを通じて確認できます。これらは、ユーザーのウォレットが権限を持つすべてのATAを自動的に導出します。 また、ブロックチェーンは公開されているため、Solscan.ioのようなエクスプローラーを使ってこの情報にアクセスすることもできます。

確認したいウォレットのアドレスを貼り付けると、そのATAがToken Accountsの下に表示されます。

ウォレットのATAを確認するためのSolscan.ioのインターフェース
ウォレットのATAを確認するためのSolscan.ioのインターフェース

既存のアカウントにAssociated Token Accountを紐づけることはできるか

Associated Token Accountを既存のアカウントに紐づける処理は、デフォルトで裏側で行われています。ATAが作成される仕組み上、 プログラムやクライアントは、あらゆるアカウントのシードを簡単に見ることができます。 これらは以下への「リンク」とみなすことができます。

  • そのATAに対する権限を持つウォレット
  • Token accountのアドレス(つまり、そのATAが保持するトークンの種類)

AlchemyでSolanaアプリを構築する

Associated Token Accountについて学ぶことは、一人前のSolana開発者になるための最初のステップの一つです。Solanaノードについて理解し、RPCプロバイダーを選定した後は、当社の使いやすいSolana APIを利用することで、最初のdAppの構築をスムーズに始められます。

よくある質問

Solanaにおけるassociated token account(ATA)とは何か

Associated Token AccountはSolana Associated Token Account Programを通じて作成され、特定のトークン、その残高、所有者に関する情報を保持します。これはProgram Derived Addressの一種であり、ユーザーのウォレットを特定のトークンにマッピングします。

ATAは通常のトークンアカウントとどう違うか

Solana上のトークンアカウントはコードのみを含み、その状態はそのトークンの各所有者ごとに作成されるAssociated Token Accountに「エクスポート」されます。ATAはウォレットと特定のToken mintの両方に紐づいた、決定論的に導出されるアドレスです。

Associated Token Account Programとは何か

Associated Token Account ProgramはSolana Program Libraryの一部であり、ユーザーのウォレットを、そのユーザーが権限を持つATAにマッピングします。ユーザーが、あるトークンに対応するATAを持っていない受取人にトークンを送った場合、自動的にATAアカウントを作成します。

Associated Token Accountを作成するのにいくらかかるか

ATAは作成時にrent-exemptである必要があり、最低0.00203928 SOLの残高が求められます。この金額はトランザクションを開始したアカウントから送金され、継続的なrentの要件をカバーします。

ATAアドレスの導出に使われるシードは何か

ATAアドレスは3つのシード、すなわちウォレットアドレス(authority)、トークンプログラムID、Token mintアドレスを使って導出されます。これらはAssociated Token Account Programに渡され、決定論的なアドレスが作成されます。

Associated Token Accountはどうやって作成するのか

spl-token-cliを使い、`create-account` コマンドをToken mintアドレスを引数として呼び出すことでATAを作成できます。このプロセスには、SOLの送金、空き領域の作成、所有権の移転、アカウントの初期化が含まれます。

自分のAssociated Token Accountはどうやって確認するのか

Phantomなどのウォレットを使えば、自分のウォレットが権限を持つすべてのATAを自動的に確認できます。あるいは、Solscan.ioなどのブロックチェーンエクスプローラーでウォレットアドレスを検索し、Token Accountsのセクションを見ることでも確認できます。

ATAを持たない相手にトークンを送るとどうなるか

Associated Token Account Programは、送金の際に受取人のATAが存在しなければ自動的に作成し、その新しいATAの資金となるrent-exempt分のSOLを送信者のアカウントから差し引きます。

Background gradient

ブロックチェーンで魔法を生み出す

Alchemyは、最も強力なweb3開発者向けプロダクトとツールを、豊富なリソース、コミュニティ、そして卓越したサポートと組み合わせて提供します。