MonadBFT中的双重签名检测与惩罚 - 博弈论与机制设计分析 - 第一部分

  • thogiti
  • 发布于 2025-10-09 16:42
  • 阅读 27

本文分析了MonadBFT共识机制中,为保证一轮确认的安全性,需要经济上的问责制来防止验证者作恶。文章讨论了以太坊和Tendermint在这方面的机制设计,并提出了MonadBFT的具体改进方案,包括强制检测、链上证据、奖励报告者以及根据尾部事件大小调整惩罚,以确保诚实行为在经济上占据主导地位,从而保证快速的用户体验。

在 MonadBFT 中的单轮确认(推测性终结性)只有在互相矛盾的行为在经济上得不偿失时才是诚实的。如果客户端可以在单个 QC(Quorum Certificate)之后采取行动,那么任何签署两个相互冲突的历史记录的尝试都必须非常昂贵,以至于没有理性的验证者会尝试。这是一个机制设计声明,而不仅仅是一个协议声明:互相矛盾的期望值必须在尾部为负,而不仅仅是平均值。

MonadBFT 论文 指明了方向,早期确认只有在可问责的证据下才会恢复,但今天的代码尚未将该收据纳入惩罚中。证据Hook存在于代码库中;但 slash 函数不存在。该系统在 BFT 意义上是安全的;但它在经济上尚未具有问责性。在高吞吐量链中,MEV 集中,这个差距很重要。

经济学可以在餐巾纸上计算: $$ \mathrm{EV}(\text{equivocate}) = \mathrm{MEV}_{\text{now}} - D \cdot P + \delta \cdot \mathbb{E}\big[u^{\text{post-slash}}\big]. $$

如果检测 $D$ 是可选的,那么 $D<1$。如果惩罚 $P$ 的大小是根据中位数而不是尾部来确定的,那么 $\mathrm{MEV}_{\text{now}}$ 有时会胜出。可选的检测加上有界的 slashing 无法提供 DSIC;你总是可以找到足够大的 MEV 峰值,使偏差在预期中得到回报。强制检测和尾部感知的惩罚可以做到这一点。

这篇博文试图将问责制转化为一个具体的机制,可以保护 MonadBFT 的单轮 UX。我们将论文保证的内容映射到代码必须做的事情,展示了为什么以太坊的公共物品 slasher 在这里失败,借鉴了 Tendermint 中可扩展的部分,并使用针对多区块窗口而不是中位数大小的惩罚来衡量剩余的风险。到最后,上面的不等式将指向正确的方向。


1) 一个紧凑的博弈论框架

让我们将 MonadBFT 验证者建模为具有每个视图效用的长期代理 $$ U_i = \text{fees}_i + \text{rewards}_i - \text{costs}_i - \text{slash}_i + \text{MEV}_i. $$

面对相互矛盾的机会,验证者 $i$ 会权衡:

  • $D \in [0,1]$:检测到互相矛盾的概率,
  • $P$:如果检测到,则进行惩罚(stake 单位),
  • $\mathrm{MEV}_{\text{now}}$:即时收益,
  • $\delta \in (0,1)$:未来效用的折扣,
  • $\mathbb{E}[u_i^{\text{honest}}]$,$\mathbb{E}[u_i^{\text{post-slash}}]$:持续价值。

然后,我们得到,偏离的预期效用: $$ \mathbb{E}\big[ui(\text{equivocate})\big] = \mathrm{MEV}{\text{now}} - D \cdot P + \delta \cdot \mathbb{E}\big[u_i^{\text{post-slash}}\big]. $$

这个公式说明了验证者通过作弊“获得”的东西:一个快速的 MEV 意外之财,减去被抓住的几率乘以惩罚,再加上受到惩罚后剩余的未来收入。

单轮推测的经济安全性要求

$$ \boxed{\mathbb{E}\big[u_i(\text{equivocate})\big] < \delta \cdot \mathbb{E}\big[u_i^{\text{honest}}\big]} $$

在现实的尾部 MEV 下成立。该机制的工作是使这种不平等性变得稳健。

