From cf4140aae9c2e3fe5df9615d58e551df6af6f4f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Calder=C3=B3n?= Date: Tue, 10 Dec 2024 13:15:46 -0300 Subject: [PATCH] Bumps to nostr-sdk 0.37 Fixes related to nostr sdk upgrade and payload --- Cargo.lock | 134 ++++------------------------------------------- Cargo.toml | 4 +- src/app.rs | 4 +- src/nip59.rs | 23 ++++++-- src/scheduler.rs | 4 +- src/util.rs | 30 +++++------ 6 files changed, 50 insertions(+), 149 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 29738fea..1cde3128 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -577,12 +577,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - [[package]] name = "chacha20" version = "0.9.1" @@ -1473,7 +1467,6 @@ dependencies = [ "tokio", "tokio-rustls 0.26.0", "tower-service", - "webpki-roots 0.26.6", ] [[package]] @@ -1840,18 +1833,6 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" -[[package]] -name = "lnurl-pay" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "536e7c782167a2d48346ca0b2677fad19eaef20f19a4ab868e4d5b96ca879def" -dependencies = [ - "bech32 0.11.0", - "reqwest", - "serde", - "serde_json", -] - [[package]] name = "lnurl-rs" version = "0.8.0" @@ -2010,9 +1991,9 @@ dependencies = [ [[package]] name = "mostro-core" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "789e88b48f35ab22d655d2ebf0674b4c3b4f31e4ee5f3c965398becb3bf9ead7" +checksum = "0c5609bc9985505f2190e8c6e657872f71a83942133aa75a067420d96cf86854" dependencies = [ "anyhow", "bitcoin", @@ -2074,11 +2055,10 @@ dependencies = [ [[package]] name = "nostr" -version = "0.36.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14ad56c1d9a59f4edc46b17bc64a217b38b99baefddc0080f85ad98a0855336d" +checksum = "8aad4b767bbed24ac5eb4465bfb83bc1210522eb99d67cf4e547ec2ec7e47786" dependencies = [ - "aes", "async-trait", "base64 0.22.1", "bech32 0.11.0", @@ -2089,26 +2069,21 @@ dependencies = [ "chacha20poly1305", "getrandom", "instant", - "js-sys", "negentropy 0.3.1", "negentropy 0.4.3", "once_cell", - "reqwest", "scrypt", "serde", "serde_json", "unicode-normalization", "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", ] [[package]] name = "nostr-database" -version = "0.36.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1859abebf78d7d9e945b20c8faaf710c9db905adeb148035b803ae45792dbebe" +checksum = "23696338d51e45cd44e061823847f4b0d1d362eca80d5033facf9c184149f72f" dependencies = [ "async-trait", "lru", @@ -2120,9 +2095,9 @@ dependencies = [ [[package]] name = "nostr-relay-pool" -version = "0.36.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e39cfcb30cab86b30ca9acba89f5ccb25a4142a5dc5fcfbf3edf34b204ddd7c7" +checksum = "15fcc6e3f0ca54d0fc779009bc5f2684cea9147be3b6aa68a7d301ea590f95f5" dependencies = [ "async-utility", "async-wsocket", @@ -2139,34 +2114,20 @@ dependencies = [ [[package]] name = "nostr-sdk" -version = "0.36.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4739ed15ff81a0e474d79b38c3eb481ff5f968c1865f38ba46852daf6f6495e" +checksum = "491221fc89b1aa189a0de640127127d68b4e7c5c1d44371b04d9a6d10694b5af" dependencies = [ "async-utility", "atomic-destructor", - "lnurl-pay", "nostr", "nostr-database", "nostr-relay-pool", - "nostr-zapper", - "nwc", "thiserror", "tokio", "tracing", ] -[[package]] -name = "nostr-zapper" -version = "0.36.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d9709ecf8050bbe4ecf0e5efda2f25b690bb1761fc504e05654621ba9e568a8" -dependencies = [ - "async-trait", - "nostr", - "thiserror", -] - [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -2186,21 +2147,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "nwc" -version = "0.36.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5f98bcaf232b3ec48e018792ca7bc2b90e7520d001a07b8218a9e76a03fda2" -dependencies = [ - "async-trait", - "async-utility", - "nostr", - "nostr-relay-pool", - "nostr-zapper", - "thiserror", - "tracing", -] - [[package]] name = "object" version = "0.36.5" @@ -2570,55 +2516,6 @@ dependencies = [ "prost", ] -[[package]] -name = "quinn" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" -dependencies = [ - "bytes", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls 0.23.16", - "socket2", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "quinn-proto" -version = "0.11.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" -dependencies = [ - "bytes", - "rand", - "ring 0.17.8", - "rustc-hash", - "rustls 0.23.16", - "slab", - "thiserror", - "tinyvec", - "tracing", -] - -[[package]] -name = "quinn-udp" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.59.0", -] - [[package]] name = "quote" version = "1.0.37" @@ -2747,10 +2644,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "quinn", - "rustls 0.23.16", "rustls-pemfile 2.2.0", - "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", @@ -2758,14 +2652,12 @@ dependencies = [ "system-configuration", "tokio", "tokio-native-tls", - "tokio-rustls 0.26.0", "tokio-socks", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 0.26.6", "windows-registry", ] @@ -2827,12 +2719,6 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" -[[package]] -name = "rustc-hash" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" - [[package]] name = "rustix" version = "0.38.39" diff --git a/Cargo.toml b/Cargo.toml index 1a0e42bb..7515cb19 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ anyhow = "1.0.89" chrono = "0.4.35" easy-hasher = "2.2.1" lightning-invoice = { version = "0.32.0", features = ["std"] } -nostr-sdk = "0.36.0" +nostr-sdk = { version = "0.37.0", features = ["nip59"] } serde = { version = "1.0.210" } serde_json = "1.0.128" sqlx = { version = "0.6.2", features = [ @@ -38,7 +38,7 @@ uuid = { version = "1.8.0", features = [ "serde", ] } reqwest = { version = "0.12.1", features = ["json"] } -mostro-core = { version = "0.6.13", features = ["sqlx"] } +mostro-core = { version = "0.6.14", features = ["sqlx"] } tracing = "0.1.40" tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } config = "0.14.0" diff --git a/src/app.rs b/src/app.rs index 720889f4..fde37218 100644 --- a/src/app.rs +++ b/src/app.rs @@ -58,10 +58,12 @@ async fn process_message(pool: &Pool, event: &UnwrappedGift, msg: Messag match is_user_present(&pool, event.sender.to_string()).await { Ok(mut user) => { if let (true, index) = message_kind.has_trade_index() { + let (_, sig): (String, nostr_sdk::secp256k1::schnorr::Signature) = + serde_json::from_str(&event.rumor.content).unwrap(); if index > user.trade_index && msg .get_inner_message_kind() - .verify_signature(event.sender, event.rumor.content.) + .verify_signature(event.sender, sig) { user.trade_index = index; if let Ok(_) = user.update(&pool).await { diff --git a/src/nip59.rs b/src/nip59.rs index d6b25e39..9440db26 100644 --- a/src/nip59.rs +++ b/src/nip59.rs @@ -1,4 +1,5 @@ use base64::engine::{general_purpose, Engine}; +use mostro_core::message::Message; use nostr_sdk::event::builder::Error as BuilderError; use nostr_sdk::nostr::nips::nip44::v2::{decrypt_to_bytes, encrypt_to_bytes, ConversationKey}; use nostr_sdk::prelude::*; @@ -18,10 +19,17 @@ use nostr_sdk::prelude::*; pub fn gift_wrap( sender_keys: &Keys, receiver: PublicKey, - content: String, + payload: String, expiration: Option, ) -> Result { - let rumor: UnsignedEvent = EventBuilder::text_note(content, []).build(sender_keys.public_key()); + // We convert back the string to a message + let message = Message::from_json(&payload).unwrap(); + // We sign the message + let sig = message.get_inner_message_kind().sign(sender_keys); + // We compose the content + let content = (message, sig); + let content = serde_json::to_string(&content).unwrap(); + let rumor: UnsignedEvent = EventBuilder::text_note(content).build(sender_keys.public_key()); let seal: Event = seal(sender_keys, &receiver, rumor)?.sign_with_keys(sender_keys)?; gift_wrap_from_seal(&receiver, &seal, expiration) @@ -39,7 +47,7 @@ pub fn seal( // Encode with base64 let b64decoded_content = general_purpose::STANDARD.encode(encrypted_content); // Compose builder - Ok(EventBuilder::new(Kind::Seal, b64decoded_content, []) + Ok(EventBuilder::new(Kind::Seal, b64decoded_content) .custom_created_at(Timestamp::tweaked(nip59::RANGE_RANDOM_TIMESTAMP_TWEAK))) } @@ -60,11 +68,16 @@ pub fn gift_wrap_from_seal( if let Some(timestamp) = expiration { tags.push(Tag::expiration(timestamp)); } + let tags = Tags::new(tags); // Encode with base64 let b64decoded_content = general_purpose::STANDARD.encode(encrypted_content); - EventBuilder::new(Kind::GiftWrap, b64decoded_content, tags) + let event = EventBuilder::new(Kind::GiftWrap, b64decoded_content) + .tags(tags) .custom_created_at(Timestamp::tweaked(nip59::RANGE_RANDOM_TIMESTAMP_TWEAK)) - .sign_with_keys(&ephemeral_keys) + .build(ephemeral_keys.public_key()) + .sign_with_keys(&ephemeral_keys)?; + + Ok(event) } pub fn unwrap_gift_wrap(keys: &Keys, gift_wrap: &Event) -> Result { diff --git a/src/scheduler.rs b/src/scheduler.rs index 9ba7a885..1e66e8e4 100644 --- a/src/scheduler.rs +++ b/src/scheduler.rs @@ -50,8 +50,8 @@ async fn job_relay_list() { } } - if let Ok(relay_ev) = EventBuilder::new(NostrKind::RelayList, "", relay_tags) - .sign_with_keys(&mostro_keys) + if let Ok(relay_ev) = + EventBuilder::new(NostrKind::RelayList, "").sign_with_keys(&mostro_keys) { if let Ok(client) = get_nostr_client() { let _ = client.send_event(relay_ev).await; diff --git a/src/util.rs b/src/util.rs index a8f9a222..11cf4d6a 100644 --- a/src/util.rs +++ b/src/util.rs @@ -14,14 +14,13 @@ use crate::NOSTR_CLIENT; use anyhow::{Context, Error, Result}; use chrono::Duration; -use mostro_core::message::{Action, Payload, Message}; +use mostro_core::message::{Action, Message, Payload}; use mostro_core::order::{Kind as OrderKind, Order, SmallOrder, Status}; use nostr::nips::nip59::UnwrappedGift; use nostr_sdk::prelude::*; use sqlx::SqlitePool; use sqlx_crud::Crud; use std::fmt::Write; -use std::path::is_separator; use std::str::FromStr; use std::sync::Arc; use std::thread; @@ -259,12 +258,12 @@ async fn prepare_new_order( pub async fn send_dm( receiver_pubkey: &PublicKey, sender_keys: Keys, - content: String, + payload: String, ) -> Result<()> { - let event = gift_wrap(&sender_keys, *receiver_pubkey, content.clone(), None)?; + let event = gift_wrap(&sender_keys, *receiver_pubkey, payload.clone(), None)?; info!( - "Sending DM, Event ID: {} with content: {:#?}", - event.id, content + "Sending DM, Event ID: {} with payload: {:#?}", + event.id, payload ); if let Ok(client) = get_nostr_client() { @@ -618,11 +617,11 @@ pub async fn send_cant_do_msg( message: Option, destination_key: &PublicKey, ) { - // Prepare content in case - let content = message.map(Payload::TextMessage); + // Prepare payload in case + let payload = message.map(Payload::TextMessage); // Send message to event creator - let message = Message::cant_do(order_id, request_id, content, None); + let message = Message::cant_do(order_id, request_id, payload); if let Ok(message) = message.as_json() { let sender_keys = crate::util::get_keys().unwrap(); let _ = send_dm(destination_key, sender_keys, message).await; @@ -633,12 +632,12 @@ pub async fn send_new_order_msg( request_id: Option, order_id: Option, action: Action, - content: Option, + payload: Option, destination_key: &PublicKey, trade_index: Option, ) { // Send message to event creator - let message = Message::new_order(order_id, request_id, trade_index, action, content, None); + let message = Message::new_order(order_id, request_id, trade_index, action, payload); if let Ok(message) = message.as_json() { let sender_keys = crate::util::get_keys().unwrap(); let _ = send_dm(destination_key, sender_keys, message).await; @@ -674,7 +673,7 @@ pub fn get_nostr_client() -> Result<&'static Client> { } /// Getter function with error management for nostr relays -pub async fn get_nostr_relays() -> Option> { +pub async fn get_nostr_relays() -> Option> { if let Some(client) = NOSTR_CLIENT.get() { Some(client.relays().await) } else { @@ -753,9 +752,9 @@ mod tests { initialize(); // Mock the send_dm function let receiver_pubkey = Keys::generate().public_key(); - let content = "Test message".to_string(); + let payload = "Test message".to_string(); let sender_keys = Keys::generate(); - let result = send_dm(&receiver_pubkey, sender_keys, content).await; + let result = send_dm(&receiver_pubkey, sender_keys, payload).await; assert!(result.is_ok()); } @@ -770,8 +769,9 @@ mod tests { ..Default::default() }; let message = Message::Order(MessageKind::new( - Some(1), Some(uuid), + Some(1), + Some(1), Action::TakeSell, Some(Payload::Amount(order.amount)), ));