⚠️ 本页是本课程的复习总纲。建议在期中前两周和期末前两周各完整过一遍。


一、⭐ 必背公式卡

建议直接抄到 cheat sheet 第一页。

密码学原语(第 4–8 讲)

生日界      找碰撞的期望尝试次数 ≈ 2^(n/2)
              ⭐ 256 位哈希 ⟹ 2¹²⁸,抗碰撞强度是位数的【一半】

域分隔      leaf = H(0x00 ‖ x)      node = H(0x01 ‖ 左 ‖ 右)
              ⚠️ 不加前缀 ⟹ CVE-2012-2459 类的伪造

Merkle 证明 大小 = 32 × ⌈log₂ n⌉ 字节

secp256k1   y² = x³ + 7   over  p = 2²⁵⁶ − 2³² − 977
ECDSA 签名  s = k⁻¹(z + r·d)         验证 R' = z s⁻¹ G + r s⁻¹ Q
  ⭐ k 重用   k = (z₁−z₂)/(s₁−s₂)  ⟹  d = (s₁k − z₁)/r
  可延展性   (r, s) 有效 ⟹ (r, n−s) 也有效  ⟹ 低 s 规范化

Schnorr     s = k + e·d              e = H(R ‖ P ‖ msg)
  ⭐ 抽取器   x = (s₁−s₂)/(e₁−e₂)     ← 特殊可靠性的构造性证明
BLS         σ = d·H(m)               验证 e(σ,G) == e(H(m),Q)
Pedersen    C = x·G + r·H            加法同态、完美隐藏

网络与共识(第 14–20 讲)

gossip 跳数   ≈ log_d(n)              (d=邻居数,n=节点数)
⭐ 传播时间   ≈ 跳数 × (物理延迟 + 验证时间 + 传输时间)
                          ↑ 只有【传输时间】能靠加带宽改善
⭐ 孤块率     ≈ 传播时间 / 出块间隔
⭐ 出块间隔   = 传播时间 × 安全系数    (BTC≈600×,ETH≈10×)

PoW 出块      指数分布,均值 = 出块间隔
              P(T>600s)=36.8%   P(T>1800s)=5.0%   P(T>3600s)=0.25%
              ⭐ 无记忆性:已等 t 分钟不改变后续分布
难度调整      新目标 = 旧目标 × 实际耗时/20160分钟   限幅 [1/4, 4]
算力反推      算力 ≈ D × 2³² / 600
难度 1 目标   0xFFFF × 2²⁰⁸

⭐ 自私挖矿阈值  α > (1−γ)/(3−2γ)
              γ=0 ⟹ 33.3%    γ=0.5 ⟹ 25%    γ=1 ⟹ →0
⭐ BFT 边界   n ≥ 3f + 1      法定人数 q = ⌈(n+f+1)/2⌉,常取 2f+1
   交集论证   |A∩B| ≥ 2q − n > f   ⟹ 交集必含诚实节点

执行与扩容(第 21–31 讲)

⭐ 核心不等式  T ≤ R / c
               T=吞吐  c=每笔交易验证开销  R=普通人机器承受上限
c 的四个分量   带宽与传播 / 状态增长 / 新节点同步时间 / 重执行

EIP-1559       新基础费 = 旧 × (1 + (gasUsed − target)/target/8)
               ⭐ 每块最多 ±12.5%,满块 ⟹ 约 6 个块翻倍
调用深度       每层最多传 63/64 的剩余 Gas ⟹ 深度实际被限在 ~1024
内存扩展       cost = 3a + a²/512      (a = 字数)⭐ 二次项

⭐ 二分轮数    ⌈log₂(步数)⌉           ⚠️ 向上取整
               一百万步 ⟹ 20 轮;四百万步 ⟹ 22 轮
⭐ DA 采样     失败概率 = (1/2)ᵏ       k=30 ⟹ ≈ 1e−9
               前提:纠删码逼迫攻击者必须藏起【超过一半】

