Skip to content

Commit 9dd1520

Browse files
ali-behjatiReisen
authored andcommitted
Small refactor
1 parent 23340d5 commit 9dd1520

File tree

6 files changed

+94
-116
lines changed

6 files changed

+94
-116
lines changed

hermes/Cargo.lock

Lines changed: 4 additions & 71 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

hermes/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ solana-sdk = "=1.13.3"
5959
solana-account-decoder = "=1.13.3"
6060

6161
moka = { version = "0.11.0", features = ["future"] }
62-
derive_builder = "0.12.0"
6362
byteorder = "1.4.3"
6463
serde_qs = { version = "0.12.0", features = ["axum"] }
6564

hermes/src/store.rs

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ use {
1818
construct_message_states_proofs,
1919
store_wormhole_merkle_verified_message,
2020
},
21-
storage::AccumulatorState,
21+
storage::{
22+
AccumulatorState,
23+
CompletedAccumulatorState,
24+
},
2225
types::{
2326
MessageState,
2427
ProofSet,
@@ -113,7 +116,7 @@ impl Store {
113116
.unwrap_or(AccumulatorState {
114117
slot,
115118
accumulator_messages: None,
116-
wormhole_merkle_proof: None,
119+
wormhole_merkle_state: None,
117120
});
118121
accumulator_state.accumulator_messages = Some(accumulator_messages);
119122
self.storage
@@ -128,21 +131,32 @@ impl Store {
128131
None => return Ok(()),
129132
};
130133

131-
let (accumulator_messages, wormhole_merkle_proof) =
132-
match (state.accumulator_messages, state.wormhole_merkle_proof) {
133-
(Some(accumulator_messages), Some(wormhole_merkle_proof)) => {
134-
(accumulator_messages, wormhole_merkle_proof)
135-
}
136-
_ => return Ok(()),
137-
};
134+
let completed_state = state.try_into();
135+
let completed_state: CompletedAccumulatorState = match completed_state {
136+
Ok(completed_state) => completed_state,
137+
Err(_) => {
138+
return Ok(());
139+
}
140+
};
141+
142+
// Once the accumulator reaches a complete state for a specific slot
143+
// we can build the message states
144+
self.build_message_states(completed_state).await?;
138145

146+
self.update_tx.send(()).await?;
147+
148+
Ok(())
149+
}
150+
151+
async fn build_message_states(&self, completed_state: CompletedAccumulatorState) -> Result<()> {
139152
let wormhole_merkle_message_states_proofs =
140-
construct_message_states_proofs(&accumulator_messages, &wormhole_merkle_proof)?;
153+
construct_message_states_proofs(&completed_state)?;
141154

142155
let current_time: UnixTimestamp =
143156
SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs() as _;
144157

145-
let message_states = accumulator_messages
158+
let message_states = completed_state
159+
.accumulator_messages
146160
.messages
147161
.iter()
148162
.enumerate()
@@ -158,7 +172,7 @@ impl Store {
158172
.ok_or(anyhow!("Missing proof for message"))?
159173
.clone(),
160174
},
161-
accumulator_messages.slot,
175+
completed_state.slot,
162176
current_time,
163177
))
164178
})
@@ -168,8 +182,6 @@ impl Store {
168182

169183
self.storage.store_message_states(message_states).await?;
170184

171-
self.update_tx.send(()).await?;
172-
173185
Ok(())
174186
}
175187

