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    #[deprecated(
13        since = "0.6.27",
14        note = "Will be removed soon. use `mithril-protocol-config` crate instead."
15    )]
16    #[serde(
17        rename = "signer_registration_protocol",
18        skip_serializing_if = "Option::is_none"
19    )]
20    pub signer_registration_protocol_parameters: Option<ProtocolParameters>,
21
22    /// Current Signers
23    pub current_signers: Vec<SignerMessagePart>,
24
25    /// Signers that will be able to sign on the next epoch
26    pub next_signers: Vec<SignerMessagePart>,
27
28    /// Cardano transactions signing configuration for the current epoch
29    #[deprecated(
30        since = "0.6.27",
31        note = "Will be removed soon. use `mithril-protocol-config` crate instead."
32    )]
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub cardano_transactions_signing_config: Option<CardanoTransactionsSigningConfig>,
35}
36
37#[cfg(test)]
38mod tests {
39    use crate::entities::BlockNumber;
40
41    use super::*;
42
43    const CURRENT_JSON: &str = r#"{
44        "epoch": 10,
45        "signer_registration_protocol":  { "k": 500, "m": 10000, "phi_f": 0.65 },
46        "current_signers":[{
47            "party_id":"123",
48            "verification_key":"key_123",
49            "verification_key_signature":"signature_123",
50            "operational_certificate":"certificate_123",
51            "kes_period":12
52        }],
53        "next_signers": [{
54            "party_id":"456",
55            "verification_key":"key_456",
56            "verification_key_signature":"signature_456",
57            "operational_certificate":"certificate_456",
58            "kes_period":45
59        }],
60        "cardano_transactions_signing_config": {
61            "security_parameter": 70,
62            "step": 20
63        }
64    }"#;
65
66    #[derive(Debug, Serialize, Deserialize, PartialEq)]
67    struct EpochSettingsMessageUntilV0_1_51 {
68        pub epoch: Epoch,
69        #[serde(rename = "signer_registration_protocol")]
70        pub signer_registration_protocol_parameters: ProtocolParameters,
71        pub current_signers: Vec<SignerMessagePart>,
72        pub next_signers: Vec<SignerMessagePart>,
73        #[serde(skip_serializing_if = "Option::is_none")]
74        pub cardano_transactions_signing_config: Option<CardanoTransactionsSigningConfig>,
75        #[serde(skip_serializing_if = "Option::is_none")]
76        pub next_cardano_transactions_signing_config: Option<CardanoTransactionsSigningConfig>,
77    }
78
79    #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
80    pub struct EpochSettingsMessageUntilV0_1_55 {
81        pub epoch: Epoch,
82        #[serde(rename = "signer_registration_protocol")]
83        pub signer_registration_protocol_parameters: ProtocolParameters,
84        pub current_signers: Vec<SignerMessagePart>,
85        pub next_signers: Vec<SignerMessagePart>,
86        #[serde(skip_serializing_if = "Option::is_none")]
87        pub cardano_transactions_signing_config: Option<CardanoTransactionsSigningConfig>,
88    }
89
90    fn golden_message_until_open_api_0_1_51() -> EpochSettingsMessageUntilV0_1_51 {
91        EpochSettingsMessageUntilV0_1_51 {
92            epoch: Epoch(10),
93            signer_registration_protocol_parameters: ProtocolParameters {
94                k: 500,
95                m: 10000,
96                phi_f: 0.65,
97            },
98            current_signers: vec![SignerMessagePart {
99                party_id: "123".to_string(),
100                verification_key: "key_123".to_string(),
101                verification_key_signature: Some("signature_123".to_string()),
102                operational_certificate: Some("certificate_123".to_string()),
103                kes_period: Some(12),
104            }],
105            next_signers: vec![SignerMessagePart {
106                party_id: "456".to_string(),
107                verification_key: "key_456".to_string(),
108                verification_key_signature: Some("signature_456".to_string()),
109                operational_certificate: Some("certificate_456".to_string()),
110                kes_period: Some(45),
111            }],
112            cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
113                security_parameter: BlockNumber(70),
114                step: BlockNumber(20),
115            }),
116            next_cardano_transactions_signing_config: None,
117        }
118    }
119
120    fn golden_message_until_open_api_0_1_55() -> EpochSettingsMessageUntilV0_1_55 {
121        EpochSettingsMessageUntilV0_1_55 {
122            epoch: Epoch(10),
123            signer_registration_protocol_parameters: ProtocolParameters {
124                k: 500,
125                m: 10000,
126                phi_f: 0.65,
127            },
128            current_signers: vec![SignerMessagePart {
129                party_id: "123".to_string(),
130                verification_key: "key_123".to_string(),
131                verification_key_signature: Some("signature_123".to_string()),
132                operational_certificate: Some("certificate_123".to_string()),
133                kes_period: Some(12),
134            }],
135            next_signers: vec![SignerMessagePart {
136                party_id: "456".to_string(),
137                verification_key: "key_456".to_string(),
138                verification_key_signature: Some("signature_456".to_string()),
139                operational_certificate: Some("certificate_456".to_string()),
140                kes_period: Some(45),
141            }],
142            cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
143                security_parameter: BlockNumber(70),
144                step: BlockNumber(20),
145            }),
146        }
147    }
148
149    fn golden_current_message() -> EpochSettingsMessage {
150        #[allow(deprecated)]
151        EpochSettingsMessage {
152            epoch: Epoch(10),
153            signer_registration_protocol_parameters: Some(ProtocolParameters {
154                k: 500,
155                m: 10000,
156                phi_f: 0.65,
157            }),
158            current_signers: vec![SignerMessagePart {
159                party_id: "123".to_string(),
160                verification_key: "key_123".to_string(),
161                verification_key_signature: Some("signature_123".to_string()),
162                operational_certificate: Some("certificate_123".to_string()),
163                kes_period: Some(12),
164            }],
165            next_signers: vec![SignerMessagePart {
166                party_id: "456".to_string(),
167                verification_key: "key_456".to_string(),
168                verification_key_signature: Some("signature_456".to_string()),
169                operational_certificate: Some("certificate_456".to_string()),
170                kes_period: Some(45),
171            }],
172            cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
173                security_parameter: BlockNumber(70),
174                step: BlockNumber(20),
175            }),
176        }
177    }
178
179    #[test]
180    fn test_current_json_deserialized_into_message_supported_until_open_api_0_1_51() {
181        let json = CURRENT_JSON;
182        let message: EpochSettingsMessageUntilV0_1_51 = serde_json::from_str(json).unwrap();
183
184        assert_eq!(golden_message_until_open_api_0_1_51(), message);
185    }
186
187    #[test]
188    fn test_current_json_deserialized_into_message_supported_until_open_api_0_1_55() {
189        let json = CURRENT_JSON;
190        let message: EpochSettingsMessageUntilV0_1_55 = serde_json::from_str(json).unwrap();
191
192        assert_eq!(golden_message_until_open_api_0_1_55(), message);
193    }
194
195    #[test]
196    fn test_current_json_deserialized_into_current_message() {
197        let json = CURRENT_JSON;
198        let message: EpochSettingsMessage = serde_json::from_str(json).expect(
199            "This JSON is expected to be successfully parsed into a EpochSettingsMessage instance.",
200        );
201
202        assert_eq!(golden_current_message(), message);
203    }
204}