news 2026/9/14 5:26:39

Solana 同步机制解析:Proof of History 如何驱动 Entry 实时流与 800ms 区块确认

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Solana 同步机制解析:Proof of History 如何驱动 Entry 实时流与 800ms 区块确认

Solana 同步机制解析:Proof of History 如何驱动 Entry 实时流与 800ms 区块确认

【免费下载链接】solanaWeb-Scale Blockchain for fast, secure, scalable, decentralized apps and marketplaces.项目地址: https://gitcode.com/GitHub_Trending/so/solana

本文围绕 Solana 文档中的同步机制(Synchronization)展开,讲清 Solana 为什么能以远小于分钟级的“区块时间”实现高吞吐:核心在于用 Proof of History(PoH,历史证明)为数据流做密码学时间戳,把区块拆成 entry 实时流式下发给验证者,并在共识达成前乐观地处理交易。读完本文,你将理解 PoH 哈希链、tick 与 entry 的生成流程、乐观处理与回滚机制,并能对照仓库中 entry/src/poh.rs 与 poh/src/poh_service.rs 的源码验证这套设计的具体实现。

为什么传统区块同步是吞吐瓶颈

传统区块链同步的基本单位是“区块”:一批交易打包成块,交易必须等一个称为 “block time” 的时间段走完才能被处理。不同共识机制对这个时长有不同的约束:

  • PoW 系统:block time 必须很大(典型值约 10 分钟),否则多个矿工同时挖出新合法区块的概率会显著上升,导致分叉。
  • PoS 系统:没有 PoW 那样的结构性约束,但缺少可靠时间戳时,验证者无法判断区块到达的先后顺序。通行做法是给每个区块打上墙钟时间戳(wallclock timestamp)。然而由于时钟漂移和网络延迟抖动,时间戳精度只有“一两个小时”的量级;为了让“每个区块的中位时间戳单调递增”这一假设成立,这些系统只能进一步拉长 block time。

也就是说,无论是 PoW 的出块竞争还是 PoS 的墙钟时间戳,最终都把同步单位拖向了“大区块 + 长时间间隔”,交易确认被整体推迟。Solana 的出发点就是打破这个约束。

Proof of History:用密码学证明“时间已过去”

Solana 采用了截然不同的方案,即Proof of History(PoH)

  • 领导者节点(leader)用密码学证明给区块打时间戳,该证明表明“自上一个证明以来已过去某段时长”。
  • 所有被哈希进证明的数据,确定性地发生在该证明生成之前——这就是“历史”的含义。
  • 节点随后把新区块广播给验证者,验证者可以独立核验这些证明。
  • 关键性质:区块到达验证者的顺序可以是任意的,甚至可以在多年后被重放,同步保证依然成立。

正是这种可靠的时间同步保证,让 Solana 可以把“区块”进一步拆分成更小的交易批次,称为entry。entry 在“区块共识”形成之前就实时流式地发给验证者。

需要特别说明的是术语口径:从源码实现看,Solana 在技术上从不发送一个整体的block对象;文档使用该词只是为了描述“验证者投票以达成确认(confirmation)所针对的 entry 序列”。这样定义后,Solana 的确认时间才能与基于区块的系统做同口径比较。当前实现把 block time 设定为 800ms,这正是上述拆分与实时流式下发的直接收益。

Entry 实时流与乐观处理

在底层,entry 的生成速度取决于领导者能多快地把一批有效交易封装成一个 entry:

  1. 领导者将有效交易批次实时流式推送给验证者;
  2. 验证者远早于投票时间点就开始处理这些 entry——即乐观处理(optimistic processing);
  3. 由于处理早已完成,从“收到最后一个 entry”到“节点可以投票”之间实际上没有延迟;
  4. 若最终共识未达成,节点直接回滚自身状态。

文档明确指出,这种乐观处理技术在 1981 年就被提出,称为乐观并发控制(Optimistic Concurrency Control)。它同样可以映射到区块链架构:集群对某个代表“截至某区块高度的整本账本”的哈希进行投票;在 Solana 中,这个哈希的实现非常直接——就是最后一个 entry 的 PoH 哈希。换言之,投票对象与同步对象是同一个哈希链的末端值,验证与投票共享同一条数据路径。

源码印证:PoH 哈希链如何生成

哈希链核心:Poh结构

PoH 哈希链的核心实现位于 entry/src/poh.rs。Poh结构维护当前哈希、已消耗哈希数、每 tick 哈希数(hashes_per_tick)以及 tick 计数等状态,对外提供三个基本操作:

// entry/src/poh.rs(节选) pub fn hash(&mut self, max_num_hashes: u64) -> bool { // 串行自哈希,直到达到本 tick 的预算;返回 true 表示需要 tick() for _ in 0..num_hashes { self.hash = hash(self.hash.as_ref()); } ... } pub fn record(&mut self, mixin: Hash) -> Option<PohEntry> { // 将应用数据(mixin)混入哈希链,产出带 num_hashes 的 entry self.hash = hashv(&[self.hash.as_ref(), mixin.as_ref()]); ... } pub fn tick(&mut self) -> Option<PohEntry> { // 完成最后一次哈希,产出空 entry(tick),推进 tick_number self.hash = hash(self.hash.as_ref()); ... }

三个操作恰好对应文档描述的两类对象:

  • record(mixin)生成携带数据的 entry——任何应用观察到的数据都被哈希进链,因此能“证明历史”:这些数据确定性地存在于其后哈希之前;
  • tick()生成空 entry(tick)——纯时间流逝度量,不含交易。

值得注意的约束:当本 tick 的哈希预算只剩最后 1 个哈希时(remaining_hashes == 1),record()会返回None拒绝写入,必须先tick()。这条规则保证了每 tick 的哈希数严格等于配置值(hashes_per_tick),使 tick 时长与哈希次数之间的换算关系精确可验,测试test_poh_record_not_permitted_at_final_hash(见 entry/src/poh.rs 测试模块)专门覆盖了这一边界。

此外,该文件还提供两个用于标定时间参数的工具函数:

// 测量机器上产生 N 次哈希的耗时 pub fn compute_hash_time_ns(hashes_sample_size: u64) -> u64 // 按目标 tick 时长反推该机器应设置的 hashes_per_tick pub fn compute_hashes_per_tick(duration: Duration, hashes_sample_size: u64) -> u64

这解释了“时间”在 PoH 中的真实语义:它不来自墙钟,而是来自可验证的串行哈希次数。不同算力机器通过compute_hashes_per_tick按本机哈希速率换算出等价的每 tick 哈希数,从而让 tick 在时间轴上对齐。

生产循环:PohService的 tick 生产者

tick 与 entry 的持续生产由 poh/src/poh_service.rs 中的PohService驱动,它在名为solPohTickProd的独立线程中运行,并根据PohConfig(定义于 sdk/src/poh_config.rs)选择两种模式:

  • 全速模式(hashes_per_tick已配置,主网默认路径):线程进入紧循环tick_producer,尽可能快地自哈希。为保证缓存友好,会用core_affinity把该线程固定到专用 CPU 核(默认核 0,见DEFAULT_PINNED_CPU_CORE)。核心调度逻辑在record_or_hash中:
    • 若收到记录请求(交易批次),持锁期间背靠背连续 record,把已排队的交易一次性打进链中;
    • 否则按hashes_per_batch(默认DEFAULT_HASHES_PER_BATCH = 64)为一批地自哈希,每批检查一次记录通道;
    • 每批哈希后用Poh::target_poh_time(target_ns_per_tick)计算“理论理想时刻”,若落后于该时刻则继续哈希追赶,若超前则释放锁后忙等到理想时刻再恢复哈希——这就是把哈希速率“节流”到目标 tick 时长的实现;
    • 批大小取 64 的注释解释了权衡:过小会拖累 PoH 哈希速率,过大则因与哈希循环的锁竞争降低记录交易的速度。
  • 低功耗模式(hashes_per_tick未配置,常见于本地测试集群)low_power_tick_producer不再自哈希,而是在target_tick_duration到期时调用poh_recorder.tick()产出 tick;若还配置了target_tick_count,则产满指定 tick 数后自动退出(short_lived_low_power_tick_producer)。

目标时长的计算还包含一项工程修正:target_ns_per_tick会在 tick 时长基础上减去TARGET_SLOT_ADJUSTMENT_NS(50ms)按每 slot tick 数均摊的调整量,用于吸收 PoH 生成之外(写锁、entry 分发等)的处理开销,避免 slot 实际时长持续漂移。

上述结构印证了文档的关键论断:entry 的下发节奏只受“领导者多快能把一批有效交易打包进 entry”的限制——哈希线程与记录通道解耦,交易到达即被连续record入链并产出 entry 下发,而 tick 只在哈希预算耗尽时发生。

PoH 与可验证延迟函数(VDF)的关系