hermes/src/store/proof/wormhole_merkle.rs

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use {
22
crate::store::{
3-
storage::AccumulatorState,
4-
types::{
5-
AccumulatorMessages,
6-
MessageState,
3+
storage::{
4+
AccumulatorState,
5+
CompletedAccumulatorState,
76
},
7+
types::MessageState,
88
Store,
99
},
1010
anyhow::{
@@ -32,6 +32,12 @@ use {
3232
},
3333
};
3434

35+
#[derive(Clone, PartialEq, Debug)]
36+
pub struct WormholeMerkleState {
37+
pub root: WormholeMerkleRoot,
38+
pub vaa: Vec<u8>,
39+
}
40+
3541
#[derive(Clone, PartialEq, Debug)]
3642
pub struct WormholeMerkleMessageProof {
3743
pub vaa: Vec<u8>,
@@ -40,20 +46,23 @@ pub struct WormholeMerkleMessageProof {
4046

4147
pub async fn store_wormhole_merkle_verified_message(
4248
store: &Store,
43-
proof: WormholeMerkleRoot,
49+
root: WormholeMerkleRoot,
4450
vaa_bytes: Vec<u8>,
4551
) -> Result<()> {
4652
let mut accumulator_state = store
4753
.storage
48-
.fetch_accumulator_state(proof.slot)
54+
.fetch_accumulator_state(root.slot)
4955
.await?
5056
.unwrap_or(AccumulatorState {
51-
slot: proof.slot,
57+
slot: root.slot,
5258
accumulator_messages: None,
53-
wormhole_merkle_proof: None,
59+
wormhole_merkle_state: None,
5460
});
5561

56-
accumulator_state.wormhole_merkle_proof = Some((proof, vaa_bytes));
62+
accumulator_state.wormhole_merkle_state = Some(WormholeMerkleState {
63+
root,
64+
vaa: vaa_bytes,
65+
});
5766
store
5867
.storage
5968
.store_accumulator_state(accumulator_state)
@@ -62,9 +71,11 @@ pub async fn store_wormhole_merkle_verified_message(
6271
}
6372

6473
pub fn construct_message_states_proofs(
65-
accumulator_messages: &AccumulatorMessages,
66-
wormhole_merkle_proof: &(WormholeMerkleRoot, Vec<u8>),
74+
completed_accumulator_state: &CompletedAccumulatorState,
6775
) -> Result<Vec<WormholeMerkleMessageProof>> {
76+
let accumulator_messages = &completed_accumulator_state.accumulator_messages;
77+
let wormhole_merkle_state = &completed_accumulator_state.wormhole_merkle_state;
78+
6879
// Check whether the state is valid
6980
let merkle_acc = match MerkleAccumulator::<Keccak160>::from_set(
7081
accumulator_messages.messages.iter().map(|m| m.as_ref()),
@@ -73,9 +84,7 @@ pub fn construct_message_states_proofs(
7384
None => return Ok(vec![]), // It only happens when the message set is empty
7485
};
7586

76-
let (proof, vaa) = &wormhole_merkle_proof;
77-
78-
if merkle_acc.root != proof.root {
87+
if merkle_acc.root != wormhole_merkle_state.root.root {
7988
return Err(anyhow!("Invalid merkle root"));
8089
}
8190

@@ -84,7 +93,7 @@ pub fn construct_message_states_proofs(
8493
.iter()
8594
.map(|m| {
8695
Ok(WormholeMerkleMessageProof {
87-
vaa: vaa.clone(),
96+
vaa: wormhole_merkle_state.vaa.clone(),
8897
proof: merkle_acc
8998
.prove(m.as_ref())
9099
.ok_or(anyhow!("Failed to prove message"))?,

hermes/src/store/storage.rs

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
use {
2-
super::types::{
3-
AccumulatorMessages,
4-
MessageIdentifier,
5-
MessageState,
6-
MessageType,
7-
RequestTime,
8-
Slot,
2+
super::{
3+
proof::wormhole_merkle::WormholeMerkleState,
4+
types::{
5+
AccumulatorMessages,
6+
MessageIdentifier,
7+
MessageState,
8+
MessageType,
9+
RequestTime,
10+
Slot,
11+
},
12+
},
13+
anyhow::{
14+
anyhow,
15+
Result,
916
},
10-
anyhow::Result,
1117
async_trait::async_trait,
1218
pyth_sdk::PriceIdentifier,
1319
pythnet_sdk::wire::v1::WormholeMerkleRoot,
@@ -19,7 +25,32 @@ pub mod local_storage;
1925
pub struct AccumulatorState {
2026
pub slot: Slot,
2127
pub accumulator_messages: Option<AccumulatorMessages>,
22-
pub wormhole_merkle_proof: Option<(WormholeMerkleRoot, Vec<u8>)>,
28+
pub wormhole_merkle_state: Option<WormholeMerkleState>,
29+
}
30+
31+
#[derive(Clone, PartialEq, Debug)]
32+
pub struct CompletedAccumulatorState {
33+
pub slot: Slot,
34+
pub accumulator_messages: AccumulatorMessages,
35+
pub wormhole_merkle_state: WormholeMerkleState,
36+
}
37+
38+
impl TryFrom<AccumulatorState> for CompletedAccumulatorState {
39+
type Error = anyhow::Error;
40+
41+
fn try_from(state: AccumulatorState) -> Result<Self> {
42+
let accumulator_messages = state
43+
.accumulator_messages
44+
.ok_or_else(|| anyhow!("missing accumulator messages"))?;
45+
let wormhole_merkle_state = state
46+
.wormhole_merkle_state
47+
.ok_or_else(|| anyhow!("missing wormhole merkle state"))?;
48+
Ok(Self {
49+
slot: state.slot,
50+
accumulator_messages,
51+
wormhole_merkle_state,
52+
})
53+
}
2354
}
2455

2556
#[derive(Clone, Copy)]

hermes/src/store/types.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,6 @@ impl MessageExt for Message {
5252

5353
pub type RawMessage = Vec<u8>;
5454

55-
#[derive(Clone, PartialEq, Debug)]
56-
pub struct WormholeMerkleState {
57-
pub digest_proof: Vec<u8>,
58-
pub tree: Option<Vec<Vec<u8>>>,
59-
}
60-
6155
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
6256
pub struct MessageIdentifier {
6357
pub price_id: PriceIdentifier,

0 commit comments

Comments
 (0)