覆盖第 26–35 讲


题 1 扩容的三个维度

(a)c(每笔交易的验证开销)拆成四项,说明每项被哪种技术攻击。

(b) 一个项目说"我们的 Rollup 让 TPS 提高了 100 倍"。它解决了哪个维度、没解决哪个?

(c) 为什么执行分片被放弃了?

解答

(a)

组成 攻击它的技术
带宽与传播 数据可用性采样(第 29 讲)、压缩、blob
状态存储 无状态客户端 + Verkle(第 13 讲)、状态过期
同步时间 同上(不存状态就不用同步状态)
重执行 Rollup + 有效性证明(第 27、28 讲)

(b)

✅ 解决了【执行】维度:L2 的交易不需要每个 L1 节点重跑
⚠️ 没解决【数据】维度:Rollup 的数据仍然要发到 L1
也没解决【状态】维度:L2 自己的状态同样只增不减

实际上 Rollup 变多之后,L1 的数据压力更大了——这正是 EIP-4844 blob 存在的原因。

(c)

① ⭐ 跨分片调用破坏了 DeFi 依赖的【同步原子性】
   一次跨分片调用需要异步通信和多轮确认,
   而"在一笔交易里同时操作两个协议"是 DeFi 组合性的基础

② 每个分片的安全性只有全网的 1/64
   ⟹ 攻击者只需集中攻破一个分片

③ 最关键:有了 Rollup,执行已经不在 L1 上做了
   ⟹ L1 不需要执行分片

注意第 ③ 条的性质:不是"做不出来",而是问题被重新定义后,原来的解法变得没有必要。


题 2 L2 的严格定义

(a) 写出 L2 的严格定义。

(b) 用它检验:一条有 5/9 多签桥的侧链是 L2 吗?

(c) Validium 的状态转移全部有 ZK 证明。运营者扣留数据时,你具体缺少什么、因而做不到什么?

解答

(a)

即使 L2 的运营者完全不合作(作恶、宕机、跑路),用户仍然能够仅凭 L1 上的数据,单方面取回自己的资产。

这条定义的价值在于它可证伪。

(b) 不是。

① 侧链有【自己的共识】,它的安全性来自自己的验证者
② ⭐ 资产的进出完全由那个 5/9 多签控制
⟹ 多签作恶或密钥丢失 ⟹ 资产永久锁在桥里
⟹ 用户【无法】仅凭 L1 数据单方面取回资产

它的安全性上限 = 那 5 个签名者的运维水平,与它连接的 L1 无关。

(c)

⭐ 缺少的是:【自己那部分状态的原始数据】。

具体做不到什么:
   提款需要向 L1 合约提交一个 Merkle 证明,
   证明"在状态根 S 下,我的余额是 X"。

   而构造这个证明需要知道从我的叶子到根的整条路径,
      也就是需要【其他账户的哈希】。
   ⟹ 数据被扣留 ⟹ 我拿不到这条路径 ⟹ 构造不出证明

⭐⭐ 关键区分:状态转移是正确的(ZK 证明了这一点),钱确实在链上、数额也完全正确——但你【取不出来】。正确性和可取回性是两件事。


题 3 欺诈证明的二分

(a) 一批交易有 400 万个执行步骤,二分需要多少轮?

(b) 如果改成四分(每轮问三个点),轮数变成多少?两者的链上成本如何权衡?

(c) 单步解释器为什么用 MIPS 或 WASM 子集而不是直接用 EVM?

解答

(a)

⌈log₂(4,000,000)⌉ = ⌈21.93⌉ = ⭐ 22 轮

(b)

四分:每轮把区间缩小到 1/4
⌈log₄(4,000,000)⌉ = ⌈10.97⌉ = ⭐ 11 轮

权衡:

二分:22 轮 × 每轮 1 个状态根 = 22 个状态根,22 次链上交互
四分:11 轮 × 每轮 3 个状态根 = 33 个状态根,11 次链上交互

⭐ 轮数减半,但每轮数据量变成 3 倍。

