Solana POH+POS共识

1、整体架构图

首先让我用 Mermaid 绘制 Solana 的核心架构图:
 

2、多线程架构

2.1 核心线程

Validator 线程:验证节点主线程
TPU (Transaction Processing Unit):交易处理
TVU (Transaction Validation Unit):交易验证
Gossip:网络通信
PoH:时间证明生成
账本管理线程

2.2 线程间通信

 
fn record_or_hash( next_record: &mut Option<Record>, poh_recorder: &Arc<RwLock<PohRecorder>>, timing: &mut PohTiming, record_receiver: &Receiver<Record>, // channel 的接收端 hashes_per_batch: u64, poh: &Arc<Mutex<Poh>>, target_ns_per_tick: u64, ) -> bool { // ... // 使用 try_recv 非阻塞接收数据 if let Ok(record) = record_receiver.try_recv() { *next_record = Some(record); break; } // ... }
 
 
fn record_or_hash( next_record: &mut Option<Record>, poh_recorder: &Arc<RwLock<PohRecorder>>, // 共享的 PohRecorder timing: &mut PohTiming, record_receiver: &Receiver<Record>, hashes_per_batch: u64, poh: &Arc<Mutex<Poh>>, // 共享的 Poh target_ns_per_tick: u64, ) -> bool { match next_record.take() { Some(mut record) => { // 获取写锁 let mut lock_time = Measure::start("lock"); let mut poh_recorder_l = poh_recorder.write().unwrap(); lock_time.stop(); timing.total_lock_time_ns += lock_time.as_ns(); // 使用被保护的数据 let mut record_time = Measure::start("record"); loop { let res = poh_recorder_l.record( record.slot, record.mixin, std::mem::take(&mut record.transactions), ); // ... } } None => { // 获取互斥锁 let mut lock_time = Measure::start("lock"); let mut poh_l = poh.lock().unwrap(); lock_time.stop(); timing.total_lock_time_ns += lock_time.as_ns(); // 使用被保护的数据 loop { timing.num_hashes += hashes_per_batch; let mut hash_time = Measure::start("hash"); let should_tick = poh_l.hash(hashes_per_batch); // ... } } } }
 

3、网络传播机制

使用Gossip 协议
每 100ms 进行一次 gossip 传播
选择 log(N) 个节点进行通信
使用布隆过滤器避免重复传输
 
T+100ms: 7 个节点 T+200ms: 49 个节点 T+300ms: 343 个节点 T+400ms: 1000+ 个节点
 
A节点率先知道了某个流言(msg),它首先将此信息传播到集群中的部分节点(比如相邻的两个节点)B和C,后者再将其传递到它们所选择的“部分”节点,例如B选择了D和E,C选择了将流言传播到B和F。以此类推,最终来自于A的这条流言在3轮交互后被传播到了集群中的所有节点。

4、共识机制

4.1 混合共识模型

PoH 提供全局时钟
PoS 提供验证者选择+共识机制
 

4.2时间证明机制 (PoH)

PoH 提供全局时钟和事件排序

4.2.1 Hash 链生成

从代码实现来看,Hash 是 PoH 的最基本单位:
 
pub const DEFAULT_HASHES_PER_BATCH: u64 = 64;
 
这里定义了每批处理的 hash 数量,是性能优化的关键参数。

4.2.2. 时间单位层级

Hash -> Tick -> Slot 的层级关系:
1 Tick = 64 Hashes
1 Slot = 64 Ticks = 4096 Hashes
1 Slot = 400ms
1秒产生:10,240 hashes/second
 
// hash 生成 let should_tick = poh_l.hash(hashes_per_batch); // tick 检查 if should_tick { poh_recorder.write().unwrap().tick(); }
 

4.2.3. 风险

PoH生成器(如Solana的Leader节点)可能成为单点故障

4.3共识机制(POS)

验证者管理共识机制
验证节点(Validator): 目前大约有 1500-3000 个活跃验证节点

4.3.1 Tower BFT 投票确认

Solana 使用的 Tower BFT拜占庭容错算法:
以太坊 2.0 (PoS) 使用的是 Casper FFG (Friendly Finality Gadget):

4.3.2.并行处理

多个 slot 同时处理

4.3.3.流水线确认

Slot N : 生成区块
Slot N+1: 乐观确认
Slot N+2: 最终确认

4.3.4. 分层快速确认机制

乐观确认机制:
33% 质押量的投票
快速交易反馈/UI 显示交易状态/非关键性操作
最终确认机制:
67% 质押量的投票
大额交易/关键业务操作/跨链交易

5、总结

Solana 通过创新的架构设计实现了高性能:
  1. PoH 提供可靠的时间证明
  2. 多线程架构提升并行处理能力
  3. Gossip 协议优化网络传播
  4. 流水线确认提高交易吞吐量
这些机制共同保证了 Solana 的高性能和可扩展性,同时通过 PoS 和投票机制保证了安全性。
posted @ 2025-06-19 15:39  若-飞  阅读(86)  评论(0)    收藏  举报