#![cfg(feature = "live-evidence")]
use crate::bitcoin_runtime_monitor::BitcoinRuntimeState;
use crate::freshness::FreshnessStatus;
use alloc::string::String;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct NodeObservation {
pub node_id: String,
pub observed_at: u64,
pub runtime_state: BitcoinRuntimeState,
pub integrity_status: FreshnessStatus,
}
impl NodeObservation {
pub fn new(
node_id: String,
observed_at: u64,
runtime_state: BitcoinRuntimeState,
integrity_status: FreshnessStatus,
) -> Self {
Self {
node_id,
observed_at,
runtime_state,
integrity_status,
}
}
pub fn check_continuity_against(&self, previous: &NodeObservation) -> Result<(), &'static str> {
if self.observed_at <= previous.observed_at {
return Err("observation timestamp monotonicity violated");
}
if self.integrity_status == FreshnessStatus::Expired
|| self.integrity_status == FreshnessStatus::ReplaySuspected
{
return Err("observation integrity status is unacceptable");
}
if self.runtime_state.uptime_seconds < previous.runtime_state.uptime_seconds {
return Err("runtime uptime reversed, indicating an untracked node restart");
}
Ok(())
}
}