mithril_aggregator/dependency_injection/builder/protocol/
certificates.rs1use anyhow::Context;
2use std::sync::Arc;
3
4use mithril_common::certificate_chain::{CertificateVerifier, MithrilCertificateVerifier};
5use mithril_common::crypto_helper::{
6 ProtocolGenesisSigner, ProtocolGenesisVerificationKey, ProtocolGenesisVerifier,
7};
8
9use crate::database::repository::{BufferedSingleSignatureRepository, SingleSignatureRepository};
10use crate::dependency_injection::{DependenciesBuilder, DependenciesBuilderError, Result};
11use crate::get_dependency;
12use crate::services::{
13 BufferedCertifierService, CertificateChainSynchronizer, CertifierService,
14 MithrilCertificateChainSynchronizer, MithrilCertificateChainSynchronizerNoop,
15 MithrilCertifierService, MithrilSignerRegistrationFollower, SignerSynchronizer,
16};
17use crate::{
18 ExecutionEnvironment, MithrilSignerRegistrationLeader, MithrilSignerRegistrationVerifier,
19 MultiSigner, MultiSignerImpl, SignerRegisterer, SignerRegistrationRoundOpener,
20 SignerRegistrationVerifier, SingleSignatureAuthenticator,
21};
22
23macro_rules! get_mithril_signer_registration {
26 ($self:ident) => {{
27 if $self.configuration.is_follower_aggregator() {
28 $self.get_mithril_signer_registration_follower().await?
29 } else {
30 $self.get_mithril_signer_registration_leader().await?
31 }
32 }};
33}
34
35impl DependenciesBuilder {
36 pub async fn build_certifier_service(&mut self) -> Result<Arc<dyn CertifierService>> {
38 let cardano_network = self.configuration.get_network().with_context(
39 || "Dependencies Builder can not get Cardano network while building the chain observer",
40 )?;
41 let sqlite_connection = self.get_sqlite_connection().await?;
42 let open_message_repository = self.get_open_message_repository().await?;
43 let single_signature_repository =
44 Arc::new(SingleSignatureRepository::new(sqlite_connection.clone()));
45 let certificate_repository = self.get_certificate_repository().await?;
46 let certificate_verifier = self.get_certificate_verifier().await?;
47 let genesis_verifier = self.get_genesis_verifier().await?;
48 let multi_signer = self.get_multi_signer().await?;
49 let epoch_service = self.get_epoch_service().await?;
50 let logger = self.root_logger();
51
52 let certifier = Arc::new(MithrilCertifierService::new(
53 cardano_network,
54 open_message_repository,
55 single_signature_repository,
56 certificate_repository,
57 certificate_verifier,
58 genesis_verifier,
59 multi_signer,
60 epoch_service,
61 logger,
62 ));
63
64 Ok(Arc::new(BufferedCertifierService::new(
65 certifier,
66 Arc::new(BufferedSingleSignatureRepository::new(sqlite_connection)),
67 self.root_logger(),
68 )))
69 }
70
71 pub async fn get_certifier_service(&mut self) -> Result<Arc<dyn CertifierService>> {
73 get_dependency!(self.certifier_service)
74 }
75
76 async fn build_multi_signer(&mut self) -> Result<Arc<dyn MultiSigner>> {
77 let multi_signer = MultiSignerImpl::new(
78 self.configuration.aggregate_signature_type(),
79 self.get_epoch_service().await?,
80 self.root_logger(),
81 );
82
83 Ok(Arc::new(multi_signer))
84 }
85
86 pub async fn get_multi_signer(&mut self) -> Result<Arc<dyn MultiSigner>> {
88 get_dependency!(self.multi_signer)
89 }
90
91 async fn build_certificate_chain_synchronizer(
92 &mut self,
93 ) -> Result<Arc<dyn CertificateChainSynchronizer>> {
94 let synchronizer: Arc<dyn CertificateChainSynchronizer> =
95 if self.configuration.is_follower_aggregator() {
96 let leader_aggregator_client = self.get_leader_aggregator_client().await?;
97 let verifier = Arc::new(MithrilCertificateVerifier::new(
98 self.root_logger(),
99 leader_aggregator_client.clone(),
100 ));
101
102 Arc::new(MithrilCertificateChainSynchronizer::new(
103 leader_aggregator_client,
104 self.get_certificate_repository().await?,
105 verifier,
106 self.get_genesis_verifier().await?,
107 self.get_open_message_repository().await?,
108 self.get_epoch_settings_store().await?,
109 self.root_logger(),
110 ))
111 } else {
112 Arc::new(MithrilCertificateChainSynchronizerNoop)
113 };
114
115 Ok(synchronizer)
116 }
117
118 pub async fn get_certificate_chain_synchronizer(
120 &mut self,
121 ) -> Result<Arc<dyn CertificateChainSynchronizer>> {
122 get_dependency!(self.certificate_chain_synchronizer)
123 }
124
125 async fn build_certificate_verifier(&mut self) -> Result<Arc<dyn CertificateVerifier>> {
126 let verifier = Arc::new(MithrilCertificateVerifier::new(
127 self.root_logger(),
128 self.get_certificate_repository().await?,
129 ));
130
131 Ok(verifier)
132 }
133
134 pub async fn get_certificate_verifier(&mut self) -> Result<Arc<dyn CertificateVerifier>> {
136 get_dependency!(self.certificate_verifier)
137 }
138
139 async fn build_genesis_verifier(&mut self) -> Result<Arc<ProtocolGenesisVerifier>> {
140 let genesis_verifier: ProtocolGenesisVerifier = match self.configuration.environment() {
141 ExecutionEnvironment::Production => ProtocolGenesisVerifier::from_verification_key(
142 ProtocolGenesisVerificationKey::from_json_hex(
143 &self.configuration.genesis_verification_key(),
144 )
145 .map_err(|e| DependenciesBuilderError::Initialization {
146 message: format!(
147 "Could not decode hex key to build genesis verifier: '{}'",
148 self.configuration.genesis_verification_key()
149 ),
150 error: Some(e),
151 })?,
152 ),
153 _ => ProtocolGenesisSigner::create_deterministic_signer().create_verifier(),
154 };
155
156 Ok(Arc::new(genesis_verifier))
157 }
158
159 pub async fn get_genesis_verifier(&mut self) -> Result<Arc<ProtocolGenesisVerifier>> {
161 get_dependency!(self.genesis_verifier)
162 }
163
164 async fn build_mithril_signer_registration_leader(
166 &mut self,
167 ) -> Result<Arc<MithrilSignerRegistrationLeader>> {
168 let registerer = MithrilSignerRegistrationLeader::new(
169 self.get_verification_key_store().await?,
170 self.get_signer_store().await?,
171 self.get_signer_registration_verifier().await?,
172 );
173
174 Ok(Arc::new(registerer))
175 }
176
177 pub async fn get_mithril_signer_registration_leader(
179 &mut self,
180 ) -> Result<Arc<MithrilSignerRegistrationLeader>> {
181 get_dependency!(self.mithril_signer_registration_leader)
182 }
183
184 async fn build_mithril_signer_registration_follower(
186 &mut self,
187 ) -> Result<Arc<MithrilSignerRegistrationFollower>> {
188 let registerer = MithrilSignerRegistrationFollower::new(
189 self.get_epoch_service().await?,
190 self.get_verification_key_store().await?,
191 self.get_signer_store().await?,
192 self.get_signer_registration_verifier().await?,
193 self.get_leader_aggregator_client().await?,
194 self.get_stake_store().await?,
195 );
196
197 Ok(Arc::new(registerer))
198 }
199
200 pub async fn get_mithril_signer_registration_follower(
202 &mut self,
203 ) -> Result<Arc<MithrilSignerRegistrationFollower>> {
204 get_dependency!(self.mithril_signer_registration_follower)
205 }
206
207 pub async fn get_signer_registerer(&mut self) -> Result<Arc<dyn SignerRegisterer>> {
209 get_dependency!(self.signer_registerer = get_mithril_signer_registration!(self))
210 }
211
212 pub async fn get_signer_synchronizer(&mut self) -> Result<Arc<dyn SignerSynchronizer>> {
214 get_dependency!(self.signer_synchronizer = get_mithril_signer_registration!(self))
215 }
216
217 async fn build_signer_registration_verifier(
218 &mut self,
219 ) -> Result<Arc<dyn SignerRegistrationVerifier>> {
220 let registerer = MithrilSignerRegistrationVerifier::new(self.get_chain_observer().await?);
221
222 Ok(Arc::new(registerer))
223 }
224
225 pub async fn get_signer_registration_verifier(
227 &mut self,
228 ) -> Result<Arc<dyn SignerRegistrationVerifier>> {
229 get_dependency!(self.signer_registration_verifier)
230 }
231
232 pub async fn get_signer_registration_round_opener(
234 &mut self,
235 ) -> Result<Arc<dyn SignerRegistrationRoundOpener>> {
236 get_dependency!(
237 self.signer_registration_round_opener = get_mithril_signer_registration!(self)
238 )
239 }
240
241 async fn build_single_signature_authenticator(
242 &mut self,
243 ) -> Result<Arc<SingleSignatureAuthenticator>> {
244 let authenticator =
245 SingleSignatureAuthenticator::new(self.get_multi_signer().await?, self.root_logger());
246
247 Ok(Arc::new(authenticator))
248 }
249
250 pub async fn get_single_signature_authenticator(
252 &mut self,
253 ) -> Result<Arc<SingleSignatureAuthenticator>> {
254 get_dependency!(self.single_signature_authenticator)
255 }
256}