网络
网络组件提供了点对点与其他验证器组件之间的通讯原语。
概述
网络组件专门用于共识协议的基础设施和共享内存池协议。目前,它为这些消费者提供了两个主要接口:
- RPC,用于远程过程调用
- DirectSend,用于向单个接收器发送即发消息的消息。
网络组件使用了:
为每个新子流分配由发送方和接收方都支持的协议。每个 RPC 和 DirectSend 类型对应于一个这样的协议。
只符合条件的成员才能加入内部的验证者网络。它们的身份和公钥信息由初始化时的共识组件和系统成员资格的更新提供。新的验证器还需要几个种子(seed)对等体的网络地址,以帮助它引导到网络的连接。种子对等体先加入到验证器验证为合格的成员,然后与其共享其网络状态。
网络的每个成员都维护着一个完整的成员资格视图,并直接连接到它需要与之通信的任何一个验证器。如果无法直接连接,那么这个验证器属于拜占庭故障配额,这是系统容忍的。
定期使用活动探测器获取的验证者健康信息,不会在验证器之间共享;相反,每个验证器直接监视其对等体的活跃度。
在需要验证器之前,这种方法应该扩展到几百个验证器。部分成员视图、复杂的故障检测器或网络覆盖。
实施细节
系统架构
+---------------------+---------------------+
| Consensus | Mempool |
+---------------------+---------------------+
| Validator Network |
+---------------------+---------------------+
| NetworkProvider |
+------------------------------------------------+-----------------+ |
| Discovery, health, etc | RPC | DirectSend | |
+--------------+---------------------------------------------------------+
| Peer Manager |
+------------------------------------------------------------------+-----+
网络组件使用了 Actor 编程模型,通过它,可以在不同子组件的通讯中使用独立“任务”的方式来传递消息。我们使用了 tokio 框架来控制任务。网络组件中有不同的子组件。
- NetworkProvider - 向客户端公开的网络 API。它将来自上游客户端的请求转发到适当合适的下游组件,并将传入的 RPC 和 DirectSend 请求发送到合适的上游处理程序。
- 对等管理器(Peer Manager) - 侦听传入连接并拨打网络上的其他对等方。它还通知其他组件有关新/丢失的连接事件,并将传入的子流解复用到适当的协议处理程序。
- 连接管理器(Connectivity Manager) - 当且仅当它是合格的网络成员时,确保我们保持连接到节点。 Connectivity Manager 从 Discovery 组件接收对等方的地址,并向对等管理器发出拨号/断开连接请求。
- 发现(Discovery) - 使用 push-style gossip 来发现新的同伴并更新现有同伴的地址。在每个 tick 上,它打开一个随机选择的对等体的新子流,并将其网络视图发送给该对等体。从入站发现消息中检测到有任何的更改,它就会通知连接管理器。
- 运行状况检查程序(Health Checker ) - 执行定期的健康探测以确保对等/连接的运行状况。如果探测到超过一定数量(可配置的),它将重置与对方点对点的连接。如果是一个静态的超时(可配置的)那么探针就会失败。
- 直接发送 - 允许向/从远程对等方发送/接收消息。它通知上游处理程序入站消息。
- RPC - 允许向/从其他对等方发送/接收 RPC。它通知上游处理程序有关入站 RPC 的信息。上游处理程序通过一个通道可以向调用者发送序列化响应。
除了上述子组件之外,网络组件还包括用于执行加密,传输复用,协议协商等的实用程序。
network
├── benches # 网络测试性能
├── memsocket # 内存传输的测试
├── netcore
│ └── src
│ ├── multiplexing # 在传输上复用子流
│ ├── negotiate # 协议协商
│ └── transport # 可组合传输API
├── noise # 用于认证和加密的嘈音框架
└── src
├── channel # mpsc channel wrapped in IntGauge
├── connectivity_manager # component to ensure connectivity to peers
├── interface # generic network API
├── peer_manager # component to dial/listen for connections
├── proto # protobuf definitions for network messages
├── protocols # message protocols
│ ├── direct_send # protocol for fire-and-forget style message delivery
│ ├── discovery # protocol for peer discovery and gossip
│ ├── health_checker # protocol for health probing
│ └── rpc # protocol for remote procedure calls
├── sink # utilities over message sinks
└── validator_network # network API for consensus and mempool