覆盖第 9–20 讲


题 1 区块头与轻客户端

(a) 比特币区块头为什么恰好 80 字节且与交易数无关?这个性质对轻客户端意味着什么?

(b) 以太坊头里有三个根。分别说明它们承诺了什么,以及比特币缺少哪一个、后果是什么。

(c) 相邻两个比特币区块的时间戳可以倒序吗?给出一个合法的例子。

解答

(a) 因为交易本身不在头里,头里只有它们的 Merkle 根(32 字节,与交易数无关)。

⭐ 轻客户端只下载头:96 万块 × 80 字节 ≈ 77 MB
⟹ 能装进任何一部手机
⟹ 配合 Merkle 证明(约 640 字节)即可验证任意一笔交易的包含性

而完整区块数据是数百 GB。80 字节这个设计不是巧合,白皮书第 8 节就是为它写的。

(b)

transactionsRoot ── 承诺"发生了什么"(输入)
stateRoot        ── ⭐ 承诺"现在是什么样"(全部账户与存储)
receiptsRoot     ── 承诺"执行产生了什么"(日志、Gas、成败)

⚠️ 比特币缺少 stateRoot 它的"状态"是 UTXO 集合,而这个集合不被承诺在区块里

⟹ ⭐ 比特币轻客户端无法验证"某地址在某高度的余额是多少"——
   没有任何根可以用来对照 Merkle 证明。
   它只能验证"某笔交易在某块里"。

(c)可以。 规则只有两条:大于前 11 块时间戳的中位数,且小于网络时间 +2 小时。

例:前 11 块时间戳中位数 = 1000
    区块 N   时间戳 = 1600      (> 1000 ✅)
    区块 N+1 时间戳 = 1200      (> 1000 ✅,⚠️ 但比 N 早 400 秒)
⟹ 两条规则都满足,完全合法

所以链上时间戳既非单调也不精确,实际精度只有小时级。


题 2 UTXO 与账户模型

(a) 为什么 UTXO 交易可以并行验证而以太坊合约调用不能?

(b) 为什么 UTXO 模型很难实现 AMM?请具体描述两个用户同时交易时会发生什么。

(c) Solana 用账户模型却能并行。它付出了什么代价?

解答

(a)

⭐ UTXO 交易【显式列出】了它读写的全部状态——就是那几个 OutPoint。
⟹ 调度器不必执行就知道两笔交易是否冲突
⟹ 读写集不相交的交易可以任意并行

以太坊的合约调用在【执行之前】无法知道会碰哪些存储槽:
   合约可以根据链上数据动态决定调用谁、写哪个槽。
⟹ 只有执行完才知道读写集,而那时已经晚了

(b)

AMM 池子在 UTXO 下只能表示成【一个 UTXO】(储备就是它的内容)。

Alice 和 Bob 同时想交易:
   两人都构造交易花掉【同一个池子 UTXO】
   ⟹ ⭐ 这两笔交易互为双花
   ⟹ 只有一个能进块,另一个必然失败,必须重新构造

⚠️ 高并发下几乎不可用:每个区块只能有一笔交易与该池子交互。这不是实现难度问题,是"UTXO 必须整体花费"这个模型本质的直接后果。

(c)

⭐ 代价:交易必须【预先声明】它会读写的所有账户。

① 开发者必须提前知道所有可能触碰的账户
   而动态调用(合约根据数据决定调哪个合约)下这很难精确知道
② 声明不足 ⟹ 交易失败
   声明过多 ⟹ 保守声明导致虚假冲突,并行度下降

本质上,Solana 把 UTXO 的"显式读写集"这个优点移植到了账户模型上,代价是把复杂度推给了开发者。


题 3 MPT 的键哈希化

(a) 如果以太坊直接用地址而不是 keccak256(地址) 做键,写出一个 DoS 攻击方案。

(b) 估算攻击者需要多少工作量。

(c) 键哈希化的代价是什么?为什么它让磁盘 I/O 成为瓶颈?

解答

(a)

① 攻击者暴力搜索大量【具有超长公共前缀】的地址
   (比如全部以 0x0000000000 开头)
② 给这些地址各转一点 ETH,让它们进入状态树
③ ⭐ 这些账户在树里形成一条【极深】的路径
④ 写一个合约,在循环里访问这些账户
⟹ 每次访问的开销是 O(深度),而 Gas 按固定价格收
⟹ 攻击者用很少的 Gas 换取了不成比例的计算与 I/O

