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, MessageService,
26 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 prover_service: Arc<dyn ProverService>,
109
110 pub signed_entity_type_lock: Arc<SignedEntityTypeLock>,
112
113 pub(crate) upkeep_service: Arc<dyn UpkeepService>,
115
116 pub(crate) single_signer_authenticator: Arc<SingleSignatureAuthenticator>,
118
119 pub(crate) metrics_service: Arc<MetricsService>,
121}
122
123#[doc(hidden)]
124impl ServeCommandDependenciesContainer {
125 pub async fn init_state_from_fixture(
136 &self,
137 fixture: &MithrilFixture,
138 next_aggregation_epoch: Epoch,
139 ) {
140 self.init_state_from_fixture_internal(
141 fixture,
142 [
143 next_aggregation_epoch.offset_to_signer_retrieval_epoch().unwrap(),
144 next_aggregation_epoch,
145 next_aggregation_epoch.offset_to_recording_epoch(),
146 ],
147 )
148 .await
149 }
150
151 pub async fn init_state_from_fixture_for_genesis(
162 &self,
163 fixture: &MithrilFixture,
164 next_aggregation_epoch: Epoch,
165 ) {
166 self.init_state_from_fixture_internal(
167 fixture,
168 [
169 next_aggregation_epoch.offset_to_signer_retrieval_epoch().unwrap(),
170 next_aggregation_epoch,
171 ],
172 )
173 .await
174 }
175
176 async fn init_state_from_fixture_internal<const N: usize>(
177 &self,
178 fixture: &MithrilFixture,
179 epochs_to_fill: [Epoch; N],
180 ) {
181 for epoch in epochs_to_fill {
182 self.fill_verification_key_store(epoch, &fixture.signers_with_stake())
183 .await;
184 self.fill_stakes_store(epoch, fixture.signers_with_stake()).await;
185 }
186 }
187
188 async fn fill_verification_key_store(&self, target_epoch: Epoch, signers: &[SignerWithStake]) {
189 for signer in signers {
190 self.signer_recorder
191 .record_signer_registration(signer.party_id.clone())
192 .await
193 .expect("record_signer_registration should not fail");
194 self.verification_key_store
195 .save_verification_key(target_epoch, signer.clone())
196 .await
197 .expect("save_verification_key should not fail");
198 }
199 }
200
201 async fn fill_stakes_store(&self, target_epoch: Epoch, signers: Vec<SignerWithStake>) {
202 let _ = self
203 .stake_store
204 .save_stakes(
205 target_epoch,
206 signers.iter().map(|s| s.into()).collect::<StakeDistribution>(),
207 )
208 .await
209 .expect("save_stakes should not fail");
210 }
211}
212
213#[cfg(test)]
214pub(crate) mod tests {
215 use std::path::PathBuf;
216
217 use crate::{ServeCommandConfiguration, dependency_injection::DependenciesBuilder};
218
219 use super::*;
220
221 #[macro_export]
224 macro_rules! initialize_dependencies {
225 () => {{ initialize_dependencies(mithril_common::temp_dir!()) }};
226 }
227
228 pub async fn initialize_dependencies(tmp_path: PathBuf) -> ServeCommandDependenciesContainer {
229 let config = ServeCommandConfiguration::new_sample(tmp_path);
230
231 let mut builder = DependenciesBuilder::new_with_stdout_logger(Arc::new(config));
232
233 builder.build_serve_dependencies_container().await.unwrap()
234 }
235}