Skip to content

Commit 894501d

Browse files
authored
Merge pull request #1124 from input-output-hk/djo/668/protocol_key_for_multi_and_genesis_signature
Protocol key for Multi and Genesis signature
2 parents 616e2f9 + a0a17c5 commit 894501d

File tree

27 files changed

+716
-466
lines changed

27 files changed

+716
-466
lines changed

Cargo.lock

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-aggregator/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-aggregator"
3-
version = "0.3.62"
3+
version = "0.3.63"
44
description = "A Mithril Aggregator server"
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-aggregator/src/database/provider/certificate.rs

+79-67
Large diffs are not rendered by default.

mithril-aggregator/src/message_adapters/to_certificate_message.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use mithril_common::entities::Certificate;
1+
use mithril_common::entities::{Certificate, CertificateSignature};
22
use mithril_common::messages::{
33
CertificateMessage, CertificateMetadataMessage, SignerWithStakeMessagePart, ToMessageAdapter,
44
};
@@ -17,6 +17,15 @@ impl ToMessageAdapter<Certificate, CertificateMessage> for ToCertificateMessageA
1717
signers: SignerWithStakeMessagePart::from_signers(certificate.metadata.signers),
1818
};
1919

20+
let (multi_signature, genesis_signature) = match certificate.signature {
21+
CertificateSignature::GenesisSignature(signature) => {
22+
(String::new(), signature.to_bytes_hex())
23+
}
24+
CertificateSignature::MultiSignature(signature) => {
25+
(signature.to_json_hex().unwrap(), String::new())
26+
}
27+
};
28+
2029
CertificateMessage {
2130
hash: certificate.hash,
2231
previous_hash: certificate.previous_hash,
@@ -25,8 +34,8 @@ impl ToMessageAdapter<Certificate, CertificateMessage> for ToCertificateMessageA
2534
protocol_message: certificate.protocol_message,
2635
signed_message: certificate.signed_message,
2736
aggregate_verification_key: certificate.aggregate_verification_key,
28-
multi_signature: certificate.multi_signature,
29-
genesis_signature: certificate.genesis_signature,
37+
multi_signature,
38+
genesis_signature,
3039
}
3140
}
3241
}

mithril-aggregator/src/services/certifier.rs

