Solana开发学习(一) -- 总体说明

2024-11-03

Rust项目学习:Solana。

1. 背景

继续进一步学习Rust开源项目,后面准备先看下SolanaTiKV,相关应用和生态发展也可了解 Rust编程第一课–开悟之坡(上):Rust的现状、机遇与挑战2021 年 Rust 行业调研报告Rust 2022 生态版图调研报告

本篇开始学习基于Rust开发的知名项目:Solana,并学习区块链开发相关内容。

先收集部分学习资源:

关于区块链,之前在《左耳听风》学习过基础的技术原理(笔记:区块链学习笔记),另外当时看《OK区块链60讲》里的应用时还挺受触动(区块链学习.md),近些年也或多或少参与Crypto的投资或投机(屯大饼二饼;矿机;GTC/ENS/OP/ARB/ZK空投;链游;NFT)。之前看过BTC和以太坊的几本书,但没参与相关开发,趁学Rust的机会拓展下技能栈。

2. Solana开发入门

基于上述参考链接浏览对比后,先基于 Getting Started with Solana Development(结合中文版:Solana 开发入门) 进行学习。

Solana 的开发分两个主要部分:

  • 链上程序开发:创建和部署自定义程序到区块链,可基于 RustCC++Rust拥有更好的支持
  • 客户端开发:编写和链上程序通信的软件(dApp),可使用任何语言
    • 客户端通过RPC请求向Solana网络通信。用Solana的 JSON RPC API,通过HTTP和Websocket直接和Solana节点交互,与前端和后端之间的正常开发非常相似

客户端和Solana区块链通信示意图:

客户端和Solana网络通信

2.1. 客户端开发

可以使用自己熟悉的语言,通过社区贡献的SDK来进行客户端开发,各类SDK,见:Client-side Development,包含RUST、Typescript、Python、Java、C++、Go等等。

2.2. 链上程序开发

说明:

  • 基于Rust、C 或 C++开发
  • 机器上需要安装Rust
  • 需要安装Solana CLI,用于在本地验证程序,安装后命令工具为 solana-test-validator
    • 具体见 Install the Solana CLI
    • 安装命令:sh -c "$(curl -sSfL https://release.anza.xyz/stable/install)",在Mac上安装后大概要476MB

