Rust数据库插件nostr-database的使用:高效存储与查询Nostr协议数据的Rust库

Rust数据库插件nostr-database的使用:高效存储与查询Nostr协议数据的Rust库

Nostr (Events) Database是一个为nostr应用提供的事件数据库抽象和内存实现的库。

Nostr Database Trait

该库包含NostrDatabaseNostrDatabaseExt trait。您可以使用默认后端或实现自己的后端(如PostgreSQL等)。

默认后端

  • Memory (RAM,原生和Web版本),包含在本库中
  • LMDB (原生),通过nostr-lmdb提供
  • nostrdb (原生),通过nostr-ndb提供
  • IndexedDB (Web),通过nostr-indexeddb提供

Crate Feature Flags

以下是可用的crate feature flags:

Feature Default Description
flatbuf No 为nostr事件启用flatbuffers序列化/反序列化

状态

该库处于ALPHA状态,已实现的功能通常可以工作,但API会以不兼容的方式更改。

捐赠

rust-nostr是免费开源的。这意味着我们不会通过销售它来获得任何收入。相反,我们依赖于您的经济支持。如果您积极使用任何rust-nostr库/软件/服务,请捐赠。

许可证

该项目采用MIT软件许可证分发 - 详情请见LICENSE文件

示例代码

use nostr_database::{MemoryDatabase, NostrDatabase, NostrDatabaseExt};
use nostr::{Event, Filter};

// 创建内存数据库实例
let db = MemoryDatabase::default();

// 创建一个示例事件
let event = Event::new_text_note("Hello Nostr", &[]);

// 存储事件
db.save_event(event.clone()).await?;

// 查询事件
let filter = Filter::new().author(event.author());
let events = db.query(vec![filter]).await?;

// 打印查询结果
println!("Found events: {:?}", events);

完整示例

以下是一个更完整的示例,展示如何使用nostr-database进行基本操作:

use nostr_database::{MemoryDatabase, NostrDatabase, NostrDatabaseExt};
use nostr::{Event, Filter, Keys};
use std::time::SystemTime;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 初始化数据库
    let db = MemoryDatabase::default();
    
    // 生成用户密钥
    let keys = Keys::generate();
    
    // 创建事件
    let event = Event::new_text_note(
        "This is my first Nostr note!",
        &[],
        &keys,
    )?;
    
    // 保存事件到数据库
    db.save_event(event.clone()).await?;
    
    // 创建查询过滤器
    let filter = Filter::new()
        .author(keys.public_key())
        .since(SystemTime::now());
    
    // 查询事件
    let events = db.query(vec![filter]).await?;
    
    // 输出结果
    println!("Found {} events:", events.len());
    for event in events {
        println!("- {}: {}", event.id, event.content);
    }
    
    Ok(())
}

该示例展示了如何:

  1. 初始化内存数据库
  2. 创建Nostr事件
  3. 将事件保存到数据库
  4. 使用过滤器查询事件
  5. 处理查询结果

您可以根据需要修改此示例,例如使用不同的数据库后端或更复杂的查询过滤器。


1 回复

Rust数据库插件nostr-database的使用:高效存储与查询Nostr协议数据

简介

nostr-database是一个专为Nostr协议设计的Rust数据库库,它提供了高效存储和查询Nostr事件数据的功能。这个库特别适合构建Nostr中继服务器或需要本地存储Nostr数据的客户端应用。

主要特性

  • 支持Nostr事件的高效存储和索引
  • 提供灵活的查询接口
  • 内存友好的数据结构设计
  • 支持多种查询条件和排序方式

使用方法

1. 添加依赖

首先在Cargo.toml中添加依赖:

[dependencies]
nostr-database = "0.1"  # 请使用最新版本

2. 基本使用

use nostr_database::{Database, MemoryDatabase};
use nostr::Event;

// 创建内存数据库实例
let database = MemoryDatabase::default();

// 创建Nostr事件
let event = Event::new_text_note("Hello Nostr!", &[]);

// 存储事件
database.save_event(&event).unwrap();

// 查询事件
let events = database.query(vec![]).unwrap();
println!("Found {} events", events.len());

3. 高级查询示例

use nostr_database::{Database, MemoryDatabase, Filter};
use nostr::Kind;

// 创建过滤器
let filter = Filter::new()
    .kind(Kind::TextNote)  // 只查询文本笔记
    .limit(10);            // 限制10条结果

// 执行查询
let events = database.query(vec![filter]).unwrap();

for event in events {
    println!("Event ID: {}", event.id);
    println!("Content: {}", event.content);
}

4. 持久化存储示例

use nostr_database::{Database, RocksDatabase};

// 创建基于RocksDB的持久化数据库
let db_path = "./nostr_db";
let database = RocksDatabase::open(db_path).unwrap();

// 使用方式与内存数据库相同

完整示例Demo

下面是一个完整的nostr-database使用示例,包含内存数据库和持久化数据库的使用:

use nostr_database::{Database, MemoryDatabase, RocksDatabase, Filter};
use nostr::{Event, Kind};

fn main() {
    // 示例1: 内存数据库基础使用
    memory_db_demo();
    
    // 示例2: 持久化数据库使用
    rocks_db_demo();
}

fn memory_db_demo() {
    println!("=== 内存数据库示例 ===");
    
    // 创建内存数据库实例
    let database = MemoryDatabase::default();

    // 创建并存储多个Nostr事件
    let event1 = Event::new_text_note("第一条Nostr消息", &[]);
    let event2 = Event::new_text_note("第二条Nostr消息", &[]);
    let event3 = Event::new(Kind::Metadata, "用户元数据", &[]);

    database.save_event(&event1).unwrap();
    database.save_event(&event2).unwrap();
    database.save_event(&event3).unwrap();

    // 查询所有事件
    let events = database.query(vec![]).unwrap();
    println!("总事件数: {}", events.len());

    // 高级查询: 只查询文本笔记
    let filter = Filter::new()
        .kind(Kind::TextNote)
        .limit(5);
    
    let text_notes = database.query(vec![filter]).unwrap();
    println!("找到 {} 条文本笔记", text_notes.len());
}

fn rocks_db_demo() {
    println!("\n=== RocksDB持久化数据库示例 ===");
    
    // 创建持久化数据库
    let db_path = "./nostr_data";
    let database = RocksDatabase::open(db_path).unwrap();

    // 创建并存储事件
    let event = Event::new_text_note("持久化存储的Nostr消息", &[]);
    database.save_event(&event).unwrap();

    // 查询事件
    let filter = Filter::new().limit(1);
    let events = database.query(vec![filter]).unwrap();
    
    for event in events {
        println!("存储的事件内容: {}", event.content);
    }
    
    // 实际应用中记得在适当的时候关闭数据库
}

性能优化建议

  1. 对于频繁查询的字段,考虑创建自定义索引
  2. 批量插入事件时使用事务
  3. 根据应用场景选择合适的数据库后端

注意事项

  • 当前版本可能还在开发中,API可能会有变动
  • 生产环境使用前请充分测试性能
  • 大型数据集需要考虑内存使用情况

nostr-database为Rust开发者提供了一个简单高效的方式来处理Nostr协议数据,是构建Nostr相关应用的理想选择。

回到顶部