(b)

构造一个前 n 个十六进制字符固定的地址,
期望需要尝试 16ⁿ 次。

n = 10 ⟹ 16¹⁰ ≈ 1.1 × 10¹²  ← ⭐ 普通 GPU 几小时内可完成

⚠️ 而每个这样的地址只需付一次转账的 Gas。攻击成本极低,收益是让全网节点的每次访问都变慢。

(c)代价是完全丧失局部性。

哈希把键均匀打散到 2²⁵⁶ 空间:
   ⟹ ✅ 深度期望 O(log₁₆ N),攻击者无法做深
   ⟹ ⚠️ 但逻辑上相邻的账户,在树里和磁盘上的位置【毫无关系】

⟹ 每次状态访问都是一次随机 I/O,没有任何预读或缓存友好性
⟹ 这就是以太坊全节点必须用 NVMe 的直接原因

题 4 无状态客户端的见证大小

一个区块访问 3000 个状态项。MPT 深度 8,分支因子 16。

(a) 估算见证数据大小。

(b) 如果深度增加到 10,变成多少?

(c) Verkle 树为什么能降到百 KB 量级?它的代价是什么?

解答

(a)

⭐ 关键:Merkle 证明的每一层都要提供【其余 15 个兄弟】的哈希,
   因为要重算这一层的哈希必须知道全部 16 个孩子。

每层:15 × 32 = 480 字节
每项:480 × 8 = 3,840 字节 ≈ 3.75 KB
3000 项:3,840 × 3000 ≈ 11.5 MB

⚠️ 每个区块额外 11.5 MB——这会直接压垮网络传播(第 16 讲:孤块率 ≈ 传播时间/出块间隔)。

(b)

480 × 10 × 3000 ≈ 14.4 MB

注意它随深度线性增长,而深度随状态规模对数增长——状态越大,无状态方案越难。

(c)

⭐ Verkle 用向量承诺代替哈希:
   证明"第 i 个孩子的值"只需一个【常数大小】的证明,
   完全不需要提供任何兄弟节点。

由此连锁产生三个收益:
   ① 每层开销从 480 字节降到常数
   ② 分支因子可以从 16 开到 256(大分支不再增加证明成本)
   ③ 分支因子大 ⟹ 深度从 8 降到约 4
   ④ 多个证明还能聚合成一个
⟹ 整体降到百 KB 量级

⚠️ 代价:

① 计算慢得多(椭圆曲线运算 vs 哈希)
② 实现复杂度高
③ ⭐⚠️ 不抗量子 —— 它依赖离散对数,Shor 算法可破;
   而 MPT 只依赖哈希,量子威胁有限

题 5 出块间隔的分布

(a) 计算 P(间隔 > 45 分钟)

(b) 观察到连续三个间隔都超过 30 分钟,这异常吗?

(c) 已经等了 20 分钟。下一个 10 分钟内出块的概率是多少?

解答

(a)

45 分钟 = 2700 秒,均值 600 秒
P(T > 2700) = e^(−2700/600) = e^(−4.5) ≈ ⭐ 1.11%

(b)

P(单次 > 30 分钟) = e^(−3) ≈ 4.98%
⭐ 若三次独立:0.0498³ ≈ 1.23 × 10⁻⁴ ≈ 万分之一

比特币每天出 144 个块 ⟹ 每天约有 142 组"连续三个"
⟹ 期望约每 【20 天】出现一次

所以不异常。 但要注意"连续三次"的独立性假设——如果同时观察到算力大幅下降,那就是另一回事。

(c)

⭐ 指数分布无记忆:
P(T ≤ 30 分钟 | T > 20 分钟) = P(T ≤ 10 分钟) = 1 − e⁻¹ ≈ 63.2%

与"刚出完块时"完全相同。“等得越久越快出块"是错的。


题 6 确认数与双花

攻击者算力占比 q = 25%

(a) 6 个确认时的双花成功概率是多少?

(b) 要把风险压到 0.1% 以下需要多少确认?

(c) 白皮书模型有三个假设。现实中交易所会暂停充值,这会怎样改变结论?

解答

(a) 用白皮书第 11 节的泊松竞赛公式:

q = 0.25,z = 6  ⟹  ⭐ 约 4.99%

⚠️ 对比 q = 10% 时 6 个确认只有 0.024%——攻击者算力从 10% 涨到 25%,同样 6 个确认的风险涨了 200 倍。

