From e3607407bd04d82e7ec3d0057f3ee9978b0473c8 Mon Sep 17 00:00:00 2001 From: Josef Date: Thu, 18 Jul 2024 18:59:05 +0200 Subject: [PATCH] feat: add timestamp to all event protos (#4722) ## Describe your changes this makes a non-consensus-breaking change, adding a timestamp field to the EventBlockRoot proto. This will be used to keep track of the timestamp of the block for use in pindexer. I tested this by running a local devnet with the changes to core. Pd runs fine and the timestamps are correctly propagated to the raw events db. ## Issue ticket number and link prerequisite for https://github.com/penumbra-zone/penumbra/issues/4675 ## 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: - only adds a field - adds this field to an Event proto --- .../src/gen/proto_descriptor.bin.no_lfs | Bin 82425 -> 99467 bytes .../core/component/sct/src/component/tree.rs | 12 +++-- crates/core/component/sct/src/event.rs | 19 +++++-- .../src/gen/penumbra.core.component.sct.v1.rs | 6 +++ .../penumbra.core.component.sct.v1.serde.rs | 51 ++++++++++++++++++ .../proto/src/gen/proto_descriptor.bin.no_lfs | Bin 527829 -> 545451 bytes .../penumbra/core/component/sct/v1/sct.proto | 4 ++ 7 files changed, 86 insertions(+), 6 deletions(-) diff --git a/crates/cnidarium/src/gen/proto_descriptor.bin.no_lfs b/crates/cnidarium/src/gen/proto_descriptor.bin.no_lfs index 09181ca63e0d92d8142235c3003f76694fd27e4c..cb5f8b9377fc15a61da07be47f5ef6ad339b0300 100644 GIT binary patch delta 31833 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 diff --git a/crates/core/component/sct/src/component/tree.rs b/crates/core/component/sct/src/component/tree.rs index 897226d619..b0d987a109 100644 --- a/crates/core/component/sct/src/component/tree.rs +++ b/crates/core/component/sct/src/component/tree.rs @@ -72,6 +72,11 @@ pub trait SctManager: StateWrite { epoch_root: Option, ) { let sct_anchor = sct.root(); + let block_timestamp = self + .get_current_block_timestamp() + .await + .map(|t| t.unix_timestamp()) + .unwrap_or(0); // Write the anchor as a key, so we can check claimed anchors... self.put_proto(state_key::tree::anchor_lookup(sct_anchor), height); @@ -79,8 +84,8 @@ pub trait SctManager: StateWrite { // TODO: can we move this out to NV storage? self.put(state_key::tree::anchor_by_height(height), sct_anchor); - self.record_proto(event::anchor(height, sct_anchor)); - self.record_proto(event::block_root(height, block_root)); + self.record_proto(event::anchor(height, sct_anchor, block_timestamp)); + self.record_proto(event::block_root(height, block_root, block_timestamp)); // Only record an epoch root event if we are ending the epoch. if let Some(epoch_root) = epoch_root { let index = self @@ -88,7 +93,7 @@ pub trait SctManager: StateWrite { .await .expect("epoch must be set") .index; - self.record_proto(event::epoch_root(index, epoch_root)); + self.record_proto(event::epoch_root(index, epoch_root, block_timestamp)); } self.write_sct_cache(sct); @@ -238,4 +243,5 @@ pub trait VerificationExt: StateRead { Ok(()) } } + impl VerificationExt for T {} diff --git a/crates/core/component/sct/src/event.rs b/crates/core/component/sct/src/event.rs index 3bde931a2d..65a462b0f8 100644 --- a/crates/core/component/sct/src/event.rs +++ b/crates/core/component/sct/src/event.rs @@ -1,3 +1,4 @@ +use pbjson_types::Timestamp; use penumbra_tct as tct; use tct::builder::{block, epoch}; @@ -5,24 +6,36 @@ use penumbra_proto::core::component::sct::v1 as pb; use crate::CommitmentSource; -pub fn anchor(height: u64, anchor: tct::Root) -> pb::EventAnchor { +pub fn anchor(height: u64, anchor: tct::Root, timestamp: i64) -> pb::EventAnchor { pb::EventAnchor { height, anchor: Some(anchor.into()), + timestamp: Some(Timestamp { + seconds: timestamp, + nanos: 0, + }), } } -pub fn block_root(height: u64, root: block::Root) -> pb::EventBlockRoot { +pub fn block_root(height: u64, root: block::Root, timestamp: i64) -> pb::EventBlockRoot { pb::EventBlockRoot { height, root: Some(root.into()), + timestamp: Some(Timestamp { + seconds: timestamp, + nanos: 0, + }), } } -pub fn epoch_root(index: u64, root: epoch::Root) -> pb::EventEpochRoot { +pub fn epoch_root(index: u64, root: epoch::Root, timestamp: i64) -> pb::EventEpochRoot { pb::EventEpochRoot { index, root: Some(root.into()), + timestamp: Some(Timestamp { + seconds: timestamp, + nanos: 0, + }), } } 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 6f132c5141..24724a4047 100644 --- a/crates/proto/src/gen/penumbra.core.component.sct.v1.rs +++ b/crates/proto/src/gen/penumbra.core.component.sct.v1.rs @@ -229,6 +229,8 @@ pub struct EventAnchor { >, #[prost(uint64, tag = "2")] pub height: u64, + #[prost(message, optional, tag = "3")] + pub timestamp: ::core::option::Option<::pbjson_types::Timestamp>, } impl ::prost::Name for EventAnchor { const NAME: &'static str = "EventAnchor"; @@ -247,6 +249,8 @@ pub struct EventEpochRoot { >, #[prost(uint64, tag = "2")] pub index: u64, + #[prost(message, optional, tag = "3")] + pub timestamp: ::core::option::Option<::pbjson_types::Timestamp>, } impl ::prost::Name for EventEpochRoot { const NAME: &'static str = "EventEpochRoot"; @@ -265,6 +269,8 @@ pub struct EventBlockRoot { >, #[prost(uint64, tag = "2")] pub height: u64, + #[prost(message, optional, tag = "3")] + pub timestamp: ::core::option::Option<::pbjson_types::Timestamp>, } impl ::prost::Name for EventBlockRoot { const NAME: &'static str = "EventBlockRoot"; 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 6618d12701..773dcedfea 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 @@ -1147,6 +1147,9 @@ impl serde::Serialize for EventAnchor { if self.height != 0 { len += 1; } + if self.timestamp.is_some() { + len += 1; + } let mut struct_ser = serializer.serialize_struct("penumbra.core.component.sct.v1.EventAnchor", len)?; if let Some(v) = self.anchor.as_ref() { struct_ser.serialize_field("anchor", v)?; @@ -1155,6 +1158,9 @@ impl serde::Serialize for EventAnchor { #[allow(clippy::needless_borrow)] struct_ser.serialize_field("height", ToString::to_string(&self.height).as_str())?; } + if let Some(v) = self.timestamp.as_ref() { + struct_ser.serialize_field("timestamp", v)?; + } struct_ser.end() } } @@ -1167,12 +1173,14 @@ impl<'de> serde::Deserialize<'de> for EventAnchor { const FIELDS: &[&str] = &[ "anchor", "height", + "timestamp", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { Anchor, Height, + Timestamp, __SkipField__, } impl<'de> serde::Deserialize<'de> for GeneratedField { @@ -1197,6 +1205,7 @@ impl<'de> serde::Deserialize<'de> for EventAnchor { match value { "anchor" => Ok(GeneratedField::Anchor), "height" => Ok(GeneratedField::Height), + "timestamp" => Ok(GeneratedField::Timestamp), _ => Ok(GeneratedField::__SkipField__), } } @@ -1218,6 +1227,7 @@ impl<'de> serde::Deserialize<'de> for EventAnchor { { let mut anchor__ = None; let mut height__ = None; + let mut timestamp__ = None; while let Some(k) = map_.next_key()? { match k { GeneratedField::Anchor => { @@ -1234,6 +1244,12 @@ impl<'de> serde::Deserialize<'de> for EventAnchor { Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) ; } + GeneratedField::Timestamp => { + if timestamp__.is_some() { + return Err(serde::de::Error::duplicate_field("timestamp")); + } + timestamp__ = map_.next_value()?; + } GeneratedField::__SkipField__ => { let _ = map_.next_value::()?; } @@ -1242,6 +1258,7 @@ impl<'de> serde::Deserialize<'de> for EventAnchor { Ok(EventAnchor { anchor: anchor__, height: height__.unwrap_or_default(), + timestamp: timestamp__, }) } } @@ -1262,6 +1279,9 @@ impl serde::Serialize for EventBlockRoot { if self.height != 0 { len += 1; } + if self.timestamp.is_some() { + len += 1; + } let mut struct_ser = serializer.serialize_struct("penumbra.core.component.sct.v1.EventBlockRoot", len)?; if let Some(v) = self.root.as_ref() { struct_ser.serialize_field("root", v)?; @@ -1270,6 +1290,9 @@ impl serde::Serialize for EventBlockRoot { #[allow(clippy::needless_borrow)] struct_ser.serialize_field("height", ToString::to_string(&self.height).as_str())?; } + if let Some(v) = self.timestamp.as_ref() { + struct_ser.serialize_field("timestamp", v)?; + } struct_ser.end() } } @@ -1282,12 +1305,14 @@ impl<'de> serde::Deserialize<'de> for EventBlockRoot { const FIELDS: &[&str] = &[ "root", "height", + "timestamp", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { Root, Height, + Timestamp, __SkipField__, } impl<'de> serde::Deserialize<'de> for GeneratedField { @@ -1312,6 +1337,7 @@ impl<'de> serde::Deserialize<'de> for EventBlockRoot { match value { "root" => Ok(GeneratedField::Root), "height" => Ok(GeneratedField::Height), + "timestamp" => Ok(GeneratedField::Timestamp), _ => Ok(GeneratedField::__SkipField__), } } @@ -1333,6 +1359,7 @@ impl<'de> serde::Deserialize<'de> for EventBlockRoot { { let mut root__ = None; let mut height__ = None; + let mut timestamp__ = None; while let Some(k) = map_.next_key()? { match k { GeneratedField::Root => { @@ -1349,6 +1376,12 @@ impl<'de> serde::Deserialize<'de> for EventBlockRoot { Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) ; } + GeneratedField::Timestamp => { + if timestamp__.is_some() { + return Err(serde::de::Error::duplicate_field("timestamp")); + } + timestamp__ = map_.next_value()?; + } GeneratedField::__SkipField__ => { let _ = map_.next_value::()?; } @@ -1357,6 +1390,7 @@ impl<'de> serde::Deserialize<'de> for EventBlockRoot { Ok(EventBlockRoot { root: root__, height: height__.unwrap_or_default(), + timestamp: timestamp__, }) } } @@ -1509,6 +1543,9 @@ impl serde::Serialize for EventEpochRoot { if self.index != 0 { len += 1; } + if self.timestamp.is_some() { + len += 1; + } let mut struct_ser = serializer.serialize_struct("penumbra.core.component.sct.v1.EventEpochRoot", len)?; if let Some(v) = self.root.as_ref() { struct_ser.serialize_field("root", v)?; @@ -1517,6 +1554,9 @@ impl serde::Serialize for EventEpochRoot { #[allow(clippy::needless_borrow)] struct_ser.serialize_field("index", ToString::to_string(&self.index).as_str())?; } + if let Some(v) = self.timestamp.as_ref() { + struct_ser.serialize_field("timestamp", v)?; + } struct_ser.end() } } @@ -1529,12 +1569,14 @@ impl<'de> serde::Deserialize<'de> for EventEpochRoot { const FIELDS: &[&str] = &[ "root", "index", + "timestamp", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { Root, Index, + Timestamp, __SkipField__, } impl<'de> serde::Deserialize<'de> for GeneratedField { @@ -1559,6 +1601,7 @@ impl<'de> serde::Deserialize<'de> for EventEpochRoot { match value { "root" => Ok(GeneratedField::Root), "index" => Ok(GeneratedField::Index), + "timestamp" => Ok(GeneratedField::Timestamp), _ => Ok(GeneratedField::__SkipField__), } } @@ -1580,6 +1623,7 @@ impl<'de> serde::Deserialize<'de> for EventEpochRoot { { let mut root__ = None; let mut index__ = None; + let mut timestamp__ = None; while let Some(k) = map_.next_key()? { match k { GeneratedField::Root => { @@ -1596,6 +1640,12 @@ impl<'de> serde::Deserialize<'de> for EventEpochRoot { Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) ; } + GeneratedField::Timestamp => { + if timestamp__.is_some() { + return Err(serde::de::Error::duplicate_field("timestamp")); + } + timestamp__ = map_.next_value()?; + } GeneratedField::__SkipField__ => { let _ = map_.next_value::()?; } @@ -1604,6 +1654,7 @@ impl<'de> serde::Deserialize<'de> for EventEpochRoot { Ok(EventEpochRoot { root: root__, index: index__.unwrap_or_default(), + timestamp: timestamp__, }) } } diff --git a/crates/proto/src/gen/proto_descriptor.bin.no_lfs b/crates/proto/src/gen/proto_descriptor.bin.no_lfs index 3e17595eb3d5af1872e69f21b58cc061873d1f12..c6bbc68a36899cb580be859f383d8f922a7da506 100644 GIT binary patch delta 34578 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 diff --git a/proto/penumbra/penumbra/core/component/sct/v1/sct.proto b/proto/penumbra/penumbra/core/component/sct/v1/sct.proto index f18bcbb06e..742b69216c 100644 --- a/proto/penumbra/penumbra/core/component/sct/v1/sct.proto +++ b/proto/penumbra/penumbra/core/component/sct/v1/sct.proto @@ -89,19 +89,23 @@ message EventCommitment { message EventAnchor { crypto.tct.v1.MerkleRoot anchor = 1; uint64 height = 2; + google.protobuf.Timestamp timestamp = 3; } // Event recording an SCT epoch root. message EventEpochRoot { crypto.tct.v1.MerkleRoot root = 1; uint64 index = 2; + google.protobuf.Timestamp timestamp = 3; } // Event recording an SCT block root. message EventBlockRoot { crypto.tct.v1.MerkleRoot root = 1; uint64 height = 2; + google.protobuf.Timestamp timestamp = 3; } + message EpochByHeightRequest { uint64 height = 1; }