⭐ 恒定乘积池  x·y = L²,p = y/x
   推到 k 倍   需投入 ΔY = y·(√k − 1)          (k=2 ⟹ 0.414y)
   TWAP 攻击   现货倍数 = (k·window − (window−hold)) / hold
               30 分钟窗口、维持 12 秒、目标 2 倍
                  ⟹ 现货 151 倍、需 11.3 倍储备(约现货操纵的 27 倍)

其它常用数

比特币总量     20,999,999.9769 BTC   ← 210000 × 50 × 2 的等比和(整数截断后)
以太坊 slot    12 秒     epoch = 32 slot = 6.4 分钟
质押门槛       32 ETH
SLOAD 冷读     2100      SSTORE 零→非零 20000      非零→非零 5000(退 2900)
Schwartz–Zippel  Pr[误判] ≤ d / |F|

二、⭐ 高频考点清单

星级含义:⭐⭐⭐ 几乎必考 | ⭐⭐ 常考 | ⭐ 可能考

Unit 1 · 问题与信任模型

考点 星级 一句话要点
双花是排序问题 ⭐⭐⭐ 难的不是"防止复制",是在没有权威的情况下给两笔冲突交易定先后
FLP 不可能性 ⭐⭐⭐ 异步 + 哪怕一个崩溃故障 ⟹ 没有确定性算法能同时保证安全与活性
绕过 FLP 的三条路 ⭐⭐ 随机化 / 部分同步 / 故障检测器——都是放松假设,不是推翻定理
n ≥ 3f+1 的推导 ⭐⭐⭐ 要能自己推:等待 n−f,其中可能 f 个是拜占庭
三角不是定理 ⭐⭐ 它是工程观察,反例与形式化困难都要能说

Unit 2 · 密码学原语

考点 星级 一句话要点
三种抗性的区别与强弱 ⭐⭐⭐ 抗碰撞 ⟹ 抗第二原像,反之不然
生日界 ⭐⭐⭐ 2^(n/2),会算具体年份
CVE-2012-2459 ⭐⭐⭐ 奇数叶子复制末位 ⟹ 不同交易集同根;域分隔如何修
ECDSA 的 k 重用 ⭐⭐⭐ 两条公式默写 + 会算数
可延展性 ⭐⭐ (r, n−s),与交易 ID 的关系
Schnorr 的线性性 ⭐⭐ 为什么能聚合,ECDSA 为什么不能
VRF vs VDF ⭐⭐ 前者不可预测且可验证,后者不可并行

Unit 3 · 账本与状态

考点 星级 一句话要点
区块头每个字段的作用 ⭐⭐ 尤其 version(软分叉信号)与两个 root
UTXO vs 账户 ⭐⭐⭐ 并行性、隐私、状态大小、重放——四个维度分别谁赢
nonce 的双重作用 ⭐⭐ 防重放 + 定序;CREATE2 为什么能预测地址
MPT 的三种节点与 HP 编码 ⭐⭐⭐ 会画一棵小树,会解释奇偶半字节
安全树(secure trie) ⭐⭐ 为什么对 key 先哈希——防止有人构造深路径攻击
无状态与 Verkle ⭐⭐ 证明大小从 log₁₆ 降到 log₂₅₆ 的量级差

Unit 4 · 网络与共识

