Skip to content

Commit

Permalink
feat: better FFI feedback from transaction validation (#4827)
Browse files Browse the repository at this point in the history
* Push u64 back for feedback into tms validation

* update description

* Update base_layer/wallet/src/transaction_service/handle.rs

Co-authored-by: Cayle Sharrock <CjS77@users.noreply.github.com>

* re-format display

Co-authored-by: Cayle Sharrock <CjS77@users.noreply.github.com>
  • Loading branch information
SWvheerden and CjS77 committed Oct 24, 2022
1 parent b27391e commit 3c97be4
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 39 deletions.
48 changes: 24 additions & 24 deletions base_layer/wallet/src/transaction_service/handle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -303,42 +303,42 @@ pub enum TransactionEvent {
},
TransactionValidationStateChanged(OperationId),
TransactionValidationCompleted(OperationId),
TransactionValidationFailed(OperationId),
TransactionValidationFailed(OperationId, u64),
Error(String),
}

impl fmt::Display for TransactionEvent {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
TransactionEvent::MempoolBroadcastTimedOut(tx_id) => {
write!(f, "MempoolBroadcastTimedOut for tx:{}", tx_id)
write!(f, "MempoolBroadcastTimedOut for tx:{tx_id}")
},
TransactionEvent::ReceivedTransaction(tx) => {
write!(f, "ReceivedTransaction for {}", tx)
write!(f, "ReceivedTransaction for {tx}")
},
TransactionEvent::ReceivedTransactionReply(tx) => {
write!(f, "ReceivedTransactionReply for {}", tx)
write!(f, "ReceivedTransactionReply for {tx}")
},
TransactionEvent::ReceivedFinalizedTransaction(tx) => {
write!(f, "ReceivedFinalizedTransaction for {}", tx)
write!(f, "ReceivedFinalizedTransaction for {tx}")
},
TransactionEvent::TransactionDiscoveryInProgress(tx) => {
write!(f, "TransactionDiscoveryInProgress for {}", tx)
write!(f, "TransactionDiscoveryInProgress for {tx}")
},
TransactionEvent::TransactionSendResult(tx, status) => {
write!(f, "TransactionSendResult for {}: {}", tx, status)
write!(f, "TransactionSendResult for {tx}: {status}")
},
TransactionEvent::TransactionCompletedImmediately(tx) => {
write!(f, "TransactionCompletedImmediately for {}", tx)
write!(f, "TransactionCompletedImmediately for {tx}")
},
TransactionEvent::TransactionCancelled(tx, rejection) => {
write!(f, "TransactionCancelled for {}:{:?}", tx, rejection)
write!(f, "TransactionCancelled for {tx}:{:?}", rejection)
},
TransactionEvent::TransactionBroadcast(tx) => {
write!(f, "TransactionBroadcast for {}", tx)
write!(f, "TransactionBroadcast for {tx}")
},
TransactionEvent::TransactionImported(tx) => {
write!(f, "TransactionImported for {}", tx)
write!(f, "TransactionImported for {tx}")
},
TransactionEvent::FauxTransactionUnconfirmed {
tx_id,
Expand All @@ -347,18 +347,18 @@ impl fmt::Display for TransactionEvent {
} => {
write!(
f,
"FauxTransactionUnconfirmed for {} with num confirmations: {}. is_valid: {}",
tx_id, num_confirmations, is_valid
"FauxTransactionUnconfirmed for {tx_id} with num confirmations: {num_confirmations}. is_valid: \
{is_valid}"
)
},
TransactionEvent::FauxTransactionConfirmed { tx_id, is_valid } => {
write!(f, "FauxTransactionConfirmed for {}. is_valid: {}", tx_id, is_valid)
write!(f, "FauxTransactionConfirmed for {tx_id}. is_valid: {is_valid}")
},
TransactionEvent::TransactionMined { tx_id, is_valid } => {
write!(f, "TransactionMined for {}. is_valid: {}", tx_id, is_valid)
write!(f, "TransactionMined for {tx_id}. is_valid: {is_valid}")
},
TransactionEvent::TransactionMinedRequestTimedOut(tx) => {
write!(f, "TransactionMinedRequestTimedOut for {}", tx)
write!(f, "TransactionMinedRequestTimedOut for {tx}")
},
TransactionEvent::TransactionMinedUnconfirmed {
tx_id,
Expand All @@ -367,24 +367,24 @@ impl fmt::Display for TransactionEvent {
} => {
write!(
f,
"TransactionMinedUnconfirmed for {} with num confirmations: {}. is_valid: {}",
tx_id, num_confirmations, is_valid
"TransactionMinedUnconfirmed for {tx_id} with num confirmations: {num_confirmations}. is_valid: \
{is_valid}",
)
},
TransactionEvent::Error(error) => {
write!(f, "Error:{}", error)
write!(f, "Error:{error}")
},
TransactionEvent::TransactionValidationStateChanged(operation_id) => {
write!(f, "Transaction validation state changed: {}", operation_id)
write!(f, "Transaction validation state changed: {operation_id}")
},
TransactionEvent::TransactionValidationCompleted(operation_id) => {
write!(f, "Transaction validation completed: {}", operation_id)
write!(f, "Transaction validation(#{operation_id}) completed")
},
TransactionEvent::TransactionValidationFailed(operation_id) => {
write!(f, "Transaction validation failed: {}", operation_id)
TransactionEvent::TransactionValidationFailed(operation_id, reason) => {
write!(f, "Transaction validation(#{operation_id}) failed: {reason}")
},
TransactionEvent::NewBlockMined(tx_id) => {
write!(f, "New block mined {}", tx_id)
write!(f, "New block mined {tx_id}")
},
}
}
Expand Down
10 changes: 9 additions & 1 deletion base_layer/wallet/src/transaction_service/service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2262,9 +2262,17 @@ where
target: LOG_TARGET,
"Error completing Transaction Validation Protocol (id: {}): {:?}", id, error
);
let reason = match error {
TransactionServiceError::TransactionValidationInProgress => 1,
TransactionServiceError::ProtobufConversionError(_) |
TransactionServiceError::RpcError(_) |
TransactionServiceError::InvalidMessageError(_) |
TransactionServiceError::BaseNodeChanged { .. } => 3,
_ => 2,
};
let _size = self
.event_publisher
.send(Arc::new(TransactionEvent::TransactionValidationFailed(id)));
.send(Arc::new(TransactionEvent::TransactionValidationFailed(id, reason)));
},
}
}
Expand Down
12 changes: 6 additions & 6 deletions base_layer/wallet_ffi/src/callback_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ where TBackend: TransactionBackend + 'static
callback_txo_validation_complete: unsafe extern "C" fn(u64, u64),
callback_contacts_liveness_data_updated: unsafe extern "C" fn(*mut ContactsLivenessData),
callback_balance_updated: unsafe extern "C" fn(*mut Balance),
callback_transaction_validation_complete: unsafe extern "C" fn(u64, bool),
callback_transaction_validation_complete: unsafe extern "C" fn(u64, u64),
callback_saf_messages_received: unsafe extern "C" fn(),
callback_connectivity_status: unsafe extern "C" fn(u64),
db: TransactionDatabase<TBackend>,
Expand Down Expand Up @@ -119,7 +119,7 @@ where TBackend: TransactionBackend + 'static
callback_txo_validation_complete: unsafe extern "C" fn(u64, u64),
callback_contacts_liveness_data_updated: unsafe extern "C" fn(*mut ContactsLivenessData),
callback_balance_updated: unsafe extern "C" fn(*mut Balance),
callback_transaction_validation_complete: unsafe extern "C" fn(u64, bool),
callback_transaction_validation_complete: unsafe extern "C" fn(u64, u64),
callback_saf_messages_received: unsafe extern "C" fn(),
callback_connectivity_status: unsafe extern "C" fn(u64),
) -> Self {
Expand Down Expand Up @@ -278,10 +278,10 @@ where TBackend: TransactionBackend + 'static
self.trigger_balance_refresh().await;
},
TransactionEvent::TransactionValidationCompleted(request_key) => {
self.transaction_validation_complete_event(request_key.as_u64(), true);
self.transaction_validation_complete_event(request_key.as_u64(), 0);
},
TransactionEvent::TransactionValidationFailed(request_key) => {
self.transaction_validation_complete_event(request_key.as_u64(), false);
TransactionEvent::TransactionValidationFailed(request_key, reason) => {
self.transaction_validation_complete_event(request_key.as_u64(), reason);
},
TransactionEvent::TransactionMinedRequestTimedOut(_tx_id) |
TransactionEvent::TransactionImported(_tx_id)|
Expand Down Expand Up @@ -575,7 +575,7 @@ where TBackend: TransactionBackend + 'static
}
}

