Solana[part2]_Solana开发入门
虚拟机
Solana的执行环境与其他区块链存在显著差异,其虚拟机架构是实现高吞吐量的核心基础之一:
EVM(Ethereum Virtual Machine):以太坊等区块链采用的虚拟机,基于栈式架构,Solana不直接支持EVM,但可通过跨链桥或兼容层(如Neon EVM)实现EVM合约迁移。
WASM(WebAssembly):通用二进制指令格式,Solana早期曾考虑采用,但最终选择了更轻量的方案。
Sealevel VM:Solana原生虚拟机,支持并行执行(区别于EVM的串行执行),是Solana高TPS(每秒交易数)的关键,可同时处理数千个独立合约调用。
BPF扩展指令集:Sealevel VM基于BPF(Berkeley Packet Filter)扩展,具有高效、安全、低资源占用的特点,适合区块链场景的沙箱执行环境。
项目搭建
1. Native Rust开发(原生开发方式)
直接使用Rust编写Solana合约,适合深入理解底层机制。
环境准备
安装Rust:curl --proto '=https' --tls ...
Solana
未读Solana[part1]_SOL基础
一、Solana概述
Solana是一个高性能的公链系统,核心特点体现在以下几个方面:
共识协议:采用独特的历史证明(POH)与权益证明(PoS)结合的共识机制,兼顾安全性与高效性。
高性能架构:通过优化数据传输、并行处理等技术,支持每秒数万笔交易(TPS),远超传统公链。
高并发处理:采用账户模型与事务隔离设计,实现多笔交易的并行验证与执行。
低延迟:得益于POH的时间戳机制,交易确认延迟可低至秒级。
1.1 核心模块
Runtime模块:作为Solana的运行时核心,负责管理所有账户的状态(包括余额、数据存储等),并调度智能合约的执行流程,确保交易按规则有序处理。
Programs模块:即Solana的智能合约层,包含多个核心程序:
Token Program:Solana生态中代币发行、转账、授权的基础程序,兼容SPL标准代币(类似以太坊的ERC-20)。
Stake Program:用于验证节点的质押管理,支持SOL代币质押、解除质押及收益分配等操作。
1.2 Rust在Solana中的应用
Rust是Solana智能合约开 ...
Rust进阶[part10]_并发
基本概述
在Rust中,通过std::thread::spawn函数可以创建新线程,该函数接收一个闭包作为参数,闭包中包含线程要执行的代码。
基础线程创建
子线程的生命周期依赖于主线程:当主线程结束时,无论子线程是否执行完毕,都会被强制终止。
use std::thread;
use std::time::Duration;
fn main() {
// 创建子线程
thread::spawn(|| {
for i in 1..10 {
println!("spawn thread: {}", i);
thread::sleep(Duration::from_millis(1)); // 模拟耗时操作
}
});
// 主线程逻辑
for i in 1..5 {
println!("main thread: {}" ...
Rust进阶[part9]_test测试
Unit Test(单元测试)
单元测试用于测试代码中的最小功能单元(如函数、方法),通常与被测试代码放在同一模块中,方便测试私有接口。
基本示例
创建src/lib.rs,编写公共函数及对应的单元测试:
pub fn add(left: usize, right: usize) -> usize {
left + right
}
pub fn multiply(a: i32, b: i32) -> i32 {
a * b
}
// 测试模块(通常命名为test,使用#[cfg(test)]标记仅在测试模式下编译)
#[cfg(test)]
mod tests {
// 引入父模块的函数(因测试模块是子模块,需显式引入)
use super::*;
// 测试add函数:正常情况
#[test]
fn test_add() {
assert_eq!(add(2, 3), 5); // 断言相等
...
Rust进阶[part8]_迭代器&关联类型
概述
迭代器(Iterator)是 Rust 中处理序列元素的强大工具,它提供了一种统一的方式来遍历集合(如向量、数组、哈希表等)中的元素。迭代器的核心特性是惰性执行:除非主动调用消耗迭代器的方法,否则迭代器不会实际执行任何操作。这种特性使得迭代器可以高效地组合使用,而不会带来额外的性能开销。
在 Rust 中,迭代器由 Iterator trait 定义,所有实现了该 trait 的类型都可以被称为迭代器。迭代器不仅可以用于遍历现有集合,还可以用于生成序列(如斐波那契数列)、处理数据流等场景。
迭代器的实现
迭代器本质是实现了 Iterator trait 的类型。该 trait 的核心定义如下:
trait Iterator {
type Item; // 关联类型:迭代器产生的元素类型
fn next(&mut self) -> Option<Self::Item>; // 核心方法:返回下一个元素(None表示结束)
}
next 方法是迭代器的核心:
每次调用返回 O ...
Rust进阶[part7]_闭包
闭包概述
闭包是一个可以捕获所在环境中的变量的匿名函数
在Rust中,闭包通过||符号定义,可以像普通函数一样调用,但和函数不同,闭包可以访问外部作用域的变量
特点
匿名性:没有函数名,通常作为表达式使用
捕获环境:能自动捕获定义所在作用域中的变量(无需显式声明)
类型推断:参数和返回值类型可由编译器自动推断,无需显式标注
灵活语法:语法简洁,可根据复杂度调整写法(单行可省略{}和return)
实现trait:编译器会为闭包自动实现Fn、FnMut或FnOnce trait,使其能作为参数传递
语法
基本语法:|参数列表| 代码块(返回值由最后一行表达式决定)
// 无参数闭包
let hello = || println!("Hello, closure!");
hello(); // 调用闭包
// 单参数闭包(省略类型标注)
let square = |x| x * x;
println!("{}", square(5)); // 输出:25
// 多参数闭包(显式标注类型,可选)
let a ...
Rust进阶[part6]_宏
macro 概述
宏是 Rust 中强大的代码生成工具,与函数不同,它在编译期展开并生成具体代码,能处理可变参数、实现动态逻辑,语法上以 ! 结尾(如 println! vec! panic!)。
常用宏简化了重复操作:println! 处理格式化输出,vec! 快速创建向量,cfg! 做条件编译判断。宏支持模式匹配和代码生成,比函数更灵活,但也因编译期处理,调试和学习门槛稍高。按功能可分为声明宏(基于模式匹配)和过程宏(更复杂的代码生成),是 Rust 元编程的核心能力。
一些之前常用的宏,例如 println!、vec! 等,它们简化了代码编写。
声明宏
声明宏允许你通过模式匹配来生成代码。例如,下面是一个简单的加法声明宏:
macro_rules! add {
($a:expr, $b:expr) => {
$a + $b
};
}
fn main() {
let result = add!(1, 2);
println!("Result: ...
Rust进阶[part5]_trait
trait概述
在 Rust 中,trait 是一种定义共享行为的方式。它类似于其他语言中的接口,允许我们定义一组方法签名,然后让不同的类型去实现这些方法。通过 trait,我们可以实现多态性,即不同类型可以以统一的方式处理。
普通实现
使用 trait 关键字来声明一个特征
summary 是特征名
在大括号中定义了该特征的所有方法
// 定义一个 trait
trait Summary {
fn summarize(&self) -> String;
}
// 定义一个结构体
struct NewsArticle {
headline: String,
location: String,
author: String,
content: String,
}
// 为 NewsArticle 结构体实现 Summary trait
impl Summary for NewsArticle {
fn summarize(&se ...
Rust进阶[part4]_智能指针2
Rc<T>
Rc<T>(Reference Counted)是 Rust 标准库提供的单线程共享所有权智能指针,通过引用计数实现多所有权管理。以下是其核心特性与使用场景
核心特性
引用计数:
每个实例在堆上存储:
实际数据 T
引用计数器(记录活跃引用数量)
克隆时只增加计数器,不会深拷贝数据:
let a = Rc::new(vec![1,2,3]);
let b = a.clone(); // 计数器从1→2
最后一个引用离开作用域时释放内存
不可变共享:
所有者只能通过 .clone() 共享不可变引用
需配合RefCell<T>实现内部可变性:
let cell = Rc::new(RefCell::new(5));
*cell.borrow_mut() += 1;
使用场景
下面这个例子使用box可以实现链表的结构
enum list {
Cons(i32, Box<list>),
Nil,
}
fn main( ...
Rust进阶[part3]_生命周期
生命周期概述
在Rust中,生命周期是一种确保引用有效性的机制。Rust编译器通过生命周期注解来跟踪引用的作用域,防止出现悬空引用(dangling references)。
简单使用
下面是一个简单的生命周期注解示例:
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
fn main() {
let string1 = String::from("abcd");
let string2 = "xyz";
let result = longest(&string1, string2);
println!("The longest string is {}", result);
}
在这个例子 ...

![Solana[part2]_Solana开发入门](https://img.soniachen.com/IMG_5493.jpg?_r_=d080087e-c2c6-8f94-876e-a7c2a1b0d21b)
![Solana[part1]_SOL基础](https://img.soniachen.com/IMG_5493.jpg?_r_=0ec6baac-c1e5-4cc0-b2eb-1cedb65a743e)
![Rust进阶[part10]_并发-概念、线程、通信、共享内存](https://img.soniachen.com/IMG_5493.jpg?_r_=11ec2ca8-0317-8938-a504-8be958adcb1d)
![Rust进阶[part9]_test测试](https://img.soniachen.com/IMG_5493.jpg?_r_=ea2c975e-5008-ff9d-b7a0-645ccfbcea0a)
![Rust进阶[part8]_迭代器](https://img.soniachen.com/IMG_5493.jpg?_r_=6fef2b60-a540-ebae-f26d-05db8069b60c)
![Rust进阶[part7]_闭包](https://img.soniachen.com/IMG_5493.jpg?_r_=59719b40-a96e-81ef-46ed-4fe3f38670ff)
![Rust进阶[part6]_宏](https://img.soniachen.com/IMG_5493.jpg?_r_=e269f3b5-a6ae-595c-d1e8-1ab343216ce4)
![Rust进阶[part5]_trait](https://img.soniachen.com/IMG_5493.jpg?_r_=c626ace4-a453-3294-bfa5-ac5178809f6d)
![Rust进阶[part4]_智能指针2](https://img.soniachen.com/IMG_5493.jpg?_r_=29939b78-2066-6612-082e-f0607a3e9707)
![Rust进阶[part3]_生命周期](https://img.soniachen.com/IMG_5493.jpg?_r_=11e0a585-1e28-5d0b-cc56-c5408a45d909)

