pub mod differential_fuzzer;
pub mod invariant_checker;
pub use differential_fuzzer::{
DifferentialFuzzer, DifferentialFuzzerConfig, DifferentialFuzzerError,
BitcoinReferenceClient, MutationEngine, ConsensusViolation
};
pub use invariant_checker::{
ConsensusInvariant, InvariantViolation, ConsensusInvariantChecker,
verify_transaction_consensus_invariants
};
use bitcoin::{Transaction, Block, BlockHeader};
use thiserror::Error;
use std::collections::HashMap;
use std::fmt;
#[derive(Debug, Error)]
pub enum ConsensusError {
#[error("Transaction consensus error: {0}")]
TransactionValidation(String),
#[error("Block consensus error: {0}")]
BlockValidation(String),
#[error("Consensus invariant violation: {0}")]
InvariantViolation(String),
#[error("Differential validation error: {0}")]
DifferentialValidation(String),
#[error("Hardware optimization consensus error: {0}")]
HardwareOptimization(String),
}
pub fn verify_bitcoin_core_consensus(
tx: &Transaction,
reference_result: Result<(), ConsensusError>,
our_result: Result<(), ConsensusError>
) -> Result<(), ConsensusError> {
match (reference_result, our_result) {
(Ok(_), Ok(_)) => {
Ok(())
},
(Err(_), Err(_)) => {
Ok(())
},
(Ok(_), Err(e)) => {
Err(ConsensusError::DifferentialValidation(
format!("Transaction {} was accepted by reference client but rejected by our implementation: {:?}",
tx.txid(), e)
))
},
(Err(e), Ok(_)) => {
Err(ConsensusError::DifferentialValidation(
format!("Transaction {} was rejected by reference client but accepted by our implementation: {:?}",
tx.txid(), e)
))
},
}
}
pub fn check_historical_consensus_bugs(tx: &Transaction) -> Result<(), ConsensusError> {
if check_value_overflow(tx) {
return Err(ConsensusError::TransactionValidation(
"CVE-2010-5139: Transaction contains value overflow".into()
));
}
if check_duplicate_inputs(tx) {
return Err(ConsensusError::TransactionValidation(
"CVE-2018-17144: Transaction contains duplicate inputs".into()
));
}
Ok(())
}
fn check_value_overflow(tx: &Transaction) -> bool {
false }
fn check_duplicate_inputs(tx: &Transaction) -> bool {
false }