⟹ 若链上成本以【交易次数/固定开销】为主 ⟹ 四分更好
   若以【数据量】为主 ⟹ 二分更好
   ⟹ 而每一轮都需要等待对方响应(有超时),
      所以【减少轮数】还能显著缩短争议解决的总时长

(c)

⭐ 需要在 L1 上用 Solidity 实现一个【单步解释器】。

EVM 的指令语义复杂:
   256 位运算、动态 Gas、内存扩展、调用栈、预编译……
   ⟹ 用 Solidity 完整实现一遍,代码量巨大且极易出错

MIPS / WASM 子集:
   指令简单、定长、语义清晰
   ⟹ 单步解释器只需几百行,可审计、可形式化验证

⟹ 做法是把 L2 的执行【编译】到这个简单指令集,
   只在争议时才需要那个解释器——而它可能一次都不会被调用。

题 4 挑战期与流动性桥

(a) 7 天是技术需求还是安全边际?它必须长于什么?

(b) 如果改成 1 小时,攻击者需要做到什么?

(c) 流动性桥让提款变成即时。用户在两种方式下各自信任的是什么?

解答

(a)是安全边际,不是技术需求。

它必须长于"⭐ 最坏情况下,一个诚实挑战者仍能把证明送上 L1 的时间"。

最坏情况包括:
   ① L1 严重拥堵,挑战者被 Gas 价格挤出
   ② 攻击者【主动审查】,买通区块构建者不打包挑战交易
   ③ 挑战者所在地区网络中断
   ④ 发现问题、准备证明本身需要时间

(b)

⚠️ 攻击者只需要【审查 L1 一小时】。

具体做法:
   ① 提交一个错误的状态根
   ② 在接下来的一小时里,用高额贿赂让所有区块构建者
      不打包任何挑战交易
   ⟹ 一小时的审查成本,远低于他能偷走的金额
⟹ 攻击变得经济上可行

7 天的实质就是:假设没有人能持续审查 L1 达到一周之久。

(c)

官方桥(等 7 天):
   ⭐ 信任的是【密码学和 L1 的共识】——
   数据在 L1 上,欺诈证明机制存在,无需信任任何人

流动性桥(即时):
   信任的是【那个桥的运营方】——
   它的合约、它的多签、它的偿付能力

⭐⭐ 这是一个反复出现的模式:一个安全机制带来的不便,被市场用"引入新的信任"消除了。用户体验改善了,而大多数用户并不知道自己的安全模型已经变了。


题 5 OP 与 ZK 的失败模式

(a) 构造一个"ZK 电路漏掉约束"的具体例子。

(b) 说明为什么这个 bug 不会被任何人发现。

(c) 同样的逻辑 bug 出现在 Optimistic Rollup 上,会怎样?

解答

(a)

⭐ 例:电路要证明"余额减法不下溢"。

正确的约束应该包含:
   ① new_balance = old_balance − amount
   ② 【范围检查】:old_balance ≥ amount

若漏掉第 ② 条:
   在有限域上,old_balance − amount 会【回绕】成一个巨大的数。
   例:old = 5,amount = 10
       ⟹ new = 5 − 10 = −5 ≡ p − 5(一个接近域大小的巨数)
   ⟹ 约束 ① 完全满足,电路认为这是一次合法的减法

(b)

⭐ 因为证明系统保证的是"存在满足【这组约束】的赋值",
   而这个赋值确实满足了所有(不完整的)约束。

⟹ 证明【完全有效】,L1 的验证合约欣然接受
⟹ 数学没有出错——是约束系统写错了

而没有任何机制会去检查"约束系统是否正确刻画了 EVM":
   ① 验证者只验证明,不重算
   ② 没有"挑战者"这个角色(ZK Rollup 不需要)
   ③ 状态根被合约接受后立即最终确定,没有争议窗口

(c)

⭐ 在 Optimistic Rollup 上,同样的逻辑 bug 会被【挑战者发现】:

   排序器提交了一个"余额变成巨数"的状态根
   ⟹ 任何一个诚实节点重算后发现不一致
   ⟹ 提交欺诈证明,攻击被阻止,保证金被没收

