Skip to content

Commit 5822932

Browse files
committed
feat: combine variable
1 parent 70675c4 commit 5822932

9 files changed

Lines changed: 115 additions & 132 deletions

File tree

rust/main/agents/relayer/src/msg/db_loader.rs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ pub mod test {
422422
},
423423
};
424424
use hyperlane_core::{
425-
identifiers::UniqueIdentifier, test_utils::dummy_domain, GasPaymentKey,
425+
identifiers::UniqueIdentifier, test_utils::dummy_domain, CheckpointInfo, GasPaymentKey,
426426
InterchainGasPayment, InterchainGasPaymentMeta, MerkleTreeInsertion,
427427
PendingOperationStatus, H256,
428428
};
@@ -737,16 +737,8 @@ pub mod test {
737737

738738
fn retrieve_payload_uuids_by_message_id(&self, message_id: &H256) -> DbResult<Option<Vec<UniqueIdentifier>>>;
739739

740-
fn store_latest_checkpoint_block_height(
741-
&self,
742-
checkpoint_block_height: u64,
743-
) -> DbResult<()>;
744-
fn retrieve_latest_checkpoint_block_height(
745-
&self,
746-
) -> DbResult<Option<u64>>;
747-
748-
fn store_latest_checkpoint_index(&self, checkpoint_index: u64) -> DbResult<()>;
749-
fn retrieve_latest_checkpoint_index(&self) -> DbResult<Option<u64>>;
740+
fn store_latest_checkpoint_info(&self, checkpoint_info: &CheckpointInfo) -> DbResult<()>;
741+
fn retrieve_latest_checkpoint_info(&self) -> DbResult<Option<CheckpointInfo>>;
750742
}
751743
}
752744

rust/main/agents/relayer/src/msg/pending_message.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,15 +1202,9 @@ mod test {
12021202
fn retrieve_highest_seen_message_nonce_number(&self) -> DbResult<Option<u32>>;
12031203
fn store_payload_uuids_by_message_id(&self, message_id: &H256, payload_uuids: Vec<UniqueIdentifier>) -> DbResult<()>;
12041204
fn retrieve_payload_uuids_by_message_id(&self, message_id: &H256) -> DbResult<Option<Vec<UniqueIdentifier>>>;
1205-
fn store_latest_checkpoint_block_height(
1206-
&self,
1207-
checkpoint_block_height: u64,
1208-
) -> DbResult<()>;
1209-
fn retrieve_latest_checkpoint_block_height(
1210-
&self,
1211-
) -> DbResult<Option<u64>>;
1212-
fn store_latest_checkpoint_index(&self, checkpoint_index: u64) -> DbResult<()>;
1213-
fn retrieve_latest_checkpoint_index(&self) -> DbResult<Option<u64>>;
1205+
1206+
fn store_latest_checkpoint_info(&self, checkpoint_info: &CheckpointInfo) -> DbResult<()>;
1207+
fn retrieve_latest_checkpoint_info(&self) -> DbResult<Option<CheckpointInfo>>;
12141208
}
12151209
}
12161210

rust/main/agents/validator/src/submit.rs

Lines changed: 39 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,9 @@ impl ValidatorSubmitter {
118118
true
119119
};
120120

121-
let mut latest_seen_checkpoint_index = self
121+
let mut latest_seen_checkpoint = self
122122
.db
123-
.retrieve_latest_checkpoint_index()
124-
.unwrap_or_default()
125-
.unwrap_or_default() as u32;
126-
let mut latest_seen_checkpoint_block_height = self
127-
.db
128-
.retrieve_latest_checkpoint_block_height()
123+
.retrieve_latest_checkpoint_info()
129124
.unwrap_or_default()
130125
.unwrap_or_default();
131126

@@ -138,59 +133,40 @@ impl ValidatorSubmitter {
138133
})
139134
.await;
140135

