覆盖第 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 讲