Skip to content

Commit cf84a95

Browse files
authored
Merge pull request #1663 from input-output-hk/jpraynaud/1635-prove-cardano-tx-with-block-range-roots
Prove `Cardano Transactions` with `Block Range Merkle Roots`
2 parents 871912f + 05b74ff commit cf84a95

27 files changed

+575
-186
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ As a minor extension, we have adopted a slightly different versioning convention
99

1010
## Mithril Distribution [XXXX.X] - UNRELEASED
1111

12-
- Support computation of the Cardano Transactions signature with the pre-computed Block Range Merkle Roots retrieved from the database.
12+
- Support computation of the Cardano Transactions signature and proving with the pre-computed Block Range Merkle Roots retrieved from the database.
1313

1414
## Mithril Distribution [2418.1] - UNRELEASED
1515

Cargo.lock

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

internal/mithril-build-script/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-build-script"
3-
version = "0.2.1"
3+
version = "0.2.2"
44
description = "A toolbox for Mithril crates build scripts"
55
authors = { workspace = true }
66
edition = { workspace = true }

internal/mithril-build-script/src/open_api.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ info:
145145
write_minimal_open_api_file("2.0.0", &sub_folder.join("openapi-thales.yaml"));
146146

147147
let expected = r#"("openapi-thales.yaml".to_string(), semver::Version::new(2, 0, 0)), ("openapi.yaml".to_string(), semver::Version::new(1, 0, 0))"#;
148-
let generated_code = generate_open_api_versions_mapping(&[&parent_folder, &sub_folder]);
148+
let generated_code = generate_open_api_versions_mapping(&[parent_folder, &sub_folder]);
149149

150150
assert_open_api_content_contains(expected, &generated_code);
151151
}
@@ -162,7 +162,7 @@ info:
162162
let expected = r#"HashMap::from([
163163
("openapi.yaml".to_string(), semver::Version::new(2, 0, 0)),
164164
])"#;
165-
let generated_code = generate_open_api_versions_mapping(&[&parent_folder, &sub_folder]);
165+
let generated_code = generate_open_api_versions_mapping(&[parent_folder, &sub_folder]);
166166

167167
assert_open_api_content_contains(expected, &generated_code);
168168
}

internal/mithril-doc/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-doc"
3-
version = "0.1.3"
3+
version = "0.1.4"
44
description = "An internal crate to generate documentation."
55
authors = { workspace = true }
66
edition = { workspace = true }

internal/mithril-doc/src/lib.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,14 @@ impl StructDoc {
8787
} else {
8888
let mut d = data_map1.get(&field_doc.parameter).unwrap().clone();
8989
if d.default_value.is_none() {
90-
d.default_value = field_doc.default_value.clone();
90+
d.default_value.clone_from(&field_doc.default_value);
9191
}
9292
if d.example.is_none() {
93-
d.example = field_doc.example.clone();
93+
d.example.clone_from(&field_doc.example);
9494
}
9595
if d.environment_variable.is_none() {
96-
d.environment_variable = field_doc.environment_variable.clone();
96+
d.environment_variable
97+
.clone_from(&field_doc.environment_variable);
9798
}
9899
data_map1.insert(field_doc.parameter.clone(), d);
99100
}

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.5.1"
3+
version = "0.5.2"
44
description = "A Mithril Aggregator server"
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-aggregator/src/database/provider/cardano_transaction/get_cardano_transaction.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::ops::Range;
22

33
use sqlite::Value;
44

5-
use mithril_common::entities::{BlockNumber, TransactionHash};
5+
use mithril_common::entities::{BlockNumber, BlockRange, TransactionHash};
66
use mithril_persistence::sqlite::{
77
Provider, SourceAlias, SqLiteEntity, SqliteConnection, WhereCondition,
88
};
@@ -43,6 +43,24 @@ impl<'client> GetCardanoTransactionProvider<'client> {
4343
WhereCondition::where_in("transaction_hash", hashes_values)
4444
}
4545