文档对 PoH 与 VDF(Verifiable Delay Function,可验证延迟函数)的差异有明确的历史与技术表述:

  1. 时间线:PoH 于 2017 年 11 月首次由 Solana 提出用于区块链场景;次年 6 月,斯坦福出现了描述类似技术的 VDF 工作。
  2. 验证速度:VDF 的期望性质是验证极快;而 Solana 对延迟函数的验证耗时与生成耗时成正比(验证需要重放同等长度的哈希链)。文档坦承,即便分摊到 4000 核 GPU 上,这对 Solana 来说只是“足够快”,从算法复杂度角度看并不快,VDF 原作者也指出 Solana 的方案不应被称为严格意义的 VDF。Solana 的立场是:VDF 一词应代表“可验证延迟函数”这一类别,而非仅指具备特定性能特征的子集;在争议解决前,Solana 继续称自己的应用特化延迟函数为 PoH。
  3. 数据混入带来的双面性:VDF 只用于度量时长;而 PoH 的哈希链会混入应用观察到的任意数据。这一方面让数据“证明了历史”(数据确定性地先于其后哈希存在);另一方面也意味着应用可以通过改变数据何时被哈希来操纵哈希链。因此 PoH 链不适合做随机性来源——不含数据的 VDF 则可以。一个具体体现:Solana 的领导者轮换算法(见 docs/src/consensus/leader-rotation.md)只从 VDF 的高度(tick 高度,一个单调递增计数器)派生种子,而不使用该高度处的哈希值本身,从而规避了数据操纵对随机性的影响。

PoH 与共识机制的关系

文档给出了一个重要的边界声明:Proof of History 本身不是共识机制。它的作用有两层:

  • 提升 Solana 的 Proof of Stake 共识的性能;
  • 提升数据平面协议(如 entry 的流式传输与验证)的性能。

也就是说,PoH 解决的是“时间戳可信 + 顺序可验证”这一同步问题;真正的选择权(哪个分叉胜出、何时达成确认)由 PoS 投票机制完成。entry 上的乐观处理 + 未达成共识则回滚,正是把“共识裁决”与“交易执行”解耦的桥梁。若想进一步理解投票与分叉如何在 PoH 之上形成确认,可结合同目录文档 docs/src/consensus/commitments.md 与 docs/src/consensus/leader-rotation.md 阅读:leader 轮换文档定义了 slot 由 T 个 tick 组成、epoch 为 leader schedule 的生命周期,而 slot 时长正是 800ms block time 的组成部分。

小结

  • Solana 的同步单位不是大区块,而是带 PoH 密码学时间戳的entry;区块只是验证者投票确认的 entry 序列,当前实现 block time 为800ms
  • PoH 的时间语义来自串行哈希次数而非墙钟:Poh::hash / record / tick(entry/src/poh.rs)构成哈希链,hashes_per_tick按机器哈希速率标定;PohService(poh/src/poh_service.rs)以独立线程持续生产 tick,交易到达即被连续 record 成 entry 实时下发。
  • 验证者通过乐观处理(1981 年提出的乐观并发控制思想)在投票前完成交易执行,未达成共识则回滚,从而把“收完最后 entry”到“可投票”之间的延迟压到近似为零。
  • PoH 是应用特化的 VDF:验证耗时与生成耗时成正比,且因混入应用数据而不能作为随机性来源,领导者轮换只取 VDF 高度而不取其哈希。
  • PoH 不是共识机制,而是提升 PoS 共识与数据平面性能的同步基础设施。

【免费下载链接】solanaWeb-Scale Blockchain for fast, secure, scalable, decentralized apps and marketplaces.项目地址: https://gitcode.com/GitHub_Trending/so/solana

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 5:26:10

OpenClaw AI开发框架安装与配置全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 5:22:33

在电脑上玩Switch游戏:免费开源yuzu模拟器3步上手完整指南

在电脑上玩Switch游戏&#xff1a;免费开源yuzu模拟器3步上手完整指南 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 想把客厅里的Switch游戏搬到电脑或手机上玩&#xff1f;yuzu是一款免费开源的任天堂Switch模拟…

作者头像 李华
网站建设 2026/9/14 5:19:56

蓝牙模块量产选型必须索要的6类射频与功耗证据

1. 这不是买蓝牙模块&#xff0c;是买一份可量产的射频交付物“蓝牙模块选型”这六个字&#xff0c;听起来像在电子市场挑一块板子——查查型号、比比价格、看看尺寸、测测通电。但如果你正负责一款要出货5万台的智能体脂秤、一款要过CE/FCC认证的工业手持终端&#xff0c;或者…

作者头像 李华