Skip to content

Commit f8ee73d

Browse files
authored
Merge pull request #704 from input-output-hk/greg/696/certificate_pending_message
Greg/696/certificate pending message
2 parents 88a1696 + 5296bc0 commit f8ee73d

File tree

12 files changed

+290
-64
lines changed

12 files changed

+290
-64
lines changed

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ fn certificate_certificate_hash(
3535
mod handlers {
3636
use crate::http_server::routes::reply;
3737
use crate::message_adapters::ToCertificateMessageAdapter;
38-
use crate::{CertificatePendingStore, CertificateStore};
38+
use crate::{CertificatePendingStore, CertificateStore, ToCertificatePendingMessageAdapter};
3939
use slog_scope::{debug, warn};
4040
use std::convert::Infallible;
4141
use std::sync::Arc;
@@ -48,7 +48,10 @@ mod handlers {
4848
debug!("⇄ HTTP SERVER: certificate_pending");
4949

5050
match certificate_pending_store.get().await {
51-
Ok(Some(certificate_pending)) => Ok(reply::json(&certificate_pending, StatusCode::OK)),
51+
Ok(Some(certificate_pending)) => Ok(reply::json(
52+
&ToCertificatePendingMessageAdapter::adapt(certificate_pending),
53+
StatusCode::OK,
54+
)),
5255
Ok(None) => Ok(reply::empty(StatusCode::NO_CONTENT)),
5356
Err(err) => {
5457
warn!("certificate_pending::error"; "error" => ?err);

mithril-aggregator/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ pub use certificate_creator::{CertificateCreator, MithrilCertificateCreator};
3636
pub use command_args::MainOpts;
3737
pub use dependency::DependencyManager;
3838
pub use http_server::Server;
39-
pub use message_adapters::{FromRegisterSignerAdapter, ToEpochSettingsMessageAdapter};
39+
pub use message_adapters::{
40+
FromRegisterSignerAdapter, ToCertificatePendingMessageAdapter, ToEpochSettingsMessageAdapter,
41+
};
4042
pub use runtime::{AggregatorConfig, AggregatorRunner, AggregatorRunnerTrait, AggregatorRuntime};
4143
pub use signer_registerer::{
4244
MithrilSignerRegisterer, SignerRegisterer, SignerRegistrationError, SignerRegistrationRound,
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
mod from_register_signature;
22
mod from_register_signer;
33
mod to_certificate_message;
4+
mod to_certificate_pending_message;
45
mod to_epoch_settings_message;
56
mod to_snasphot_message;
67

78
pub use from_register_signature::FromRegisterSingleSignatureAdapter;
89
pub use from_register_signer::FromRegisterSignerAdapter;
910
pub use to_certificate_message::ToCertificateMessageAdapter;
11+
pub use to_certificate_pending_message::ToCertificatePendingMessageAdapter;
1012
pub use to_epoch_settings_message::ToEpochSettingsMessageAdapter;
1113
pub use to_snasphot_message::ToSnapshotMessageAdapter;
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
use mithril_common::{
2+
entities::{CertificatePending, Signer},
3+
messages::{CertificatePendingMessage, SignerMessage},
4+
};
5+
6+
/// Adapter to turn [CertificatePending] instances into [CertificatePendingMessage].
7+
pub struct ToCertificatePendingMessageAdapter;
8+
9+
impl ToCertificatePendingMessageAdapter {
10+
/// Method to trigger the conversion
11+
pub fn adapt(certificate_pending: CertificatePending) -> CertificatePendingMessage {
12+
CertificatePendingMessage {
13+
beacon: certificate_pending.beacon,
14+
protocol_parameters: certificate_pending.protocol_parameters,
15+
next_protocol_parameters: certificate_pending.next_protocol_parameters,
16+
signers: Self::adapt_signers(certificate_pending.signers),
17+
next_signers: Self::adapt_signers(certificate_pending.next_signers),
18+
}
19+
}
20+
21+
fn adapt_signers(signers: Vec<Signer>) -> Vec<SignerMessage> {
22+
signers
23+
.into_iter()
24+
.map(|signer| SignerMessage {
25+
party_id: signer.party_id,
26+
verification_key: signer.verification_key,
27+
verification_key_signature: signer.verification_key_signature,
28+
kes_period: signer.kes_period,
29+
operational_certificate: signer.operational_certificate,
30+
})
31+
.collect()
32+
}
33+
}
34+
35+
#[cfg(test)]
36+
mod tests {
37+
use mithril_common::test_utils::fake_data;
38+
39+
use super::*;
40+
41+
#[test]
42+
fn adapt_ok() {
43+
let certificate_pending = fake_data::certificate_pending();
44+
let epoch = certificate_pending.beacon.epoch;
45+
let message = ToCertificatePendingMessageAdapter::adapt(certificate_pending);
46+
47+
assert_eq!(epoch, message.beacon.epoch);
48+
}
49+
50+
#[test]
51+
fn adapt_signers() {
52+
let fake_signers = fake_data::signers(5);
53+
let signers = fake_signers[1..3].to_vec();
54+
let next_signers = fake_signers[2..5].to_vec();
55+
let certificate_pending = CertificatePending {
56+
signers,
57+
next_signers,
58+
..Default::default()
59+
};
60+
let message = ToCertificatePendingMessageAdapter::adapt(certificate_pending);
61+
62+
assert_eq!(2, message.signers.len());
63+
assert_eq!(3, message.next_signers.len());
64+
}
65+
}

mithril-common/src/messages/certificate_pending.rs

Lines changed: 140 additions & 0 deletions
Large diffs are not rendered by default.

mithril-common/src/messages/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
//! Messages module
22
//! This module aims at providing shared structures for API communications.
33
mod certificate;
4+
mod certificate_pending;
45
mod epoch_settings;
56
mod register_signature;
67
mod register_signer;
78
mod snapshot;
89

910
pub use certificate::CertificateMessage;
11+
pub use certificate_pending::{CertificatePendingMessage, SignerMessage};
1012
pub use epoch_settings::EpochSettingsMessage;
1113
pub use register_signature::RegisterSignatureMessage;
1214
pub use register_signer::RegisterSignerMessage;

mithril-common/src/messages/register_signer.rs

Lines changed: 2 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,7 @@
1-
use serde::{Deserialize, Serialize};
2-
3-
use crate::{
4-
crypto_helper::KESPeriod,
5-
entities::{
6-
HexEncodedOpCert, HexEncodedVerificationKey, HexEncodedVerificationKeySignature, PartyId,
7-
},
8-
};
1+
use super::SignerMessage;
92

103
/// Register Signer Message
11-
#[derive(Clone, Debug, PartialEq, Eq, Default, Serialize, Deserialize)]
12-
pub struct RegisterSignerMessage {
13-
/// The unique identifier of the signer
14-
// TODO: Should be removed once the signer certification is fully deployed
15-
pub party_id: PartyId,
16-
17-
/// The public key used to authenticate signer signature
18-
pub verification_key: HexEncodedVerificationKey,
19-
20-
/// The encoded signer 'Mithril verification key' signature (signed by the
21-
/// Cardano node KES secret key).
22-
// TODO: Option should be removed once the signer certification is fully
23-
// deployed.
24-
#[serde(skip_serializing_if = "Option::is_none")]
25-
pub verification_key_signature: Option<HexEncodedVerificationKeySignature>,
26-
27-
/// The encoded operational certificate of stake pool operator attached to
28-
/// the signer node.
29-
// TODO: Option should be removed once the signer certification is fully
30-
// deployed.
31-
#[serde(skip_serializing_if = "Option::is_none")]
32-
pub operational_certificate: Option<HexEncodedOpCert>,
33-
34-
/// The KES period used to compute the verification key signature
35-
// TODO: This KES period should not be used as is and should probably be
36-
// within an allowed range of KES periods for the epoch.
37-
#[serde(skip_serializing_if = "Option::is_none")]
38-
pub kes_period: Option<KESPeriod>,
39-
}
40-
41-
impl RegisterSignerMessage {
42-
#[cfg(any(test, feature = "test_only"))]
43-
/// Return a dummy test entity (test-only).
44-
pub fn dummy() -> Self {
45-
Self {
46-
party_id: "pool1m8crhnqj5k2kyszf5j2scshupystyxc887zdfrpzh6ty6eun4fx".to_string(),
47-
verification_key: "7b22766b223a5b3134352c32332c3135382c31322c3138332c3230392c33322c3134302c33372c3132342c3136362c3231352c3136302c3231352c3235302c3133342c3135342c3235302c3234312c3230362c3139342c3232322c382c35392c33332c392c35382c322c3235312c31302c33322c3135352c3232372c3134332c3232362c35372c3135312c37342c3139392c3131372c37352c3136382c3134302c34362c3233392c3134352c37322c31362c32312c3138312c3139332c3134362c38362c3231332c3230342c3139332c3232332c32352c3135372c33342c33332c3232372c35312c3132362c3132362c3135362c36342c3232302c3139392c3231332c31362c34352c3131302c3234332c33352c3134382c37312c3231382c3132342c3132332c31362c3132312c3135322c31382c32362c3231322c3231342c3230312c3139302c3137342c3131352c39372c3234392c3235342c3131362c3234335d2c22706f70223a5b3138332c3134352c3133392c3234322c3132302c3136302c35362c3131382c3234322c3230342c39312c38392c32312c3138342c382c34372c3231332c3130352c36332c3135302c32312c3231372c352c382c3231392c3138382c3131342c3230352c3136362c31362c3234302c3234302c3231342c31362c3230342c3231382c3139332c3138312c32342c35362c34352c39392c3234342c38312c32352c35322c3232342c36372c3136382c3136392c3130392c3132322c38372c34392c3137302c3138312c3135312c31352c3235322c3139352c3231312c3233342c3139352c34392c39312c31392c35312c3234312c33332c35382c3134302c3235322c3234322c362c342c34302c32312c3136372c3234392c3235312c33362c38372c36302c39362c36392c3135322c3231302c39382c3136352c352c362c34312c39362c3233352c37352c3138335d7d".to_string(),
48-
verification_key_signature: Some("7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a7b227369676d61223a5b33322c3235332c3134372c3132382c39302c3137372c31322c3231302c3232312c37332c31332c3234332c31302c36342c39322c3139322c3131342c3231302c3231372c3133312c3131322c3137322c3231362c3138372c38382c3138362c32372c31342c3134302c3230362c38312c3234332c3132342c3131342c3234362c3130342c35362c3131342c372c3131342c35372c3232392c3135362c32332c39342c32382c3137372c36302c3131302c34332c3136362c392c3139392c3233302c3133342c37302c3233322c3131362c3130302c36382c39342c3135332c3136342c31345d2c226c68735f706b223a5b3136332c3234362c39382c3232362c31302c36302c3131322c3234312c3136372c36322c3230302c3234382c39392c3133382c3136322c3137322c3137352c31332c3138392c392c302c3234392c34322c3232392c3231312c3230362c3235302c3136372c33382c36332c3138392c3134335d2c227268735f706b223a5b3137322c3138392c3138352c3233302c3234382c39342c3235312c3138312c3137392c38362c38342c32332c3137382c3230352c3232362c382c3233312c3230372c3231302c38332c36382c3231342c3231362c37342c3135362c3130322c32382c3233302c382c35322c3130312c3234355d7d2c226c68735f706b223a5b3134302c3230372c39382c3133362c3134312c3233312c3231352c3230342c35322c3135352c38392c3232332c34382c3134392c3138352c3135352c3131342c3235352c39332c3137352c3234332c37302c3137362c3134332c32342c3132352c32392c3231392c3135302c33362c3232352c33375d2c227268735f706b223a5b3137312c3232392c3139332c3130352c3233342c31382c3232392c38312c3235352c3139322c3133302c32352c33322c3138342c312c33392c39332c3138372c382c3233332c36392c37342c35362c3130312c37302c3231332c3232342c33322c31382c3130322c3235332c35355d7d2c226c68735f706b223a5b34322c302c31382c36382c3135332c3234312c3231342c3133352c3139342c34332c3231322c35382c36322c332c3136302c3133332c34342c37342c3131312c37382c3136322c3133322c35372c32362c3138392c36372c3132372c3232352c37352c3137312c31342c3131345d2c227268735f706b223a5b3133372c3135302c39302c3139362c3232322c3234312c3137392c3133372c3130362c33362c3130322c37322c35372c37312c3130392c3235302c392c33362c3134362c3234372c37342c3231362c31322c342c35322c33372c3233342c37302c3233342c37302c36362c34315d7d2c226c68735f706b223a5b3132312c3134352c3233352c3230392c3135322c39302c3135372c3231392c35312c34302c3136372c322c3137372c3138372c39372c3135332c3138392c3130392c3234392c38392c3231372c3135302c3139322c3131302c3232322c3138332c3134362c39392c3134352c35392c3132352c3132305d2c227268735f706b223a5b32362c38352c3137332c3235302c34382c36322c33382c3231392c39312c3138392c3136382c35322c3137392c34342c39332c39362c31362c3136392c38372c31302c3137302c312c3138392c322c3235352c3131312c3230342c3233372c3138312c3137342c31362c3231385d7d2c226c68735f706b223a5b372c37382c3233342c34362c32372c3234322c332c3234312c3231342c3131322c372c34302c3131372c39372c39332c3234322c3130342c3137302c39352c3138372c37382c3134312c3233382c35392c3231302c352c3133342c3234392c3231372c31302c3132312c33345d2c227268735f706b223a5b3134312c3130332c3232332c3233332c3230322c34302c3231352c3135362c3131342c36342c3231332c35392c3233332c33362c3234372c3132342c3130392c3138312c3230302c3136342c3232302c3230352c32392c3133332c3132302c3232342c3132312c3132362c36362c3235322c37312c3233325d7d2c226c68735f706b223a5b3134352c3139352c3234312c35332c3139392c3133362c33322c3235342c3131362c3132302c3137352c3232332c31382c37352c3134362c35312c3131362c3235332c3137342c3132312c3235342c3134302c3136392c33302c3135312c33332c3134392c3131342c3130322c3132332c3139302c33325d2c227268735f706b223a5b32362c3233332c3137382c3138372c3234342c33382c3138372c3132332c3133382c33312c34352c39382c37302c38322c3232392c39302c3137372c36352c3133332c3135372c39372c3233302c35302c37382c3134362c37302c3230322c3130312c35362c32302c3234372c3231375d7d".to_string()),
49-
operational_certificate: Some("5b5b5b3230332c3130392c34302c32382c3235312c39342c35322c32342c3231322c3131362c3134392c38302c3138332c3136322c312c36322c352c3133332c35372c3230342c31352c3137322c3134372c38362c3132352c35392c31322c3235332c3130312c3138342c32332c31355d2c322c3132382c5b3133382c3131302c3139322c35302c38362c332c3136382c33342c3137322c31392c39312c3133392c3139302c3134302c31382c3137372c33312c34362c3132322c3130362c3233342c3137372c3130382c3232352c3230372c342c302c35392c3233372c3133352c3130342c39382c3133332c3133312c32392c3231322c3137312c3139342c3234342c3139312c3137392c3131392c34322c37352c3135302c36312c3232362c3132312c35342c3232332c3139332c3133382c3139302c32372c3138322c3135322c35362c32312c3136302c3230372c33352c3233372c3130322c31325d5d2c5b3230372c31322c3136382c3139302c34362c3131362c3139362c3133332c3139362c3233312c3132342c3235302c3134372c33372c3137352c3231312c3234372c3139382c3134302c3133392c3234362c3130342c3132342c3232372c34392c352c3235332c3232382c3130372c39332c3133362c3134345d5d".to_string()),
50-
kes_period: Some(6),
51-
}
52-
}
53-
}
4+
pub type RegisterSignerMessage = SignerMessage;
545

556
#[cfg(test)]
567
mod tests {

mithril-signer/src/certificate_handler.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@ use thiserror::Error;
66

77
use mithril_common::{
88
entities::{CertificatePending, EpochSettings, Signer, SingleSignatures},
9-
messages::EpochSettingsMessage,
9+
messages::{CertificatePendingMessage, EpochSettingsMessage},
1010
MITHRIL_API_VERSION,
1111
};
1212

1313
#[cfg(test)]
1414
use mockall::automock;
1515

16-
use crate::{
17-
message_adapters::ToRegisterSignatureMessageAdapter, FromEpochSettingsAdapter,
18-
ToRegisterSignerMessageAdapter,
16+
use crate::message_adapters::{
17+
FromEpochSettingsAdapter, FromPendingCertificateMessageAdapter,
18+
ToRegisterSignatureMessageAdapter, ToRegisterSignerMessageAdapter,
1919
};
2020

2121
/// Error structure for the Certificate Handler.
@@ -155,8 +155,8 @@ impl CertificateHandler for CertificateHandlerHTTPClient {
155155

156156
match response {
157157
Ok(response) => match response.status() {
158-
StatusCode::OK => match response.json::<CertificatePending>().await {
159-
Ok(pending_certificate) => Ok(Some(pending_certificate)),
158+
StatusCode::OK => match response.json::<CertificatePendingMessage>().await {
159+
Ok(message) => Ok(Some(FromPendingCertificateMessageAdapter::adapt(message))),
160160
Err(err) => Err(CertificateHandlerError::JsonParseFailed(err.to_string())),
161161
},
162162
StatusCode::PRECONDITION_FAILED => Err(self.handle_api_error(&response)),

mithril-signer/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ mod single_signer;
1717
pub use certificate_handler::dumb::DumbCertificateHandler;
1818
pub use certificate_handler::*;
1919
pub use configuration::Config;
20-
pub use message_adapters::{FromEpochSettingsAdapter, ToRegisterSignerMessageAdapter};
20+
pub use message_adapters::{
21+
FromEpochSettingsAdapter, FromPendingCertificateMessageAdapter, ToRegisterSignerMessageAdapter,
22+
};
2123
pub use protocol_initializer_store::{ProtocolInitializerStore, ProtocolInitializerStorer};
2224
pub use runtime::*;
2325
pub use single_signer::*;
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
use mithril_common::{
2+
entities::{CertificatePending, Signer},
3+
messages::{CertificatePendingMessage, SignerMessage},
4+
};
5+
6+
/// Adapter to turn [CertificatePendingMessage] instances into [CertificatePending].
7+
pub struct FromPendingCertificateMessageAdapter;
8+
9+
impl FromPendingCertificateMessageAdapter {
10+
/// Adapter method
11+
pub fn adapt(message: CertificatePendingMessage) -> CertificatePending {
12+
CertificatePending {
13+
beacon: message.beacon,
14+
protocol_parameters: message.protocol_parameters,
15+
next_protocol_parameters: message.next_protocol_parameters,
16+
signers: Self::adapt_signers(message.signers),
17+
next_signers: Self::adapt_signers(message.next_signers),
18+
}
19+
}
20+
21+
fn adapt_signers(signer_messages: Vec<SignerMessage>) -> Vec<Signer> {
22+
signer_messages
23+
.into_iter()
24+
.map(|msg| Signer {
25+
party_id: msg.party_id,
26+
verification_key: msg.verification_key,
27+
verification_key_signature: msg.verification_key_signature,
28+
kes_period: msg.kes_period,
29+
operational_certificate: msg.operational_certificate,
30+
})
31+
.collect()
32+
}
33+
}
34+
35+
#[cfg(test)]
36+
mod tests {
37+
use super::*;
38+
39+
#[test]
40+
fn adapt_ok() {
41+
let message = CertificatePendingMessage::dummy();
42+
let epoch = message.beacon.epoch;
43+
let certificate_pending = FromPendingCertificateMessageAdapter::adapt(message);
44+
45+
assert_eq!(epoch, certificate_pending.beacon.epoch);
46+
}
47+
48+
#[test]
49+
fn adapt_signers() {
50+
let mut message = CertificatePendingMessage::dummy();
51+
message.signers = vec![SignerMessage::dummy(), SignerMessage::dummy()];
52+
let certificate_pending = FromPendingCertificateMessageAdapter::adapt(message);
53+
54+
assert_eq!(2, certificate_pending.signers.len());
55+
assert_eq!(1, certificate_pending.next_signers.len());
56+
}
57+
}

0 commit comments

Comments
 (0)