diff --git a/aptos-core/consensus/consensus-types/src/proof_of_store.rs b/aptos-core/consensus/consensus-types/src/proof_of_store.rs index 5901fc8f..c5086190 100644 --- a/aptos-core/consensus/consensus-types/src/proof_of_store.rs +++ b/aptos-core/consensus/consensus-types/src/proof_of_store.rs @@ -274,6 +274,7 @@ pub enum SignedBatchInfoError { NotFound, AlreadyCommitted, NoTimeStamps, + UnableToAggregate, } #[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq)] diff --git a/aptos-core/consensus/src/quorum_store/proof_coordinator.rs b/aptos-core/consensus/src/quorum_store/proof_coordinator.rs index 9bad33d4..2b95ead6 100644 --- a/aptos-core/consensus/src/quorum_store/proof_coordinator.rs +++ b/aptos-core/consensus/src/quorum_store/proof_coordinator.rs @@ -117,17 +117,25 @@ impl IncrementalProofState { } } - fn take(&mut self, validator_verifier: &ValidatorVerifier) -> ProofOfStore { + fn take( + &mut self, + validator_verifier: &ValidatorVerifier, + ) -> Result { if self.completed { panic!("Cannot call take twice, unexpected issue occurred"); } - self.completed = true; match validator_verifier.aggregate_signatures( PartialSignatures::new(self.aggregated_signature.clone()).signatures_iter(), ) { - Ok(sig) => ProofOfStore::new(self.info.clone(), sig), - Err(e) => unreachable!("Cannot aggregate signatures on digest err = {:?}", e), + Ok(sig) => { + self.completed = true; + Ok(ProofOfStore::new(self.info.clone(), sig)) + } + Err(e) => { + error!("Cannot aggregate signatures on digest err = {:?}", e); + Err(SignedBatchInfoError::UnableToAggregate) + } } } @@ -216,7 +224,7 @@ impl ProofCoordinator { if let Some(value) = self.batch_info_to_proof.get_mut(signed_batch_info.batch_info()) { value.add_signature(&signed_batch_info, validator_verifier)?; if !value.completed && value.ready(validator_verifier) { - let proof = value.take(validator_verifier); + let proof = value.take(validator_verifier)?; txn_metrics::TxnLifeTime::get_txn_life_time().record_proof(proof.info().batch_id()); // proof validated locally, so adding to cache self.proof_cache.insert(proof.info().clone(), proof.multi_signature().clone());