Rust implementation of Nostr protocol.
If you're writing a typical Nostr client or bot, you may be interested in nostr-sdk.
[dependencies]
nostr = "0.19"
tungstenite = { version = "0.18", features = ["rustls-tls-webpki-roots"]}
use nostr::prelude::*;
use tungstenite::{Message as WsMessage};
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("[email protected]")
.lud16("[email protected]");
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)?;
// Connect to relay
let (mut socket, _) = tungstenite::connect("wss://relay.damus.io").expect("Can't connect to relay");
// Send msg
let msg = ClientMessage::new_event(event).as_json();
socket.write_message(WsMessage::Text(msg)).expect("Impossible to send message");
Ok(())
}
More examples can be found in the examples/ directory.
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 you must disable nip03
feature to allow compilation on wasm
targets.
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 |
nip46 |
Yes | Enable NIP-46: Nostr Connect |
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: [email protected]