(b)

z = 10 ⟹ 0.845%
z = 15 ⟹ ⭐ 0.094%      ← 首次低于 0.1%
z = 20 ⟹ 0.011%
z = 30 ⟹ 0.0001%

答案:15 个确认。q = 10% 时只需 6 个——确认数必须按"你假设的攻击者算力"来定,而后者又取决于交易金额。

(c) 三个假设是:攻击者算力固定、诚实方不响应、目的是双花。

⭐ "交易所暂停充值"直接推翻第二条,后果是:
   ① 攻击者的时间窗口被压缩——他必须在被发现前完成变现
   ② 而深度重组【必然被观察到】(区块浏览器会显示)
   ⟹ 实际攻击难度远高于模型给出的概率

但反过来说:
   这意味着安全性的一部分依赖于【链外的人在监控和反应】,
      而不是纯粹的协议保证。

题 7 自私挖矿

(a) 写出阈值公式,并计算 γ = 0、0.25、0.5、1 时的值。

(b) 攻击者能用什么手段提高自己的 γ?

(c) 为什么现实中很少发生?这些约束在什么条件下会失效?

解答

(a)

α > (1 − γ) / (3 − 2γ)

γ = 0     ⟹ 1/3     = ⭐ 33.3%
γ = 0.25  ⟹ 0.75/2.5 = 30%
γ = 0.5   ⟹ 0.5/2    = 25%
γ = 1     ⟹ 0/1      = 0(趋近于零)

真正的安全阈值不是 50%,而是 25% 左右——且网络条件越好,门槛越低。

(b)

γ 是"平局时跟随攻击者区块的诚实算力比例",
⭐ 它取决于攻击者的块能多快传遍全网。

手段:
   ① 与尽可能多的节点建立直连(大量 outbound 连接)
   ② 在全球多地部署中继节点
   ③ 使用专用的区块传播网络
   ④ 极端做法:对竞争对手的传播路径做延迟攻击

(c)

① ⭐ ASIC 资产被绑定在这条链上——攻击成功会摧毁自己的设备价值
② 声誉成本:矿池会流失矿工
③ 需要极好的网络连接才能拉高 γ
④ 异常的孤块模式可被观察到

⚠️ 这些约束会在下面的条件下失效:

⭐ 一条没有 ASIC(GPU 可挖)、矿工匿名、且算力可租用的链:
   ① 无资本绑定 ⟹ 攻击后设备转去挖别的
   ② 无声誉成本 ⟹ 匿名
   ③ 租算力可以临时集中
⟹ 这正是小市值 PoW 链反复被攻击的原因(第 17 讲)

题 8 安全预算与减半

(a) 手算比特币总量的等比级数。为什么实际略少于 2100 万?

(b) 当前区块奖励 3.125 BTC,算出每天的安全预算(以 BTC 计)。

(c) 区块奖励归零后的问题,为什么"总量够不够"不是最严重的那一个?

解答

(a)

总量 = 210,000 × (50 + 25 + 12.5 + 6.25 + …)
     = 210,000 × 50 × (1 + ½ + ¼ + …)
     = 210,000 × 50 × 2          ⭐ 等比级数收敛到 2
     = 21,000,000

⚠️ 实际略少,因为奖励以(整数)为单位存储,每次减半用整数除法都会截断:

50 BTC = 5,000,000,000 聪,右移 33 次后变成 0
⭐ 而中间每一次奇数除法都会丢掉半聪
⟹ 累积下来总量约 20,999,999.98 BTC

(b)

每天出块数 = 86,400 / 600 = 144
每天新发行 = 144 × 3.125 = ⭐ 450 BTC
加上手续费(正常时段约占 1–5%)

这 450 BTC 就是攻击这条链每天大致需要投入的资源量。

(c) 更严重的是"手续费和区块奖励的性质不同”。

区块奖励:⭐ 每块【完全相同】,且与打包内容无关
   ⟹ 所有区块高度对矿工是等价的
   ⟹ 大家都去挖链尾,共识稳定

手续费:每块【差别巨大】,取决于内存池积压
   ⟹ 区块之间不再等价
   ⟹ 当上一块手续费很高而内存池已空时,
      【重挖上一块】比挖新块更赚
   ⟹ 矿工有动机【分叉而非延长链】

⭐⭐ 这破坏了最长链共识的一个隐含前提——“延长链总是最优策略”。而这不是"钱不够",是机制本身失效,无法靠调参数解决。


