Skip to content

Commit e59f44a

Browse files
committed
feat(signer): store unique signer registration per epoch
1 parent 69e39ed commit e59f44a

File tree

3 files changed

+39
-8
lines changed

3 files changed

+39
-8
lines changed

mithril-signer/src/database/query/protocol_initializer/insert_protocol_initializer.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ use mithril_persistence::sqlite::{Query, SourceAlias, SqLiteEntity, WhereConditi
55

66
use crate::database::record::ProtocolInitializerRecord;
77

8-
/// Query to insert or replace [ProtocolInitializerRecord] in the sqlite database
9-
pub struct InsertOrReplaceProtocolInitializerQuery {
8+
/// Query to insert or ignore [ProtocolInitializerRecord] in the sqlite database
9+
pub struct InsertOrIgnoreProtocolInitializerQuery {
1010
condition: WhereCondition,
1111
}
1212

13-
impl InsertOrReplaceProtocolInitializerQuery {
13+
impl InsertOrIgnoreProtocolInitializerQuery {
1414
pub fn one(record: ProtocolInitializerRecord) -> StdResult<Self> {
1515
let value = serde_json::to_string(&record.protocol_initializer).unwrap();
1616
let condition = WhereCondition::new(
@@ -26,7 +26,7 @@ impl InsertOrReplaceProtocolInitializerQuery {
2626
}
2727
}
2828

29-
impl Query for InsertOrReplaceProtocolInitializerQuery {
29+
impl Query for InsertOrIgnoreProtocolInitializerQuery {
3030
type Entity = ProtocolInitializerRecord;
3131

3232
fn filters(&self) -> WhereCondition {
@@ -41,6 +41,6 @@ impl Query for InsertOrReplaceProtocolInitializerQuery {
4141
"protocol_initializer",
4242
)]));
4343

44-
format!("insert or replace into protocol_initializer {condition} returning {projection}")
44+
format!("insert or ignore into protocol_initializer {condition} returning {projection} ")
4545
}
4646
}

mithril-signer/src/database/repository/protocol_initializer_repository.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use anyhow::Ok;
44
use async_trait::async_trait;
55

66
use crate::database::query::{
7-
DeleteProtocolInitializerQuery, InsertOrReplaceProtocolInitializerQuery,
7+
DeleteProtocolInitializerQuery, InsertOrIgnoreProtocolInitializerQuery,
88
};
99
use crate::database::record::ProtocolInitializerRecord;
1010
use crate::{
@@ -62,7 +62,7 @@ impl ProtocolInitializerStorer for ProtocolInitializerRepository {
6262
created_at: chrono::Utc::now(),
6363
};
6464
self.connection
65-
.apply(InsertOrReplaceProtocolInitializerQuery::one(record).unwrap())?;
65+
.apply(InsertOrIgnoreProtocolInitializerQuery::one(record).unwrap())?;
6666

6767
Ok(previous_protocol_initializer)
6868
}

mithril-signer/src/database/tests/protocol_initializer.rs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ fn setup_protocol_initializers(nb_epoch: u64) -> Vec<(Epoch, ProtocolInitializer
1313
let mut values: Vec<(Epoch, ProtocolInitializer)> = Vec::new();
1414
for epoch in 1..=nb_epoch {
1515
let stake = (epoch + 1) * 100;
16-
let protocol_initializer = fake_data::protocol_initializer("1", stake);
16+
let protocol_initializer = fake_data::protocol_initializer(format!("{epoch:?}"), stake);
1717
values.push((Epoch(epoch), protocol_initializer));
1818
}
1919
values
@@ -84,6 +84,37 @@ mod request {
8484
);
8585
}
8686

87+
#[tokio::test]
88+
async fn protocol_initializer_in_store_is_created_once_per_epoch_and_never_updated() {
89+
let protocol_initializers = setup_protocol_initializers(2);
90+
let epoch = protocol_initializers[0].0;
91+
let first_protocol_initializer = protocol_initializers[0].1.clone();
92+
let second_protocol_initializer = protocol_initializers[1].1.clone();
93+
94+
let store = init_store(&[], None).await;
95+
store
96+
.save_protocol_initializer(epoch, first_protocol_initializer.clone())
97+
.await
98+
.unwrap();
99+
100+
let res = store.get_protocol_initializer(epoch).await.unwrap().unwrap();
101+
assert_eq!(
102+
serde_json::to_string(&first_protocol_initializer).unwrap(),
103+
serde_json::to_string(&res).unwrap()
104+
);
105+
106+
store
107+
.save_protocol_initializer(epoch, second_protocol_initializer.clone())
108+
.await
109+
.unwrap();
110+
111+
let res = store.get_protocol_initializer(epoch).await.unwrap().unwrap();
112+
assert_eq!(
113+
serde_json::to_string(&first_protocol_initializer).unwrap(),
114+
serde_json::to_string(&res).unwrap()
115+
);
116+
}
117+
87118
#[tokio::test]
88119
async fn get_protocol_initializer_for_empty_epoch() {
89120
let store = init_store(&setup_protocol_initializers(2), None).await;

0 commit comments

Comments
 (0)