mithril_common/messages/
epoch_settings.rs

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