From e1b90b056fe6a339acd4f9726cc10813d96bc741 Mon Sep 17 00:00:00 2001 From: pythcoiner Date: Mon, 17 Mar 2025 12:36:57 +0100 Subject: [PATCH] lianad: in DaemonControl::update_deriv_indexes() limit the gap the index can be incremented and return db indexes --- liana-gui/src/daemon/client/mod.rs | 4 +- liana-gui/src/daemon/embedded.rs | 3 +- liana-gui/src/daemon/mod.rs | 3 +- liana-gui/src/lianalite/client/backend/mod.rs | 4 +- lianad/src/commands/mod.rs | 59 ++++++++++++++----- lianad/src/jsonrpc/api.rs | 5 +- 6 files changed, 54 insertions(+), 24 deletions(-) diff --git a/liana-gui/src/daemon/client/mod.rs b/liana-gui/src/daemon/client/mod.rs index c0f69263..53651d36 100644 --- a/liana-gui/src/daemon/client/mod.rs +++ b/liana-gui/src/daemon/client/mod.rs @@ -5,7 +5,7 @@ use std::path::Path; use async_trait::async_trait; use lianad::bip329::Labels; -use lianad::commands::GetLabelsBip329Result; +use lianad::commands::{GetLabelsBip329Result, UpdateDerivIndexesResult}; use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; use serde_json::json; @@ -87,7 +87,7 @@ impl Daemon for Lianad { &self, receive: Option, change: Option, - ) -> Result<(), DaemonError> { + ) -> Result { self.call("updatederivationindexes", Some(vec![receive, change])) } diff --git a/liana-gui/src/daemon/embedded.rs b/liana-gui/src/daemon/embedded.rs index 96e63613..94935ab3 100644 --- a/liana-gui/src/daemon/embedded.rs +++ b/liana-gui/src/daemon/embedded.rs @@ -1,4 +1,5 @@ use lianad::bip329::Labels; +use lianad::commands::UpdateDerivIndexesResult; use std::collections::{HashMap, HashSet}; use std::path::Path; use tokio::sync::Mutex; @@ -102,7 +103,7 @@ impl Daemon for EmbeddedDaemon { &self, receive: Option, change: Option, - ) -> Result<(), DaemonError> { + ) -> Result { self.command(|daemon| { daemon .update_deriv_indexes(receive, change) diff --git a/liana-gui/src/daemon/mod.rs b/liana-gui/src/daemon/mod.rs index e2706271..5a9e9755 100644 --- a/liana-gui/src/daemon/mod.rs +++ b/liana-gui/src/daemon/mod.rs @@ -15,6 +15,7 @@ use liana::miniscript::bitcoin::{ address, bip32::Fingerprint, psbt::Psbt, secp256k1, Address, Network, OutPoint, Txid, }; use lianad::bip329::Labels; +use lianad::commands::UpdateDerivIndexesResult; use lianad::{ commands::{CoinStatus, LabelItem, TransactionInfo}, config::Config, @@ -90,7 +91,7 @@ pub trait Daemon: Debug { &self, receive: Option, change: Option, - ) -> Result<(), DaemonError>; + ) -> Result; async fn list_coins( &self, statuses: &[CoinStatus], diff --git a/liana-gui/src/lianalite/client/backend/mod.rs b/liana-gui/src/lianalite/client/backend/mod.rs index e6095090..7b1ffaf2 100644 --- a/liana-gui/src/lianalite/client/backend/mod.rs +++ b/liana-gui/src/lianalite/client/backend/mod.rs @@ -14,7 +14,7 @@ use liana::{ }; use lianad::{ bip329::Labels, - commands::{CoinStatus, GetInfoDescriptors, LCSpendInfo, LabelItem}, + commands::{CoinStatus, GetInfoDescriptors, LCSpendInfo, LabelItem, UpdateDerivIndexesResult}, config::Config, }; use reqwest::{Error, IntoUrl, Method, RequestBuilder, Response}; @@ -631,7 +631,7 @@ impl Daemon for BackendWalletClient { &self, _receive: Option, _change: Option, - ) -> Result<(), DaemonError> { + ) -> Result { Err(DaemonError::NotImplemented) } diff --git a/lianad/src/commands/mod.rs b/lianad/src/commands/mod.rs index 1c9dabde..2417f246 100644 --- a/lianad/src/commands/mod.rs +++ b/lianad/src/commands/mod.rs @@ -362,32 +362,53 @@ impl DaemonControl { &self, receive: Option, change: Option, - ) -> Result<(), CommandError> { + ) -> Result { let mut db_conn = self.db.connection(); + const MAX_INCREMENT_GAP: u32 = 1_000; + + let db_receive = db_conn.receive_index().into(); + let mut final_receive = db_receive; + + let db_change = db_conn.change_index().into(); + let mut final_change = db_change; + if let Some(index) = receive { - let child = match ChildNumber::from_normal_idx(index) { - Ok(i) => i, - Err(_) => return Err(CommandError::InvalidDerivationIndex), - }; - let db_receive = db_conn.receive_index(); - if child > db_receive { - db_conn.set_receive_index(child, &self.secp); + ChildNumber::from_normal_idx(index) + .map_err(|_| CommandError::InvalidDerivationIndex)?; + if index > db_receive { + let delta = (index - db_receive).min(MAX_INCREMENT_GAP); + let index = db_receive + delta; + final_receive = index; + match ChildNumber::from_normal_idx(index) { + Ok(i) => { + db_conn.set_receive_index(i, &self.secp); + } + Err(_) => return Err(CommandError::InvalidDerivationIndex), + }; } } if let Some(index) = change { - let child = match ChildNumber::from_normal_idx(index) { - Ok(i) => i, - Err(_) => return Err(CommandError::InvalidDerivationIndex), - }; - let db_change = db_conn.change_index(); - if child > db_change { - db_conn.set_change_index(child, &self.secp); + ChildNumber::from_normal_idx(index) + .map_err(|_| CommandError::InvalidDerivationIndex)?; + if index > db_change { + let delta = (index - db_change).min(MAX_INCREMENT_GAP); + let index = db_change + delta; + final_change = index; + match ChildNumber::from_normal_idx(index) { + Ok(i) => { + db_conn.set_change_index(i, &self.secp); + } + Err(_) => return Err(CommandError::InvalidDerivationIndex), + }; } } - Ok(()) + Ok(UpdateDerivIndexesResult { + receive: final_receive, + change: final_change, + }) } /// list addresses @@ -1215,6 +1236,12 @@ pub struct GetInfoResult { pub change_index: u32, } +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct UpdateDerivIndexesResult { + pub receive: u32, + pub change: u32, +} + #[derive(Debug, Clone, Serialize, Deserialize)] pub struct GetAddressResult { #[serde(deserialize_with = "deser_addr_assume_checked")] diff --git a/lianad/src/jsonrpc/api.rs b/lianad/src/jsonrpc/api.rs index 29a0ce85..808156a1 100644 --- a/lianad/src/jsonrpc/api.rs +++ b/lianad/src/jsonrpc/api.rs @@ -238,8 +238,9 @@ fn update_deriv_indexes( None => None, }; - control.update_deriv_indexes(receive, change)?; - Ok(serde_json::json!({})) + Ok(serde_json::json!( + control.update_deriv_indexes(receive, change)? + )) } fn list_confirmed(control: &DaemonControl, params: Params) -> Result {