From 863e4d3748fbc684caa4d88dc992dcce7ed3c8a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?phasewalk=20=F0=9F=9B=A1=EF=B8=8F?= Date: Tue, 23 Apr 2024 06:45:40 -0700 Subject: [PATCH] sct(component): Add `anchor_by_height` rpc method (#4250) ## Describe your changes This PR adds a `anchor_by_height` method to the [`SctQueryService`](https://github.com/penumbra-zone/penumbra/tree/main/crates/core/component/sct/src/component/rpc.rs). ## Issue ticket number and link Closes #4153 ## Checklist before requesting a review - [x] If this code contains consensus-breaking changes, I have added the "consensus-breaking" label. Otherwise, I declare my belief that there are not consensus-breaking changes, for the following reason: > This is an added rpc method for consumer convenience. It prevents consumers from being forced to perform raw KV queries against the chain state. --- .../src/gen/proto_descriptor.bin.no_lfs | Bin 95074 -> 98383 bytes .../core/component/sct/src/component/rpc.rs | 22 +- .../src/gen/penumbra.core.component.sct.v1.rs | 111 ++++++++++ .../penumbra.core.component.sct.v1.serde.rs | 193 ++++++++++++++++++ .../proto/src/gen/proto_descriptor.bin.no_lfs | Bin 392021 -> 398450 bytes .../penumbra/core/component/sct/v1/sct.proto | 9 + 6 files changed, 334 insertions(+), 1 deletion(-) diff --git a/crates/cnidarium/src/gen/proto_descriptor.bin.no_lfs b/crates/cnidarium/src/gen/proto_descriptor.bin.no_lfs index d50e1bd8818eb8b4d521b590c16703d42bad4e23..67d781308dc15349cc1633e0986b9be4d49fda1f 100644 GIT binary patch delta 23133 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 QsWnq;W;8wa^^V#931P9$$^ZZW delta 19801 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, + ) -> Result, Status> { + let state = self.storage.latest_snapshot(); + + let height = request.get_ref().height; + let anchor = state.get_anchor_by_height(height).await.map_err(|e| { + tonic::Status::unknown(format!("could not get anchor for height {height}: {e}")) + })?; + + Ok(tonic::Response::new(AnchorByHeightResponse { + anchor: anchor.map(Into::into), + })) + } } diff --git a/crates/proto/src/gen/penumbra.core.component.sct.v1.rs b/crates/proto/src/gen/penumbra.core.component.sct.v1.rs index 4fd4dce533..9e2ba394c9 100644 --- a/crates/proto/src/gen/penumbra.core.component.sct.v1.rs +++ b/crates/proto/src/gen/penumbra.core.component.sct.v1.rs @@ -299,6 +299,34 @@ impl ::prost::Name for EpochByHeightResponse { ::prost::alloc::format!("penumbra.core.component.sct.v1.{}", Self::NAME) } } +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AnchorByHeightRequest { + #[prost(uint64, tag = "1")] + pub height: u64, +} +impl ::prost::Name for AnchorByHeightRequest { + const NAME: &'static str = "AnchorByHeightRequest"; + const PACKAGE: &'static str = "penumbra.core.component.sct.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("penumbra.core.component.sct.v1.{}", Self::NAME) + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AnchorByHeightResponse { + #[prost(message, optional, tag = "1")] + pub anchor: ::core::option::Option< + super::super::super::super::crypto::tct::v1::MerkleRoot, + >, +} +impl ::prost::Name for AnchorByHeightResponse { + const NAME: &'static str = "AnchorByHeightResponse"; + const PACKAGE: &'static str = "penumbra.core.component.sct.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("penumbra.core.component.sct.v1.{}", Self::NAME) + } +} /// Generated client implementations. #[cfg(feature = "rpc")] pub mod query_service_client { @@ -386,6 +414,36 @@ pub mod query_service_client { self.inner = self.inner.max_encoding_message_size(limit); self } + pub async fn anchor_by_height( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/penumbra.core.component.sct.v1.QueryService/AnchorByHeight", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "penumbra.core.component.sct.v1.QueryService", + "AnchorByHeight", + ), + ); + self.inner.unary(req, path, codec).await + } pub async fn epoch_by_height( &mut self, request: impl tonic::IntoRequest, @@ -426,6 +484,13 @@ pub mod query_service_server { /// Generated trait containing gRPC methods that should be implemented for use with QueryServiceServer. #[async_trait] pub trait QueryService: Send + Sync + 'static { + async fn anchor_by_height( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; async fn epoch_by_height( &self, request: tonic::Request, @@ -514,6 +579,52 @@ pub mod query_service_server { fn call(&mut self, req: http::Request) -> Self::Future { let inner = self.inner.clone(); match req.uri().path() { + "/penumbra.core.component.sct.v1.QueryService/AnchorByHeight" => { + #[allow(non_camel_case_types)] + struct AnchorByHeightSvc(pub Arc); + impl< + T: QueryService, + > tonic::server::UnaryService + for AnchorByHeightSvc { + type Response = super::AnchorByHeightResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::anchor_by_height(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = AnchorByHeightSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } "/penumbra.core.component.sct.v1.QueryService/EpochByHeight" => { #[allow(non_camel_case_types)] struct EpochByHeightSvc(pub Arc); diff --git a/crates/proto/src/gen/penumbra.core.component.sct.v1.serde.rs b/crates/proto/src/gen/penumbra.core.component.sct.v1.serde.rs index 645678c2bc..e8536e4abe 100644 --- a/crates/proto/src/gen/penumbra.core.component.sct.v1.serde.rs +++ b/crates/proto/src/gen/penumbra.core.component.sct.v1.serde.rs @@ -1,3 +1,196 @@ +impl serde::Serialize for AnchorByHeightRequest { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.height != 0 { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.core.component.sct.v1.AnchorByHeightRequest", len)?; + if self.height != 0 { + #[allow(clippy::needless_borrow)] + struct_ser.serialize_field("height", ToString::to_string(&self.height).as_str())?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for AnchorByHeightRequest { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "height", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Height, + __SkipField__, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "height" => Ok(GeneratedField::Height), + _ => Ok(GeneratedField::__SkipField__), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = AnchorByHeightRequest; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.core.component.sct.v1.AnchorByHeightRequest") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut height__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Height => { + if height__.is_some() { + return Err(serde::de::Error::duplicate_field("height")); + } + height__ = + Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + GeneratedField::__SkipField__ => { + let _ = map_.next_value::()?; + } + } + } + Ok(AnchorByHeightRequest { + height: height__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.core.component.sct.v1.AnchorByHeightRequest", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for AnchorByHeightResponse { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.anchor.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.core.component.sct.v1.AnchorByHeightResponse", len)?; + if let Some(v) = self.anchor.as_ref() { + struct_ser.serialize_field("anchor", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for AnchorByHeightResponse { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "anchor", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Anchor, + __SkipField__, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "anchor" => Ok(GeneratedField::Anchor), + _ => Ok(GeneratedField::__SkipField__), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = AnchorByHeightResponse; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.core.component.sct.v1.AnchorByHeightResponse") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut anchor__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Anchor => { + if anchor__.is_some() { + return Err(serde::de::Error::duplicate_field("anchor")); + } + anchor__ = map_.next_value()?; + } + GeneratedField::__SkipField__ => { + let _ = map_.next_value::()?; + } + } + } + Ok(AnchorByHeightResponse { + anchor: anchor__, + }) + } + } + deserializer.deserialize_struct("penumbra.core.component.sct.v1.AnchorByHeightResponse", FIELDS, GeneratedVisitor) + } +} impl serde::Serialize for CommitmentSource { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result diff --git a/crates/proto/src/gen/proto_descriptor.bin.no_lfs b/crates/proto/src/gen/proto_descriptor.bin.no_lfs index 1a1f858a53ccaccb209e049439ae277172fda8a4..08c1adaeae81d56e2b5d651c5bda3872122abd1d 100644 GIT binary patch delta 36064 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 delta 31961 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 O@zG)H