Rust权威发现库sc-authority-discovery的使用:实现去中心化网络节点发现与身份验证
Rust权威发现库sc-authority-discovery的使用:实现去中心化网络节点发现与身份验证
Substrate authority discovery 是一个Rust库,它使Substrate权威节点能够发现并直接连接到其他权威节点。该库分为两个主要组件:Worker
和Service
。
安装
在您的项目目录中运行以下Cargo命令:
cargo add sc-authority-discovery
或者在您的Cargo.toml中添加以下行:
sc-authority-discovery = "0.52.0"
许可证
该库使用GPL-3.0-or-later WITH Classpath-exception-2.0许可证。
示例代码
以下是一个使用sc-authority-discovery库的基本示例:
use sc_authority_discovery::{Worker, Service};
use sp_core::crypto::Pair;
use sp_authority_discovery::AuthorityId;
// 初始化权威发现服务
async fn init_authority_discovery() {
// 创建密钥对用于身份验证
let key_pair = AuthorityId::generate();
// 初始化Worker组件
let worker = Worker::new(
key_pair.clone(),
Default::default(),
Default::default(),
Default::default(),
);
// 初始化Service组件
let service = Service::new(
Default::default(),
Default::default(),
Default::default(),
);
// 启动服务
let (worker_handle, _worker_task) = worker.start();
let (service_handle, _service_task) = service.start();
// 获取已知权威节点列表
let authorities = service_handle.get_authorities().await;
println!("Discovered authorities: {:?}", authorities);
// 获取自己的公开地址
let own_addresses = worker_handle.get_addresses().await;
println!("Our addresses: {:?}", own_addresses);
}
以下是完整的示例demo:
use futures::executor::block_on;
use sc_authority_discovery::{Worker, Service};
use sp_core::crypto::Pair;
use sp_authority_discovery::AuthorityId;
use std::sync::Arc;
// 完整的权威发现服务实现
struct AuthorityDiscoveryDemo {
worker_handle: Arc<sc_authority_discovery::WorkerHandle>,
service_handle: Arc<sc_authority_discovery::ServiceHandle>,
}
impl AuthorityDiscoveryDemo {
// 创建新的权威发现服务实例
async fn new() -> Self {
// 生成新的加密密钥对
let key_pair = AuthorityId::generate();
// 初始化Worker组件
let worker = Worker::new(
key_pair.clone(),
Default::default(), // 网络配置
Default::default(), // 角色
Default::default(), // 协议配置
);
// 初始化Service组件
let service = Service::new(
Default::default(), // 网络配置
Default::default(), // 协议配置
Default::default(), // 元数据
);
// 启动服务
let (worker_handle, _worker_task) = worker.start();
let (service_handle, _service_task) = service.start();
Self {
worker_handle: Arc::new(worker_handle),
service_handle: Arc::new(service_handle),
}
}
// 获取发现的权威节点列表
async fn get_authorities(&self) -> Vec<AuthorityId> {
self.service_handle.get_authorities().await
}
// 获取自己的公开地址
async fn get_own_addresses(&self) -> Vec<Multiaddr> {
self.worker_handle.get_addresses().await
}
}
fn main() {
// 使用block_on运行异步代码
block_on(async {
// 创建并初始化权威发现服务
let discovery = AuthorityDiscoveryDemo::new().await;
// 获取并打印发现的权威节点
let authorities = discovery.get_authorities().await;
println!("Discovered authorities:");
for authority in authorities {
println!("- {}", authority);
}
// 获取并打印自己的公开地址
let addresses = discovery.get_own_addresses().await;
println!("Our public addresses:");
for addr in addresses {
println!("- {}", addr);
}
});
}
主要功能
- 节点发现:自动发现网络中的其他权威节点
- 身份验证:通过加密密钥对验证节点身份
- 直接连接:建立与其他权威节点的直接连接
组件说明
Worker
:负责维护节点身份信息并发布到网络Service
:负责发现和验证其他权威节点
注意事项
使用该库需要:
- 生成并管理加密密钥对
- 配置适当的网络参数
- 处理异步任务和事件
更多详细文档可以参考官方文档。
Rust权威发现库sc-authority-discovery使用指南
简介
sc-authority-discovery
是Substrate框架中的一个重要库,用于实现去中心化网络中的节点发现与身份验证功能。它为区块链网络提供了节点发现机制,使得网络参与者能够找到并验证其他权威节点(validator nodes)的身份和地址信息。
主要功能
- 去中心化节点发现
- 节点身份验证
- 网络拓扑维护
- 节点地址信息传播
使用方法
添加依赖
首先在Cargo.toml
中添加依赖:
[dependencies]
sc-authority-discovery = { version = "0.10.0", git = "https://github.com/paritytech/substrate.git", branch = "master" }
基本使用示例
use sc_authority_discovery::{AuthorityDiscovery, Config};
use sc_network::Multiaddr;
use sp_authority_discovery::AuthorityId;
use sp_core::crypto::Pair;
use std::collections::HashMap;
// 创建配置
let config = Config {
local_authority_id: Some(AuthorityId::from_slice(&[1; 32])),
local_authority_addresses: vec![
Multiaddr::try_from("/ip4/127.0.0.1/tcp/30333".to_string()).unwrap(),
],
// 其他配置项...
};
// 初始化服务
let mut authority_discovery = AuthorityDiscovery::new(
config,
// 其他依赖服务...
);
// 启动服务
authority_discovery.start();
// 获取已知权威节点
let known_authorities: HashMap<AuthorityId, Vec<Multiaddr>> = authority_discovery.get_authorities();
与Substrate集成
在Substrate节点服务中集成sc-authority-discovery
:
use sc_service::{Configuration, Role};
use sc_authority_discovery::AuthorityDiscoveryWorker;
// 在节点构建过程中
let authority_discovery_worker = AuthorityDiscoveryWorker::new(
network.clone(),
client.clone(),
config.role == Role::Authority,
config.authority_discovery_enabled,
// 其他参数...
);
// 将worker添加到服务
task_manager.spawn_essential_handle().spawn(
"authority-discovery-worker",
authority_discovery_worker.run(),
);
自定义实现
如果需要自定义行为,可以实现AuthorityDiscovery
trait:
use sc_authority_discovery::AuthorityDiscovery as AuthorityDiscoveryTrait;
struct MyAuthorityDiscovery;
#[async_trait::async_trait]
impl AuthorityDiscoveryTrait for MyAuthorityDiscovery {
async fn get_addresses_by_authority_id(
&self,
authority: sp_authority_discovery::AuthorityId,
) -> Option<Vec<sc_network::Multiaddr>> {
// 自定义实现...
None
}
async fn get_authority_ids_by_peer_id(
&self,
peer_id: sc_network::PeerId,
) -> Option<Vec<sp_authority_discovery::AuthorityId>> {
// 自定义实现...
None
}
}
高级配置
sc-authority-discovery
提供了一些可配置参数:
use sc_authority_discovery::Role;
let config = Config {
publish_interval: std::time::Duration::from_secs(10),
query_interval: std::time::Duration::from_secs(60),
store_interval: std::time::Duration::from_secs(30),
role: Role::Authority, // 或Role::FullNode
// 其他配置...
};
注意事项
- 该库主要用于Substrate-based区块链网络
- 在非权威节点上使用时需要适当调整配置
- 网络连接和DHT功能依赖于底层的libp2p实现
- 生产环境使用时需要仔细调整间隔参数
通过sc-authority-discovery
库,开发者可以轻松为Substrate区块链实现去中心化的节点发现和身份验证功能,这对于构建健壮的P2P网络至关重要。
完整示例demo
下面是一个完整的Substrate节点集成sc-authority-discovery
的示例:
use sc_authority_discovery::{AuthorityDiscoveryWorker, Config, Role};
use sc_client_api::BlockchainEvents;
use sc_network::{NetworkService, NetworkWorker};
use sc_service::{Configuration, TaskManager};
use sp_authority_discovery::AuthorityId;
use sp_core::crypto::Pair;
use std::sync::Arc;
// 创建基础服务组件
async fn create_service_components() -> (
Arc<NetworkService>,
Arc<dyn BlockchainEvents>,
TaskManager,
) {
// 实际项目中需要创建真实的网络服务和客户端
todo!("创建网络服务和区块链客户端")
}
#[tokio::main]
async fn main() {
// 创建基本服务组件
let (network, client, task_manager) = create_service_components().await;
// 配置权威发现服务
let authority_discovery_config = Config {
publish_interval: std::time::Duration::from_secs(10),
query_interval: std::time::Duration::from_secs(60),
store_interval: std::time::Duration::from_secs(30),
role: Role::Authority, // 假设这是一个权威节点
local_authority_id: Some(AuthorityId::from_slice(&[1; 32])),
local_authority_addresses: vec![
"/ip4/127.0.0.1/tcp/30333".parse().unwrap(),
],
};
// 创建权威发现worker
let authority_discovery_worker = AuthorityDiscoveryWorker::new(
network.clone(),
client.clone(),
true, // 是权威节点
true, // 启用权威发现
authority_discovery_config,
);
// 启动worker
task_manager.spawn_essential_handle().spawn(
"authority-discovery-worker",
authority_discovery_worker.run(),
);
// 运行其他服务...
}
这个完整示例展示了如何在一个Substrate节点中集成权威发现服务。实际使用时需要根据具体项目需求调整配置参数和集成方式。