你的手机钱包告诉你:“收到 0.5 ETH。”

它凭什么这么说?它没有下载整条链——你的手机存不下,也同步不动。

那它到底验证了什么,又有哪一部分是直接信了别人的?这个问题的答案,决定了你手上这个钱包的安全性到底建立在什么之上。

第 3 讲说去中心化的核心指标是"普通人能不能自己验证"。这一讲就看验证的成本能被压到多低——以及压到最低时,你交出去的是什么。

一、四个层次

① 全节点        下载并验证每一个区块的每一笔交易,维护完整状态
② 无状态客户端  验证每一笔交易,⭐ 但不保存状态(区块自带证明)
③ 轻客户端      只验证区块头,交易内容靠 Merkle 证明按需查
④ 信任 RPC      什么都不验证,别人说什么是什么

打个比方

这四层像你怎么确认一份财报是真的

① 全节点      自己把每一笔凭证都核一遍
② 无状态      每一笔都核,但核完不留档,凭证由对方随报表一起送来
③ 轻客户端    只核审计师的签章,具体某一项要用时再单独调凭证
④ 信任 RPC    ⚠️ 打电话问对方"你们赚钱了吗",然后记下来

⚠️ 第 ④ 层其实是今天绝大多数用户的真实状态——手机钱包、浏览器插件基本都在问某个服务商。第 3 讲讲过,这等于把去中心化交还给了运营商。

⚠️ 而最值得警惕的一点是:第 ④ 层用起来和第 ①③ 层一模一样。 界面上都是一个余额数字,没有任何提示告诉你这个数字是"算出来的"还是"听说的"——信任的降级是静默的,这也是它这么普遍的原因。

二、SPV:比特币的轻客户端

中本聪在白皮书第 8 节就设计了它:

① 下载全部区块头(第 9 讲:96 万 × 80 字节 ≈ 77 MB)
② 验证区块头链:每个 prev 对得上,每个 PoW 达标
③ 想确认某笔交易?向全节点要一个 Merkle 证明(第 5 讲:约 640 字节)
④ 用区块头里的 merkle_root 验证证明

手机就能跑,且不需要信任提供证明的那个节点——证明本身是自验证的。

但它多信任了什么

这一节是本讲最重要的部分。SPV 的信任假设比全节点强得多

① ⭐ 它完全不验证区块内容
   SPV 只检查"这个区块头的 PoW 达标"。
   至于区块里有没有凭空增发、有没有双花、脚本对不对——它一概不知。

② 于是它依赖的假设从"诚实多数会拒绝无效块"变成了
   "拥有多数算力的人不会制造无效块"。
   ⟹ 全节点:矿工造假块 → 我自己拒绝,攻击对我无效
   ⟹ SPV:  矿工造假块 → 我看到 PoW 达标 → 我接受

③ 隐私很差
   SPV 必须告诉全节点"我关心哪些地址"。
   BIP-37 用布隆过滤器模糊化,但研究表明它的隐私保护几乎无效,
   而且可以被用来 DoS 提供服务的全节点。

所以"跑全节点"和"跑 SPV"的差别不是性能偏好,是安全模型的差别。 这正是第 3 讲说"验证去中心化"最关键的原因。

能补救吗:欺诈证明

理想方案:如果某个块无效,让某个诚实的全节点给出一个简短的证明,让轻客户端也能确认它无效。

"这个块的第 37 笔交易花了一个不存在的 UTXO,这是证据"

但这撞上了一个根本问题:要生成欺诈证明,必须先拿到区块的完整数据。如果攻击者只发布区块头、藏起数据呢?

这就是「数据可用性问题」,第 29 讲会看到它是整个 Rollup 安全的真正瓶颈。

三、以太坊的轻客户端:同步委员会

以太坊转 PoS 后,“验证 PoW"这条路没了——轻客户端无法用工作量来判断哪条链是真的。

Altair 升级引入了同步委员会(sync committee)

每约 27 小时,随机选出 512 个验证者组成委员会。
他们对每个区块头做 BLS 签名(第 8 讲:可聚合成一个签名)。

⟹ 轻客户端只需:
   ① 知道当前委员会的公钥集合
   ② 验证一个聚合 BLS 签名
   ⟹ ⭐ 每 27 小时更新一次委员会即可跟上链头

⚠️ 但它的信任假设比 PoW 下的 SPV 更弱:

① 同步委员会作恶目前【不会被罚没】
   ⟹ 委员会成员签一个假区块头,几乎没有直接代价

② 512 个验证者是从上百万里随机选的
   ⟹ 需要控制相当大的质押比例才能拿到多数席位,但这是概率保证不是绝对保证

③ ⭐ 它同样不验证区块内容

所以以太坊轻客户端的路线是过渡性的。真正的目标是下一节。

四、无状态客户端:验证一切,但什么都不存

思路

回到第 12 讲:全节点最大的负担不是验证计算,而是维护那个几百 GB 的状态(随机 I/O、写放大、只增不减)。

那么——能不能不存状态,照样验证?

⭐ 做法:让区块自带"见证数据"(witness)

   区块 = 交易列表 + 【被这些交易访问到的所有状态项 + 它们的 Merkle 证明】

   验证者:
     ① 用见证数据里的证明,对着上一个区块的 stateRoot 验证这些状态确实存在
     ② 用这些状态执行交易,算出新的 stateRoot
     ③ 与区块头声明的 stateRoot 比对
   ⟹ 全程不需要本地保存任何状态 ✅

这是一个非常漂亮的转换:把「存储成本」变成了「带宽成本」。 而带宽是可以按需付费的,存储是永久负担。

它撞上的墙

问题出在见证数据的大小

一个以太坊区块大约访问几千个状态项。
MPT 深度约 7–8 层,分支因子 16。

⭐ 关键:证明一个叶子,每一层都要提供【15 个兄弟节点的哈希】
   (因为要重算这一层的哈希,必须知道所有 16 个孩子)

每个证明 ≈ 8 层 × 15 个兄弟 × 32 字节 ≈ 3.8 KB
几千个状态项 ⟹ 见证数据达到 MB 量级

每个区块几 MB 的额外数据,是不可接受的——它会直接压垮网络传播(第 9 讲第八节:大区块 ⟹ 孤块率上升 ⟹ 中心化)。

根本原因很清楚:哈希型 Merkle 树要求"想验证一个孩子,就得知道所有兄弟”。

五、Verkle 树:去掉兄弟

Verkle 树(Verkle = Vector commitment + Merkle)换掉了哈希,改用向量承诺

核心差别

Merkle 树(哈希):
   父节点 = H(孩子₀, 孩子₁, ..., 孩子₁₅)
   ⚠️ 要证明孩子₃,必须给出另外 15 个孩子的哈希

Verkle 树(向量承诺):
   父节点 = Commit(孩子₀, 孩子₁, ..., 孩子₂₅₅)
   要证明孩子₃,只需给出一个【常数大小】的证明,
      完全不需要提供任何兄弟节点

这一条差别改变了整个成本结构:

① 兄弟节点不用给了     ⟹ 每层的证明开销从 15×32 字节降到常数
② ⭐ 分支因子可以开大  ⟹ 从 16 提到 256(因为大分支不再增加证明成本)
③ 分支因子大 ⟹ 树更浅 ⟹ 深度从 8 降到约 4
④ 而且多个证明可以【聚合成一个】

综合下来,整个区块的见证数据从 MB 量级降到百 KB 量级——这才进入可传播的范围。

用的是什么承诺

主流方案是 IPA(内积论证)KZG(第 8 讲第三节提过)。它们的共同点:

✅ 承诺是一个椭圆曲线点(常数大小)
✅ 可以对"第 i 个位置的值是 v"给出常数大小的证明
✅ 多个证明可聚合

代价

Merkle Patricia Trie Verkle Trie
见证大小 MB 量级 百 KB 量级
树深度 7–8 约 4
计算开销 哈希,极快 椭圆曲线运算,慢得多
抗量子 是(只依赖哈希) (依赖离散对数)
实现复杂度
可信设置 不需要 KZG 需要,IPA 不需要

最值得注意的是"抗量子"那一行:MPT 只依赖哈希,量子计算机对它的威胁有限(Grover 算法只能开平方根);Verkle 依赖离散对数,Shor 算法能直接破解

所以长期路线上还有第三个方向:用 STARK 证明状态转移——STARK 只依赖哈希,抗量子,但证明生成成本高得多。这是第 28、32 讲的主题。

六、四个层次的完整对比

⭐ 把这张表和开头那个"怎么确认一份财报"对着看:每往下一层,你自己核的东西就少一样,换来的是更小的开销。 关键是知道自己站在哪一层——而不是以为自己在第 ① 层。

