本文分析了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 中可扩展的部分,并使用针对多区块窗口而不是中位数大小的惩罚来衡量剩余的风险。到最后,上面的不等式将指向正确的方向。
让我们将 MonadBFT 验证者建模为具有每个视图效用的长期代理 $$ U_i = \text{fees}_i + \text{rewards}_i - \text{costs}_i - \text{slash}_i + \text{MEV}_i. $$
面对相互矛盾的机会,验证者 $i$ 会权衡:
然后,我们得到,偏离的预期效用: $$ \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 在此处做出了相反的架构选择,这些选择很大程度上决定了它们的激励属性。我们从以太坊开始。
在以太坊中,互相矛盾的检测位于共识热路径之外,作为一个单独的“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 不能犯同样的错误。
Tendermint 将检测嵌入到热路径中:节点以恒定时间查找检查同一高度/回合的冲突签名。对于任何广播的内容,$D \approx 1$。适度的惩罚 5% 加上永久排除已经足够了,因为攻击者还会没收未来奖励的现值。教训是架构上的,而不是数字上的:检测必须是普遍的、廉价的且自动的。
有三个 Monad 特定的属性很重要:
这三种压力不仅激发了问题,还确定了我们需要设置的杠杆。我们必须将热路径中的检测概率提高到 $D \approx 1$,通过扩展或解释(QC/TC/NEC)保持分叉影响窗口 $w$ 较小,并调整惩罚大小,以便在尾部事件中 $\phi_{\text{block}} \cdot s_i > w \cdot M_b + \kappa$,而不仅仅是在中位数日。
下一节将其转化为一个具体的机制:检测的位置、证据的移动方式、谁因报告而获得报酬,以及如何校准 $\phi$,以便“遵循规范”是严格占主导地位的。
确定了旋钮后,首先要转动的是检测:如果 $D$ 没有有效达到 1,那么无论选择什么 $\phi$ 或 $w$ 都无法挽救激励不等式,因此我们从强制检测开始。
使用一个由 $(\text{round}, \text{validator})$ 键控的按 epoch 范围的检测器来检测提案、投票和超时。在看到同一密钥的第二个、冲突的签名消息时:
这里不需要单独的 slasher 服务。这样,检查就是恒定时间的映射命中;内存被限制为当前 epoch。
证据与交易一起验证。区块拒绝过时或不完整的证明。包含是强制性的;链支付嵌入在证据中的第一个报告者(下一小节)。没有激励等待“我的Slot”,并且提案者无法窃取信用。
证据对象包括报告者对证明哈希的签名;staking 合同在 slash 时支付给该报告者。10% 的赏金使检测器保持积极性,而不会倾斜激励。剩余的 90% 被烧毁或重新分配。
设
我们可以将最坏情况下的多区块收益写成: $$ 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$% 范围内:
那么在低 MEV 假设下,$\phi_{\text{block}}$ 必须清除大约 $0.01 \times 3 \times 1.2 \times 1.25 \approx 4.5%$,而在高假设下,则进入较低的十几岁。为相关的峰值和部分分区添加余量,并且 $15$–$20$% 波段在没有极端值的情况下清晰地支配着 $M^\star$。
对于利润较低的偏差,使用相同的逻辑,但使用较小的 $w$ 和 $M_b$:
这些不是任意范围;它们来自 Monad 现实的 $(M_b, w, \kappa, \eta)$ 的上述界限。
以下两种情况涵盖了领导者可以在给定回合“跳过”前任区块的唯一具有经济意义的方式:TC/高小费机制修复的无害遗漏,以及产生加密证明且必须由 § 5.4 中的 $\phi$ 定价的真正的同回合冲突(互相矛盾)。
Monad 的协议已经清空了第一个子博弈;削减必须清空第二个子博弈。
在下文中,我们只是将 § 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 中分离的两种行为(无害遗漏与真正的同回合冲突)加上勾结的双重支出。
Stake $si = 100$ ETH,一次性 MEV $= 5$ ETH,$\phi{\text{block}} = 10%$。
即使在 $15$ ETH MEV 时,诚实也能获胜:$15.1$ 对 $15 - 10 = 5$ ETH。
三个 100 ETH 的验证者尝试对 50 ETH 的双重支出进行冲突的最终确定。
如果没有扩展或解释,领导者可以放弃前任区块并重新包含其有效负载。Monad 的 TC/高小费/NEC 规则强制重新提议,从而缩小了 $w$。如果攻击者还互相矛盾以延长分叉,则证明是可 slashing 的;根据设计,使用 $\phi_{\text{block}} \ge 15%$ 的策略是占主导地位的。
现在已经校准了旋钮(§5–6),我们可以将它们与 MonadBFT 论文的保证对齐,并了解每个定理如何约束关键项 $w$ 并完成 § 1 中的威慑不等式。
将其视为一种分工:这些定理约束了动态(它们限制了 $w$ 和回滚的形式);该机制对剩余价值进行定价,因此 § 1 中的不等式即使在尾部也成立。
在制定了力学和威慑数学之后,这是以太坊、Tendermint 和提议的 MonadBFT 如何在重要杠杆上保持一致的紧凑比较。
| 特征 | 以太坊 | Tendermint | MonadBFT (此提案) |
|---|---|---|---|
| 检测 | 可选,繁重 | 强制,在路径中 | 强制,在路径中 |
| $D$ | 低,可变 | $\approx 1$ | $\approx 1$ |
| 证据传输 | Gossip;提案者选择 | 在区块中 | 在区块中 (第一个报告者获得报酬) |
| 惩罚大小 | 混合 | 5% (双重签名) | 尾部感知:15–20% (区块),5–10% (投票),1–3% (超时) |
| 单轮 UX | 不兼容 | N/A | 首要目标 |
在指定了机制之后,要问的实际问题是什么仍然可能出错以及如何在实施路径中消除它。
假阳性。仅在完整的加密矛盾上进行削减:同一密钥、同一域(高度/回合/角色)、不同摘要的两个签名消息。在证据格式和验证器中明确最小化。模糊解析器;为每个证据路径添加属性测试。如果证明不能单独成立,则不能进行削减。
证据游戏。将证据视为一流的区块内容,并支付给编码在证明中的第一个有效报告者。这消除了“等待我的Slot”的时间游戏,并防止提案者窃取归属。限制每个区块的证据项目数量,并限制无效提交的速率,以防止垃圾拥挤热路径。
分区。仅接受具有小宽限期的 epoch 最新证据。切勿根据无法验证的传闻进行削减。当分区修复时,有效证明仍然有效;无效证明保持惰性。
好的机制会留下指纹;本节列出了一些如果设计有效应该移动的指标。
做出公正裁决的时间。为首次检测和携带证明的区块添加时间戳。在稳定状态下,目标是一两个回合。发布分发。
开销。跟踪繁忙 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<(Round, ValidatorId), BlockHash>,
seen_vote: HashMap<(Round, ValidatorId), Digest>,
seen_to : HashMap<(Round, ValidatorId), TimeoutDigest>,
epoch: Epoch,
}
impl EquivocationDetector {
fn on_proposal(&mut self, p: &Proposal) -> Option<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<Tx>, evidence: Vec<Evidence> }
fn process_evidence(ev: &Evidence) -> Result<()> {
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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!