Rust implementation of Nostr protocol.
If you're writing a typical Nostr client or bot, you may be interested in nostr-sdk.
toml
[dependencies]
nostr = "=0.23.0-bitcoin-v0.29"
```rust,no_run 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::from_sk_str("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", Value::String("my value".into()));
let event: Event = EventBuilder::set_metadata(metadata).to_event(&my_keys)?;
// New text note
let event: Event = EventBuilder::new_text_note("Hello from Nostr SDK", &[]).to_event(&my_keys)?;
// New POW text note
let event: Event = EventBuilder::new_text_note("My first POW text note from Nostr SDK", &[]).to_pow_event(&my_keys, 20)?;
// Convert client nessage to JSON
let json = ClientMessage::new_event(event).as_json();
println!("{json}");
Ok(())
} ```
More examples can be found in the examples/ directory.
This crate supports the wasm32
targets.
On macOS you need to install llvm
:
shell
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.
The following crate feature flags are available:
| Feature | Default | Description |
| ------------------- | :-----: | -------------------------------------------------------------------------------------------------------------------------- |
| blocking
| No | Needed to use NIP-05
and NIP-11
features in not async/await context |
| vanity
| No | Enable vanity public key mining module |
| all-nips
| Yes | Enable all NIPs |
| nip03
| No | Enable NIP-03: OpenTimestamps Attestations for Events |
| nip04
| Yes | Enable NIP-04: Encrypted Direct Message |
| nip05
| Yes | Enable NIP-05: Mapping Nostr keys to DNS-based internet identifiers |
| nip06
| Yes | Enable NIP-06: Basic key derivation from mnemonic seed phrase |
| nip11
| Yes | Enable NIP-11: Relay Information Document |
| nip19
| Yes | Enable NIP-19: bech32-encoded entities |
| nip21
| Yes | Enable NIP-21: nostr
URI scheme |
| nip46
| Yes | Enable NIP-46: Nostr Connect |
| nip47
| Yes | Enable NIP-47: Nostr Wallet Connect |
| Supported | NIP |
|:----------:| ---------------------------------------------------------------------------------------------------------------------------------- |
| ✅ | 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 identifiers |
| ✅ | 06 - Basic key derivation from mnemonic seed phrase |
| ✅ | 09 - Event Deletion |
| ✅ | 10 - Conventions for clients' use of 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 |
| ✅ | 33 - Parameterized Replaceable Events |
| ✅ | 36 - Sensitive Content |
| ✅ | 39 - External Identities in Profiles |
| ✅ | 40 - Expiration Timestamp |
| ✅ | 42 - Authentication of clients to relays |
| ✅ | 45 - Event Counts |
| ✅ | 46 - Nostr Connect |
| ✅ | 47 - Wallet Connect |
| ✅ | 50 - Keywords filter |
| ✅ | 51 - Lists |
| ✅ | 53 - Live Activities |
| ✅ | 56 - Reporting |
| ✅ | 57 - Lightning Zaps |
| ✅ | 58 - Badges |
| ✅ | 65 - Relay List Metadata |
| ✅ | 78 - Arbitrary custom app data |
| ❌ | 89 - Recommended Application Handlers |
| ✅ | 94 - File Metadata |
| ✅ | 98 - HTTP Auth |
| ❌ | 99 - Classified Listings |
This library is in an ALPHA state, things that are implemented generally work but the API will change in breaking ways.
This project is distributed under the MIT software license - see the LICENSE file for details
⚡ Tips: https://getalby.com/p/yuki
⚡ Lightning Address: yuki@getalby.com