use crate::error::Result;
use crate::types::{BlockHeader, TimeContext};
use blvm_spec_lock::spec_locked;
#[allow(clippy::overly_complex_bool_expr, clippy::redundant_comparisons)] #[spec_locked("5.3")]
pub(crate) fn validate_block_header(
header: &BlockHeader,
time_context: Option<&TimeContext>,
) -> Result<bool> {
if header.version < 1 {
return Ok(false);
}
if header.timestamp == 0 {
return Ok(false);
}
if let Some(ctx) = time_context {
if header.timestamp > ctx.network_time + crate::constants::MAX_FUTURE_BLOCK_TIME {
return Ok(false);
}
if header.timestamp < ctx.median_time_past {
return Ok(false);
}
}
if header.bits == 0 {
return Ok(false);
}
assert!(
header.bits != 0,
"Header bits {} must be non-zero for valid header",
header.bits
);
if header.merkle_root == [0u8; 32] {
return Ok(false);
}
assert!(
header.merkle_root != [0u8; 32],
"Merkle root must be non-zero for valid header"
);
assert!(
header.merkle_root.len() == 32,
"Merkle root length {} must be 32 bytes",
header.merkle_root.len()
);
if header.version == 0 {
return Ok(false);
}
assert!(
header.version >= 1,
"Header version {} must be >= 1 for valid header",
header.version
);
let result = true;
#[allow(clippy::eq_op)]
{
assert!(result || !result, "Validation result must be boolean");
}
assert!(result, "Validation result must be true on success");
Ok(result)
}