Skip to content

Commit effe078

Browse files
authored
Merge pull request #2739 from input-output-hk/jpraynaud/2424-unique-protocol-initializer-per-epoch
feat: use unique `ProtocolInitializer` per epoch in signer
2 parents 4075171 + 7c76a0d commit effe078

File tree

6 files changed

+80
-17
lines changed

6 files changed

+80
-17
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-signer/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-signer"
3-
version = "0.2.271"
3+
version = "0.2.272"
44
description = "A Mithril Signer"
55
authors = { workspace = true }
66
edition = { workspace = true }

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;

mithril-signer/src/runtime/runner.rs

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,20 @@ impl Runner for SignerRunner {
211211
self.services.kes_signer.clone(),
212212
kes_period,
213213
)?;
214+
self.services
215+
.protocol_initializer_store
216+
.save_protocol_initializer(epoch_offset_to_recording_epoch, protocol_initializer)
217+
.await?;
218+
219+
let protocol_initializer = self
220+
.services
221+
.protocol_initializer_store
222+
.get_protocol_initializer(epoch_offset_to_recording_epoch)
223+
.await?.ok_or(RunnerError::NoValueError(
224+
format!("no protocol_initializer available in store for epoch {epoch_offset_to_recording_epoch}"),
225+
)).with_context(
226+
|| "register_signer_to_aggregator can not retrieve protocol initializer from store",
227+
)?;
214228
let signer = Signer::new(
215229
self.services.single_signer.get_party_id(),
216230
protocol_initializer.verification_key().into(),
@@ -222,10 +236,6 @@ impl Runner for SignerRunner {
222236
.certificate_handler
223237
.register_signer(epoch_offset_to_recording_epoch, &signer)
224238
.await?;
225-
self.services
226-
.protocol_initializer_store
227-
.save_protocol_initializer(epoch_offset_to_recording_epoch, protocol_initializer)
228-
.await?;
229239

230240
Ok(())
231241
}
@@ -682,15 +692,37 @@ mod tests {
682692
.await
683693
.expect("registering a signer to the aggregator should not fail");
684694

685-
assert!(certificate_handler.get_last_registered_signer().await.is_some());
686-
let maybe_protocol_initializer = protocol_initializer_store
695+
let last_registered_signer_first_registration =
696+
certificate_handler.get_last_registered_signer().await.unwrap();
697+
let maybe_protocol_initializer_first_registration = protocol_initializer_store
687698
.get_protocol_initializer(current_epoch.offset_to_recording_epoch())
688699
.await
689700
.expect("get_protocol_initializer should not fail");
690701
assert!(
691-
maybe_protocol_initializer.is_some(),
702+
maybe_protocol_initializer_first_registration.is_some(),
692703
"A protocol initializer should have been registered at the 'Recording' epoch"
693704
);
705+
706+
runner
707+
.register_signer_to_aggregator()
708+
.await
709+
.expect("registering a signer to the aggregator should not fail");
710+
711+
let last_registered_signer_second_registration =
712+
certificate_handler.get_last_registered_signer().await.unwrap();
713+
let maybe_protocol_initializer_second_registration = protocol_initializer_store
714+
.get_protocol_initializer(current_epoch.offset_to_recording_epoch())
715+
.await
716+
.expect("get_protocol_initializer should not fail");
717+
assert!(
718+
maybe_protocol_initializer_second_registration.is_some(),
719+
"A protocol initializer should have been registered at the 'Recording' epoch"
720+
);
721+
assert_eq!(
722+
serde_json::to_string(&last_registered_signer_first_registration).unwrap(),
723+
serde_json::to_string(&last_registered_signer_second_registration).unwrap(),
724+
"The signer registration should be the same and should have been registered twice"
725+
);
694726
}
695727

696728
#[tokio::test]

0 commit comments

Comments
 (0)