长安链共识模块优化中的“精益求精”

2024-02-14 23:30

本文主要是介绍长安链共识模块优化中的“精益求精”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

长安链在v2.3.0版本中对共识模块进行了优化,主要包括优化TBFT消息机制并将异步发送信息功能进行了拆分,独立设计了一致性引擎模块。优化后共识模块整体逻辑更清晰、共识更高效。

TBFT消息机制优化背景

在长安链的V2.3.0版本的TBFT共识算法中,我们对TBFT共识算法进行了重构,主要是增加了对TBFT消息的缓存。在V2.3.0之前的版本,当一个TBFT节点收到来自某个节点的消息(主要是proposal提案消息、prevote预投票消息、precommit投票消息),但是如果这个共识消息的高度比当前节点的状态要高,TBFT会判断当前的共识高度和共识消息的高度不匹配,就会丢弃掉该消息。这么可能导致的后果就是,在节点未来达成这个消息的高度的时候,它需要该共识消息,而由于之前已经丢弃掉了该共识消息,因此它还需要等待其他节点再次把该共识消息重新发送过来,导致占用不必要的网络通信。

具体实现

在长安链在V.2.3.0版本中,TBFT共识增加了一个MsgCache,用来缓存未来的共识消息,目前TBFT是缓存未来10个高度的TBFT消息。当TBFT节点收到来自某个节点的共识消息,判断共识消息的高度是否大于当前共识状态的高度,如果是未来10个高度以内的共识消息,则会放入到MsgCache中。当TBFT共识进入到新的高度的时候,会从MsgCache内获取当前共识高度缓存的proposal和投票(包括prevote投票、precommit投票),然后将提案和投票放入到TBFT共识的消息管道内,以便TBFT共识能够快速获取到当前共识状态所需要的消息。同时在每个新的高度,TBFT会更新MsgCache内的共识高度,每10个高度,会清理一次MsgCache内比当前共识高度低的不再需要的共识消息。

流程图如下:

点击放大查看图片

实现方法如下:

 

// ConsensusFutureMsgCache 缓存未来的共识消息
type ConsensusFutureMsgCache struct{
logger protocol.Logger
sync.Mutex
size uint64
consensusHeight uint64
cache map[uint64]*ConsensusFutureMsg
}

// updateConsensusHeight 更新共识高度,删除不再需要的共识消息
func(cfc *ConsensusFutureMsgCache)updateConsensusHeight(height uint64);

// addFutureProposal 添加未来的提案到cache
func(cfc *ConsensusFutureMsgCache)addFutureProposal(logger protocol.Logger, validators *validatorSet,
proposal *tbftpb.Proposal);

// addFutureVote 添加未来的投票到cache
func(cfc *ConsensusFutureMsgCache)addFutureVote(logger protocol.Logger, validators *validatorSet,
vote *tbftpb.Vote);

// getConsensusFutureProposal 从cache获取提案
func(cfc *ConsensusFutureMsgCache)getConsensusFutureProposal(height uint64, round int32)*tbftpb.Proposal;

// getConsensusFutureProposal 从cache获取投票
func(cfc *ConsensusFutureMsgCache)getConsensusFutureVote(height uint64, round int32)*roundVoteSet;

 

一致性引擎方案设计及其成效

长安链PeerState模块异步发送共识过程中投票信息,并在其他节点未能成功收到投票造成状态落后时,异步补发投票信息。

我们将异步发送信息功能进行拆分,独立设计一致性引擎模块。共识流程中会直接发送提案/投票等信息,当接收方出现状态落后时,一致性引擎用于补发状态。优化后,逻辑更清晰,并且通过主流程直接发送和消息类型拆分的方式,极大的提高了共识性能。

需求描述

序号

需求

1

拆分出独立模块(ConsistentEngine),TBFT可以不依赖新模块(理想情况)独立运行,如果出现网络问题(如丢包),会出现共识过程卡住的问题。

2

ConsistentEngine辅助同步TBFT共识状态,避免出现共识过程卡住的问题。

3

监测其他节点状态,如果状态落后,推送新状态;

自己状态落后不做处理(等其他节点推送新状态)。

4

ConsistentEngine可用于辅助同步MaxBFT共识状态。

5

ConsistentEngine支持注册、回调的方式与tbft模块交互。

表1

模块关系图

点击放大查看图片

如上图所示,TBFT和ConsistentEngine均为独立模块,两个模块共用相同内存空间存储自身状态。ConsistentEngine中会存储其他节点状态,通过定时器方式,触发状态检测,当发现其他节点状态落后时,发送所需下一状态,推动其他节点状态更新,保证共识正常。

流程图

Tbft-ConsistentEngine 交互流程

点击放大查看图片

