Skip to content

Commit 39da965

Browse files
committed
feature(aggregator): implement export protocol configurations command
1 parent 0271a0e commit 39da965

2 files changed

Lines changed: 176 additions & 11 deletions

File tree

mithril-aggregator/src/commands/protocol_configuration_command.rs

Lines changed: 172 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use config::{ConfigBuilder, Map, Value, builder::DefaultState};
44
use serde::{Deserialize, Serialize};
55
use slog::{Logger, debug};
66
use std::{
7-
collections::{BTreeSet, HashMap},
7+
collections::{BTreeMap, BTreeSet, HashMap},
88
fs::{self, File},
99
io::Write,
1010
path::PathBuf,
@@ -14,19 +14,23 @@ use thiserror::Error;
1414

1515
use mithril_cardano_node_chain::chain_observer::ChainObserverType;
1616
use mithril_cli_helper::serde_deserialization;
17-
use mithril_common::entities::{
18-
CardanoBlocksTransactionsSigningConfig, CardanoTransactionsSigningConfig, Epoch,
19-
HexEncodedProtocolConfigurationMarkersSecretKey, ProtocolParameters,
20-
SignedEntityTypeDiscriminants::{self, CardanoBlocksTransactions},
21-
};
22-
use mithril_common::{StdResult, messages::SignedEntityTypeDiscriminantsMessage};
2317
use mithril_common::{
18+
StdResult,
2419
crypto_helper::{
2520
ProtocolConfigurationMarkersSigner, ProtocolConfigurationMarkersVerifierSecretKey,
2621
},
27-
entities::SignedEntityTypeDiscriminants::CardanoTransactions,
22+
entities::{
23+
BlockNumber, BlockNumberOffset, CardanoBlocksTransactionsSigningConfig,
24+
CardanoTransactionsSigningConfig, Epoch, HexEncodedProtocolConfigurationMarkersSecretKey,
25+
ProtocolParameters,
26+
SignedEntityTypeDiscriminants::{self, CardanoBlocksTransactions, CardanoTransactions},
27+
},
28+
messages::SignedEntityTypeDiscriminantsMessage,
2829
};
2930
use mithril_doc::{Documenter, StructDoc};
31+
use mithril_protocol_config::model::{
32+
ConfigurationComputerFromMarkers, ProtocolConfigurationForEpoch,
33+
};
3034

3135
use crate::{
3236
ConfigurationSource, ExecutionEnvironment,
@@ -86,7 +90,7 @@ impl ConfigurationSource for ProtocolConfigurationParametersConfiguration {
8690
}
8791
}
8892

89-
#[derive(Serialize, Deserialize, Clone)]
93+
#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)]
9094
pub struct HumanReadableProtocolConfiguration {
9195
pub epoch: Epoch,
9296
pub protocol_parameters: ProtocolParameters,
@@ -177,6 +181,50 @@ impl ExportProtocolConfigurationSubCommand {
177181
root_logger: Logger,
178182
config_builder: ConfigBuilder<DefaultState>,
179183
) -> StdResult<()> {
184+
// 0 conf & dependencies
185+
let config: ProtocolConfigurationParametersConfiguration = config_builder
186+
.build()
187+
.with_context(|| "configuration build error")?
188+
.try_deserialize()
189+
.with_context(|| "configuration deserialize error")?;
190+
debug!(root_logger, "EXPORT PROTOCOL CONFIGURATION command"; "config" => format!("{config:?}"));
191+
192+
let mut dependencies_builder =
193+
DependenciesBuilder::new(root_logger.clone(), Arc::new(config.clone()));
194+
195+
let dependencies = dependencies_builder
196+
.create_protocol_configuration_container()
197+
.await
198+
.with_context(
199+
|| "Dependencies Builder can not create protocol configuration command dependencies container",
200+
)?;
201+
202+
let tools = ProtocolConfigurationTools::from_dependencies(dependencies)
203+
.await
204+
.with_context(|| "protocol-configuration-tools: initialization error")?;
205+
206+
//1: Retrieve markers from chain or fallback to default configuration
207+
let on_chain_configurations = tools.get_on_chain_configurations();
208+
let protocol_configurations_markers = if on_chain_configurations.markers.is_empty() {
209+
get_default_protocol_configurations()
210+
} else {
211+
on_chain_configurations
212+
};
213+
214+
//2: transform to human readable
215+
let protocol_configurations =
216+
to_vec_human_readable_protocol_configuration(protocol_configurations_markers);
217+
218+
//3: write human readable configurations file
219+
println!("Generating JSON protocol configurations output file...");
220+
let json_protocol_configurations = serde_json::to_string(&protocol_configurations)?;
221+
let mut target_file = File::create(&self.target_path)?;
222+
target_file.write_all(json_protocol_configurations.as_bytes())?;
223+
224+
println!(
225+
"Sucessfuly write JSON protocol configurations file at {}",
226+
&self.target_path.to_string_lossy()
227+
);
180228
Ok(())
181229
}
182230

@@ -185,6 +233,30 @@ impl ExportProtocolConfigurationSubCommand {
185233
}
186234
}
187235

236+
pub fn get_default_protocol_configurations() -> ConfigurationComputerFromMarkers {
237+
ConfigurationComputerFromMarkers {
238+
markers: BTreeMap::from([(
239+
Epoch(42),
240+
ProtocolConfigurationForEpoch {
241+
protocol_parameters: ProtocolParameters {
242+
k: 1,
243+
m: 2,
244+
phi_f: 0.3,
245+
},
246+
enabled_signed_entity_types: SignedEntityTypeDiscriminants::all(),
247+
cardano_transactions: Some(CardanoTransactionsSigningConfig {
248+
security_parameter: BlockNumberOffset(10),
249+
step: BlockNumber(11),
250+
}),
251+
cardano_blocks_transactions: Some(CardanoBlocksTransactionsSigningConfig {
252+
security_parameter: BlockNumberOffset(20),
253+
step: BlockNumber(22),
254+
}),
255+
},
256+
)]),
257+
}
258+
}
259+
188260
/// Protocol configuration import command
189261
#[derive(Parser, Debug, Clone)]
190262
pub struct ImportProtocolConfigurationSubCommand {
@@ -213,7 +285,7 @@ impl ImportProtocolConfigurationSubCommand {
213285
.with_context(|| "configuration build error")?
214286
.try_deserialize()
215287
.with_context(|| "configuration deserialize error")?;
216-
debug!(root_logger, "EXPORT PROTOCOL CONFIGURATION command"; "config" => format!("{config:?}"));
288+
debug!(root_logger, "IMPORT PROTOCOL CONFIGURATION command"; "config" => format!("{config:?}"));
217289

218290
let mut dependencies_builder =
219291
DependenciesBuilder::new(root_logger.clone(), Arc::new(config.clone()));
@@ -333,9 +405,43 @@ impl ImportProtocolConfigurationSubCommand {
333405
}
334406
}
335407

408+
fn to_human_readable_protocol_configuration(
409+
epoch: Epoch,
410+
config: ProtocolConfigurationForEpoch,
411+
) -> HumanReadableProtocolConfiguration {
412+
HumanReadableProtocolConfiguration {
413+
epoch,
414+
protocol_parameters: config.protocol_parameters,
415+
enabled_signed_entity_types: config
416+
.enabled_signed_entity_types
417+
.into_iter()
418+
.map(Into::into)
419+
.collect(),
420+
cardano_transaction_signing_config: config.cardano_transactions,
421+
cardano_blocks_transactions_signing_config: config.cardano_blocks_transactions,
422+
}
423+
}
424+
425+
pub fn to_vec_human_readable_protocol_configuration(
426+
configs: ConfigurationComputerFromMarkers,
427+
) -> Vec<HumanReadableProtocolConfiguration> {
428+
let mut human_readable_protocol_configurations = Vec::new();
429+
for (epoch, config) in configs.markers {
430+
human_readable_protocol_configurations
431+
.push(to_human_readable_protocol_configuration(epoch, config));
432+
}
433+
human_readable_protocol_configurations
434+
}
435+
336436
#[cfg(test)]
337437
mod tests {
338-
use mithril_common::{entities::ProtocolParameters, test::double::Dummy};
438+
use mithril_common::{
439+
entities::{
440+
BlockNumber, BlockNumberOffset, ProtocolParameters,
441+
SignedEntityTypeDiscriminants::{CardanoDatabase, MithrilStakeDistribution},
442+
},
443+
test::double::Dummy,
444+
};
339445

340446
use super::*;
341447

@@ -423,4 +529,59 @@ mod tests {
423529
])
424530
.expect("CLI parse should succeed");
425531
}
532+
533+
#[test]
534+
fn test_to_vec_human_readable_protocol_configuration() {
535+
let configuration = ProtocolConfigurationForEpoch {
536+
protocol_parameters: ProtocolParameters {
537+
k: 9,
538+
m: 77,
539+
phi_f: 0.5,
540+
},
541+
enabled_signed_entity_types: BTreeSet::from_iter(vec![
542+
SignedEntityTypeDiscriminants::MithrilStakeDistribution,
543+
SignedEntityTypeDiscriminants::CardanoDatabase,
544+
SignedEntityTypeDiscriminants::CardanoTransactions,
545+
]),
546+
cardano_transactions: Some(CardanoTransactionsSigningConfig {
547+
security_parameter: BlockNumberOffset(100),
548+
step: BlockNumber(10),
549+
}),
550+
cardano_blocks_transactions: Some(CardanoBlocksTransactionsSigningConfig {
551+
security_parameter: BlockNumberOffset(150),
552+
step: BlockNumber(20),
553+
}),
554+
};
555+
let configurations =
556+
ConfigurationComputerFromMarkers::new(BTreeMap::from([(Epoch(42), configuration)]));
557+
558+
let expected_human_readable_configurations = vec![HumanReadableProtocolConfiguration {
559+
epoch: Epoch(42),
560+
protocol_parameters: ProtocolParameters {
561+
k: 9,
562+
m: 77,
563+
phi_f: 0.5,
564+
},
565+
enabled_signed_entity_types: BTreeSet::from_iter(vec![
566+
SignedEntityTypeDiscriminantsMessage::Known(MithrilStakeDistribution),
567+
SignedEntityTypeDiscriminantsMessage::Known(CardanoDatabase),
568+
SignedEntityTypeDiscriminantsMessage::Known(CardanoTransactions),
569+
]),
570+
cardano_transaction_signing_config: Some(CardanoTransactionsSigningConfig {
571+
security_parameter: BlockNumberOffset(100),
572+
step: BlockNumber(10),
573+
}),
574+
cardano_blocks_transactions_signing_config: Some(
575+
CardanoBlocksTransactionsSigningConfig {
576+
security_parameter: BlockNumberOffset(150),
577+
step: BlockNumber(20),
578+
},
579+
),
580+
}];
581+
582+
assert_eq!(
583+
to_vec_human_readable_protocol_configuration(configurations),
584+
expected_human_readable_configurations
585+
);
586+
}
426587
}

mithril-aggregator/src/tools/protocol_configuration.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ impl ProtocolConfigurationTools {
7878
Ok(Self::new(configuration, dependencies.logger))
7979
}
8080

81+
pub fn get_on_chain_configurations(self) -> ConfigurationComputerFromMarkers {
82+
self.configuration.on_chain_configurations
83+
}
84+
8185
/// Verify if configuration to import share same windows as on chain configuration for current epoch
8286
pub fn verify_configurations_against_chain(
8387
&self,

0 commit comments

Comments
 (0)