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, CertifierService, MithrilCertifierService,
14 MithrilSignerRegistrationFollower, SignerSynchronizer,
15};
16use crate::{
17 ExecutionEnvironment, MithrilSignerRegistrationLeader, MithrilSignerRegistrationVerifier,
18 MultiSigner, MultiSignerImpl, SignerRegisterer, SignerRegistrationRoundOpener,
19 SignerRegistrationVerifier, SingleSignatureAuthenticator,
20};
21
22macro_rules! get_mithril_signer_registration {
25 ($self:ident) => {{
26 if $self.configuration.is_follower_aggregator() {
27 $self.get_mithril_signer_registration_follower().await?
28 } else {
29 $self.get_mithril_signer_registration_leader().await?
30 }
31 }};
32}
33
34impl DependenciesBuilder {
35 pub async fn build_certifier_service(&mut self) -> Result<Arc<dyn CertifierService>> {
37 let cardano_network = self.configuration.get_network().with_context(|| {
38 "Dependencies Builder can not get Cardano network while building the chain observer"
39 })?;
40 let sqlite_connection = self.get_sqlite_connection().await?;
41 let open_message_repository = self.get_open_message_repository().await?;
42 let single_signature_repository =
43 Arc::new(SingleSignatureRepository::new(sqlite_connection.clone()));
44 let certificate_repository = self.get_certificate_repository().await?;
45 let certificate_verifier = self.get_certificate_verifier().await?;
46 let genesis_verifier = self.get_genesis_verifier().await?;
47 let multi_signer = self.get_multi_signer().await?;
48 let epoch_service = self.get_epoch_service().await?;
49 let logger = self.root_logger();
50
51 let certifier = Arc::new(MithrilCertifierService::new(
52 cardano_network,
53 open_message_repository,
54 single_signature_repository,
55 certificate_repository,
56 certificate_verifier,
57 genesis_verifier,
58 multi_signer,
59 epoch_service,
60 logger,
61 ));
62
63 Ok(Arc::new(BufferedCertifierService::new(
64 certifier,
65 Arc::new(BufferedSingleSignatureRepository::new(sqlite_connection)),
66 self.root_logger(),
67 )))
68 }
69
70 pub async fn get_certifier_service(&mut self) -> Result<Arc<dyn CertifierService>> {
72 get_dependency!(self.certifier_service)
73 }
74
75 async fn build_multi_signer(&mut self) -> Result<Arc<dyn MultiSigner>> {
76 let multi_signer =
77 MultiSignerImpl::new(self.get_epoch_service().await?, self.root_logger());
78
79 Ok(Arc::new(multi_signer))
80 }
81
82 pub async fn get_multi_signer(&mut self) -> Result<Arc<dyn MultiSigner>> {
84 get_dependency!(self.multi_signer)
85 }
86
87 async fn build_certificate_verifier(&mut self) -> Result<Arc<dyn CertificateVerifier>> {
88 let verifier = Arc::new(MithrilCertificateVerifier::new(
89 self.root_logger(),
90 self.get_certificate_repository().await?,
91 ));
92
93 Ok(verifier)
94 }
95
96 pub async fn get_certificate_verifier(&mut self) -> Result<Arc<dyn CertificateVerifier>> {
98 get_dependency!(self.certificate_verifier)
99 }
100
101 async fn build_genesis_verifier(&mut self) -> Result<Arc<ProtocolGenesisVerifier>> {
102 let genesis_verifier: ProtocolGenesisVerifier = match self.configuration.environment() {
103 ExecutionEnvironment::Production => ProtocolGenesisVerifier::from_verification_key(
104 ProtocolGenesisVerificationKey::from_json_hex(
105 &self.configuration.genesis_verification_key(),
106 )
107 .map_err(|e| DependenciesBuilderError::Initialization {
108 message: format!(
109 "Could not decode hex key to build genesis verifier: '{}'",
110 self.configuration.genesis_verification_key()
111 ),
112 error: Some(e),
113 })?,
114 ),
115 _ => ProtocolGenesisSigner::create_deterministic_signer().create_verifier(),
116 };
117
118 Ok(Arc::new(genesis_verifier))
119 }
120
121 pub async fn get_genesis_verifier(&mut self) -> Result<Arc<ProtocolGenesisVerifier>> {
123 get_dependency!(self.genesis_verifier)
124 }
125
126 async fn build_mithril_signer_registration_leader(
128 &mut self,
129 ) -> Result<Arc<MithrilSignerRegistrationLeader>> {
130 let registerer = MithrilSignerRegistrationLeader::new(
131 self.get_verification_key_store().await?,
132 self.get_signer_store().await?,
133 self.get_signer_registration_verifier().await?,
134 );
135
136 Ok(Arc::new(registerer))
137 }
138
139 pub async fn get_mithril_signer_registration_leader(
141 &mut self,
142 ) -> Result<Arc<MithrilSignerRegistrationLeader>> {
143 get_dependency!(self.mithril_signer_registration_leader)
144 }
145
146 async fn build_mithril_signer_registration_follower(
148 &mut self,
149 ) -> Result<Arc<MithrilSignerRegistrationFollower>> {
150 let registerer = MithrilSignerRegistrationFollower::new(
151 self.get_epoch_service().await?,
152 self.get_verification_key_store().await?,
153 self.get_signer_store().await?,
154 self.get_signer_registration_verifier().await?,
155 self.get_leader_aggregator_client().await?,
156 self.get_stake_store().await?,
157 );
158
159 Ok(Arc::new(registerer))
160 }
161
162 pub async fn get_mithril_signer_registration_follower(
164 &mut self,
165 ) -> Result<Arc<MithrilSignerRegistrationFollower>> {
166 get_dependency!(self.mithril_signer_registration_follower)
167 }
168
169 pub async fn get_signer_registerer(&mut self) -> Result<Arc<dyn SignerRegisterer>> {
171 get_dependency!(self.signer_registerer = get_mithril_signer_registration!(self))
172 }
173
174 pub async fn get_signer_synchronizer(&mut self) -> Result<Arc<dyn SignerSynchronizer>> {
176 get_dependency!(self.signer_synchronizer = get_mithril_signer_registration!(self))
177 }
178
179 async fn build_signer_registration_verifier(
180 &mut self,
181 ) -> Result<Arc<dyn SignerRegistrationVerifier>> {
182 let registerer = MithrilSignerRegistrationVerifier::new(self.get_chain_observer().await?);
183
184 Ok(Arc::new(registerer))
185 }
186
187 pub async fn get_signer_registration_verifier(
189 &mut self,
190 ) -> Result<Arc<dyn SignerRegistrationVerifier>> {
191 get_dependency!(self.signer_registration_verifier)
192 }
193
194 pub async fn get_signer_registration_round_opener(
196 &mut self,
197 ) -> Result<Arc<dyn SignerRegistrationRoundOpener>> {
198 get_dependency!(
199 self.signer_registration_round_opener = get_mithril_signer_registration!(self)
200 )
201 }
202
203 async fn build_single_signature_authenticator(
204 &mut self,
205 ) -> Result<Arc<SingleSignatureAuthenticator>> {
206 let authenticator =
207 SingleSignatureAuthenticator::new(self.get_multi_signer().await?, self.root_logger());
208
209 Ok(Arc::new(authenticator))
210 }
211
212 pub async fn get_single_signature_authenticator(
214 &mut self,
215 ) -> Result<Arc<SingleSignatureAuthenticator>> {
216 get_dependency!(self.single_signature_authenticator)
217 }
218}