Skip to content

Latest commit

 

History

History
91 lines (70 loc) · 6.39 KB

4-2-9-网络组件.md

File metadata and controls

91 lines (70 loc) · 6.39 KB

网络组件

原文链接:https://developers.libra.org/docs/crates/network
译者:humyna
日期:2019.09.27
版权及转载声明:本文采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

网络组件向验证器的其他组件提供点对点通信原语。

概要

网络组件是专门为促进共识和共享内存池协议而设计的。目前,它为这些组件提供了两个主要接口:

  • RPC, 用于远程过程调用;
  • DirectSend, 用于向单个接收方发送“即发即弃”类型的消息。

网络组件使用:

  • Multiaddr :用于对等寻址的方案。
  • TCP :用于可靠传输。
  • Noise :用于身份验证和完全端到端加密。
  • Yamux :在单个链接上多路复用子流。
  • 推送类型的 gossip :用于对等节点发现。

每个新的子流都被分配了一个由发送方和接收方都支持的_协议_。每个RPC和DirectSend类型都对应一个这样的协议。

只有符合条件的成员才允许加入内部验证器网络。它们的身份和公钥信息由共识组件在初始化和系统成员更新时提供。 一个新的验证器还需要一些_种子_节点的网络地址,来帮助它启动连接网络。种子对等节点首先认证加入的验证器为符合条件的成员,然后与之共享网络状态。

网络中的每个成员都维护一个全员视图,并直接连接到需要与之通信的任何验证器。不能直接连接的验证器被假定为属于系统所能容忍的拜占庭式错误的配额。

使用定期性的存活探针确定的验证器健康信息不在验证器之间共享; 相反,每个验证器直接监视其对等节点的存活状态。

在需要部分成员视图、复杂的失败检测器或网络覆盖之前,这个方法应扩展到几百个验证器。

实施细节

系统架构

                             +---------------------+---------------------+
                             |      Consensus      |       Mempool       |
                             +---------------------+---------------------+
                             |            Validator Network              |
                             +---------------------+---------------------+
                             |            NetworkProvider                |
+------------------------------------------------+-----------------+     |
| Discovery, health, etc     |            RPC    |  DirectSend     |     |
+--------------+---------------------------------------------------------+
|                                         Peer Manager                   |
+------------------------------------------------------------------+-----+

网络组件用 Actor 编程模型实现 — 即,它在不同子组件(子组件作为独立“任务”运行)之间使用消息传递进行通信。tokio 框架用作任务运行时。网络组件中的不同子组件包括:

  • 网络提供者(NetworkProvider) — 向客户端暴露网络API。 它将来自上游客户端的请求转发到适当的下游组件,并将传入的RPC和DirectSend请求发送到适当的上游处理程序。
  • 节点管理器(Peer Manager) — 监听传入链接及拨号网络上的其他对等节点。 它还通知其他组件有关新的/丢失的连接事件,并将传入的子流多路分解到适当的协议处理程序。
  • 连接管理器(Connectivity Manager) — 确保当且仅当节点是符合条件的网络成员时,我们才与该节点保持连接。 连接管理器从Discovery组件接收对等节点的地址和向 Peer Manager 发出拨号/断开连接请求。
  • 发现组件(Discovery) — 使用推式gossip来发现新的对等节点并更新现有对等节点的地址。 在每个_tick_上,它打开一个随机选择的节点的新的子流,并将其网络视图发送给该节点。 它将入链发现消息中检测到的对网络的任何更改通知连接管理器。
  • 健康检查(Health Checker) — 执行定期存活探针以确保对等节点/连接的健康。如果可配置数量的的探针连续失败,它将重置与对等节点的连接。目前探针会在可配置的静态超时时失败。
  • 直接发送(Direct Send) — 允许向/从其他对等节点发送/接收消息。它将入链消息通知上游处理程序。
  • RPC — 允许向/从其他对等节点发送/接收RPC。 它通知上游处理程序有关入链RPC。 上游处理程序通过一个通道可以向调用方发送序列化响应。

除了上述子组件之外,网络组件还包括用于执行加密,传输复用,协议协商等公用程序。

代码结构

network
├── benches                       # network benchmarks
├── memsocket                     # In-memory transport for tests
├── netcore
│   └── src
│       ├── multiplexing          # substream multiplexing over a transport
│       ├── negotiate             # protocol negotiation
│       └── transport             # composable transport API
├── noise                         # noise framework for authentication and encryption
└── 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