Add `WalletRead::is_seed_relevant_to_any_derived_accounts`

This commit is contained in:
Jack Grigg 2024-03-18 22:41:39 +00:00
parent 8c7f8d07ba
commit e6bc21b461
3 changed files with 49 additions and 1 deletions

View File

@ -59,6 +59,8 @@ and this library adheres to Rust's notion of
- Arguments to `ScannedBlock::from_parts` have changed.
- Changes to the `WalletRead` trait:
- Added `Account` associated type.
- Added `validate_seed` method.
- Added `is_seed_relevant_to_any_derived_accounts` method.
- Added `get_account` method.
- Added `get_derived_account` method.
- `get_account_for_ufvk` now returns `Self::Account` instead of a bare
@ -80,7 +82,6 @@ and this library adheres to Rust's notion of
- `type OrchardShardStore`
- `fn with_orchard_tree_mut`
- `fn put_orchard_subtree_roots`
- Added method `WalletRead::validate_seed`
- Removed `Error::AccountNotFound` variant.
- `WalletSummary::new` now takes an additional `next_orchard_subtree_index`
argument when the `orchard` feature flag is enabled.

View File

@ -740,6 +740,13 @@ pub trait WalletRead {
seed: &SecretVec<u8>,
) -> Result<bool, Self::Error>;
/// Checks whether the given seed is relevant to any of the derived accounts (where
/// [`Account::source`] is [`AccountSource::Derived`]) in the wallet.
fn is_seed_relevant_to_any_derived_accounts(
&self,
seed: &SecretVec<u8>,
) -> Result<bool, Self::Error>;
/// Returns the account corresponding to a given [`UnifiedFullViewingKey`], if any.
fn get_account_for_ufvk(
&self,
@ -1719,6 +1726,13 @@ pub mod testing {
Ok(false)
}
fn is_seed_relevant_to_any_derived_accounts(
&self,
_seed: &SecretVec<u8>,
) -> Result<bool, Self::Error> {
Ok(false)
}
fn get_account_for_ufvk(
&self,
_ufvk: &UnifiedFullViewingKey,

View File

@ -337,6 +337,39 @@ impl<C: Borrow<rusqlite::Connection>, P: consensus::Parameters> WalletRead for W
}
}
fn is_seed_relevant_to_any_derived_accounts(
&self,
seed: &SecretVec<u8>,
) -> Result<bool, Self::Error> {
for account_id in self.get_account_ids()? {
let account = self.get_account(account_id)?.expect("account ID exists");
// If the account is imported, the seed _might_ be relevant, but the only
// way we could determine that is by brute-forcing the ZIP 32 account
// index space, which we're not going to do. The method name indicates to
// the caller that we only check derived accounts.
if let AccountSource::Derived {
seed_fingerprint,
account_index,
} = account.source()
{
if wallet::seed_matches_derived_account(
&self.params,
seed,
&seed_fingerprint,
account_index,
&account.uivk(),
)? {
// The seed is relevant to this account. No need to check any others.
return Ok(true);
}
}
}
// The seed was not relevant to any of the accounts in the wallet.
Ok(false)
}
fn get_account_for_ufvk(
&self,
ufvk: &UnifiedFullViewingKey,