Skip to content

Commit 715f04d

Browse files
authored
Merge pull request #655 from input-output-hk/ensemble/642-extract-signer-registration
Extract signer registration from muti-signer in Aggregator
2 parents a673f3e + 0228f0f commit 715f04d

File tree

13 files changed

+511
-226
lines changed

13 files changed

+511
-226
lines changed

mithril-aggregator/src/command_args.rs

Lines changed: 19 additions & 20 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(
@@ -50,7 +45,7 @@ fn setup_genesis_dependencies(
5045
);
5146
let immutable_file_observer = Arc::new(ImmutableFileSystemObserver::new(&config.db_directory));
5247
let beacon_provider = Arc::new(BeaconProviderImpl::new(
53-
chain_observer.clone(),
48+
chain_observer,
5449
immutable_file_observer,
5550
config.get_network()?,
5651
));
@@ -90,7 +85,6 @@ fn setup_genesis_dependencies(
9085
stake_store,
9186
single_signature_store,
9287
protocol_parameters_store.clone(),
93-
chain_observer,
9488
)));
9589
let dependencies = GenesisToolsDependency {
9690
beacon_provider,
@@ -370,13 +364,16 @@ impl ServeCommand {
370364
stake_store.clone(),
371365
single_signature_store.clone(),
372366
protocol_parameters_store.clone(),
373-
chain_observer.clone(),
374367
)));
375368
let certificate_verifier = Arc::new(MithrilCertificateVerifier::new(slog_scope::logger()));
376369
let genesis_verification_key = key_decode_hex(&config.genesis_verification_key)?;
377370
let genesis_verifier = Arc::new(ProtocolGenesisVerifier::from_verification_key(
378371
genesis_verification_key,
379372
));
373+
let signer_registerer = Arc::new(MithrilSignerRegisterer::new(
374+
chain_observer.clone(),
375+
verification_key_store.clone(),
376+
));
380377

381378
// Snapshotter - Ensure its ongoing snapshot directory exist
382379
let ongoing_snapshot_directory = config.snapshot_directory.join("pending_snapshot");
@@ -408,6 +405,8 @@ impl ServeCommand {
408405
snapshotter,
409406
certificate_verifier,
410407
genesis_verifier,
408+
signer_registerer: signer_registerer.clone(),
409+
signer_registration_round_opener: signer_registerer.clone(),
411410
};
412411
let dependency_manager = Arc::new(dependency_manager);
413412

mithril-aggregator/src/dependency.rs

Lines changed: 17 additions & 6 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};
@@ -314,13 +320,11 @@ pub mod tests {
314320
Box::new(MemoryAdapter::new(None).unwrap()),
315321
None,
316322
));
317-
let chain_observer = Arc::new(FakeObserver::default());
318323
let multi_signer = MultiSignerImpl::new(
319324
verification_key_store.clone(),
320325
stake_store.clone(),
321326
single_signature_store.clone(),
322327
protocol_parameters_store.clone(),
323-
chain_observer,
324328
);
325329
let multi_signer = Arc::new(RwLock::new(multi_signer));
326330
let immutable_file_observer = Arc::new(DumbImmutableFileObserver::default());
@@ -331,6 +335,11 @@ pub mod tests {
331335
CardanoNetwork::TestNet(42),
332336
));
333337
let certificate_verifier = Arc::new(MithrilCertificateVerifier::new(slog_scope::logger()));
338+
let signer_registerer = Arc::new(MithrilSignerRegisterer::new(
339+
chain_observer.clone(),
340+
verification_key_store.clone(),
341+
));
342+
334343
let dependency_manager = DependencyManager {
335344
config,
336345
snapshot_store,
@@ -349,6 +358,8 @@ pub mod tests {
349358
snapshotter: Arc::new(DumbSnapshotter::new()),
350359
certificate_verifier,
351360
genesis_verifier,
361+
signer_registerer: signer_registerer.clone(),
362+
signer_registration_round_opener: signer_registerer,
352363
};
353364

354365
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/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ mod dependency;
1818
mod http_server;
1919
mod multi_signer;
2020
mod runtime;
21+
mod signer_registerer;
2122
mod snapshot_stores;
2223
mod snapshot_uploaders;
2324
mod snapshotter;
@@ -35,6 +36,10 @@ pub use command_args::MainOpts;
3536
pub use dependency::DependencyManager;
3637
pub use http_server::Server;
3738
pub use runtime::{AggregatorConfig, AggregatorRunner, AggregatorRunnerTrait, AggregatorRuntime};
39+
pub use signer_registerer::{
40+
MithrilSignerRegisterer, SignerRegisterer, SignerRegistrationError, SignerRegistrationRound,
41+
SignerRegistrationRoundOpener,
42+
};
3843
pub use snapshot_uploaders::{
3944
DumbSnapshotUploader, LocalSnapshotUploader, RemoteSnapshotUploader, SnapshotUploader,
4045
};

0 commit comments

Comments
 (0)