这个框中的不等式表示,即使在 MEV 异常大的情况下,这个赌注也必须比保持诚实更糟糕。换句话说:设置检测和惩罚,使互相矛盾在预期上是一项亏损的交易,同时诚实的验证者保持其稳定的未来奖励。

定义了校准目标后,下一个问题很简单:真实的系统如何设置两个重要的旋钮,检测概率 $D$ 和惩罚 $P$?

以太坊和 Tendermint 在此处做出了相反的架构选择,这些选择很大程度上决定了它们的激励属性。我们从以太坊开始。


2) 以太坊的机制设计

在以太坊中,互相矛盾的检测位于共识热路径之外,作为一个单独的“slasher”服务,只有一些运营商运行。这种放置将检测变成了一种公共物品,提供成本高昂,容易免费搭便车,激励措施随之而来。

Slasher 的困境

以太坊的互相矛盾检测方法创建了一个公共物品问题。运行一个 slasher 需要维护一个大型历史索引(主网上通常为 1 TB),并将其与新的证明和提案进行比较。好处是全网络范围的;成本由运营商承担。直接激励是减少的验证者的有效余额的 $1/512$ 的举报人奖励(在 32 ETH 的削减中,约为 $0.06$ ETH)。在健康的网络上,互相矛盾的情况很少见,因此收入很小,而基础设施成本却很高。

理性的反应是免费搭便车。在实践中,只有少数运营商运行 slashers;为方便说明,假设为 10%。攻击者现在可以定价检测:$D \approx 0.1$。

低检测概率的影响

考虑一个 $10$ ETH MEV 机会。如果 $D = 0.1$,并且全额 stake 惩罚 $P = 32$ ETH, $$ \mathrm{EV}(\text{equivocate}) \approx 10 - 0.1 \cdot 32 = 6.8\ \text{ETH} > 0, $$ 因此,该攻击在预期中是有利可图的。

这与单轮 UX 不兼容。如果客户端要信任单轮 QC,则验证者必须面临压倒性的预期损失才能进行互相矛盾。可选检测无法提供该功能。

以太坊的 slashing 方法有什么问题? 以太坊的 slasher 是一个经典的公共物品问题。运行它每年花费数千美元,但产生的举报人奖励可能只有 $100 美元。只有约10% 的验证者运行 slashers,因此检测概率约为 10%。我证明了这打破了 DSIC——对于任何有限的 slashing 惩罚,你都可以找到足够大的 MEV 机会来使攻击在预期中获利。根本问题:具有有界限的 slashing 的可选检测无法实现 DSIC。强制检测是必要的。MonadBFT 不能犯同样的错误。


3) Tendermint 的机制设计

Tendermint 将检测嵌入到热路径中:节点以恒定时间查找检查同一高度/回合的冲突签名。对于任何广播的内容,$D \approx 1$。适度的惩罚 5% 加上永久排除已经足够了,因为攻击者还会没收未来奖励的现值。教训是架构上的,而不是数字上的:检测必须是普遍的、廉价的且自动的。


4) 为什么 MonadBFT 提高了标准

有三个 Monad 特定的属性很重要:

  • 单轮推测。客户端根据 QC 行事;除非偏差在预期中严格亏损,否则瞬时拆分会产生实际成本。
  • 尾部分叉表面。如果没有可执行的扩展或解释,领导者可能会放弃前任并跨多个区块获取 MEV,从而增加收益。
  • 吞吐量。高 TPS 增加了每个区块的价值以及罕见但肥尾 MEV 事件的规模。

这三种压力不仅激发了问题,还确定了我们需要设置的杠杆。我们必须将热路径中的检测概率提高到 $D \approx 1$,通过扩展或解释(QC/TC/NEC)保持分叉影响窗口 $w$ 较小,并调整惩罚大小,以便在尾部事件中 $\phi_{\text{block}} \cdot s_i > w \cdot M_b + \kappa$,而不仅仅是在中位数日。

下一节将其转化为一个具体的机制:检测的位置、证据的移动方式、谁因报告而获得报酬,以及如何校准 $\phi$,以便“遵循规范”是严格占主导地位的。


5) 一种使诚实严格占主导地位的机制

确定了旋钮后,首先要转动的是检测:如果 $D$ 没有有效达到 1,那么无论选择什么 $\phi$ 或 $w$ 都无法挽救激励不等式,因此我们从强制检测开始。

