0.2.7 2022年8月16日
0.2.6 2022年8月13日
0.2.2 2022年7月22日
0.1.7 2022年7月9日
0.1.0 2022年5月28日

#remote-peer 中排名第 8

每月下载量 29
35 个crate(直接使用18个)中使用

Apache-2.0

2MB
38K SLoC


id: network title: Network custom_edit_url: https://github.com/aptos-labs/aptos-core/edit/main/network/README.md

概述

更多详细信息,请参阅 AptosNet 规范

AptosNet 是 Aptos 生态系统中任意两个节点之间通信的主要协议。它专门设计用于促进共识、共享 mempool 和状态同步协议。AptosNet 试图与每个远程对等点保持最多一个连接;然后在该对等点上的应用程序协议则通过单个对等连接进行多路复用。

目前,它为应用程序提供两个主要接口

  • DirectSend:用于一次性消息传递。
  • RPC:用于单例远程过程调用。

网络组件使用

  • TCP 进行可靠传输。
  • NoiseIK 进行身份验证和端到端加密。
  • 用于发现的链上 NetworkAddress 集合,作为后备选择在 NetworkConfig 中包含可选的种子节点。

验证者只会允许来自其他验证者的连接。他们的身份和公钥信息由 validator-set-discovery 协议提供,该协议在每次共识重新配置时更新合格成员信息。验证者网络中的每个成员都维护一个完整的成员视图,并直接与其他所有验证者连接,以保持一个全网格网络。

相比之下,验证者全节点(VFNs)服务器将仅优先考虑来自链上发现集中更可信赖的节点连接;它们仍将为任何公共客户端提供服务。连接到 VFNs 的公共全节点(PFNs)将始终使用可用的发现信息对 VFN 服务器进行身份验证。

验证者健康信息,通过定期活动探测确定,不会在验证者之间共享;相反,每个验证者直接使用 HealthChecker 协议对其对等节点进行活动性监控。

这种方法在需要部分成员视图、复杂的故障检测器或网络覆盖之前,应该可以扩展到数百个验证者。

实现细节

系统架构

                      +-----------+---------+------------+--------+
 Application Modules  | Consensus | Mempool | State Sync | Health |
                      +-----------+---------+------------+--------+
                            ^          ^          ^           ^
   Network Interface        |          |          |           |
                            v          v          v           v
                      +----------------+--------------------------+   +---------------------+
      Network Module  |                 PeerManager               |<->| ConnectivityManager |
                      +----------------------+--------------------+   +---------------------+
                      |        Peer(s)       |                    |
                      +----------------------+                    |
                      |                AptosTransport              |
                      +-------------------------------------------+

网络组件是在 Actor 模型中实现的——它使用消息传递在作为独立“任务”运行的各个子组件之间进行通信。使用 tokio 框架作为任务运行时。网络模块中的主要子组件包括

  • Network Interface —— 使用 AptosNet 提供给应用模块的接口。

  • PeerManager —— 监听传入连接,并拨出连接到其他节点。将来自 Peer 的传入消息解复用并转发到适当的应用处理程序。此外,通知上游组件新或关闭的连接。可以连接到 ConnectivityManager 以实现具有发现功能的网络。

  • Peer —— 管理与另一个节点的一个连接。它从/到线读取和写入 NetworkMessage。目前,它实现了两种协议:DirectSend 和 Rpc。

  • AptosTransport —— 一个安全、可靠的传输。它使用 TCP 上的 NoiseIK 来协商节点之间的加密和身份验证连接。AptosNet 版本以及任何特定的 Aptos 应用协议随后使用 AptosNet 握手协议 进行协商。
  • ConnectivityManager —— 通过发现找到已知节点建立连接。通知 PeerManager 进行外拨拨号,或根据通过发现更新的已知节点更新断开连接。

  • validator-set-discovery — 通过链上配置发现要连接的节点集。这些是每个ValidatorConfigvalidator_network_addressesfullnode_network_addresses,位于ValidatorSet::validators集合中。通知ConnectivityManager已知的节点集更新。

  • HealthChecker — 执行周期性的存活探测以确保节点的连接健康。如果在连续探测中配置数量的探测失败,则重置与节点的连接。当前探测在配置的静态超时后失败。

这个模块是如何组织的?

network
├── benches                    # Network benchmarks
├── builder                    # Builds a network from a NetworkConfig
├── memsocket                  # In-memory socket interface for tests
├── netcore
│   └── src
│       ├── transport          # Composable transport API
│       └── framing            # Read/write length prefixes to sockets
├── network-address            # Network addresses and encryption
├── discovery                  # Protocols for peer discovery
└── src
    ├── peer_manager           # Manage peer connections and messages to/from peers
    ├── peer                   # Handles a single peer connection's state
    ├── connectivity_manager   # Monitor connections and ensure connectivity
    ├── protocols
    │   ├── network            # Application layer interface to network module
    │   ├── direct_send        # Protocol for fire-and-forget style message delivery
    │   ├── health_checker     # Protocol for health probing
    │   ├── rpc                # Protocol for remote procedure calls
    │   └── wire               # Protocol for AptosNet handshakes and messaging
    ├── transport              # The base transport layer for dialing/listening
    └── noise                  # Noise handshaking and wire integration

依赖项

~87MB
~1.5M SLoC