46+
pub fn get_transaction_block_ranges_condition(
47+
&self,
48+
block_ranges: Vec<BlockRange>,
49+
) -> WhereCondition {
50+
let mut where_condition = WhereCondition::default();
51+
for block_range in block_ranges {
52+
where_condition = where_condition.or_where(WhereCondition::new(
53+
"(block_number >= ?* and block_number < ?*)",
54+
vec![
55+
Value::Integer(block_range.start as i64),
56+
Value::Integer(block_range.end as i64),
57+
],
58+
))
59+
}
60+
61+
where_condition
62+
}
63+
4664
pub fn get_transaction_between_blocks_condition(
4765
&self,
4866
range: Range<BlockNumber>,

mithril-aggregator/src/database/repository/cardano_transaction_repository.rs

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,20 @@ impl TransactionsRetriever for CardanoTransactionRepository {
313313
.map(|record| record.into())
314314
.collect())
315315
}
316+
317+
async fn get_by_block_ranges(
318+
&self,
319+
block_ranges: Vec<BlockRange>,
320+
) -> StdResult<Vec<CardanoTransaction>> {
321+
let provider = GetCardanoTransactionProvider::new(&self.connection);
322+
let filters = provider.get_transaction_block_ranges_condition(block_ranges);
323+
let transactions = provider.find(filters)?;
324+
325+
Ok(transactions
326+
.into_iter()
327+
.map(|record| record.into())
328+
.collect())
329+
}
316330
}
317331

318332
#[async_trait]
@@ -489,7 +503,7 @@ mod tests {
489503
let connection = Arc::new(cardano_tx_db_connection().unwrap());
490504
let repository = CardanoTransactionRepository::new(connection);
491505

492-
// Build transactions with block numbers from 10 to 40 and immutable file numbers from 12 to 14
506+
// Build transactions with block numbers from 20 to 40 and immutable file numbers from 12 to 14
493507
let cardano_transactions: Vec<CardanoTransactionRecord> = (20..=40)
494508
.map(|i| CardanoTransactionRecord {
495509
transaction_hash: format!("tx-hash-{i}"),
@@ -676,6 +690,63 @@ mod tests {
676690
);
677691
}
678692

693+
#[tokio::test]
694+
async fn repository_get_transactions_by_block_ranges() {
695+
let connection = Arc::new(cardano_tx_db_connection().unwrap());
696+
let repository = CardanoTransactionRepository::new(connection);
697+
698+
let transactions = vec![
699+
CardanoTransaction::new("tx-hash-1", 10, 50, "block-hash-1", 99),
700+
CardanoTransaction::new("tx-hash-2", 11, 51, "block-hash-2", 100),
701+
CardanoTransaction::new("tx-hash-3", 20, 52, "block-hash-3", 101),
702+
CardanoTransaction::new("tx-hash-4", 31, 53, "block-hash-4", 102),
703+
CardanoTransaction::new("tx-hash-5", 35, 54, "block-hash-5", 103),
704+
CardanoTransaction::new("tx-hash-6", 46, 55, "block-hash-6", 104),
705+
];
706+
repository
707+
.create_transactions(transactions.clone())
708+
.await
709+
.unwrap();
710+
711+
{
712+
let transaction_result = repository
713+
.get_by_block_ranges(vec![BlockRange::from_block_number(100)])
714+
.await
715+
.unwrap();
716+
assert_eq!(Vec::<CardanoTransaction>::new(), transaction_result);
717+
}
718+
{
719+
let transaction_result = repository
720+
.get_by_block_ranges(vec![BlockRange::from_block_number(0)])
721+
.await
722+
.unwrap();
723+
assert_eq!(transactions[0..=1].to_vec(), transaction_result);
724+
}
725+
{
726+
let transaction_result = repository
727+
.get_by_block_ranges(vec![
728+
BlockRange::from_block_number(0),
729+
BlockRange::from_block_number(15),
730+
])
731+
.await
732+
.unwrap();
733+
assert_eq!(transactions[0..=2].to_vec(), transaction_result);
734+
}
735+
{
736+
let transaction_result = repository
737+
.get_by_block_ranges(vec![
738+
BlockRange::from_block_number(0),
739+
BlockRange::from_block_number(30),
740+
])
741+
.await
742+
.unwrap();
743+
assert_eq!(
744+
[transactions[0..=1].to_vec(), transactions[3..=4].to_vec()].concat(),
745+
transaction_result
746+
);
747+
}
748+
}
749+
679750
#[tokio::test]
680751
async fn repository_store_block_range() {
681752
let connection = Arc::new(cardano_tx_db_connection().unwrap());

mithril-aggregator/src/dependency_injection/builder.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1366,7 +1366,8 @@ impl DependenciesBuilder {
13661366
/// build Prover service
13671367
pub async fn build_prover_service(&mut self) -> Result<Arc<dyn ProverService>> {
13681368
let transaction_retriever = self.get_transaction_repository().await?;
1369-
let service = MithrilProverService::new(transaction_retriever);
1369+
let block_range_root_retriever = self.get_transaction_repository().await?;
1370+
let service = MithrilProverService::new(transaction_retriever, block_range_root_retriever);
13701371

13711372
Ok(Arc::new(service))
13721373
}

0 commit comments

Comments
 (0)