Rust轻量级Nostr协议库gnostr的使用,gnostr实现去中心化社交网络通信与事件管理
Rust轻量级Nostr协议库gnostr的使用,gnostr实现去中心化社交网络通信与事件管理
安装
安装为命令行工具
cargo install gnostr
这将全局安装以下二进制文件:
git-ssh
, git_remote_nostr
, gnostr
, gnostr-blockhash
, gnostr-blockheight
, gnostr-query
, gnostr-sha256
, gnostr-weeble
, gnostr-wobble
安装为库
在项目目录中运行以下Cargo命令:
cargo add gnostr
或者在Cargo.toml中添加以下行:
gnostr = "0.0.111"
示例代码
以下是一个使用gnostr库实现基本Nostr协议功能的完整示例:
use gnostr::prelude::*;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 创建一个新的密钥对
let keys = Keys::generate();
// 创建一个简单的事件
let event = EventBuilder::new_text_note("Hello from Rust gnostr!", &keys)?;
// 连接到中继服务器
let relay = Relay::connect("wss://relay.damus.io").await?;
// 发布事件
relay.publish_event(event).await?;
// 订阅事件
let subscription = Filter::new().limit(10);
relay.subscribe(subscription, |event| {
println!("Received event: {:?}", event);
}).await?;
Ok(())
}
完整示例demo
以下是一个更完整的gnostr使用示例,展示了更多功能:
use gnostr::prelude::*;
use std::time::{SystemTime, UNIX_EPOCH};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. 密钥管理
// 生成新密钥对
let keys = Keys::generate();
println!("公钥: {}", keys.public_key());
println!("私钥: {}", keys.secret_key()?);
// 2. 创建多种事件类型
// 文本消息
let text_event = EventBuilder::new_text_note("这是来自gnostr的测试消息", &keys)?;
// 自定义事件
let timestamp = SystemTime::now()
.duration_since(UNIX_EPOCH)?
.as_secs();
let custom_event = EventBuilder::new(
Kind::Custom(12345),
"自定义事件内容",
&keys,
)?.created_at(timestamp).build();
// 3. 中继操作
// 连接中继
let relay = Relay::connect("wss://relay.damus.io").await?;
// 发布多个事件
relay.publish_event(text_event).await?;
relay.publish_event(custom_event).await?;
// 4. 订阅和过滤
// 创建多个过滤器
let text_filter = Filter::new()
.kind(Kind::TextNote)
.limit(5);
let custom_filter = Filter::new()
.kind(Kind::Custom(12345))
.since(timestamp - 3600); // 过去一小时
// 订阅多个过滤器
relay.subscribe(text_filter, |event| {
println!("收到文本事件: {:?}", event);
}).await?;
relay.subscribe(custom_filter, |event| {
println!("收到自定义事件: {:?}", event);
}).await?;
// 5. 关闭连接
tokio::time::sleep(std::time::Duration::from_secs(30)).await;
relay.close().await?;
Ok(())
}
特性
gnostr是一个轻量级的Rust实现Nostr协议的库,提供了以下功能:
- 密钥对生成和管理
- 事件创建和签名
- 中继服务器连接
- 事件发布和订阅
- 去中心化社交网络通信
- 事件管理和过滤
这个库非常适合构建基于Nostr协议的去中心化应用程序和社交网络工具。
元数据
- 版本: 0.0.111
- 许可证: MIT
- 大小: 1.5 MiB
- 分类: 命令行工具
- 所有者: @RandyMcMillan
1 回复
以下是基于您提供的gnostr库内容的完整示例Demo,展示了如何创建一个完整的Nostr客户端应用:
use gnostr::{
client::Client,
event::{Event, Kind},
filter::Filter,
key::Keys,
relay::Relay,
subscription::Subscription,
};
use std::time::{SystemTime, UNIX_EPOCH};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. 生成密钥对
let keys = Keys::generate();
println!("=== 生成的密钥对 ===");
println!("公钥: {}", keys.public_key());
println!("私钥: {}\n", keys.secret_key().unwrap());
// 2. 创建文本事件
let text_event = Event::new(
Kind::TextNote,
"这是我的第一条Nostr消息!".to_string(),
&keys,
None,
None,
SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs(),
)?;
println!("=== 创建的事件 ===");
println!("{:?}\n", text_event);
// 3. 初始化客户端并连接中继器
let relay_url = "wss://relay.damus.io";
let relay = Relay::new(relay_url);
let client = Client::new();
client.add_relay(relay).await?;
client.connect().await;
println!("=== 已连接到中继器: {} ===\n", relay_url);
// 4. 发布事件
client.publish_event(&keys, text_event.clone()).await?;
println!("=== 事件已发布 ===\n");
// 5. 创建加密消息
let receiver_pubkey = "替换为接收者的公钥";
let encrypted_event = Event::new_encrypted_direct_message(
&keys,
receiver_pubkey,
"这是加密的测试消息",
None,
SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs(),
)?;
println!("=== 加密的消息事件 ===");
println!("{:?}\n", encrypted_event);
// 6. 订阅事件
let filter = Filter::new()
.kind(Kind::TextNote)
.author(keys.public_key())
.limit(5);
let subscription = Subscription::new("my-sub", vec![filter]);
client.subscribe(subscription).await?;
println!("=== 已订阅自己的消息 ===\n");
// 7. 处理接收到的消息
tokio::spawn(async move {
println!("=== 开始监听消息 ===");
while let Some(msg) = client.next_message().await {
println!("收到消息: {:?}", msg);
}
});
// 保持连接一段时间
tokio::time::sleep(std::time::Duration::from_secs(30)).await;
// 断开连接
client.disconnect().await;
println!("=== 已断开连接 ===");
Ok(())
}
代码说明
- 密钥生成:使用
Keys::generate()
创建新的Nostr密钥对 - 事件创建:
- 创建基本的文本笔记事件
- 创建加密的私密消息事件
- 中继器连接:
- 初始化客户端并连接到指定的中继器
- 支持发布事件到网络
- 消息订阅:
- 创建过滤器订阅特定类型的消息
- 异步处理接收到的消息
- 错误处理:
- 使用Rust的错误处理机制
- 适合生产环境使用
运行准备
- 在
Cargo.toml
中添加依赖:
[dependencies]
gnostr = "0.1"
tokio = { version = "1.0", features = ["full"] }
- 运行命令:
cargo run
这个示例完整展示了gnostr库的核心功能,包括密钥管理、事件创建、中继器通信和消息订阅等Nostr协议的关键功能。