网络与生态

Solana 为什么快、手续费为什么低?拥堵时交易为何会失败

Solana 快在三处:PoH 给交易排出可验证的先后顺序,出块时段短(2026 年 10 月起约 200 毫秒),互不冲突的交易并行执行。手续费低,是因为基础费按签名收,每个签名 5,000 lamports。网络忙时交易仍可能过期或失败。

Solana 的速度来自三处设计:历史证明(PoH)先给交易排出一个可验证的先后顺序;验证者按预先排好的日程轮流出块,每个出块时段很短,截至 2026 年 10 月约 200 毫秒;交易提前声明要读写哪些账户,互不冲突的交易可以同时执行。手续费低,是因为基础费按签名数收,每个签名 5,000 lamports,也就是 0.000005 SOL,和转账金额无关。

快和便宜不等于每笔都能成功。网络忙的时候,交易可能因为 blockhash 过期、被节点丢弃或程序执行出错而失败。没被处理、过期或被丢弃的交易不扣链上手续费;已经被处理但执行失败的仍要付费。

一笔交易要付多少钱

截至 2026 年 10 月,官方费用文档写的收费结构是两部分:

费用 怎么算 归谁
基础费 每个签名 5,000 lamports 50% 销毁,50% 给验证者
优先费(可选) 计算单元单价 × 计算单元上限 ÷ 1,000,000,向上取整,单位 lamports 全部给验证者

1 SOL 等于 10 亿 lamports,换算一下:

  • 只需要你一个签名的普通转账,基础费 5,000 lamports,即 0.000005 SOL。
  • 需要两个签名的交易,基础费 10,000 lamports,即 0.00001 SOL。

优先费的单价按 micro-lamports(百万分之一 lamport)计。举个示意算例,数字只用来演示公式,不代表任何钱包的默认设置:单价设为 10,000 micro-lamports,计算单元上限设为 200,000,优先费 = 10,000 × 200,000 ÷ 1,000,000 = 2,000 lamports。加上基础费,这笔交易一共付 7,000 lamports,约 0.000007 SOL。

计算单元(CU)是衡量链上计算消耗的单位。费用文档给出的默认值:每条指令默认上限 200,000 CU,内置指令 3,000 CU,单笔交易最多 1,400,000 CU。优先费单价默认是 0,不设置就不付。

有两点容易被忽略:

  • 基础费不看金额,转 0.1 SOL 和转 1,000 SOL 付的基础费一样。
  • 交易执行失败,费用也照收。

另外,在链上新建账户(比如第一次收某种代币)要交一笔可退回的存储押金,它不算手续费,详见 Solana 是什么,SOL 币有什么用。

PoH 和权益证明,各管哪一段

历史证明(PoH)管先后顺序。 Solana 白皮书的描述是:拿一个输出无法提前预测的哈希函数(比如 SHA-256),把上一次的输出当作下一次的输入,一遍遍算下去,并记下次数和结果。这条序列只能一步一步按顺序算,没法跳过,所以序列本身就证明了时间在流逝。把某笔交易的哈希混进序列,后面生成的哈希就成了这笔交易的时间戳。

核对比生成快得多:白皮书写到,验证者可以把序列切成很多段,用多核同时核对每一段。

权益证明(PoS)管谁说了算。 验证者按质押的 SOL 数量获得投票权重。负责出块的领导者按日程轮换,术语表把领导者日程定义为验证者公钥与各个 slot 的对应关系。最终确定(finality)的定义是:代表三分之二质押量的节点有了共同的根。

两者配合的效果是:轮到出块的领导者拿到交易就能按 PoH 序列排好、执行、广播出去,其他验证者对着同一份顺序核对,不需要先来回沟通「哪笔在前、哪笔在后」。

这是截至 2026 年 10 月 20 日主网在用的机制。官方升级页写明计划启用的新共识 Alpenglow 会替换现有的投票层,启用后 PoH 不再控制出块节奏,时间安排见 Solana 这些年经历了什么。

出块时段从 400 毫秒缩到 200 毫秒