全节点 无状态客户端 轻客户端 信任 RPC
存储 数百 GB 几乎为零 ~百 MB 0
带宽 高(见证数据) 极低 极低
验证了什么 全部 全部 只有区块头 什么都没有
信任假设 只信自己 只信自己 多数算力/委员会诚实 信任服务商
能发现假区块吗 不能 不能

第二列是这条路线的目标:把全节点的安全性,用轻客户端级别的资源实现。

七、还有一件事:弱主观性

无论哪种客户端,都有一个共同的启动问题:

一个刚装好的节点,从零开始同步。
它收到两条声称是"主链"的链,⚠️ 怎么知道该跟哪条?

PoW:比较累计工作量,选大的那条。⟹ 客观,不需要外部信息
PoS:制造一条假链几乎不花成本(第 18 讲的 long-range attack)
     ⟹ 无法只靠链上数据判断

所以 PoS 客户端必须从外部获得一个「弱主观性检查点」——一个近期的、被认为可信的区块哈希:

可以来自:客户端内置、朋友告知、区块浏览器交叉比对
⟹ 从这个点往后同步就是客观的了

⚠️ 这是 PoS 相对 PoW 一个真实的、不可消除的额外假设。第 18 讲会展开为什么它无法避免。

八、本讲小结

  • 四个层次:全节点、无状态客户端、轻客户端、信任 RPC。今天绝大多数用户其实在第四层。
  • SPV = 下载全部区块头(77 MB)+ 按需要 Merkle 证明,手机可跑,且证明本身自验证。
  • ⭐⚠️ 但 SPV 完全不验证区块内容。它的假设从"诚实多数会拒绝无效块"退化成了"多数算力不会制造无效块"——这是安全模型的差别,不是性能偏好。
  • ⚠️ BIP-37 布隆过滤器的隐私保护几乎无效,且可被用来 DoS 全节点。
  • 欺诈证明能补救 SPV,但它需要数据可用——攻击者只发头、藏数据就能让欺诈证明无法生成。这是第 29 讲的核心问题。
  • 以太坊同步委员会让轻客户端只验证一个聚合 BLS 签名,但委员会作恶目前不被罚没,信任假设比 PoW 下的 SPV 更弱。
  • 无状态客户端把「存储成本」换成「带宽成本」:区块自带见证数据,验证者不保存任何状态。
  • 它撞上的墙是见证太大:MPT 每层要给 15 个兄弟哈希,一个区块的见证达到 MB 量级,会压垮网络传播。
  • Verkle 树用向量承诺代替哈希,证明一个孩子不需要提供任何兄弟。 于是分支因子能从 16 开到 256,树深从 8 降到 4,证明还能聚合——见证降到百 KB 量级。
  • Verkle 的代价:计算慢得多、实现复杂、且不抗量子(依赖离散对数,Shor 算法可破)。MPT 只依赖哈希,量子威胁有限。
  • PoS 必须有弱主观性检查点:新节点无法只靠链上数据判断哪条链是真的,必须从外部获得一个近期可信的区块哈希。这是 PoS 相对 PoW 不可消除的额外假设。

思考题

  1. SPV 客户端收到一个包含"凭空增发 100 万 BTC"的区块,且 PoW 达标。它会接受吗?全节点呢?请说明这个差别的意义。
  2. 为什么说"跑全节点"是一种安全选择而不是性能选择?在什么攻击场景下这个差别会真实兑现?
  3. 欺诈证明要求什么前提?为什么"只发布区块头"就能让整个方案失效?
  4. 同步委员会的信任假设比 PoW 下的 SPV 弱在哪里?如果给委员会加上罚没,能补上多少?
  5. 无状态客户端把存储换成带宽。这个交换在什么情况下划算,什么情况下不划算?
  6. 详细说明为什么 Merkle 证明必须提供兄弟节点。如果分支因子从 16 提到 256,MPT 的证明会变大还是变小?为什么?
  7. Verkle 树能去掉兄弟节点,根本原因是什么?用"向量承诺"和"哈希"的性质差别来回答。
  8. Verkle 不抗量子而 MPT 抗量子。这对以太坊的长期路线意味着什么?STARK 方案在这个权衡里处于什么位置?
  9. 一个新装的 PoS 节点收到两条链,都有合法签名。它能只靠链上数据分辨吗?弱主观性检查点从哪里来才算安全?