use crate::core::core::pmmr::{ReadablePMMR, ReadonlyPMMR, RewindablePMMR};
use crate::core::core::{BlockHeader, TxKernel};
use crate::error::Error;
use grin_store::pmmr::PMMRBackend;
pub struct RewindableKernelView<'a> {
pmmr: RewindablePMMR<'a, TxKernel, PMMRBackend<TxKernel>>,
header: BlockHeader,
}
impl<'a> RewindableKernelView<'a> {
pub fn new(
pmmr: RewindablePMMR<'a, TxKernel, PMMRBackend<TxKernel>>,
header: BlockHeader,
) -> RewindableKernelView<'a> {
RewindableKernelView { pmmr, header }
}
pub fn rewind(&mut self, header: &BlockHeader) -> Result<(), Error> {
self.pmmr
.rewind(header.kernel_mmr_size)
.map_err(&Error::TxHashSetErr)?;
self.header = header.clone();
Ok(())
}
pub fn validate_root(&self) -> Result<(), Error> {
let root = self
.readonly_pmmr()
.root()
.map_err(|_| Error::InvalidRoot)?;
if root != self.header.kernel_root {
return Err(Error::InvalidTxHashSet(format!(
"Kernel root at {} does not match",
self.header.height
))
.into());
}
Ok(())
}
pub fn readonly_pmmr(&self) -> ReadonlyPMMR<TxKernel, PMMRBackend<TxKernel>> {
self.pmmr.as_readonly()
}
}