1use serde::{Deserialize, Serialize};
2
3use crate::entities::{CardanoTransactionsSigningConfig, Epoch, ProtocolParameters};
4use crate::messages::SignerMessagePart;
5
6#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
8pub struct EpochSettingsMessage {
9 pub epoch: Epoch,
11
12 #[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 pub current_signers: Vec<SignerMessagePart>,
25
26 pub next_signers: Vec<SignerMessagePart>,
28
29 #[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}