Rust权威发现库sc-authority-discovery的使用:实现去中心化网络节点发现与身份验证

Rust权威发现库sc-authority-discovery的使用:实现去中心化网络节点发现与身份验证

Substrate authority discovery 是一个Rust库,它使Substrate权威节点能够发现并直接连接到其他权威节点。该库分为两个主要组件:WorkerService

安装

在您的项目目录中运行以下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);
        }
    });
}

主要功能

  1. 节点发现:自动发现网络中的其他权威节点
  2. 身份验证:通过加密密钥对验证节点身份
  3. 直接连接:建立与其他权威节点的直接连接

组件说明

  • Worker:负责维护节点身份信息并发布到网络
  • Service:负责发现和验证其他权威节点

注意事项

使用该库需要:

  1. 生成并管理加密密钥对
  2. 配置适当的网络参数
  3. 处理异步任务和事件

更多详细文档可以参考官方文档。


1 回复

Rust权威发现库sc-authority-discovery使用指南

简介

sc-authority-discovery是Substrate框架中的一个重要库,用于实现去中心化网络中的节点发现与身份验证功能。它为区块链网络提供了节点发现机制,使得网络参与者能够找到并验证其他权威节点(validator nodes)的身份和地址信息。

主要功能

  1. 去中心化节点发现
  2. 节点身份验证
  3. 网络拓扑维护
  4. 节点地址信息传播

使用方法

添加依赖

首先在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
    // 其他配置...
};

注意事项

  1. 该库主要用于Substrate-based区块链网络
  2. 在非权威节点上使用时需要适当调整配置
  3. 网络连接和DHT功能依赖于底层的libp2p实现
  4. 生产环境使用时需要仔细调整间隔参数

通过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节点中集成权威发现服务。实际使用时需要根据具体项目需求调整配置参数和集成方式。

回到顶部