Skip to content

Commit c7d3f68

Browse files
committed
Wire SignerRegisterer in Aggregator
In state machine and in HTTP server.
1 parent 2069a5f commit c7d3f68

File tree

10 files changed

+195
-68
lines changed

10 files changed

+195
-68
lines changed

mithril-aggregator/src/command_args.rs

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,23 @@ use std::sync::Arc;
99
use tokio::sync::RwLock;
1010
use tokio::time::Duration;
1111

12-
use mithril_common::certificate_chain::MithrilCertificateVerifier;
13-
use mithril_common::chain_observer::{CardanoCliRunner, ChainObserver};
14-
use mithril_common::crypto_helper::ProtocolGenesisVerifier;
15-
use mithril_common::database::{ApplicationNodeType, DatabaseVersionChecker};
16-
use mithril_common::digesters::{CardanoImmutableDigester, ImmutableFileSystemObserver};
17-
use mithril_common::entities::{Epoch, HexEncodedGenesisSecretKey};
18-
use mithril_common::store::adapter::SQLiteAdapter;
19-
use mithril_common::store::StakeStore;
2012
use mithril_common::{
21-
crypto_helper::{key_decode_hex, ProtocolGenesisSigner},
13+
certificate_chain::MithrilCertificateVerifier,
14+
chain_observer::{CardanoCliRunner, ChainObserver},
15+
crypto_helper::{key_decode_hex, ProtocolGenesisSigner, ProtocolGenesisVerifier},
16+
database::{ApplicationNodeType, DatabaseVersionChecker},
17+
digesters::{CardanoImmutableDigester, ImmutableFileSystemObserver},
18+
entities::{Epoch, HexEncodedGenesisSecretKey},
19+
store::{adapter::SQLiteAdapter, StakeStore},
2220
BeaconProviderImpl,
2321
};
2422

25-
use crate::tools::GenesisToolsDependency;
2623
use crate::{
27-
tools::GenesisTools, AggregatorConfig, AggregatorRunner, AggregatorRuntime,
28-
CertificatePendingStore, Configuration, DependencyManager, GenesisConfiguration,
29-
ProtocolParametersStore, Server,
30-
};
31-
use crate::{
32-
CertificateStore, DefaultConfiguration, GzipSnapshotter, MultiSignerImpl,
33-
ProtocolParametersStorer, SingleSignatureStore, VerificationKeyStore,
24+
tools::{GenesisTools, GenesisToolsDependency},
25+
AggregatorConfig, AggregatorRunner, AggregatorRuntime, CertificatePendingStore,
26+
CertificateStore, Configuration, DefaultConfiguration, DependencyManager, GenesisConfiguration,
27+
GzipSnapshotter, MithrilSignerRegisterer, MultiSignerImpl, ProtocolParametersStore,
28+
ProtocolParametersStorer, Server, SingleSignatureStore, VerificationKeyStore,
3429
};
3530

