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