mithril_aggregator/dependency_injection/containers/
serve.rs1use slog::Logger;
2use std::sync::Arc;
3use tokio::sync::RwLock;
4
5use mithril_common::{
6 api_version::APIVersionProvider,
7 entities::{Epoch, SignerWithStake, StakeDistribution},
8 signable_builder::SignableBuilderService,
9 test::builder::MithrilFixture,
10};
11
12use mithril_era::{EraChecker, EraReader};
13use mithril_persistence::store::StakeStorer;
14use mithril_signed_entity_lock::SignedEntityTypeLock;
15use mithril_ticker::TickerService;
16
17use crate::{
18 EpochSettingsStorer, MetricsService, SignerRegisterer, SignerRegistrationRoundOpener,
19 SingleSignatureAuthenticator, VerificationKeyStorer,
20 database::repository::{
21 CertificateRepository, SignedEntityStorer, SignerGetter, StakePoolStore,
22 },
23 event_store::{EventMessage, TransmitterService},
24 services::{
25 CertificateChainSynchronizer, CertifierService, EpochService, LegacyProverService,
26 MessageService, ProverService, SignedEntityService, SignerRecorder, SignerSynchronizer,
27 StakeDistributionService, UpkeepService,
28 },
29};
30
31pub type EpochServiceWrapper = Arc<RwLock<dyn EpochService>>;
33
34pub struct ServeCommandDependenciesContainer {
36 pub(crate) root_logger: Logger,
38
39 pub(crate) stake_store: Arc<StakePoolStore>,
42
43 pub certificate_repository: Arc<CertificateRepository>,
46
47 pub verification_key_store: Arc<dyn VerificationKeyStorer>,
49
50 pub epoch_settings_storer: Arc<dyn EpochSettingsStorer>,
52
53 pub(crate) certificate_chain_synchronizer: Arc<dyn CertificateChainSynchronizer>,
55
56 pub signer_registerer: Arc<dyn SignerRegisterer>,
58
59 pub(crate) signer_synchronizer: Arc<dyn SignerSynchronizer>,
61
62 pub(crate) signer_registration_round_opener: Arc<dyn SignerRegistrationRoundOpener>,
64
65 pub(crate) era_checker: Arc<EraChecker>,
67
68 pub(crate) era_reader: Arc<EraReader>,
70
71 pub(crate) event_transmitter: Arc<TransmitterService<EventMessage>>,
73
74 pub(crate) api_version_provider: Arc<APIVersionProvider>,
76
77 pub(crate) stake_distribution_service: Arc<dyn StakeDistributionService>,
79
80 pub(crate) signer_recorder: Arc<dyn SignerRecorder>,
82
83 pub signable_builder_service: Arc<dyn SignableBuilderService>,
85
86 pub(crate) signed_entity_service: Arc<dyn SignedEntityService>,
88
89 pub certifier_service: Arc<dyn CertifierService>,
91
92 pub(crate) epoch_service: EpochServiceWrapper,
94
95 pub(crate) ticker_service: Arc<dyn TickerService>,
97
98 pub signed_entity_storer: Arc<dyn SignedEntityStorer>,
100
101 pub(crate) signer_getter: Arc<dyn SignerGetter>,
103
104 pub message_service: Arc<dyn MessageService>,
106
107 pub legacy_prover_service: Arc<dyn LegacyProverService>,
109
110 pub prover_service: Arc<dyn ProverService>,
112
113 pub signed_entity_type_lock: Arc<SignedEntityTypeLock>,
115
116 pub(crate) upkeep_service: Arc<dyn UpkeepService>,
118
119 pub(crate) single_signer_authenticator: Arc<SingleSignatureAuthenticator>,
121
122 pub(crate) metrics_service: Arc<MetricsService>,
124}
125
126#[doc(hidden)]
127impl ServeCommandDependenciesContainer {
128 pub async fn init_state_from_fixture(
139 &self,
140 fixture: &MithrilFixture,
141 next_aggregation_epoch: Epoch,
142 ) {
143 self.init_state_from_fixture_internal(
144 fixture,
145 [
146 next_aggregation_epoch.offset_to_signer_retrieval_epoch().unwrap(),
147 next_aggregation_epoch,
148 next_aggregation_epoch.offset_to_recording_epoch(),
149 ],
150 )
151 .await
152 }
153
154 pub async fn init_state_from_fixture_for_genesis(
165 &self,
166 fixture: &MithrilFixture,
167 next_aggregation_epoch: Epoch,
168 ) {
169 self.init_state_from_fixture_internal(
170 fixture,
171 [
172 next_aggregation_epoch.offset_to_signer_retrieval_epoch().unwrap(),
173 next_aggregation_epoch,
174 ],
175 )
176 .await
177 }
178
179 async fn init_state_from_fixture_internal<const N: usize>(
180 &self,
181 fixture: &MithrilFixture,
182 epochs_to_fill: [Epoch; N],
183 ) {
184 for epoch in epochs_to_fill {
185 self.fill_verification_key_store(epoch, &fixture.signers_with_stake())
186 .await;
187 self.fill_stakes_store(epoch, fixture.signers_with_stake()).await;
188 }
189 }
190
191 async fn fill_verification_key_store(&self, target_epoch: Epoch, signers: &[SignerWithStake]) {
192 for signer in signers {
193 self.signer_recorder
194 .record_signer_registration(signer.party_id.clone())
195 .await
196 .expect("record_signer_registration should not fail");
197 self.verification_key_store
198 .save_verification_key(target_epoch, signer.clone())
199 .await
200 .expect("save_verification_key should not fail");
201 }
202 }
203
204 async fn fill_stakes_store(&self, target_epoch: Epoch, signers: Vec<SignerWithStake>) {
205 let _ = self
206 .stake_store
207 .save_stakes(
208 target_epoch,
209 signers.iter().map(|s| s.into()).collect::<StakeDistribution>(),
210 )
211 .await
212 .expect("save_stakes should not fail");
213 }
214}
215
216#[cfg(test)]
217pub(crate) mod tests {
218 use std::path::PathBuf;
219
220 use crate::{ServeCommandConfiguration, dependency_injection::DependenciesBuilder};
221
222 use super::*;
223
224 #[macro_export]
227 macro_rules! initialize_dependencies {
228 () => {{ initialize_dependencies(mithril_common::temp_dir!()) }};
229 }
230
231 pub async fn initialize_dependencies(tmp_path: PathBuf) -> ServeCommandDependenciesContainer {
232 let config = ServeCommandConfiguration::new_sample(tmp_path);
233
234 let mut builder = DependenciesBuilder::new_with_stdout_logger(Arc::new(config));
235
236 builder.build_serve_dependencies_container().await.unwrap()
237 }
238}