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

news2024/10/5 20:22:14

长安链在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.coloradmin.cn/o/66728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

W易NEWS login逆向分析

内容仅供参考学习 欢迎朋友们V一起交流: zcxl7_7 目标 网址:案例地址 分析 首先进行一次登录,获取流程 在这个流程中可以看到dl/zj/mail/l这个接口返回了新的cookie,可以猜测这个是登录核心;dl/zj/mail…

通达信接口公式怎样进行破解?

如果我们想对通达信接口的公式进行破解该怎么做呢?今天我们来风险一下方法,但是有两个前提: 1:不是使用winhex,而是使用ollydbg来破解; 2:只是用户公式修改密码有效。对于导入密码无效。对于系统公式密码无效&#xff…

c语言:关键字(一)

关键字一.古老的关键字—auto1.全局变量与局部变量2.auto的使用二.最快的关键字—register一.古老的关键字—auto 1.全局变量与局部变量 在花括号里定义的变量就是局部变量,反之就是全局变量 这里举个例子 这时我们在进行编译时会报错告诉我们y没定义 这其实就是…

redis常用数据类型以及命令详细介绍

查询redis的命令:http://www.redis.cn/commands.html Redis键(key) keys *查看当前库所有key (匹配:keys *1) exists key判断某个key是否存在 type key 查看你的key是什么类型 del key 删除指定的key数据 unlink key 根据value选择非阻塞删除 仅将keys…

计算机组成原理(二)运算方法和运算器

目录数制与编码字符和字符串的表示方法ASCII码汉字编码定点数和浮点数的表示定点数表示方法浮点数表示方法定点数和浮点数的运算定点数的运算浮点数的运算运算器的组成算数逻辑单元(ALU)算数单元逻辑单元内部总线运算器的基本结构数制与编码 字符和字符…

【动态规划】爬楼梯爬的不仅仅是楼梯

深度思考爬楼梯问题,抽取一般过程,目标是对其变式题也能认出并且求解 一、题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? https://leetcode.cn/problems/climbin…

[附源码]Python计算机毕业设计SSM建筑工程管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

.NET 分页帮助类

一直以来,分页是一个非常常见的需求,以前也用过很多的分页控件,比如AspNetPager,现在自己参照之前用过的,自己写了一个非常简单实用的分页实现方法。 先来看看应用效果: 如图,定义了是前10页&…

论文投稿指南——中文核心期刊推荐(电子、通信技术)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄🎈 核心期刊在国内的应用范围非常广,核心期刊发表很多是国内作者晋升中的硬性要求,在…

springboot基础

目录 一、springboot介绍 1、什么是SpringBoot 二、springboot入门案列 2.1、使用idea自动生成springboot工程 2.1.1、用idea自动生成springboot 2.1.2、spring程序与springboot程序对比 三、springboot启动原理 3.1、parent 3.2、starter 3.3、引导类 3.4、内嵌tomc…

3dmax 单位匹配和基本单位设置

使用3dmax打开模型,出现下图对话框; 打开文件的单位和系统的单位不匹配,文件的单位是米,系统的单位是英寸;有2个选择,重置文件的单位为系统的单位,采用文件自己的单位; 用后一个打开…

C语言第十六课:操作符详解(下)——逗号表达式、下标引用、函数调用、结构成员操作符与操作符属性

目录 前言: 一、逗号表达式(exp1,exp2,exp3,...,expN): 二、下标引用、函数调用和结构成员[ ]、( )、. 、->: 1.下标引用操作符[ ]: 2.函数调用操作符( …

NoSQL之Redis配置与优化

目录 一、redis简介 1、redis的优点 2、redis的缺点 3、redis应用场景 4、redis为什么这么快 5、redis与memcached比较 二、关系数据库与非关系型数据 1、关系型数据库 2、非关系型数据库 3、关系型数据库和非关系型数据库区别 三、redis安装部署 四、redis命令工具…

一套完整的养老院人员定位解决方案包含哪些内容?

养老院人员定位解决方案是建立面向社区及养老组织的传感网系统与信息渠道,并在此基础上提供实时、方便、高效、低成本的、物联化、互联化、智能化的养老服务。 人口老龄化问题早已成为当今社会关注的重要问题之一。在养老院封闭的环境,养老院希望利用智能…

解放程序员双手——ChatGPT安装踩雷之路+使用体验

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题 🍊专栏推荐:深度学习网络原理与实战 🍊近期目标:写好专栏的每一篇文章 🍊支持小苏:点赞👍🏼、…

数据之道读书笔记-10未来已来:数据成为企业核心竞争力

数据之道读书笔记-10未来已来:数据成为企业核心竞争力 数字化转型不能一蹴而就,数据治理也不是一朝一夕之功。数字化转型带来机遇的同时,也给整个企业的数据治理带来了新的挑战。 基于对华为公司数字化转型的解读,我们建立了数据…

Win11的两个实用技巧系列之查看所有用户帐户、应用冻结

目录 如何在Win11上查看所有用户帐户?Win11上查看所有用户帐户四种方法 方法一:在 Windows 11 的“设置”中检查所有帐户 方法二:在 Windows 11 的计算机管理中检查所有帐户 方法三:在 Windows 11 上通过命令提示符检查所有帐户 方法四&am…

【微信小程序】商品管理-微信小程序项目开发入门

有个人家开店,店里商品堆积越来越多,多了就不好管理了,那有没有想过需要类似于商品管理的一套小程序呢,这里给大家提供一个容易上手的商品管理微信小程序解决方案,非常适合新手学习入门。 先说明一下这里讲得是一个微信…

《python 数据可视化基础》第三章 散点图 scatter

第三章 散点图 scatter 参考自官方文档:https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.scatter.html#matplotlib.axes.Axes.scatter matplotblib 绘制散点图常用参数: x, y:一个或者多个点的位置;s&#xff1…

Halcon快速入门

前言一,HALCON 概述1.1,HALCON 安装二,HALCON 架构 2.1,算子 2.1.1,参数和数据结构 2.2,拓展包2.3,接口 2.3.1,HALCON-Python 接口2.3.2,HALCON-C 接口2.3.3,…