如上图所示,一致性引擎的启动随TBFT一起启动,启动时会初始化并完成注册,初始化远端节点信息,开启广播。关闭时,在TBFT关闭前,先关闭全部广播器,然后关闭TBFT共识服务。运行过程中,共识进入新的高度,读取链配置,如果有验证者变更,则触发一致性引擎远端信息的更新。

ConsistentEngine 流程

点击放大查看图片

发送端:运行后会为每个广播器创建定时器(当前仅使用TBFT状态广播器),当定时器到达定时时间(默认500ms),遍历所有远端节点共识状态,通过PreBroadcaster接口返回待发送消息,通过msgBus将待发送消息发送给接收方。全部消息发送后,重置定时器,等待下一轮消息同步。

接收端:收到消息后,遍历消息解析器(当前仅使用TBFT状态解析器),解析消息后,将节点信息进行更新。

接口设计

 

// ConsistentEngine 一致性引擎,用于节点间(共识状态)信息同步
type ConsistentEngine interface{

// Start 启动一致性引擎
// ctx 后续扩展用,启动失败返回error
Start(ctx context.Context)error

// Stop 停止一致性引擎
// ctx 后续扩展用,,停止失败返回error
Stop(ctx context.Context)error

// AddBroadcaster 添加状态广播器(如一个tbft状态广播器)
// id 广播器标识,需要保证唯一性
// broadcast 广播器,需要用户自己实现(如:tbft广播器、maxbft广播器)
AddBroadcaster(id string, broadcast StatusBroadcaster)error

// UpdateNodeStatus 更新本地状态
// id 节点标识,需要保证唯一性
// node 需要更新的节点信息(包含节点状态,节点状态可以有多种)
UpdateNodeStatus(id string, node Node)error

// PutRemoter 添加节点
// id 节点标识,需要保证唯一性
// node 需要添加的节点信息(包含节点状态,节点状态可以有多种)
PutRemoter(id string, node Node)error

// RemoveRemoter 删除节点
// id 节点标识,当节点不存在时返回错误消息
RemoveRemoter(id string)error

// RegisterStatusCoder 注册状态解析器
// decoderType 解析器标识,需要保证唯一性
// decoder 需要添加的解析器,由用户实现(如:tbft解析器)
RegisterStatusCoder(decoderType int8, decoder Decoder)error

// RegisterStatusInterceptor 注册过滤器
// interceptorType 过滤器标识,需要保证唯一性
// interceptor 需要添加的过滤器,由用户实现(如:tbft过滤器)
RegisterStatusInterceptor(interceptorType int8, interceptor StatusInterceptor)error
}

 

// StatusBroadcaster 状态广播器
// 由内部定时器触发广播
// 根据LocalNodeStatus和RemoteNodeStatus当前状态,确认是否进行状态广播
type StatusBroadcaster interface{

// ID 广播器标识
ID()string

// TimePattern 状态广播触发模式
// 返回触发间隔
TimePattern()interface{}

// PreBroadcaster 广播器,判断是否要发送消息
// 返回广播器方法
PreBroadcaster() Broadcast

// Start 启动
Start()error

// Stop 停止
Stop()error

// IsRunning 获取运行状态
IsRunning()bool
}

 

// Decoder 解析器
type Decoder interface{

// MsgType 解析器处理的消息类型
MsgType()int8

// Decode 解析器解析对应类型的消息,返回解析后数据对象
Decode(interface{})interface{}
}

ConsistentEngine方案应用成效

ConsistentEngine方案较PeerState方案在共识模块独立测试中,性能提升35.3%,具体信息如下:

PeerState方案

ConsistentEngine方案

测试方法

共识模块测试床

共识模块测试床

环境

系统:macOS 12.5.1

处理器:2.6 GHz 6核 Intel Core i7

内存:16 GB

系统:macOS 12.5.1

处理器:2.6 GHz 6核 Intel Core i7

内存:16 GB

存储

不启用

不启用

网络

启用

启用

虚拟机

不启用

不启用

验证

不启用

不启用

WAL

不启用

不启用

CTPS

17W

23W(提升35.3%)

表2

注:上图性能数据是共识模块独立测试的性能数据,不同于区块链性能数据。

这篇关于长安链共识模块优化中的“精益求精”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/709871

相关文章

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

Python logging模块使用示例详解

《Pythonlogging模块使用示例详解》Python的logging模块是一个灵活且强大的日志记录工具,广泛应用于应用程序的调试、运行监控和问题排查,下面给大家介绍Pythonlogging模... 目录一、为什么使用 logging 模块?二、核心组件三、日志级别四、基本使用步骤五、快速配置(bas

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

MySQL中like模糊查询的优化方案

《MySQL中like模糊查询的优化方案》在MySQL中,like模糊查询是一种常用的查询方式,但在某些情况下可能会导致性能问题,本文将介绍八种优化MySQL中like模糊查询的方法,需要的朋友可以参... 目录1. 避免以通配符开头的查询2. 使用全文索引(Full-text Index)3. 使用前缀索