Skip to content

Commit 73af399

Browse files
committed
feature(protocol-config, signer): now retrieving epoch settings from MithrilNetworkConfiguration, adapt inform_epoch_settings signature
1 parent 608bc05 commit 73af399

File tree

12 files changed

+456
-195
lines changed

12 files changed

+456
-195
lines changed

Cargo.lock

Lines changed: 1 addition & 0 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 & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ repository = { workspace = true }
1212
anyhow = { workspace = true }
1313
async-trait = { workspace = true }
1414
mithril-common = { path = "../../mithril-common" }
15+
mithril-ticker = { path = "../mithril-ticker" }
1516
reqwest = { workspace = true, features = [
1617
"default",
1718
"stream",

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

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,75 @@ pub struct MithrilNetworkConfiguration {
2626
pub signed_entity_types_config:
2727
HashMap<SignedEntityTypeDiscriminants, SignedEntityTypeConfiguration>,
2828
}
29+
30+
impl MithrilNetworkConfiguration {
31+
/// Get the Cardano Transactions signing configuration
32+
pub fn get_cardano_transactions_signing_config(
33+
&self,
34+
) -> Option<CardanoTransactionsSigningConfig> {
35+
match self
36+
.signed_entity_types_config
37+
.get(&SignedEntityTypeDiscriminants::CardanoTransactions)
38+
{
39+
Some(SignedEntityTypeConfiguration::CardanoTransactions(config)) => {
40+
Some(config.clone())
41+
}
42+
_ => None,
43+
}
44+
}
45+
}
46+
47+
#[cfg(test)]
48+
mod tests {
49+
use std::collections::HashMap;
50+
51+
use mithril_common::entities::{
52+
BlockNumber, CardanoTransactionsSigningConfig, SignedEntityTypeDiscriminants,
53+
};
54+
55+
use crate::model::{MithrilNetworkConfiguration, SignedEntityTypeConfiguration};
56+
57+
fn default() -> MithrilNetworkConfiguration {
58+
MithrilNetworkConfiguration {
59+
epoch: Default::default(),
60+
signer_registration_protocol_parameters: Default::default(),
61+
available_signed_entity_types: Default::default(),
62+
signed_entity_types_config: Default::default(),
63+
}
64+
}
65+
66+
#[test]
67+
fn test_get_cardano_transactions_signing_config_should_return_config_if_cardano_transactions_exist()
68+
{
69+
let config = MithrilNetworkConfiguration {
70+
signed_entity_types_config: HashMap::from([(
71+
SignedEntityTypeDiscriminants::CardanoTransactions,
72+
SignedEntityTypeConfiguration::CardanoTransactions(
73+
CardanoTransactionsSigningConfig {
74+
security_parameter: BlockNumber(42),
75+
step: BlockNumber(26),
76+
},
77+
),
78+
)]),
79+
..default()
80+
};
81+
82+
let result = config.get_cardano_transactions_signing_config();
83+
assert!(result.is_some());
84+
let unwrapped_result = result.unwrap();
85+
assert_eq!(unwrapped_result.security_parameter, BlockNumber(42));
86+
assert_eq!(unwrapped_result.step, BlockNumber(26));
87+
}
88+
89+
#[test]
90+
fn test_get_cardano_transactions_signing_config_should_return_none_if_there_is_no_cardano_transactions()
91+
{
92+
let config = MithrilNetworkConfiguration {
93+
signed_entity_types_config: HashMap::new(),
94+
..default()
95+
};
96+
97+
let result = config.get_cardano_transactions_signing_config();
98+
assert!(result.is_none());
99+
}
100+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use std::collections::{BTreeSet, HashMap};
2+
3+
use mithril_common::{
4+
entities::{CardanoTransactionsSigningConfig, SignedEntityTypeDiscriminants},
5+
test::double::{Dummy, fake_data},
6+
};
7+
8+
use crate::model::{MithrilNetworkConfiguration, SignedEntityTypeConfiguration};
9+
10+
impl Dummy for MithrilNetworkConfiguration {
11+
/// Return a dummy [MithrilNetworkConfiguration] (test-only).
12+
fn dummy() -> Self {
13+
let beacon = fake_data::beacon();
14+
15+
let signer_registration_protocol_parameters = fake_data::protocol_parameters();
16+
17+
let mut available_signed_entity_types = BTreeSet::new();
18+
available_signed_entity_types.insert(SignedEntityTypeDiscriminants::CardanoTransactions);
19+
20+
let mut signed_entity_types_config = HashMap::new();
21+
signed_entity_types_config.insert(
22+
SignedEntityTypeDiscriminants::CardanoTransactions,
23+
SignedEntityTypeConfiguration::CardanoTransactions(
24+
CardanoTransactionsSigningConfig::dummy(),
25+
),
26+
);
27+
28+
Self {
29+
epoch: beacon.epoch,
30+
signer_registration_protocol_parameters,
31+
available_signed_entity_types,
32+
signed_entity_types_config,
33+
}
34+
}
35+
}
Lines changed: 64 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,84 @@
1-
use crate::{interface::MithrilNetworkConfigurationProvider, model::MithrilNetworkConfiguration};
1+
use std::{
2+
collections::{BTreeSet, HashMap},
3+
sync::Arc,
4+
};
5+
6+
use tokio::sync::RwLock;
7+
8+
use crate::{
9+
interface::MithrilNetworkConfigurationProvider,
10+
model::{MithrilNetworkConfiguration, SignedEntityTypeConfiguration},
11+
};
12+
use anyhow::Error;
213
use async_trait::async_trait;
3-
use mithril_common::StdResult;
14+
use mithril_common::{
15+
StdResult,
16+
entities::{ProtocolParameters, SignedEntityTypeDiscriminants, TimePoint},
17+
};
18+
use mithril_ticker::{MithrilTickerService, TickerService};
419

520
/// A fake [MithrilNetworkConfigurationProvider] that return [MithrilNetworkConfiguration]
621
pub struct FakeMithrilNetworkConfigurationProvider {
7-
configuration: MithrilNetworkConfiguration,
8-
}
22+
pub signer_registration_protocol_parameters: ProtocolParameters,
923

10-
impl FakeMithrilNetworkConfigurationProvider {
11-
/// Create a new [FakeMithrilNetworkConfigurationProvider]
12-
pub fn from_mithril_network_configuration(configuration: MithrilNetworkConfiguration) -> Self {
13-
Self { configuration }
14-
}
24+
pub available_signed_entity_types: RwLock<BTreeSet<SignedEntityTypeDiscriminants>>,
25+
26+
pub signed_entity_types_config:
27+
HashMap<SignedEntityTypeDiscriminants, SignedEntityTypeConfiguration>,
28+
29+
ticker_service: Arc<MithrilTickerService>,
1530
}
1631

17-
impl Default for FakeMithrilNetworkConfigurationProvider {
18-
fn default() -> Self {
32+
impl FakeMithrilNetworkConfigurationProvider {
33+
pub fn new(
34+
signer_registration_protocol_parameters: ProtocolParameters,
35+
available_signed_entity_types: BTreeSet<SignedEntityTypeDiscriminants>,
36+
signed_entity_types_config: HashMap<
37+
SignedEntityTypeDiscriminants,
38+
SignedEntityTypeConfiguration,
39+
>,
40+
ticker_service: Arc<MithrilTickerService>,
41+
) -> Self {
1942
Self {
20-
configuration: MithrilNetworkConfiguration {
21-
epoch: Default::default(),
22-
signer_registration_protocol_parameters: Default::default(),
23-
available_signed_entity_types: Default::default(),
24-
signed_entity_types_config: Default::default(),
25-
},
43+
signer_registration_protocol_parameters,
44+
available_signed_entity_types: RwLock::new(available_signed_entity_types),
45+
signed_entity_types_config,
46+
ticker_service,
2647
}
2748
}
49+
50+
async fn get_time_point(&self) -> Result<TimePoint, Error> {
51+
//TODO improve error handling ?
52+
let time_point = self.ticker_service.get_current_time_point().await?;
53+
54+
Ok(time_point)
55+
}
56+
57+
pub async fn change_allowed_discriminants(
58+
&self,
59+
discriminants: &BTreeSet<SignedEntityTypeDiscriminants>,
60+
) {
61+
//let mut signed_entity_types_config = self.signed_entity_types_config.write().await;
62+
let mut available_signed_entity_types = self.available_signed_entity_types.write().await;
63+
*available_signed_entity_types = discriminants.clone();
64+
}
2865
}
2966

3067
#[cfg_attr(target_family = "wasm", async_trait(?Send))]
3168
#[cfg_attr(not(target_family = "wasm"), async_trait)]
3269
impl MithrilNetworkConfigurationProvider for FakeMithrilNetworkConfigurationProvider {
3370
async fn get(&self) -> StdResult<MithrilNetworkConfiguration> {
34-
Ok(self.configuration.clone())
35-
}
36-
}
37-
38-
#[cfg(test)]
39-
mod tests {
40-
use std::collections::{BTreeSet, HashMap};
41-
42-
use mithril_common::{
43-
StdResult,
44-
entities::{BlockNumber, CardanoTransactionsSigningConfig, SignedEntityTypeDiscriminants},
45-
};
46-
47-
use super::*;
48-
use crate::{model::SignedEntityTypeConfiguration, test::double::fake_data};
49-
50-
#[tokio::test]
51-
async fn fake_mithril_network_configuration_provider_returns_configuration() -> StdResult<()> {
52-
let mut available_signed_entity_types = BTreeSet::new();
53-
available_signed_entity_types.insert(SignedEntityTypeDiscriminants::CardanoTransactions);
54-
55-
let mut signed_entity_types_config = HashMap::new();
56-
signed_entity_types_config.insert(
57-
SignedEntityTypeDiscriminants::CardanoTransactions,
58-
SignedEntityTypeConfiguration::CardanoTransactions(CardanoTransactionsSigningConfig {
59-
security_parameter: BlockNumber(13),
60-
step: BlockNumber(26),
61-
}),
62-
);
63-
64-
let configuration = fake_data::mithril_network_configuration(
65-
42,
66-
1,
67-
2,
68-
0.123,
69-
available_signed_entity_types,
70-
signed_entity_types_config,
71-
);
72-
let provider = FakeMithrilNetworkConfigurationProvider::from_mithril_network_configuration(
73-
configuration.clone(),
74-
);
71+
let time_point = self.get_time_point().await?;
7572

76-
let retrieved_configuration = provider.get().await?;
73+
let available_signed_entity_types = self.available_signed_entity_types.read().await;
7774

78-
assert_eq!(configuration, retrieved_configuration);
79-
Ok(())
75+
Ok(MithrilNetworkConfiguration {
76+
epoch: time_point.epoch,
77+
signer_registration_protocol_parameters: self
78+
.signer_registration_protocol_parameters
79+
.clone(),
80+
available_signed_entity_types: available_signed_entity_types.clone(),
81+
signed_entity_types_config: self.signed_entity_types_config.clone(),
82+
})
8083
}
8184
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1+
mod dummies;
12
mod fake_data;
23
pub mod mithril_network_configuration_provider;

0 commit comments

Comments
 (0)