type
Post
status
Published
date
Dec 28, 2024
slug
solana-servey
summary
Solana 链调研
tags
开发
区块链
Solana
智能合约
category
程序人生
icon
password
参考文档
Solana CLI
安装 Solana CLI
安装 Rest
安装完成之后,执行
rustc —version 校验是否安装成功安装 Solana CLI
安装完成之后,执行
solana -version 校验是否安装成功Solana CLI 配置
查看配置
返回结果
修改配置
或者
Solana CLI 操作
Create Wallet
返回结果
查看地址
返回结果
Airdrop SOL
只有 devnet 和 localhost 才能使用 airdrop 获取 sol。
或者可以直接在 faucet 上领取:https://faucet.solana.com/
查看余额
Solana 账户模型
在 Solana 上,所有数据都存储在所谓的“帐户”中。 Solana 上的数据组织方式类似 于键值存储,其中数据 库中的每个条目称为“帐户(Account)”。

要点
- 账户最多可存储10MB 数据,这些数据可以由可执行的程序代码或程序状态组成。
- 账户需要以 SOL 形式存入租金,与存储数据的数量成比例,当账户关闭时,该金额可以全额退款。
- 每个帐户都有一个程序“所有者”。 只有拥有帐户的程序可以修改其数据或扣除其lamport 余额。 然而,任何人都可以增加的余额。
- 程序 (智能合约) 是无状态账户,用于存储可执行代码。
- 数据账户是由程序创建的,用于存储和管理程序状态。
- 原生程序是内置程序,包括在 Solana 运行时内。
- Sysvar 帐户是存储网络集群状态的特殊帐户。
账户
每个帐户都可以通过其唯一的地址来识别,用 Ed25519
PublicKey 格式。 你可以将地址的视为账户的唯一标识符。
此账户及其地址之间的关系可以被视为键值对, 而地址是定位相应的链上账户数据的键。
帐户信息
帐户有一个 最大大小为 10MB(10 Mega Bytes) ,并且 Solana 上每个帐户上存储的数据有以下结构称为 AccountInfo。

每个账户的
AccountInfo 包含以下字段:data: 存储帐户状态的字节数组。 如果帐户是程序(智能合约),则存储可执行程序代 码。 此字段是,通常称为“帐户数据”。
executable: 表示帐户是否为程序的布尔标识符。
lamports:账户余额的数字表示方式为 lamports,这是SOL中最小的单位(1 SOL = 10亿 lamports)。
owner:指定哪一个程序的公钥 (程序ID) 拥有该帐户。
作为Solana 账户模式的一个关键部分,Solana 上的每个账户都有一个指定为“所有者”,特 别是一个程序。 只有指定为帐户所有者的程序可以修改帐户中存储的数据或扣除lamport余 额。 重要的是要注意到,虽然只有所有者可以扣除余额,但任何人都可以增加余额。
若要在链上存储数据,必须将一定数量的SOL转账到一个帐户。 转账金额与账户上存储的 数据的大小成比例。 这一概念通常称为“租用”。 然而,仍然存在着这种情况。你可以认 为"出租"更像"保证金",因为分配给帐户的SOL可以在关闭帐户时完全恢复。
原生程序
Solana 包含少数原生程序,这些程序是验证器实现的一部分,并为网络提供了各种核心功 能。 You can find the full list of native programs here.
当在 Solana 上开发自定义程序时,你通常会与两个原生程序交互,即系统程序和 BPF Loader。
系统程序
默认情况下,所有新账户都属 于系统程序。 系统程序执行几项关键任务,例如:
- 新账户创建: 只有系统程序可以创建新帐户。
- 空间分配: 设置每个帐户数据字节的容量。
- 分配程序所有者: 一旦系统程序创建了一个帐户,它可以将指定的程序所有者重新分配到不同的程序帐户。 这是自定义程序如何获取系统程序创建的新账户的所有权。
在Solana上,“钱包”只是系统程序拥有的帐户。 钱包的 lamport 余额是账户拥有的 SOL金 额。

只有系统程序拥有的账户才能用作交易费付款人。
BPFLoader 程序
BPF Loader 是指定为网络上所有其他程序的“所有者”的程序,不包括原生程序。 它负责部署、升级和 执行自定义程序。
Sysvar 帐户
Sysvar账户是位于预定义地址的特殊账户,可以访问集群状态数据。 这些帐户使用网络集 群的数据动态更新。 You can find the full list of Sysvar Accounts here.
自定义程序
在Solana,“智能合约”称为 programs。 程序是一个包含可执 行代码的帐户,由一个设置为真的 “executable” 标志表示。
关于程序部署过程的更详细解释,请参阅此文档 的部署程序。
程序账户
当新程序 为已部署时, 从技术上讲,Solana 上创建了三个独立的账户:
- 程序账户: 代表链上程序的主账户。 此帐户存储可执行数据帐户的地址(存储编译的 程序代码)和程序的更新权限(授权地址更改程序)。
- 程序可执行数据帐户:包含可执行文件的帐户程序的字节码。
- 缓冲帐户:一个临时帐户,在程序正在部署或升级时存储字节代码。 处理完成后, 数据将转入程序可执行数据账户,并关闭缓冲账户。

为了简单起见,你可以将“程序帐户”视为程序本身。

