创建项目骨架
初始化 Rust 项目
Solana 程序本质上是一个 Rust 库。首先,使用 Cargo 创建一个新的 Rust 库项目:
bashcargo new --lib solana-storage cd solana-storage
项目名称 solana-storage 表明这是一个 Solana 存储程序。你可以根据实际需求修改名称。
配置 Cargo.toml
编辑 Cargo.toml 文件,我们需要告诉 Rust 编译器如何构建这个项目。
toml[package] name = "solana-storage" version = "0.1.0" edition = "2021" [lib] crate-type = ["cdylib", "lib"] [dependencies] solana-program = "1.18"
关键配置说明:
-
crate-type = ["cdylib", "lib"]:
- cdylib: 生成 C 兼容的动态库(
.so文件)。这是部署到 Solana BPF 虚拟机所必需的格式。 - lib: 生成标准的 Rust 库(
.rlib文件)。这方便你在本地编写单元测试和集成测试,无需每次都部署到链上。
- cdylib: 生成 C 兼容的动态库(
-
solana-program: 这是 Solana 开发的核心标准库,提供了账户信息、公钥、程序结果等基础类型的定义。
编写入口程序 (Entrypoint)
Solana 程序的执行入口不像普通 Rust 程序那样是 main() 函数,而是一个由宏定义的特殊入口。
在 src/lib.rs 中编写最基本的程序骨架:
rustuse solana_program::{ account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, pubkey::Pubkey, msg, }; // 1. 定义程序入口点 entrypoint!(process_instruction); // 2. 处理指令的核心逻辑 pub fn process_instruction( program_id: &Pubkey, // 这个程序自己的 ID accounts: &[AccountInfo], // 交易涉及的所有账户 instruction_data: &[u8], // 传递给程序的参数(字节数组) ) -> ProgramResult { // 打印日志到链上 (Compute Budget 消耗较低) msg!("Hello Solana! program_id: {:?}", program_id); // 返回 Ok(()) 表示执行成功 Ok(()) }
这个程序目前只会在被调用时打印一条日志。但它已经是一个合法的 Solana 程序,可以被编译和部署。
编译测试
Solana 提供了一套专门的编译工具链(基于 BPF/SBF),而不是使用标准的 cargo build。
运行以下命令进行编译:
bashcargo build-sbf
- SBF (Solana Bytecode Format): 这是 eBPF 的变种,专为 Solana 优化。
- 编译产物:如果一切正常,你会在
target/deploy/目录下看到solana_storage.so文件。这就是最终要上传到区块链的“二进制文件”。
注:如果你看到
target/deploy/solana_storage-keypair.json,这是系统自动为你生成的程序密钥对。这个密钥对的公钥就是你程序的 Program ID。