考点 星级 一句话要点
传播时间的三项分解 ⭐⭐⭐ 只有传输时间能靠带宽改善,这是扩容论证的地基
gossip 跳数与验证的冲突 ⭐⭐ 必须先验证再转发,否则放大 n 倍 DoS
Eclipse 攻击打的是什么 ⭐⭐⭐ 打的是共识证明的前提,不是算法;PoW/PoS 都不免疫
出块间隔怎么定 ⭐⭐⭐ = 传播时间 × 安全系数,会填那张三链对照表
指数分布与无记忆性 ⭐⭐⭐ 三个概率值默写,会回应"半小时没出块是不是出事了"
难度调整与 off-by-one ⭐⭐ 2015 vs 2016 的那个 bug 及其累积效应
自私挖矿阈值 ⭐⭐⭐ 公式 + 状态机 + 为什么 state=2 要特殊处理
51% 能与不能 ⭐⭐⭐ 不能凭空造币、不能改别人的签名
无利害关系与弱主观性 ⭐⭐⭐ PoS 的两个特有问题,罚没与检查点分别解决哪个
PBFT 三阶段少一个会怎样 ⭐⭐⭐ 去掉 COMMIT ⟹ 视图切换后不一致,要能构造场景
Gasper 的两个组件分工 ⭐⭐⭐ LMD-GHOST 管活性,Casper FFG 管最终性
可归责安全性 ⭐⭐ 违反最终性 ⟹ 必然有 1/3 质押可被没收

三、期中模拟题(第 1–20 讲)

建议限时 120 分钟闭卷,只带一页 cheat sheet。

第 1 题(15 分) 某链出块间隔 15 秒,全网 3 万个节点,每节点 10 个邻居,每跳物理延迟 40 ms、验证 15 ms,区块 400 KB,带宽 50 Mbps。 (a) 求 gossip 跳数与传播时间。 (b) 求孤块率。 (c) 若改用紧凑区块把每跳传输量降到 8 KB,孤块率变成多少? (d) 该链想把出块间隔降到 3 秒。从孤块率的角度评价这个决定。

(a) 跳数 = ln(30000)/ln(10) = 10.309/2.303 = 4.48。 传输时间 = 400 KB / 6.25 MB/s = 64 ms。每跳 = 40 + 15 + 64 = 119 ms。 传播时间 = 4.48 × 119 ≈ 533 ms

(b) 孤块率 ≈ 0.533 / 15 = 3.55%

(c) 每跳 = 40 + 15 + 1.28 = 56.3 ms,传播 ≈ 252 ms,孤块率 ≈ 1.68%

(d) 传播时间不变(它由网络决定,不由出块间隔决定),所以孤块率变成 0.252/3 = 8.4%(紧凑区块下)或 17.8%(完整区块下)。 ⭐ 关键论证:孤块率上升直接转化为小矿工/小验证者的劣势——他们的块更容易成为孤块,收益低于算力份额,于是算力向大机构集中。“出块快"这个改进是用去中心化付的账,而这一项不会出现在性能对比图里。

第 2 题(12 分) 一个矿工用同一个 k 签了两笔交易,z₁ = 100z₂ = 200s₁ = 37s₂ = 15r = 91,曲线阶 n = 199。 (a) 求 k。 (b) 求私钥 d。 (c) 说明为什么 RFC 6979 的确定性 k = HMAC(d, z) 能杜绝这个问题,以及它带来了什么新的注意事项。

(a) k = (z₁−z₂)/(s₁−s₂) = (100−200)/(37−15) = (−100)·22⁻¹ mod 199

用扩展欧几里得求 22⁻¹199 = 9×22 + 1 ⟹ 1 = 199 − 9×22 ⟹ 22⁻¹ ≡ −9 ≡ 190。 (验算 22×190 = 4180 = 21×199 + 1 ✅)

−100 mod 199 = 99,所以 k = 99 × 190 mod 199 = 18810 mod 199 = 104

(b) d = (s₁k − z₁)·r⁻¹ mod n = (37×104 − 100)·91⁻¹ = 3748 · 91⁻¹ mod 1993748 mod 199 = 16691⁻¹ mod 199 = 3591×35 = 3185 = 16×199 + 1 ✅)。 d = 166 × 35 mod 199 = 5810 mod 199 = 39