“程序帐户”的地址通常称为“程序ID”,用于调用该程序。
数据帐户
Solana 程序是“无状态”的,这意味着程序帐户只包含程序可执行字节代码。 要存储和修改 额外数据,必须创建新的帐户。 这些账户通常称为“数据账户”。
数据账户可以存储在所有者程序的代码中定义的任意数据。

注意,只有 System Program 可以创建新帐 户。 一旦系统程序创建了一个帐户,它就可以将新帐户的所有权转移到另一个程序。
换言之,为自定义程序创建数据账户需要两个步骤:
- 调用系统程序来创建一个帐户,然后将所有权转到一个自定义程序
- 调用现在拥有账户的自定义程序,然后初始化程序代码中定义的账户数据
这个数据账户创建过程常常是抽象为一步,但是了解基础过程是有用的。
交易和指令
在 Solana上,我们发送 交易与网络交互。交易包括一个或多个指令, 每个交易代表一个待 处理的特定操作。 指令的执行逻辑是存储在部署到 Solana 网络的 programs 上。每个程序存储自己的一组指令。
以下是关于交易执行方式的关键细节:
- 执行顺序:如果一个交易包括多个指令,这些指令将按照它们添加到交易中的顺序进行处 理。
- 原子性:交易是原子的,意味着它要么完全完成并且所有指令都成功处理,要么完全失 败。 如果交易中的任何指令失败,则不会执行任何指令。
为简单起见,可以将交易视为请求处理一个或多个指令。

你可以将交易想象成一个信封,其中每个指令是您填写并放入信封中的文件。 然后我们发 出信封来处理文档,就像在网络上发送一个交易来处理我们的指令一样。
关键要点
- Solana 交易由与网络上各种程序进行交互的指令组成,其中每个指令代表一个特定操 作。
- 每个指令指定执行指令的程序、指令所需的账户以及指令执行所需的数据。
- 交易中的指令按照它们列出的顺序进行处理。
- 交易是原子的,意味着要么所有指令都成功处理,要么整个交易失败。
- 交易的最大大小为1232字节。
Slot
1. Slot 的定义
- 在 Solana 中,Slot 是一个固定时间段,用来安排验证者(Validator)生成和验证区块。
- 每个 Slot 通常对应一次验证者尝试生成一个区块的机会,但并不是每个 Slot 都会生成一个区块。
2. Slot 的功能
- 时间单位:Slot 是 Solana 区块链的时间测量单位,相当于其他区块链中的“区块间隔时间”。但与传统区块链不同,Slot 不一定产生实际的区块。
- 区块生成:验证者被安排在不同的 Slot 中依次尝试生成区块。
- 数据存储和排序:Slot 被用作区块链中数据和交易的逻辑分组,帮助网络跟踪交易历史和区块链状态。
3. Slot 与区块的关系
在 Solana 中,并不是每个 Slot 都包含区块:
- 如果某个 Slot 中的验证者未成功生成区块(例如由于网络延迟或错误),该 Slot 可能会被跳过。
- 因此,Solana 的 Slot 只是一个时间标记,而区块(Block)是 Slot 中的实际交易数据。
- 区块高度(Block Height):与 Slot 不完全对应,因为某些 Slot 可能没有区块。
4. Slot 的长度
- 固定长度:一个 Slot 的时间长度是固定的,当前大约为 400 毫秒(0.4 秒)。
- 这种设计使 Solana 的区块生产速度非常快,与传统区块链(如比特币和以太坊)的分钟级或秒级区块间隔相比效率更高。
5. Slot 在 Solana 共识中的作用
- Solana 使用一种叫 Proof of History (PoH) 的机制来优化共识流程。PoH 通过加密时间戳提供一个全局时间顺序。
- 每个 Slot 都由一个特定的验证者负责生成区块,称为 Leader。
- Leader 排班:验证者根据其质押的代币数量和投票权,被分配到特定的 Slot 作为 Leader。
- 如果一个 Leader 在其 Slot 中未成功生成区块,下一个 Slot 的 Leader 会接替其工作。
6. Slot 的作用场景
- 交易确认:Slot 用于衡量交易的确认时间。一般来说,多个连续的 Slot 被用于确保交易的最终性。
- 网络状态跟踪:Slot 编号可以用来跟踪网络的进展和区块链的状态。
- 性能测量:通过观察 Slot 中生成的区块和交易,可以评估 Solana 网络的性能。
7. Slot 示例
假设:
- 当前 Slot 为
1000,网络中的 Leader 尝试生成一个区块。
- 如果生成成功,该区块被记录在 Slot
1000。
- 如果生成失败,Slot
1000被跳过,下一个 Leader 在 Slot1001中尝试生成。
8. Slot 与确认时间
- 在 Solana 中,确认交易 并不需要等待一个完整区块的生产。
- 由于 Solana 的高性能设计,通常一个交易可以在多个 Slot 之后获得确认,典型的确认时间为 1-2 秒。
总结
在 Solana 中,Slot 是一种逻辑时间单位,用于安排区块的生产和验证。虽然每个 Slot 都可能产生区块,但区块与 Slot 并非一一对应。Slot 的高效设计支持 Solana 实现极高的吞吐量和低延迟的交易确认,是其高性能区块链架构的核心之一。
- 作者:ruofei.wang
- 链接:https://blog.ruofei.wang/article/solana-servey
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

Solana 链调研