⭐⭐ 由此得到一个反直觉的结论:

密码学保证越强,人为兜底的空间越小。

Optimistic Rollup 的"1-of-N 诚实假设"看起来是弱点,⭐ 但它同时也是一层【对实现错误的兜底】。ZK Rollup 没有这一层。


题 6 数据可用性采样

(a) 没有纠删码时,攻击者藏 5% 的数据,抽查 50 次碰到它的概率是多少?

(b) 有纠删码后,要把失败概率压到 10⁻¹² 需要采样多少次?

(c) 为什么"节点越多越安全"?

解答

(a)

50 次全部没碰到的概率 = 0.95⁵⁰ ≈ ⭐ 7.69%
⟹ 碰到的概率 ≈ 92.3%

⚠️ 看起来还行?但反过来看:仍有 7.7% 的轻节点会被骗过。 而且攻击者可以只藏 1%:

0.99³⁰ ≈ ⭐ 74% —— 抽 30 次有四分之三的概率被骗过

根本问题:藏一点点就能让数据不可恢复,而一点点很难被随机抽到。

(b)

⭐ 纠删码把 n 块扩展成 2n 块,任意 n 块可恢复
⟹ 攻击者必须藏起【超过一半】才能让数据不可恢复
⟹ 每次采样命中"可用部分"的概率 ≤ 1/2

需要 (1/2)ᵏ ≤ 10⁻¹²
⟹ k ≥ 12 / log₁₀2 = 12 / 0.301 ≈ 39.9
⟹ k = 40 次

只下载 40 个小块(几十 KB),就能把错误率压到万亿分之一。对比 30 次时是 9.3 × 10⁻¹⁰。

(c)

⭐ 每个轻节点独立地随机抽查一小部分。
   n 个节点各抽 k 个位置 ⟹ 总共覆盖了大量随机位置。

⟹ ① 攻击者要骗过【所有】节点,必须让每个节点的采样都落在可用部分——
      而节点越多,这个概率越低
   ② 更重要的:所有节点采样到的数据【合起来】足以重建全部数据
      ⟹ 它们共同"托管"了这份数据,
         而没有任何一个人下载了全部

这是一个漂亮的性质:安全性和去中心化在这里是【正相关】的,而不是通常的此消彼长。


题 7 桥的信任模型

一座桥锁着 5 亿美元,由 8 个验证者的 5/8 多签保护。

(a) 它属于哪一类信任模型?安全性上限是什么?

(b) 估算它的安全比。你还需要哪些信息?

(c) 用"多链但非跨链"的论证,说明连接一条低安全性链的真实代价。

解答

(a)

⭐ 外部验证型。
安全性上限 = 那 5 个私钥的安全性
   (与它连接的两条链的安全性【完全无关】)

⚠️ 注意"5/8"这个数字可能是误导性的——Ronin 事件的教训是:9 个验证者不等于 9 个独立实体

(b)

安全比 = 攻击成本 / 可窃取价值

攻击成本 ≈ 获取 5 个私钥的成本

还需要知道的信息:

① ⭐ 这 8 个验证者由几个【独立实体】运营?
   若其中 4 个是同一家公司的服务器,实际阈值只有 2
② 密钥怎么保管?HSM?多人分持?还是热钱包里的明文?
③ 作恶有链上可执行的惩罚吗(质押 + 罚没)?
   若没有,"验证者网络"实质就是"多签"的另一个说法
④ 合约能升级吗?谁能升级?有时间锁吗?

一个有用的直觉:如果攻破 5 个私钥的成本(社工 + 入侵)远低于 5 亿美元,那么被攻击只是时间问题。

(c)

⭐ 场景一:只有多条链,没有桥
   攻击者 51% 攻击了弱链 B
   ⟹ 损害【局限在 B 内部】,A 的用户毫发无损

场景二:A 和 B 之间有桥
   攻击者 51% 攻击 B
   ⟹ 在 B 上伪造一笔"我存了 100 万代币"的交易
   ⟹ 通过桥把它提到 A
   ⟹ 【A 上的真实资产】被取走了