3631
fn setup_genesis_dependencies(
@@ -377,6 +372,10 @@ impl ServeCommand {
377372
let genesis_verifier = Arc::new(ProtocolGenesisVerifier::from_verification_key(
378373
genesis_verification_key,
379374
));
375+
let signer_registerer = Arc::new(MithrilSignerRegisterer::new(
376+
chain_observer.clone(),
377+
verification_key_store.clone(),
378+
));
380379

381380
// Snapshotter - Ensure its ongoing snapshot directory exist
382381
let ongoing_snapshot_directory = config.snapshot_directory.join("pending_snapshot");
@@ -408,6 +407,8 @@ impl ServeCommand {
408407
snapshotter,
409408
certificate_verifier,
410409
genesis_verifier,
410+
signer_registerer: signer_registerer.clone(),
411+
signer_registration_round_opener: signer_registerer.clone(),
411412
};
412413
let dependency_manager = Arc::new(dependency_manager);
413414

mithril-aggregator/src/dependency.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ use std::collections::HashMap;
1212
use std::sync::Arc;
1313
use tokio::sync::RwLock;
1414

15-
use crate::configuration::*;
1615
use crate::multi_signer::MultiSigner;
1716
use crate::snapshot_stores::SnapshotStore;
1817
use crate::snapshot_uploaders::SnapshotUploader;
1918
use crate::{
20-
CertificatePendingStore, CertificateStore, ProtocolParametersStore, ProtocolParametersStorer,
19+
configuration::*, CertificatePendingStore, CertificateStore, ProtocolParametersStore,
20+
ProtocolParametersStorer, SignerRegisterer, SignerRegistrationRoundOpener,
2121
SingleSignatureStore, Snapshotter, VerificationKeyStore, VerificationKeyStorer,
2222
};
2323

@@ -76,6 +76,12 @@ pub struct DependencyManager {
7676

7777
/// Genesis signature verifier service.
7878
pub genesis_verifier: Arc<ProtocolGenesisVerifier>,
79+
80+
/// Signer registerer service
81+
pub signer_registerer: Arc<dyn SignerRegisterer>,
82+
83+
/// Signer registration round opener service
84+
pub signer_registration_round_opener: Arc<dyn SignerRegistrationRoundOpener>,
7985
}
8086

8187
#[doc(hidden)]
@@ -248,8 +254,8 @@ pub mod tests {
248254
use crate::{
249255
AggregatorConfig, CertificatePendingStore, CertificateStore, Configuration,
250256
DependencyManager, DumbSnapshotUploader, DumbSnapshotter, LocalSnapshotStore,
251-
MultiSignerImpl, ProtocolParametersStore, SingleSignatureStore, SnapshotStoreType,
252-
SnapshotUploaderType, VerificationKeyStore,
257+
MithrilSignerRegisterer, MultiSignerImpl, ProtocolParametersStore, SingleSignatureStore,
258+
SnapshotStoreType, SnapshotUploaderType, VerificationKeyStore,
253259
};
254260
use mithril_common::certificate_chain::MithrilCertificateVerifier;
255261
use mithril_common::crypto_helper::{key_encode_hex, ProtocolGenesisSigner};
@@ -331,6 +337,11 @@ pub mod tests {
331337
CardanoNetwork::TestNet(42),
332338
));
333339
let certificate_verifier = Arc::new(MithrilCertificateVerifier::new(slog_scope::logger()));
340+
let signer_registerer = Arc::new(MithrilSignerRegisterer::new(
341+
chain_observer.clone(),
342+
verification_key_store.clone(),
343+
));
344+
334345
let dependency_manager = DependencyManager {
335346
config,
336347
snapshot_store,
@@ -349,6 +360,8 @@ pub mod tests {
349360
snapshotter: Arc::new(DumbSnapshotter::new()),
350361
certificate_verifier,
351362
genesis_verifier,
363+
signer_registerer: signer_registerer.clone(),
364+
signer_registration_round_opener: signer_registerer,
352365
};
353366

354367
let config = AggregatorConfig::new(

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
use crate::dependency::MultiSignerWrapper;
21
use crate::{
3-
CertificatePendingStore, CertificateStore, Configuration, DependencyManager,
4-
ProtocolParametersStore, SnapshotStore,
2+
dependency::MultiSignerWrapper, CertificatePendingStore, CertificateStore, Configuration,
3+
DependencyManager, ProtocolParametersStore, SignerRegisterer, SnapshotStore,
54
};
65
use std::convert::Infallible;
76
use std::sync::Arc;
@@ -42,6 +41,13 @@ pub fn with_multi_signer(
4241
warp::any().map(move || dependency_manager.multi_signer.clone())
4342
}
4443

44+
/// With signer registerer middleware
45+
pub fn with_signer_registerer(
46+
dependency_manager: Arc<DependencyManager>,
47+
) -> impl Filter<Extract = (Arc<dyn SignerRegisterer>,), Error = Infallible> + Clone {
48+
warp::any().map(move || dependency_manager.signer_registerer.clone())
49+
}
50+
4551
/// With config middleware
4652
pub fn with_config(
4753
dependency_manager: Arc<DependencyManager>,

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

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,41 +16,39 @@ fn register_signer(
1616
warp::path!("register-signer")
1717
.and(warp::post())
1818
.and(warp::body::json())
19-
.and(middlewares::with_multi_signer(dependency_manager))
19+
.and(middlewares::with_signer_registerer(dependency_manager))
2020
.and_then(handlers::register_signer)
2121
}
2222

2323
mod handlers {
24-
use crate::dependency::MultiSignerWrapper;
25-
use crate::http_server::routes::reply;
26-
use crate::ProtocolError;
24+
use crate::{http_server::routes::reply, SignerRegisterer, SignerRegistrationError};
2725
use mithril_common::entities;
2826
use slog_scope::{debug, warn};
2927
use std::convert::Infallible;
28+
use std::sync::Arc;
3029
use warp::http::StatusCode;
3130

3231
/// Register Signer
3332
pub async fn register_signer(
3433
signer: entities::Signer,
35-
multi_signer: MultiSignerWrapper,
34+
signer_registerer: Arc<dyn SignerRegisterer>,
3635
) -> Result<impl warp::Reply, Infallible> {
3736
debug!("⇄ HTTP SERVER: register_signer/{:?}", signer);
3837

39-
let mut multi_signer = multi_signer.write().await;
40-
match multi_signer.register_signer(&signer).await {
38+
match signer_registerer.register_signer(&signer).await {
4139
Ok(()) => Ok(reply::empty(StatusCode::CREATED)),
42-
Err(ProtocolError::ExistingSigner()) => {
40+
Err(SignerRegistrationError::ExistingSigner()) => {
4341
debug!("register_signer::already_registered");
4442
Ok(reply::empty(StatusCode::CREATED))
4543
}
46-
Err(ProtocolError::Codec(err)) => {
44+
Err(SignerRegistrationError::Codec(err)) => {
4745
warn!("register_signer::failed_signer_decoding"; "error" => ?err);
4846
Ok(reply::bad_request(
4947
"failed_signer_decoding".to_string(),
5048
err,
5149
))
5250
}
53-
Err(ProtocolError::FailedSignerRegistration(err)) => {
51+
Err(SignerRegistrationError::FailedSignerRegistration(err)) => {
5452
warn!("register_signer::failed_signer_registration"; "error" => ?err);
5553
Ok(reply::bad_request(
5654
"failed_signer_registration".to_string(),
@@ -72,14 +70,13 @@ mod tests {
7270
use mithril_common::apispec::APISpec;
7371
use mithril_common::crypto_helper::ProtocolRegistrationError;
7472
use mithril_common::fake_data;
75-
use tokio::sync::RwLock;
7673
use warp::http::Method;
7774
use warp::test::request;
7875

7976
use super::*;
8077
use crate::http_server::SERVER_BASE_PATH;
81-
use crate::multi_signer::MockMultiSigner;
82-
use crate::{initialize_dependencies, ProtocolError};
78+
use crate::signer_registerer::MockSignerRegisterer;
79+
use crate::{initialize_dependencies, SignerRegistrationError};
8380

8481
fn setup_router(
8582
dependency_manager: Arc<DependencyManager>,
@@ -96,12 +93,12 @@ mod tests {
9693

9794
#[tokio::test]
9895
async fn test_register_signer_post_ok() {
99-
let mut mock_multi_signer = MockMultiSigner::new();
100-
mock_multi_signer
96+
let mut mock_signer_registerer = MockSignerRegisterer::new();
97+
mock_signer_registerer
10198
.expect_register_signer()
10299
.return_once(|_| Ok(()));
103100
let (mut dependency_manager, _) = initialize_dependencies().await;
104-
dependency_manager.multi_signer = Arc::new(RwLock::new(mock_multi_signer));
101+
dependency_manager.signer_registerer = Arc::new(mock_signer_registerer);
105102

106103
let signer = &fake_data::signers(1)[0];
107104

@@ -126,12 +123,12 @@ mod tests {
126123

127124
#[tokio::test]
128125
async fn test_register_signer_post_ok_existing() {
129-
let mut mock_multi_signer = MockMultiSigner::new();
130-
mock_multi_signer
126+
let mut mock_signer_registerer = MockSignerRegisterer::new();
127+
mock_signer_registerer
131128
.expect_register_signer()
132-
.return_once(|_| Err(ProtocolError::ExistingSigner()));
129+
.return_once(|_| Err(SignerRegistrationError::ExistingSigner()));
133130
let (mut dependency_manager, _) = initialize_dependencies().await;
134-
dependency_manager.multi_signer = Arc::new(RwLock::new(mock_multi_signer));
131+
dependency_manager.signer_registerer = Arc::new(mock_signer_registerer);
135132

136133
let signer = &fake_data::signers(1)[0];
137134

@@ -156,14 +153,16 @@ mod tests {
156153

157154
#[tokio::test]
158155
async fn test_register_signer_post_ko_400() {
159-
let mut mock_multi_signer = MockMultiSigner::new();
160-
mock_multi_signer.expect_register_signer().return_once(|_| {
161-
Err(ProtocolError::FailedSignerRegistration(
162-
ProtocolRegistrationError::OpCertInvalid,
163-
))
164-
});
156+
let mut mock_signer_registerer = MockSignerRegisterer::new();
157+
mock_signer_registerer
158+
.expect_register_signer()
159+
.return_once(|_| {
160+
Err(SignerRegistrationError::FailedSignerRegistration(
161+
ProtocolRegistrationError::OpCertInvalid,
162+
))
163+
});
165164
let (mut dependency_manager, _) = initialize_dependencies().await;
166-
dependency_manager.multi_signer = Arc::new(RwLock::new(mock_multi_signer));
165+
dependency_manager.signer_registerer = Arc::new(mock_signer_registerer);
167166

168167
let signer = fake_data::signers(1)[0].clone();
169168

@@ -188,12 +187,16 @@ mod tests {
188187

189188
#[tokio::test]
190189
async fn test_register_signer_post_ko_500() {
191-
let mut mock_multi_signer = MockMultiSigner::new();
192-
mock_multi_signer
190+
let mut mock_signer_registerer = MockSignerRegisterer::new();
191+
mock_signer_registerer
193192
.expect_register_signer()
194-
.return_once(|_| Err(ProtocolError::Core("an error occurred".to_string())));
193+
.return_once(|_| {
194+
Err(SignerRegistrationError::ChainObserver(
195+
"an error occurred".to_string(),
196+
))
197+
});
195198
let (mut dependency_manager, _) = initialize_dependencies().await;
196-
dependency_manager.multi_signer = Arc::new(RwLock::new(mock_multi_signer));
199+
dependency_manager.signer_registerer = Arc::new(mock_signer_registerer);
197200

198201
let signer = &fake_data::signers(1)[0];
199202

mithril-aggregator/src/runtime/error.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::certificate_creator::CertificateCreationError;
22
use crate::snapshot_stores::SnapshotStoreError;
3-
use crate::{ProtocolError, SnapshotError};
3+
use crate::{ProtocolError, SignerRegistrationError, SnapshotError};
44

55
use mithril_common::certificate_chain::CertificateVerifierError;
66
use mithril_common::chain_observer::ChainObserverError;
@@ -57,6 +57,9 @@ pub enum RuntimeError {
5757
#[error("beacon comparison error: {0}")]
5858
BeaconComparisonError(#[from] BeaconComparisonError),
5959

60+
#[error("signer registration error: {0}")]
61+
SignerRegistration(#[from] SignerRegistrationError),
62+
6063
#[error("general error: {0}")]
6164
General(Box<dyn StdError + Sync + Send>),
6265
}

0 commit comments

Comments
 (0)