Rust安全网络库safe_network的使用:构建去中心化、隐私保护的P2P网络应用

Rust安全网络库safe_network的使用:构建去中心化、隐私保护的P2P网络应用

safe_network是Safe Network的核心库,提供了API消息定义、路由和节点功能,以及客户端核心API。

许可证

safe_network采用GPLv3许可证,并带有链接例外条款。这意味着你可以从任何程序(无论是专有还是开源)链接和使用该库,但如果你修改safe_network,则必须在GPLv3条款下分发修改版本的源代码。

安装

安装为二进制程序

cargo install safe_network

这将全局安装sn_node二进制程序。

安装为库

在项目目录中运行以下Cargo命令:

cargo add safe_network

或者在Cargo.toml中添加:

safe_network = "0.58.13"

示例代码

以下是一个使用safe_network构建去中心化P2P应用的完整示例:

use safe_network::{Client, Config, Error};
use sn_data_types::Keypair;

#[tokio::main]
async fn main() -> Result<(), Error> {
    // 1. 创建配置
    let config = Config::default();
    
    // 2. 生成密钥对
    let keypair = Keypair::new_ed25519();
    
    // 3. 创建客户端
    let client = Client::new(config, keypair).await?;
    
    // 4. 连接到网络
    client.connect().await?;
    
    // 5. 存储数据
    let data = b"Hello, Safe Network!";
    let address = client.store(data).await?;
    println!("Stored data at address: {:?}", address);
    
    // 6. 读取数据
    let retrieved_data = client.read(address).await?;
    println!("Retrieved data: {:?}", retrieved_data);
    
    Ok(())
}

完整示例demo

以下是一个更完整的示例,展示了如何使用safe_network进行消息传递和节点发现:

use safe_network::{Client, Config, Error, Message, NodeEvent};
use sn_data_types::Keypair;
use std::time::Duration;
use tokio::time;

#[tokio::main]
async fn main() -> Result<(), Error> {
    // 1. 创建配置
    let mut config = Config::default();
    config.network_name = "my_private_network".to_string();
    
    // 2. 生成密钥对
    let keypair = Keypair::new_ed25519();
    println!("Public key: {:?}", keypair.public_key());
    
    // 3. 创建客户端
    let client = Client::new(config, keypair).await?;
    
    // 4. 连接到网络
    client.connect().await?;
    println!("Connected to the network successfully");
    
    // 5. 监听网络事件
    let mut events = client.subscribe_to_events();
    tokio::spawn(async move {
        while let Ok(event) = events.recv().await {
            match event {
                NodeEvent::MessageReceived { msg, .. } => {
                    println!("Received message: {:?}", msg);
                }
                NodeEvent::NewPeerConnected { peer } => {
                    println!("New peer connected: {:?}", peer);
                }
                _ => {}
            }
        }
    });
    
    // 6. 存储数据
    let data = b"Hello, Safe Network!";
    let address = client.store(data).await?;
    println!("Stored data at address: {:?}", address);
    
    // 7. 读取数据
    let retrieved_data = client.read(address).await?;
    println!("Retrieved data: {:?}", retrieved_data);
    
    // 8. 发送消息
    let message = Message::broadcast("test_topic", b"This is a test message");
    client.send_message(message).await?;
    println!("Message sent to network");
    
    // 9. 保持连接
    loop {
        time::sleep(Duration::from_secs(10)).await;
    }
}

功能说明

  1. 去中心化网络:safe_network构建的P2P网络没有中心节点,所有节点平等参与网络维护。
  2. 隐私保护:通过加密和匿名路由技术保护用户隐私。
  3. 数据存储:提供安全的分布式数据存储功能。
  4. 消息传递:支持节点间的安全消息传递。
  5. 节点发现:自动发现和连接网络中的其他节点。
  6. 事件订阅:可以订阅网络事件,如新节点连接和消息接收。

贡献

欢迎贡献代码、修复bug或报告问题。请参考项目贡献指南了解如何参与。


1 回复

Rust安全网络库safe_network的使用:构建去中心化、隐私保护的P2P网络应用

介绍

safe_network是一个用Rust编写的安全网络库,专注于构建去中心化、隐私保护的P2P网络应用。它提供了以下核心特性:

  • 完全去中心化的网络架构
  • 端到端加密通信
  • 数据隐私保护
  • 抗审查设计
  • 自我修复的网络拓扑

该库基于MaidSafe项目开发,旨在为开发者提供构建安全分布式应用的基础设施。

安装方法

在Cargo.toml中添加依赖:

[dependencies]
safe_network = "0.68.0"

基本使用方法

