From f8cb708e1c32f073c2183921ed82c9981b09107d Mon Sep 17 00:00:00 2001 From: deuszx <95355183+deuszx@users.noreply.github.com> Date: Wed, 27 Nov 2024 11:33:19 +0000 Subject: [PATCH] ValidatorNode::download_certificates returns ConfirmedBlockCertificates (#2973) --- linera-core/src/client/mod.rs | 12 +++++------- linera-core/src/node.rs | 2 +- linera-core/src/remote_node.rs | 2 +- linera-core/src/unit_tests/test_utils.rs | 5 ++--- linera-rpc/src/client.rs | 2 +- linera-rpc/src/grpc/client.rs | 13 ++++++++++--- linera-rpc/src/simple/client.rs | 12 +++++++++--- linera-service/src/schema_export.rs | 4 ++-- 8 files changed, 31 insertions(+), 21 deletions(-) diff --git a/linera-core/src/client/mod.rs b/linera-core/src/client/mod.rs index b33de6fc884..737168acdea 100644 --- a/linera-core/src/client/mod.rs +++ b/linera-core/src/client/mod.rs @@ -1311,13 +1311,11 @@ where // Check the signatures and keep only the ones that are valid. let mut certificates = Vec::new(); - for certificate in remote_certificates { - let sender_chain_id = certificate.inner().chain_id(); - let height = certificate.inner().height(); - let epoch = certificate.inner().epoch(); - let confirmed_block_certificate = certificate - .try_into() - .map_err(|_| NodeError::UnexpectedCertificateValue)?; + for confirmed_block_certificate in remote_certificates { + let block = &confirmed_block_certificate.inner().executed_block().block; + let sender_chain_id = block.chain_id; + let height = block.height; + let epoch = block.epoch; match self.check_certificate(max_epoch, &committees, &confirmed_block_certificate)? { CheckCertificateResult::FutureEpoch => { warn!( diff --git a/linera-core/src/node.rs b/linera-core/src/node.rs index c777a919ac1..e2523d9a503 100644 --- a/linera-core/src/node.rs +++ b/linera-core/src/node.rs @@ -100,7 +100,7 @@ pub trait ValidatorNode { async fn download_certificates( &self, hashes: Vec, - ) -> Result, NodeError>; + ) -> Result, NodeError>; /// Returns the hash of the `Certificate` that last used a blob. async fn blob_last_used_by(&self, blob_id: BlobId) -> Result; diff --git a/linera-core/src/remote_node.rs b/linera-core/src/remote_node.rs index 22a6d3b17a0..31ac826c1dc 100644 --- a/linera-core/src/remote_node.rs +++ b/linera-core/src/remote_node.rs @@ -284,7 +284,7 @@ impl RemoteNode { pub async fn download_certificates( &self, hashes: Vec, - ) -> Result, NodeError> { + ) -> Result, NodeError> { if hashes.is_empty() { return Ok(Vec::new()); } diff --git a/linera-core/src/unit_tests/test_utils.rs b/linera-core/src/unit_tests/test_utils.rs index 92ccbe0b172..0c54ea28f33 100644 --- a/linera-core/src/unit_tests/test_utils.rs +++ b/linera-core/src/unit_tests/test_utils.rs @@ -21,7 +21,7 @@ use linera_base::{ }; use linera_chain::{ data_types::BlockProposal, - types::{Certificate, ConfirmedBlockCertificate, GenericCertificate, LiteCertificate}, + types::{ConfirmedBlockCertificate, GenericCertificate, LiteCertificate}, }; use linera_execution::{ committee::{Committee, ValidatorName}, @@ -176,12 +176,11 @@ where async fn download_certificates( &self, hashes: Vec, - ) -> Result, NodeError> { + ) -> Result, NodeError> { self.spawn_and_receive(move |validator, sender| { validator.do_download_certificates(hashes, sender) }) .await - .map(|certs| certs.into_iter().map(Certificate::from).collect()) } async fn blob_last_used_by(&self, blob_id: BlobId) -> Result { diff --git a/linera-rpc/src/client.rs b/linera-rpc/src/client.rs index b5db6699d50..3f07076d977 100644 --- a/linera-rpc/src/client.rs +++ b/linera-rpc/src/client.rs @@ -164,7 +164,7 @@ impl ValidatorNode for Client { async fn download_certificates( &self, hashes: Vec, - ) -> Result, NodeError> { + ) -> Result, NodeError> { Ok(match self { Client::Grpc(grpc_client) => grpc_client.download_certificates(hashes).await?, diff --git a/linera-rpc/src/grpc/client.rs b/linera-rpc/src/grpc/client.rs index 9b23a51e65a..a7340f4d9cc 100644 --- a/linera-rpc/src/grpc/client.rs +++ b/linera-rpc/src/grpc/client.rs @@ -339,14 +339,21 @@ impl ValidatorNode for GrpcClient { async fn download_certificates( &self, hashes: Vec, - ) -> Result, NodeError> { + ) -> Result, NodeError> { let mut missing_hashes = hashes; let mut certs_collected = Vec::with_capacity(missing_hashes.len()); loop { // Macro doesn't compile if we pass `missing_hashes.clone()` directly to `client_delegate!`. let missing = missing_hashes.clone(); - let mut received: Vec = - client_delegate!(self, download_certificates, missing)?.try_into()?; + let mut received: Vec = Vec::::try_from( + client_delegate!(self, download_certificates, missing)?, + )? + .into_iter() + .map(|cert| { + ConfirmedBlockCertificate::try_from(cert) + .map_err(|_| NodeError::UnexpectedCertificateValue) + }) + .collect::>()?; // In the case of the server not returning any certificates, we break the loop. if received.is_empty() { diff --git a/linera-rpc/src/simple/client.rs b/linera-rpc/src/simple/client.rs index 60cbefcd7d7..1e2559d4019 100644 --- a/linera-rpc/src/simple/client.rs +++ b/linera-rpc/src/simple/client.rs @@ -158,9 +158,15 @@ impl ValidatorNode for SimpleClient { async fn download_certificates( &self, hashes: Vec, - ) -> Result, NodeError> { - self.query(RpcMessage::DownloadCertificates(Box::new(hashes))) - .await + ) -> Result, NodeError> { + self.query::>(RpcMessage::DownloadCertificates(Box::new(hashes))) + .await? + .into_iter() + .map(|cert| { + cert.try_into() + .map_err(|_| NodeError::UnexpectedCertificateValue) + }) + .collect() } async fn blob_last_used_by(&self, blob_id: BlobId) -> Result { diff --git a/linera-service/src/schema_export.rs b/linera-service/src/schema_export.rs index a21ebe2675d..acc080b1ff4 100644 --- a/linera-service/src/schema_export.rs +++ b/linera-service/src/schema_export.rs @@ -9,7 +9,7 @@ use linera_base::{ }; use linera_chain::{ data_types::BlockProposal, - types::{Certificate, ConfirmedBlockCertificate, GenericCertificate, LiteCertificate}, + types::{ConfirmedBlockCertificate, GenericCertificate, LiteCertificate}, }; use linera_client::{ chain_listener::{ChainListenerConfig, ClientContext}, @@ -93,7 +93,7 @@ impl ValidatorNode for DummyValidatorNode { async fn download_certificates( &self, _: Vec, - ) -> Result, NodeError> { + ) -> Result, NodeError> { Err(NodeError::UnexpectedMessage) }