tendermint+java_Tendermint架构概述

# Tendermint架构概述

November 2019

在接下来的几周里,@brapse,@marbar3778和我(@tessr)将举行一系列会议,讨论Tendermint和新架构。这些是我(@tessr)在这些会议上的笔记,这些笔记们要么将作为将来工程师入职时的工具,要么将为此类架构文档提供相关参考。

# 通信

Tendermint Core中可以发生三种通信(如请求、响应、连接)形式:节点间通信、节点内通信和客户端通信。 节点间通信:发生在节点和其他对等节点之间。这种通信基于TCP或HTTP进行。详细解释见下文。

节点内通信:发生在节点自身内部(也就是在节点内的reactor和其他组件之间)。通常都使用函数或方法调用,偶尔也依靠事件总线通信。

客户端通信:发生在客户端(如钱包或浏览器)和区块链网络节点之间。

# 节点间通信

节点间通信有两种方式: 基于P2P报文的TCP连接

节点间通信最常见的形式

基于switch,节点间的连接被持久化并在reactor之间共享

基于HTTP的RPC

针对短期一次性请求

如:reactor特定状态,像高度信息

同样存在:为了获取通知信息,连接到通道的websocket(类似新交易请求)

# P2P事务 (Switch, PEX及地址簿)

在开发P2P服务时,有两个主要任务: 路由:谁获取哪些消息?

对等节点管理:可以连接到谁?其状态如何?怎么发现对等节点?

第一个问题可以通过Switch解决 负责对等节点之间的路由连接

需要特别指出,仅处理TCP连接;RPC/HTTP是独立的

是每一个reactor的依赖;所有的reactor都暴露一个函数setSwitch

保存通道(TCP连接的通道,不是Go的通道)并使用他们进行路由

是一个全局对象,消息具有全局命名空间

和libp2p功能相似

TODO:(可能)更多Switch的实现信息

第二个问题由PEX和地址簿组合来解决。

TODO: PEX和地址簿是什么?

# TCP特性及mconnection介绍

以下是TCP的一些特征: 所有TCP连接都有一个“帧窗口大小”,它表示当前可传输的数据包大小,

即,如果要创建一个新的连接发送数据包,则必须从小数据包开始。

成功接收数据包后,才逐渐增大发送数据包的大小。(曲线如下图所示)

这意味着TCP连接的初始启动速度很慢。

syn/ack过程还意味着小且频繁的消息有很高的开销

Socket使用文件标识符表示。

b53bd72d0554831abd096d276bcff4a5.png

为了在Tendermint环境中有较好的TCP连接效果,

我们基于TCP协议,创建了mconnection或叫做多路复用连接。

它允许我们重用TCP连接以最小化开销,并在必要时通过发送辅助消息来保持高通信窗口。

mconnection是一个结构体,包含消息集合、读写缓冲区和通道id到reactor的映射。

它通过向文件标识符写入数据,完成与TCP的通信。与每个对等节点的连接都有一个mconnection。

mconnection有两个方法:send接受socket的原始句柄并将数据写入到socket中;

trySend写入到不同的缓冲区中。(TODO:写入到哪个缓冲区?)

mconnection由对等节点拥有,对等节点的连接(与许多其他对等节点的连接一起)由(全局)transport拥有,该transport由(全局)Switch拥有:

# node.go

node.go是启动节点的入口。它配置reactor和switch,并注册节点的所有RPC服务。

# 节点类型 验证节点:

全节点:

种子节点:

TODO: 完善节点类型及配置方式的区别。

# Reactors

以下是Reactor的一些特征: 每个reactor都持有全局Switch的指针(通过SetSwitch()配置)

Switch持有每个reactor的指针(通过addReactor()添加)

每个reactor都在node.go中配置(如果使用自定义reactor,也需要在node.go中指定)

Switch调用addReactor方法;addReactor方法中为传递的reactor变量调用setSwitch方法

假定在启动前所有的reacot都已被添加

由于Switch持有每个reactor的指针,因此,reactor通过Switch获取彼此的引用来相互通信。问题:可以通过其他方式实现reactor之间的通信吗?

此外,所有的reactor都暴露: TCP通道

receive方法

addReactor调用

mconnection可以多次调用receive方法。所有的reactor具有相同的方法。

addReactor会遍历reactor上的所有连接通道,并创建通道Id->reactor的映射。Switch会持有映射,并把该映射传递给transport,其中transport是TCP连接的一个简单封装。

以下是详尽(?)的reactor列表: Blockchain Reactor

Consensus Reactor

Evidence Reactor

Mempool Reactor

PEX Reactor

以后会详细阐述每一个reactor。

# Blockchain Reactor

blockchain reactor有两个主要功能: 根据对等节点的请求处理区块

TODO: 了解blockchain reactor的第二个职责

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值