Skip to content

Commit 07e2926

Browse files
committed
feat(common): make cardano transactions signing config optional in SignedEntityConfig
This make the network resilient to a removal of this configuration at the expense of moving the error handling to nodes 'beacon to sign' computations (done in their state machines). Notes: leader aggregator will fails directly at startup if an incoherent configuration, which enable cardano transactions but don't specifies the associated configuration, is provided.
1 parent 0cf5fbc commit 07e2926

File tree

7 files changed

+74
-42
lines changed

7 files changed

+74
-42
lines changed

internal/mithril-protocol-config/src/http.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,6 @@ impl MithrilNetworkConfigurationProvider for HttpMithrilNetworkConfigurationProv
6666
))?
6767
.into();
6868

69-
configuration_for_aggregation.signed_entity_types_config.cardano_transactions.clone()
70-
.ok_or_else(|| {
71-
anyhow!(format!("Cardano transactions signing config is missing in aggregation configuration for epoch {epoch}"))
72-
})?;
73-
7469
Ok(MithrilNetworkConfiguration {
7570
epoch,
7671
configuration_for_aggregation,

mithril-aggregator/src/services/epoch_service.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -348,10 +348,7 @@ impl EpochService for MithrilEpochService {
348348
.configuration_for_aggregation
349349
.signed_entity_types_config
350350
.cardano_transactions
351-
.clone()
352-
.ok_or(anyhow!(
353-
"Missing cardano transactions signing config for current epoch {epoch:?}"
354-
))?,
351+
.clone(),
355352
};
356353

357354
let (total_spo, total_stake) =
@@ -1073,10 +1070,10 @@ mod tests {
10731070
async fn inform_epoch_get_signed_entity_config_from_its_dependencies_and_store() {
10741071
let epoch = Epoch(5);
10751072

1076-
let cardano_transactions_signing_config = CardanoTransactionsSigningConfig {
1073+
let cardano_transactions_signing_config = Some(CardanoTransactionsSigningConfig {
10771074
security_parameter: BlockNumber(29),
10781075
step: BlockNumber(986),
1079-
};
1076+
});
10801077
let allowed_discriminants = BTreeSet::from([
10811078
SignedEntityTypeDiscriminants::CardanoTransactions,
10821079
SignedEntityTypeDiscriminants::CardanoImmutableFilesFull,
@@ -1085,9 +1082,7 @@ mod tests {
10851082
let mut service = EpochServiceBuilder {
10861083
allowed_discriminants: allowed_discriminants.clone(),
10871084
stored_current_epoch_settings: AggregatorEpochSettings {
1088-
cardano_transactions_signing_config: Some(
1089-
cardano_transactions_signing_config.clone(),
1090-
),
1085+
cardano_transactions_signing_config: cardano_transactions_signing_config.clone(),
10911086
..AggregatorEpochSettings::dummy()
10921087
},
10931088
..EpochServiceBuilder::new(epoch, MithrilFixtureBuilder::default().build())

mithril-aggregator/src/services/message.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ impl MessageService for MithrilMessageService {
190190
current_signers: SignerMessagePart::from_signers(current_signers.to_vec()),
191191
next_signers: SignerMessagePart::from_signers(next_signers.to_vec()),
192192
cardano_transactions_signing_config: signed_entity_config
193-
.map(|c| c.cardano_transactions_signing_config),
193+
.and_then(|c| c.cardano_transactions_signing_config),
194194
};
195195

196196
Ok(epoch_settings_message)
@@ -635,7 +635,7 @@ mod tests {
635635
};
636636
let epoch_service = FakeEpochServiceBuilder {
637637
signed_entity_config: SignedEntityConfig {
638-
cardano_transactions_signing_config: expected_ctx_config.clone(),
638+
cardano_transactions_signing_config: Some(expected_ctx_config.clone()),
639639
..Dummy::dummy()
640640
},
641641
..FakeEpochServiceBuilder::dummy(Epoch(1))

mithril-common/src/entities/signed_entity_config.rs

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ pub struct SignedEntityConfig {
1515
/// List of discriminants that the node is allowed to sign
1616
pub allowed_discriminants: BTreeSet<SignedEntityTypeDiscriminants>,
1717
/// Cardano transactions signing configuration
18-
pub cardano_transactions_signing_config: CardanoTransactionsSigningConfig,
18+
pub cardano_transactions_signing_config: Option<CardanoTransactionsSigningConfig>,
1919
}
2020

2121
impl SignedEntityConfig {
@@ -66,11 +66,18 @@ impl SignedEntityConfig {
6666
))
6767
}
6868
SignedEntityTypeDiscriminants::CardanoTransactions => {
69-
SignedEntityType::CardanoTransactions(
70-
time_point.epoch,
71-
self.cardano_transactions_signing_config
72-
.compute_block_number_to_be_signed(time_point.chain_point.block_number),
73-
)
69+
match &self.cardano_transactions_signing_config {
70+
Some(config) => SignedEntityType::CardanoTransactions(
71+
time_point.epoch,
72+
config
73+
.compute_block_number_to_be_signed(time_point.chain_point.block_number),
74+
),
75+
None => {
76+
anyhow::bail!(
77+
"Can't derive a CardanoTransactions signed entity type from a time point without a `CardanoTransactionsSigningConfig`"
78+
)
79+
}
80+
}
7481
}
7582
SignedEntityTypeDiscriminants::CardanoDatabase => SignedEntityType::CardanoDatabase(
7683
CardanoDbBeacon::new(*time_point.epoch, time_point.immutable_file_number),
@@ -163,10 +170,10 @@ mod tests {
163170
};
164171
let config = SignedEntityConfig {
165172
allowed_discriminants: SignedEntityTypeDiscriminants::all(),
166-
cardano_transactions_signing_config: CardanoTransactionsSigningConfig {
173+
cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
167174
security_parameter: BlockNumber(0),
168175
step: BlockNumber(15),
169-
},
176+
}),
170177
};
171178

172179
assert_eq!(
@@ -224,6 +231,36 @@ mod tests {
224231
);
225232
}
226233

234+
#[test]
235+
fn can_not_convert_time_point_to_cardano_transaction_without_the_associated_config() {
236+
let time_point = TimePoint {
237+
epoch: Epoch(1),
238+
immutable_file_number: 5,
239+
chain_point: ChainPoint {
240+
slot_number: SlotNumber(73),
241+
block_number: BlockNumber(20),
242+
block_hash: "block_hash-20".to_string(),
243+
},
244+
};
245+
let config = SignedEntityConfig {
246+
allowed_discriminants: SignedEntityTypeDiscriminants::all(),
247+
cardano_transactions_signing_config: None,
248+
};
249+
250+
let error = config
251+
.time_point_to_signed_entity(
252+
SignedEntityTypeDiscriminants::CardanoTransactions,
253+
&time_point,
254+
)
255+
.unwrap_err();
256+
257+
let expected_error = "Can't derive a CardanoTransactions signed entity type from a time point without a `CardanoTransactionsSigningConfig`";
258+
assert!(
259+
error.to_string().contains(expected_error),
260+
"Error message: {error:?}\nshould contains: {expected_error}\n"
261+
);
262+
}
263+
227264
#[test]
228265
fn computing_block_number_to_be_signed() {
229266
// **block_number = ((tip.block_number - k') / n) × n**
@@ -422,10 +459,10 @@ mod tests {
422459
SignedEntityTypeDiscriminants::CardanoStakeDistribution,
423460
SignedEntityTypeDiscriminants::CardanoTransactions,
424461
]),
425-
cardano_transactions_signing_config: CardanoTransactionsSigningConfig {
462+
cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
426463
security_parameter: BlockNumber(0),
427464
step: BlockNumber(15),
428-
},
465+
}),
429466
};
430467

431468
let signed_entity_types = config.list_allowed_signed_entity_types(&time_point).unwrap();

mithril-common/src/test/double/dummies.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ mod entities {
4141
fn dummy() -> Self {
4242
Self {
4343
allowed_discriminants: SignedEntityTypeDiscriminants::all(),
44-
cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(),
44+
cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig::dummy()),
4545
}
4646
}
4747
}

mithril-signer/src/services/certifier.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ mod tests {
525525
) -> Self {
526526
Self {
527527
config: SignedEntityConfig {
528-
cardano_transactions_signing_config: config,
528+
cardano_transactions_signing_config: Some(config),
529529
allowed_discriminants,
530530
},
531531
}

mithril-signer/src/services/epoch_service.rs

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use anyhow::anyhow;
21
use async_trait::async_trait;
32
use mithril_protocol_config::model::MithrilNetworkConfiguration;
43
use slog::{Logger, debug, trace, warn};
@@ -308,15 +307,12 @@ impl SignerSignedEntityConfigProvider {
308307
impl SignedEntityConfigProvider for SignerSignedEntityConfigProvider {
309308
async fn get(&self) -> StdResult<SignedEntityConfig> {
310309
let epoch_service = self.epoch_service.read().await;
311-
let cardano_transactions_signing_config =
312-
match epoch_service.cardano_transactions_signing_config()? {
313-
Some(config) => Ok(config.clone()),
314-
None => Err(anyhow!("No cardano transaction signing config available")),
315-
}?;
316310

317311
Ok(SignedEntityConfig {
318312
allowed_discriminants: epoch_service.allowed_discriminants()?.clone(),
319-
cardano_transactions_signing_config,
313+
cardano_transactions_signing_config: epoch_service
314+
.cardano_transactions_signing_config()?
315+
.clone(),
320316
})
321317
}
322318
}
@@ -905,17 +901,19 @@ mod tests {
905901
"Should fail since sources data are not set before the first inform_epoch_settings",
906902
);
907903
}
908-
// Fail after `inform_epoch_settings` if `cardano_transactions_signing_config` is not set
904+
// Success after `inform_epoch_settings` even if `cardano_transactions_signing_config` is not set
909905
{
910906
let signers = fake_data::signers(5);
911907
let current_signers = signers[1..3].to_vec();
912908
let next_signers = signers[2..5].to_vec();
909+
let allowed_discriminants =
910+
BTreeSet::from([SignedEntityTypeDiscriminants::CardanoStakeDistribution]);
913911

914912
let configuration_for_aggregation = MithrilNetworkConfigurationForEpoch {
915913
signed_entity_types_config: SignedEntityTypeConfiguration {
916914
cardano_transactions: None,
917915
},
918-
enabled_signed_entity_types: BTreeSet::new(),
916+
enabled_signed_entity_types: allowed_discriminants.clone(),
919917
..Dummy::dummy()
920918
};
921919
let configuration_for_next_aggregation = MithrilNetworkConfigurationForEpoch::dummy();
@@ -936,10 +934,15 @@ mod tests {
936934
.await
937935
.unwrap();
938936

939-
config_provider
940-
.get()
941-
.await
942-
.expect_err("Should fail since cardano_transactions_signing_config is not set");
937+
let config = config_provider.get().await.unwrap();
938+
939+
assert_eq!(
940+
SignedEntityConfig {
941+
allowed_discriminants,
942+
cardano_transactions_signing_config: None,
943+
},
944+
config
945+
);
943946
}
944947
// Success after `inform_epoch_settings` if `cardano_transactions_signing_config` is set
945948
{
@@ -975,7 +978,9 @@ mod tests {
975978
assert_eq!(
976979
SignedEntityConfig {
977980
allowed_discriminants,
978-
cardano_transactions_signing_config: CardanoTransactionsSigningConfig::dummy(),
981+
cardano_transactions_signing_config: Some(
982+
CardanoTransactionsSigningConfig::dummy()
983+
),
979984
},
980985
config
981986
);

0 commit comments

Comments
 (0)