slot 是领导者接收交易、产出区块的时间段,每个 slot 最多出一个区块。官方的交易确认指南写的还是 slot 约 400 毫秒、会在 400 到 600 毫秒之间浮动,这个数字已经过时:按 Reduced Slot Times 页面,主网在 2026 年 10 月 9 日 epoch 1053 开始时把 slot 时间降到 200 毫秒,对应提案 SIMD-0525。

这次调整带来两个直接变化:

  • 交易得到确认的时间更短。
  • 交易引用的 blockhash 有效期仍是 150 个区块,换算成时间,从约 60 秒缩短到约 30 秒。

区块容量也在增加。2026 年 7 月 29 日起,每个区块的计算上限从 6,000 万 CU 提高到 1 亿 CU(100M CU Blocks,提案 SIMD-0286)。

钱包和区块浏览器里常见的 processed、confirmed、finalized,是三个承诺等级,越往后越稳。按 Alpenglow 页面,截至 2026 年 10 月,达到最终确定大约需要 12.8 秒,Alpenglow 的目标是约 150 毫秒。

并行执行:交易不必排一条长队

Solana 的运行时叫 Sealevel。官方文章 Sealevel 的解释是:每笔 Solana 交易都写明执行时要读、要写哪些状态,这样互不重叠的交易就能同时执行。

用三笔交易举例:

  • 交易 A:甲给乙转 SOL,要写甲和乙的账户。
  • 交易 B:丙给丁转 SOL,要写丙和丁的账户。
  • 交易 C:戊在某个兑换池里换币,要写这个池子的账户。

A、B、C 动到的账户没有重叠,可以同时执行。如果一万笔交易都要写同一个池子的账户,它们就只能一笔接一笔处理。

这也是 Solana 的拥堵常常是局部的原因:某个热门代币被集中抢购时,挤的是那几个热门账户,其他人的普通转账受影响较小。协议还给单个账户设了写入上限:一个区块里写同一账户的计算量最多 1,200 万 CU,在 1 亿 CU 的区块里只占 12%(见上面的 100M CU Blocks 页面)。

优先费到底买到了什么

优先费指南的原话是:优先费提高当前领导者把你的交易排在竞争交易前面的可能性。措辞是提高可能性,不是保证上链。

用的时候可以按场景区分:

  • 转账不急、网络也不忙,可以先不加优先费。
  • 抢热门资产时,大家都在同一批账户上加价,单价要随当时的竞争调整。钱包如果提供「优先级」选项,选高一档就是在提高单价。
  • 计算单元上限不要设得远高于实际需要。优先费等于单价乘上限,上限设高了,多付的是你自己的钱。

网络很忙时,交易为什么会失败

现象 原因 可以怎么做
提示交易已过期 交易引用的 blockhash 超过 150 个区块(约 30 秒)还没被处理 用新的 blockhash 重新签名发送
一直没有结果,最后不见了 RPC 节点算不出这笔交易什么时候过期,只转发一次,之后就丢弃。常见情形:交易引用的 blockhash 比节点用来计算过期高度的区块还新,比如从一个节点取 blockhash、发给另一个落后的节点,或发送时的 preflightCommitment 和取 blockhash 时的承诺等级不一致 取 blockhash 和发送用同一个节点,preflightCommitment 设成取 blockhash 时用的承诺等级;确认没上链后再重发
链上显示执行失败 程序条件没满足,比如兑换滑点超出设定、计算单元不够 检查滑点和计算单元设置后再发
抢购屡次失败 大量交易同时写同一个账户,受单账户写入上限限制 避开高峰,或接受更高的优先费

出处:blockhash 有效期见交易文档和上面的 Reduced Slot Times 页面;RPC 节点算不出过期区块高度时只转发一次、之后丢弃,以及 blockhash 过期机制用来防止同一笔交易被处理两次,见交易确认指南。

过期和被丢弃的交易没有上链;在链上执行失败的交易,手续费已经扣了。单笔金额很小,但短时间里反复重试会累加。遇到大面积失败,先去 Solana 官方状态页 看有没有事故公告,再决定要不要继续发。