141-
if latest_checkpoint.index < latest_seen_checkpoint_index {
142-
if let Some(block_height) = latest_checkpoint.block_height {
143-
if block_height >= latest_seen_checkpoint_block_height {
144-
tracing::error!(
145-
?latest_checkpoint,
146-
?latest_seen_checkpoint_index,
147-
?latest_seen_checkpoint_block_height,
148-
"Latest checkpoint index is lower than previously seen, but has a block height equal or greater.");
149-
150-
let checkpoint = self.checkpoint(&tree);
151-
Self::panic_with_reorg(
152-
&self.reorg_reporter,
153-
&self.reorg_period,
154-
&self.checkpoint_syncer,
155-
tree.root(),
156-
&latest_checkpoint,
157-
&checkpoint,
158-
)
159-
.await;
160-
}
136+
if let Some(block_height) = latest_checkpoint.block_height {
137+
if latest_checkpoint.index < latest_seen_checkpoint.checkpoint_index
138+
&& block_height >= latest_seen_checkpoint.block_height
139+
{
140+
tracing::error!(
141+
?latest_checkpoint,
142+
?latest_seen_checkpoint,
143+
"Latest checkpoint index is lower than previously seen, but has a block height equal or greater.");
144+
145+
let checkpoint = self.checkpoint(&tree);
146+
Self::panic_with_reorg(
147+
&self.reorg_reporter,
148+
&self.reorg_period,
149+
&self.checkpoint_syncer,
150+
tree.root(),
151+
&latest_checkpoint,
152+
&checkpoint,
153+
)
154+
.await;
161155
}
162-
}
163-
164-
if latest_checkpoint.index > latest_seen_checkpoint_index {
165156
tracing::debug!(
166-
old_index = latest_seen_checkpoint_index,
167-
new_index = latest_checkpoint.index,
157+
?latest_checkpoint,
158+
?latest_seen_checkpoint,
168159
"Updating latest seen checkpoint index"
169160
);
170-
latest_seen_checkpoint_index = latest_checkpoint.index;
171-
if let Err(err) = self
172-
.db
173-
.store_latest_checkpoint_index(latest_seen_checkpoint_index as u64)
174-
{
175-
tracing::error!(?err, "Failed to store latest_checkpoint_index");
176-
};
177-
if let Some(block_height) = latest_checkpoint.block_height {
178-
if block_height < latest_seen_checkpoint_block_height {
179-
tracing::warn!(
180-
checkpoint_index = latest_checkpoint.index,
181-
checkpoint_block_height = block_height,
182-
latest_seen_checkpoint_block_height,
183-
"Receive a checkpoint with a higher index, but lower block height"
184-
);
185-
}
186-
latest_seen_checkpoint_block_height = block_height;
187-
if let Err(err) = self
188-
.db
189-
.store_latest_checkpoint_block_height(latest_seen_checkpoint_block_height)
190-
{
191-
tracing::error!(?err, "Failed to store latest_checkpoint_block_height");
192-
}
161+
if block_height < latest_seen_checkpoint.block_height {
162+
tracing::warn!(
163+
?latest_checkpoint,
164+
?latest_seen_checkpoint,
165+
"Receive a checkpoint with a higher index, but lower block height"
166+
);
193167
}
168+
latest_seen_checkpoint.block_height = block_height;
169+
latest_seen_checkpoint.checkpoint_index = latest_checkpoint.index;
194170
}
195171

196172
self.metrics
@@ -344,13 +320,14 @@ impl ValidatorSubmitter {
344320
correctness_checkpoint: &CheckpointAtBlock,
345321
incorrect_checkpoint: &Checkpoint,
346322
) {
347-
let reorg_event = ReorgEvent::new(
348-
tree_root,
349-
correctness_checkpoint.root,
350-
incorrect_checkpoint.index,
351-
chrono::Utc::now().timestamp() as u64,
352-
reorg_period.clone(),
353-
);
323+
let reorg_event = ReorgEvent {
324+
local_merkle_root: tree_root,
325+
local_checkpoint_index: incorrect_checkpoint.index,
326+
canonical_merkle_root: correctness_checkpoint.root,
327+
canonical_checkpoint_index: correctness_checkpoint.index,
328+
unix_timestamp: chrono::Utc::now().timestamp() as u64,
329+
reorg_period: reorg_period.clone(),
330+
};
354331
error!(
355332
?incorrect_checkpoint,
356333
?correctness_checkpoint,

rust/main/agents/validator/src/submit/tests.rs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ use hyperlane_base::db::{
99
DbResult, HyperlaneDb, InterchainGasExpenditureData, InterchainGasPaymentData,
1010
};
1111
use hyperlane_core::{
12-
identifiers::UniqueIdentifier, test_utils::dummy_domain, GasPaymentKey, HyperlaneChain,
13-
HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, InterchainGasPayment,
14-
InterchainGasPaymentMeta, MerkleTreeHook, MerkleTreeInsertion, PendingOperationStatus,
15-
ReorgEvent, SignedAnnouncement, SignedCheckpointWithMessageId, H160, H256,
12+
identifiers::UniqueIdentifier, test_utils::dummy_domain, CheckpointInfo, GasPaymentKey,
13+
HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider,
14+
InterchainGasPayment, InterchainGasPaymentMeta, MerkleTreeHook, MerkleTreeInsertion,
15+
PendingOperationStatus, ReorgEvent, SignedAnnouncement, SignedCheckpointWithMessageId, H160,
16+
H256,
1617
};
1718

1819
use super::*;
@@ -130,15 +131,9 @@ mockall::mock! {
130131
fn retrieve_highest_seen_message_nonce_number(&self) -> DbResult<Option<u32>>;
131132
fn store_payload_uuids_by_message_id(&self, message_id: &H256, payload_uuids: Vec<UniqueIdentifier>) -> DbResult<()>;
132133
fn retrieve_payload_uuids_by_message_id(&self, message_id: &H256) -> DbResult<Option<Vec<UniqueIdentifier>>>;
133-
fn store_latest_checkpoint_block_height(
134-
&self,
135-
checkpoint_block_height: u64,
136-
) -> DbResult<()>;
137-
fn retrieve_latest_checkpoint_block_height(
138-
&self,
139-
) -> DbResult<Option<u64>>;
140-
fn store_latest_checkpoint_index(&self, checkpoint_index: u64) -> DbResult<()>;
141-
fn retrieve_latest_checkpoint_index(&self) -> DbResult<Option<u64>>;
134+
135+
fn store_latest_checkpoint_info(&self, checkpoint_info: &CheckpointInfo) -> DbResult<()>;
136+
fn retrieve_latest_checkpoint_info(&self) -> DbResult<Option<CheckpointInfo>>;
142137
}
143138
}
144139

@@ -227,12 +222,16 @@ fn reorg_event_is_correct(
227222
reorg_event.canonical_merkle_root,
228223
mock_onchain_merkle_tree.root()
229224
);
225+
assert_eq!(
226+
reorg_event.canonical_checkpoint_index,
227+
mock_onchain_merkle_tree.index()
228+
);
230229
assert_eq!(
231230
reorg_event.local_merkle_root,
232231
expected_local_merkle_tree.root()
233232
);
234233
assert_eq!(
235-
reorg_event.checkpoint_index,
234+
reorg_event.local_checkpoint_index,
236235
expected_local_merkle_tree.index()
237236
);
238237
// timestamp diff should be less than 1 second

rust/main/hyperlane-base/src/db/mod.rs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ pub use error::*;
33
pub use rocks::*;
44

55
use hyperlane_core::{
6-
identifiers::UniqueIdentifier, GasPaymentKey, HyperlaneDomain, HyperlaneMessage,
7-
InterchainGasPayment, InterchainGasPaymentMeta, MerkleTreeInsertion, PendingOperationStatus,
8-
H256,
6+
identifiers::UniqueIdentifier, CheckpointInfo, GasPaymentKey, HyperlaneDomain,
7+
HyperlaneMessage, InterchainGasPayment, InterchainGasPaymentMeta, MerkleTreeInsertion,
8+
PendingOperationStatus, H256,
99
};
1010

1111
mod error;
@@ -174,13 +174,8 @@ pub trait HyperlaneDb: Send + Sync {
174174
message_id: &H256,
175175
) -> DbResult<Option<Vec<UniqueIdentifier>>>;
176176

177-
/// Store latest seen checkpoint block height
178-
fn store_latest_checkpoint_block_height(&self, checkpoint_block_height: u64) -> DbResult<()>;
179-
/// Retrieve latest seen checkpoint block height
180-
fn retrieve_latest_checkpoint_block_height(&self) -> DbResult<Option<u64>>;
181-
182-
/// Store latest seen checkpoint index
183-
fn store_latest_checkpoint_index(&self, checkpoint_index: u64) -> DbResult<()>;
184-
/// Retrieve latest seen checkpoint index
185-
fn retrieve_latest_checkpoint_index(&self) -> DbResult<Option<u64>>;
177+
/// Store latest seen checkpoint info
178+
fn store_latest_checkpoint_info(&self, checkpoint_info: &CheckpointInfo) -> DbResult<()>;
179+
/// Retrieve latest seen checkpoint info
180+
fn retrieve_latest_checkpoint_info(&self) -> DbResult<Option<CheckpointInfo>>;
186181
}

rust/main/hyperlane-base/src/db/rocks/hyperlane_db.rs

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use eyre::{bail, Result};
55
use tracing::{debug, instrument, trace};
66

77
use hyperlane_core::{
8-
identifiers::UniqueIdentifier, Decode, Encode, GasPaymentKey, HyperlaneDomain,
8+
identifiers::UniqueIdentifier, CheckpointInfo, Decode, Encode, GasPaymentKey, HyperlaneDomain,
99
HyperlaneLogStore, HyperlaneMessage, HyperlaneSequenceAwareIndexerStoreReader,
1010
HyperlaneWatermarkedLogStore, Indexed, InterchainGasExpenditure, InterchainGasPayment,
1111
InterchainGasPaymentMeta, LogMeta, MerkleTreeInsertion, PendingOperationStatus, H256,
@@ -40,8 +40,7 @@ const MERKLE_TREE_INSERTION_BLOCK_NUMBER_BY_LEAF_INDEX: &str =
4040
"merkle_tree_insertion_block_number_by_leaf_index_";
4141
const LATEST_INDEXED_GAS_PAYMENT_BLOCK: &str = "latest_indexed_gas_payment_block";
4242
const PAYLOAD_UUIDS_BY_MESSAGE_ID: &str = "payload_uuids_by_message_id_";
43-
const LATEST_CHECKPOINT_BLOCK_HEIGHT: &str = "latest_checkpoint_block_height";
44-
const LATEST_CHECKPOINT_INDEX: &str = "latest_checkpoint_index";
43+
const LATEST_CHECKPOINT_INFO: &str = "latest_checkpoint_info";
4544

4645
/// Rocks DB result type
4746
pub type DbResult<T> = std::result::Result<T, DbError>;
@@ -701,22 +700,11 @@ impl HyperlaneDb for HyperlaneRocksDB {
701700
self.retrieve_value_by_key(PAYLOAD_UUIDS_BY_MESSAGE_ID, message_id)
702701
}
703702

704-
fn store_latest_checkpoint_block_height(&self, checkpoint_block_height: u64) -> DbResult<()> {
705-
self.store_value_by_key(
706-
LATEST_CHECKPOINT_BLOCK_HEIGHT,
707-
&bool::default(),
708-
&checkpoint_block_height,
709-
)
710-
}
711-
fn retrieve_latest_checkpoint_block_height(&self) -> DbResult<Option<u64>> {
712-
self.retrieve_value_by_key(LATEST_CHECKPOINT_BLOCK_HEIGHT, &bool::default())
713-
}
714-
715-
fn store_latest_checkpoint_index(&self, checkpoint_index: u64) -> DbResult<()> {
716-
self.store_value_by_key(LATEST_CHECKPOINT_INDEX, &bool::default(), &checkpoint_index)
703+
fn store_latest_checkpoint_info(&self, checkpoint_info: &CheckpointInfo) -> DbResult<()> {
704+
self.store_value_by_key(LATEST_CHECKPOINT_INFO, &bool::default(), checkpoint_info)
717705
}
718-
fn retrieve_latest_checkpoint_index(&self) -> DbResult<Option<u64>> {
719-
self.retrieve_value_by_key(LATEST_CHECKPOINT_INDEX, &bool::default())
706+
fn retrieve_latest_checkpoint_info(&self) -> DbResult<Option<CheckpointInfo>> {
707+
self.retrieve_value_by_key(LATEST_CHECKPOINT_INFO, &bool::default())
720708
}
721709
}
722710

rust/main/hyperlane-base/src/settings/checkpoint_syncer.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,13 +207,15 @@ mod test {
207207
let dummy_canonical_merkle_root =
208208
H256::from_str("0xb437b888332ef12f7260c7f679aad3c96b91ab81c2dc7242f8b290f0b6bba92b")
209209
.unwrap();
210-
let dummy_checkpoint_index = 56;
210+
let dummy_local_checkpoint_index = 56;
211+
let dummy_canonical_checkpoint_index = 56;
211212
let unix_timestamp = 1620000000;
212213
let reorg_period = ReorgPeriod::from_blocks(5);
213214
let dummy_reorg_event = ReorgEvent {
214215
local_merkle_root: dummy_local_merkle_root,
216+
local_checkpoint_index: dummy_local_checkpoint_index,
215217
canonical_merkle_root: dummy_canonical_merkle_root,
216-
checkpoint_index: dummy_checkpoint_index,
218+
canonical_checkpoint_index: dummy_canonical_checkpoint_index,
217219
unix_timestamp,
218220
reorg_period,
219221
};

rust/main/hyperlane-core/src/types/checkpoint.rs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use derive_more::Deref;
44
use serde::{Deserialize, Serialize};
55
use sha3::{digest::Update, Digest, Keccak256};
66

7-
use crate::{utils::domain_hash, Signable, Signature, SignedType, H256};
7+
use crate::{utils::domain_hash, Decode, Encode, Signable, Signature, SignedType, H256};
88

99
/// An Hyperlane checkpoint
1010
#[derive(Copy, Clone, Eq, PartialEq, Serialize, Deserialize, Debug)]
@@ -98,3 +98,38 @@ impl TryFrom<&mut Vec<SignedCheckpointWithMessageId>> for MultisigSignedCheckpoi
9898
})
9999
}
100100
}
101+
102+
/// Information about the checkpoint
103+
#[derive(Copy, Clone, Eq, PartialEq, Serialize, Deserialize, Debug, Default)]
104+
pub struct CheckpointInfo {
105+
/// block height of checkpoint
106+
pub block_height: u64,
107+
/// index of checkpoint
108+
pub checkpoint_index: u32,
109+
}
110+
111+
impl Encode for CheckpointInfo {
112+
fn write_to<W>(&self, writer: &mut W) -> std::io::Result<usize>
113+
where
114+
W: std::io::Write,
115+
{
116+
let mut written: usize = self.checkpoint_index.write_to(writer)?;
117+
written = written.saturating_add(self.block_height.write_to(writer)?);
118+
Ok(written)
119+
}
120+
}
121+
122+
impl Decode for CheckpointInfo {
123+
fn read_from<R>(reader: &mut R) -> Result<Self, crate::HyperlaneProtocolError>
124+
where
125+
R: std::io::Read,
126+
Self: Sized,
127+
{
128+
let checkpoint_index = u32::read_from(reader)?;
129+
let block_height = u64::read_from(reader)?;
130+
Ok(Self {
131+
checkpoint_index,
132+
block_height,
133+
})
134+
}
135+
}

rust/main/hyperlane-core/src/types/reorg.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ pub struct ReorgEvent {
1010
pub local_merkle_root: H256,
1111
/// the onchain merkle root
1212
pub canonical_merkle_root: H256,
13-
/// the index of the checkpoint when the reorg was detected
14-
/// (due to a mismatch between local and canonical merkle roots)
15-
pub checkpoint_index: u32,
13+
/// the latest local checkpoint index
14+
pub local_checkpoint_index: u32,
15+
/// the latest onchain checkpoint index
16+
pub canonical_checkpoint_index: u32,
1617
/// the timestamp when the reorg was detected, in seconds since the Unix epoch
1718
pub unix_timestamp: u64,
1819
/// the reorg period configured for the agent

0 commit comments

Comments
 (0)