一定要回代验算k⁻¹ = 155s₁ = 155×(100 + 91×39) mod 199 = 37 ✅,s₂ = 155×(200 + 91×39) mod 199 = 15 ✅。两条都对上,说明 kd 都没算错。

(c) 确定性 k 让相同 (d, z) 必然产生相同的 k——但不同消息的 z 不同,所以 k 不会重复。 ⚠️ 新注意事项:签名过程变成完全确定的,于是故障注入攻击变得可行——攻击者让同一条消息签两次,第二次注入一个比特翻转,两个签名的差就泄露私钥。所以硬件钱包仍需故障检测。

第 3 题(12 分) n = 7 的 PBFT 系统。 (a) 最大容错 f 是多少?法定人数取多少? (b) 用交集论证证明两个法定人数的交集必含诚实节点。 (c) 若有人提议"把法定人数降到 4 来提速”,请构造一个具体的场景说明安全性被破坏。

(a) f = ⌊(7−1)/3⌋ = 2,法定人数 q = 2f+1 = 5

(b) |A∩B| ≥ |A| + |B| − n = 5 + 5 − 7 = 3 > f = 2。交集至少 3 个节点,而拜占庭最多 2 个 ⟹ 至少一个诚实节点同时在两个法定人数里,它不会为两个冲突的值都投票。

(c) q = 4|A∩B| ≥ 4+4−7 = 1,交集可能恰好只有 1 个节点,而它可以是拜占庭的。 构造:节点 1、2 拜占庭。诚实节点 3、4、5 与节点 1 组成 A = {1,3,4,5} 提交值 v;诚实节点 6、7 与节点 1、2 组成 B = {1,2,6,7} 提交值 v'。交集 {1} 是拜占庭节点,它对两边说了不同的话 ⟹ 两组诚实节点提交了不同的值,安全性被违反。

第 4 题(10 分) γ = 0.4 时自私挖矿的阈值是多少?一个持有 28% 算力的矿工在这个网络里应该诚实挖矿还是自私挖矿?如果他能通过改善网络连接把 γ 提到 0.7 呢?

α > (1−γ)/(3−2γ)γ=0.4:阈值 = 0.6/2.2 = 27.3%28% > 27.3%,自私挖矿更划算。 γ=0.7:阈值 = 0.3/1.6 = 18.75%。裕度大得多。 ⭐ 要点γ 是"平局时跟随攻击者的诚实算力比例",它由网络连接质量决定——这意味着攻击者可以通过投资网络基础设施来降低自己的攻击门槛,而这一项投资在链上完全不可见。

第 5 题(11 分) 解释"Eclipse 攻击不攻击共识算法"。写出中本聪共识安全性论证里被它推翻的那条假设,并说明推翻之后为什么结论不成立。最后说明为什么改用 PoS 不能解决这个问题。

被推翻的假设:诚实节点之间能够互相通信(同步或部分同步的网络假设)。

中本聪共识的论证是:诚实算力占多数 ⟹ 诚实链增长更快 ⟹ 攻击链追不上。这个论证默认所有诚实节点都在同一条链上工作。被 eclipse 的节点看不到真实的最长链,它的算力实际上没有贡献给诚实链,甚至可能被引导去延长攻击者的链。⟹ “诚实算力占多数"这个前提在受害者的视角里不成立,结论自然不成立。

PoS 不能解决:Sybil 抗性作用在出块权上,而 eclipse 攻击消耗的是连接槽。网络层没有身份也没有成本,开一万个节点仍然免费。⟹ 这是两个不同层次的 Sybil 问题。


四、期末模拟题(第 21–35 讲)

建议限时 120 分钟。期末默认覆盖全部内容,但重心在第 21 讲之后。

第 1 题(12 分) 某合约存储布局如下:

uint128 a;  uint128 b;  uint256 c;  uint8 d;  bool e;  address f;

