Solana 验证器架构演进:从 TPU/TVU 双管道走向统一 Leader/Validator 管道的设计提案
【免费下载链接】solanaWeb-Scale Blockchain for fast, secure, scalable, decentralized apps and marketplaces.项目地址: https://gitcode.com/GitHub_Trending/so/solana
Solana 节点的交易处理单元(TPU)与交易验证单元(TVU)是理解其共识与吞吐能力的关键。本文基于仓库中的 validator-proposal.md 设计提案,梳理这两条管道的诞生背景、验证与出块的本质差异,以及"解包抽象层、构建可切换 Leader 模式的单一管道"的演进方向,并结合当前仓库源码(core/src/tpu.rs、core/src/tvu.rs、core/src/validator.rs等)给出实现层面的印证。读完本文,你将掌握 TPU/TVU 的职责划分、PoH 在两条管道中的不同角色,以及该提案提出的架构重组清单与潜在收益。
背景:TPU 与 TVU 诞生的历史动因
提案开篇回顾了 Solana 早期架构决策的来龙去脉,理解这段历史有助于把握两条管道为何是今天的样子。
为 TPS 去风险化而生
项目起步时,核心目标是"去风险化"(de-risk)TPS 声明。当时的判断是:只要采用乐观并发控制(optimistic concurrency control)并设置足够长的 Leader 时隙(leader slot),PoS 共识本身并不会成为 TPS 的最大瓶颈;真正的风险在于:
- 基于 GPU 的签名验证(signature verification);
- 软件流水线(software pipelining);
- 并发记账(concurrent banking)。
正是为了应对这些风险,**TPU(Transaction Processing Unit,交易处理单元)**应运而生。在仓库中,TPU 的模块注释同样将其定义为"多阶段软件交易处理流水线"(见 core/src/tpu.rs 的tpu模块说明)。
突破 100k TPS 后的分工
在吞吐量突破 100k TPS 之后,团队被拆分为两个小组:一组继续冲刺 710k TPS,另一组则负责充实验证器(validator)管道。后者催生了TVU(Transaction Validation Unit,交易验证单元)。在仓库中,TVU 的模块注释将其定义为"多阶段软件交易验证流水线"(见 core/src/tvu.rs)。
提案明确承认:当前架构是上述开发顺序与项目优先级下增量演进的产物,而非当时认为的"技术上最优雅的交叉切面"。在 Leader 轮换(leader rotation)的语境下,出块(leading)与验证(validating)之间的强区分其实是被模糊的——这为后面"合并为单一管道"的提案埋下伏笔。
验证与出块的本质差异:PoH 的"在"与"不在"
提案用一个非常精炼的标准来区分两条管道:PoH(Proof of History,历史证明)出现在流水线的哪个位置。
Leader:先记账、再打 PoH 标签
Leader 的处理流程是:
- 处理交易,剔除坏交易(removing bad ones);
- 将处理结果打上 PoH 哈希标签(tag the result with a PoH hash)。
也就是说,Leader 在记账之后才生成 PoH 哈希,因此它拥有"删除坏交易"的自由——删除行为本身会被纳入后续哈希计算,不影响已产出的区块。
Validator:先验证哈希、再按原样记账
Validator 的处理流程则是:
- 验证收到的 PoH 哈希(verify that hash);
- 剥离(peel off)该哈希;
- 以与 Leader完全相同的方式处理交易。
关键约束在于:Validator 看到坏交易时不能像 Leader 那样简单地将其删除——因为那样会改变 PoH 哈希(交易集合不同,哈希必然不同),导致与 Leader 广播的哈希不一致。因此 Validator 只能选择拒绝整个区块(rejects the whole block)。这正是"验证者没有出块自由度"的密码学根源。
记账之后的差异:广播时机与投票
除了 PoH 位置不同,两条管道在记账之后的行为也不同:
| 阶段 | Leader | Validator |
|---|---|---|
| 记账后动作 | 将 entries 广播给下游验证器 | 已在 RetransmitStage(重传阶段)完成广播 |
| 额外动作 | 无 | 评估所观察的分叉、可能投出一票,并将 PoH 哈希重置为刚投票的区块哈希 |
提案指出,Validator 侧的广播发生在 RetransmitStage 中,这是一种确认时间优化(confirmation time optimization)——不必等记账完成再广播,而是在收块/转发阶段就提前传播。
而 Validator 独有的最后一步则涉及共识核心逻辑:每当处理完一个区块,它需要:
- 权衡观察到的各个分叉(weigh any forks it's observing);
- 决定是否投票(cast a vote);
- 若投票,则把自身的 PoH 哈希重置为所投票区块的哈希(reset its PoH hash to the block hash it just voted on)。
在源码中,这一"选分叉并重置"逻辑由 ReplayStage 承担。例如 core/src/replay_stage.rs 的ReplayStage及其配置结构ReplayStageConfig(包含vote_account、authorized_voter_keypairs、wait_for_vote_to_start_leader、wait_to_vote_slot等字段,见 core/src/replay_stage.rs),并可在其中看到分叉检测与重置相关的日志,如"PARTITION DETECTED waiting to join heaviest fork"与select_vote_and_reset_forks_elapsed_us统计项(见 core/src/replay_stage.rs)。
提案核心:解包抽象层,构建单一可切换管道
提案的核心理念非常直接:
解包(unwrap)层层叠叠的抽象层,构建一条单一管道,只要验证者的 ID 出现在 Leader 调度表(leader schedule)中,就开启 Leader 模式(toggle leader mode on)。
这意味着不再维护两条结构上高度重复、仅在 PoH 处理位置与记账后动作上不同的流水线,而是让同一套记账/验证逻辑根据角色自动切换行为。原提案附有对应的架构框图(/img/validator-proposal.svg,用于示意单一管道的组成与数据流;该 SVG 未随仓库文档目录同步提交,故此处以文字描述其要点)。
从当前源码看,这条"统一"路线尚未落地:core/src/validator.rs中仍然是先let tvu = Tvu::new(...)(见 core/src/validator.rs)再let (tpu, mut key_notifies) = Tpu::new(...)(见 core/src/validator.rs)的并行启动模式,且leader_schedule_cache被同时传给两条管道。因此本文以下内容严格按"设计提案"的定位来阐述,并将当前源码作为"现状对照"。
源码印证:当前 TPU/TVU 双管道的真实面貌
TPU 内部结构
core/src/tpu.rs 中Tpu结构体聚合了以下子服务:
fetch_stage: FetchStage——交易入口抓取;sigverify_stage与vote_sigverify_stage——普通交易与投票交易的签名验证(TransactionSigVerifier);banking_stage: BankingStage——记账(见 core/src/banking_stage.rs);cluster_info_vote_listener——从 gossip 监听投票;broadcast_stage: BroadcastStage——区块/entries 广播(来自solana_turbine::broadcast_stage);- 以及 QUIC 服务线程、
TpuEntryNotifier、质押节点更新服务、BankingTracer等。
TpuSockets(见 core/src/tpu.rs)则定义了交易、转发、投票、广播等多组 UDP 套接字与 QUIC 套接字。TPU 创建时还接收PohRecorder与BankForks(见 core/src/tpu.rs),与提案中"Leader 在记账后打 PoH 标签"的描述一致。
TVU 内部结构
core/src/tvu.rs 中Tvu结构体聚合了:
fetch_stage: ShredFetchStage——shred(数据分片)抓取;shred_sigverify——shred 签名验证线程;retransmit_stage: RetransmitStage——重传(来自solana_turbine::retransmit_stage),即提案提到的"确认时间优化"所在;window_service、cluster_slots_service——收块窗口与槽位信息维护;replay_stage: ReplayStage——重放/验证与投票决策;voting_service、blockstore_cleanup_service、cost_update_service、warm_quic_cache_service、drop_bank_service、duplicate_shred_listener等。
TvuSockets(见 core/src/tvu.rs)包含fetch、repair、retransmit、ancestor_hashes_requests四组套接字;TvuConfig(见 core/src/tvu.rs)则暴露了shred_version、repair_validators、repair_whitelist、wait_for_vote_to_start_leader、replay_slots_concurrently等配置项。
对比可见:两条管道在"抓取 → 验签 → 记账/重放 → 广播/重传"的骨架上是同构的,差异集中在 PoH 写入位置与投票重置逻辑——这正是提案主张合并的合理性的源码级佐证。
提案的显著变更清单(Notable changes)
提案列出了一组明确的重构动作,可逐条对应到当前源码中的相应模块:
将 FetchStage 与 BroadcastStage 从 TPU 中上提(Hoist):当前
FetchStage(见 core/src/fetch_stage.rs)与BroadcastStage均为Tpu的成员(见 core/src/tpu.rs),提案希望它们成为独立于单条管道的公共组件,被统一管道复用。BankForks 更名为 Banktree:当前
BankForks同时被 TPU、TVU 与 Validator 广泛引用(如 core/src/tpu.rs、core/src/validator.rs),更名更多是语义与命名层面的整理。TPU 迁移到新的无套接字 crate
solana-tpu:提案设想把 TPU 与具体网络套接字解耦。当前仓库中已有独立的tpu-clientcrate(见根目录 Cargo.toml 中solana-tpu-client的依赖声明),而提案中的solana-tpu属于另一层面的服务端管道拆包方向。TPU 的 BankingStage 吸收 ReplayStage:这是合并管道的关键——记账(banking)与重放验证(replay)在统一管道中共享同一套"处理交易"核心,仅凭 PoH 写入与否区分角色。
TVU 消失:统一管道取代 TVU,验证职责由单一管道在"非 Leader 模式"下承担。
新的 RepairStage 吸收 Shred Fetch Stage 与修复请求:当前
Tvu中既有ShredFetchStage又有repair::repair_service::RepairService(见 core/src/tvu.rs),提案建议合并为统一的 RepairStage,消除职责重叠。JSON RPC 服务改为可选、仅用于调试:提案主张将 RPC 服务拆入独立的
solana-blockstreamer可执行程序,使核心节点不再背负调试型接口的负担。新的 MulticastStage 吸收 RetransmitStage 的重传部分:当前
RetransmitStage位于solana_turbinecrate 并被Tvu持有(见 core/src/tvu.rs),提案希望将"重传"语义显式化为多播阶段。MulticastStage 置于 Blockstore 下游:即重传发生在数据已落盘/排队到区块库之后,保证重传内容的确定性与可追溯性。
其中第 4、5 条直接呼应提案开篇的判断——"在 Leader 轮换的语境下,leading 与 validating 的强区分是被模糊的":既然两者共享同一套交易处理内核,那么合并为一条按需切换角色的管道,既能减少代码重复,也能让 Leader/Validator 角色切换(轮到自己出块时)更加顺滑。
总结:一份"架构减法"的设计路线图
这份提案的本质是一次架构减法:剥离 TPU/TVU 双管道中重复的抓取、验签、记账骨架,仅保留"PoH 写入位置"与"记账后动作"两个真正的差异点,并通过 Leader 调度表驱动的模式开关将其统一。从当前仓库实现看,双管道架构依然健在,提案所列各项变更也大多停留在设计层面;但理解这份提案,能让你在阅读core/src/tpu.rs、core/src/tvu.rs、core/src/replay_stage.rs、core/src/repair/repair_service.rs等模块时,清楚地知道每条代码路径在整体演进蓝图中处于什么位置、为何如此组织,以及未来可能向何处收敛。
【免费下载链接】solanaWeb-Scale Blockchain for fast, secure, scalable, decentralized apps and marketplaces.项目地址: https://gitcode.com/GitHub_Trending/so/solana
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考