inconclusive result in transaction verification

This commit is contained in:
NikVolf 2016-10-31 15:46:10 +03:00
parent 543d66ce03
commit 5a20b9fe36
2 changed files with 25 additions and 4 deletions

View File

@ -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));
}
}

View File

@ -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)]