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 网络编程
每月 2,317 次下载
用于 24 个 crate (23 个直接使用)
1MB
26K SLoC
Nostr SDK
描述
一个用 Rust 编写的,高级 Nostr 客户端库。
如果您正在编写典型的 Nostr 客户端或机器人,这个 crate 可能是您需要的。
然而,该 crate 采用模块化设计,依赖于几个其他较低级别的 crate。如果您尝试进行更定制化的操作,您可能对这些感兴趣
nostr
: Nostr 协议的 Rust 实现nostr-database
: Nostr 应用程序的数据库nostr-relay-pool
: Nostr 代理池nostr-signer
: Nostr 应用的签名者nostr-zapper
: Nostr 应用的 Zapper 抽象nwc
: Nostr 应用的NWC
客户端和 zapper 后端
入门
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