5.1 验证器快速路径中的强制检测

使用一个由 $(\text{round}, \text{validator})$ 键控的按 epoch 范围的检测器来检测提案、投票和超时。在看到同一密钥的第二个、冲突的签名消息时:

  1. 合成一个独立的证明(两个签名的语句加上最小的域上下文),
  2. 将其放在提案者的证据部分中以包含在区块中。

这里不需要单独的 slasher 服务。这样,检查就是恒定时间的映射命中;内存被限制为当前 epoch。

5.2 证据包含在区块中(没有时间游戏)

证据与交易一起验证。区块拒绝过时或不完整的证明。包含是强制性的;链支付嵌入在证据中的第一个报告者(下一小节)。没有激励等待“我的Slot”,并且提案者无法窃取信用。

5.3 报告者归属和适度奖励

证据对象包括报告者对证明哈希的签名;staking 合同在 slash 时支付给该报告者。10% 的赏金使检测器保持积极性,而不会倾斜激励。剩余的 90% 被烧毁或重新分配。

5.4 根据 Monad 的尾部调整的惩罚大小

  • $s_i$:验证者 $i$ 的 stake,
  • $M_b$:高分位数每区块 MEV 尾部(例如,第 99.5 个百分位数),
  • $w$:Monad 的扩展或解释路径崩溃偏差之前的有效影响窗口(以区块为单位)(TC/高小费/NEC 规则),
  • $\kappa \ge 1$:跨区块效应的复合因子(例如,先前区块 +当前区块),
  • $\eta > 0$:估计误差的安全余量。

我们可以将最坏情况下的多区块收益写成: $$ M^\star = (1+\eta) \cdot \kappa \cdot w \cdot M_b. $$

通过强制检测 $D \approx 1$ 和区块互相矛盾惩罚 $P = \phi_{\text{block}} \cdot si$, $$ \text{Deterrence:}\qquad \phi{\text{block}} \cdot si \ge M^\star \quad\Longrightarrow\quad \boxed{\phi{\text{block}} \ge \dfrac{(1+\eta)\cdot \kappa \cdot w \cdot M_b}{s_i}}. $$

为什么这会落在高 MEV 链上的 $15$–$20$% 范围内:

  • 如果尾部区块达到典型验证者 stake 的 $M_b \approx 1$–$2%$,
  • 协议恢复将 $w$ 保持在较低的个位数(例如 $3$–$5$),
  • 并且 $\kappa \approx 1.2$,$\eta \approx 0.25$,

那么在低 MEV 假设下,$\phi_{\text{block}}$ 必须清除大约 $0.01 \times 3 \times 1.2 \times 1.25 \approx 4.5%$,而在高假设下,则进入较低的十几岁。为相关的峰值和部分分区添加余量,并且 $15$–$20$% 波段在没有极端值的情况下清晰地支配着 $M^\star$。

对于利润较低的偏差,使用相同的逻辑,但使用较小的 $w$ 和 $M_b$:

  • 投票互相矛盾:没有直接的多区块 MEV;$w \approx 1$。将 $\phi_{\text{vote}}$ 设置为 $5$–$10$%,以支配可能的协调/贿赂收益。
  • 超时互相矛盾:很小的 $M^\star$,主要是时间杠杆。将 $\phi_{\text{to}}$ 设置为 $1$–$3$% 以消除边缘。

这些不是任意范围;它们来自 Monad 现实的 $(M_b, w, \kappa, \eta)$ 的上述界限。

5.5 两个不同的子博弈

以下两种情况涵盖了领导者可以在给定回合“跳过”前任区块的唯一具有经济意义的方式:TC/高小费机制修复的无害遗漏,以及产生加密证明且必须由 § 5.4 中的 $\phi$ 定价的真正的同回合冲突(互相矛盾)。

  • 没有互相矛盾的遗漏(不可减少)。领导者未能扩展前任区块。诚实的验证者超时;TC 展示了高小费;下一个领导者重新提出前任区块。收益:零。
  • 真正的互相矛盾(可减少)。领导者为同一回合签署两个冲突的提案(或投票/超时)。冲突是自我验证的;使用 § 5.4 中的 $\phi$,收益为负。

