Skip to content

Commit 27ded3e

Browse files
authored
Merge pull request #1437 from input-output-hk/ensemble/1434-cardano-transactions-signed-entity-type
Support `CardanoTransactions` signed entity type
2 parents 25b2090 + 346d00f commit 27ded3e

File tree

25 files changed

+439
-51
lines changed

25 files changed

+439
-51
lines changed

Cargo.lock

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

docs/website/root/manual/developer-docs/nodes/mithril-aggregator.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ Here is a list of the available parameters:
442442
| `chain_observer_type` | `--chain-observer-type` | - | `CHAIN_OBSERVER_TYPE` | Chain observer type that can be `cardano-cli`, `pallas` or `fake`. | `pallas` | - | - |
443443
| `era_reader_adapter_type` | `--era-reader-adapter-type` | - | `ERA_READER_ADAPTER_TYPE` | Era reader adapter type that can be `cardano-chain`, `file` or `bootstrap`. | `bootstrap` | - | - |
444444
| `era_reader_adapter_params` | `--era-reader-adapter-params` | - | `ERA_READER_ADAPTER_PARAMS` | Era reader adapter params that is an optional JSON encoded parameters structure that is expected depending on the `era_reader_adapter_type` parameter | - | - | - |
445-
| `signed_entity_types` | `--signed-entity-types` | - | `AGGREGATOR_SIGNED_ENTITY_TYPES` | Signed entity types parameters (discriminants names in an ordered comma separated list) | - | `MithrilStakeDistribution,CardanoImmutableFilesFull,CardanoStakeDistribution` | - |
445+
| `signed_entity_types` | `--signed-entity-types` | - | `SIGNED_ENTITY_TYPES` | Signed entity types parameters (discriminants names in an ordered comma separated list) | - | `MithrilStakeDistribution,CardanoImmutableFilesFull,CardanoStakeDistribution` | - |
446446
| `snapshot_compression_algorithm` | `--snapshot-compression-algorithm` | - | `SNAPSHOT_COMPRESSION_ALGORITHM` | Compression algorithm of the snapshot archive | `zstandard` | `gzip` or `zstandard` | - |
447447
| `zstandard_parameters` | - | - | `ZSTANDARD_PARAMETERS__LEVEL` and `ZSTANDARD_PARAMETERS__NUMBER_OF_WORKERS` | Zstandard specific parameters | - | `{ level: 9, number_of_workers: 4 }` | - |
448448

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
use async_trait::async_trait;
2+
3+
use super::ArtifactBuilder;
4+
use anyhow::{anyhow, Context};
5+
use mithril_common::{
6+
entities::{
7+
Beacon, CardanoTransactionsCommitment, Certificate, ProtocolMessagePartKey,
8+
SignedEntityType,
9+
},
10+
StdResult,
11+
};
12+
13+
/// A [CardanoTransactionsArtifact] builder
14+
pub struct CardanoTransactionsArtifactBuilder {}
15+
16+
impl CardanoTransactionsArtifactBuilder {
17+
/// CardanoTransactions artifact builder factory
18+
pub fn new() -> Self {
19+
Self {}
20+
}
21+
}
22+
23+
#[async_trait]
24+
impl ArtifactBuilder<Beacon, CardanoTransactionsCommitment> for CardanoTransactionsArtifactBuilder {
25+
async fn compute_artifact(
26+
&self,
27+
beacon: Beacon,
28+
certificate: &Certificate,
29+
) -> StdResult<CardanoTransactionsCommitment> {
30+
let merkle_root = certificate
31+
.protocol_message
32+
.get_message_part(&ProtocolMessagePartKey::CardanoTransactionsMerkleRoot)
33+
.ok_or(anyhow!(
34+
"Can not find CardanoTransactionsMerkleRoot protocol message part in certificate"
35+
))
36+
.with_context(|| {
37+
format!(
38+
"Can not compute CardanoTransactionsCommitment artifact for signed_entity: {:?}",
39+
SignedEntityType::CardanoTransactions(beacon)
40+
)
41+
})?;
42+
43+
Ok(CardanoTransactionsCommitment::new(merkle_root.to_string()))
44+
}
45+
}
46+
47+
#[cfg(test)]
48+
mod tests {
49+
use mithril_common::{entities::ProtocolMessage, test_utils::fake_data};
50+
51+
use super::*;
52+
53+
#[tokio::test]
54+
async fn should_compute_valid_artifact_with_merkleroot() {
55+
let certificate = {
56+
let mut certificate = fake_data::certificate("certificate-123".to_string());
57+
let mut message = ProtocolMessage::new();
58+
message.set_message_part(
59+
ProtocolMessagePartKey::CardanoTransactionsMerkleRoot,
60+
"merkleroot".to_string(),
61+
);
62+
certificate.protocol_message = message;
63+
certificate
64+
};
65+
66+
let cardano_transaction_artifact_builder = CardanoTransactionsArtifactBuilder::new();
67+
let artifact = cardano_transaction_artifact_builder
68+
.compute_artifact(Beacon::default(), &certificate)
69+
.await
70+
.unwrap();
71+
let artifact_expected = CardanoTransactionsCommitment::new("merkleroot".to_string());
72+
assert_eq!(artifact_expected, artifact);
73+
}
74+
75+
#[tokio::test]
76+
async fn should_fail_to_compute_artifact_without_merkle_root() {
77+
let certificate = {
78+
let mut certificate = fake_data::certificate("certificate-123".to_string());
79+
let message = ProtocolMessage::new();
80+
certificate.protocol_message = message;
81+
certificate
82+
};
83+
84+
let cardano_transaction_artifact_builder = CardanoTransactionsArtifactBuilder::new();
85+
cardano_transaction_artifact_builder
86+
.compute_artifact(Beacon::default(), &certificate)
87+
.await
88+
.expect_err("The artifact building must fail since there is no CardanoTransactionsMerkleRoot part in its message.");
89+
}
90+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
//! The module used for building artifact
22
mod cardano_immutable_files_full;
3+
mod cardano_transactions;
34
mod interface;
45
mod mithril_stake_distribution;
56

67
pub use cardano_immutable_files_full::*;
8+
pub use cardano_transactions::*;
79
pub use interface::*;
810
pub use mithril_stake_distribution::*;

mithril-aggregator/src/database/migration.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,5 +610,14 @@ alter table open_message add column is_expired bool not null default false;
610610
alter table open_message add column expires_at text null;
611611
"#,
612612
),
613+
// Migration 21
614+
// Add the `signed_entity_type` record for 'CardanoTransactions'
615+
SqlMigration::new(
616+
21,
617+
r#"
618+
insert into signed_entity_type (signed_entity_type_id, name)
619+
values (3, 'Cardano Transactions');
620+
"#,
621+
),
613622
]
614623
}

