Skip to content

Commit 106745d

Browse files
committed
Handle gap between two block ranges in transaction importers
Two transactions that we get from the chain may have a gap of block numbers that is larger than a block range. In this case the importer still tried to compute the merkle root for the block ranges that did not contains any transaction, leading to an error.
1 parent 799f046 commit 106745d

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed

mithril-aggregator/src/services/cardano_transactions_importer.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,11 @@ impl CardanoTransactionsImporter {
146146
.transaction_store
147147
.get_transactions_between(block_range.start..block_range.end)
148148
.await?;
149+
150+
if transactions.is_empty() {
151+
continue;
152+
}
153+
149154
let merkle_root = MKTree::new(&transactions)?.compute_root()?;
150155
block_ranges_with_merkle_root.push((block_range, merkle_root));
151156
}
@@ -311,6 +316,43 @@ mod tests {
311316
);
312317
}
313318

319+
#[tokio::test]
320+
async fn handle_gap_between_block_ranges() {
321+
let connection = cardano_tx_db_connection().unwrap();
322+
let repository = Arc::new(CardanoTransactionRepository::new(Arc::new(connection)));
323+
324+
// Two block ranges with a gap
325+
let blocks: Vec<ScannedBlock> = [
326+
build_blocks(0, BlockRange::LENGTH),
327+
build_blocks(BlockRange::LENGTH * 3, BlockRange::LENGTH),
328+
]
329+
.concat();
330+
let transactions = into_transactions(&blocks);
331+
repository.store_transactions(transactions).await.unwrap();
332+
333+
let importer = CardanoTransactionsImporter::new_for_test(
334+
Arc::new(MockBlockScannerImpl::new()),
335+
repository.clone(),
336+
);
337+
338+
importer
339+
.import_block_ranges()
340+
.await
341+
.expect("Transactions Importer should succeed");
342+
343+
let block_range_roots = repository.get_all_block_range_root().unwrap();
344+
assert_eq!(
345+
vec![
346+
BlockRange::from_block_number(0),
347+
BlockRange::from_block_number(BlockRange::LENGTH * 3),
348+
],
349+
block_range_roots
350+
.into_iter()
351+
.map(|r| r.range)
352+
.collect::<Vec<_>>()
353+
);
354+
}
355+
314356
#[tokio::test]
315357
async fn if_all_block_ranges_computed_nothing_computed_and_stored() {
316358
let connection = cardano_tx_db_connection().unwrap();

mithril-signer/src/cardano_transactions_importer.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,11 @@ impl CardanoTransactionsImporter {
146146
.transaction_store
147147
.get_transactions_between(block_range.start..block_range.end)
148148
.await?;
149+
150+
if transactions.is_empty() {
151+
continue;
152+
}
153+
149154
let merkle_root = MKTree::new(&transactions)?.compute_root()?;
150155
block_ranges_with_merkle_root.push((block_range, merkle_root));
151156
}
@@ -311,6 +316,43 @@ mod tests {
311316
);
312317
}
313318

319+
#[tokio::test]
320+
async fn handle_gap_between_block_ranges() {
321+
let connection = cardano_tx_db_connection().unwrap();
322+
let repository = Arc::new(CardanoTransactionRepository::new(Arc::new(connection)));
323+
324+
// Two block ranges with a gap
325+
let blocks: Vec<ScannedBlock> = [
326+
build_blocks(0, BlockRange::LENGTH),
327+
build_blocks(BlockRange::LENGTH * 3, BlockRange::LENGTH),
328+
]
329+
.concat();
330+
let transactions = into_transactions(&blocks);
331+
repository.store_transactions(transactions).await.unwrap();
332+
333+
let importer = CardanoTransactionsImporter::new_for_test(
334+
Arc::new(MockBlockScannerImpl::new()),
335+
repository.clone(),
336+
);
337+
338+
importer
339+
.import_block_ranges()
340+
.await
341+
.expect("Transactions Importer should succeed");
342+
343+
let block_range_roots = repository.get_all_block_range_root().unwrap();
344+
assert_eq!(
345+
vec![
346+
BlockRange::from_block_number(0),
347+
BlockRange::from_block_number(BlockRange::LENGTH * 3),
348+
],
349+
block_range_roots
350+
.into_iter()
351+
.map(|r| r.range)
352+
.collect::<Vec<_>>()
353+
);
354+
}
355+
314356
#[tokio::test]
315357
async fn if_all_block_ranges_computed_nothing_computed_and_stored() {
316358
let connection = cardano_tx_db_connection().unwrap();

0 commit comments

Comments
 (0)