From 40d52032a7cfdf140c9c03559ac3cba6199c5eda Mon Sep 17 00:00:00 2001 From: parazyd Date: Tue, 26 Apr 2022 17:12:05 +0200 Subject: [PATCH] consensus/proto/tx: Implement state transition validation for incoming txs. --- src/consensus/proto/protocol_tx.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/consensus/proto/protocol_tx.rs b/src/consensus/proto/protocol_tx.rs index 3f586afad..4c06fb2d8 100644 --- a/src/consensus/proto/protocol_tx.rs +++ b/src/consensus/proto/protocol_tx.rs @@ -1,14 +1,15 @@ use async_executor::Executor; use async_std::sync::Arc; use async_trait::async_trait; -use log::debug; +use log::{debug, warn}; use crate::{ - consensus::{Tx, ValidatorStatePtr}, + consensus::{Tx, ValidatorState, ValidatorStatePtr}, net::{ ChannelPtr, MessageSubscription, P2pPtr, ProtocolBase, ProtocolBasePtr, ProtocolJobsManager, ProtocolJobsManagerPtr, }, + node::MemoryState, Result, }; @@ -48,6 +49,17 @@ impl ProtocolTx { let tx_copy = (*tx).clone(); + debug!("ProtocolTx::handle_receive_tx(): Starting state transition validation"); + let canon_state_clone = self.state.read().await.state_machine.lock().await.clone(); + let mem_state = MemoryState::new(canon_state_clone); + match ValidatorState::validate_state_transitions(mem_state, &[tx_copy.clone()]) { + Ok(_) => debug!("ProtocolTx::handle_receive_tx(): State transition valid"), + Err(e) => { + warn!("ProtocolTx::handle_receive_tx(): State transition fail: {}", e); + continue + } + } + // Nodes use unconfirmed_txs vector as seen_txs pool. if self.state.write().await.append_tx(tx_copy.clone()) { self.p2p.broadcast(tx_copy).await?;