(a) 各变量占哪个 slot、偏移多少? (b) 把声明顺序改成 uint256 c; uint128 a; uint128 b; address f; uint8 d; bool e; 后呢? (c) 假设每个 slot 首次写入 20000 Gas,两种布局的部署初始化成本差多少?

(a) slot0: a(0–15) + b(16–31);slot1: c;slot2: d(0) + e(1) + f(2–21)。共 3 个 slot。

(b) slot0: c;slot1: a + b;slot2: f(0–19) + d(20) + e(21)。同样 3 个 slot。

(c) 相同,差 0。 ⭐ 这道题的陷阱在这里:两种顺序恰好都能打包成 3 个 slot。打包是否有效取决于相邻变量的字节数之和能否 ≤ 32,而不是"大的放前面"这种口诀。 真正会出问题的是把 uint256 c 插在 ab 中间——那会变成 4 个 slot,多花 20000 Gas。

第 2 题(12 分) 一个 Optimistic Rollup 的争议涉及 400 万步执行。 (a) 二分需要几轮? (b) 若每轮双方各发一个 32 字节哈希,总链上数据量是多少?对照直接提交完整 trace 是多少? (c) 有人实现时把轮数写成 ⌊log₂ n⌋。请说明这个 off-by-one 的后果,而不只是"少了一轮”。

(a) ⌈log₂ 4000000⌉ = 222²¹ = 2097152 < 4×10⁶ < 2²² = 4194304)。

(b) 22 × 2 × 32 = 1408 字节。完整 trace = 4×10⁶ × 32 = 128 MB相差约九万倍。

(c) ⭐ 后果是裁决机制整体失效,而不是"慢一点":少一轮意味着二分结束时区间宽度是 2 而不是 1。L1 的单步裁决器只会执行一步,它面对一个两步的区间无法判定谁对——要么拒绝裁决(争议无法解决,欺诈得逞),要么错误裁决(诚实方被罚没)。 ⚠️ 更糟的是这个 bug n 恰好是 2 的幂时不会显现,测试很容易全绿。

第 3 题(14 分) 一个借贷协议用 Uniswap 现货价作为清算依据,抵押池 XY 各 500 万美元。 (a) 攻击者把价格推到 3 倍需要投入多少 Y? (b) 若改用 20 分钟 TWAP,攻击者只能维持 24 秒,要把 TWAP 推到 3 倍,现货价要推到几倍?需要多少 Y? (c) 为什么 (b) 的攻击不能用闪电贷? (d) 该协议决定把 TWAP 窗口加到 4 小时。请指出这个决定引入的新风险,并给出一个具体的失效场景。

(a) ΔY = y(√k − 1) = 500万 × (√3 − 1) = 500万 × 0.732 = 366 万美元。且可用闪电贷,实际不需要拥有这笔钱。

(b) 现货倍数 = (3×1200 − (1200−24))/24 = (3600−1176)/24 = 101 倍ΔY = 500万 × (√101 − 1) = 500万 × 9.05 = 4525 万美元——约为池子规模的 9 倍

(c) 闪电贷要求在同一笔交易(同一个区块)内借出并还清。跨区块维持价格需要资金在多个区块里持续被占用,闪电贷的原子性约束下做不到。⟹ 攻击者必须真正拥有这笔钱,并承担期间的套利损失。

(d) 新风险是滞后。 具体场景:某抵押资产在 30 分钟内真实下跌 60%。4 小时 TWAP 此刻给出的价格仍接近下跌前的水平,协议认为大批仓位健康、不予清算。等 TWAP 跟上时,抵押品价值已远低于债务 ⟹ 协议直接形成坏账,且规模随窗口长度增长。结论:抗操纵性与及时性是同一条权衡曲线的两端,不存在"更安全的窗口",只存在"针对哪种风险更安全的窗口"

