10 个版本
新版本 0.0.12 | 2024 年 8 月 22 日 |
---|---|
0.0.11 | 2024 年 8 月 22 日 |
#10 in #incoming-connection
927 每月下载量
用于 commonware-chat
125KB
2.5K SLoC
commonware-p2p
通过加密连接与认证的节点进行通信。
状态
commonware-p2p
是 ALPHA 软件且不建议用于生产环境。开发者应预期会有破坏性变更和不稳定性。
lib.rs
:
通过加密连接与认证的节点进行通信。
commonware-p2p 提供了由开发者指定的加密身份(例如 BLS,ed25519 等)识别的全连接节点之间的加密、多路复用通信。与大多数 p2p 库不同,commonware-p2p 实现了自己的加密传输层(不使用 TLS),仅使用这些加密身份来验证传入的连接(丢弃任何未明确授权的连接)。节点发现是通过有序位向量(按授权的加密身份排序)自动发生的,以有效地通信可调用的节点。
状态
commonware-p2p
是 ALPHA 软件且不建议用于生产环境。开发者应预期会有破坏性变更和不稳定性。
特性
- 无 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