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;
}
}
功能说明
- 去中心化网络:safe_network构建的P2P网络没有中心节点,所有节点平等参与网络维护。
- 隐私保护:通过加密和匿名路由技术保护用户隐私。
- 数据存储:提供安全的分布式数据存储功能。
- 消息传递:支持节点间的安全消息传递。
- 节点发现:自动发现和连接网络中的其他节点。
- 事件订阅:可以订阅网络事件,如新节点连接和消息接收。
贡献
欢迎贡献代码、修复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(())
}
安全注意事项
- 始终验证你连接的节点
- 定期更新密钥材料
- 使用最新的库版本以获取安全修复
- 在生产环境中使用前彻底测试你的实现
safe_network库为构建安全、去中心化的应用提供了强大基础,但正确配置和使用对于确保系统安全至关重要。