mithril-aggregator/src/database/provider/open_message.rs

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -910,27 +910,21 @@ else json_group_array( \
910910
let repository = OpenMessageRepository::new(connection.clone());
911911
let beacon = Beacon::new("devnet".to_string(), 1, 1);
912912

913-
let signed_entity_type = SignedEntityType::MithrilStakeDistribution(beacon.epoch);
914-
repository
915-
.create_open_message(beacon.epoch, &signed_entity_type, &ProtocolMessage::new())
916-
.await
917-
.unwrap();
918-
let open_message_result = repository
919-
.get_open_message(&signed_entity_type)
920-
.await
921-
.unwrap();
922-
assert!(open_message_result.is_some());
923-
924-
let signed_entity_type = SignedEntityType::CardanoImmutableFilesFull(beacon.clone());
925-
repository
926-
.create_open_message(beacon.epoch, &signed_entity_type, &ProtocolMessage::new())
927-
.await
928-
.unwrap();
929-
let open_message_result = repository
930-
.get_open_message(&signed_entity_type)
931-
.await
932-
.unwrap();
933-
assert!(open_message_result.is_some());
913+
for signed_entity_type in [
914+
SignedEntityType::MithrilStakeDistribution(beacon.epoch),
915+
SignedEntityType::CardanoImmutableFilesFull(beacon.clone()),
916+
SignedEntityType::CardanoTransactions(beacon.clone()),
917+
] {
918+
repository
919+
.create_open_message(beacon.epoch, &signed_entity_type, &ProtocolMessage::new())
920+
.await
921+
.unwrap();
922+
let open_message_result = repository
923+
.get_open_message(&signed_entity_type)
924+
.await
925+
.unwrap();
926+
assert!(open_message_result.is_some());
927+
}
934928
}
935929

936930
#[tokio::test]

mithril-aggregator/src/dependency_injection/builder.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,18 @@ use mithril_common::{
3535
signable_builder::{
3636
CardanoImmutableFilesFullSignableBuilder, MithrilStakeDistributionSignableBuilder,
3737
},
38-
signable_builder::{MithrilSignableBuilderService, SignableBuilderService},
38+
signable_builder::{
39+
CardanoTransactionsSignableBuilder, MithrilSignableBuilderService, SignableBuilderService,
40+
},
3941
sqlite::SqliteConnection,
4042
store::adapter::{MemoryAdapter, SQLiteAdapter, StoreAdapter},
4143
BeaconProvider, BeaconProviderImpl,
4244
};
4345

4446
use crate::{
4547
artifact_builder::{
46-
CardanoImmutableFilesFullArtifactBuilder, MithrilStakeDistributionArtifactBuilder,
48+
CardanoImmutableFilesFullArtifactBuilder, CardanoTransactionsArtifactBuilder,
49+
MithrilStakeDistributionArtifactBuilder,
4750
},
4851
configuration::ExecutionEnvironment,
4952
database::provider::{
@@ -938,9 +941,11 @@ impl DependenciesBuilder {
938941
&self.configuration.db_directory,
939942
self.get_logger().await?,
940943
));
944+
let cardano_transactions_builder = Arc::new(CardanoTransactionsSignableBuilder::default());
941945
let signable_builder_service = Arc::new(MithrilSignableBuilderService::new(
942946
mithril_stake_distribution_builder,
943947
immutable_signable_builder,
948+
cardano_transactions_builder,
944949
));
945950

946951
Ok(signable_builder_service)
@@ -973,10 +978,13 @@ impl DependenciesBuilder {
973978
snapshot_uploader,
974979
self.configuration.snapshot_compression_algorithm,
975980
));
981+
let cardano_transactions_artifact_builder =
982+
Arc::new(CardanoTransactionsArtifactBuilder::new());
976983
let signed_entity_service = Arc::new(MithrilSignedEntityService::new(
977984
signed_entity_storer,
978985
mithril_stake_distribution_artifact_builder,
979986
cardano_immutable_files_full_artifact_builder,
987+
cardano_transactions_artifact_builder,
980988
));
981989

982990
Ok(signed_entity_service)

mithril-aggregator/src/services/certifier.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,7 @@ impl CertifierService for MithrilCertifierService {
397397
}
398398
}
399399
SignedEntityType::CardanoImmutableFilesFull(beacon) => beacon.clone(),
400+
SignedEntityType::CardanoTransactions(beacon) => beacon.clone(),
400401
};
401402
let metadata = CertificateMetadata::new(
402403
protocol_version,

0 commit comments

Comments
 (0)