use tari_common_types::{
chain_metadata::ChainMetadata,
types::{CompressedCommitment, FixedHash},
};
use tari_node_components::blocks::{Block, BlockHeader, ChainBlock};
use tari_transaction_components::{tari_proof_of_work::Difficulty, transaction_components::Transaction};
use tari_utilities::epoch_time::EpochTime;
use crate::{
chain_storage::BlockchainBackend,
proof_of_work::AchievedTargetDifficulty,
validation::error::ValidationError,
};
pub trait BlockBodyValidator<B>: Send + Sync {
fn validate_body(&self, backend: &B, block: &Block) -> Result<Block, ValidationError>;
}
pub trait CandidateBlockValidator<B>: Send + Sync {
fn validate_body_with_metadata(
&self,
backend: &B,
block: &ChainBlock,
metadata: &ChainMetadata,
) -> Result<(), ValidationError>;
fn validate_body_at_height(&self, backend: &B, block: &ChainBlock) -> Result<(), ValidationError>;
}
pub trait TransactionValidator: Send + Sync {
fn validate(&self, tx: &Transaction) -> Result<(), ValidationError>;
}
pub trait InternalConsistencyValidator: Send + Sync {
fn validate_internal_consistency(&self, item: &Block) -> Result<(), ValidationError>;
}
pub trait HeaderChainLinkedValidator<B: BlockchainBackend>: Send + Sync {
fn validate(
&self,
db: &B,
header: &BlockHeader,
prev_header: &BlockHeader,
prev_timestamps: &[EpochTime],
target_difficulty: Option<Difficulty>,
vm_key: FixedHash,
) -> Result<AchievedTargetDifficulty, ValidationError>;
}
pub trait FinalHorizonStateValidation<B>: Send + Sync {
fn validate(
&self,
backend: &B,
height: u64,
total_utxo_sum: &CompressedCommitment,
total_kernel_sum: &CompressedCommitment,
total_burned_sum: &CompressedCommitment,
) -> Result<(), ValidationError>;
}