From 6bd18e18ea4685e1080de1a0a0eed1fe26b3518d Mon Sep 17 00:00:00 2001 From: Stephen Akridge Date: Mon, 23 Jul 2018 23:13:24 +0000 Subject: [PATCH] Add error messages to ledger verify --- src/bank.rs | 1 + src/entry.rs | 21 +++++++++++++++++++-- src/ledger.rs | 12 +++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/bank.rs b/src/bank.rs index e41b3488a..517c80d43 100644 --- a/src/bank.rs +++ b/src/bank.rs @@ -389,6 +389,7 @@ impl Bank { for block in &entries.into_iter().chunks(VERIFY_BLOCK_SIZE) { let block: Vec<_> = block.collect(); if !block.verify(&self.last_id()) { + error!("Ledger proof of history failed at entry: {}", entry_count); return Err(BankError::LedgerVerificationFailed); } entry_count += self.process_entries_tail(block, tail, tail_idx)?; diff --git a/src/entry.rs b/src/entry.rs index 7870a0f41..4e748ca13 100644 --- a/src/entry.rs +++ b/src/entry.rs @@ -115,8 +115,25 @@ impl Entry { /// Verifies self.id is the result of hashing a `start_hash` `self.num_hashes` times. /// If the transaction is not a Tick, then hash that as well. pub fn verify(&self, start_hash: &Hash) -> bool { - self.transactions.par_iter().all(|tx| tx.verify_plan()) - && self.id == next_hash(start_hash, self.num_hashes, &self.transactions) + let tx_plans_verified = self.transactions.par_iter().all(|tx| { + let r = tx.verify_plan(); + if !r { + error!("tx plan invalid: {:?}", tx); + } + r + }); + if !tx_plans_verified { + return false; + } + let ref_hash = next_hash(start_hash, self.num_hashes, &self.transactions); + if self.id != ref_hash { + error!( + "next_hash is invalid expected: {:?} actual: {:?}", + self.id, ref_hash + ); + return false; + } + true } } diff --git a/src/ledger.rs b/src/ledger.rs index 7963df3c6..a085562f6 100644 --- a/src/ledger.rs +++ b/src/ledger.rs @@ -22,7 +22,17 @@ impl Block for [Entry] { fn verify(&self, start_hash: &Hash) -> bool { let genesis = [Entry::new_tick(0, start_hash)]; let entry_pairs = genesis.par_iter().chain(self).zip(self); - entry_pairs.all(|(x0, x1)| x1.verify(&x0.id)) + entry_pairs.all(|(x0, x1)| { + let r = x1.verify(&x0.id); + if !r { + error!( + "entry invalid!: {:?} num txs: {}", + x1.id, + x1.transactions.len() + ); + } + r + }) } fn to_blobs(&self, blob_recycler: &packet::BlobRecycler, q: &mut VecDeque) {