在传统的区块链系统中,用户通常会考虑“钱包”和“智能合约”。然而,在 Solana 上,几乎所有内容都围绕 账户 进行。程序、代币、NFT、用户余额,甚至可执行代码都存储在不同的账户类型中。
理解 Solana 的账户架构对于在该网络上进行开发的开发者至关重要。与以太坊的合约存储模型相比,Solana 的账户系统更加明确、模块化,并且优化了高性能并行执行。
本文将解释 Solana 的主要账户类型、它们的内部工作原理,以及它们为何对 Solana 的可扩展性至关重要。
什么是Solana中的账户?
Solana账户本质上是一个存储容器,包含:
- SOL余额
- 程序状态数据
- 可执行代码
- 代币所有权信息
- 元数据
每个链上数据片段都存在于一个账户中。
与以太坊不同,在以太坊中智能合约直接持有内部存储,Solana将数据存储与可执行程序分开。这种分离是Solana能够并行处理交易的原因之一。
每个账户包含:
字段描述:Lamports SOL余额,拥有者,控制该账户的程序,数据,任意二进制数据,是否可执行的标志。
codeRent EpochRent 收款追踪
为什么 Solana 使用账户Solana 的运行时经过优化,以实现速度和并发。
在交易执行之前,Solana 要求交易明确声明将读取或修改哪些账户。这使得运行时可以判断交易是否可以并行运行而不会发生冲突。
其优点包括:
- 大规模并行执行
- 可预测的状态访问
- 减少运行时模糊性
- 更高的吞吐量
- 更好的可扩展性
这种设计从根本上不同于以太坊的全局共享状态模型。
有几种重要账户类别开发者应该了解。
系统账户是 Solana 上最基本的账户类型。
它们通常是由密钥对控制并由系统程序拥有的钱包账户。
系统账户可以:
- 持有 SOL
- 发送交易
- 支付费用
- 创建新账户
新生成的钱包地址通常是系统账户。
示例:
const accountInfo = await connection.getAccountInfo(publicKey);
如果所有者是系统程序,则很可能是标准钱包账户。
程序账户包含
可执行的智能合约代码。
这些账户标记为:
executable = true
与以太坊合约不同,Solana 程序通常是无状态的。它们不直接在内部存储用户数据。而是操作单独的数据账户,这些账户被传递到指令中。
特征:
属性值存储 可执行代码 是
存储可变状态 通常否
可升级 可选
可执行 真
程序作为链上的账户进行部署。
常见示例包括:
- 代币程序
- 关联代币程序
- Metaplex 程序
- Jupiter 程序
数据账户存储程序状态。
程序在执行期间读取和修改这些账户。
示例:
- AMM 流动性池状态
- NFT 元数据
- 用户质押信息
- 订单簿
- DAO 治理状态
数据账户通常由程序拥有:
owner = ProgramID
拥有该程序有权限修改账户数据。
这种架构在以下方面创建了干净的分离:
- 逻辑 → 程序账户
- 状态 → 数据账户
代币账户是 SPL 代币程序使用的专用账户。
与以太坊 ERC-20 余额不同,代币余额不会直接存储
钱包内部。相反,每个代币余额存在于一个单独的代币账户中。
代币账户存储:
字段描述铸造代币属于哪个代币所有者钱包所有者金额代币余额
例如:
- USDC 余额
- BONK 余额
- Wrapped SOL 余额
所有这些都存在于独立的代币账户中。
关联代币账户是从以下内容派生的标准化代币账户:
钱包地址 + 代币铸造
这确保用户对每个 SPL 代币都有一个可预测的代币账户地址。
好处:
- 更容易的钱包集成
- 标准化代币
- 处理
- 简化用户体验
大多数钱包在接收代币时会自动创建 ATA(代币账户)。
铸币账户定义了代币本身。
它们存储代币级别的配置,例如:
字段描述供应总量小数精度铸币权限谁可以铸币冻结权限谁可以冻结
例如,USDC 的铸币账户定义了:
- Solana 上的总 USDC 供应量
- 小数精度
- 铸币权限
所有引用该铸币的代币账户共享相同的代币定义。
PDA 是由程序生成的确定性账户。
它们没有
私钥。
相反,它们完全由程序逻辑控制。
在 Solana 开发中,PDA(程序派生地址)非常重要,因为它们允许程序安全地管理状态。
示例用例:
- 用户金库
- 信托账户
- 流动性池
- NFT 元数据
- 质押记录
PDA 的生成方式:
PublicKey.findProgramAddressSync()
优点:
- 确定性地址
- 无私钥管理
- 安全的程序所有权
- 可预测的状态结构
Sysvar 账户存储网络级别的运行时信息。
这些是内置的
只读账户由Solana运行时提供。
示例包括:
SysvarPurposeClock 当前时间戳和槽位
Rent 租赁参数
EpochSchedule 纪元信息
RecentBlockhashes 最近的区块哈希
程序使用sysvars来访问区块链上下文。
示例:
- 检查当前槽位
- 计算质押奖励
- 时间锁验证
在Solana上,存储数据消耗区块链资源。
账户必须保持最低的SOL余额,称为:
免租赁余额
如果余额太低,账户可能最终会被删除。
较大的账户需要更多的SOL来维持。
保持免租。
示例:
账户类型典型大小钱包账户小型代币账户约165字节NFT元数据较大AMM池状态更大
租金鼓励网络中高效存储使用。
Solana使用可执行标志区分账户。
类型可执行钱包账户否代币账户否PDA否程序账户是
只有可执行账户可以处理指令。
每个账户都有一个所有者。
所有者决定哪个程序可以修改账户数据。
示例:
账户所有者钱包账户系统程序代币账户SPL代币程序NFT
元数据Metaplex程序
程序不能随意修改它们不拥有的账户。
这创建了强大的安全边界。
架构差异显著。
特性Solana以太坊状态存储独立账户内部合约存储并行执行是有限的显式账户访问需要不需要代币余额独立代币账户存储在合约中无状态程序常见罕见
Solana的模型最初更复杂,但能够支持更高的吞吐量。
简单的USDC转账可能涉及:
- 发送者钱包
这种明确的结构使得 Solana 能够高效、安全地处理交易。
账户架构是 Solana 最重要的创新之一。
它使得:
- 并行交易执行
- 高 TPS
- 可预测的运行时行为
- 模块化程序设计
- 高效的状态管理
对于开发者来说,理解账户是:
- 编写程序
- 调试
- 交易
- 管理状态
- 优化性能
- 构建可扩展的去中心化应用(dApps)