Skip to content

Commit 43516f0

Browse files
committed
testing era crashes on signer startup
1 parent 1a25c7b commit 43516f0

File tree

9 files changed

+100
-17
lines changed

9 files changed

+100
-17
lines changed

Cargo.lock

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-aggregator/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-aggregator"
3-
version = "0.2.25"
3+
version = "0.2.26"
44
description = "A Mithril Aggregator server"
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-aggregator/src/runtime/runner.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ impl AggregatorRunnerTrait for AggregatorRunner {
623623
.collect::<Vec<_>>();
624624
let multi_signature = multisigner.get_multi_signature().await?.ok_or_else(|| {
625625
RunnerError::NoComputedMultiSignature(format!(
626-
"No AVK returned by the multisigner for working certificate at beacon {:?}",
626+
"no multi signature generated for beacon {:?}",
627627
working_certificate.beacon
628628
))
629629
})?;

mithril-common/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-common"
3-
version = "0.2.20"
3+
version = "0.2.21"
44
authors = { workspace = true }
55
edition = { workspace = true }
66
documentation = { workspace = true }

mithril-signer/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-signer"
3-
version = "0.2.17"
3+
version = "0.2.18"
44
description = "A Mithril Signer"
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-signer/src/runtime/runner.rs

+2
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,8 @@ impl Runner for SignerRunner {
435435
&self,
436436
epoch: Epoch,
437437
) -> Result<(), Box<dyn StdError + Sync + Send>> {
438+
debug!("RUNNER: update_era_checker");
439+
438440
let era_token = self
439441
.services
440442
.era_reader

mithril-signer/src/runtime/state_machine.rs

+11-8
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,17 @@ impl StateMachine {
177177
"pending_certificate" => ?pending_certificate
178178
);
179179

180-
if self.runner.can_i_sign(&pending_certificate).await.map_err(|e| {
181-
RuntimeError::KeepState {
180+
if self
181+
.runner
182+
.can_i_sign(&pending_certificate)
183+
.await
184+
.map_err(|e| RuntimeError::KeepState {
182185
message: format!(
183-
"could not determin if I can sign pending certificate at beacon {beacon:?}"
186+
"could not determine if I can sign certificate at beacon {beacon:?}"
184187
),
185188
nested_error: Some(e),
186-
}
187-
})? {
189+
})?
190+
{
188191
info!(" → we can sign this certificate, transiting to SIGNED");
189192
self.state = self
190193
.transition_from_registered_to_signed(&pending_certificate)
@@ -257,8 +260,8 @@ impl StateMachine {
257260
}
258261

259262
async fn transition_from_init_to_unregistered(&self) -> Result<SignerState, RuntimeError> {
260-
let current_beacon = self
261-
.get_current_beacon("unregistered → unregistered")
263+
let current_beacon = self.get_current_beacon("init → unregistered").await?;
264+
self.update_era_checker(current_beacon.epoch, "init → unregistered")
262265
.await?;
263266

264267
Ok(SignerState::Unregistered {
@@ -282,7 +285,7 @@ impl StateMachine {
282285
&self,
283286
beacon: Beacon,
284287
) -> Result<SignerState, RuntimeError> {
285-
self.update_era_checker(beacon.epoch, "unregisteredregistered")
288+
self.update_era_checker(beacon.epoch, "registeredunregistered")
286289
.await?;
287290

288291
Ok(SignerState::Unregistered {

mithril-signer/tests/era_switch.rs

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
mod test_extensions;
2+
3+
use mithril_common::{
4+
crypto_helper::tests_setup,
5+
entities::Epoch,
6+
era::{EraMarker, SupportedEra},
7+
test_utils::MithrilFixtureBuilder,
8+
};
9+
10+
use test_extensions::StateMachineTester;
11+
12+
#[rustfmt::skip]
13+
#[tokio::test]
14+
async fn era_fail_at_startup() {
15+
let protocol_parameters = tests_setup::setup_protocol_parameters();
16+
let fixture = MithrilFixtureBuilder::default().with_signers(10).with_protocol_parameters(protocol_parameters.into()).build();
17+
let signers_with_stake = fixture.signers_with_stake();
18+
let mut tester = StateMachineTester::init(&signers_with_stake)
19+
.await.expect("state machine tester init should not fail");
20+
tester.set_era_markers(vec![EraMarker::new("whatever", Some(Epoch(0)))]);
21+
22+
tester
23+
.comment("TEST: state machine fails starting when current Era is not supported.")
24+
.is_init().unwrap()
25+
.cycle_unregistered().await
26+
.expect_err("The state machine must fail at startup.");
27+
28+
tester
29+
.comment("TEST: state machine fails when transiting to a new unsupported Era.")
30+
.set_era_markers(vec![
31+
EraMarker::new(&SupportedEra::dummy().to_string(), Some(Epoch(0))),
32+
EraMarker::new("unsupported", Some(Epoch(4))),
33+
])
34+
.is_init().unwrap()
35+
.cycle_unregistered().await.unwrap()
36+
.check_era_checker_last_updated_at(Epoch(1)).await.unwrap()
37+
.comment("Init Era checking went well, now let's go to usual business…")
38+
.increase_epoch(2).await.unwrap()
39+
.cycle_unregistered().await.unwrap()
40+
.check_era_checker_last_updated_at(Epoch(2)).await.unwrap()
41+
.aggregator_send_epoch_settings().await
42+
.cycle_registered().await.unwrap()
43+
.increase_epoch(3).await.unwrap()
44+
.cycle_unregistered().await.unwrap()
45+
.check_era_checker_last_updated_at(Epoch(3)).await.unwrap()
46+
.aggregator_send_epoch_settings().await
47+
.cycle_registered().await.unwrap()
48+
.increase_epoch(4).await.unwrap()
49+
.comment("Reaching unsupported Era Epoch")
50+
.cycle_unregistered().await
51+
.expect_err("The state machine must fail because of unsupported Era.");
52+
}

mithril-signer/tests/test_extensions/state_machine_tester.rs

+28-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1+
#![allow(dead_code)]
12
use mithril_common::digesters::ImmutableFileObserver;
23
use mithril_common::entities::SignerWithStake;
34
use mithril_common::era::{
4-
adapters::{EraReaderAdapterType, EraReaderBootstrapAdapter},
5+
adapters::{EraReaderAdapterType, EraReaderDummyAdapter},
56
EraChecker, EraReader,
67
};
8+
use mithril_common::era::{EraMarker, SupportedEra};
79
use mithril_common::BeaconProvider;
810
use slog::Drain;
911
use slog_scope::debug;
1012
use std::error::Error as StdError;
13+
use std::fmt::Debug;
1114
use std::{path::PathBuf, sync::Arc, time::Duration};
1215
use thiserror::Error;
1316

@@ -53,10 +56,18 @@ pub struct StateMachineTester {
5356
protocol_initializer_store: Arc<ProtocolInitializerStore>,
5457
stake_store: Arc<StakeStore>,
5558
era_checker: Arc<EraChecker>,
59+
era_reader_adapter: Arc<EraReaderDummyAdapter>,
5660
comment_no: u32,
5761
_logs_guard: slog_scope::GlobalLoggerGuard,
5862
}
5963

64+
impl Debug for StateMachineTester {
65+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
66+
debug!("Debug called after comment N°{}.", self.comment_no);
67+
write!(f, "DEBUG")
68+
}
69+
}
70+
6071
impl StateMachineTester {
6172
pub async fn init(signers_with_stake: &[SignerWithStake]) -> Result<Self> {
6273
let selected_signer_with_stake = signers_with_stake.first().ok_or_else(|| {
@@ -119,7 +130,13 @@ impl StateMachineTester {
119130
Box::new(MemoryAdapter::new(None).unwrap()),
120131
config.store_retention_limit,
121132
));
122-
let era_reader = Arc::new(EraReader::new(Arc::new(EraReaderBootstrapAdapter)));
133+
let era_reader_adapter = Arc::new(EraReaderDummyAdapter::from_markers(vec![
134+
(EraMarker {
135+
name: SupportedEra::dummy().to_string(),
136+
epoch: Some(Epoch(0)),
137+
}),
138+
]));
139+
let era_reader = Arc::new(EraReader::new(era_reader_adapter.clone()));
123140
let era_epoch_token = era_reader
124141
.read_era_epoch_token(beacon_provider.get_current_beacon().await.unwrap().epoch)
125142
.await
@@ -157,6 +174,7 @@ impl StateMachineTester {
157174
protocol_initializer_store,
158175
stake_store,
159176
era_checker,
177+
era_reader_adapter,
160178
comment_no: 0,
161179
_logs_guard: logs_guard,
162180
})
@@ -324,4 +342,12 @@ impl StateMachineTester {
324342
format!("The epoch the EraChecker has been the last updated '{}' is different from expected epoch '{}'.", self.era_checker.current_epoch(), epoch)
325343
)
326344
}
345+
346+
/// Set Era markers
347+
pub fn set_era_markers(&mut self, markers: Vec<EraMarker>) -> &mut Self {
348+
debug!("Era markers set: {:?}", markers);
349+
self.era_reader_adapter.set_markers(markers);
350+
351+
self
352+
}
327353
}

0 commit comments

Comments
 (0)