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