Rust轻量级Nostr协议库gnostr的使用,gnostr实现去中心化社交网络通信与事件管理

Rust轻量级Nostr协议库gnostr的使用,gnostr实现去中心化社交网络通信与事件管理

gnostr logo

安装

安装为命令行工具

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协议的库,提供了以下功能:

  1. 密钥对生成和管理
  2. 事件创建和签名
  3. 中继服务器连接
  4. 事件发布和订阅
  5. 去中心化社交网络通信
  6. 事件管理和过滤

这个库非常适合构建基于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(())
}

代码说明

  1. 密钥生成:使用Keys::generate()创建新的Nostr密钥对
  2. 事件创建
    • 创建基本的文本笔记事件
    • 创建加密的私密消息事件
  3. 中继器连接
    • 初始化客户端并连接到指定的中继器
    • 支持发布事件到网络
  4. 消息订阅
    • 创建过滤器订阅特定类型的消息
    • 异步处理接收到的消息
  5. 错误处理
    • 使用Rust的错误处理机制
    • 适合生产环境使用

运行准备

  1. Cargo.toml中添加依赖:
[dependencies]
gnostr = "0.1"
tokio = { version = "1.0", features = ["full"] }
  1. 运行命令:
cargo run

这个示例完整展示了gnostr库的核心功能,包括密钥管理、事件创建、中继器通信和消息订阅等Nostr协议的关键功能。

回到顶部