第 4 题(10 分) 数据可用性采样:某方案用 2 倍纠删码,轻节点采样 20 次。 (a) 攻击者藏起 51% 数据时,采样全部通过的概率是多少? (b) 若不用纠删码,攻击者只藏 2%,20 次采样碰到的概率是多少? (c) 用这两个数说明纠删码"改变了什么"。它有没有让藏数据变得不可能?

(a) ≈ (1/2)²⁰ = 9.5 × 10⁻⁷(约百万分之一)。

(b) 1 − 0.98²⁰ = 1 − 0.668 = 33.2%——有 67% 的概率什么也没发现。

(c) ⭐ 纠删码没有让藏数据变得不可能,它改变的是"藏数据的门槛":从"藏 2% 就能让数据不可恢复"变成"必须藏超过 50%"。 而随机采样对付 50% 极其有效、对付 2% 几乎无效——纠删码的全部价值就是把攻击者逼到采样能够发现的那个区间里去。

第 5 题(12 分) 并行执行(Block-STM):某实现的验证逻辑是"检查读集里每个键的写入者交易序号是否与执行时一致"。 (a) 构造一个场景,说明这个验证会漏判。 (b) 正确的做法是什么? (c) 为什么这个 bug 比"结果算错了"更严重?

(a) tx1 和 tx2 都访问键 k,tx2 序号在后。 第一轮:tx1 写 k = 10,tx2 读到 k = 10(写入者 = 1)。 tx1 因为自己的读集失效被重新执行,这次写 k = 99(写入者仍然 = 1)。 tx2 验证:读集记录"写入者 = 1",当前 k 的写入者也是 1 ⟹ 验证通过。 ⚠️ 但 tx2 用的是作废的值 10,正确答案应该基于 99。

(b) 给每次执行编一个版本号(incarnation),读集记录 (写入者, 版本号),验证时两者都要匹配。另外重新执行前必须撤销该交易上一轮写入的全部键,否则写集缩小时会留下永久污染。

(c) ⭐ 因为它不会报错。 并行执行的结果与串行执行不一致 ⟹ 状态根不一致 ⟹ 这个节点会被全网视为提出了无效区块(或者,如果多数节点用同一个有 bug 的实现,会造成一次链分裂)。 “算错了"至少有机会被测试发现;“在特定的交易交错下才算错"只在生产环境的高并发里出现。

第 6 题(10 分) 解释为什么"我们用 ZK 证明了预言机数据的正确性"这句话几乎总是错的。ZK 在这里实际保证了什么?请给出一个具体的、这句话成立会误导人的场景。

ZK 证明的形式是:给定输入 x,我确实按程序 f 计算出了 f(x)。它是一个关于计算过程的命题。

“ETH 现在是 3000 美元"是一个关于世界的经验断言,没有任何数学对象与之对应,因此原则上无法被证明。链能验证的只有签名、哈希和自己的历史状态。

ZK 在预言机场景里实际保证的是:“我如实转发了那个数据源返回的数字,没有在中途篡改”

误导场景:一个"ZK 预言机"从某 API 取价并生成证明。API 被攻破(或运营方自己控制它)返回 1,预言机生成一个完全有效的 ZK 证明,证明它正确转发了 1。合约验证通过、按 1 清算了全部仓位。 ⭐ 整个过程没有任何密码学被破坏。信任只是从"预言机"搬到了"那个 API”,并且因为"有 ZK 证明"这个说法而被掩盖了。


五、答题时的三个习惯

① ⭐ 先写出公式,再代数字。
   公式对、算错数,通常只扣一两分;直接写答案而公式错,是零分。

② ⚠️ 遇到"评价这个设计"类的题,答案永远是【它放弃了什么】。
   这门课全部的论证结构都是"设计 → 代价",考题也照这个结构给分。

③ 遇到"某某说……请回应",先判断这句话【在什么意义上是对的】。
   ⭐ 直接说"错"通常拿不到分 —— 出题人选的往往是半对的说法,
      得分点在于说清楚它对在哪、错在哪、边界在哪。