Monad 的协议已经清空了第一个子博弈;削减必须清空第二个子博弈。


6) 一些情景

在下文中,我们只是将 § 1 中的决策规则插入到 § 5.4 中的校准中,并检查收益的符号。通过改变 $\mathrm{MEV}_{\text{now}}$、$\phi$、$D\approx 1$ 和影响窗口 $w$,这三个小型情景表明,一旦 $\phi_{\text{block}} \gtrsim \tfrac{(1+\eta)\cdot \kappa \cdot w \cdot M_b}{s_i}$,互相矛盾就严格地占主导地位。每种情况都对应于 § 5.5 中分离的两种行为(无害遗漏与真正的同回合冲突)加上勾结的双重支出。

6.1 理性的 MEV 提取

Stake $si = 100$ ETH,一次性 MEV $= 5$ ETH,$\phi{\text{block}} = 10%$。

  • 诚实:提出一次;收取奖励 + MEV $\approx 5.1$ ETH。
  • 互相矛盾:在检测之前最多收取 $5$ ETH;然后因 slashing 损失 $10$ ETH。净值 $= -5$ ETH。

即使在 $15$ ETH MEV 时,诚实也能获胜:$15.1$ 对 $15 - 10 = 5$ ETH。

6.2 协调的双重支出

三个 100 ETH 的验证者尝试对 50 ETH 的双重支出进行冲突的最终确定。

  • 即时:获得 $50$;因 slashing 损失 $3 \times 10 = 30$ ETH(取 $\phi_{\text{vote}} = 10%$)。
  • 未来:可能排除;没收多年的奖励($\delta$ 项)。
  • 净值:一旦计入折扣后的未来,则强烈为负。

6.3 用于多区块 MEV 的尾部分叉

如果没有扩展或解释,领导者可以放弃前任区块并重新包含其有效负载。Monad 的 TC/高小费/NEC 规则强制重新提议,从而缩小了 $w$。如果攻击者还互相矛盾以延长分叉,则证明是可 slashing 的;根据设计,使用 $\phi_{\text{block}} \ge 15%$ 的策略是占主导地位的。


7) 这在何处符合论文的定理

现在已经校准了旋钮(§5–6),我们可以将它们与 MonadBFT 论文的保证对齐,并了解每个定理如何约束关键项 $w$ 并完成 § 1 中的威慑不等式。

  • 无尾部分叉 (NTF)。 定理 1 的扩展或解释规则(重新提出高小费或提供 NEC)阻止了有利可图的放弃并限制了 § 5.4 中的 $w$。如果 $w$ 很大,则 $\phi$ 需要是极端的;NTF 使 $\phi$ 合理。
  • 可问责的推测(定理 2–3 + 推论 1)。 早期确认仅在收到收据(冲突签名)后才会恢复。此处的机制将这些收据变为强制执行:区块中的证据、几乎确定的检测、几乎确定的惩罚以及有偿报告者。这就是为什么客户端可以采取一轮行动的原因。
  • 乐观的响应能力(定理 4)。 GST 之后,进度以事件速度运行。证据包含共享相同的路径;在健康状态下,做出公正裁决的时间是一轮或两轮。单轮 UX 保持不变。

将其视为一种分工:这些定理约束了动态(它们限制了 $w$ 和回滚的形式);该机制对剩余价值进行定价,因此 § 1 中的不等式即使在尾部也成立。


8) 紧凑的比较

在制定了力学和威慑数学之后,这是以太坊、Tendermint 和提议的 MonadBFT 如何在重要杠杆上保持一致的紧凑比较。

特征 以太坊 Tendermint MonadBFT (此提案)
检测 可选,繁重 强制,在路径中 强制,在路径中
$D$ 低,可变 $\approx 1$ $\approx 1$
证据传输 Gossip;提案者选择 在区块中 在区块中 (第一个报告者获得报酬)
惩罚大小 混合 5% (双重签名) 尾部感知:15–20% (区块),5–10% (投票),1–3% (超时)
单轮 UX 不兼容 N/A 首要目标

9) 风险以及如何消除它们