⭐⭐ 结论:桥让攻击的破坏面从"被攻击的那条链"扩大到"所有相连的链"。

实际含义:连接一条低安全性的链,不是"给用户多一个选择",而是把自己的安全性也拉到那条链的水平——至少在跨过去的那部分资产上。 而这个代价由 A 链的用户承担,他们甚至可能从未用过 B。


题 8 零知识证明

(a) 完整推导 Schnorr 协议的三个性质。

(b) 假设实现里写成 e = H(R)(漏掉了公钥 P)。写出攻击者伪造证明的完整步骤。

(c) 用 Schwartz–Zippel 计算:约束数 10⁸、域大小 2⁶⁴ 时的出错概率。这个域够安全吗?

解答

(a)

陈述:"我知道 x 使得 P = x·G"
协议:R = r·G  →  挑战 e  →  s = r + e·x
验证:s·G == R + e·P

① 完备性:
   s·G = (r + e·x)·G = r·G + e·(x·G) = R + e·P  ✅

② 可靠性(知识提取器):
   若能对同一个 R 回答两个不同挑战:
      s₁ = r + e₁·x ,s₂ = r + e₂·x
      ⟹ ⭐ x = (s₁ − s₂)/(e₁ − e₂)
   ⟹ 存在算法能把 x 抠出来 ⟹ 他必然知道 x

③ 零知识(模拟器):
   先随便选 e 和 s,再倒推 R := s·G − e·P
   验证:s·G == (s·G − e·P) + e·P = s·G  ✅ 恒成立
   ⟹ 不知道 x 也能造出分布相同的记录
   ⟹ 真实记录里不可能含有 x 的信息

⚠️ 注意 ③ 的前提:挑战 e 必须在 R 之后、真随机地产生。

(b)

⭐ 攻击目标:伪造一个"我知道某个公钥 P' 的私钥"的证明,
   而实际上不知道。

步骤:
① 随便选 e 和 s
② 倒推 R := s·G − e·P'   ——【但此时 P' 还未确定】

关键在于:由于 e = H(R) 【不含 P'】,
   攻击者可以反过来做:
