10 个版本

新版本 0.0.12 2024 年 8 月 22 日
0.0.11 2024 年 8 月 22 日

#10 in #incoming-connection

Download history 368/week @ 2024-08-08 556/week @ 2024-08-15

927 每月下载量
用于 commonware-chat

MIT/Apache

125KB
2.5K SLoC

commonware-p2p

Crates.io

通过加密连接与认证的节点进行通信。

状态

commonware-p2pALPHA 软件且不建议用于生产环境。开发者应预期会有破坏性变更和不稳定性。


lib.rs:

通过加密连接与认证的节点进行通信。

commonware-p2p 提供了由开发者指定的加密身份(例如 BLS,ed25519 等)识别的全连接节点之间的加密、多路复用通信。与大多数 p2p 库不同,commonware-p2p 实现了自己的加密传输层(不使用 TLS),仅使用这些加密身份来验证传入的连接(丢弃任何未明确授权的连接)。节点发现是通过有序位向量(按授权的加密身份排序)自动发生的,以有效地通信可调用的节点。

状态

commonware-p2pALPHA 软件且不建议用于生产环境。开发者应预期会有破坏性变更和不稳定性。

特性

  • 无 TLS,无 X.509 证书,无协议协商
  • ChaCha20-Poly1305 流加密
  • 任意加密节点身份
  • 使用位向量(用作 Ping/Pong)自动发现节点
  • 具有可配置的速率限制和发送优先级的多路复用
  • 嵌入式消息分块
  • Prometheus 下的指标

示例

use commonware_p2p::{Config, Network};
use commonware_cryptography::{ed25519, Scheme};
use governor::Quota;
use prometheus_client::registry::Registry;
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
use std::num::NonZeroU32;
use std::sync::{Arc, Mutex};

#[tokio::main]
async fn main() {
    // Generate identity
    //
    // In production, the signer should be generated from a secure source of entropy.
    let signer = ed25519::insecure_signer(0);

    // Generate peers
    //
    // In production, peer identities will be provided by some external source of truth
    // (like the staking set of a blockchain).
    let peer1 = ed25519::insecure_signer(1).me();
    let peer2 = ed25519::insecure_signer(2).me();
    let peer3 = ed25519::insecure_signer(3).me();

    // Configure bootstrappers
    //
    // In production, it is likely that the address of bootstrappers will be some public address.
    let bootstrappers = vec![(peer1.clone(), SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 3001))];

    // Configure network
    //
    // In production, use a more conservative configuration like `Config::recommended`.
    let registry = Arc::new(Mutex::new(Registry::with_prefix("p2p")));
    let config = Config::aggressive(
        signer.clone(),
        registry,
        SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 3000),
        bootstrappers,
    );
    let (mut network, oracle) = Network::new(config);

    // Register authorized peers
    //
    // In production, this would be updated as new peer sets are created (like when
    // the composition of a validator set changes).
    oracle.register(0, vec![signer.me(), peer1, peer2, peer3]);

    // Register some channel
    let (sender, receiver) = network.register(0, Quota::per_second(NonZeroU32::new(1).unwrap()), 1024, 128);

    // Run network
    let network_handler = tokio::spawn(network.run());

    // ... Use sender and receiver ...

    // Shutdown network
    network_handler.abort();
}

依赖项

~12–22MB
~321K SLoC