题 9 PoS 罚没条件判定

某验证者在不同 epoch 提交了以下投票(格式:source epoch → target epoch):

投票 A:  4 → 8
投票 B:  6 → 7
投票 C:  4 → 9
投票 D:  10 → 11
投票 E:  9 → 11

(a) 哪些投票对构成可罚没的行为?分别属于哪一类?

(b) 该验证者还有一次掉线未投票。这会被罚没吗?

(c) 如果同时有 1/3 的验证者犯了同样的错误,惩罚会有什么不同?

解答

(a)

⚠️ A(4→8) 与 B(6→7):环绕投票
   A 的区间 [4,8] 严格包住 B 的区间 [6,7]
   (4 < 6 且 7 < 8)
   ⟹ 可罚没

✅ A(4→8) 与 C(4→9):不构成罚没
   目标 epoch 不同(8 ≠ 9)⟹ 不是双重投票
   区间 [4,8] 与 [4,9],source 相同 ⟹ 不构成严格包含
   (环绕要求 source 严格小于且 target 严格大于)

C(4→9) 与 B(6→7):环绕投票
   4 < 6 且 7 < 9 ⟹ 严格包含 ⟹ 可罚没

✅ D(10→11) 与 E(9→11):目标 epoch 相同都是 11,
   但双重投票要求"同一目标 epoch 投了两个【不同的目标区块】"。
   题目只给了 epoch,若两者指向【同一个区块】则不构成双重投票;
   若指向不同区块则构成。判定需要区块根,不能只看 epoch。

答案:(A,B)(C,B) 确定可罚没(环绕投票);(D,E) 需要区块根才能判定。

(b)不会。 以太坊的罚没条件只有两条:双重提议、双重/环绕投票。

⭐ 离线只会损失【应得的奖励】(惩罚额度大致等于在线本可获得的收益),
   不会没收本金。

设计理由:
   离线 = 没帮上忙 ⟹ 不给奖励就够了
   双签 = 主动攻击 ⟹ 必须没收本金

(c) 相关性惩罚会让后果完全不同。

只有一个人被罚:初始罚没(约有效余额的 1/32)+ 极小的相关性惩罚
                ⟹ 损失很小,符合"这是个配置事故"的判断

1/3 同时被罚:⚠️ 相关性惩罚与"同期被罚总量"成比例
              ⟹ 质押几乎【全部损失】

这个设计同时做到两件事:区分个人失误与协同攻击;并让"大家都用同一个客户端"变得极其昂贵——因为一个软件 bug 会让他们【同时】被罚。用经济激励换来了实现多样性。


题 10 Casper FFG 与可问责安全性

(a) 从 epoch 10 开始,写出 epoch 10、11、12 各自的证成与最终确定状态变化。

(b) 证明:要让两个冲突的检查点都被最终确定,至少 1/3 的总质押必须可被罚没。

(c) “经济最终性"和"概率最终性"的不确定性各来自哪里?

解答

(a) 假设 epoch 9 的检查点已是 justified。

epoch 10 结束:
   收到 >2/3 质押的投票链接 (9 → 10)
   ⟹ ⭐ 检查点 10 变成 justified
   ⟹ 检查点 9 变成 finalized(9 和 10 是相邻 epoch,且都 justified)

epoch 11 结束:
   收到 >2/3 的 (10 → 11)
   ⟹ 检查点 11 justified
   ⟹ 检查点 10 finalized

epoch 12 结束:
   收到 >2/3 的 (11 → 12)
   ⟹ 检查点 12 justified,检查点 11 finalized

稳态下每个 epoch 最终确定一个检查点,延迟约 2 个 epoch ≈ 12.8 分钟。

(b)

设冲突的检查点 A 和 B 都被最终确定。
⟹ 各自都需要 > 2/3 的质押投票支持。

设支持 A 的集合为 S_A,支持 B 的为 S_B:
   |S_A| > 2/3 ,|S_B| > 2/3
   ⟹ |S_A ∩ S_B| > 2/3 + 2/3 − 1 = ⭐ 1/3

交集中的验证者,同时为两条冲突的历史投了票
⟹ 他们必然犯了【双重投票】或【环绕投票】
⟹ 全部可被罚没

⟹ 至少 1/3 的总质押可被罚没。∎

这正是第 19 讲法定人数交集论证的一个直接应用。

(c)