+27-23
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,32 @@
44
//! messages and turn them into [Certificate]. To do so, it registers
55
//! single signatures and deal with the multi_signer for aggregate signature
66
//! creation.
7-
use std::sync::Arc;
87
98
use async_trait::async_trait;
109
use chrono::Utc;
11-
use mithril_common::certificate_chain::CertificateVerifier;
12-
use mithril_common::crypto_helper::{key_encode_hex, ProtocolGenesisVerifier, PROTOCOL_VERSION};
13-
use mithril_common::entities::{
14-
Certificate, CertificateMetadata, Epoch, ProtocolMessage, SignedEntityType, SingleSignatures,
10+
use mithril_common::{
11+
certificate_chain::CertificateVerifier,
12+
crypto_helper::{ProtocolGenesisVerifier, PROTOCOL_VERSION},
13+
entities::{
14+
Certificate, CertificateMetadata, CertificateSignature, Epoch, ProtocolMessage,
15+
SignedEntityType, SingleSignatures,
16+
},
17+
StdResult,
1518
};
16-
use mithril_common::StdResult;
1719
use slog::Logger;
1820
use slog_scope::{debug, error, info, warn};
21+
use std::sync::Arc;
1922
use thiserror::Error;
2023
use tokio::sync::RwLock;
2124

22-
use crate::database::provider::{
23-
CertificateRepository, OpenMessageRecord, OpenMessageRepository,
24-
OpenMessageWithSingleSignaturesRecord, SingleSignatureRepository,
25+
use crate::{
26+
database::provider::{
27+
CertificateRepository, OpenMessageRecord, OpenMessageRepository,
28+
OpenMessageWithSingleSignaturesRecord, SingleSignatureRepository,
29+
},
30+
entities::OpenMessage,
31+
MultiSigner,
2532
};
26-
use crate::entities::OpenMessage;
27-
use crate::MultiSigner;
2833

2934
#[cfg(test)]
3035
use mockall::automock;
@@ -289,16 +294,17 @@ impl CertifierService for MithrilCertifierService {
289294
}
290295

291296
let multi_signer = self.multi_signer.write().await;
292-
let signature = multi_signer.create_multi_signature(&open_message).await?;
293-
294-
if signature.is_some() {
295-
info!("CertifierService::create_certificate: multi-signature created for open message {signed_entity_type:?}");
296-
} else {
297-
debug!("CertifierService::create_certificate: No multi-signature could be created for open message {signed_entity_type:?}");
297+
let multi_signature = match multi_signer.create_multi_signature(&open_message).await? {
298+
None => {
299+
debug!("CertifierService::create_certificate: No multi-signature could be created for open message {signed_entity_type:?}");
300+
return Ok(None);
301+
}
302+
Some(signature) => {
303+
info!("CertifierService::create_certificate: multi-signature created for open message {signed_entity_type:?}");
304+
signature
305+
}
306+
};
298307

299-
return Ok(None);
300-
}
301-
let signature = signature.unwrap();
302308
let signer_ids = open_message.get_signers_id();
303309
let signers = multi_signer
304310
.get_signers_with_stake()
@@ -322,7 +328,6 @@ impl CertifierService for MithrilCertifierService {
322328
sealed_at,
323329
signers,
324330
);
325-
let multi_signature = key_encode_hex(signature).map_err(CertifierServiceError::Codec)?;
326331
let parent_certificate_hash = self
327332
.certificate_repository
328333
.get_master_certificate_for_epoch(open_message.epoch)
@@ -339,8 +344,7 @@ impl CertifierService for MithrilCertifierService {
339344
multi_signer
340345
.compute_stake_distribution_aggregate_verification_key()
341346
.await?,
342-
multi_signature,
343-
"".to_string(),
347+
CertificateSignature::MultiSignature(multi_signature),
344348
);
345349

346350
self.certificate_verifier

mithril-aggregator/src/services/signed_entity.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ mod tests {
260260
Arc::new(mock_mithril_stake_distribution_artifact_builder),
261261
Arc::new(mock_cardano_immutable_files_full_artifact_builder),
262262
);
263-
let certificate = Certificate::default();
263+
let certificate = fake_data::certificate("hash".to_string());
264264

265265
let signed_entity_type = SignedEntityType::MithrilStakeDistribution(Epoch(1));
266266
let artifact = artifact_builder_service
@@ -297,7 +297,7 @@ mod tests {
297297
Arc::new(mock_mithril_stake_distribution_artifact_builder),
298298
Arc::new(mock_cardano_immutable_files_full_artifact_builder),
299299
);
300-
let certificate = Certificate::default();
300+
let certificate = fake_data::certificate("hash".to_string());
301301

302302
let signed_entity_type = SignedEntityType::CardanoImmutableFilesFull(Beacon::default());
303303
let artifact = artifact_builder_service

mithril-aggregator/src/tools/certificates_hash_migrator.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -339,41 +339,41 @@ mod test {
339339
let expected = vec![
340340
(
341341
dummy_genesis(
342-
"b242ffde83e197319b68594c886aaaa8f1324e0e02b8226f982e866717f4d85d",
342+
"b9263d7c2e94f6a62802b6521b30967e7e7a7fdccf02026dc70a0ffbc46da393",
343343
1,
344344
1,
345345
),
346346
None,
347347
),
348348
(
349349
dummy_certificate(
350-
"cff5adad248581d0b3706a48b1000f0d8caa590077b73ccc630339db07665926",
351-
"b242ffde83e197319b68594c886aaaa8f1324e0e02b8226f982e866717f4d85d",
350+
"5d73905d314abc86451a399d4f1820201d4c20076d8fb0e4b277ffe5f5e4dc07",
351+
"b9263d7c2e94f6a62802b6521b30967e7e7a7fdccf02026dc70a0ffbc46da393",
352352
1,
353353
2,
354354
),
355355
Some(SignedEntityRecord {
356356
signed_entity_id: "signed_entity_id".to_string(),
357357
signed_entity_type: MithrilStakeDistribution(Epoch(1)),
358358
certificate_id:
359-
"cff5adad248581d0b3706a48b1000f0d8caa590077b73ccc630339db07665926"
359+
"5d73905d314abc86451a399d4f1820201d4c20076d8fb0e4b277ffe5f5e4dc07"
360360
.to_string(),
361361
artifact: "".to_string(),
362362
created_at: Default::default(),
363363
}),
364364
),
365365
(
366366
dummy_certificate(
367-
"d2c74da93514464722d58aaadfc5950180cf7f6484dfc648287eb56a7c2edf08",
368-
"cff5adad248581d0b3706a48b1000f0d8caa590077b73ccc630339db07665926",
367+
"583803ea5050f781de38c25d8773628ccf5c6fd737b4d984db2d41444bfdbf39",
368+
"5d73905d314abc86451a399d4f1820201d4c20076d8fb0e4b277ffe5f5e4dc07",
369369
2,
370370
3,
371371
),
372372
Some(SignedEntityRecord {
373373
signed_entity_id: "signed_entity_id".to_string(),
374374
signed_entity_type: MithrilStakeDistribution(Epoch(2)),
375375
certificate_id:
376-
"d2c74da93514464722d58aaadfc5950180cf7f6484dfc648287eb56a7c2edf08"
376+
"583803ea5050f781de38c25d8773628ccf5c6fd737b4d984db2d41444bfdbf39"
377377
.to_string(),
378378
artifact: "".to_string(),
379379
created_at: Default::default(),

mithril-aggregator/src/tools/genesis.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::database::provider::CertificateRepository;
1515
use crate::{MultiSigner, ProtocolParametersStorer};
1616

1717
pub struct GenesisToolsDependency {
18-
/// Multisigner service.
18+
/// Multi-signer service.
1919
pub multi_signer: Arc<RwLock<dyn MultiSigner>>,
2020

2121
/// Beacon provider service.

mithril-aggregator/tests/test_extensions/runtime_tester.rs

+17-16
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ use mithril_common::{
99
crypto_helper::ProtocolGenesisSigner,
1010
digesters::{DumbImmutableDigester, DumbImmutableFileObserver},
1111
entities::{
12-
Beacon, Certificate, Epoch, ImmutableFileNumber, SignedEntityTypeDiscriminants, Snapshot,
13-
StakeDistribution,
12+
Beacon, Certificate, CertificateSignature, Epoch, ImmutableFileNumber,
13+
SignedEntityTypeDiscriminants, Snapshot, StakeDistribution,
1414
},
1515
era::{adapters::EraReaderDummyAdapter, EraMarker, EraReader, SupportedEra},
1616
test_utils::{
@@ -389,19 +389,20 @@ impl RuntimeTester {
389389
.ok_or("No certificate have been produced by the aggregator")?
390390
.clone();
391391

392-
let signed_entity = if certificate.genesis_signature.is_empty() {
393-
let record = self
394-
.deps_builder
395-
.get_signed_entity_storer()
396-
.await
397-
.unwrap()
398-
.get_signed_entity_by_certificate_id(&certificate.hash)
399-
.await
400-
.unwrap()
401-
.ok_or("A signed entity must exist for non genesis certificate")?;
402-
Some(record)
403-
} else {
404-
None
392+
let signed_entity = match &certificate.signature {
393+
CertificateSignature::GenesisSignature(_) => None,
394+
CertificateSignature::MultiSignature(_) => {
395+
let record = self
396+
.deps_builder
397+
.get_signed_entity_storer()
398+
.await
399+
.unwrap()
400+
.get_signed_entity_by_certificate_id(&certificate.hash)
401+
.await
402+
.unwrap()
403+
.ok_or("A signed entity must exist for non genesis certificate")?;
404+
Some(record)
405+
}
405406
};
406407

407408
Ok((certificate, signed_entity))
@@ -413,7 +414,7 @@ impl RuntimeTester {
413414
self.get_last_certificate_with_signed_entity().await?;
414415

415416
let expected_certificate = match signed_entity_record {
416-
None if !certificate.genesis_signature.is_empty() => ExpectedCertificate::new_genesis(
417+
None if certificate.is_genesis() => ExpectedCertificate::new_genesis(
417418
certificate.beacon,
418419
certificate.aggregate_verification_key,
419420
),

mithril-client/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-client"
3-
version = "0.3.25"
3+
version = "0.3.26"
44
description = "A Mithril Client"
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-client/src/aggregator_client/certificate_client.rs

+12-2
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ impl CertificateRetriever for CertificateClient {
6666

6767
#[cfg(test)]
6868
mod tests {
69+
use mithril_common::entities::CertificateSignature;
6970
use mithril_common::messages::{CertificateMetadataMessage, SignerWithStakeMessagePart};
7071
use mithril_common::test_utils::fake_data;
7172

@@ -83,6 +84,15 @@ mod tests {
8384
http_client
8485
.expect_get_content()
8586
.return_once(move |_| {
87+
let (multi_signature, genesis_signature) = match certificate.signature {
88+
CertificateSignature::GenesisSignature(signature) => {
89+
(String::new(), signature.try_into().unwrap())
90+
}
91+
CertificateSignature::MultiSignature(signature) => {
92+
(signature.to_json_hex().unwrap(), String::new())
93+
}
94+
};
95+
8696
let message = CertificateMessage {
8797
hash: certificate_hash.clone(),
8898
previous_hash: previous_hash.clone(),
@@ -99,8 +109,8 @@ mod tests {
99109
protocol_message: certificate.protocol_message.clone(),
100110
signed_message: certificate.signed_message.clone(),
101111
aggregate_verification_key: certificate.aggregate_verification_key.clone(),
102-
multi_signature: certificate.multi_signature.clone(),
103-
genesis_signature: certificate.genesis_signature,
112+
multi_signature,
113+
genesis_signature,
104114
};
105115
Ok(serde_json::to_string(&message).unwrap())
106116
})

mithril-client/src/message_adapters/from_certificate_message_adapter.rs

+11-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use mithril_common::entities::{Certificate, CertificateMetadata};
1+
use mithril_common::entities::{Certificate, CertificateMetadata, CertificateSignature};
22
use mithril_common::messages::{
33
CertificateMessage, SignerWithStakeMessagePart, TryFromMessageAdapter,
44
};
@@ -28,8 +28,15 @@ impl TryFromMessageAdapter<CertificateMessage, Certificate> for FromCertificateM
2828
protocol_message: certificate_message.protocol_message,
2929
signed_message: certificate_message.signed_message,
3030
aggregate_verification_key: certificate_message.aggregate_verification_key,
31-
multi_signature: certificate_message.multi_signature,
32-
genesis_signature: certificate_message.genesis_signature,
31+
signature: if certificate_message.genesis_signature.is_empty() {
32+
CertificateSignature::MultiSignature(
33+
certificate_message.multi_signature.try_into()?,
34+
)
35+
} else {
36+
CertificateSignature::GenesisSignature(
37+
certificate_message.genesis_signature.try_into()?,
38+
)
39+
},
3340
};
3441

3542
Ok(certificate)
@@ -44,7 +51,7 @@ mod tests {
4451
fn adapt_ok() {
4552
let certificate_message = CertificateMessage {
4653
hash: "hash123".to_string(),
47-
..Default::default()
54+
..CertificateMessage::dummy()
4855
};
4956
let certificate = FromCertificateMessageAdapter::try_adapt(certificate_message).unwrap();
5057

mithril-client/src/services/mock.rs

+2-16
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use mithril_common::certificate_chain::{
77
};
88
use mithril_common::crypto_helper::ProtocolGenesisVerifier;
99
use mithril_common::digesters::{ImmutableDigester, ImmutableDigesterError};
10-
use mithril_common::entities::{Beacon, Certificate, ProtocolMessage, ProtocolParameters};
10+
use mithril_common::entities::{Beacon, Certificate, ProtocolMessage};
1111
use mockall::mock;
1212

1313
mock! {
@@ -28,26 +28,12 @@ mock! {
2828

2929
#[async_trait]
3030
impl CertificateVerifier for CertificateVerifierImpl {
31-
fn verify_multi_signature(
32-
&self,
33-
message: &[u8],
34-
multi_signature: &str,
35-
aggregate_verification_key: &str,
36-
protocol_parameters: &ProtocolParameters,
37-
) -> Result<(), CertificateVerifierError>;
38-
3931
async fn verify_genesis_certificate(
4032
&self,
41-
certificate: &Certificate,
33+
genesis_certificate: &Certificate,
4234
genesis_verifier: &ProtocolGenesisVerifier,
4335
) -> Result<(), CertificateVerifierError>;
4436

45-
async fn verify_standard_certificate(
46-
&self,
47-
certificate: &Certificate,
48-
certificate_retriever: Arc<dyn CertificateRetriever>,
49-
) -> Result<Option<Certificate>, CertificateVerifierError>;
50-
5137
async fn verify_certificate(
5238
&self,
5339
certificate: &Certificate,

0 commit comments

Comments
 (0)