Skip to content

Commit 0dbfda9

Browse files
committed
Beacon is now optional in CertificatePendingMessage and ensure compatibility between versions
1 parent bc9bb18 commit 0dbfda9

File tree

4 files changed

+197
-48
lines changed

4 files changed

+197
-48
lines changed

mithril-aggregator/src/http_server/routes/certificate_routes.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ fn certificate_pending(
1717
) -> impl Filter<Extract = (impl warp::Reply,), Error = warp::Rejection> + Clone {
1818
warp::path!("certificate-pending")
1919
.and(warp::get())
20-
.and(middlewares::with_config(dependency_manager.clone()))
2120
.and(middlewares::with_certificate_pending_store(
2221
dependency_manager,
2322
))
@@ -46,8 +45,8 @@ fn certificate_certificate_hash(
4645

4746
mod handlers {
4847
use crate::{
49-
http_server::routes::reply, services::MessageService, unwrap_to_internal_server_error,
50-
CertificatePendingStore, Configuration, ToCertificatePendingMessageAdapter,
48+
http_server::routes::reply, services::MessageService, CertificatePendingStore,
49+
ToCertificatePendingMessageAdapter,
5150
};
5251

5352
use slog_scope::{debug, warn};
@@ -59,17 +58,13 @@ mod handlers {
5958

6059
/// Certificate Pending
6160
pub async fn certificate_pending(
62-
config: Configuration,
6361
certificate_pending_store: Arc<CertificatePendingStore>,
6462
) -> Result<impl warp::Reply, Infallible> {
6563
debug!("⇄ HTTP SERVER: certificate_pending");
6664

67-
let network =
68-
unwrap_to_internal_server_error!(config.get_network(), "certificate_pending::error");
69-
7065
match certificate_pending_store.get().await {
7166
Ok(Some(certificate_pending)) => Ok(reply::json(
72-
&ToCertificatePendingMessageAdapter::adapt(certificate_pending, network, 0),
67+
&ToCertificatePendingMessageAdapter::adapt(certificate_pending),
7368
StatusCode::OK,
7469
)),
7570
Ok(None) => Ok(reply::empty(StatusCode::NO_CONTENT)),
@@ -196,7 +191,7 @@ mod tests {
196191
let message: CertificatePendingMessage = serde_json::from_slice(response.body()).unwrap();
197192

198193
#[allow(deprecated)]
199-
let immutable_file_number = message.beacon.immutable_file_number;
194+
let immutable_file_number = message.beacon.unwrap().immutable_file_number;
200195
assert_eq!(0, immutable_file_number);
201196
}
202197

mithril-aggregator/src/message_adapters/to_certificate_pending_message.rs

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,24 @@
1-
use mithril_common::entities::{CardanoDbBeacon, ImmutableFileNumber};
1+
use mithril_common::entities::CardanoDbBeacon;
22
use mithril_common::{
3-
entities::{CertificatePending, Signer},
3+
entities::{CertificatePending, SignedEntityType, Signer},
44
messages::{CertificatePendingMessage, SignerMessagePart},
5-
CardanoNetwork,
65
};
76

87
/// Adapter to turn [CertificatePending] instances into [CertificatePendingMessage].
98
pub struct ToCertificatePendingMessageAdapter;
109

1110
impl ToCertificatePendingMessageAdapter {
1211
/// Method to trigger the conversion
13-
pub fn adapt(
14-
certificate_pending: CertificatePending,
15-
network: CardanoNetwork,
16-
immutable_file_number: ImmutableFileNumber,
17-
) -> CertificatePendingMessage {
18-
let beacon = CardanoDbBeacon::new(
19-
network.to_string(),
20-
*certificate_pending.epoch,
21-
immutable_file_number,
22-
);
12+
pub fn adapt(certificate_pending: CertificatePending) -> CertificatePendingMessage {
13+
let beacon = match &certificate_pending.signed_entity_type {
14+
SignedEntityType::CardanoImmutableFilesFull(beacon) => beacon.clone(),
15+
_ => CardanoDbBeacon::new("", 0, 0),
16+
};
2317

2418
#[allow(deprecated)]
2519
CertificatePendingMessage {
26-
epoch: beacon.epoch,
27-
beacon,
20+
epoch: certificate_pending.epoch,
21+
beacon: Some(beacon),
2822
signed_entity_type: certificate_pending.signed_entity_type,
2923
protocol_parameters: certificate_pending.protocol_parameters,
3024
next_protocol_parameters: certificate_pending.next_protocol_parameters,
@@ -55,23 +49,50 @@ impl ToCertificatePendingMessageAdapter {
5549

5650
#[cfg(test)]
5751
mod tests {
58-
use mithril_common::test_utils::fake_data;
52+
use mithril_common::{
53+
entities::{Epoch, SignedEntityType},
54+
test_utils::fake_data,
55+
};
5956

6057
use super::*;
6158

6259
#[test]
6360
fn adapt_ok() {
6461
let certificate_pending = fake_data::certificate_pending();
6562
let epoch = certificate_pending.epoch;
66-
let message = ToCertificatePendingMessageAdapter::adapt(
67-
certificate_pending,
68-
fake_data::network(),
69-
10,
70-
);
63+
let message = ToCertificatePendingMessageAdapter::adapt(certificate_pending);
7164

7265
assert_eq!(epoch, message.epoch);
7366
}
7467

68+
#[test]
69+
fn adapt_on_cardano_immutable_files_full_signed_entity_type_ok() {
70+
let mut certificate_pending = fake_data::certificate_pending();
71+
let beacon = CardanoDbBeacon::new("network", 15, 756);
72+
certificate_pending.signed_entity_type =
73+
SignedEntityType::CardanoImmutableFilesFull(beacon.clone());
74+
75+
let message = ToCertificatePendingMessageAdapter::adapt(certificate_pending);
76+
77+
#[allow(deprecated)]
78+
let beacon_from_message = message.beacon.unwrap();
79+
assert_eq!(beacon, beacon_from_message);
80+
}
81+
82+
#[test]
83+
fn adapt_on_other_than_cardano_immutable_files_full_signed_entity_type_ok() {
84+
let mut certificate_pending = fake_data::certificate_pending();
85+
let beacon = CardanoDbBeacon::new("", 0, 0);
86+
certificate_pending.signed_entity_type =
87+
SignedEntityType::MithrilStakeDistribution(Epoch(15));
88+
89+
let message = ToCertificatePendingMessageAdapter::adapt(certificate_pending);
90+
91+
#[allow(deprecated)]
92+
let beacon_from_message = message.beacon.unwrap();
93+
assert_eq!(beacon, beacon_from_message);
94+
}
95+
7596
#[test]
7697
fn adapt_signers() {
7798
let fake_signers = fake_data::signers(5);
@@ -82,11 +103,7 @@ mod tests {
82103
next_signers,
83104
..fake_data::certificate_pending()
84105
};
85-
let message = ToCertificatePendingMessageAdapter::adapt(
86-
certificate_pending,
87-
fake_data::network(),
88-
10,
89-
);
106+
let message = ToCertificatePendingMessageAdapter::adapt(certificate_pending);
90107

91108
assert_eq!(2, message.signers.len());
92109
assert_eq!(3, message.next_signers.len());

mithril-common/src/messages/certificate_pending.rs

Lines changed: 150 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ pub struct CertificatePendingMessage {
1111

1212
/// Current Beacon
1313
#[deprecated(since = "0.3.25", note = "use epoch instead")]
14-
pub beacon: CardanoDbBeacon,
14+
#[serde(skip_serializing_if = "Option::is_none")]
15+
pub beacon: Option<CardanoDbBeacon>,
1516

1617
/// Signed entity type
1718
#[serde(rename = "entity_type")]
@@ -41,7 +42,7 @@ impl CertificatePendingMessage {
4142
#[allow(deprecated)]
4243
Self {
4344
epoch: beacon.epoch,
44-
beacon,
45+
beacon: None,
4546
signed_entity_type: SignedEntityType::dummy(),
4647
protocol_parameters: ProtocolParameters {
4748
k: 5,
@@ -62,21 +63,55 @@ impl CertificatePendingMessage {
6263

6364
#[cfg(test)]
6465
mod tests {
66+
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
67+
pub struct CertificatePendingMessagePreviousVersion {
68+
/// Current Epoch
69+
pub epoch: Epoch,
70+
71+
/// Current Beacon
72+
#[deprecated(since = "0.3.25", note = "use epoch instead")]
73+
pub beacon: CardanoDbBeacon,
74+
75+
/// Signed entity type
76+
#[serde(rename = "entity_type")]
77+
pub signed_entity_type: SignedEntityType,
78+
79+
/// Current Protocol parameters
80+
#[serde(rename = "protocol")]
81+
pub protocol_parameters: ProtocolParameters,
82+
83+
/// Next Protocol parameters
84+
#[serde(rename = "next_protocol")]
85+
pub next_protocol_parameters: ProtocolParameters,
86+
87+
/// Current Signers
88+
pub signers: Vec<SignerMessagePart>,
89+
90+
/// Signers that will be able to sign on the next epoch
91+
pub next_signers: Vec<SignerMessagePart>,
92+
}
93+
6594
use crate::entities::Epoch;
6695

6796
use super::*;
6897

69-
fn golden_message() -> CertificatePendingMessage {
98+
fn golden_previous_message() -> CertificatePendingMessagePreviousVersion {
7099
let beacon = CardanoDbBeacon {
71100
network: "preview".to_string(),
72101
epoch: Epoch(86),
73102
immutable_file_number: 1728,
74103
};
75104

105+
let deprecated_beacon = CardanoDbBeacon {
106+
network: "".to_string(),
107+
epoch: Epoch(0),
108+
immutable_file_number: 0,
109+
};
110+
76111
#[allow(deprecated)]
77-
CertificatePendingMessage {
112+
CertificatePendingMessagePreviousVersion {
78113
epoch: beacon.epoch,
79-
beacon: beacon.clone(),
114+
beacon: deprecated_beacon,
80115
signed_entity_type: SignedEntityType::CardanoImmutableFilesFull(beacon),
81116
protocol_parameters: ProtocolParameters {
82117
k: 5,
@@ -109,14 +144,12 @@ mod tests {
109144
}
110145
}
111146

112-
#[test]
113-
fn test_v1() {
114-
let json = r#"{
147+
const ACTUAL_JSON: &str = r#"{
115148
"epoch": 86,
116149
"beacon": {
117-
"network": "preview",
118-
"epoch": 86,
119-
"immutable_file_number": 1728
150+
"network": "",
151+
"epoch": 0,
152+
"immutable_file_number": 0
120153
},
121154
"entity_type": {
122155
"CardanoImmutableFilesFull": {
@@ -148,8 +181,113 @@ mod tests {
148181
}
149182
]
150183
}"#;
184+
185+
fn golden_actual_message() -> CertificatePendingMessage {
186+
let beacon = CardanoDbBeacon {
187+
network: "preview".to_string(),
188+
epoch: Epoch(86),
189+
immutable_file_number: 1728,
190+
};
191+
let deprecated_beacon = CardanoDbBeacon {
192+
network: "".to_string(),
193+
epoch: Epoch(0),
194+
immutable_file_number: 0,
195+
};
196+
197+
#[allow(deprecated)]
198+
CertificatePendingMessage {
199+
epoch: beacon.epoch,
200+
beacon: Some(deprecated_beacon),
201+
signed_entity_type: SignedEntityType::CardanoImmutableFilesFull(beacon),
202+
protocol_parameters: ProtocolParameters {
203+
k: 5,
204+
m: 100,
205+
phi_f: 0.65,
206+
},
207+
next_protocol_parameters: ProtocolParameters {
208+
k: 50,
209+
m: 1000,
210+
phi_f: 0.65,
211+
},
212+
signers: vec![
213+
SignerMessagePart {
214+
party_id: "123".to_string(),
215+
verification_key: "7b22766b223a5b3134332c3136312c3235352c34382c37382c35372c3230342c3232302c32352c3232312c3136342c3235322c3234382c31342c35362c3132362c3138362c3133352c3232382c3138382c3134352c3138312c35322c3230302c39372c39392c3231332c34362c302c3139392c3139332c38392c3138372c38382c32392c3133352c3137332c3234342c38362c33362c38332c35342c36372c3136342c362c3133372c39342c37322c362c3130352c3132382c3132382c39332c34382c3137362c31312c342c3234362c3133382c34382c3138302c3133332c39302c3134322c3139322c32342c3139332c3131312c3134322c33312c37362c3131312c3131302c3233342c3135332c39302c3230382c3139322c33312c3132342c39352c3130322c34392c3135382c39392c35322c3232302c3136352c39342c3235312c36382c36392c3132312c31362c3232342c3139345d2c22706f70223a5b3136382c35302c3233332c3139332c31352c3133362c36352c37322c3132332c3134382c3132392c3137362c33382c3139382c3230392c34372c32382c3230342c3137362c3134342c35372c3235312c34322c32382c36362c37362c38392c39372c3135382c36332c35342c3139382c3139342c3137362c3133352c3232312c31342c3138352c3139372c3232352c3230322c39382c3234332c37342c3233332c3232352c3134332c3135312c3134372c3137372c3137302c3131372c36362c3136352c36362c36322c33332c3231362c3233322c37352c36382c3131342c3139352c32322c3130302c36352c34342c3139382c342c3136362c3130322c3233332c3235332c3234302c35392c3137352c36302c3131372c3134322c3131342c3134302c3132322c31372c38372c3131302c3138372c312c31372c31302c3139352c3135342c31332c3234392c38362c35342c3232365d7d".to_string(),
216+
verification_key_signature: None,
217+
operational_certificate: None,
218+
kes_period: None
219+
}
220+
],
221+
next_signers: vec![
222+
SignerMessagePart {
223+
party_id: "123".to_string(),
224+
verification_key: "7b22766b223a5b3134332c3136312c3235352c34382c37382c35372c3230342c3232302c32352c3232312c3136342c3235322c3234382c31342c35362c3132362c3138362c3133352c3232382c3138382c3134352c3138312c35322c3230302c39372c39392c3231332c34362c302c3139392c3139332c38392c3138372c38382c32392c3133352c3137332c3234342c38362c33362c38332c35342c36372c3136342c362c3133372c39342c37322c362c3130352c3132382c3132382c39332c34382c3137362c31312c342c3234362c3133382c34382c3138302c3133332c39302c3134322c3139322c32342c3139332c3131312c3134322c33312c37362c3131312c3131302c3233342c3135332c39302c3230382c3139322c33312c3132342c39352c3130322c34392c3135382c39392c35322c3232302c3136352c39342c3235312c36382c36392c3132312c31362c3232342c3139345d2c22706f70223a5b3136382c35302c3233332c3139332c31352c3133362c36352c37322c3132332c3134382c3132392c3137362c33382c3139382c3230392c34372c32382c3230342c3137362c3134342c35372c3235312c34322c32382c36362c37362c38392c39372c3135382c36332c35342c3139382c3139342c3137362c3133352c3232312c31342c3138352c3139372c3232352c3230322c39382c3234332c37342c3233332c3232352c3134332c3135312c3134372c3137372c3137302c3131372c36362c3136352c36362c36322c33332c3231362c3233322c37352c36382c3131342c3139352c32322c3130302c36352c34342c3139382c342c3136362c3130322c3233332c3235332c3234302c35392c3137352c36302c3131372c3134322c3131342c3134302c3132322c31372c38372c3131302c3138372c312c31372c31302c3139352c3135342c31332c3234392c38362c35342c3232365d7d".to_string(),
225+
verification_key_signature: None,
226+
operational_certificate: None,
227+
kes_period: None
228+
}
229+
],
230+
}
231+
}
232+
233+
#[test]
234+
fn test_actual_json_deserialized_into_previous_message() {
235+
let json = ACTUAL_JSON;
236+
let message: CertificatePendingMessagePreviousVersion = serde_json::from_str(json).unwrap();
237+
238+
assert_eq!(golden_previous_message(), message);
239+
}
240+
241+
#[test]
242+
fn test_actual_json_deserialized_into_actual_message() {
243+
let json = ACTUAL_JSON;
151244
let message: CertificatePendingMessage = serde_json::from_str(json).unwrap();
152245

153-
assert_eq!(golden_message(), message);
246+
assert_eq!(golden_actual_message(), message);
247+
}
248+
249+
#[test]
250+
fn test_json_next_version_deserialized_into_actual_message() {
251+
let next_json = r#"{
252+
"epoch": 86,
253+
"entity_type": {
254+
"CardanoImmutableFilesFull": {
255+
"network": "preview",
256+
"epoch": 86,
257+
"immutable_file_number": 1728
258+
}
259+
},
260+
"protocol": {
261+
"k": 5,
262+
"m": 100,
263+
"phi_f": 0.65
264+
},
265+
"next_protocol": {
266+
"k": 50,
267+
"m": 1000,
268+
"phi_f": 0.65
269+
},
270+
"signers": [
271+
{
272+
"party_id": "123",
273+
"verification_key": "7b22766b223a5b3134332c3136312c3235352c34382c37382c35372c3230342c3232302c32352c3232312c3136342c3235322c3234382c31342c35362c3132362c3138362c3133352c3232382c3138382c3134352c3138312c35322c3230302c39372c39392c3231332c34362c302c3139392c3139332c38392c3138372c38382c32392c3133352c3137332c3234342c38362c33362c38332c35342c36372c3136342c362c3133372c39342c37322c362c3130352c3132382c3132382c39332c34382c3137362c31312c342c3234362c3133382c34382c3138302c3133332c39302c3134322c3139322c32342c3139332c3131312c3134322c33312c37362c3131312c3131302c3233342c3135332c39302c3230382c3139322c33312c3132342c39352c3130322c34392c3135382c39392c35322c3232302c3136352c39342c3235312c36382c36392c3132312c31362c3232342c3139345d2c22706f70223a5b3136382c35302c3233332c3139332c31352c3133362c36352c37322c3132332c3134382c3132392c3137362c33382c3139382c3230392c34372c32382c3230342c3137362c3134342c35372c3235312c34322c32382c36362c37362c38392c39372c3135382c36332c35342c3139382c3139342c3137362c3133352c3232312c31342c3138352c3139372c3232352c3230322c39382c3234332c37342c3233332c3232352c3134332c3135312c3134372c3137372c3137302c3131372c36362c3136352c36362c36322c33332c3231362c3233322c37352c36382c3131342c3139352c32322c3130302c36352c34342c3139382c342c3136362c3130322c3233332c3235332c3234302c35392c3137352c36302c3131372c3134322c3131342c3134302c3132322c31372c38372c3131302c3138372c312c31372c31302c3139352c3135342c31332c3234392c38362c35342c3232365d7d"
274+
}
275+
],
276+
"next_signers": [
277+
{
278+
"party_id": "123",
279+
"verification_key": "7b22766b223a5b3134332c3136312c3235352c34382c37382c35372c3230342c3232302c32352c3232312c3136342c3235322c3234382c31342c35362c3132362c3138362c3133352c3232382c3138382c3134352c3138312c35322c3230302c39372c39392c3231332c34362c302c3139392c3139332c38392c3138372c38382c32392c3133352c3137332c3234342c38362c33362c38332c35342c36372c3136342c362c3133372c39342c37322c362c3130352c3132382c3132382c39332c34382c3137362c31312c342c3234362c3133382c34382c3138302c3133332c39302c3134322c3139322c32342c3139332c3131312c3134322c33312c37362c3131312c3131302c3233342c3135332c39302c3230382c3139322c33312c3132342c39352c3130322c34392c3135382c39392c35322c3232302c3136352c39342c3235312c36382c36392c3132312c31362c3232342c3139345d2c22706f70223a5b3136382c35302c3233332c3139332c31352c3133362c36352c37322c3132332c3134382c3132392c3137362c33382c3139382c3230392c34372c32382c3230342c3137362c3134342c35372c3235312c34322c32382c36362c37362c38392c39372c3135382c36332c35342c3139382c3139342c3137362c3133352c3232312c31342c3138352c3139372c3232352c3230322c39382c3234332c37342c3233332c3232352c3134332c3135312c3134372c3137372c3137302c3131372c36362c3136352c36362c36322c33332c3231362c3233322c37352c36382c3131342c3139352c32322c3130302c36352c34342c3139382c342c3136362c3130322c3233332c3235332c3234302c35392c3137352c36302c3131372c3134322c3131342c3134302c3132322c31372c38372c3131302c3138372c312c31372c31302c3139352c3135342c31332c3234392c38362c35342c3232365d7d"
280+
}
281+
]
282+
}"#;
283+
let message: CertificatePendingMessage = serde_json::from_str(next_json).unwrap();
284+
285+
#[allow(deprecated)]
286+
let golden_message = CertificatePendingMessage {
287+
beacon: None,
288+
..golden_actual_message()
289+
};
290+
291+
assert_eq!(golden_message, message);
154292
}
155293
}

openapi.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,6 @@ components:
678678
additionalProperties: false
679679
required:
680680
- epoch
681-
- beacon
682681
- entity_type
683682
- protocol
684683
- next_protocol

0 commit comments

Comments
 (0)