fn transaction_validation_complete_event(&mut self, request_key: u64, success: bool) {
fn transaction_validation_complete_event(&mut self, request_key: u64, success: u64) {
debug!(
target: LOG_TARGET,
"Calling Transaction Validation Complete callback function for Request Key: {}", request_key,
Expand Down
15 changes: 12 additions & 3 deletions base_layer/wallet_ffi/src/callback_handler_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -229,9 +229,9 @@ mod test {
Box::from_raw(balance);
}

unsafe extern "C" fn transaction_validation_complete_callback(request_key: u64, _result: bool) {
unsafe extern "C" fn transaction_validation_complete_callback(request_key: u64, result: u64) {
let mut lock = CALLBACK_STATE.lock().unwrap();
lock.callback_transaction_validation_complete += request_key as u32;
lock.callback_transaction_validation_complete += request_key as u32 + result as u32;
drop(lock);
}

Expand Down Expand Up @@ -626,6 +626,15 @@ mod test {
transaction_event_sender
.send(Arc::new(TransactionEvent::TransactionValidationCompleted(4u64.into())))
.unwrap();
transaction_event_sender
.send(Arc::new(TransactionEvent::TransactionValidationFailed(0u64.into(), 1)))
.unwrap();
transaction_event_sender
.send(Arc::new(TransactionEvent::TransactionValidationFailed(0u64.into(), 2)))
.unwrap();
transaction_event_sender
.send(Arc::new(TransactionEvent::TransactionValidationFailed(0u64.into(), 3)))
.unwrap();

balance.pending_incoming_balance += faux_unconfirmed_tx.amount;
mock_output_manager_service_state.set_balance(balance.clone());
Expand Down Expand Up @@ -737,7 +746,7 @@ mod test {
assert!(lock.callback_txo_validation_internal_failure);
assert_eq!(lock.callback_contacts_liveness_data_updated, 2);
assert_eq!(lock.callback_balance_updated, 7);
assert_eq!(lock.callback_transaction_validation_complete, 7);
assert_eq!(lock.callback_transaction_validation_complete, 13);
assert_eq!(lock.connectivity_status_callback_called, 7);

drop(lock);
Expand Down
10 changes: 7 additions & 3 deletions base_layer/wallet_ffi/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4146,7 +4146,11 @@ unsafe fn init_logging(
/// the balance changes.
/// `callback_transaction_validation_complete` - The callback function pointer matching the function signature. This is
/// called when a Transaction validation process is completed. The request_key is used to identify which request this
/// callback references and the second parameter is a bool that returns if the validation was successful or not.
/// callback references and the second parameter is a u64 that returns if the validation was successful or not.
/// ValidationSuccess, // 0
/// ValidationAlreadyBusy // 1
/// ValidationInternalFailure // 2
/// ValidationCommunicationFailure // 3
/// `callback_saf_message_received` - The callback function pointer that will be called when the Dht has determined that
/// is has connected to enough of its neighbours to be confident that it has received any SAF messages that were waiting
/// for it.
Expand Down Expand Up @@ -4191,7 +4195,7 @@ pub unsafe extern "C" fn wallet_create(
callback_txo_validation_complete: unsafe extern "C" fn(u64, u64),
callback_contacts_liveness_data_updated: unsafe extern "C" fn(*mut TariContactsLivenessData),
callback_balance_updated: unsafe extern "C" fn(*mut TariBalance),
callback_transaction_validation_complete: unsafe extern "C" fn(u64, bool),
callback_transaction_validation_complete: unsafe extern "C" fn(u64, u64),
callback_saf_messages_received: unsafe extern "C" fn(),
callback_connectivity_status: unsafe extern "C" fn(u64),
recovery_in_progress: *mut bool,
Expand Down Expand Up @@ -7952,7 +7956,7 @@ mod test {
// assert!(true); //optimized out by compiler
}

unsafe extern "C" fn transaction_validation_complete_callback(_tx_id: c_ulonglong, _result: bool) {
unsafe extern "C" fn transaction_validation_complete_callback(_tx_id: c_ulonglong, _result: u64) {
// assert!(true); //optimized out by compiler
}

Expand Down
8 changes: 6 additions & 2 deletions base_layer/wallet_ffi/wallet.h
Original file line number Diff line number Diff line change
Expand Up @@ -2246,7 +2246,11 @@ struct TariPublicKeys *comms_list_connected_public_keys(struct TariWallet *walle
* the balance changes.
* `callback_transaction_validation_complete` - The callback function pointer matching the function signature. This is
* called when a Transaction validation process is completed. The request_key is used to identify which request this
* callback references and the second parameter is a bool that returns if the validation was successful or not.
* callback references and the second parameter is a u64 that returns if the validation was successful or not.
* ValidationSuccess, // 0
* ValidationAlreadyBusy // 1
* ValidationInternalFailure // 2
* ValidationCommunicationFailure // 3
* `callback_saf_message_received` - The callback function pointer that will be called when the Dht has determined that
* is has connected to enough of its neighbours to be confident that it has received any SAF messages that were waiting
* for it.
Expand Down Expand Up @@ -2288,7 +2292,7 @@ struct TariWallet *wallet_create(TariCommsConfig *config,
void (*callback_txo_validation_complete)(uint64_t, uint64_t),
void (*callback_contacts_liveness_data_updated)(TariContactsLivenessData*),
void (*callback_balance_updated)(TariBalance*),
void (*callback_transaction_validation_complete)(uint64_t, bool),
void (*callback_transaction_validation_complete)(uint64_t, uint64_t),
void (*callback_saf_messages_received)(void),
void (*callback_connectivity_status)(uint64_t),
bool *recovery_in_progress,
Expand Down

0 comments on commit 3c97be4

Please sign in to comment.