50 个版本 (31 个重大更新)

新版本 0.34.0 2024 年 8 月 15 日
0.33.0 2024 年 7 月 16 日
0.32.0 2024 年 6 月 7 日
0.29.0 2024 年 3 月 15 日
0.5.1 2022 年 11 月 14 日

#260 in 网络编程

Download history 580/week @ 2024-04-24 603/week @ 2024-05-01 827/week @ 2024-05-08 852/week @ 2024-05-15 1012/week @ 2024-05-22 549/week @ 2024-05-29 875/week @ 2024-06-05 630/week @ 2024-06-12 572/week @ 2024-06-19 458/week @ 2024-06-26 349/week @ 2024-07-03 695/week @ 2024-07-10 544/week @ 2024-07-17 511/week @ 2024-07-24 491/week @ 2024-07-31 467/week @ 2024-08-07

每月 2,317 次下载
用于 24 个 crate (23 个直接使用)

MIT 和可能 GPL-3.0-or-later

1MB
26K SLoC

Nostr SDK

crates.io crates.io - Downloads Documentation CI MIT

描述

一个用 Rust 编写的,高级 Nostr 客户端库。

如果您正在编写典型的 Nostr 客户端或机器人,这个 crate 可能是您需要的。

然而,该 crate 采用模块化设计,依赖于几个其他较低级别的 crate。如果您尝试进行更定制化的操作,您可能对这些感兴趣

入门

use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4};
use std::str::FromStr;

use nostr_sdk::prelude::*;

#[tokio::main]
async fn main() -> Result<()> {
    // Generate new random keys
    let my_keys = Keys::generate();

    // Or use your already existing (from hex or bech32)
    let my_keys = Keys::parse("hex-or-bech32-secret-key")?;

    // Show bech32 public key
    let bech32_pubkey: String = my_keys.public_key().to_bech32()?;
    println!("Bech32 PubKey: {}", bech32_pubkey);

    // Configure client to use proxy for `.onion` relays
    let addr = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, 9050));
    let connection: Connection = Connection::new()
        .proxy(addr) // Use `.embedded_tor()` instead to enable the embedded tor client (require `tor` feature)
        .target(ConnectionTarget::Onion);
    let opts = Options::new().connection(connection);

    // Create new client with custom options.
    // Use `Client::new(signer)` to construct the client with a custom signer and default options
    // or `Client::default()` to create one without signer and with default options.
    let client = Client::with_opts(&my_keys, opts);

    // Add relays
    client.add_relay("wss://relay.damus.io").await?;
    client.add_relay("ws://jgqaglhautb4k6e6i2g34jakxiemqp6z4wynlirltuukgkft2xuglmqd.onion").await?;
    
    // Add relay with custom options
    client.add_relay_with_opts(
        "wss://relay.nostr.info", 
        RelayOptions::new().write(false)
    ).await?;

    // Connect to relays
    client.connect().await;

    let metadata = Metadata::new()
        .name("username")
        .display_name("My Username")
        .about("Description")
        .picture(Url::parse("https://example.com/avatar.png")?)
        .banner(Url::parse("https://example.com/banner.png")?)
        .nip05("[email protected]")
        .lud16("[email protected]")
        .custom_field("custom_field", "my value");

    // Update metadata
    client.set_metadata(&metadata).await?;

    // Publish a text note
    client.publish_text_note("My first text note from rust-nostr!", []).await?;

    // Create a POW text note
    let event: Event = EventBuilder::text_note("POW text note from nostr-sdk", []).to_pow_event(&my_keys, 20)?;
    client.send_event(event).await?; // Send to all relays
    // client.send_event_to(["wss://relay.damus.io"], event).await?; // Send to specific relay

    // --------- Zap! -------------

    // Configure zapper
    let uri = NostrWalletConnectURI::from_str("nostr+walletconnect://...")?;
    let zapper = NWC::new(uri); // Use `WebLNZapper::new().await` for WebLN
    client.set_zapper(zapper).await;

    // Send SAT without zap event
    let public_key = PublicKey::from_bech32(
        "npub1drvpzev3syqt0kjrls50050uzf25gehpz9vgdw08hvex7e0vgfeq0eseet",
    )?;
    client.zap(public_key, 1000, None).await?;

    // Zap profile
    let details = ZapDetails::new(ZapType::Public).message("Test");
    client.zap(public_key, 1000, Some(details)).await?;

    // Zap event
    let event = Nip19Event::from_bech32("nevent1qqsr0q447ylm3y3tvw07vt69w3kzk026vl6yn3dwm9fweay0dw0jttgpz3mhxue69uhhyetvv9ujumn0wd68ytnzvupzq6xcz9jerqgqkldy8lpg7lglcyj4g3nwzy2cs6u70wejdaj7csnjqvzqqqqqqygequ53")?;
    let details = ZapDetails::new(ZapType::Anonymous).message("Anonymous Zap!");
    client.zap(event, 1000, Some(details)).await?;

    Ok(())
}

更多示例可以在 examples/ 目录中找到。

WASM

此 crate 支持 wasm32 目标。

示例可以在 nostr-sdk-wasm-example 仓库中找到。

在 macOS 上,您需要安装 llvm

brew install llvm
LLVM_PATH=$(brew --prefix llvm)
AR="${LLVM_PATH}/bin/llvm-ar" CC="${LLVM_PATH}/bin/clang" cargo build --target wasm32-unknown-unknown

注意:当前 nip03 功能不支持 WASM。

crate 功能标志

以下 crate 功能标志可用

功能 默认 描述
tor 启用嵌入式 tor 客户端支持
ndb 启用 nostrdb 存储后端
sqlite 启用 SQLite 存储后端
rocksdb 启用 RocksDB 存储后端
indexeddb 启用 Web 的 IndexedDb 存储后端
webln 启用 WebLN zapper
all-nips 启用所有 NIPs
nip03 启用 NIP-03:事件 OpenTimestamps 认证
nip04 启用 NIP-04:加密直接消息
nip05 启用 NIP-05:将 Nostr 密钥映射到基于 DNS 的互联网标识符
nip06 启用 NIP-06:从助记词种子短语生成基本密钥
nip07 启用 NIP-07:为网络浏览器提供 window.nostr 功能(仅适用于 wasm32
nip11 启用 NIP-11:中继信息文档
nip44 启用 NIP-44:加密有效载荷(版本化)
nip46 启用 NIP-46:Nostr Connect
nip47 启用 NIP-47:Nostr 钱包连接
nip49 启用 NIP-49:私钥加密
nip57 启用 NIP-57:Zaps
nip59 启用 NIP-59:包装礼物

嵌入的 Tor 客户端

底层的用于 websockets 的库需要一些更改([PR 在这里](https://github.com/snapview/tungstenite-rs/pull/431))。在合并之前,您必须在您的 Cargo.toml 中添加以下行

[patch.crates-io]
tungstenite = { git = "https://github.com/yukibtc/tungstenite-rs", branch = "tor" }

支持的 NIPs

请参阅 https://github.com/rust-nostr/nostr/tree/master/crates/nostr#supported-nips

状态

此库处于 alpha 状态,已实现的功能通常可以工作,但 API 将以破坏性的方式进行更改。

捐赠

rust-nostr 是免费和开源的。这意味着我们通过出售它来赚取任何收入。相反,我们依靠您的财务支持。如果您积极使用 rust-nostr 的任何库/软件/服务,那么请捐赠

许可

本项目采用 MIT 软件许可协议分发 - 有关详细信息,请参阅LICENSE 文件

依赖关系

~15–42MB
~671K SLoC