---
title: "SolanaのAssociated Token Accountとは?"
description: "Associated Token Accountとは何か、その仕組みと作成方法を解説"
---

# SolanaのAssociated Token Accountとは?

[Solana Account Model](https://www.alchemy.com/overviews/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](https://www.alchemy.com/overviews/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](https://www.alchemy.com/overviews/solana-data-vs-program-accounts)によって作成されるが、SPL Token ProgramによってToken mintとして初期化される
- USDCトークンが初期化された後、ユーザーは送金を開始できる
- USDCトークンを保有するユーザーは、Associated Token Account Program（ATP）を通じて作成されたAssociated Token Accountを持つ
- 2者間のUSDCのやり取りは、両ユーザーのATA間で行われる

<ImageBlock
  src="https://media.alchemy.com/1703696237-associated-token-account-on-solana.jpg"
  alt="Solana上でAssociated Token Account間を流れるUSDC送金の図"
  width={1600}
  height={901}
  caption="Solana上のAssociated Token Account"
/>

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

## **Associated Token Account Programとは**

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

Associated Token Account ProgramのソースコードはRustで書かれており、[GitHub](https://github.com/solana-labs/solana-program-library)で確認できます。

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

<ImageBlock
  src="https://media.alchemy.com/1703696380-creating-associated-account-source-code.jpg"
  alt="Solana上でAssociated Account Programを作成するソースコード"
  width={1600}
  height={1338}
  caption="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）
1. **token_program_id** - SPL Token ProgramのプログラムID
1. **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の作成には、それが「紐づく」対象のトークンがすでに存在していることが前提となります。

<ImageBlock
  src="https://media.alchemy.com/1703696504-creating-associated-token-account-on-solana.jpg"
  alt="Solana上でAssociated Token Accountを作成する"
  width={1600}
  height={749}
  caption="Solana上でAssociated Token Accountを作成する"
/>

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

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

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

### **ownerとauthorityの違いは何か**

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

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

デフォルトでは、Associated Token Accountは作成時に[**rent-exempt**](https://www.alchemy.com/overviews/how-to-calculate-rent-for-solana-programs)としてマークされる必要があるため、アカウントが保持すべき最低額は少なくとも0.00203928 SOLとなります。System ProgramはこのSOLをATAに送金し、トランザクションを開始したアカウントから差し引かれます。

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

### **Associated Token Accountの確認方法**

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

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

<ImageBlock
  src="https://media.alchemy.com/1703696658-solscan-interface.png"
  alt="ウォレットのATAを確認するためのSolscan.ioのインターフェース"
  width={1600}
  height={785}
  caption="ウォレットのATAを確認するためのSolscan.ioのインターフェース"
/>

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

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

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

## **AlchemyでSolanaアプリを構築する**

Associated Token Accountについて学ぶことは、一人前のSolana開発者になるための最初のステップの一つです。Solanaノードについて理解し、RPCプロバイダーを選定した後は、当社の使いやすい[Solana API](https://www.alchemy.com/docs/reference/solana-api-quickstart)を利用することで、最初の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を送信者のアカウントから差し引きます。