① 随便选 r,算 R = r·G
② 算 e = H(R)                      此时 e 已经固定
③ 随便选 s
④ 反解出 P' := (s·G − R) · e⁻¹
   (即令 s·G = R + e·P' 成立)
⟹ 得到一个"合法"的三元组 (R, e, s) 和公钥 P',
   而攻击者【不知道 P' 的私钥】

危害:在一个把公钥当作身份的系统里,攻击者可以宣称拥有一个他实际不控制的公钥。 这正是"弱 Fiat-Shamir"类漏洞(业内称 Frozen Heart)。

修复:e = H(R ‖ P ‖ msg)——把全部公开输入喂进哈希。与第 7 讲第七节是同一条教训。

(c)

概率 ≤ d / |F| = 10⁸ / 2⁶⁴ ≈ 10⁸ / 1.845×10¹⁹ ≈ ⭐ 5.4 × 10⁻¹²

对高价值场景不够。

⭐ 5.4 × 10⁻¹² 意味着约两千亿分之一——
   看起来很小,但对于承载数十亿美元的系统,
   攻击者可以【反复尝试】:
      如果每次尝试成本很低,期望约 1.8 × 10¹¹ 次就能成功一次。

⟹ 实践中的做法有二:
   ① 用更大的域(2²⁵⁴)⟹ 概率降到 10⁻⁷⁰ 量级
   ② 在小域上【重复多轮】独立检查(STARK 常用这个策略),
      k 轮把概率变成原来的 k 次方

题 9 隐私与匿名集

(a) 一个隐私池只有 5 个人用过。观察者猜中来源的概率是多少?

(b) 为什么"隐私必须默认开启"?请说明可选隐私如何反过来缩小匿名集。

(c) 你从 KYC 交易所提币,经过隐私池取到新地址。列出所有可能暴露关联的环节。

解答

(a)

⭐ 匿名集 = 5 ⟹ 猜中概率 = 1/5 = 20%

⚠️ 20% 意味着隐私基本无效——尤其在结合金额和时间的侧信道之后,往往能直接锁定。

推论:一个只有你一个人使用的隐私工具,提供的隐私为零。你的隐私来自和你使用同一个工具的其他人。

(b)

若隐私是可选的:
   ⭐ "选择使用隐私"这个行为【本身就是一个信号】。

⟹ ① 使用者被自动划入一个特殊的、更小的集合
   ⟹ 匿名集从"全部用户"缩小到"选择了隐私的用户"
   ② 而且这个选择行为可能引来额外关注
   ③ 大多数人图省事不开 ⟹ 匿名集进一步萎缩
   ⟹ 隐私功能因为用的人少而失效,
      因为失效而更少人用 —— 负反馈

默认开启则所有用户都在同一个集合里,匿名集 = 全部用户。

(c)

① ⭐ 出入口关联
   从交易所提出的金额、时间,与存入隐私池的金额、时间高度相关

② 金额侧信道
   存 1.0 ETH、取 1.0 ETH ⟹ 若同期只有你一个人存取这个面额,直接锁定
   (这也是隐私池必须【固定面额】的原因)

③ 时间侧信道
   存入五分钟后就取出 ⟹ 匿名集实际上只有这五分钟内的存款

④ Gas 来源 —— 最容易被忽略的一条
   取款到全新地址后,这个地址需要 ETH 付 Gas。
   若 Gas 从你的旧地址转来 ⟹ 前功尽弃
   ⟹ 这正是"中继器(relayer)"服务存在的原因——由第三方代付 Gas

⑤ 后续行为
   新地址如果转到同一个交易所的同一个充值地址 ⟹ 直接关联

⑥ IP 与浏览器指纹
   广播交易时的网络层信息

而由于回溯性(第 33 讲第一节),上面任何【一次】失误都会永久暴露,且无法补救。隐私的安全性由最弱的那一次操作决定。


题 10 MEV 的量化

第 34 讲的池子(100 ETH / 200,000 USDC),你用 10,000 USDC 买 ETH。

(a) 分别计算滑点设为 0.5%、1%、5% 时,攻击者的利润和你的损失。

(b) 由此得出什么结论?

(c) 一个区块含 5000 万美元的清算机会,区块奖励折合 5 万美元,重组成功率 20%。验证者会怎么选?

解答

(a)

滑点     攻击者前置买入    攻击者净利润      你的损失
────────────────────────────────────────────────────
0.5%       514 USDC        52.5 USDC       0.0238 ETH
1.0%     1,032 USDC       104.9 USDC       0.0476 ETH
5.0%     5,322 USDC       523.7 USDC       0.2381 ETH

(b)

⭐ 攻击者的利润与滑点容忍度【几乎成正比】:
   0.5% → 52.5,1% → 104.9(约 2 倍),5% → 523.7(约 10 倍)

⟹ 滑点容忍度直接决定了能被抢走多少。

⚠️ 而很多用户为了"避免交易失败"把滑点设成 5% 甚至更高——这等于主动把这部分钱交出去。

正确做法:把滑点设到"刚好能成交"的最小值;若交易频繁失败,说明该用私有交易池或意图架构,而不是调高滑点。

(c)

选项 A:正常出下一个块 ⟹ 收益 = 5 万美元
选项 B:⭐ 重组去抢 MEV ⟹ 期望收益 = 5000 万 × 20% = 1000 万美元

⟹ 选项 B 的期望收益是选项 A 的 200 倍
⟹ 理性验证者会选择重组

⭐⭐ 这就是 MEV 对共识的真实威胁:

它破坏了中本聪共识的隐含假设——“延长链总是最优策略”。

MEV 越大,链的共识越不稳定。所以 MEV 不只是"用户被薅"的问题,它是【共识层的安全问题】。

这与第 17 讲的"费用狙击"是同一个机制。


题 11 合约漏洞综合

(a) 用"抽象泄漏"的框架解释重入:开发者的心智模型是什么,EVM 的实际语义是什么?

(b) 完整推演 ERC-4626 第一存款人攻击,指出三个假设各自在哪一步失效。

(c) “我们的合约经过形式化验证”——这句话保证了什么、不保证什么?

解答

(a)

⭐ 开发者的心智模型:
   "调用一个函数,它执行完会返回,然后我继续往下走。"
   —— 这是所有传统编程语言里成立的直觉。

EVM 的实际语义:
   "把控制权【完整交给一段你无法预知的代码】,
    而它可以在返回之前,回头调用你的【任何】函数。"

⟹ 缺口在于:被调用方不是一个库,而是一个【对手】。

⚠️ recipient.call{value: amount}("") 这一行看起来像普通调用,这正是"抽象泄漏"的含义——熟悉的语法掩盖了完全不同的语义。

(b)

金库份额公式:份额 = 存入金额 × 总份额 / 总资产

① 攻击者第一个存入 1 wei
   ⟹ 总份额 = 1,总资产 = 1 wei

② ⭐ 攻击者【直接转账】1000 ETH 给金库合约(不走存款函数)
   ⟹ 总资产 = 1000 ETH + 1 wei,总份额仍然是 1

③ 受害者存入 100 ETH:
   份额 = 100e18 × 1 / 1000e18 = 0.1
   ⟹ 整数除法向下取整 = 【0 份额】

④ 攻击者赎回他那 1 份额 ⟹ 拿走全部 1100 ETH

三个假设各自的失效点:

① ⭐ 舍入方向(失效在第 ③ 步)
   "存款换份额"向下取整,本意是"少给用户"以保护协议,
   但在总份额极小时,它把用户的份额直接抹成了 0。

② "资产只能通过存款函数进入"(失效在第 ② 步)
   任何人都可以直接向合约地址转账。
      合约无法拒绝(selfdestruct 强制转账更是完全无法拦截)。

③ "总份额不会小到失去精度"(失效在第 ① 步)
   第一个存款人可以把总份额设成 1,
      从而让份额计算的分辨率降到最低。

防御:虚拟份额偏移(在计算时假装已有若干份额和资产),或部署时由协议方存入一笔无法赎回的初始份额。

(c)

⭐ 保证的:【实现】符合【规范】。
   即:代码确实做了规范说它该做的事,
   在规范覆盖的所有输入下都不会偏离。

不保证的:【规范】本身是对的。

⭐⭐ 上面 (b) 的攻击【会通过形式化验证】——因为代码确实按"份额 = 金额 × 总份额 / 总资产"这个规范执行了。错的是这个规范本身没有考虑总份额极小的情况。

这与第 28 讲的 ZK 电路 bug 完全同构:

ZK 证明保证"电路被正确执行",⚠️ 不保证"电路正确实现了 EVM"
形式化验证保证"代码符合规范",不保证"规范符合意图"

⟹ 两者都把问题【向上推了一层】,而没有消除它。

全课最想留下的一句话:每一层"数学保证",都在某个地方交接给了人的判断。工程能力的差别,在于知道【保证在哪里停止】。


题 12 预言机:三种"正确"

(a) 一个借贷协议用某去中心化预言机网络的报价清算,池子深度充足、预言机由 31 个独立节点的中位数产生。某日该资产在所有主流交易所同时出现一次持续 90 秒的闪崩(跌 55% 后回升),协议因此清算了大量仓位,用户认为"预言机错了"。请判断:预言机错了吗?如果没错,问题出在哪一层?

(b) 该协议决定改用 1 小时 TWAP。请指出这个改动解决了什么没解决什么,以及新引入了什么

(c) 有人提议"用 ZK 证明预言机数据来自真实的交易所 API"。请说明这个方案在密码学上能保证什么、不能保证什么,并指出 (a) 的场景在这个方案下会不会改变。

(d) 给出你认为对 (a) 这类情形最合理的设计,并说明它自己的失效模式。

解答

(a)预言机没有错。 它被要求报告"市场价格",而它报告的正是市场价格——那个价格真实存在过,在所有场所同时出现,没有任何一个节点撒谎,中位数机制也正常工作。

问题出在【协议对预言机的用法】这一层,具体是一条从未被写下来的假设:

   ⚠️ "当前成交价" ≈ "该资产的可清算价值"

闪崩期间这条假设不成立:
   那 90 秒里的价格,反映的是【流动性瞬时枯竭】,
   而不是【资产价值下跌了 55%】。

这与第 31 讲 Compound 2020 那次是同一类失效,只是方向相反:那次是单一场所的不具代表性价格,这次是全部场所的不具代表性时刻。共同点是——预言机忠实地报告了一个真实但不适合用来做这个决策的数字。

(b)

✅ 解决了:闪崩。90 秒的极端值在 1 小时窗口里被稀释到
             大约 90/3600 = 2.5% 的权重 ⟹ 影响很小。
             ⭐ 顺带也解决了操纵:维持 1 小时的成本极高。

❌ 没解决:⚠️ 那条隐含假设本身。
             协议依然默认"某个价格 = 可清算价值",
             只是换了一个平滑过的价格。

⚠️ 新引入:滞后。真实的、持续的暴跌(比如某项目基本面崩塌,
             价格一小时内跌 70% 且不回升)会被同样地稀释。
             ⟹ 协议在应该清算时不清算 ⟹ 直接坏账。

所以这个改动的实质是:把风险从"假暴跌导致错误清算"换成了"真暴跌导致清算不及时"。 它不是一个改进,是一次风险类型的置换——而哪一种更可接受,取决于这个协议的抵押品是什么,这是一个业务判断,不是技术判断。

(c)

ZK 能保证:⭐ "我如实地把某个 API 在某时刻返回的数字搬上了链,
              中途没有篡改。"
              —— 这是一个关于【计算过程】的命题。

ZK 不能保证:⚠️ 那个 API 返回的数字是对的、有代表性的、
              或者适合用来做清算决策。
              —— 这些都是关于【世界】的断言,没有数学对象与之对应。

(a) 的场景在这个方案下完全不会改变。 闪崩期间,每一个交易所 API 都会返回那个真实的低价,ZK 证明会完美地验证通过,清算照样发生。

⚠️ 而且这个方案还引入了一重新的危害:它让"有密码学证明"这件事掩盖了真正的风险位置。信任从来没有消失,它只是从"预言机节点"搬到了"那个 API",并且因为多了一层数学而变得更难被质疑。

(d) 一个合理的设计不是"找到正确的价格",而是承认价格可能不可信,并为此留出动作空间

① 多源 + 偏离检测
      同时读取 现货中位数 与 30 分钟 TWAP,
      ⭐ 当两者偏离超过阈值(比如 20%)时,
         判定为【市场处于异常状态】。

② 异常状态下不做不可逆的动作
      暂停清算,或改为【部分清算 + 更宽的缓冲】,
      而不是继续按某个价格全速执行。

③ 清算本身加入时间维度
      要求"价格持续低于清算线 N 个区块"才触发,
      ⟹ 把瞬时噪声和持续下跌区分开。

⚠️ 这个设计自己的失效模式必须说清楚,否则就是在推销:

① ⭐ "暂停"是一个可被攻击的状态。
      攻击者若能廉价地制造"两个价格源偏离",
      就能【按需冻结】这个协议 —— 一个新的 DoS 面。

② 暂停期间风险不会消失,只会积累。
      如果那真是一次持续暴跌,暂停只是把坏账推迟并放大。

③ ⚠️ "谁来决定恢复"是一个治理问题,
      而治理开关通常是整个协议里最中心化的部分(第 24 讲)。

⟹ ⭐ 所以这个设计的真实定位是:
   它没有让协议更"正确",
   它把一个【瞬间发生、不可逆】的错误,
   换成了一个【缓慢发生、有人可以介入】的错误。

   在预言机问题上,这基本上是能做到的最好结果 ——
   因为第 31 讲第二节已经说明,
   ⭐⭐【正确】在这里原则上就不是一个可达的目标。

相关第 26–35 讲