Skip to content

Commit 2943337

Browse files
authored
Merge pull request #2789 from input-output-hk/djo/2780/support-optional-ctx-config
refactor: support optional cardano transaction signing config
2 parents ee8bef9 + ae39eb3 commit 2943337

File tree

24 files changed

+367
-254
lines changed

24 files changed

+367
-254
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ As a minor extension, we have adopted a slightly different versioning convention
99

1010
## Mithril Distribution [XXXX] - UNRELEASED
1111

12+
- Support for removal of `cardano_transactions_signing_config` from the diffused mithril network configuration.
13+
1214
- Decentralization of the configuration parameters of Mithril networks:
1315
- Added the `/protocol-configuration/{epoch}` route to fetch aggregator configuration for a given epoch, `{epoch}` must be a number.
1416
- Refactor Signer and Aggregator (leader, follower) to read network configurations from a `MithrilNetworkConfigurationProvider`

Cargo.lock

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

internal/mithril-protocol-config/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-protocol-config"
3-
version = "0.1.2"
3+
version = "0.1.3"
44
description = "Configuraton parameters for Mithril network"
55
authors = { workspace = true }
66
edition = { workspace = true }

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/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-aggregator"
3-
version = "0.7.94"
3+
version = "0.7.95"
44
description = "A Mithril Aggregator server"
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-aggregator/src/configuration.rs

