笔者注:因近期笔者工作需要,开始接触 solana 链上程序开发。本系列文章是笔者的学习笔记,既是为了备忘,也是希望得到 solana 开发者的指点与交流。本系列文章将默认读者已经掌握 rust 的基础语法,故不涉及对 rust 语法细节的解释。如果读者对 rust 基础语法还不熟练的话,本文下方推荐的 rust 入门书籍《rust 编程入门、实战与进阶》学习。0Y8币圈网 - 区块链数字货币实时行情平台
0Y8币圈网 - 区块链数字货币实时行情平台
Solana 是一个高性能、无许可的底层公链,专注于在不牺牲去中心化或安全性的前提下提供可扩展性。Solana 主网于 2020 年一季度上线,目前主网的全球节点超过 800 个,TPS 最高可达 6.5 万,出块时间约 400 毫秒。0Y8币圈网 - 区块链数字货币实时行情平台
Solana 的共识算法采用 PoH(历史证明),其核心是一个去中心化时钟,该时钟旨在解决缺乏单个可信赖时间源在分布式网络中的时间问题。PoH 免除了在节点网络中广播时间戳的需求,从而提高整个网络的效率。0Y8币圈网 - 区块链数字货币实时行情平台
Solana 的智能合约叫做链上程序(On-chain Program),Solana 官方提供了 Rust 和 C 的 SDK 来支持开发链上程序。链上程序的开发工作流如图 1-1 所示,开发者可以使用工具将程序编译成 Berkley Packet Filter (BPF) 字节码(文件以 .so 为扩展名),再部署到 Solana 链上,通过 Sealevel 并行智能合约运行时去执行智能合约的逻辑。此外,基于 Solana JSON RPC API,官方提供了诸多 SDK 用于客户端与 Solana 链上数据交互。0Y8币圈网 - 区块链数字货币实时行情平台
图 1-1 链上程序开发工作流0Y8币圈网 - 区块链数字货币实时行情平台
0Y8币圈网 - 区块链数字货币实时行情平台
与以太坊类似,Solana 也是基于账户模型的区块链。通过将任意状态存储于链上账户并同步复制给集群中的所有节点,可以创建复杂而强大的去中心化应用程序。0Y8币圈网 - 区块链数字货币实时行情平台
Solana 提供了一套不同于以太坊的账户模型,账户定义的字段如表 1-1 所示。Solana 的账户可以分为可执行账户和不可执行账户。0Y8币圈网 - 区块链数字货币实时行情平台
表 1-1 账户定义字段0Y8币圈网 - 区块链数字货币实时行情平台
| 字段 | 描述 |
|---|---|
| lamports | 账户余额 |
| owner | 账户所有者 |
| executable | 是否为可执行账户 |
| data | 账户存储的数据 |
| rent_epoch | Solana链上程序的部署是按其账户大小进行定期收费的,如果账户无法支付租金,系统将清除该账号 |
我们知道以太坊上每个智能合约的代码和状态都存储在同一个账户中,而 Solana 链上程序是只读或无状态的,即程序的账户(可执行账户)只存储 BPF 字节码,不存储任何状态,程序会把状态存储在其他独立的账户(不可执行账户)中。为了区分某个账户是用作哪个程序的状态存储,每个账户都指定了一个程序作为其所有者。程序可以读取其不作为所有者的账户中的状态,但只有作为所有者的程序才能修改账户中的状态,任何其他程序所做的修改都会被还原并导致交易失败。0Y8币圈网 - 区块链数字货币实时行情平台
更多关于账户模型的资料可以参见官方文档:https://solana.wiki/zh-cn/docs/account-model/0Y8币圈网 - 区块链数字货币实时行情平台
在开始 Solana 链上程序开发之前,需要先安装和配置相关的编程环境。首先请正确安装 Node、NPM 和 Rust 的最新稳定版本,下面来安装 Solana CLI 并配置相关环境。0Y8币圈网 - 区块链数字货币实时行情平台
Solana CLI 是与 Solana 集群进行交互的命令行管理工具,包含节点程序 solana-validator、密钥对生成工具 solana-keygen,以及合约开发工具 cargo-build-bpf、cargo-test-bpf 等。0Y8币圈网 - 区块链数字货币实时行情平台
在终端运行以下命令,可完成 Solana CLI 最新稳定版的下载与安装。0Y8币圈网 - 区块链数字货币实时行情平台
sh -c "$(curl -sSfL https://release.solana.com/stable/install)"