Handle invalid MMR root to prevent sync thread panic (#3774)

* fix: handle invalid mmr root to prevent sync thread panic

* test: fix roots check
This commit is contained in:
ard'O'crat 2023-10-31 11:23:19 +00:00 committed by GitHub
parent 5dcbe96d5c
commit 213dfd4f19
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 8 additions and 8 deletions

View file

@ -237,7 +237,7 @@ impl Desegmenter {
// Quick root check first: // Quick root check first:
{ {
let txhashset = self.txhashset.read(); let txhashset = self.txhashset.read();
txhashset.roots().validate(&self.archive_header)?; txhashset.roots()?.validate(&self.archive_header)?;
} }
// TODO: Possibly Keep track of this in the DB so we can pick up where we left off if needed // TODO: Possibly Keep track of this in the DB so we can pick up where we left off if needed

View file

@ -479,19 +479,19 @@ impl TxHashSet {
} }
/// Get MMR roots. /// Get MMR roots.
pub fn roots(&self) -> TxHashSetRoots { pub fn roots(&self) -> Result<TxHashSetRoots, Error> {
let output_pmmr = ReadonlyPMMR::at(&self.output_pmmr_h.backend, self.output_pmmr_h.size); let output_pmmr = ReadonlyPMMR::at(&self.output_pmmr_h.backend, self.output_pmmr_h.size);
let rproof_pmmr = ReadonlyPMMR::at(&self.rproof_pmmr_h.backend, self.rproof_pmmr_h.size); let rproof_pmmr = ReadonlyPMMR::at(&self.rproof_pmmr_h.backend, self.rproof_pmmr_h.size);
let kernel_pmmr = ReadonlyPMMR::at(&self.kernel_pmmr_h.backend, self.kernel_pmmr_h.size); let kernel_pmmr = ReadonlyPMMR::at(&self.kernel_pmmr_h.backend, self.kernel_pmmr_h.size);
TxHashSetRoots { Ok(TxHashSetRoots {
output_roots: OutputRoots { output_roots: OutputRoots {
pmmr_root: output_pmmr.root().expect("no root, invalid tree"), pmmr_root: output_pmmr.root().map_err(|_| Error::InvalidRoot)?,
bitmap_root: self.bitmap_accumulator.root(), bitmap_root: self.bitmap_accumulator.root(),
}, },
rproof_root: rproof_pmmr.root().expect("no root, invalid tree"), rproof_root: rproof_pmmr.root().map_err(|_| Error::InvalidRoot)?,
kernel_root: kernel_pmmr.root().expect("no root, invalid tree"), kernel_root: kernel_pmmr.root().map_err(|_| Error::InvalidRoot)?,
} })
} }
/// Return Commit's MMR position /// Return Commit's MMR position

View file

@ -238,7 +238,7 @@ impl DesegmenterRequestor {
} }
pub fn check_roots(&self) { pub fn check_roots(&self) {
let roots = self.chain.txhashset().read().roots(); let roots = self.chain.txhashset().read().roots().unwrap();
let archive_header = self.chain.txhashset_archive_header_header_only().unwrap(); let archive_header = self.chain.txhashset_archive_header_header_only().unwrap();
debug!("Archive Header is {:?}", archive_header); debug!("Archive Header is {:?}", archive_header);
debug!("TXHashset output root is {:?}", roots); debug!("TXHashset output root is {:?}", roots);