Lines changed: 90 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -382,15 +382,25 @@ pub trait ConfigurationSource {
382382
fn get_leader_aggregator_epoch_settings_configuration(
383383
&self,
384384
) -> StdResult<AggregatorEpochSettings> {
385+
let allowed_discriminants = self.compute_allowed_signed_entity_types_discriminants()?;
386+
387+
let cardano_transactions_signing_config = if allowed_discriminants
388+
.contains(&SignedEntityTypeDiscriminants::CardanoTransactions)
389+
{
390+
let cardano_transactions_signing_config =
391+
self.cardano_transactions_signing_config().with_context(
392+
|| "Configuration `cardano_transactions_signing_config` is mandatory for a Leader Aggregator when `CardanoTransactions` is enabled in `signed_entity_types`"
393+
)?;
394+
Some(cardano_transactions_signing_config)
395+
} else {
396+
None
397+
};
398+
385399
Ok(AggregatorEpochSettings {
386400
protocol_parameters: self.protocol_parameters().with_context(
387401
|| "Configuration `protocol_parameters` is mandatory for a Leader Aggregator",
388402
)?,
389-
cardano_transactions_signing_config: self
390-
.cardano_transactions_signing_config()
391-
.with_context(
392-
|| "Configuration `cardano_transactions_signing_config` is mandatory for a Leader Aggregator",
393-
)?,
403+
cardano_transactions_signing_config,
394404
})
395405
}
396406

@@ -1152,6 +1162,7 @@ impl Source for DefaultConfiguration {
11521162
#[cfg(test)]
11531163
mod test {
11541164
use mithril_common::temp_dir;
1165+
use mithril_common::test::double::fake_data;
11551166

11561167
use super::*;
11571168

@@ -1315,6 +1326,80 @@ mod test {
13151326
assert!(!config.is_follower_aggregator());
13161327
}
13171328

1329+
mod get_leader_aggregator_epoch_settings_configuration {
1330+
use super::*;
1331+
1332+
#[test]
1333+
fn succeed_when_cardano_transactions_is_disabled_and_cardano_transactions_signing_config_is_not_set()
1334+
{
1335+
let epoch_settings = ServeCommandConfiguration {
1336+
signed_entity_types: None,
1337+
cardano_transactions_signing_config: None,
1338+
protocol_parameters: Some(ProtocolParameters::new(1, 2, 3.1)),
1339+
..ServeCommandConfiguration::new_sample(temp_dir!())
1340+
}
1341+
.get_leader_aggregator_epoch_settings_configuration()
1342+
.unwrap();
1343+
1344+
assert_eq!(
1345+
AggregatorEpochSettings {
1346+
protocol_parameters: ProtocolParameters::new(1, 2, 3.1),
1347+
cardano_transactions_signing_config: None
1348+
},
1349+
epoch_settings
1350+
);
1351+
}
1352+
1353+
#[test]
1354+
fn succeed_when_cardano_transactions_is_enabled_and_cardano_transactions_signing_config_is_set()
1355+
{
1356+
let epoch_settings = ServeCommandConfiguration {
1357+
signed_entity_types: Some(
1358+
SignedEntityTypeDiscriminants::CardanoTransactions.to_string(),
1359+
),
1360+
cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
1361+
security_parameter: BlockNumber(10),
1362+
step: BlockNumber(30),
1363+
}),
1364+
protocol_parameters: Some(ProtocolParameters::new(2, 3, 4.1)),
1365+
..ServeCommandConfiguration::new_sample(temp_dir!())
1366+
}
1367+
.get_leader_aggregator_epoch_settings_configuration()
1368+
.unwrap();
1369+
1370+
assert_eq!(
1371+
AggregatorEpochSettings {
1372+
protocol_parameters: ProtocolParameters::new(2, 3, 4.1),
1373+
cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
1374+
security_parameter: BlockNumber(10),
1375+
step: BlockNumber(30),
1376+
},)
1377+
},
1378+
epoch_settings
1379+
);
1380+
}
1381+
1382+
#[test]
1383+
fn fails_when_cardano_transactions_is_enabled_without_associated_config() {
1384+
let error = ServeCommandConfiguration {
1385+
cardano_transactions_signing_config: None,
1386+
signed_entity_types: Some(
1387+
SignedEntityTypeDiscriminants::CardanoTransactions.to_string(),
1388+
),
1389+
protocol_parameters: Some(fake_data::protocol_parameters()),
1390+
..ServeCommandConfiguration::new_sample(temp_dir!())
1391+
}
1392+
.get_leader_aggregator_epoch_settings_configuration()
1393+
.unwrap_err();
1394+
1395+
assert!(
1396+
error
1397+
.to_string()
1398+
.contains("Configuration `cardano_transactions_signing_config` is mandatory")
1399+
);
1400+
}
1401+
}
1402+
13181403
#[test]
13191404
fn serialized_ancillary_files_signer_config_use_snake_case_for_keys_and_kebab_case_for_type_value()
13201405
{

mithril-aggregator/src/database/migration.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,5 +251,30 @@ alter table signed_entity add column epoch as (coalesce(json_extract(beacon, '$.
251251
create index signed_entity_epoch on signed_entity(epoch);
252252
"#,
253253
),
254+
// Migration 37
255+
// Update `epoch_setting` table to make `cardano_transactions_signing_config` optional.
256+
SqlMigration::new(
257+
37,
258+
r#"
259+
-- disable foreign keys since `signer_registration` has a foreign key constraint on `epoch_setting`
260+
pragma foreign_keys=false;
261+
262+
create table if not exists new_epoch_setting (
263+
epoch_setting_id integer not null,
264+
protocol_parameters json not null,
265+
cardano_transactions_signing_config json,
266+
primary key (epoch_setting_id)
267+
);
268+
insert into new_epoch_setting (epoch_setting_id, protocol_parameters, cardano_transactions_signing_config)
269+
select epoch_setting_id, protocol_parameters, cardano_transactions_signing_config
270+
from epoch_setting order by rowid asc;
271+
drop table epoch_setting;
272+
alter table new_epoch_setting rename to epoch_setting;
273+
274+
-- reenable foreign keys
275+
pragma foreign_key_check;
276+
pragma foreign_keys=true;
277+
"#,
278+
),
254279
]
255280
}

mithril-aggregator/src/database/query/epoch_settings/get_epoch_settings.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,10 @@ mod tests {
6969
);
7070

7171
assert_eq!(
72-
CardanoTransactionsSigningConfig {
72+
Some(CardanoTransactionsSigningConfig {
7373
security_parameter: BlockNumber(10),
7474
step: BlockNumber(15)
75-
},
75+
}),
7676
epoch_settings_record.cardano_transactions_signing_config
7777
);
7878

@@ -86,10 +86,10 @@ mod tests {
8686
epoch_settings_record.protocol_parameters
8787
);
8888
assert_eq!(
89-
CardanoTransactionsSigningConfig {
89+
Some(CardanoTransactionsSigningConfig {
9090
security_parameter: BlockNumber(30),
9191
step: BlockNumber(15),
92-
},
92+
}),
9393
epoch_settings_record.cardano_transactions_signing_config
9494
);
9595

mithril-aggregator/src/database/query/epoch_settings/insert_or_ignore_epoch_settings.rs

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ impl InsertOrIgnoreEpochSettingsQuery {
1919
Value::String(
2020
serde_json::to_string(&epoch_settings.protocol_parameters).unwrap(),
2121
),
22-
Value::String(
23-
serde_json::to_string(&epoch_settings.cardano_transactions_signing_config)
24-
.unwrap(),
25-
),
22+
match &epoch_settings.cardano_transactions_signing_config {
23+
Some(config) => Value::String(serde_json::to_string(config).unwrap()),
24+
None => Value::Null,
25+
},
2626
],
2727
),
2828
}
@@ -64,10 +64,10 @@ mod tests {
6464
let expected_epoch_settings = EpochSettingsRecord {
6565
epoch_settings_id: Epoch(3),
6666
protocol_parameters: fake_data::protocol_parameters(),
67-
cardano_transactions_signing_config: CardanoTransactionsSigningConfig {
67+
cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
6868
security_parameter: BlockNumber(24),
6969
step: BlockNumber(62),
70-
},
70+
}),
7171
};
7272
let record = connection
7373
.fetch_first(InsertOrIgnoreEpochSettingsQuery::one(
@@ -76,6 +76,19 @@ mod tests {
7676
.unwrap();
7777

7878
assert_eq!(Some(expected_epoch_settings), record);
79+
80+
let expected_epoch_settings_without_ctx_config = EpochSettingsRecord {
81+
epoch_settings_id: Epoch(4),
82+
protocol_parameters: fake_data::protocol_parameters(),
83+
cardano_transactions_signing_config: None,
84+
};
85+
let record = connection
86+
.fetch_first(InsertOrIgnoreEpochSettingsQuery::one(
87+
expected_epoch_settings_without_ctx_config.clone(),
88+
))
89+
.unwrap();
90+
91+
assert_eq!(Some(expected_epoch_settings_without_ctx_config), record);
7992
}
8093

8194
#[test]
@@ -85,10 +98,10 @@ mod tests {
8598
let expected_epoch_settings = EpochSettingsRecord {
8699
epoch_settings_id: Epoch(3),
87100
protocol_parameters: fake_data::protocol_parameters(),
88-
cardano_transactions_signing_config: CardanoTransactionsSigningConfig {
101+
cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
89102
security_parameter: BlockNumber(24),
90103
step: BlockNumber(62),
91-
},
104+
}),
92105
};
93106
let record = connection
94107
.fetch_first(InsertOrIgnoreEpochSettingsQuery::one(
@@ -99,10 +112,10 @@ mod tests {
99112

100113
let record = connection
101114
.fetch_first(InsertOrIgnoreEpochSettingsQuery::one(EpochSettingsRecord {
102-
cardano_transactions_signing_config: CardanoTransactionsSigningConfig {
115+
cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
103116
security_parameter: BlockNumber(134),
104117
step: BlockNumber(872),
105-
},
118+
}),
106119
..expected_epoch_settings.clone()
107120
}))
108121
.unwrap();

mithril-aggregator/src/database/record/epoch_settings.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ pub struct EpochSettingsRecord {
1313
pub protocol_parameters: ProtocolParameters,
1414

1515
/// Cardano transactions signing configuration.
16-
pub cardano_transactions_signing_config: CardanoTransactionsSigningConfig,
16+
pub cardano_transactions_signing_config: Option<CardanoTransactionsSigningConfig>,
1717
}
1818

1919
impl From<EpochSettingsRecord> for AggregatorEpochSettings {
@@ -32,7 +32,7 @@ impl SqLiteEntity for EpochSettingsRecord {
3232
{
3333
let epoch_settings_id_int = row.read::<i64, _>(0);
3434
let protocol_parameters_string = &row.read::<&str, _>(1);
35-
let cardano_transactions_signing_config_string = &row.read::<&str, _>(2);
35+
let cardano_transactions_signing_config_string = &row.read::<Option<&str>, _>(2);
3636

3737
let epoch_settings_record = Self {
3838
epoch_settings_id: Epoch(epoch_settings_id_int.try_into().map_err(|e| {
@@ -47,13 +47,13 @@ impl SqLiteEntity for EpochSettingsRecord {
4747
))
4848
},
4949
)?,
50-
cardano_transactions_signing_config: serde_json::from_str(cardano_transactions_signing_config_string).map_err(
50+
cardano_transactions_signing_config: cardano_transactions_signing_config_string.map(|config| serde_json::from_str(config).map_err(
5151
|e| {
5252
HydrationError::InvalidData(format!(
53-
"Could not turn string '{cardano_transactions_signing_config_string}' to CardanoTransactionsSigningConfig. Error: {e}"
53+
"Could not turn string '{config}' to CardanoTransactionsSigningConfig. Error: {e}"
5454
))
5555
},
56-
)?,
56+
)).transpose()?,
5757

5858
};
5959

0 commit comments

Comments
 (0)