Crate nostr

source ·
Expand description

Rust implementation of the Nostr protocol.

§Nostr

crates.io crates.io - Downloads Documentation Rustc Version 1.64.0+ CI MIT

§Description

Rust implementation of Nostr protocol.

You may be interested in:

§Getting started

[dependencies]
nostr = "0.30"
use nostr::prelude::*;

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);

    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("username@example.com")
        .lud16("yuki@getalby.com")
        .custom_field("custom_field", "my value");

    let event: Event = EventBuilder::metadata(&metadata).to_event(&my_keys)?;

    // New text note
    let event: Event = EventBuilder::text_note("Hello from Nostr SDK", []).to_event(&my_keys)?;

    // New POW text note
    let event: Event = EventBuilder::text_note("My first POW text note from Nostr SDK", []).to_pow_event(&my_keys, 20)?;

    // Convert client nessage to JSON
    let json = ClientMessage::event(event).as_json();
    println!("{json}");

    Ok(())
}

More examples can be found in the examples/ directory.

§WASM

This crate supports the wasm32 targets.

On macOS you need to install 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

NOTE: Currently nip03 feature not support WASM.

§Embedded

This crate support no_std environments.

Check the example in the embedded/ directory.

§Crate Feature Flags

The following crate feature flags are available:

FeatureDefaultDescription
stdYesEnable std library
allocNoNeeded to use this library in no_std context
blockingNoNeeded to use NIP-05 and NIP-11 features in not async/await context
all-nipsYesEnable all NIPs
nip03NoEnable NIP-03: OpenTimestamps Attestations for Events
nip04YesEnable NIP-04: Encrypted Direct Message
nip05YesEnable NIP-05: Mapping Nostr keys to DNS-based internet identifiers
nip06YesEnable NIP-06: Basic key derivation from mnemonic seed phrase
nip07YesEnable NIP-07: window.nostr capability for web browsers (available only for wasm32!)
nip11YesEnable NIP-11: Relay Information Document
nip44YesEnable NIP-44: Encrypted Payloads (Versioned)
nip46YesEnable NIP-46: Nostr Connect
nip47YesEnable NIP-47: Nostr Wallet Connect
nip49YesEnable NIP-49: Private Key Encryption
nip57YesEnable NIP-57: Zaps
nip59YesEnable NIP-59: Gift Wrap

§Supported NIPs

SupportedNIP
01 - Basic protocol flow description
02 - Contact List and Petnames
03 - OpenTimestamps Attestations for Events
04 - Encrypted Direct Message
05 - Mapping Nostr keys to DNS-based internet ids
06 - Basic key derivation from mnemonic seed phrase
07 - window.nostr capability for web browsers
09 - Event Deletion
10 - On “e” and “p” tags in Text Events
11 - Relay Information Document
12 - Generic Tag Queries
13 - Proof of Work
14 - Subject tag in text events
15 - Nostr Marketplace
16 - Event Treatment
18 - Reposts
19 - bech32-encoded entities
20 - Command Results
21 - URI scheme
23 - Long-form Content
25 - Reactions
26 - Delegated Event Signing
27 - Text Note References
28 - Public Chat
30 - Custom Emoji
31 - Dealing with Unknown Events
32 - Labeling
36 - Sensitive Content
39 - External Identities in Profiles
40 - Expiration Timestamp
42 - Authentication of clients to relays
44 - Encrypted Payloads (Versioned)
45 - Event Counts
46 - Nostr Connect
47 - Wallet Connect
48 - Proxy Tags
49 - Private Key Encryption
50 - Keywords filter
51 - Lists
53 - Live Activities
56 - Reporting
57 - Lightning Zaps
58 - Badges
59 - Gift Wrap
65 - Relay List Metadata
78 - Arbitrary custom app data
89 - Recommended Application Handlers
90 - Data Vending Machine
94 - File Metadata
98 - HTTP Auth
99 - Classified Listings

§State

This library is in an ALPHA state, things that are implemented generally work but the API will change in breaking ways.

§Donations

rust-nostr is free and open-source. This means we do not earn any revenue by selling it. Instead, we rely on your financial support. If you actively use any of the rust-nostr libs/software/services, then please donate.

§License

This project is distributed under the MIT software license - see the LICENSE file for details

Modules§