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_for_concatenation: "key_123".to_string(),
102                verification_key_signature_for_concatenation: Some("signature_123".to_string()),
103                operational_certificate: Some("certificate_123".to_string()),
104                kes_evolutions: Some(KesEvolutions(12)),
105                #[cfg(feature = "future_snark")]
106                verification_key_for_snark: None,
107                #[cfg(feature = "future_snark")]
108                verification_key_signature_for_snark: None,
109            }],
110            next_signers: vec![SignerMessagePart {
111                party_id: "456".to_string(),
112                verification_key_for_concatenation: "key_456".to_string(),
113                verification_key_signature_for_concatenation: Some("signature_456".to_string()),
114                operational_certificate: Some("certificate_456".to_string()),
115                kes_evolutions: Some(KesEvolutions(45)),
116                #[cfg(feature = "future_snark")]
117                verification_key_for_snark: None,
118                #[cfg(feature = "future_snark")]
119                verification_key_signature_for_snark: None,
120            }],
121            cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
122                security_parameter: BlockNumber(70),
123                step: BlockNumber(20),
124            }),
125            next_cardano_transactions_signing_config: None,
126        }
127    }
128
129    fn golden_message_until_open_api_0_1_55() -> EpochSettingsMessageUntilV0_1_55 {
130        EpochSettingsMessageUntilV0_1_55 {
131            epoch: Epoch(10),
132            signer_registration_protocol_parameters: ProtocolParameters {
133                k: 500,
134                m: 10000,
135                phi_f: 0.65,
136            },
137            current_signers: vec![SignerMessagePart {
138                party_id: "123".to_string(),
139                verification_key_for_concatenation: "key_123".to_string(),
140                verification_key_signature_for_concatenation: Some("signature_123".to_string()),
141                operational_certificate: Some("certificate_123".to_string()),
142                kes_evolutions: Some(KesEvolutions(12)),
143                #[cfg(feature = "future_snark")]
144                verification_key_for_snark: None,
145                #[cfg(feature = "future_snark")]
146                verification_key_signature_for_snark: None,
147            }],
148            next_signers: vec![SignerMessagePart {
149                party_id: "456".to_string(),
150                verification_key_for_concatenation: "key_456".to_string(),
151                verification_key_signature_for_concatenation: Some("signature_456".to_string()),
152                operational_certificate: Some("certificate_456".to_string()),
153                kes_evolutions: Some(KesEvolutions(45)),
154                #[cfg(feature = "future_snark")]
155                verification_key_for_snark: None,
156                #[cfg(feature = "future_snark")]
157                verification_key_signature_for_snark: None,
158            }],
159            cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
160                security_parameter: BlockNumber(70),
161                step: BlockNumber(20),
162            }),
163        }
164    }
165
166    fn golden_current_message() -> EpochSettingsMessage {
167        #[allow(deprecated)]
168        EpochSettingsMessage {
169            epoch: Epoch(10),
170            signer_registration_protocol_parameters: Some(ProtocolParameters {
171                k: 500,
172                m: 10000,
173                phi_f: 0.65,
174            }),
175            current_signers: vec![SignerMessagePart {
176                party_id: "123".to_string(),
177                verification_key_for_concatenation: "key_123".to_string(),
178                verification_key_signature_for_concatenation: Some("signature_123".to_string()),
179                operational_certificate: Some("certificate_123".to_string()),
180                kes_evolutions: Some(KesEvolutions(12)),
181                #[cfg(feature = "future_snark")]
182                verification_key_for_snark: None,
183                #[cfg(feature = "future_snark")]
184                verification_key_signature_for_snark: None,
185            }],
186            next_signers: vec![SignerMessagePart {
187                party_id: "456".to_string(),
188                verification_key_for_concatenation: "key_456".to_string(),
189                verification_key_signature_for_concatenation: Some("signature_456".to_string()),
190                operational_certificate: Some("certificate_456".to_string()),
191                kes_evolutions: Some(KesEvolutions(45)),
192                #[cfg(feature = "future_snark")]
193                verification_key_for_snark: None,
194                #[cfg(feature = "future_snark")]
195                verification_key_signature_for_snark: None,
196            }],
197            cardano_transactions_signing_config: Some(CardanoTransactionsSigningConfig {
198                security_parameter: BlockNumber(70),
199                step: BlockNumber(20),
200            }),
201        }
202    }
203
204    #[test]
205    fn test_current_json_deserialized_into_message_supported_until_open_api_0_1_51() {
206        let json = CURRENT_JSON;
207        let message: EpochSettingsMessageUntilV0_1_51 = serde_json::from_str(json).unwrap();
208
209        assert_eq!(golden_message_until_open_api_0_1_51(), message);
210    }
211
212    #[test]
213    fn test_current_json_deserialized_into_message_supported_until_open_api_0_1_55() {
214        let json = CURRENT_JSON;
215        let message: EpochSettingsMessageUntilV0_1_55 = serde_json::from_str(json).unwrap();
216
217        assert_eq!(golden_message_until_open_api_0_1_55(), message);
218    }
219
220    #[test]
221    fn test_current_json_deserialized_into_current_message() {
222        let json = CURRENT_JSON;
223        let message: EpochSettingsMessage = serde_json::from_str(json).expect(
224            "This JSON is expected to be successfully parsed into a EpochSettingsMessage instance.",
225        );
226
227        assert_eq!(golden_current_message(), message);
228    }
229}