死磕hyperledger fabric源码|Order节点概述

文章及代码:https://github.com/blockchainGuide/

分支:v1.1.0

前言及源码目录

Orderer排序节点这块内容主要包括了节点启动流程、Broadcast广播交易服务、Orderer共识排序服务以及Deliver区块分发服务。其相关源码目录文件如下:

/orderer

|-common

​ |-blockcutter:交易切割打包模块

​ |-bootstrap:引导启动模块,生成创世块

​ |-broadcast:交易广播服务模块

​ |-localconfig:本地配置模块

​ |-metadata:获取元数据模块

​ |-msgprocessor:消息处理器模块

​ |-multichannel:多管道注册管理器模块

​ |-performance:性能测量模块

​ |-server:Order排序服务器模块

|-consensus

​ |-kafka:kafka共识组件模块

​ |-solo:solo共识组件模块

​ |-consensus.go:定义共识组件相关接口

|-main.go:orderer主程序

/common

|-deliver:定义Deliver服务器及处理器接口

/core

|-deliverservice

​ |-blocksprovider:区块提供者模块

​ |-client.go:提供broadcastClient客户端

​ |-deliveryClient:Deliver服务客户端

​ |-requester.go:请求区块数据

/protos

|-orderer:protobuf消息定义模块

主要功能

Orderer排序节点在Hyperledger Fabric系统架构中处于核心角色地位,管理着系统通道与所有应用通道,负责通道创建、通道配置更新等操作,并处理客户端提交的交易消息请求,对交易进行排序并按规则打包成新区块,提交账本并维护通道账本数据,为全网节点提供Broadcast交易广播服务、Orderer共识排序服务、Deliver区块分发服务等。通常,Hyperledger Fabric启动时需要先启动Orderer排序节点,创建系统通道提供正常服务后,再启动其他角色的Peer节点进入正常工作状态。其服务模块关系与架构示如图:

Orderer节点启动后基于创世区块初始化系统通道,创建Orderer排序服务器,封装了Broadcast服务处理句柄、Deliver服务处理句柄与多通道注册管理器对象,并提供Broadcast()交易广播服务接口与 Deliver()区块分发服务接口。

其中,Orderer排序服务器基于Broadcast()接口接收交易广播服务请求,调用Broadcast服务处理句柄的Handle()方法进行处理,建立消息处理循环,接收与处理客户端提交的普通交易消息、配置交易消息等请求消息,经过滤后发送至通道绑定的共识组件链对象(Solo类型、Kafka类型等)进行排序。接着,再将排序后的交易添加到本地待处理的缓存交易消息列表,并按照交易出块规则构造新区块,提交到Orderer节点指定通道账本的区块数据文件中,同时负责创建新的应用通道、更新通道配置等通道管理工作。目前,Orderer排序服务器负责接收与处理两类交易消息,具体如下。

  • 配置交易消息(ConfigMsg):通道头部类型是CONFIG_UPDATE的通道配置交易消息,含有最新的通道配置信息,经过通道消息处理器过滤后,转换为通道头部类型为 ORDERER_TRANSACTIONCONFIG的配置交易消息(Envelope类型),分别用于创建新的应用通道或更新通道配置,同时,将通道配置交易消息单独打包成新区块,并提交到系统通道账本与应用通道账本。

  • 普通交易消息(NormalMsg):通道头部类型是ENDORSER_TRANSACTION等的标准交易消息(经过Endorser背书的交易消息或其他非配置交易消息),含有改变世界状态的模拟执行结果读写集,经过Endorser节点签名背书后打包发送到Orderer节点请求处

    理,经过通道消息处理器过滤后,将合法交易提交到共识组件链对象进行排序,再按照交易出块规则(出块时间周期、打包最大交易数量、区块字节数限制等)生成新区块,并提交到通道账本。