1. 初始化节点

use safe_network::{Config, Node};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建配置
    let config = Config::default();
    
    // 启动节点
    let node = Node::new(config).await?;
    
    println!("节点已启动,ID: {:?}", node.id());
    
    Ok(())
}

2. 加入网络

use safe_network::{Config, Node, BootstrapConfig};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let config = Config {
        bootstrap: BootstrapConfig::from_contacts(vec![
            "/ip4/1.2.3.4/tcp/1234/p2p/12D3KooW...".parse()?,
            "/ip4/5.6.7.8/tcp/5678/p2p/12D3KooW...".parse()?
        ]),
        ..Default::default()
    };
    
    let node = Node::new(config).await?;
    println!("已连接到网络");
    
    Ok(())
}

3. 发送和接收消息

use safe_network::{Config, Node, Message};
use bytes::Bytes;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let node = Node::new(Config::default()).await?;
    
    // 发送消息
    let recipient = "12D3KooW...".parse()?;
    let message = Message::user_msg(Bytes::from("Hello, Safe Network!"));
    node.send_message(recipient, message).await?;
    
    // 接收消息
    while let Some((sender, message)) = node.next().await {
        println!("收到来自 {:?} 的消息: {:?}", sender, message);
    }
    
    Ok(())
}

高级功能

1. 数据存储和检索

use safe_network::{Config, Node};
use bytes::Bytes;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let node = Node::new(Config::default()).await?;
    
    // 存储数据
    let data = Bytes::from("这是要存储的私有数据");
    let address = node.store_data(data).await?;
    println!("数据存储地址: {:?}", address);
    
    // 检索数据
    let retrieved_data = node.get_data(address).await?;
    println!("检索到的数据: {:?}", retrieved_data);
    
    Ok(())
}

2. 创建私有网络

use safe_network::{Config, Node, NetworkConfig};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let config = Config {
        network: NetworkConfig {
            private: true,
            secret_key: Some("你的私钥".to_string()),
            ..Default::default()
        },
        ..Default::default()
    };
    
    let node = Node::new(config).await?;
    println!("私有网络节点已启动");
    
    Ok(())
}

3. 使用DHT功能

use safe_network::{Config, Node, DhtKey};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let node = Node::new(Config::default()).await?;
    
    // 在DHT中存储键值对
    let key = DhtKey::from("my_key");
    let value = Bytes::from("my_value");
    node.dht_put(key.clone(), value).await?;
    
    // 从DHT获取值
    let retrieved = node.dht_get(key).await?;
    println!("获取的值: {:?}", retrieved);
    
    Ok(())
}

完整示例demo

下面是一个完整的P2P聊天应用示例,结合了节点初始化、消息发送和接收功能:

use safe_network::{Config, Node, Message, BootstrapConfig};
use bytes::Bytes;
use tokio::io::{self, AsyncBufReadExt};
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // 初始化配置
    let config = Config {
        bootstrap: BootstrapConfig::from_contacts(vec![
            "/ip4/127.0.0.1/tcp/56215/p2p/12D3KooWQCkb3X7ho5QZ4D4DnV3s4Xh7F7JwQ2J6J6XJ6J6XJ6J".parse()?
        ]),
        ..Default::default()
    };

    // 启动节点
    let node = Node::new(config).await?;
    println!("节点已启动,ID: {:?}", node.id());
    println!("输入 'exit' 退出聊天");

    // 启动消息接收任务
    let node_recv = node.clone();
    tokio::spawn(async move {
        while let Some((sender, msg)) = node_recv.next().await {
            if let Message::UserMsg { data, .. } = msg {
                println!("\n收到来自 {} 的消息: {}", sender, String::from_utf8_lossy(&data));
            }
        }
    });

    // 从标准输入读取消息
    let stdin = io::stdin();
    let mut reader = io::BufReader::new(stdin).lines();
    
    while let Some(line) = reader.next_line().await? {
        if line.trim() == "exit" {
            break;
        }
        
        // 发送消息给所有已知节点
        for peer in node.known_peers().await {
            let msg = Message::user_msg(Bytes::from(line.clone()));
            if let Err(e) = node.send_message(peer, msg).await {
                eprintln!("发送消息错误: {}", e);
            }
        }
    }

    Ok(())
}

安全注意事项

  1. 始终验证你连接的节点
  2. 定期更新密钥材料
  3. 使用最新的库版本以获取安全修复
  4. 在生产环境中使用前彻底测试你的实现

safe_network库为构建安全、去中心化的应用提供了强大基础,但正确配置和使用对于确保系统安全至关重要。

回到顶部