mithril_common/messages/
epoch_settings.rs

1use crate::entities::{CardanoTransactionsSigningConfig, Epoch, ProtocolParameters};
2use crate::messages::SignerMessagePart;
3use serde::{Deserialize, Serialize};
4
5/// EpochSettings represents the settings of an epoch
6#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
7pub struct EpochSettingsMessage {
8    /// Current Epoch
9    pub epoch: Epoch,
10
11    /// Signer Registration Protocol parameters
12    #[serde(rename = "signer_registration_protocol")]
13    pub signer_registration_protocol_parameters: ProtocolParameters,
14
15    /// Current Signers
16    pub current_signers: Vec<SignerMessagePart>,
17
18    /// Signers that will be able to sign on the next epoch
19    pub next_signers: Vec<SignerMessagePart>,
20
21    /// Cardano transactions signing configuration for the current epoch
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub cardano_transactions_signing_config: Option<CardanoTransactionsSigningConfig>,
24
25    /// Cardano transactions signing configuration for the next epoch
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub next_cardano_transactions_signing_config: Option<CardanoTransactionsSigningConfig>,
28}
29
30impl EpochSettingsMessage {
31    cfg_test_tools! {
32        /// Dummy instance for test purposes.
33        pub fn dummy() -> Self {
34            Self {
35                epoch: Epoch(10),
36                signer_registration_protocol_parameters: ProtocolParameters {
37                    k: 5,
38                    m: 100,
39                    phi_f: 0.65,
40                },
41                current_signers: [SignerMessagePart::dummy()].to_vec(),
42                next_signers: [SignerMessagePart::dummy()].to_vec(),
43                cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig::dummy()),
44                next_cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig::dummy()),
45            }
46        }
47    }
48}
49
50#[cfg(test)]
51mod tests {
52
53    use crate::entities::BlockNumber;
54
55    use super::*;
56
57    const CURRENT_JSON: &str = r#"{
58        "epoch": 10,
59        "signer_registration_protocol":  { "k": 500, "m": 10000, "phi_f": 0.65 },
60        "current_signers":[{
61            "party_id":"123",
62            "verification_key":"key_123",
63            "verification_key_signature":"signature_123",
64            "operational_certificate":"certificate_123",
65            "kes_period":12
66        }],
67        "next_signers": [{
68            "party_id":"456",
69            "verification_key":"key_456",
70            "verification_key_signature":"signature_456",
71            "operational_certificate":"certificate_456",
72            "kes_period":45
73        }],
74        "cardano_transactions_signing_config": {
75            "security_parameter": 70,
76            "step": 20
77        },
78        "next_cardano_transactions_signing_config": {
79            "security_parameter": 50,
80            "step": 10
81        }
82    }"#;
83
84    fn golden_current_message() -> EpochSettingsMessage {
85        EpochSettingsMessage {
86            epoch: Epoch(10),
87            signer_registration_protocol_parameters: ProtocolParameters {
88                k: 500,
89                m: 10000,
90                phi_f: 0.65,
91            },
92            current_signers: vec![SignerMessagePart {
93                party_id: "123".to_string(),
94                verification_key: "key_123".to_string(),
95                verification_key_signature: Some("signature_123".to_string()),
96                operational_certificate: Some("certificate_123".to_string()),
97                kes_period: Some(12),
98            }],
99            next_signers: vec![SignerMessagePart {
100                party_id: "456".to_string(),
101                verification_key: "key_456".to_string(),
102                verification_key_signature: Some("signature_456".to_string()),
103                operational_certificate: Some("certificate_456".to_string()),
104                kes_period: Some(45),
105            }],
106            cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
107                security_parameter: BlockNumber(70),
108                step: BlockNumber(20),
109            }),
110            next_cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
111                security_parameter: BlockNumber(50),
112                step: BlockNumber(10),
113            }),
114        }
115    }
116
117    #[test]
118    fn test_current_json_deserialized_into_current_message() {
119        let json = CURRENT_JSON;
120        let message: EpochSettingsMessage = serde_json::from_str(json).expect(
121            "This JSON is expected to be successfully parsed into a EpochSettingsMessage instance.",
122        );
123
124        assert_eq!(golden_current_message(), message);
125    }
126}