登录 后可观看高清视频
Solana 入门:简单链上数据存储器
Mohanson主要分享了 “Account Model (账户模型)” 的实战应用以及如何编写具备生产能力的 Rust 程序。
- 1. 开发环境与工具链
- 本地验证者 (
solana-test-validator):本地测试是开发的基石。它可以完全模拟主网行为,支持重置状态。 - RPC (Remote Procedure Call):
- 端口 8899:默认的 HTTP RPC 端口,用于发送交易和查询数据。
- 常用指令:
getAccountInfo是最核心的读取函数,用于获取账户的 Lamports 余额、Owner 和 Data。
- 本地验证者 (
-
2. 核心架构:逻辑与数据的彻底解耦
这是 Solana 区别于以太坊(EVM)的最本质特征:
- Stateless Program (无状态程序):Solana 的程序(Smart Contract)只包含执行指令的代码,不存储任何业务数据。
- Data Accounts (数据账户):所有状态信息都必须存储在独立的数据账户中。
- 并行处理能力 (Parallel Execution):
- 交易声明:交易必须预先列出所有要操作的账户。
- 运行时调度:只要两笔交易操作的是不同的账户,验证者就可以在多个 CPU 核心上同时执行它们。
-
3. PDA (Program Derived Address) —— 程序派生地址
PDA 作为重点,用于实现“程序自主管理账户”:
-
计算公式:
Address=hash(Program ID+Seeds+Bump)
-
特性:
- 无私钥:PDA 不在 Ed25519 椭圆曲线上。
- 程序签名:程序可以通过
invoke_signed函数,利用 Seeds 和 Bump 为该 PDA 签署交易。
-
应用场景:Vault(金库)账户、用户配置文件(Profile)、去中心化订单簿的撮合账户。
-
- 4. 链上存储与租金管理 (Rent Management)
- Lamports 与租金:链上空间昂贵。账户内必须持有一定数量的 SOL 来支付存储费。
- Rent Exempt (租金豁免):若账户余额足以支付 2 年的租金,节点将不再扣费。目前的标准做法是所有账户都必须保持“租金豁免”。
- 动态调整 (
realloc):- 当存储内容增加时,如何动态扩展账户空间。
- 安全检查:必须判断发起者是否有权修改,并确保账户内有足够的 SOL 补足新增空间的租金。
-
5. Rust 程序编写要点
-
Entrypoint (入口点):所有 Solana 程序的唯一入口。Rust
pub fn process_instruction( program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8], ) -> ProgramResult -
Borsh 序列化:用于将 Rust 中的
struct(结构体)转化为可在链上存储的二进制流(Binary stream)。 -
部署限制:由于 UDP 包大小限制(通常为 1280 字节),部署大型程序会涉及成百上千次连续的交易指令。
-
文档:https://solana.com/zh/docs/intro/installation 附件中有来自社区小伙伴 Dean 的笔记分享