Skip to content

Commit 19b0bfa

Browse files
authored
Merge pull request #865 from input-output-hk/ensemble/847-signable-artifact-builder
Implement Signable & Artifact Builders
2 parents 7f23c24 + e074161 commit 19b0bfa

File tree

25 files changed

+480
-14
lines changed

25 files changed

+480
-14
lines changed

Cargo.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-aggregator/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-aggregator"
3-
version = "0.2.52"
3+
version = "0.2.53"
44
description = "A Mithril Aggregator server"
55
authors = { workspace = true }
66
edition = { workspace = true }
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
use std::sync::Arc;
2+
3+
use mithril_common::{
4+
entities::{Certificate, SignedEntityType},
5+
signable_builder::DummyBeacon,
6+
StdResult,
7+
};
8+
9+
use crate::artifact_builder::{Artifact, DummyArtifactBuilder};
10+
11+
use super::ArtifactBuilder;
12+
13+
/// ArtifactBuilder Service
14+
// TODO: temporary implementation
15+
pub struct ArtifactBuilderService {
16+
dummy_artifact_builder: DummyArtifactBuilder,
17+
}
18+
19+
impl ArtifactBuilderService {
20+
/// ArtifactBuilderService factory
21+
#[allow(dead_code)]
22+
pub fn new(dummy_artifact_builder: DummyArtifactBuilder) -> Self {
23+
Self {
24+
dummy_artifact_builder,
25+
}
26+
}
27+
}
28+
29+
impl ArtifactBuilderService {
30+
#[allow(dead_code)]
31+
async fn compute_artifact(
32+
&self,
33+
signed_entity_type: SignedEntityType,
34+
certificate: &Certificate,
35+
) -> StdResult<Arc<impl Artifact>> {
36+
let artifact = match signed_entity_type {
37+
SignedEntityType::MithrilStakeDistribution(e) => Arc::new(
38+
self.dummy_artifact_builder
39+
.compute_artifact(DummyBeacon { epoch: e }, certificate)
40+
.await?,
41+
),
42+
SignedEntityType::CardanoStakeDistribution(e) => Arc::new(
43+
self.dummy_artifact_builder
44+
.compute_artifact(DummyBeacon { epoch: e }, certificate)
45+
.await?,
46+
),
47+
SignedEntityType::CardanoImmutableFilesFull(b) => Arc::new(
48+
self.dummy_artifact_builder
49+
.compute_artifact(DummyBeacon { epoch: b.epoch }, certificate)
50+
.await?,
51+
),
52+
};
53+
54+
Ok(artifact)
55+
}
56+
}
57+
58+
#[cfg(test)]
59+
mod tests {
60+
use mithril_common::entities::{Beacon, Epoch};
61+
62+
use super::*;
63+
64+
// TODO: temporary test
65+
#[tokio::test]
66+
async fn test_artifact_builder_service() {
67+
let dummy_artifact_builder = DummyArtifactBuilder::default();
68+
let artifact_builder_service = ArtifactBuilderService::new(dummy_artifact_builder);
69+
let certificate = Certificate::default();
70+
71+
let signed_entity_type_1 = SignedEntityType::MithrilStakeDistribution(Epoch(1));
72+
let artifact_1 = artifact_builder_service
73+
.compute_artifact(signed_entity_type_1, &certificate)
74+
.await
75+
.unwrap();
76+
77+
let signed_entity_type_2 = SignedEntityType::CardanoStakeDistribution(Epoch(0));
78+
let artifact_2 = artifact_builder_service
79+
.compute_artifact(signed_entity_type_2, &certificate)
80+
.await
81+
.unwrap();
82+
83+
let signed_entity_type_3 = SignedEntityType::CardanoImmutableFilesFull(Beacon::default());
84+
let artifact_3 = artifact_builder_service
85+
.compute_artifact(signed_entity_type_3, &certificate)
86+
.await
87+
.unwrap();
88+
89+
assert_ne!(artifact_1, artifact_2);
90+
assert_ne!(artifact_1, artifact_3);
91+
assert_eq!(artifact_2, artifact_3);
92+
}
93+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
use std::marker::PhantomData;
2+
3+
use async_trait::async_trait;
4+
use mithril_common::{entities::Certificate, signable_builder::DummyBeacon, StdResult};
5+
use serde::{Deserialize, Serialize};
6+
7+
use crate::artifact_builder::{Artifact, ArtifactBuilder};
8+
9+
/// Dummy artifact
10+
#[derive(Serialize, Deserialize, PartialEq, Debug)]
11+
pub struct DummyArtifact<'a> {
12+
message: String,
13+
beacon: DummyBeacon,
14+
phantom: PhantomData<&'a DummyBeacon>,
15+
}
16+
17+
impl<'a> DummyArtifact<'a> {
18+
/// Dummy artifact factory
19+
pub fn new(message: String, beacon: DummyBeacon) -> Self {
20+
Self {
21+
message,
22+
beacon,
23+
phantom: PhantomData,
24+
}
25+
}
26+
}
27+
28+
impl<'a> Artifact<'a> for DummyArtifact<'a> {}
29+
30+
/// A [DummyArtifact] builder
31+
pub struct DummyArtifactBuilder {}
32+
33+
impl DummyArtifactBuilder {
34+
/// Dummy artifact builder factory
35+
pub fn new() -> Self {
36+
Self {}
37+
}
38+
}
39+
40+
impl Default for DummyArtifactBuilder {
41+
fn default() -> Self {
42+
Self::new()
43+
}
44+
}
45+
46+
#[async_trait]
47+
impl<'a> ArtifactBuilder<'a, DummyBeacon, DummyArtifact<'a>> for DummyArtifactBuilder {
48+
async fn compute_artifact(
49+
&'a self,
50+
beacon: DummyBeacon,
51+
certificate: &Certificate,
52+
) -> StdResult<DummyArtifact> {
53+
Ok(DummyArtifact::new(
54+
format!("certificate id is {}", certificate.hash),
55+
beacon,
56+
))
57+
}
58+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use async_trait::async_trait;
2+
use mithril_common::{entities::Certificate, signable_builder::Beacon, StdResult};
3+
use serde::{Deserialize, Serialize};
4+
use std::fmt::Debug;
5+
6+
/// Artifact is a trait for types that represent signed artifacts
7+
pub trait Artifact<'a>: Serialize + Deserialize<'a> + PartialEq + Debug {}
8+
9+
/// ArtifactBuilder is trait for building an artifact
10+
#[async_trait]
11+
pub trait ArtifactBuilder<'a, U, W>
12+
where
13+
U: Beacon,
14+
W: Artifact<'a>,
15+
{
16+
/// Compute an artifact
17+
async fn compute_artifact(&'a self, beacon: U, certificate: &Certificate) -> StdResult<W>;
18+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
//! The module used for building artifact
2+
3+
mod artifact_builder_service;
4+
mod dummy_artifact;
5+
mod interface;
6+
7+
pub use artifact_builder_service::*;
8+
pub use dummy_artifact::*;
9+
pub use interface::*;

mithril-aggregator/src/dependency.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ use std::{collections::HashMap, sync::Arc};
1515
use tokio::sync::{Mutex, RwLock};
1616

1717
use crate::{
18-
configuration::*, database::provider::StakePoolStore, signer_registerer::SignerRecorder,
18+
artifact_builder::ArtifactBuilderService, configuration::*, database::provider::StakePoolStore,
19+
signable_builder::SignableBuilderService, signer_registerer::SignerRecorder,
1920
CertificatePendingStore, CertificateStore, ProtocolParametersStore, ProtocolParametersStorer,
2021
SignerRegisterer, SignerRegistrationRoundOpener, SingleSignatureStore, Snapshotter,
2122
VerificationKeyStore, VerificationKeyStorer,
@@ -111,6 +112,12 @@ pub struct DependencyManager {
111112

112113
/// Signer Recorder
113114
pub signer_recorder: Arc<dyn SignerRecorder>,
115+
116+
/// Signable Builder Service
117+
pub signable_builder_service: Arc<SignableBuilderService>,
118+
119+
/// Artifact Builder Service
120+
pub artifact_builder_service: Arc<ArtifactBuilderService>,
114121
}
115122

116123
#[doc(hidden)]

mithril-aggregator/src/dependency_injection/builder.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use mithril_common::{
1919
adapters::{EraReaderAdapterBuilder, EraReaderDummyAdapter},
2020
EraChecker, EraMarker, EraReader, EraReaderAdapter, SupportedEra,
2121
},
22+
signable_builder::DummySignableBuilder,
2223
store::adapter::{MemoryAdapter, SQLiteAdapter, StoreAdapter},
2324
BeaconProvider, BeaconProviderImpl,
2425
};
@@ -35,13 +36,15 @@ use tokio::{
3536
use warp::Filter;
3637

3738
use crate::{
39+
artifact_builder::{ArtifactBuilderService, DummyArtifactBuilder},
3840
configuration::{ExecutionEnvironment, LIST_SNAPSHOTS_MAX_ITEMS},
3941
database::provider::{
4042
CertificateStoreAdapter, EpochSettingStore, SignedEntityStoreAdapter,
4143
SignerRegistrationStoreAdapter, SignerStore, StakePoolStore,
4244
},
4345
event_store::{EventMessage, EventStore, TransmitterService},
4446
http_server::routes::router,
47+
signable_builder::SignableBuilderService,
4548
signer_registerer::SignerRecorder,
4649
stake_distribution_service::{MithrilStakeDistributionService, StakeDistributionService},
4750
ticker_service::{MithrilTickerService, TickerService},
@@ -156,6 +159,12 @@ pub struct DependenciesBuilder {
156159

157160
/// Signer Recorder
158161
pub signer_recorder: Option<Arc<dyn SignerRecorder>>,
162+
163+
/// Signable Builder Service
164+
pub signable_builder_service: Option<Arc<SignableBuilderService>>,
165+
166+
/// Artifact Builder Service
167+
pub artifact_builder_service: Option<Arc<ArtifactBuilderService>>,
159168
}
160169

161170
impl DependenciesBuilder {
@@ -193,6 +202,8 @@ impl DependenciesBuilder {
193202
stake_distribution_service: None,
194203
ticker_service: None,
195204
signer_recorder: None,
205+
signable_builder_service: None,
206+
artifact_builder_service: None,
196207
}
197208
}
198209

@@ -968,6 +979,40 @@ impl DependenciesBuilder {
968979
Ok(self.signer_recorder.as_ref().cloned().unwrap())
969980
}
970981

982+
async fn build_signable_builder_service(&mut self) -> Result<Arc<SignableBuilderService>> {
983+
let dummy_signable_builder = DummySignableBuilder::new();
984+
let signable_builder_service =
985+
Arc::new(SignableBuilderService::new(dummy_signable_builder));
986+
987+
Ok(signable_builder_service)
988+
}
989+
990+
/// [SignableBuilderService] service
991+
pub async fn get_signable_builder_service(&mut self) -> Result<Arc<SignableBuilderService>> {
992+
if self.signable_builder_service.is_none() {
993+
self.signable_builder_service = Some(self.build_signable_builder_service().await?);
994+
}
995+
996+
Ok(self.signable_builder_service.as_ref().cloned().unwrap())
997+
}
998+
999+
async fn build_artifact_builder_service(&mut self) -> Result<Arc<ArtifactBuilderService>> {
1000+
let dummy_artifact_builder = DummyArtifactBuilder::new();
1001+
let artifact_builder_service =
1002+
Arc::new(ArtifactBuilderService::new(dummy_artifact_builder));
1003+
1004+
Ok(artifact_builder_service)
1005+
}
1006+
1007+
/// [ArtifactBuilderService] service
1008+
pub async fn get_artifact_builder_service(&mut self) -> Result<Arc<ArtifactBuilderService>> {
1009+
if self.artifact_builder_service.is_none() {
1010+
self.artifact_builder_service = Some(self.build_artifact_builder_service().await?);
1011+
}
1012+
1013+
Ok(self.artifact_builder_service.as_ref().cloned().unwrap())
1014+
}
1015+
9711016
/// Return an unconfigured [DependencyManager]
9721017
pub async fn build_dependency_container(&mut self) -> Result<DependencyManager> {
9731018
let dependency_manager = DependencyManager {
@@ -997,6 +1042,8 @@ impl DependenciesBuilder {
9971042
api_version_provider: self.get_api_version_provider().await?,
9981043
stake_distribution_service: self.get_stake_distribution_service().await?,
9991044
signer_recorder: self.get_signer_recorder().await?,
1045+
signable_builder_service: self.get_signable_builder_service().await?,
1046+
artifact_builder_service: self.get_artifact_builder_service().await?,
10001047
};
10011048

10021049
Ok(dependency_manager)

mithril-aggregator/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//! signed certificates.
1212
//! You can find more information on how it works reading the [documentation website](https://mithril.network/doc/mithril/mithril-network/aggregator).
1313
14+
mod artifact_builder;
1415
mod certificate_creator;
1516
mod command_args;
1617
mod configuration;
@@ -22,6 +23,7 @@ mod http_server;
2223
mod message_adapters;
2324
mod multi_signer;
2425
mod runtime;
26+
mod signable_builder;
2527
mod signer_registerer;
2628
mod snapshot_stores;
2729
mod snapshot_uploaders;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
//! The module used for building signables
2+
3+
mod signable_builder_service;
4+
5+
pub use signable_builder_service::*;

0 commit comments

Comments
 (0)