在指定了机制之后,要问的实际问题是什么仍然可能出错以及如何在实施路径中消除它。

  • 假阳性。仅在完整的加密矛盾上进行削减:同一密钥、同一域(高度/回合/角色)、不同摘要的两个签名消息。在证据格式和验证器中明确最小化。模糊解析器;为每个证据路径添加属性测试。如果证明不能单独成立,则不能进行削减。

  • 证据游戏。将证据视为一流的区块内容,并支付给编码在证明中的第一个有效报告者。这消除了“等待我的Slot”的时间游戏,并防止提案者窃取归属。限制每个区块的证据项目数量,并限制无效提交的速率,以防止垃圾拥挤热路径。

  • 分区。仅接受具有小宽限期的 epoch 最新证据。切勿根据无法验证的传闻进行削减。当分区修复时,有效证明仍然有效;无效证明保持惰性。


10) 要衡量什么

好的机制会留下指纹;本节列出了一些如果设计有效应该移动的指标。

  • 做出公正裁决的时间。为首次检测和携带证明的区块添加时间戳。在稳定状态下,目标是一两个回合。发布分发。

  • 开销。跟踪繁忙 epoch 中每个消息检测器延迟和“已见”映射的堆增长。检测不得恶化提交延迟尾部;如果确实如此,请将非关键工作从热路径中移开。

  • 尾部校准。将 $\phi$ 视为经验调整的参数。在对抗性模拟(冲突的提案/投票/超时)下估计 $Mb$ 和观察到的 $w$。在 TC/高小费恢复后,没有互相矛盾的遗漏应产生零利润;在削减后,真正的互相矛盾应产生负值。保持 $$ \phi{\text{block}} \gtrsim \frac{(1+\eta)\cdot \kappa \cdot w \cdot M_b}{s_i}. $$


结论

MonadBFT 已经通过扩展或解释和快速公共信号缩小了策略范围。缺失的层是与共识核心相匹配的问责制:普遍、廉价的检测;与区块共享相同管道的证据;以及根据最坏情况窗口而不是中位数调整大小的惩罚。当我们完成所有这些,并且 § 1 中的不等式在重要的地方成立时,即尾部,那么“一轮”推测性终结性就成为合理的默认值。

在博客的第 2 部分中,我将探讨该提案的形式机制设计分析,并得出一些必要的定理和属性来研究性能、活跃性安全性、稳健性和安全性。


附录:实施草图

验证器端检测器(epoch 绑定)

struct EquivocationDetector {
    seen_prop: HashMap&lt;(Round, ValidatorId), BlockHash>,
    seen_vote: HashMap&lt;(Round, ValidatorId), Digest>,
    seen_to  : HashMap&lt;(Round, ValidatorId), TimeoutDigest>,
    epoch: Epoch,
}

impl EquivocationDetector {
    fn on_proposal(&mut self, p: &Proposal) -> Option&lt;Evidence> {
        let k = (p.round, p.author);
        if let Some(prev) = self.seen_prop.insert(k, p.block_hash) {
            if prev != p.block_hash {
                return Some(Evidence::block_equiv(p.clone(), prev));
            }
        }
        None
    }
    // analogous on_vote, on_timeout ...
    // 类似于 on_vote,on_timeout ...

    fn on_epoch_change(&mut self, e: Epoch) {
        self.seen_prop.clear();
        self.seen_vote.clear();
        self.seen_to.clear();
        self.epoch = e;
    }
}

区块格式和 slash 执行

struct Block { parent: Hash, txs: Vec&lt;Tx>, evidence: Vec&lt;Evidence> }

fn process_evidence(ev: &Evidence) -> Result&lt;()> {
    let slash = calc_slash(ev.kind);              // maps to φ_block, φ_vote, φ_to
    // 映射到 φ_block,φ_vote,φ_to
    credit(ev.reporter, slash / 10);              // 10% bounty
    // 10% 的赏金
    burn_or_redistribute(slash - slash/10);       // remainder
    // 剩余部分
    apply_penalty(ev.offender, slash);
    Ok(())
}
  • 原文链接: github.com/thogiti/thogi...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
thogiti
thogiti
https://thogiti.github.io/