RFC 000:乐观提议处理

本文讨论了基于即将到来的 Tendermint ABCI++ 接口的区块提议处理优化,具体涉及一种乐观处理机制。该机制允许应用层在投票过程开始前,与投票过程并行地乐观处理区块提议,从而减少整体区块时间。通过异步处理和状态管理,可以有效减少区块时间,但需处理提议被拒绝的情况,并防止恶意行为。

RFC 000: 乐观提案处理

更新日志

  • 2022-08-16: 初稿

摘要

本文档讨论了基于即将到来的 Tendermint ABCI++ 接口的区块提案处理优化。具体来说,它涉及一种乐观的处理机制。

背景

在 ABCI++ 之前,Tendermint 区块链的应用层第一次也是唯一一次知道区块提案,是在投票期之后,届时 Tendermint 会调用应用的 BeginBlockDeliverTxEndBlockCommit ABCI 方法,并将区块提案的内容传递进去。

随着 ABCI++ 的出现,应用层现在有机会在投票期开始之前了解区块提案。理论上,这为应用提供了与投票过程并行地乐观处理区块提案的机会,从而减少总体区块时间。

讨论

ABCI++ 引入了一组新的 ABCI 方法。其中之一是 ProcessProposal,它在节点收到当前高度的完整区块提案之后,但在 prevote 开始之前被调用。Tendermint 文档确实声明了抢先处理提案是 ProcessProposal 的潜在用例:

应用程序可以完全执行该区块,就像它正在处理 RequestFinalizeBlock 一样

然而,同步地抢先处理提案并不能改善区块时间,因为它只会改变事情发生的顺序。相反,我们需要使处理异步化:ProcessProposal 启动一个 goroutine,其终止信号保存在应用程序上下文中,并立即响应 Tendermint。这样,实际的区块处理将与投票同时发生。当投票结束并调用 FinalizeBlock 时,应用程序处理程序可以简单地等待先前启动的 goroutine 完成,并在区块哈希匹配时刷新生成的缓存存储。假设平均投票期需要 P 毫秒,平均区块处理需要 Q 毫秒,这将在理论上将平均区块时间减少 P + Q - max(P, Q) 毫秒。在最近对 Sei 的负载测试中,P 约为 600 毫秒,Q 约为 300 毫秒,因此在这种情况下,乐观处理会将区块时间缩短约 300 毫秒。

下图说明了预期流程: Flow

如果在投票期间提案被拒绝,那么乐观处理的结果显然需要被丢弃,这对于由 Cosmos 管理的状态来说是微不足道的,这要归功于缓存存储,但是对于 Sei 的 dex 模块中的内存状态需要特殊处理。dex 内存状态已经存在一个深拷贝实用程序,可以更轻松地进行这种分支。为了防止不良行为者利用乐观处理来压垮网络中的节点,我们将仅对一个高度的第一轮执行乐观处理。

最后,由于 ABCI++ 尚未在 Tendermint 的任何稳定版本中发布,因此 Cosmos 尚未与 ABCI++ 集成,如果我们希望尽快推出此功能,Sei 将需要直接基于 Tendermint 的开发分支与 ABCI++ 集成。

实现

此提案可以在应用程序端完全实现。执行上下文需要添加以下信息:

  • 是否有任何乐观处理(OP)goroutine正在运行
  • 正在运行的 OP goroutine 的区块信息(高度、轮次、哈希等)(如果有)
  • 终止信号
  • 完成信号
  • 指向分支状态的指针

OP goroutine 将在 Cosmos 存储的缓存分支和任何不由 Cosmos 存储管理的状态的等效分支之上运行。

OP goroutine 将定期(例如,每 10 个交易后)检查是否已向其发送终止信号,如果已发送则停止。如果不是,OP goroutine 将在完成处理时设置完成信号。

为了防止不良验证者压垮其他节点,我们将仅允许对给定高度的第一轮提案进行乐观处理。

收到 ProcessProposal 调用后,应用程序将采用以下过程:

if round == 0<br>     在上下文中设置上面提到的 OP 字段<br>     为所有可变状态创建分支<br>     启动一个 OP goroutine,使用状态分支乐观地处理提案<br> else if block height != 上下文中的 OP 高度 OR block hash != 上下文中的 OP 哈希<br>     向正在运行的 OP goroutine 发送终止信号<br>     从上下文中清除 OP 字段<br> else<br>     不做任何事<br> 回应 Tendermint

收到 FinalizeBlock 调用后,如果上下文中的 OP 字段与 Tendermint 传入的信息匹配,应用程序将等待任何 OP goroutine,并将任何生成的分支状态合并到主存储中。如果不是,FinalizeBlock 将自行处理该区块。

参考

  • 原文链接: github.com/sei-protocol/...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
sei-protocol
sei-protocol
江湖只有他的大名,没有他的介绍。