开发时,可基于原生Rust(不使用框架)开发,也可基于 Anchor框架,其提供更高等级的API使得开发更简单(类似于React替代原生JavascriptHTML

测试框架:solana-program-test

若不想在本地开发程序,也有一个在线IDE:online IDE Solana Playground,使用参考:Solana Quick Start Guide

安装Solana CLI:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[MacOS-xd@qxd ➜ repo ]$ sh -c "$(curl -sSfL https://release.anza.xyz/stable/install)"
downloading stable installer
  ✨ stable commit 7feb24d initialized
Adding
...
export PATH="/Users/xd/.local/share/solana/install/active_release/bin:$PATH"

[MacOS-xd@qxd ➜ repo ]$ cd /Users/xd/.local/share/solana/install/releases/stable-7xxx/solana-release/bin
[MacOS-xd@qxd ➜ bin ]$ ls
agave-install         cargo-test-bpf        solana-dos            solana-stake-accounts
agave-install-init    cargo-test-sbf        solana-faucet         solana-test-validator
agave-ledger-tool     deps                  solana-genesis        solana-tokens
agave-validator       rbpf-cli              solana-gossip         solang
agave-watchtower      sdk                   solana-keygen         spl-token
cargo-build-bpf       solana                solana-log-analyzer
cargo-build-sbf       solana-bench-tps      solana-net-shaper

2.3. 开发网络环境

Solana上有几种不同的网络环境(也称作集群,cluster),注意选择正确环境:

  • 主网Beta版(Mainnet Beta):生产网络,需要真金白银
  • 开发网(Devnet):生产模拟环境,用于部署生产环境前,测试保证程序的质量
  • 本地(Local):在本地使用solana-test-validator来测试程序,开发时的首选

2.4. 示例参考

有几个资源可以帮助提升Solana开发的学习:

2.5. Solana和BPF

特别说明下,Solana基于eBPF实现了一个专门用于智能合约的运行时环境,这个运行时环境称为Solana BPF Loader。意外地跟前面 eBPF学习实践系列 联接起来了,后面可以多看下基于Rust编写eBPF程序(相关实际示例参考:一次使用 ebpf 来解决 k8s 网络通信故障记录一次使用 eBPF LSM 来解决系统时间被回调的记录

Solana 利用LLVM编译架构将程序编译成可执行与可链接格式文件(ELF)。这些文件包括一个为Solana程序修改过的BPF字节码(eBPF bytecode),称为“Solana Bytecode Format”(sBPF)。

LLVM 的使用使Solana能够潜在地支持任何可以编译成 LLVM 的 BPF 后端的编程语言。这大大增强了 Solana 作为开发平台的灵活性。

参考:Core Concepts – Berkeley Packet Filter

3. 基本概念

3.1. 账户模型

Solana的数据组织方式类似键值存储(Address: AccountInfo),其数据库中每个条目都称为帐户(Account)

地址是以Ed25519算法生成的32位的公钥,可视为帐户的唯一标识符。

  • 账户最多能存储10MB的数据,数据可包含可执行程序程序状态
  • 账户需要SOL代币押金,和存储数据量成正比,押金在账户关闭时可全额退还
  • 每个账户都有一个程序所有者,只有程序所有者的程序可修改或扣除余额,不过任何人可增加余额
  • 程序(智能合约)是存储(已编译)可执行代码的无状态帐户
    • executable标志会设置为true
  • 数据帐户由程序创建,用于存储和管理程序状态
  • 原生程序(Native programs)是Solana运行时附带的内置程序
  • Sysvar帐户是存储网络群集状态的特殊帐户
    • 位于预定义地址的特殊账户,随着网路集群数据动态更新

账户定义:

见:AccountInfo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#[derive(Clone)]
#[repr(C)]
pub struct AccountInfo<'a> {
    /// Public key of the account
    pub key: &'a Pubkey,

    // 账户余额的数字表示,单位为lamports,即 SOL 的最小单位(1 SOL = 10 亿 lamports)
    pub lamports: Rc<RefCell<&'a mut u64>>,
    // 存储帐户状态的字节数组,若账户是一个程序(智能合约),则此处存储可执行程序
    pub data: Rc<RefCell<&'a mut [u8]>>,
    // 指定拥有帐户程序的公钥(程序 ID)
    pub owner: &'a Pubkey,

    /// The epoch at which this account will next owe rent
    pub rent_epoch: Epoch,
    /// Was the transaction signed by this account's public key?
    pub is_signer: bool,
    /// Is the account writable?
    pub is_writable: bool,

    /// This account's data contains a loaded program (and is now read-only)
    // 指示帐户是否为程序
    pub executable: bool,
}

原生程序:

Solana包含少量原生程序,这些程序是验证器实现的一部分,并为网络提供各种核心功能。

在Solana上开发自定义程序时,通常会与两个原生程序进行交互,即系统程序BPF加载程序

  • 系统程序(System Program)
    • 默认情况下,所有新帐户都归系统程序所有
    • 负责几个关键任务:创建新账户、空间分配(设置每个账户的数据字段的字节容量)、分配程序所有权(创建账户后,可将程序所有者分配给其他程序账户)
    • 在Solana上,“钱包”只是系统程序拥有的账户,钱包的lamports余额是账户所拥有的SOL金额
  • BPF加载程序(BPFLoader Program)
    • BPF Loader程序是Solana网络上除了原生程序外所有程序的所有者,负责部署、升级和执行自定义程序

自定义程序:

Program AccountData Account:程序账户可理解为程序本身,数据账户可存储其 所有者程序 中定义的任意数据。

数据账户示意图:

数据账户示意图

4. 小结

本篇作为开篇,进行基本说明。

5. 参考

1、Getting Started with Solana Development

2、Solana 开发入门

3、Rust编程第一课–开悟之坡(上):Rust的现状、机遇与挑战

4、2021 年 Rust 行业调研报告



Comments