概率最终性(PoW):
   ⭐ 不确定性来自【随机性】——
   攻击者【有可能】幸运地连续挖出更多块。
   无论等多少个确认,这个概率永不为零,
      只是指数衰减。

经济最终性(PoS):
   不确定性来自【经济理性】——
   回滚在技术上完全可行,
   但它会销毁至少 1/3 的总质押(且因相关性惩罚接近全损)。
   ⟹ 不是"做不到",是"代价确定且极高"。

⭐⭐ 后者更强,因为代价是【确定的、可计算的、且会被真的执行】,而不是一个概率。

但它也诚实地承认:最终性不是物理定律,是一个足够贵的价签。


题 11 网络层与出块间隔

某链有 5 万个节点,每节点 16 个邻居,每跳物理延迟 60 ms、验证耗时 25 ms,区块 2 MB,节点带宽 200 Mbps。出块间隔 6 秒。

(a) 求 gossip 跳数与传播时间,并给出孤块率。

(b) 引入紧凑区块后每跳只需传 30 KB。重算这三个量。

(c) 该链希望把孤块率控制在 1% 以内。在 (b) 的条件下,出块间隔至少要多长?

(d) 团队否决了 (c),理由是"6 秒出块是我们的核心竞争力,孤块率高一点无所谓,反正会自动收敛”。请评价这个理由。

(e) 该链用 PoS。有人说"我们不是 PoW,孤块率不影响去中心化"。请回应。

解答

(a) 跳数 = ln(50000)/ln(16) = 10.820/2.773 = 3.90

传输时间 = 2 MB / 25 MB/s = 80 ms
每跳     = 60 + 25 + 80 = 165 ms
传播时间 = 3.90 × 165 ms ≈ 644 ms
孤块率   ≈ 0.644 / 6 = 10.7%

(b) 传输时间降到 30 KB / 25 MB/s = 1.2 ms

每跳     = 60 + 25 + 1.2 = 86.2 ms
传播时间 ≈ 336 ms
孤块率   ≈ 0.336 / 6 = 5.6%

注意紧凑区块把传输时间砍掉了 98%,孤块率却只降了一半——因为剩下的物理延迟和验证时间根本不受它影响。这正是第 14 讲那个三项分解的用处:优化之前先看清自己在优化哪一项,以及那一项占多大比重。

(c) 出块间隔 ≥ 0.336 / 0.01 = 33.6 秒

⚠️ 也就是说,要达到 1% 的孤块率,出块间隔得比现在慢五倍以上。 这个数字本身就是对 (d) 的回答。

(d) 这个理由错在两个地方:

① "会自动收敛"是对的,但它回答的是【安全性】问题,
   而孤块率损害的是【去中心化】—— 这是两件事。

   分叉确实会在几个块内收敛。问题不在分叉本身,
   在于⭐【谁的块更容易成为被丢掉的那一个】。

② 孤块率不是均匀分摊的。
   网络位置差的小节点,其区块到达其他节点更慢
      ⟹ 更容易在竞争中落败
      ⟹ 实际收益低于其算力/质押份额
      ⟹ 长期看,理性的小节点会把资源委托给大机构

⟹ ⭐ 10.7% 的孤块率不是"偶尔浪费一个块",
   而是一个【持续作用在小节点身上的负向激励】。

更根本的一点:这条链的"6 秒出块"是用网络裕度换来的。第 14 讲的表里,比特币的裕度约 600×,以太坊约 10×,而这条链是 6 / 0.336 ≈ 18×(紧凑区块下)或 6 / 0.644 ≈ 9×(完整区块下)。它不是发明了更快的技术,是在同一条权衡曲线上取了一个更激进的点,代价记在了去中心化那一栏。

(e) 这个回应半对半错,要分开说。

✅ 对的部分:PoS 下没有"算力被浪费"这回事。
   验证者不会因为出了一个孤块而损失掉已经烧掉的电。

❌ 错的部分:⭐ 收益的不对称仍然存在。
   出块奖励和 MEV 都归入主链的那个块所有。
   网络位置差的验证者,其区块更容易被丢弃
      ⟹ 单位质押的期望收益更低
      ⟹ 同样导致向"网络位置好的大机构"集中。

⚠️ 而且 PoS 链通常出块间隔更短、网络裕度更小,
   这个效应往往【比 PoW 更强】而不是更弱。

一般化的教训共识机制决定谁有权出块,网络层决定谁的块更容易被接受。后者与前者正交,换共识机制并不能免疫。


相关第 9–20 讲