Verify transaction against its block during import (#10954)

* Verify transaction against its block during import

* Client method for transaction verification added

* Verification methods united

* Verification sequence for transaction verifier returned
This commit is contained in:
Anton Gavrilov 2019-08-15 16:10:39 +02:00 committed by Andronik Ordian
parent ef47426a93
commit fd75491103
2 changed files with 7 additions and 6 deletions

View File

@ -513,7 +513,7 @@ impl Miner {
let sender = transaction.sender(); let sender = transaction.sender();
// Re-verify transaction again vs current state. // Re-verify transaction again vs current state.
let result = client.verify_signed(&transaction) let result = client.verify_for_pending_block(&transaction, &open_block.header)
.map_err(|e| e.into()) .map_err(|e| e.into())
.and_then(|_| { .and_then(|_| {
open_block.push_transaction(transaction, None) open_block.push_transaction(transaction, None)

View File

@ -117,11 +117,13 @@ impl<'a, C: 'a> PoolClient<'a, C> where
} }
} }
/// Verifies if signed transaction is executable. /// Verifies transaction against its block (before its import into this block)
/// Also Verifies if signed transaction is executable.
/// ///
/// This should perform any verifications that rely on chain status. /// This should perform any verifications that rely on chain status.
pub fn verify_signed(&self, tx: &SignedTransaction) -> Result<(), transaction::Error> { pub fn verify_for_pending_block(&self, tx: &SignedTransaction, header: &Header) -> Result<(), transaction::Error> {
self.engine.machine().verify_transaction(&tx, &self.best_block_header, self.chain) self.engine.machine().verify_transaction_basic(tx, header)?;
self.engine.machine().verify_transaction(tx, &self.best_block_header, self.chain)
} }
} }
@ -142,8 +144,7 @@ impl<'a, C: 'a> pool::client::Client for PoolClient<'a, C> where
self.engine.verify_transaction_basic(&tx, &self.best_block_header)?; self.engine.verify_transaction_basic(&tx, &self.best_block_header)?;
let tx = tx.verify_unordered()?; let tx = tx.verify_unordered()?;
self.verify_signed(&tx)?; self.engine.machine().verify_transaction(&tx, &self.best_block_header, self.chain)?;
Ok(tx) Ok(tx)
} }