fisco bcos区块链的同步及其性能优化方法

2024-09-03 08:32

本文主要是介绍fisco bcos区块链的同步及其性能优化方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:石翔 FISCO BCOS开源社区 2019-09-05

同步,是区块链中非常重要的流程,从功能上分为“交易同步”和“状态同步”。

交易同步在交易提交时执行,优先保证交易能发往所有的节点,被打包处理。

状态同步发生在某个节点发现自己区块高度落后于全网时,通过状态同步快速追回到全网最高的高度,这样作为共识节点可以参与到最新的共识过程中,而非共识节点能获取到最新的区块数据,以进行存储和验证。

交易同步

图片

交易同步,是让区块链上的交易尽可能到达所有节点,为共识中将交易打包成区块提供基础。

图片

一笔交易(tx1),从客户端上发往某个节点,节点在接收到交易后,会将交易放入自身的交易池(Tx Pool)中供共识去打包。

与此同时,节点会将交易广播给其它的节点,其它节点收到交易后,也会将交易放到自身的交易池中。

交易在发送的过程中,会有丢失的情况,为了能让交易尽可能到达所有节点,收到广播交易的节点,会根据自身网络拓扑和网络流量策略,选择一到多个相邻节点,进行接力广播

交易广播策略

如果每个节点都没有限制的转发/广播收到的交易,带宽将被占满,出现交易广播雪崩的问题。为了避免交易广播的雪崩,FISCO BCOS设计了较为精巧的交易广播策略,在尽可能保证交易可达性的前提下,尽量减少重复的交易广播。

  • 对于SDK来的交易,广播给所有的节点

  • 对于其它节点广播来的交易,随机选择25%的节点再次广播

  • 一条交易在一个节点上,只广播一次,当收到了重复的交易,不会进行二次广播

通过上述策略,能够尽量让交易到达所有的节点,交易会尽快被打包、共识、确认,让交易能够更快得到执行的结果。

广播策略已经在复杂网络里尽量追求了网络最终到达率,但也会有极小的概率,出现某交易在一定时间窗内无法到达某节点的情况。当交易未到达某个节点,只会使得交易被确认的时间变长,不会影响交易的正确性,也不会漏处理交易,因为有广播机制,网络里还有更多的节点有机会继续处理这个交易。

区块同步

图片

区块同步,能让区块链节点的数据状态保持在最新

区块链状态的新旧,最重要的标识之一就是区块高度,而区块里包含了链上的历史交易,若一个节点的块高和全网最高块高对齐,则此节点有机会回溯历史交易,以获得区块链的最新状态,只有拥有最新状态的节点,才能参与到共识中去,进行下一个新区块的共识。

       图片

当一个全新的节点加入到区块链上,或一个已经断网的节点恢复了网络,此节点的区块高度落后于其它节点,其状态不是最新的。此时就需要进行区块同步。

如上图,需要区块同步的节点(Node 1),会主动向其它节点请求下载区块。整个下载过程会将网络请求负载分散到多个节点上。

区块同步与下载队列

区块链节点在运行时,会定时向其它节点广播自身的最高块高

节点收到其它节点广播过来的块高后,会和自身的块高进行比较,若自身的块高落后于此块高,就会启动区块下载流程

区块的下载通过“请求/响应”的方式完成,进入下载流程的节点,会随机挑选满足要求的节点,发送需要下载的区块高度区间。收到下载请求的节点,会根据请求的内容,回应相应的区块。

图片

收到回应区块的节点,在本地维护一个下载队列,用来对下载下来的区块进行缓冲和排序。

下载队列是一个以块高为顺序的优先队列。下载下来的新区块,会不断插入到下载队列中,按高度排序

排序好的区块,会依次被节点执行和验证

验证通过后,更新本地的数据状态,让块高增加,直至更新到最新块,块高达到最高。

性能优化

图片

对同步的性能优化,能有效提升系统效率。FISCO BCOS在这方面做了很多,下面选取了一些关键的优化点。

编码缓存

在交易广播中,需要将交易编码成二进制数据发送给其它节点,其它节点在收到交易二进制数据后,需要解码成程序可识别的数据结构。当交易量很大时,编解码成为交易广播的性能瓶颈。

FISCO BCOS将交易的二进制编码进行缓存,当要发送交易时,直接从缓存中取出二进制发送,减少编解码的频率,增加交易广播的速率。

负载均衡

区块落后的节点会通过请求的方式从其它节点下载区块。其它节点在收到请求后,会将相应区间的区块发送给落后的节点。

在区块落后很多的情况下,FISCO BCOS节点会将下载区间均匀切分,向不同的节点发起请求,把下载负载分散到不同的节点上,避免单一被请求节点因承载大量的数据访问请求而影响其运行性能。

回调剥离

在FISCO BCOS节点中,有多个回调线程处理网络上收到的包

当网络流量很大时,处理网络包的线程处理不过来,会将网络包放到缓冲队列中。

网络上的包主要为同步包和共识包,共识包优先级更高,直接影响出块速度。为了不影响共识包的处理,FISCO BCOS将同步包的处理逻辑从网络回调线程中剥离出来,交给另外的独立线程,和共识包的处理解耦和并行了。

验签去重

同步模块在收到交易时,需要对交易进行验签

共识模块收到区块后,从区块中取出交易,也需要对交易进行验签

虽然是同一笔交易,却在同步和共识中都进行了验签。然而验签非常耗时,大大影响了交易执行的TPS。

FISCO BCOS在交易执行时做了去重逻辑,无论是同步还是共识,在验签前先查询验签记录,若此交易已验签,则直接从记录中获取验签结果,保证同一笔交易只验签一次

同时,FISCO BCOS让同步尽可能地在共识前验签,让共识尽可能直接获取验签结果,减少验签在共识中的耗时。共识得到了加速,链的TPS性能表现相应得到提升。

总结

图片

共识与同步是区块链中必不可少的环节。共识打头阵,同步打辅助。同步流程使得整个区块链网络所有节点都达到数据一致性,保证数据全网可验证。同时,在不影响共识的前提下,为共识提前准备好所需的数据,让共识跑得更快更稳定。

https://mp.weixin.qq.com/s?__biz=MzA3MTI5Njg4Mw==&mid=2247485283&idx=1&sn=c2028923dc7ec7d8bfa808febc57e596&chksm=9f2ef57fa8597c6911f629b324e466f7058e4ae5da06aab8484c1d7db3203496ffebd9562ecb&scene=21#wechat_redirect

这篇关于fisco bcos区块链的同步及其性能优化方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变