---
title: "Solanaのアカウントモデルとは"
description: "Solanaのアカウントモデル、アカウントの種類、それらがどのように連携するかについて解説"
---

# Solanaのアカウントモデルとは

Solana上のすべてのものはアカウントとみなすことができ、アカウントはプロトコルがブロックチェーン上のデータを「整理する」ための仕組みです。この記事では、Solana Account Modelの全体像として、その種類とカテゴリ、アカウントの構成要素、そして「rent」の概念について解説します。

## **Solanaアカウントとは何か、どのように機能するのか**

**Solanaのアカウントは、あらゆるデータ型を保持できる保管庫と考えることができます。SOLのようなトークンから、プログラムの状態変数\(整数、文字列、公開鍵など\)、さらにはプログラム自体まで保持可能です。** すべてのアカウントには所有者が指定されており、1つの所有者が複数のアカウントを所有することができます。

Account Modelはよくコンピュータのファイルシステムに例えられます:

<EmbeddedTable
  table={{
    columns: [
      { key: "1", width: 200, title: "Computer File", dataType: "object" },
      { key: "2", width: 200, title: "Solana Account", dataType: "object" },
    ],
    data: [
      {
        "1": { title: "<p>Name</p>", tooltip: "", icon: "" },
        "2": { title: "<p>lamports</p>", tooltip: "", icon: "" },
        id: 0,
      },
      {
        "1": { title: "<p>Address</p>", tooltip: "", icon: "" },
        "2": { title: "<p>owner</p>", tooltip: "", icon: "" },
        id: 1,
      },
      {
        "1": { title: "<p>Email</p>", tooltip: "", icon: "" },
        "2": { title: "<p>rent_epoch</p>", tooltip: "", icon: "" },
        id: 2,
      },
      {
        "1": { title: "<p>Experience</p>", tooltip: "", icon: "" },
        "2": { title: "<p>executable</p>", tooltip: "", icon: "" },
        id: 3,
      },
      {
        "1": { title: "<p>GeorgeBrownCV.docx</p>", tooltip: "", icon: "" },
        "2": { title: "<p>0cnjSElkwFlkffjckDSJRU432RIANCLk</p>", tooltip: "", icon: "" },
        id: 4,
      },
    ],
  }}
/>

## **Solanaアカウントの種類とは**

Solanaアカウントの種類には、実行可能\(executable\)と非実行可能\(non-executable\)の2つの主要なタイプがあります。これは、SolanaのプログラムがEthereumのスマートコントラクトのように状態を保存しないため、両方の動作を分離する必要があるからです。

### **実行可能プログラムとは**

実行可能プログラムは、他のアカウントを所有・作成して状態を保存する、不変のコードで構成されています。そのコードは**Rust**のような言語で書かれ、バイトコードの一種であるeBPFにコンパイルされます。

実行可能プログラムの最も一般的な例は、SolanaのコアであるSystem Programです。これは、人々がトークンやNFTにアクセスするために使用するアカウント\(ウォレット\)の作成を担っています。

### **非実行可能プログラムとは**

非実行可能プログラムは、プログラム変数、トークン残高、NFT、ファンジブルトークンなど、他のすべての種類のデータを含む「ストレージ」アカウントです。非実行可能アカウントを通じて、プロトコルは各トランザクション後に発生した状態の変化を反映します。

### **Ethereumのスマートコントラクトとsolanaのプログラムの違い**

