---
title: "Solana 数据账户与程序账户对比"
description: "了解 Solana 账户模型中数据账户与程序账户的区别"
---

# Solana 数据账户与程序账户对比

Solana 是一个去中心化的区块链平台,通过独特的[账户模型](https://www.alchemy.com/overviews/solana-account-model)来编排流程,从而实现快速、安全和可扩展性。一个完整的 Solana dApp 通常由三种账户类型组成:原生账户、数据账户和程序账户。

本文重点介绍 Solana 数据账户和程序账户,以及它们在 Solana 区块链上如何协同工作,同时对比它们与 [Ethereum 智能合约](https://alchemy.com/overviews/smart-contract-security-best-practices)——Ethereum 上对应的账户概念——之间的差异。

## **什么是 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 账户与 Ethereum 智能合约**

Solana 数据账户和程序账户与 Ethereum 智能合约类似,但在存储方式、调用方式、执行模型、gas 等方面存在一些关键区别。

### **Solana 数据账户和程序账户在哪些方面与 Ethereum 智能合约不同?**

**Solana 数据账户和程序账户与 Ethereum 智能合约的区别在于数据存储方式、合约调用方式、执行模型、语言支持以及 gas。**

#### **1. 数据存储**

在 Solana 区块链上,数据账户用于存储数据;而在 Ethereum 区块链上,数据存储在智能合约内部。这意味着在 Solana 上,数据与操作数据的逻辑是分离的,而在 Ethereum 上,数据和逻辑合并在同一个智能合约中。

#### **2. 合约调用**

在 Solana 区块链上,程序账户由传入的交易、[来自其他程序的调用(即跨程序调用)](https://www.alchemy.com/overviews/cross-program-invocation)或时间的推移触发。在 Ethereum 区块链上,智能合约由传入的交易触发,也可以被其他智能合约调用。

#### **3. 执行模型**

Solana 数据账户和程序账户由 Solana 网络中的验证者执行,而 Ethereum 智能合约由各个节点上的 Ethereum Virtual Machine(EVM)执行。

#### **4. EVM gas 与数据的关联**

Solana 数据账户可以存储无限量的数据,而 Ethereum 的 [智能合约存储空间](https://www.alchemy.com/docs/smart-contract-storage-layout) 有限,受执行过程中消耗的 gas 量限制。

#### **5. 语言支持**

Solana 程序账户可以用任何能编译成 WebAssembly(WASM)的语言编写,而 Ethereum 智能合约通常用 [Solidity](https://www.alchemy.com/overviews/solidity) 或 Vyper(一种基于 Python 实现的 Solidity)编写。

### **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 区块链上通常具备的特性,例如低 gas 费用和高吞吐量。

Solana EVM 的工作原理是在 Solana 区块链上模拟 Ethereum Virtual Machine,使 Ethereum 智能合约能够在 Solana 上执行,其执行方式与在 Ethereum 区块链上的执行方式类似。这意味着开发者可以利用已有的 Solidity 编程语言知识和 [Ethereum 生态系统](https://www.alchemy.com/dapps/ecosystem/ethereum)经验,在 Solana 上发布应用。

## **借助 Alchemy 构建 Solana 账户**

一个基于 Solana 构建的去中心化应用通常由原生账户、数据账户和程序账户组成。原生账户代表 Solana 上的程序,数据账户存储信息,程序账户则在 Solana 上执行代码。如果你想开始构建,现在就在 Alchemy 上[注册一个免费的 Solana 开发者账户](https://dashboard.alchemy.com/signup/?a=cbb287cfba)!
