---
title: "Solanaのデータアカウントとプログラムアカウントの違い"
description: "Solanaのアカウントモデルにおけるデータアカウントとプログラムアカウントの違いを解説"
---

# Solanaのデータアカウントとプログラムアカウントの違い

Solanaは、独自の[ アカウントモデル](https://www.alchemy.com/overviews/solana-account-model)を用いてプロセスフローを制御することで、高速性、安全性、拡張性を実現するよう設計された分散型ブロックチェーンプラットフォームである。一般的にSolana dAppのレイアウトは、ネイティブアカウント、データアカウント、プログラムアカウントの3種類のアカウントで構成される。

本記事では、Solanaブロックチェーン上のデータアカウントとプログラムアカウントに焦点を当て、Ethereumにおけるアカウントの等価物である[Ethereumスマートコントラクト](https://alchemy.com/overviews/smart-contract-security-best-practices)との違いを解説する。

## **Solanaのデータアカウントとは**

**Solanaのデータアカウントとは、トークンやドキュメントなど、あらゆる種類の情報を格納するSolanaブロックチェーン上のアカウントの一種である。** データアカウントは状態を保持できるが、実行可能ではない。

データアカウントは他のブロックチェーンプラットフォームのアカウントと類似しており、残高を持ち、トランザクションの送受信が可能である。これらのアカウントは、メタデータとともに、所有者およびランタイム時に可能な相互作用の種類を識別する。ウォレット、mint、トークンアカウントはデータアカウントの好例であり、値を保持し、ユーザーおよびプログラムアカウントに属している。

## **Solanaのプログラムアカウントとは**

**プログラムアカウントは、Solanaブロックチェーン上でコードを実行するために使われるスマートコントラクトであり、通常は受信したトランザクションや時間の経過によって実行が引き起こされる。** プログラムアカウントはデータアカウントと相互作用でき、ブロックチェーンへのデータの読み書きが可能である。プログラムアカウント自体は可変の状態を保持できないが、データアカウントからこれらを呼び出す。

Solanaのデータアカウントとプログラムアカウントの主な違いの一つは、プログラムアカウントは他のプログラムアカウントによってのみ作成できるのに対し、データアカウントは任意の開発者やユーザーが作成できる点である。ただし、プログラムアカウントを使ってさらにプログラムアカウントを作成することも可能であり、これにより[Solana EVM](https://www.alchemy.com/overviews/solana-evm)上で複雑な多層のスマートコントラクトシステムを構築できる。

## **データアカウントとプログラムアカウントはどのように連携するか**

データアカウントはプログラムアカウントが使用するデータを格納するために使用でき、プログラムアカウントはデータアカウントと相互作用してこのデータを読み書きできる。データアカウントとプログラムアカウントは[Solanaブロックチェーン](https://www.alchemy.com/ecosystem/solana)上で共存・連携し、幅広いdApp機能とサービスを実現する。

例えば、プログラムアカウントを使って、ユーザーがデータアカウント間でトークンを転送できるシンプルなトークンコントラクトを作成できる。この場合、プログラムアカウントはコントラクトのロジックの実行を担い、データアカウントはトークンの残高を格納するために使用される。

以下のような例である。

この例では、"transfer_tokens.wasm"というプログラムアカウントを作成し、あるアカウントから別のアカウントへトークンを転送するロジックを含めている。次に、invokeメソッドを使ってデータアカウントとプログラムアカウントを接続し、データアカウントと転送に必要な引数を配列として渡す。

プログラムアカウントが実行されると、データアカウントに格納されたデータを使ってトークン転送が行われる。この場合、プログラムアカウントはトークンアカウントから受取アカウントへ100トークンを転送する。

上記の例で示したプログラムフローは、任意の他のプログラムや、[Solana Program Library（SPL）](https://www.alchemy.com/overviews/solana-program-library)にある既製のプログラムの一部を使って試すことができる。

## **Solanaアカウント vs. Ethereumスマートコントラクト**

Solanaのデータアカウントとプログラムアカウントは、Ethereumのスマートコントラクトと類似しているが、ストレージ、呼び出し方法、実行、ガスなど、いくつかの重要な違いがある。

### **SolanaのデータアカウントとプログラムはどのようにEthereumスマートコントラクトと異なるか**

**Solanaのデータアカウントとプログラムアカウントは、データの格納方法、コントラクトの呼び出し方、実行モデル、対応言語、ガスの点でEthereumスマートコントラクトと異なる。**

#### **1. データストレージ**

Solanaブロックチェーンでは、データアカウントがデータの格納に使用されるのに対し、Ethereumブロックチェーンでは、データはスマートコントラクト内に格納される。これは、Solanaではデータとそれに相互作用するロジックが分離されているのに対し、Ethereumではデータとロジックが1つのスマートコントラクト内に統合されていることを意味する。

#### **2. コントラクトの呼び出し**

Solanaブロックチェーンでは、プログラムアカウントは受信したトランザクション、[他のプログラムからの呼び出し（すなわちクロスプログラム呼び出し）](https://www.alchemy.com/overviews/cross-program-invocation)、または時間の経過によって実行が引き起こされる。Ethereumブロックチェーンでは、スマートコントラクトは受信したトランザクションによって実行が引き起こされ、また他のスマートコントラクトから呼び出されることもできる。

#### **3. 実行モデル**

Solanaのデータアカウントとプログラムアカウントは、Solanaネットワークのバリデーターによって実行されるのに対し、Ethereumスマートコントラクトは各ノード上のEthereum仮想マシン（EVM）によって実行される。

#### **4. EVMガスとデータの相関**

Solanaのデータアカウントは無制限のデータを格納できるのに対し、Ethereumでは実行時に消費されるガス量によって決まる[スマートコントラクトのストレージ容量](https://www.alchemy.com/docs/smart-contract-storage-layout)に制限がある。

#### **5. 対応言語**

SolanaのプログラムアカウントはWebAssembly（WASM）にコンパイル可能な任意の言語で記述できるのに対し、Ethereumスマートコントラクトは通常[Solidity](https://www.alchemy.com/overviews/solidity)またはVyper（Solidityの実装をPythonベースにしたもの）で記述される。

### **Solanaのデータアカウントとプログラムアカウントは、どのようにEthereumスマートコントラクトと類似しているか**

**Solanaのデータアカウントとプログラムアカウントは、スマートコントラクトの機能性、分散性、不変性、透明性、プログラム可能性の点でEthereumスマートコントラクトと類似している。**

#### **1. スマートコントラクトの機能性**

Solanaのアカウントと Ethereumのスマートコントラクトはいずれも、資産の転送やサプライチェーン管理の自動化など、トランザクションの促進とプロセスの自動化に使用できる。

#### **2. 分散性**

Solanaのアカウントと Ethereumのスマートコントラクトはいずれも、分散型のパブリックブロックチェーンネットワーク上にデプロイ・実行される。

#### **3. 不変性**

Solanaのデータアカウント・プログラムアカウント、またはEthereumのスマートコントラクトは、いったんブロックチェーンにデプロイされると、変更や削除ができない。

#### **4. 透明性**

Solanaのデータアカウント・プログラムアカウント、およびEthereumスマートコントラクトに格納されたコードとデータは公開されており、これにより透明性と監査可能性が確保される。

#### 5. プログラム可能性

Solanaのデータアカウント・プログラムアカウントとEthereumスマートコントラクトはプログラム可能であり、ロジックを含み、特定の条件に基づいて関数を実行できる。Solanaでは、プログラムアカウントが他のプログラムアカウントを作成できるのに対し、Ethereumでは、スマートコントラクトが他のスマートコントラクトを呼び出すことができる。

### **Neon LabsのSolana EVMは、プログラム、アカウント、スマートコントラクトをどのように扱うか**

Neon LabsのSolana EVMは、開発者がSolidity/Vyperのプログラミング言語を使って[Ethereumスマートコントラクトを構築しSolanaブロックチェーンにデプロイする](https://www.alchemy.com/overviews/solana-evm)ことを可能にするツールであり、既存のEthereum[アプリ](https://www.alchemy.com/dapps/top/defi-dapps)をSolanaに移植することを容易にする。[Neon EVM](https://www.alchemy.com/dapps/neon-evm)が[Solana devnet](https://www.alchemy.com/overviews/solana-devnet)およびメインネットにローンチされる以前は、Ethereumアプリは[Solanaエコシステム](https://www.alchemy.com/dapps/ecosystem/solana)と互換性がなかった。

Neon EVMは、スマートコントラクトがEthereumブロックチェーン上と同様に実行できるプラットフォームを提供しつつ、低いガス料金や高いスループットといった、通常Solanaブロックチェーン上でアカウントが享受する特徴を活かすことができる。

Solana EVMは、Solanaブロックチェーン上でEthereum仮想マシンをエミュレートすることによって機能し、Ethereumスマートコントラクトが、Ethereumブロックチェーン上で実行される場合と同様の方法でSolana上でも実行できるようにする。これにより、開発者は既存のSolidityプログラミング言語や[Ethereumエコシステム](https://www.alchemy.com/dapps/ecosystem/ethereum)に関する知識を活かして、Solana上にアプリを公開できる。

## **AlchemyでSolanaアカウントを構築する**

Solana上に構築される分散型アプリケーションは、通常、ネイティブアカウント、データアカウント、プログラムアカウントで構成される。ネイティブアカウントはSolana上のプログラムを表し、データアカウントは情報を格納し、プログラムアカウントはSolana上でコードを実行する。構築を始めたい場合は、Alchemyで[無料のSolana開発者アカウントを登録](https://dashboard.alchemy.com/signup/?a=cbb287cfba)しよう。