スマートコントラクトには、状態変数が保存される「[storage](https://www.alchemy.com/docs/smart-contract-storage-layout)」と呼ばれる特別な区画があらかじめ組み込まれています。スマートコントラクトはその実行可能なコードを使ってこれらの状態変数を変更します。Ethereumのコントラクトは、実行可能コードと非実行可能コードが共存する統一された場所と見なすことができます。

USDCトークンを例に見てみましょう。そのコントラクトには、ユーザーのアドレスを各自のUSDC残高にマッピングする「balances」というマッピングが含まれています。USDCトークンを送受信すると、コントラクトはその実行可能コードによって自動的に変化を反映します。

Solanaはこれを異なる方法で処理します。個々のトークン保有者ごとに新しいアカウントを作成するUSDCトークンプログラムが存在します。これらのアカウントは、保有者が利用可能なUSDC残高を保存します。ユーザーがトランザクションを発行すると、USDC Tokenアカウントは、交換を行おうとするユーザーの関連トークンアカウントを検索し、その変化をそれらに反映します。

<ImageBlock
  src="https://media.alchemy.com/1703697343-solana-associated-token-account-structure.png"
  alt="各ユーザーのUSDC残高を保持するassociated token accountsを作成するSolanaのトークンプログラムの図"
  width={1600}
  height={901}
  caption="SolanaのAssociated Token Account構造"
/>

## **Solanaアカウントのカテゴリとは**

実行可能アカウントと非実行可能アカウントは、native programs、[program accounts、data accounts](https://www.alchemy.com/overviews/solana-data-vs-program-accounts)などのいくつかの追加カテゴリに分けられます。

### **実行可能なnative programsとは**

**実行可能なnative programsは[Solanaエコシステム](https://www.alchemy.com/dapps/ecosystem/solana)に「ネイティブ」に組み込まれており、バリデーターノードの維持・運用などのタスクを担っています。この種類の最もよく知られた例はSystem Program**であり、新しいシステムアカウント\(一般に「ウォレット」として知られるもの\)の作成やSOLの送金などを担当しています。Native Programsの他の例としては、ステーキングの仕組みを担う**Stake Program**や、EthereumのEVMに似た**BPF Loader**があります。

### **実行可能なprogram accountsとは**

実行可能なprogram accountsは、他のプログラムを作成し保存する、あらかじめ用意されたSolanaプログラムです。良い例として、[Solana Program Library](https://www.alchemy.com/overviews/solana-program-library)\(SPL\)が挙げられます。これは、トークンの作成・スワップ・貸付、ステークプールの生成、オンチェーンのネームサービスの維持など、多くのオンチェーン活動をサポートするプログラムの集まりです。SPLを代表するものとして、トークンの作成と管理を行う**Token Program**があります。

Solanaのusdcトークンは、Token Programによって管理される単なるTokenアカウントです。しかし、Tokenアカウントはユーザーのトークン残高を保存しません。これは3つ目の種類のアカウントである**data accounts**のメンバーによって処理されます。

### **非実行可能なdata accountsとは**

Native ProgramsとProgram accountsが実行可能とみなされるのに対し、data accountsはその逆で、特定のプログラムおよびSolanaプロトコル全体の状態変化を反映するレジストリです。

data accountsは以下に分けられます:

1. **Token accounts** - Token Programによって作成されるアカウント
1. **Associated Token Accounts \(ATA\)** - 個々のユーザーのトークン残高を保存するアカウント
1. **System Owned Accounts** - データを保存し、トランザクションの署名を可能にする

Token accountsは、それぞれの個別のファンジブルトークン\(USDC、USDTなど\)を表し、供給量、小数点以下の桁数、名称といったトークンの基本情報を含みます。それぞれ固有のTokenアカウントに対して、異なる[associated token account \(ATA\)](https://www.alchemy.com/overviews/associated-token-account)が生成されます。例えば、USDCとUSDTの両方を保有している場合、それぞれUSDCおよびUSDTのTokenアカウントによって作成された2つのATAにアクセスできます。

<ImageBlock
  src="https://media.alchemy.com/1703697445-solana-account-types-and-categories.png"
  alt="Solanaアカウントのカテゴリの図: native programs、program accounts、data accounts"
  width={1600}
  height={901}
  caption="Solanaのアカウントの種類とカテゴリ"
/>

## **Solanaアカウントの要素とは**

**各アカウントの要素はメタデータのセットであり、プロトコルがアカウントの種類や追加情報を容易に理解できるようになっています。** メタデータは以下で構成されます:

- **lamports** - アカウントのSOL残高で、lamportsで表され、1 lamportは1 SOLトークンの10億分の1に相当します
- **owner** - アカウントを所有するプログラムのアドレス
- **executable** - アカウントが実行可能コードを含むかどうかを示すブール値
- **data** - アカウントに保存される生のデータバイト配列で、ストレージ変数か実行可能コードのいずれかです
- **rent_epoch** - アカウントが次にrentを支払う必要があるepochを示します

**owner**と**holder**の違いは、ownerがアカウントを制御するプログラムであるのに対し、holderはアカウントの秘密鍵を保持するユーザーであるという点です。例えば、System Owned AccountはSolanaのNative System Programによって所有されています。

### **Solanaアカウントのrentとは**

すべてのアカウントは、ブロックチェーン上のメモリを使用するために[**rent手数料を支払います**](https://www.alchemy.com/overviews/how-to-calculate-rent-for-solana-programs)。これは、攻撃者がネットワークのメモリをすべて使用してネットワークを詰まらせることを防ぐための予防措置です。

ブロックチェーンがすべてのユーザーを満足させるためには、何らかの経済的インセンティブが必要です。これは特に、すべてのトランザクションを検証するためにハードウェアと計算能力を提供するバリデーターに当てはまります。バリデーターはすべての状態変化の作業コピーを維持する必要があり、その報酬としてrentを受け取ります。

2年分のrent手数料に相当する最低残高を維持しているアカウントは免除されます。そうでない場合、トランザクションで参照された際、または現在2日に相当する各epochごとに課金されます。アカウントがrent免除に必要な最低限のSOLを保有していない場合、そのデータはチェーンから削除されます。

## **Solanaアカウントの作成方法**

Solana上でSystem Accountを作成するというのは、ユーザーが新しい「ウォレット」を作成するたびに[**Solanaウォレット**](https://www.alchemy.com/overviews/solana-wallets)が裏側で行っていることです。ウォレットは、ED25519楕円曲線上にある64バイトのキーペアを生成することで新しいアカウントを作成します。最初の32バイトは秘密鍵で、ユーザーがトランザクションを作成して他のアカウントやプログラムと相互作用したい場合に使用されます。次の32バイトはウォレットの公開鍵です。

## **Solanaでの開発を始める**

Account Modelは、Solanaプロトコルがデータを整理するために使用するシステムです。アカウントは、生データ、コード、状態変数からトークン残高、NFTなどまで、あらゆるものを保持できる保管庫と考えることができます。アカウントには2つの主要な種類があります: 実行可能と非実行可能です。

Alchemyでの開発を始めるには、今すぐ[Solana開発者アカウントを無料で開設](https://dashboard.alchemy.com/signup/?a=solana-account-model)しましょう!
