diff --git a/verification/src/chain_verifier.rs b/verification/src/chain_verifier.rs index 6c385c14..8ea15955 100644 --- a/verification/src/chain_verifier.rs +++ b/verification/src/chain_verifier.rs @@ -34,7 +34,7 @@ impl ChainVerifier { None => { match block.transactions.iter().filter(|t| t.hash() == input.previous_output.hash).nth(0) { Some(ref tx) => tx, - None => { return Err(TransactionError::Input(input_index)); }, + None => { return Err(TransactionError::Inconclusive(input.previous_output.hash.clone())); }, } }, }; @@ -111,7 +111,7 @@ impl Verify for ChainVerifier { mod tests { use super::ChainVerifier; - use super::super::{Verify, Chain}; + use super::super::{Verify, Chain, Error, TransactionError}; use db::TestStorage; use test_data; use std::sync::Arc; @@ -146,4 +146,21 @@ mod tests { assert_eq!(Chain::Main, verifier.verify(&b1).unwrap()); } + #[test] + fn unknown_transaction_returns_inconclusive() { + let storage = TestStorage::with_blocks( + &vec![ + test_data::block_h169(), + ] + ); + let b170 = test_data::block_h170(); + let verifier = ChainVerifier::new(Arc::new(storage)); + + let should_be = Err(Error::Transaction( + 0, + TransactionError::Inconclusive("c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704".into()) + )); + assert_eq!(should_be, verifier.verify(&b170)); + } + } diff --git a/verification/src/lib.rs b/verification/src/lib.rs index 273102c1..3e6b708c 100644 --- a/verification/src/lib.rs +++ b/verification/src/lib.rs @@ -22,7 +22,9 @@ mod chain_verifier; pub use queue::Queue; pub use chain_verifier::ChainVerifier; -#[derive(Debug)] +use primitives::hash::H256; + +#[derive(Debug, PartialEq)] /// All possible verification errors pub enum Error { /// has an equal duplicate in the chain @@ -43,7 +45,7 @@ pub enum Error { MerkleRoot, } -#[derive(Debug)] +#[derive(Debug, PartialEq)] /// Possible transactions verification errors pub enum TransactionError { /// Not found corresponding output for transaction input @@ -52,6 +54,8 @@ pub enum TransactionError { Maturity, /// Signature invalid for given input Signature(usize), + /// Inconclusive (unknown parent transaction) + Inconclusive(H256), } #[derive(PartialEq, Debug)]