同时,Orderer排序服务器提供Deliver()区块分发服务接口,将接收的服务请求交由Deliver服务处理句柄的Handle()方法处理,建立消息处理循环,负责接收与处理客户端提交的区块请求消息,封装了指定区块请求范围的区块搜索信息(SeekInfo类型)。接着,Deliver服务处理句柄循环从本地账本获取区块数据,依次发送给请求节点(如Leader主节点)。如果账本中还未生成指定区块,则Deliver服务处理句柄默认一直阻塞等待,直到该区块创建完成并提交账本后再回复给请求节点。

另外,Orderer排序服务器还提供了多通道注册管理器Registrar对象,负责管理系统通道与所有应用通道,封装了所有通道的链支持对象字典、共识组件字典、区块账本工厂对象等组件,维护所有通道上的通道配置、区块账本对象、共识组件等核心资源,创建通道上的共识组件链对象提供Orderer共识排序服务,负责对交易消息排序,切割打包构造新区块并提交账本,同时负责创建新的应用通道与更新通道配置,其相当于Orderer节点上的“资源管理器”。

实际上,Orderer排序服务器上的通道共识组件链对象利用Golang通道(Solo共识组件)或Kafka集群(Kafka共识组件)作为共识排序后端,对经过通道消息处理器过滤的合法交易消息进行排序,对交易顺序等达成一致性观点。同时,在新通道创建时或启动恢复现有通道时,启动通道绑定的链支持对象以及共识组件链对象,构建交易消息处理循环,接收共识组件已经完成排序的交易消息,并添加到本地待处理的缓存交易消息列表中,包括配置交易消息、普通交易消息等,采用相互独立的消息处理流程分别处理 。

注意,目前Orderer节点账本只包括区块数据文件与区块索引数据库,负责保存区块数据即公有数据(包含公共数据与隐私数据哈希值),不存在状态数据库、历史数据库、隐私数据库等。不同于Peer节点,Orderer节点在提交区块到本地账本前不需要验证交易背书策略与执行MVCC检查,也不保存任何隐私数据(明文),只负责存储所有通道账本上的区块数据。

参考

https://github.com/blockchainGuide/

