Skip to content

Commit 4c4463a

Browse files
committed
Taking into account the remarks of the PR
1 parent eb44059 commit 4c4463a

File tree

7 files changed

+75
-48
lines changed

7 files changed

+75
-48
lines changed

mithril-common/src/messages/epoch_settings.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ mod tests {
132132
}
133133
}
134134

135-
// Test the retro compatibility with previous structure.
135+
// Test the backward compatibility with previous structure.
136136
#[test]
137137
fn test_actual_json_deserialized_into_previous_message() {
138138
let json = ACTUAL_JSON;

mithril-common/src/messages/message_parts/signer.rs

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -70,35 +70,46 @@ impl SignerWithStakeMessagePart {
7070

7171
/// Convert a set of signer message parts into a set of signers with stake
7272
pub fn try_into_signers(messages: Vec<Self>) -> StdResult<Vec<SignerWithStake>> {
73-
let mut signers: Vec<SignerWithStake> = Vec::new();
73+
messages
74+
.into_iter()
75+
.map(SignerWithStakeMessagePart::try_into)
76+
.collect()
77+
}
78+
}
7479

75-
for message in messages {
76-
let verification_key_signature: Option<ProtocolSignerVerificationKeySignature> = message.verification_key_signature
77-
.map(|f| f.try_into())
78-
.transpose()
79-
.with_context(|| format!("Error while parsing verification key signature message, party_id = '{}'", message.party_id))?;
80-
let operational_certificate: Option<ProtocolOpCert> = message
81-
.operational_certificate
82-
.map(|f| f.try_into())
83-
.transpose()
84-
.with_context(|| {
85-
format!(
86-
"Error while parsing operational certificate message, party_id = '{}'.",
87-
message.party_id
88-
)
89-
})?;
90-
let value = SignerWithStake {
91-
party_id: message.party_id,
92-
verification_key: message.verification_key.try_into()?,
93-
verification_key_signature,
94-
kes_period: message.kes_period,
95-
operational_certificate,
96-
stake: message.stake,
97-
};
98-
signers.push(value);
99-
}
80+
impl TryInto<SignerWithStake> for SignerWithStakeMessagePart {
81+
type Error = StdError;
10082

101-
Ok(signers)
83+
fn try_into(self) -> Result<SignerWithStake, Self::Error> {
84+
let verification_key_signature: Option<ProtocolSignerVerificationKeySignature> = self
85+
.verification_key_signature
86+
.map(|f| f.try_into())
87+
.transpose()
88+
.with_context(|| {
89+
format!(
90+
"Error while parsing verification key signature message, party_id = '{}'",
91+
self.party_id
92+
)
93+
})?;
94+
let operational_certificate: Option<ProtocolOpCert> = self
95+
.operational_certificate
96+
.map(|f| f.try_into())
97+
.transpose()
98+
.with_context(|| {
99+
format!(
100+
"Error while parsing operational certificate message, party_id = '{}'.",
101+
self.party_id
102+
)
103+
})?;
104+
let value = SignerWithStake {
105+
party_id: self.party_id,
106+
verification_key: self.verification_key.try_into()?,
107+
verification_key_signature,
108+
kes_period: self.kes_period,
109+
operational_certificate,
110+
stake: self.stake,
111+
};
112+
Ok(value)
102113
}
103114
}
104115

mithril-signer/src/message_adapters/from_epoch_settings.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
1+
use anyhow::Context;
12
use mithril_common::{
23
entities::EpochSettings,
3-
messages::{EpochSettingsMessage, FromMessageAdapter, SignerMessagePart},
4+
messages::{EpochSettingsMessage, SignerMessagePart, TryFromMessageAdapter},
5+
StdResult,
46
};
57

68
/// Adapter to convert [EpochSettingsMessage] to [EpochSettings].
79
pub struct FromEpochSettingsAdapter;
810

9-
impl FromMessageAdapter<EpochSettingsMessage, EpochSettings> for FromEpochSettingsAdapter {
11+
impl TryFromMessageAdapter<EpochSettingsMessage, EpochSettings> for FromEpochSettingsAdapter {
1012
/// Method to convert.
11-
fn adapt(message: EpochSettingsMessage) -> EpochSettings {
12-
EpochSettings {
13+
fn try_adapt(message: EpochSettingsMessage) -> StdResult<EpochSettings> {
14+
let epoch_settings = EpochSettings {
1315
epoch: message.epoch,
1416
protocol_parameters: message.protocol_parameters,
1517
next_protocol_parameters: message.next_protocol_parameters,
16-
current_signers: SignerMessagePart::try_into_signers(message.current_signers).unwrap(),
17-
next_signers: SignerMessagePart::try_into_signers(message.next_signers).unwrap(),
18-
}
18+
current_signers: SignerMessagePart::try_into_signers(message.current_signers)
19+
.with_context(|| "'FromMessageAdapter' can not convert the current signers")?,
20+
next_signers: SignerMessagePart::try_into_signers(message.next_signers)
21+
.with_context(|| "'FromMessageAdapter' can not convert the next signers")?,
22+
};
23+
Ok(epoch_settings)
1924
}
2025
}
2126

@@ -27,7 +32,7 @@ mod tests {
2732
fn test_simple_message() {
2833
let message = EpochSettingsMessage::dummy();
2934
let epoch = message.epoch;
30-
let epoch_settings = FromEpochSettingsAdapter::adapt(message);
35+
let epoch_settings = FromEpochSettingsAdapter::try_adapt(message).unwrap();
3136

3237
assert_eq!(epoch, epoch_settings.epoch);
3338
}

mithril-signer/src/message_adapters/from_pending_certificate_message.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ impl TryFromMessageAdapter<CertificatePendingMessage, CertificatePending>
1919
signed_entity_type: message.signed_entity_type,
2020
protocol_parameters: message.protocol_parameters,
2121
next_protocol_parameters: message.next_protocol_parameters,
22-
// This field is deprecated and should not be used in Signer.
22+
// This field is deprecated and should not be used by the Mithril signer.
2323
signers: vec![],
24-
// This field is deprecated and should not be used in Signer.
24+
// This field is deprecated and should not be used by the Mithril signer.
2525
next_signers: vec![],
2626
};
2727

mithril-signer/src/runtime/runner.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,16 @@ impl SignerRunner {
117117
.next_signers_with_stake()
118118
.await
119119
}
120+
121+
/// Get the current signers.
122+
async fn get_current_signers(&self) -> StdResult<Vec<Signer>> {
123+
self.services
124+
.epoch_service
125+
.read()
126+
.await
127+
.current_signers()
128+
.cloned()
129+
}
120130
}
121131

122132
#[cfg_attr(test, automock)]
@@ -264,11 +274,8 @@ impl Runner for SignerRunner {
264274
return Ok(false);
265275
}
266276

267-
// TODO XXX How handle errors ? It occurs in test_create_immutable_files_full_single_signature integration test (no signers in epoch 1)
268-
// TODO XXX Do we warn and return "can not sign" or return an error ?
269-
let current_signer_with_stake: Option<SignerWithStake> = {
270-
let epoch_service = self.services.epoch_service.read().await;
271-
let current_signers = epoch_service.current_signers_with_stake().await;
277+
let current_signer: Option<Signer> = {
278+
let current_signers = self.get_current_signers().await;
272279
if let Ok(signers) = current_signers {
273280
signers
274281
.iter()
@@ -280,7 +287,7 @@ impl Runner for SignerRunner {
280287
}
281288
};
282289

283-
if let Some(signer) = current_signer_with_stake {
290+
if let Some(signer) = current_signer {
284291
debug!(" > got a Signer from pending certificate");
285292

286293
if let Some(protocol_initializer) = self

mithril-signer/src/services/aggregator_client.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use mithril_common::{
1212
},
1313
messages::{
1414
AggregatorFeaturesMessage, CertificatePendingMessage, EpochSettingsMessage,
15-
FromMessageAdapter, TryFromMessageAdapter, TryToMessageAdapter,
15+
TryFromMessageAdapter, TryToMessageAdapter,
1616
},
1717
StdError, MITHRIL_API_VERSION_HEADER, MITHRIL_SIGNER_VERSION_HEADER,
1818
};
@@ -197,7 +197,11 @@ impl AggregatorClient for AggregatorHTTPClient {
197197
match response {
198198
Ok(response) => match response.status() {
199199
StatusCode::OK => match response.json::<EpochSettingsMessage>().await {
200-
Ok(message) => Ok(Some(FromEpochSettingsAdapter::adapt(message))),
200+
Ok(message) => {
201+
let epoch_settings = FromEpochSettingsAdapter::try_adapt(message)
202+
.map_err(|e| AggregatorClientError::Adapter(anyhow!(e)))?;
203+
Ok(Some(epoch_settings))
204+
}
201205
Err(err) => Err(AggregatorClientError::JsonParseFailed(anyhow!(err))),
202206
},
203207
StatusCode::PRECONDITION_FAILED => Err(self.handle_api_error(&response)),
@@ -587,7 +591,7 @@ mod tests {
587591
let epoch_settings = certificate_handler.retrieve_epoch_settings().await;
588592
epoch_settings.as_ref().expect("unexpected error");
589593
assert_eq!(
590-
FromEpochSettingsAdapter::adapt(epoch_settings_expected),
594+
FromEpochSettingsAdapter::try_adapt(epoch_settings_expected).unwrap(),
591595
epoch_settings.unwrap().unwrap()
592596
);
593597
}

mithril-signer/src/services/epoch_service.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use mithril_common::StdResult;
1414

1515
use crate::RunnerError;
1616

17-
/// Errors dedicated to the CertifierService.
17+
/// Errors dedicated to the EpochService.
1818
#[derive(Debug, Error)]
1919
pub enum EpochServiceError {
2020
/// Raised when service has not collected data at least once.

0 commit comments

Comments
 (0)