Skip to content

Commit c16d697

Browse files
committed
feat: integrate CardanoDatabase artifact builder into the aggregator SignedEntityService
1 parent 6cb0be1 commit c16d697

File tree

3 files changed

+100
-19
lines changed

3 files changed

+100
-19
lines changed

mithril-aggregator/src/dependency_injection/builder.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ use mithril_persistence::{
5252
use super::{DependenciesBuilderError, EpochServiceWrapper, Result};
5353
use crate::{
5454
artifact_builder::{
55-
CardanoImmutableFilesFullArtifactBuilder, CardanoStakeDistributionArtifactBuilder,
56-
CardanoTransactionsArtifactBuilder, MithrilStakeDistributionArtifactBuilder,
55+
CardanoDatabaseArtifactBuilder, CardanoImmutableFilesFullArtifactBuilder,
56+
CardanoStakeDistributionArtifactBuilder, CardanoTransactionsArtifactBuilder,
57+
MithrilStakeDistributionArtifactBuilder,
5758
},
5859
configuration::ExecutionEnvironment,
5960
database::repository::{
@@ -1208,11 +1209,17 @@ impl DependenciesBuilder {
12081209
let stake_store = self.get_stake_store().await?;
12091210
let cardano_stake_distribution_artifact_builder =
12101211
Arc::new(CardanoStakeDistributionArtifactBuilder::new(stake_store));
1212+
let cardano_database_artifact_builder = Arc::new(CardanoDatabaseArtifactBuilder::new(
1213+
self.configuration.db_directory.clone(),
1214+
&cardano_node_version,
1215+
self.configuration.snapshot_compression_algorithm,
1216+
));
12111217
let dependencies = SignedEntityServiceArtifactsDependencies::new(
12121218
mithril_stake_distribution_artifact_builder,
12131219
cardano_immutable_files_full_artifact_builder,
12141220
cardano_transactions_artifact_builder,
12151221
cardano_stake_distribution_artifact_builder,
1222+
cardano_database_artifact_builder,
12161223
);
12171224
let signed_entity_service = Arc::new(MithrilSignedEntityService::new(
12181225
signed_entity_storer,

mithril-aggregator/src/services/signed_entity.rs

Lines changed: 65 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ use tokio::task::JoinHandle;
1111

1212
use mithril_common::{
1313
entities::{
14-
BlockNumber, CardanoDbBeacon, CardanoStakeDistribution, CardanoTransactionsSnapshot,
15-
Certificate, Epoch, MithrilStakeDistribution, SignedEntity, SignedEntityType,
16-
SignedEntityTypeDiscriminants, Snapshot,
14+
BlockNumber, CardanoDatabase, CardanoDbBeacon, CardanoStakeDistribution,
15+
CardanoTransactionsSnapshot, Certificate, Epoch, MithrilStakeDistribution, SignedEntity,
16+
SignedEntityType, SignedEntityTypeDiscriminants, Snapshot,
1717
},
1818
logging::LoggerExtensions,
1919
signable_builder::Artifact,
@@ -89,6 +89,7 @@ pub struct MithrilSignedEntityService {
8989
signed_entity_type_lock: Arc<SignedEntityTypeLock>,
9090
cardano_stake_distribution_artifact_builder:
9191
Arc<dyn ArtifactBuilder<Epoch, CardanoStakeDistribution>>,
92+
cardano_database_artifact_builder: Arc<dyn ArtifactBuilder<CardanoDbBeacon, CardanoDatabase>>,
9293
metrics_service: Arc<MetricsService>,
9394
logger: Logger,
9495
}
@@ -103,6 +104,7 @@ pub struct SignedEntityServiceArtifactsDependencies {
103104
Arc<dyn ArtifactBuilder<BlockNumber, CardanoTransactionsSnapshot>>,
104105
cardano_stake_distribution_artifact_builder:
105106
Arc<dyn ArtifactBuilder<Epoch, CardanoStakeDistribution>>,
107+
cardano_database_artifact_builder: Arc<dyn ArtifactBuilder<CardanoDbBeacon, CardanoDatabase>>,
106108
}
107109

108110
impl SignedEntityServiceArtifactsDependencies {
@@ -120,12 +122,16 @@ impl SignedEntityServiceArtifactsDependencies {
120122
cardano_stake_distribution_artifact_builder: Arc<
121123
dyn ArtifactBuilder<Epoch, CardanoStakeDistribution>,
122124
>,
125+
cardano_database_artifact_builder: Arc<
126+
dyn ArtifactBuilder<CardanoDbBeacon, CardanoDatabase>,
127+
>,
123128
) -> Self {
124129
Self {
125130
mithril_stake_distribution_artifact_builder,
126131
cardano_immutable_files_full_artifact_builder,
127132
cardano_transactions_artifact_builder,
128133
cardano_stake_distribution_artifact_builder,
134+
cardano_database_artifact_builder,
129135
}
130136
}
131137
}
@@ -149,6 +155,7 @@ impl MithrilSignedEntityService {
149155
.cardano_transactions_artifact_builder,
150156
cardano_stake_distribution_artifact_builder: dependencies
151157
.cardano_stake_distribution_artifact_builder,
158+
cardano_database_artifact_builder: dependencies.cardano_database_artifact_builder,
152159
signed_entity_type_lock,
153160
metrics_service,
154161
logger: logger.new_with_component_name::<Self>(),
@@ -247,11 +254,16 @@ impl MithrilSignedEntityService {
247254
)
248255
})?,
249256
)),
250-
SignedEntityType::CardanoDatabase(_) => {
251-
Err(anyhow::anyhow!(
252-
"Signable builder service can not compute artifact for Cardano database because it is not yet implemented."
253-
))
254-
}
257+
SignedEntityType::CardanoDatabase(beacon) => Ok(Arc::new(
258+
self.cardano_database_artifact_builder
259+
.compute_artifact(beacon, certificate)
260+
.await
261+
.with_context(|| {
262+
format!(
263+
"Signed Entity Service can not compute artifact for entity type: '{signed_entity_type}'"
264+
)
265+
})?
266+
)),
255267
}
256268
}
257269

@@ -510,6 +522,8 @@ mod tests {
510522
MockArtifactBuilder<BlockNumber, CardanoTransactionsSnapshot>,
511523
mock_cardano_stake_distribution_artifact_builder:
512524
MockArtifactBuilder<Epoch, CardanoStakeDistribution>,
525+
mock_cardano_database_artifact_builder:
526+
MockArtifactBuilder<CardanoDbBeacon, CardanoDatabase>,
513527
}
514528

515529
impl MockDependencyInjector {
@@ -532,6 +546,10 @@ mod tests {
532546
Epoch,
533547
CardanoStakeDistribution,
534548
>::new(),
549+
mock_cardano_database_artifact_builder: MockArtifactBuilder::<
550+
CardanoDbBeacon,
551+
CardanoDatabase,
552+
>::new(),
535553
}
536554
}
537555

@@ -541,6 +559,7 @@ mod tests {
541559
Arc::new(self.mock_cardano_immutable_files_full_artifact_builder),
542560
Arc::new(self.mock_cardano_transactions_artifact_builder),
543561
Arc::new(self.mock_cardano_stake_distribution_artifact_builder),
562+
Arc::new(self.mock_cardano_database_artifact_builder),
544563
);
545564
MithrilSignedEntityService::new(
546565
Arc::new(self.mock_signed_entity_storer),
@@ -597,6 +616,7 @@ mod tests {
597616
Arc::new(cardano_immutable_files_full_long_artifact_builder),
598617
Arc::new(self.mock_cardano_transactions_artifact_builder),
599618
Arc::new(self.mock_cardano_stake_distribution_artifact_builder),
619+
Arc::new(self.mock_cardano_database_artifact_builder),
600620
);
601621
MithrilSignedEntityService::new(
602622
Arc::new(self.mock_signed_entity_storer),
@@ -822,17 +842,48 @@ mod tests {
822842
}
823843

824844
#[tokio::test]
825-
async fn build_cardano_database_artifact_when_given_cardano_database_entity_type_return_error()
826-
{
827-
let mock_container = MockDependencyInjector::new();
845+
async fn build_cardano_database_artifact_when_given_cardano_database_entity_type() {
846+
let mut mock_container = MockDependencyInjector::new();
847+
848+
let cardano_database_expected = fake_data::cardano_database_entities(1)
849+
.first()
850+
.unwrap()
851+
.to_owned();
852+
853+
mock_container
854+
.mock_cardano_database_artifact_builder
855+
.expect_compute_artifact()
856+
.times(1)
857+
.returning(|_, _| {
858+
Ok(fake_data::cardano_database_entities(1)
859+
.first()
860+
.unwrap()
861+
.to_owned())
862+
});
863+
828864
let artifact_builder_service = mock_container.build_artifact_builder_service();
865+
829866
let certificate = fake_data::certificate("hash".to_string());
830867
let signed_entity_type = SignedEntityType::CardanoDatabase(CardanoDbBeacon::default());
831-
832-
artifact_builder_service
868+
let artifact = artifact_builder_service
833869
.compute_artifact(signed_entity_type.clone(), &certificate)
834870
.await
835-
.expect_err("Should return error because CardanoDatabase is not implemented yet.");
871+
.unwrap();
872+
873+
assert_expected(&cardano_database_expected, &artifact);
874+
}
875+
876+
#[tokio::test]
877+
async fn should_store_the_artifact_when_creating_artifact_for_a_cardano_database() {
878+
generic_test_that_the_artifact_is_stored(
879+
SignedEntityType::CardanoDatabase(CardanoDbBeacon::default()),
880+
fake_data::cardano_database_entities(1)
881+
.first()
882+
.unwrap()
883+
.to_owned(),
884+
&|mock_injector| &mut mock_injector.mock_cardano_database_artifact_builder,
885+
)
886+
.await;
836887
}
837888

838889
async fn generic_test_that_the_artifact_is_stored<

mithril-common/src/test_utils/fake_data.rs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ use semver::Version;
55

66
use crate::crypto_helper::{self, ProtocolMultiSignature};
77
use crate::entities::{
8-
self, BlockNumber, CertificateMetadata, CertificateSignature, CompressionAlgorithm, Epoch,
9-
LotteryIndex, ProtocolMessage, ProtocolMessagePartKey, SignedEntityType, SingleSignatures,
10-
SlotNumber, StakeDistribution, StakeDistributionParty,
8+
self, ArtifactsLocations, BlockNumber, CertificateMetadata, CertificateSignature,
9+
CompressionAlgorithm, Epoch, LotteryIndex, ProtocolMessage, ProtocolMessagePartKey,
10+
SignedEntityType, SingleSignatures, SlotNumber, StakeDistribution, StakeDistributionParty,
1111
};
1212
use crate::test_utils::MithrilFixtureBuilder;
1313

@@ -277,3 +277,26 @@ pub fn cardano_stake_distribution(epoch: Epoch) -> entities::CardanoStakeDistrib
277277
stake_distribution,
278278
}
279279
}
280+
281+
/// Fake Cardano Database entities
282+
pub fn cardano_database_entities(total: u64) -> Vec<entities::CardanoDatabase> {
283+
(1..total + 1)
284+
.map(|cardano_database_id| {
285+
let merkle_root = format!("1{cardano_database_id}").repeat(20);
286+
let mut beacon = beacon();
287+
beacon.immutable_file_number += cardano_database_id;
288+
let total_db_size_uncompressed = cardano_database_id * 100000;
289+
let cardano_node_version = Version::parse("1.0.0").unwrap();
290+
let locations = ArtifactsLocations::default();
291+
292+
entities::CardanoDatabase::new(
293+
merkle_root,
294+
beacon,
295+
total_db_size_uncompressed,
296+
locations,
297+
CompressionAlgorithm::Gzip,
298+
&cardano_node_version,
299+
)
300+
})
301+
.collect::<Vec<entities::CardanoDatabase>>()
302+
}

0 commit comments

Comments
 (0)