From 095196bb684546eba00a9fd2e35c02ddda172437 Mon Sep 17 00:00:00 2001 From: Andrei Gubarev <1062334+agubarev@users.noreply.github.com> Date: Wed, 31 Aug 2022 15:16:06 +0300 Subject: [PATCH] feat: attempt to recognize the source of a recovered output (#4580) Description --- Attempts to recognize the source of a recovered output Motivation and Context --- Recovered outputs lack details of how they are received, so this is an attempt to perform at least some recognition. How Has This Been Tested? --- existing unit tests --- .../recovery/standard_outputs_recoverer.rs | 12 ++++++++++-- .../output_manager_service/storage/output_source.rs | 4 ++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/base_layer/wallet/src/output_manager_service/recovery/standard_outputs_recoverer.rs b/base_layer/wallet/src/output_manager_service/recovery/standard_outputs_recoverer.rs index 4236cf13d5..00d81a9334 100644 --- a/base_layer/wallet/src/output_manager_service/recovery/standard_outputs_recoverer.rs +++ b/base_layer/wallet/src/output_manager_service/recovery/standard_outputs_recoverer.rs @@ -37,7 +37,7 @@ use tari_crypto::{ keys::{PublicKey as PublicKeyTrait, SecretKey}, tari_utilities::hex::Hex, }; -use tari_script::{inputs, script}; +use tari_script::{inputs, script, Opcode}; use crate::{ key_manager_service::KeyManagerInterface, @@ -146,13 +146,21 @@ where let mut rewound_outputs_with_tx_id: Vec = Vec::new(); for (output, proof) in &mut rewound_outputs { + // Attempting to recognize output source by i.e., standard MimbleWimble, simple or stealth one-sided + let output_source = match *output.script.as_slice() { + [Opcode::Nop] => OutputSource::Standard, + [Opcode::PushPubKey(_), Opcode::Drop, Opcode::PushPubKey(_)] => OutputSource::StealthOneSided, + [Opcode::PushPubKey(_)] => OutputSource::OneSided, + _ => OutputSource::RecoveredButUnrecognized, + }; + let db_output = DbUnblindedOutput::rewindable_from_unblinded_output( output.clone(), &self.factories, &self.rewind_data, None, Some(proof), - OutputSource::Recovered, + output_source, )?; let tx_id = TxId::new_random(); let output_hex = db_output.commitment.to_hex(); diff --git a/base_layer/wallet/src/output_manager_service/storage/output_source.rs b/base_layer/wallet/src/output_manager_service/storage/output_source.rs index e6937e7d83..51a85d03aa 100644 --- a/base_layer/wallet/src/output_manager_service/storage/output_source.rs +++ b/base_layer/wallet/src/output_manager_service/storage/output_source.rs @@ -36,7 +36,7 @@ use crate::output_manager_service::error::OutputManagerStorageError; pub enum OutputSource { Unknown, Coinbase, - Recovered, + RecoveredButUnrecognized, #[default] Standard, OneSided, @@ -52,7 +52,7 @@ impl TryFrom for OutputSource { Ok(match value { 0 => OutputSource::Unknown, 1 => OutputSource::Coinbase, - 2 => OutputSource::Recovered, + 2 => OutputSource::RecoveredButUnrecognized, 3 => OutputSource::Standard, 4 => OutputSource::OneSided, 5 => OutputSource::StealthOneSided,