死磕hyperledger fabric源码|Order节点概述的更多相关文章

  1. 死磕以太坊源码分析之p2p节点发现

    死磕以太坊源码分析之p2p节点发现 在阅读节点发现源码之前必须要理解kadmilia算法,可以参考:KAD算法详解. 节点发现概述 节点发现,使本地节点得知其他节点的信息,进而加入到p2p网络中. 以 ...

  2. 死磕以太坊源码分析之Kademlia算法

    死磕以太坊源码分析之Kademlia算法 KAD 算法概述 Kademlia是一种点对点分布式哈希表(DHT),它在容易出错的环境中也具有可证明的一致性和性能.使用一种基于异或指标的拓扑结构来路由查询 ...

  3. 死磕以太坊源码分析之rlpx协议

    死磕以太坊源码分析之rlpx协议 本文主要参考自eth官方文档:rlpx协议 符号 X || Y:表示X和Y的串联 X ^ Y: X和Y按位异或 X[:N]:X的前N个字节 [X, Y, Z, ... ...

  4. 死磕以太坊源码分析之Fetcher同步

    死磕以太坊源码分析之Fetcher同步 Fetcher 功能概述 区块数据同步分为被动同步和主动同步: 被动同步是指本地节点收到其他节点的一些广播的消息,然后请求区块信息. 主动同步是指节点主动向其他 ...

  5. 死磕以太坊源码分析之Ethash共识算法

    死磕以太坊源码分析之Ethash共识算法 代码分支:https://github.com/ethereum/go-ethereum/tree/v1.9.9 引言 目前以太坊中有两个共识算法的实现:cl ...

  6. 死磕以太坊源码分析之downloader同步

    死磕以太坊源码分析之downloader同步 需要配合注释代码看:https://github.com/blockchainGuide/ 这篇文章篇幅较长,能看下去的是条汉子,建议收藏 希望读者在阅读 ...

  7. 死磕以太坊源码分析之txpool

    死磕以太坊源码分析之txpool 请结合以下代码阅读:https://github.com/blockchainGuide/ 写文章不易,也希望大家多多指出问题,交个朋友,混个圈子哦 交易池概念原理 ...

  8. 死磕以太坊源码分析之MPT树-上

    死磕以太坊源码分析之MPT树-上 前缀树Trie 前缀树(又称字典树),通常来说,一个前缀树是用来存储字符串的.前缀树的每一个节点代表一个字符串(前缀).每一个节点会有多个子节点,通往不同子节点的路径 ...

  9. 死磕以太坊源码分析之MPT树-下

    死磕以太坊源码分析之MPT树-下 文章以及资料请查看:https://github.com/blockchainGuide/ 上篇主要介绍了以太坊中的MPT树的原理,这篇主要会对MPT树涉及的源码进行 ...

随机推荐

  1. 关于Java注解(annotation)的简单理解

    一.什么是注解? 从 JDK5 开始,Java增加对元数据的支持,也就是注解.简单理解就是代码里的特殊标志,这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行部 ...

  2. 搭建tdh平台

    1.卸载tdh平台(见tdh集群卸载文件夹) 在manager节点执行chmod +x uninstall.sh (非root用户执行sudo chmod +x uninstall.sh)开始卸载TD ...

  3. 回溯法、子集树、排列树、满m叉树

    显示图: 明确给出了图中的各顶点及边 隐式图: 仅给出初始节点.目标节点及产生子节点的条件(一般有问题提议隐含给出)的情况下,构造一个图. 回溯法: 从初始状态出发,在隐式图中以深度优先的方式搜索问题 ...

  4. 2019HDU多校 Round6

    Solved:2 02 Nonsense Time (LIS) 题意:给定一个全排列 最开始为空的 每秒中一个位置上的数出现 求每秒的LIS 题解:题解说 考虑时光倒流 倒着消掉 因为数据随机 所以期 ...

  5. 2020 ICPC Asia Taipei-Hsinchu Regional Problem H Optimization for UltraNet (二分,最小生成树,dsu计数)

    题意:给你一张图,要你去边,使其成为一个边数为\(n-1\)的树,同时要求树的最小边权最大,如果最小边权最大的情况有多种,那么要求总边权最小.求生成树后的所有简单路径上的最小边权和. 题解:刚开始想写 ...

  6. Eclipse无法打开提示could not open jvm.cfg错误

    先言:我的问题只是出在之前我的java_jdk原来安装在F:\Temp这里,但是我之后在整理文件的时候把这个文件夹改成了F:\java_jdk.所以导致了错误的出现 解决方法1: 因为我的只是目录名称 ...

  7. 牛客编程巅峰赛S1第6场 - 黄金&钻石&王者 C.星球游戏 (单源最短路,Dijkstra)

    题意:有\(n\)个点,\(m\)条双向边,两个方向的权值都是相等的,可以从\(A\)中的某个点出发走到\(B\)中的某个点,求所有路径中的最短距离,如果A和B中没有点联通,则输出\(-1\). 题解 ...

  8. Mysql主从架构

    Mysql主从架构 1. 克隆虚拟机 克隆的虚拟机的网络适配,使得虚拟机可以进入局域网 vi /etc/sysconfig/network-scripts/ifcfg-eth0 删除 HWADDR所在 ...

  9. HTTP 请求过程以及报文结构

    目录 HTTP 请求流程 HTTP 请求报文 请求行 方法字段(Request Method) URL字段(Uniform Resource Locator) HTTP 协议版本字段(略) 请求/响应 ...

  10. K8S(05)核心插件-ingress(服务暴露)控制器-traefik

    K8S核心插件-ingress(服务暴露)控制器-traefik 1 K8S两种服务暴露方法 前面通过coredns在k8s集群内部做了serviceNAME和serviceIP之间的自动映射,使得不 ...