diff --git a/Cargo.lock b/Cargo.lock index b8b5ffc69f8..d8f47525a01 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3547,7 +3547,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.46" +version = "0.5.47" dependencies = [ "anyhow", "async-trait", @@ -3624,7 +3624,7 @@ dependencies = [ [[package]] name = "mithril-client" -version = "0.8.7" +version = "0.8.8" dependencies = [ "anyhow", "async-recursion", @@ -3703,7 +3703,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.34" +version = "0.4.35" dependencies = [ "anyhow", "async-trait", @@ -3801,7 +3801,7 @@ dependencies = [ [[package]] name = "mithril-persistence" -version = "0.2.18" +version = "0.2.19" dependencies = [ "anyhow", "async-trait", @@ -3848,7 +3848,7 @@ dependencies = [ [[package]] name = "mithril-signer" -version = "0.2.167" +version = "0.2.168" dependencies = [ "anyhow", "async-trait", diff --git a/internal/mithril-persistence/Cargo.toml b/internal/mithril-persistence/Cargo.toml index cb86f17c2f6..d44604a02b5 100644 --- a/internal/mithril-persistence/Cargo.toml +++ b/internal/mithril-persistence/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-persistence" -version = "0.2.18" +version = "0.2.19" description = "Common types, interfaces, and utilities to persist data for Mithril nodes." authors = { workspace = true } edition = { workspace = true } diff --git a/internal/mithril-persistence/src/database/hydrator.rs b/internal/mithril-persistence/src/database/hydrator.rs index 7b0087a45f3..8a3c73fa4e8 100644 --- a/internal/mithril-persistence/src/database/hydrator.rs +++ b/internal/mithril-persistence/src/database/hydrator.rs @@ -97,7 +97,7 @@ mod tests { #[test] fn hydrate_cardano_transaction_signed_entity_type() { - let expected = SignedEntityType::CardanoTransactions(Epoch(35), 77); + let expected = SignedEntityType::CardanoTransactions(Epoch(35), BlockNumber(77)); let signed_entity = Hydrator::hydrate_signed_entity_type( SignedEntityTypeDiscriminants::CardanoTransactions.index(), &expected.get_json_beacon().unwrap(), diff --git a/internal/mithril-persistence/src/database/query/block_range_root/delete_block_range_root.rs b/internal/mithril-persistence/src/database/query/block_range_root/delete_block_range_root.rs index e3f9165a581..37667678dcc 100644 --- a/internal/mithril-persistence/src/database/query/block_range_root/delete_block_range_root.rs +++ b/internal/mithril-persistence/src/database/query/block_range_root/delete_block_range_root.rs @@ -82,7 +82,10 @@ mod tests { let cursor = connection .fetch( - DeleteBlockRangeRootQuery::contains_or_above_block_number_threshold(100).unwrap(), + DeleteBlockRangeRootQuery::contains_or_above_block_number_threshold(BlockNumber( + 100, + )) + .unwrap(), ) .expect("pruning shouldn't crash without block range root stored"); assert_eq!(0, cursor.count()); @@ -90,13 +93,13 @@ mod tests { #[test] fn test_prune_all_data_if_given_block_number_is_lower_than_stored_number_of_block() { - parameterized_test_prune_block_range(0, block_range_root_dataset().len()); + parameterized_test_prune_block_range(BlockNumber(0), block_range_root_dataset().len()); } #[test] fn test_prune_keep_all_block_range_root_if_given_number_of_block_is_greater_than_the_highest_one( ) { - parameterized_test_prune_block_range(100_000, 0); + parameterized_test_prune_block_range(BlockNumber(100_000), 0); } #[test] diff --git a/internal/mithril-persistence/src/database/query/block_range_root/get_block_range_root.rs b/internal/mithril-persistence/src/database/query/block_range_root/get_block_range_root.rs index e8f12aefa02..4e109b38def 100644 --- a/internal/mithril-persistence/src/database/query/block_range_root/get_block_range_root.rs +++ b/internal/mithril-persistence/src/database/query/block_range_root/get_block_range_root.rs @@ -19,7 +19,10 @@ impl GetBlockRangeRootQuery { pub fn contains_or_below_block_number(block_number: BlockNumber) -> Self { Self { - condition: WhereCondition::new("start < ?*", vec![Value::Integer(block_number as i64)]), + condition: WhereCondition::new( + "start < ?*", + vec![Value::Integer(*block_number as i64)], + ), } } @@ -60,15 +63,15 @@ mod tests { fn block_range_root_dataset() -> Vec { [ ( - BlockRange::from_block_number(15), + BlockRange::from_block_number(BlockNumber(15)), MKTreeNode::from_hex("AAAA").unwrap(), ), ( - BlockRange::from_block_number(30), + BlockRange::from_block_number(BlockNumber(30)), MKTreeNode::from_hex("BBBB").unwrap(), ), ( - BlockRange::from_block_number(45), + BlockRange::from_block_number(BlockNumber(45)), MKTreeNode::from_hex("CCCC").unwrap(), ), ] @@ -82,7 +85,9 @@ mod tests { let connection = cardano_tx_db_connection().unwrap(); let cursor: Vec = connection - .fetch_collect(GetBlockRangeRootQuery::contains_or_below_block_number(100)) + .fetch_collect(GetBlockRangeRootQuery::contains_or_below_block_number( + BlockNumber(100), + )) .unwrap(); assert_eq!(Vec::::new(), cursor); } @@ -95,7 +100,7 @@ mod tests { let cursor: Vec = connection .fetch_collect(GetBlockRangeRootQuery::contains_or_below_block_number( - 10_000, + BlockNumber(10_000), )) .unwrap(); @@ -109,7 +114,9 @@ mod tests { insert_block_range_roots(&connection, dataset.clone()); let cursor: Vec = connection - .fetch_collect(GetBlockRangeRootQuery::contains_or_below_block_number(44)) + .fetch_collect(GetBlockRangeRootQuery::contains_or_below_block_number( + BlockNumber(44), + )) .unwrap(); assert_eq!(&dataset[0..2], &cursor); @@ -122,7 +129,9 @@ mod tests { insert_block_range_roots(&connection, dataset.clone()); let cursor: Vec = connection - .fetch_collect(GetBlockRangeRootQuery::contains_or_below_block_number(45)) + .fetch_collect(GetBlockRangeRootQuery::contains_or_below_block_number( + BlockNumber(45), + )) .unwrap(); assert_eq!(&dataset[0..2], &cursor); @@ -135,7 +144,9 @@ mod tests { insert_block_range_roots(&connection, dataset.clone()); let cursor: Vec = connection - .fetch_collect(GetBlockRangeRootQuery::contains_or_below_block_number(46)) + .fetch_collect(GetBlockRangeRootQuery::contains_or_below_block_number( + BlockNumber(46), + )) .unwrap(); assert_eq!(dataset, cursor); diff --git a/internal/mithril-persistence/src/database/query/cardano_transaction/delete_cardano_transaction.rs b/internal/mithril-persistence/src/database/query/cardano_transaction/delete_cardano_transaction.rs index 407b74de6a5..b83004df813 100644 --- a/internal/mithril-persistence/src/database/query/cardano_transaction/delete_cardano_transaction.rs +++ b/internal/mithril-persistence/src/database/query/cardano_transaction/delete_cardano_transaction.rs @@ -67,12 +67,12 @@ mod tests { fn test_transaction_set() -> Vec { vec![ - CardanoTransactionRecord::new("tx-hash-0", 10, 50, "block-hash-10"), - CardanoTransactionRecord::new("tx-hash-1", 10, 51, "block-hash-10"), - CardanoTransactionRecord::new("tx-hash-2", 11, 52, "block-hash-11"), - CardanoTransactionRecord::new("tx-hash-3", 11, 53, "block-hash-11"), - CardanoTransactionRecord::new("tx-hash-4", 12, 54, "block-hash-12"), - CardanoTransactionRecord::new("tx-hash-5", 12, 55, "block-hash-12"), + CardanoTransactionRecord::new("tx-hash-0", BlockNumber(10), 50, "block-hash-10"), + CardanoTransactionRecord::new("tx-hash-1", BlockNumber(10), 51, "block-hash-10"), + CardanoTransactionRecord::new("tx-hash-2", BlockNumber(11), 52, "block-hash-11"), + CardanoTransactionRecord::new("tx-hash-3", BlockNumber(11), 53, "block-hash-11"), + CardanoTransactionRecord::new("tx-hash-4", BlockNumber(12), 54, "block-hash-12"), + CardanoTransactionRecord::new("tx-hash-5", BlockNumber(12), 55, "block-hash-12"), ] } @@ -84,7 +84,10 @@ mod tests { let connection = cardano_tx_db_connection().unwrap(); let cursor = connection - .fetch(DeleteCardanoTransactionQuery::below_block_number_threshold(100).unwrap()) + .fetch( + DeleteCardanoTransactionQuery::below_block_number_threshold(BlockNumber(100)) + .unwrap(), + ) .expect("pruning shouldn't crash without transactions stored"); assert_eq!(0, cursor.count()); } @@ -95,7 +98,8 @@ mod tests { insert_transactions(&connection, test_transaction_set()); let query = - DeleteCardanoTransactionQuery::below_block_number_threshold(100_000).unwrap(); + DeleteCardanoTransactionQuery::below_block_number_threshold(BlockNumber(100_000)) + .unwrap(); let cursor = connection.fetch(query).unwrap(); assert_eq!(test_transaction_set().len(), cursor.count()); @@ -108,7 +112,8 @@ mod tests { let connection = cardano_tx_db_connection().unwrap(); insert_transactions(&connection, test_transaction_set()); - let query = DeleteCardanoTransactionQuery::below_block_number_threshold(0).unwrap(); + let query = DeleteCardanoTransactionQuery::below_block_number_threshold(BlockNumber(0)) + .unwrap(); let cursor = connection.fetch(query).unwrap(); assert_eq!(0, cursor.count()); @@ -121,7 +126,9 @@ mod tests { let connection = cardano_tx_db_connection().unwrap(); insert_transactions(&connection, test_transaction_set()); - let query = DeleteCardanoTransactionQuery::below_block_number_threshold(12).unwrap(); + let query = + DeleteCardanoTransactionQuery::below_block_number_threshold(BlockNumber(12)) + .unwrap(); let cursor = connection.fetch(query).unwrap(); assert_eq!(4, cursor.count()); @@ -138,7 +145,10 @@ mod tests { let connection = cardano_tx_db_connection().unwrap(); let cursor = connection - .fetch(DeleteCardanoTransactionQuery::above_block_number_threshold(100).unwrap()) + .fetch( + DeleteCardanoTransactionQuery::above_block_number_threshold(BlockNumber(100)) + .unwrap(), + ) .expect("pruning shouldn't crash without transactions stored"); assert_eq!(0, cursor.count()); } @@ -148,7 +158,8 @@ mod tests { let connection = cardano_tx_db_connection().unwrap(); insert_transactions(&connection, test_transaction_set()); - let query = DeleteCardanoTransactionQuery::above_block_number_threshold(0).unwrap(); + let query = DeleteCardanoTransactionQuery::above_block_number_threshold(BlockNumber(0)) + .unwrap(); let cursor = connection.fetch(query).unwrap(); assert_eq!(test_transaction_set().len(), cursor.count()); @@ -163,7 +174,8 @@ mod tests { insert_transactions(&connection, test_transaction_set()); let query = - DeleteCardanoTransactionQuery::above_block_number_threshold(100_000).unwrap(); + DeleteCardanoTransactionQuery::above_block_number_threshold(BlockNumber(100_000)) + .unwrap(); let cursor = connection.fetch(query).unwrap(); assert_eq!(0, cursor.count()); @@ -176,7 +188,9 @@ mod tests { let connection = cardano_tx_db_connection().unwrap(); insert_transactions(&connection, test_transaction_set()); - let query = DeleteCardanoTransactionQuery::above_block_number_threshold(10).unwrap(); + let query = + DeleteCardanoTransactionQuery::above_block_number_threshold(BlockNumber(10)) + .unwrap(); let cursor = connection.fetch(query).unwrap(); assert_eq!(4, cursor.count()); diff --git a/internal/mithril-persistence/src/database/query/cardano_transaction/get_cardano_transaction.rs b/internal/mithril-persistence/src/database/query/cardano_transaction/get_cardano_transaction.rs index d6157e707e7..fbfc77b6df3 100644 --- a/internal/mithril-persistence/src/database/query/cardano_transaction/get_cardano_transaction.rs +++ b/internal/mithril-persistence/src/database/query/cardano_transaction/get_cardano_transaction.rs @@ -37,7 +37,7 @@ impl GetCardanoTransactionQuery { let condition = WhereCondition::where_in("transaction_hash", hashes_values).and_where( WhereCondition::new( "block_number <= ?*", - vec![Value::Integer(up_to_or_equal as i64)], + vec![Value::Integer(*up_to_or_equal as i64)], ), ); @@ -50,8 +50,8 @@ impl GetCardanoTransactionQuery { condition = condition.or_where(WhereCondition::new( "(block_number >= ?* and block_number < ?*)", vec![ - Value::Integer(block_range.start as i64), - Value::Integer(block_range.end as i64), + Value::Integer(*block_range.start as i64), + Value::Integer(*block_range.end as i64), ], )) } @@ -62,11 +62,11 @@ impl GetCardanoTransactionQuery { pub fn between_blocks(range: Range) -> Self { let condition = WhereCondition::new( "block_number >= ?*", - vec![Value::Integer(range.start as i64)], + vec![Value::Integer(*range.start as i64)], ) .and_where(WhereCondition::new( "block_number < ?*", - vec![Value::Integer(range.end as i64)], + vec![Value::Integer(*range.end as i64)], )); Self { condition } @@ -132,10 +132,10 @@ mod tests { insert_transactions( &connection, vec![ - CardanoTransactionRecord::new("tx-hash-0", 10, 50, "block-hash-10"), - CardanoTransactionRecord::new("tx-hash-1", 10, 51, "block-hash-10"), - CardanoTransactionRecord::new("tx-hash-2", 11, 54, "block-hash-11"), - CardanoTransactionRecord::new("tx-hash-3", 11, 55, "block-hash-11"), + CardanoTransactionRecord::new("tx-hash-0", BlockNumber(10), 50, "block-hash-10"), + CardanoTransactionRecord::new("tx-hash-1", BlockNumber(10), 51, "block-hash-10"), + CardanoTransactionRecord::new("tx-hash-2", BlockNumber(11), 54, "block-hash-11"), + CardanoTransactionRecord::new("tx-hash-3", BlockNumber(11), 55, "block-hash-11"), ], ); @@ -144,8 +144,8 @@ mod tests { .unwrap(); assert_eq!( vec![ - CardanoTransactionRecord::new("tx-hash-2", 11, 54, "block-hash-11"), - CardanoTransactionRecord::new("tx-hash-3", 11, 55, "block-hash-11"), + CardanoTransactionRecord::new("tx-hash-2", BlockNumber(11), 54, "block-hash-11"), + CardanoTransactionRecord::new("tx-hash-3", BlockNumber(11), 55, "block-hash-11"), ], records ); diff --git a/internal/mithril-persistence/src/database/record/block_range_root.rs b/internal/mithril-persistence/src/database/record/block_range_root.rs index 332e4dc1e30..47fcee9d7fe 100644 --- a/internal/mithril-persistence/src/database/record/block_range_root.rs +++ b/internal/mithril-persistence/src/database/record/block_range_root.rs @@ -1,7 +1,7 @@ use sqlite::Row; use mithril_common::crypto_helper::MKTreeNode; -use mithril_common::entities::BlockRange; +use mithril_common::entities::{BlockNumber, BlockRange}; use crate::database::Hydrator; use crate::sqlite::{HydrationError, Projection, SqLiteEntity}; @@ -37,7 +37,7 @@ impl SqLiteEntity for BlockRangeRootRecord { { let start = Hydrator::try_to_u64("block_range.start", row.read::(0))?; let end = Hydrator::try_to_u64("block_range.end", row.read::(1))?; - let range = BlockRange::from_block_number(start); + let range = BlockRange::from_block_number(BlockNumber(start)); let merkle_root = row.read::<&str, _>(2); if range.start != start || range.end != end { @@ -71,8 +71,6 @@ impl SqLiteEntity for BlockRangeRootRecord { mod tests { use sqlite::Connection; - use mithril_common::entities::BlockNumber; - use super::*; fn select_block_range_from_db(start: BlockNumber, end: BlockNumber, merkle_root: &str) -> Row { @@ -86,13 +84,13 @@ mod tests { fn hydrate_succeed_if_valid_block_range_in_row() { // A valid block range has both bounds as multiples of block range length and the interval // size is equal to block range length. - let row = select_block_range_from_db(0, BlockRange::LENGTH, "AAAA"); + let row = select_block_range_from_db(BlockNumber(0), BlockRange::LENGTH, "AAAA"); let res = BlockRangeRootRecord::hydrate(row).expect("Expected hydrate to succeed"); assert_eq!( res, BlockRangeRootRecord { - range: BlockRange::from_block_number(0), + range: BlockRange::from_block_number(BlockNumber(0)), merkle_root: MKTreeNode::from_hex("AAAA").unwrap(), } ); @@ -102,11 +100,11 @@ mod tests { fn hydrate_fail_if_invalid_block_range_in_row() { for invalid_row in [ // Start is not a multiple of block range length - select_block_range_from_db(1, BlockRange::LENGTH, "AAAA"), + select_block_range_from_db(BlockNumber(1), BlockRange::LENGTH, "AAAA"), // End is not a multiple of block range length - select_block_range_from_db(0, BlockRange::LENGTH - 1, "AAAA"), + select_block_range_from_db(BlockNumber(0), BlockRange::LENGTH - 1, "AAAA"), // Interval is not equal to block range length - select_block_range_from_db(0, BlockRange::LENGTH * 4, "AAAA"), + select_block_range_from_db(BlockNumber(0), BlockRange::LENGTH * 4, "AAAA"), ] { let res = BlockRangeRootRecord::hydrate(invalid_row).expect_err("Expected hydrate to fail"); diff --git a/internal/mithril-persistence/src/database/record/cardano_transaction.rs b/internal/mithril-persistence/src/database/record/cardano_transaction.rs index 137a0f56340..9846f8ccc7c 100644 --- a/internal/mithril-persistence/src/database/record/cardano_transaction.rs +++ b/internal/mithril-persistence/src/database/record/cardano_transaction.rs @@ -74,7 +74,7 @@ impl SqLiteEntity for CardanoTransactionRecord { Ok(Self { transaction_hash: transaction_hash.to_string(), - block_number, + block_number: BlockNumber(block_number), slot_number, block_hash: block_hash.to_string(), }) diff --git a/internal/mithril-persistence/src/database/repository/cardano_transaction_repository.rs b/internal/mithril-persistence/src/database/repository/cardano_transaction_repository.rs index daf4614ce89..310683efe51 100644 --- a/internal/mithril-persistence/src/database/repository/cardano_transaction_repository.rs +++ b/internal/mithril-persistence/src/database/repository/cardano_transaction_repository.rs @@ -136,6 +136,7 @@ impl CardanoTransactionRepository { highest .map(u64::try_from) .transpose() + .map(|num| num.map(BlockNumber)) .with_context(|| format!("Integer field max(start) (value={highest:?}) is incompatible with u64 representation.") ) @@ -262,7 +263,7 @@ impl CardanoTransactionRepository { .get_highest_start_block_number_for_block_range_roots() .await? { - let threshold = highest_block_range_start.saturating_sub(number_of_blocks_to_keep); + let threshold = highest_block_range_start - number_of_blocks_to_keep; let query = DeleteCardanoTransactionQuery::below_block_number_threshold(threshold)?; let connection = self.connection_pool.connection()?; @@ -278,7 +279,7 @@ impl CardanoTransactionRepository { /// * Remove block range roots that have lower bound range strictly above the given block number pub async fn remove_rolled_back_transactions_and_block_range( &self, - block_number: SlotNumber, + block_number: BlockNumber, ) -> StdResult<()> { let connection = self.connection_pool.connection()?; let transaction = connection.begin_transaction()?; @@ -321,8 +322,8 @@ mod tests { repository .create_transactions(vec![ - CardanoTransaction::new("tx_hash-123", 10, 50, "block_hash-123"), - CardanoTransaction::new("tx_hash-456", 11, 51, "block_hash-456"), + CardanoTransaction::new("tx_hash-123", BlockNumber(10), 50, "block_hash-123"), + CardanoTransaction::new("tx_hash-456", BlockNumber(11), 51, "block_hash-456"), ]) .await .unwrap(); @@ -332,7 +333,7 @@ mod tests { assert_eq!( Some(CardanoTransactionRecord { transaction_hash: "tx_hash-123".to_string(), - block_number: 10, + block_number: BlockNumber(10), slot_number: 50, block_hash: "block_hash-123".to_string(), }), @@ -353,60 +354,106 @@ mod tests { repository .create_transactions(vec![ - CardanoTransactionRecord::new("tx_hash-123", 10, 50, "block_hash-123"), - CardanoTransactionRecord::new("tx_hash-456", 11, 51, "block_hash-456"), - CardanoTransactionRecord::new("tx_hash-789", 12, 52, "block_hash-789"), - CardanoTransactionRecord::new("tx_hash-000", 101, 100, "block_hash-000"), + CardanoTransactionRecord::new("tx_hash-123", BlockNumber(10), 50, "block_hash-123"), + CardanoTransactionRecord::new("tx_hash-456", BlockNumber(11), 51, "block_hash-456"), + CardanoTransactionRecord::new("tx_hash-789", BlockNumber(12), 52, "block_hash-789"), + CardanoTransactionRecord::new( + "tx_hash-000", + BlockNumber(101), + 100, + "block_hash-000", + ), ]) .await .unwrap(); { let transactions = repository - .get_transaction_by_hashes(vec!["tx_hash-123", "tx_hash-789"], 100) + .get_transaction_by_hashes(vec!["tx_hash-123", "tx_hash-789"], BlockNumber(100)) .await .unwrap(); assert_eq!( vec![ - CardanoTransactionRecord::new("tx_hash-123", 10, 50, "block_hash-123"), - CardanoTransactionRecord::new("tx_hash-789", 12, 52, "block_hash-789"), + CardanoTransactionRecord::new( + "tx_hash-123", + BlockNumber(10), + 50, + "block_hash-123" + ), + CardanoTransactionRecord::new( + "tx_hash-789", + BlockNumber(12), + 52, + "block_hash-789" + ), ], transactions ); } { let transactions = repository - .get_transaction_by_hashes(vec!["tx_hash-123", "tx_hash-789", "tx_hash-000"], 100) + .get_transaction_by_hashes( + vec!["tx_hash-123", "tx_hash-789", "tx_hash-000"], + BlockNumber(100), + ) .await .unwrap(); assert_eq!( vec![ - CardanoTransactionRecord::new("tx_hash-123", 10, 50, "block_hash-123"), - CardanoTransactionRecord::new("tx_hash-789", 12, 52, "block_hash-789"), + CardanoTransactionRecord::new( + "tx_hash-123", + BlockNumber(10), + 50, + "block_hash-123" + ), + CardanoTransactionRecord::new( + "tx_hash-789", + BlockNumber(12), + 52, + "block_hash-789" + ), ], transactions ); } { let transactions = repository - .get_transaction_by_hashes(vec!["tx_hash-123", "tx_hash-789", "tx_hash-000"], 101) + .get_transaction_by_hashes( + vec!["tx_hash-123", "tx_hash-789", "tx_hash-000"], + BlockNumber(101), + ) .await .unwrap(); assert_eq!( vec![ - CardanoTransactionRecord::new("tx_hash-123", 10, 50, "block_hash-123"), - CardanoTransactionRecord::new("tx_hash-789", 12, 52, "block_hash-789"), - CardanoTransactionRecord::new("tx_hash-000", 101, 100, "block_hash-000"), + CardanoTransactionRecord::new( + "tx_hash-123", + BlockNumber(10), + 50, + "block_hash-123" + ), + CardanoTransactionRecord::new( + "tx_hash-789", + BlockNumber(12), + 52, + "block_hash-789" + ), + CardanoTransactionRecord::new( + "tx_hash-000", + BlockNumber(101), + 100, + "block_hash-000" + ), ], transactions ); } { let transactions = repository - .get_transaction_by_hashes(vec!["not-exist".to_string()], 100) + .get_transaction_by_hashes(vec!["not-exist".to_string()], BlockNumber(100)) .await .unwrap(); @@ -422,11 +469,11 @@ mod tests { )); repository - .create_transaction("tx-hash-123", 10, 50, "block_hash-123") + .create_transaction("tx-hash-123", BlockNumber(10), 50, "block_hash-123") .await .unwrap(); repository - .create_transaction("tx-hash-123", 11, 51, "block_hash-123-bis") + .create_transaction("tx-hash-123", BlockNumber(11), 51, "block_hash-123-bis") .await .unwrap(); let transaction_result = repository.get_transaction("tx-hash-123").await.unwrap(); @@ -434,7 +481,7 @@ mod tests { assert_eq!( Some(CardanoTransactionRecord { transaction_hash: "tx-hash-123".to_string(), - block_number: 10, + block_number: BlockNumber(10), slot_number: 50, block_hash: "block_hash-123".to_string(), }), @@ -450,8 +497,8 @@ mod tests { )); let cardano_transactions = vec![ - CardanoTransaction::new("tx-hash-123", 10, 50, "block-hash-123"), - CardanoTransaction::new("tx-hash-456", 11, 51, "block-hash-456"), + CardanoTransaction::new("tx-hash-123", BlockNumber(10), 50, "block-hash-123"), + CardanoTransaction::new("tx-hash-456", BlockNumber(11), 51, "block-hash-456"), ]; repository .create_transactions(cardano_transactions) @@ -463,7 +510,7 @@ mod tests { assert_eq!( Some(CardanoTransactionRecord { transaction_hash: "tx-hash-123".to_string(), - block_number: 10, + block_number: BlockNumber(10), slot_number: 50, block_hash: "block-hash-123".to_string(), }), @@ -475,7 +522,7 @@ mod tests { assert_eq!( Some(CardanoTransactionRecord { transaction_hash: "tx-hash-456".to_string(), - block_number: 11, + block_number: BlockNumber(11), slot_number: 51, block_hash: "block-hash-456".to_string(), }), @@ -491,8 +538,8 @@ mod tests { )); let cardano_transactions = vec![ - CardanoTransaction::new("tx-hash-123".to_string(), 10, 50, "block-hash-123"), - CardanoTransaction::new("tx-hash-456".to_string(), 11, 51, "block-hash-456"), + CardanoTransaction::new("tx-hash-123", BlockNumber(10), 50, "block-hash-123"), + CardanoTransaction::new("tx-hash-456", BlockNumber(11), 51, "block-hash-456"), ]; repository .create_transactions(cardano_transactions.clone()) @@ -516,13 +563,13 @@ mod tests { )); repository - .create_transaction("tx-hash-000", 1, 5, "block-hash") + .create_transaction("tx-hash-000", BlockNumber(1), 5, "block-hash") .await .unwrap(); let cardano_transactions = vec![CardanoTransaction::new( "tx-hash-123", - 10, + BlockNumber(10), 50, "block-hash-123", )]; @@ -536,7 +583,7 @@ mod tests { assert_eq!( Some(CardanoTransactionRecord { transaction_hash: "tx-hash-000".to_string(), - block_number: 1, + block_number: BlockNumber(1), slot_number: 5, block_hash: "block-hash".to_string(), }), @@ -566,8 +613,8 @@ mod tests { )); let cardano_transactions = vec![ - CardanoTransaction::new("tx-hash-123", 10, 50, "block-hash-10"), - CardanoTransaction::new("tx-hash-456", 25, 51, "block-hash-25"), + CardanoTransaction::new("tx-hash-123", BlockNumber(10), 50, "block-hash-10"), + CardanoTransaction::new("tx-hash-456", BlockNumber(25), 51, "block-hash-25"), ]; repository .create_transactions(cardano_transactions) @@ -581,7 +628,7 @@ mod tests { assert_eq!( Some(ChainPoint { slot_number: 51, - block_number: 25, + block_number: BlockNumber(25), block_hash: "block-hash-25".to_string() }), highest_beacon @@ -597,9 +644,9 @@ mod tests { )); let cardano_transactions = vec![ - CardanoTransaction::new("tx-hash-123", 10, 50, "block-hash-10"), - CardanoTransaction::new("tx-hash-456", 25, 51, "block-hash-25"), - CardanoTransaction::new("tx-hash-789", 25, 51, "block-hash-25"), + CardanoTransaction::new("tx-hash-123", BlockNumber(10), 50, "block-hash-10"), + CardanoTransaction::new("tx-hash-456", BlockNumber(25), 51, "block-hash-25"), + CardanoTransaction::new("tx-hash-789", BlockNumber(25), 51, "block-hash-25"), ]; repository .create_transactions(cardano_transactions) @@ -613,7 +660,7 @@ mod tests { assert_eq!( Some(ChainPoint { slot_number: 51, - block_number: 25, + block_number: BlockNumber(25), block_hash: "block-hash-25".to_string() }), highest_beacon @@ -628,9 +675,9 @@ mod tests { )); let transactions = vec![ - CardanoTransactionRecord::new("tx-hash-1", 10, 50, "block-hash-1"), - CardanoTransactionRecord::new("tx-hash-2", 11, 51, "block-hash-2"), - CardanoTransactionRecord::new("tx-hash-3", 12, 52, "block-hash-3"), + CardanoTransactionRecord::new("tx-hash-1", BlockNumber(10), 50, "block-hash-1"), + CardanoTransactionRecord::new("tx-hash-2", BlockNumber(11), 51, "block-hash-2"), + CardanoTransactionRecord::new("tx-hash-3", BlockNumber(12), 52, "block-hash-3"), ]; repository .create_transactions(transactions.clone()) @@ -639,35 +686,35 @@ mod tests { { let transaction_result = repository - .get_transactions_in_range_blocks(0..10) + .get_transactions_in_range_blocks(BlockNumber(0)..BlockNumber(10)) .await .unwrap(); assert_eq!(Vec::::new(), transaction_result); } { let transaction_result = repository - .get_transactions_in_range_blocks(13..21) + .get_transactions_in_range_blocks(BlockNumber(13)..BlockNumber(21)) .await .unwrap(); assert_eq!(Vec::::new(), transaction_result); } { let transaction_result = repository - .get_transactions_in_range_blocks(9..12) + .get_transactions_in_range_blocks(BlockNumber(9)..BlockNumber(12)) .await .unwrap(); assert_eq!(transactions[0..=1].to_vec(), transaction_result); } { let transaction_result = repository - .get_transactions_in_range_blocks(10..13) + .get_transactions_in_range_blocks(BlockNumber(10)..BlockNumber(13)) .await .unwrap(); assert_eq!(transactions.clone(), transaction_result); } { let transaction_result = repository - .get_transactions_in_range_blocks(11..14) + .get_transactions_in_range_blocks(BlockNumber(11)..BlockNumber(14)) .await .unwrap(); assert_eq!(transactions[1..=2].to_vec(), transaction_result); @@ -682,12 +729,12 @@ mod tests { )); let transactions = vec![ - CardanoTransactionRecord::new("tx-hash-1", 10, 50, "block-hash-1"), - CardanoTransactionRecord::new("tx-hash-2", 11, 51, "block-hash-2"), - CardanoTransactionRecord::new("tx-hash-3", 20, 52, "block-hash-3"), - CardanoTransactionRecord::new("tx-hash-4", 31, 53, "block-hash-4"), - CardanoTransactionRecord::new("tx-hash-5", 35, 54, "block-hash-5"), - CardanoTransactionRecord::new("tx-hash-6", 46, 55, "block-hash-6"), + CardanoTransactionRecord::new("tx-hash-1", BlockNumber(10), 50, "block-hash-1"), + CardanoTransactionRecord::new("tx-hash-2", BlockNumber(11), 51, "block-hash-2"), + CardanoTransactionRecord::new("tx-hash-3", BlockNumber(20), 52, "block-hash-3"), + CardanoTransactionRecord::new("tx-hash-4", BlockNumber(31), 53, "block-hash-4"), + CardanoTransactionRecord::new("tx-hash-5", BlockNumber(35), 54, "block-hash-5"), + CardanoTransactionRecord::new("tx-hash-6", BlockNumber(46), 55, "block-hash-6"), ]; repository .create_transactions(transactions.clone()) @@ -696,14 +743,18 @@ mod tests { { let transaction_result = repository - .get_transaction_by_block_ranges(vec![BlockRange::from_block_number(100)]) + .get_transaction_by_block_ranges(vec![BlockRange::from_block_number(BlockNumber( + 100, + ))]) .await .unwrap(); assert_eq!(Vec::::new(), transaction_result); } { let transaction_result = repository - .get_transaction_by_block_ranges(vec![BlockRange::from_block_number(0)]) + .get_transaction_by_block_ranges(vec![BlockRange::from_block_number(BlockNumber( + 0, + ))]) .await .unwrap(); assert_eq!(transactions[0..=1].to_vec(), transaction_result); @@ -711,8 +762,8 @@ mod tests { { let transaction_result = repository .get_transaction_by_block_ranges(vec![ - BlockRange::from_block_number(0), - BlockRange::from_block_number(15), + BlockRange::from_block_number(BlockNumber(0)), + BlockRange::from_block_number(BlockNumber(15)), ]) .await .unwrap(); @@ -721,8 +772,8 @@ mod tests { { let transaction_result = repository .get_transaction_by_block_ranges(vec![ - BlockRange::from_block_number(0), - BlockRange::from_block_number(30), + BlockRange::from_block_number(BlockNumber(0)), + BlockRange::from_block_number(BlockNumber(30)), ]) .await .unwrap(); @@ -741,9 +792,9 @@ mod tests { )); let transactions = vec![ - CardanoTransactionRecord::new("tx-1", 100, 500, "block-1"), - CardanoTransactionRecord::new("tx-2", 100, 500, "block-1"), - CardanoTransactionRecord::new("tx-3", 101, 501, "block-1"), + CardanoTransactionRecord::new("tx-1", BlockNumber(100), 500, "block-1"), + CardanoTransactionRecord::new("tx-2", BlockNumber(100), 500, "block-1"), + CardanoTransactionRecord::new("tx-3", BlockNumber(101), 501, "block-1"), ]; repository .create_transactions(transactions.clone()) @@ -755,7 +806,7 @@ mod tests { .await .unwrap(); - assert_eq!(transaction_block_number_retrieved, Some(100)); + assert_eq!(transaction_block_number_retrieved, Some(BlockNumber(100))); } #[tokio::test] @@ -768,7 +819,7 @@ mod tests { repository .create_block_range_roots(vec![ ( - BlockRange::from_block_number(0), + BlockRange::from_block_number(BlockNumber(0)), MKTreeNode::from_hex("AAAA").unwrap(), ), ( @@ -788,7 +839,7 @@ mod tests { assert_eq!( vec![ BlockRangeRootRecord { - range: BlockRange::from_block_number(0), + range: BlockRange::from_block_number(BlockNumber(0)), merkle_root: MKTreeNode::from_hex("AAAA").unwrap(), }, BlockRangeRootRecord { @@ -806,7 +857,7 @@ mod tests { let repository = CardanoTransactionRepository::new(Arc::new( SqliteConnectionPool::build_from_connection(connection), )); - let range = BlockRange::from_block_number(0); + let range = BlockRange::from_block_number(BlockNumber(0)); repository .create_block_range_roots(vec![(range.clone(), MKTreeNode::from_hex("AAAA").unwrap())]) @@ -840,15 +891,15 @@ mod tests { )); let block_range_roots = vec![ ( - BlockRange::from_block_number(15), + BlockRange::from_block_number(BlockNumber(15)), MKTreeNode::from_hex("AAAA").unwrap(), ), ( - BlockRange::from_block_number(30), + BlockRange::from_block_number(BlockNumber(30)), MKTreeNode::from_hex("BBBB").unwrap(), ), ( - BlockRange::from_block_number(45), + BlockRange::from_block_number(BlockNumber(45)), MKTreeNode::from_hex("CCCC").unwrap(), ), ]; @@ -858,7 +909,7 @@ mod tests { .unwrap(); let retrieved_block_ranges = repository - .retrieve_block_range_roots_up_to(45) + .retrieve_block_range_roots_up_to(BlockNumber(45)) .await .unwrap(); assert_eq!( @@ -875,15 +926,15 @@ mod tests { )); let block_range_roots = vec![ BlockRangeRootRecord { - range: BlockRange::from_block_number(15), + range: BlockRange::from_block_number(BlockNumber(15)), merkle_root: MKTreeNode::from_hex("AAAA").unwrap(), }, BlockRangeRootRecord { - range: BlockRange::from_block_number(30), + range: BlockRange::from_block_number(BlockNumber(30)), merkle_root: MKTreeNode::from_hex("BBBB").unwrap(), }, BlockRangeRootRecord { - range: BlockRange::from_block_number(45), + range: BlockRange::from_block_number(BlockNumber(45)), merkle_root: MKTreeNode::from_hex("CCCC").unwrap(), }, ]; @@ -920,7 +971,7 @@ mod tests { // Use by 'prune_transaction' to get the block_range of the highest block number repository .create_block_range_roots(vec![( - BlockRange::from_block_number(45), + BlockRange::from_block_number(BlockNumber(45)), MKTreeNode::from_hex("BBBB").unwrap(), )]) .await @@ -931,21 +982,24 @@ mod tests { // Pruning with a number of block to keep greater than the highest block range start should // do nothing. - repository.prune_transaction(10_000_000).await.unwrap(); + repository + .prune_transaction(BlockNumber(10_000_000)) + .await + .unwrap(); let transaction_result = repository.get_all_transactions().await.unwrap(); assert_eq!(cardano_transactions, transaction_result); // Since the highest block range start is 45, pruning with 20 should remove transactions // with a block number strictly below 25. - repository.prune_transaction(20).await.unwrap(); + repository.prune_transaction(BlockNumber(20)).await.unwrap(); let transaction_result = repository - .get_transactions_in_range_blocks(0..25) + .get_transactions_in_range_blocks(BlockNumber(0)..BlockNumber(25)) .await .unwrap(); assert_eq!(Vec::::new(), transaction_result); let transaction_result = repository - .get_transactions_in_range_blocks(25..1000) + .get_transactions_in_range_blocks(BlockNumber(25)..BlockNumber(1000)) .await .unwrap(); assert_eq!(28, transaction_result.len()); @@ -966,11 +1020,11 @@ mod tests { let block_range_roots = vec![ ( - BlockRange::from_block_number(15), + BlockRange::from_block_number(BlockNumber(15)), MKTreeNode::from_hex("AAAA").unwrap(), ), ( - BlockRange::from_block_number(30), + BlockRange::from_block_number(BlockNumber(30)), MKTreeNode::from_hex("BBBB").unwrap(), ), ]; @@ -983,7 +1037,7 @@ mod tests { .get_highest_start_block_number_for_block_range_roots() .await .unwrap(); - assert_eq!(Some(30), highest); + assert_eq!(Some(BlockNumber(30)), highest); } #[tokio::test] diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 8eeb2b45f77..301b6504da6 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.46" +version = "0.5.47" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-aggregator/benches/cardano_transactions_get.rs b/mithril-aggregator/benches/cardano_transactions_get.rs index 86ed00ee857..873947c95f2 100644 --- a/mithril-aggregator/benches/cardano_transactions_get.rs +++ b/mithril-aggregator/benches/cardano_transactions_get.rs @@ -4,7 +4,8 @@ use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}; use sqlite::ConnectionThreadSafe; use mithril_aggregator::services::TransactionStore; -use mithril_common::{entities::CardanoTransaction, test_utils::TempDir}; +use mithril_common::entities::{BlockNumber, CardanoTransaction}; +use mithril_common::test_utils::TempDir; use mithril_persistence::database::repository::CardanoTransactionRepository; use mithril_persistence::sqlite::{ConnectionBuilder, SqliteConnectionPool}; @@ -32,7 +33,7 @@ fn generate_transactions(nb_transactions: usize) -> Vec { .map(|i| { CardanoTransaction::new( format!("tx_hash-{}", i), - i as u64, + BlockNumber(i as u64), i as u64 * 100, format!("block_hash-{}", i), ) @@ -68,7 +69,7 @@ fn run_bench(c: &mut Criterion, nb_transaction_in_db: usize) { |b, &max_block_number| { b.to_async(&runtime).iter(|| async { let _transactions = repository - .get_transactions_in_range(0..max_block_number) + .get_transactions_in_range(BlockNumber(0)..BlockNumber(max_block_number)) .await .unwrap(); }); diff --git a/mithril-aggregator/benches/cardano_transactions_import.rs b/mithril-aggregator/benches/cardano_transactions_import.rs index eb982a80f9b..a93f0294b10 100644 --- a/mithril-aggregator/benches/cardano_transactions_import.rs +++ b/mithril-aggregator/benches/cardano_transactions_import.rs @@ -2,7 +2,8 @@ use criterion::{criterion_group, criterion_main, Criterion}; use sqlite::ConnectionThreadSafe; use std::sync::Arc; -use mithril_common::{entities::CardanoTransaction, test_utils::TempDir}; +use mithril_common::entities::{BlockNumber, CardanoTransaction}; +use mithril_common::test_utils::TempDir; use mithril_persistence::database::repository::CardanoTransactionRepository; use mithril_persistence::sqlite::{ConnectionBuilder, SqliteConnectionPool}; @@ -27,7 +28,7 @@ fn generate_transactions(nb_transactions: usize) -> Vec { .map(|i| { CardanoTransaction::new( format!("tx_hash-{}", i), - i as u64, + BlockNumber(i as u64), i as u64 + 1, format!("block_hash-{}", i), ) diff --git a/mithril-aggregator/src/artifact_builder/cardano_transactions.rs b/mithril-aggregator/src/artifact_builder/cardano_transactions.rs index 992eb948bdf..53485e5619f 100644 --- a/mithril-aggregator/src/artifact_builder/cardano_transactions.rs +++ b/mithril-aggregator/src/artifact_builder/cardano_transactions.rs @@ -82,7 +82,7 @@ mod tests { ..fake_data::certificate("certificate-123".to_string()) } }; - let beacon = 100; + let beacon = BlockNumber(100); let artifact = cardano_transaction_artifact_builder .compute_artifact(beacon, &certificate_with_merkle_root) @@ -106,7 +106,7 @@ mod tests { protocol_message: ProtocolMessage::new(), ..fake_data::certificate("certificate-123".to_string()) }; - let beacon = 100; + let beacon = BlockNumber(100); cardano_transaction_artifact_builder .compute_artifact(beacon, &certificate_without_merkle_root) diff --git a/mithril-aggregator/src/configuration.rs b/mithril-aggregator/src/configuration.rs index 176ca0af87d..50d5fbc5021 100644 --- a/mithril-aggregator/src/configuration.rs +++ b/mithril-aggregator/src/configuration.rs @@ -10,8 +10,9 @@ use std::path::PathBuf; use std::str::FromStr; use mithril_common::entities::{ - CardanoTransactionsSigningConfig, CompressionAlgorithm, HexEncodedGenesisVerificationKey, - ProtocolParameters, SignedEntityConfig, SignedEntityTypeDiscriminants, + BlockNumber, CardanoTransactionsSigningConfig, CompressionAlgorithm, + HexEncodedGenesisVerificationKey, ProtocolParameters, SignedEntityConfig, + SignedEntityTypeDiscriminants, }; use mithril_common::{CardanoNetwork, StdResult}; @@ -248,8 +249,8 @@ impl Configuration { cardano_transactions_prover_cache_pool_size: 3, cardano_transactions_database_connection_pool_size: 5, cardano_transactions_signing_config: CardanoTransactionsSigningConfig { - security_parameter: 100, - step: 15, + security_parameter: BlockNumber(100), + step: BlockNumber(15), }, cardano_transactions_prover_max_hashes_allowed_by_request: 100, cardano_transactions_block_streamer_max_roll_forwards_per_poll: 1000, @@ -395,8 +396,8 @@ impl Default for DefaultConfiguration { cardano_transactions_prover_cache_pool_size: 10, cardano_transactions_database_connection_pool_size: 10, cardano_transactions_signing_config: CardanoTransactionsSigningConfig { - security_parameter: 3000, - step: 120, + security_parameter: BlockNumber(3000), + step: BlockNumber(120), }, cardano_transactions_prover_max_hashes_allowed_by_request: 100, cardano_transactions_block_streamer_max_roll_forwards_per_poll: 10000, @@ -473,14 +474,14 @@ impl Source for DefaultConfiguration { ( "security_parameter".to_string(), ValueKind::from( - myself + *myself .cardano_transactions_signing_config .security_parameter, ), ), ( "step".to_string(), - ValueKind::from(myself.cardano_transactions_signing_config.step), + ValueKind::from(*myself.cardano_transactions_signing_config.step), ), ])), ); diff --git a/mithril-aggregator/src/database/repository/open_message_repository.rs b/mithril-aggregator/src/database/repository/open_message_repository.rs index 9a77278a42f..05aefed386d 100644 --- a/mithril-aggregator/src/database/repository/open_message_repository.rs +++ b/mithril-aggregator/src/database/repository/open_message_repository.rs @@ -104,7 +104,7 @@ impl OpenMessageRepository { #[cfg(test)] mod tests { - use mithril_common::entities::CardanoDbBeacon; + use mithril_common::entities::{BlockNumber, CardanoDbBeacon}; use crate::database::record::SingleSignatureRecord; use crate::database::test_helper::{ @@ -184,7 +184,7 @@ mod tests { for signed_entity_type in [ SignedEntityType::MithrilStakeDistribution(epoch), SignedEntityType::CardanoImmutableFilesFull(CardanoDbBeacon::new("devnet", *epoch, 1)), - SignedEntityType::CardanoTransactions(epoch, 100), + SignedEntityType::CardanoTransactions(epoch, BlockNumber(100)), ] { repository .create_open_message(epoch, &signed_entity_type, &ProtocolMessage::new()) diff --git a/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_transaction.rs b/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_transaction.rs index 4b79f766f43..93a686ddd41 100644 --- a/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_transaction.rs +++ b/mithril-aggregator/src/http_server/routes/artifact_routes/cardano_transaction.rs @@ -96,7 +96,7 @@ pub mod tests { services::MockMessageService, }; use mithril_common::{ - entities::{Epoch, SignedEntityType}, + entities::{BlockNumber, Epoch, SignedEntityType}, messages::ToMessageAdapter, test_utils::{apispec::APISpec, fake_data}, }; @@ -125,7 +125,7 @@ pub mod tests { #[tokio::test] async fn test_cardano_transactions_get_ok() { let signed_entity_records = create_signed_entities( - SignedEntityType::CardanoTransactions(Epoch(1), 120), + SignedEntityType::CardanoTransactions(Epoch(1), BlockNumber(120)), fake_data::cardano_transactions_snapshot(5), ); let message = ToCardanoTransactionListMessageAdapter::adapt(signed_entity_records); @@ -192,7 +192,7 @@ pub mod tests { #[tokio::test] async fn test_cardano_transaction_get_ok() { let signed_entity = create_signed_entities( - SignedEntityType::CardanoTransactions(Epoch(1), 100), + SignedEntityType::CardanoTransactions(Epoch(1), BlockNumber(100)), fake_data::cardano_transactions_snapshot(1), ) .first() diff --git a/mithril-aggregator/src/http_server/routes/proof_routes.rs b/mithril-aggregator/src/http_server/routes/proof_routes.rs index bb033b8ac3f..d98af9ea019 100644 --- a/mithril-aggregator/src/http_server/routes/proof_routes.rs +++ b/mithril-aggregator/src/http_server/routes/proof_routes.rs @@ -141,7 +141,9 @@ mod tests { }; use mithril_common::{ - entities::{CardanoTransactionsSetProof, CardanoTransactionsSnapshot, SignedEntity}, + entities::{ + BlockNumber, CardanoTransactionsSetProof, CardanoTransactionsSnapshot, SignedEntity, + }, test_utils::{apispec::APISpec, assert_equivalent, fake_data}, }; @@ -174,7 +176,8 @@ mod tests { .expect_compute_transactions_proofs() .returning(|_, _| Ok(vec![CardanoTransactionsSetProof::dummy()])); - let cardano_transactions_snapshot = CardanoTransactionsSnapshot::new(String::new(), 2309); + let cardano_transactions_snapshot = + CardanoTransactionsSnapshot::new(String::new(), BlockNumber(2309)); let signed_entity = SignedEntity:: { artifact: cardano_transactions_snapshot, diff --git a/mithril-aggregator/src/services/cardano_transactions_importer.rs b/mithril-aggregator/src/services/cardano_transactions_importer.rs index a8492292edd..4ead0dc4069 100644 --- a/mithril-aggregator/src/services/cardano_transactions_importer.rs +++ b/mithril-aggregator/src/services/cardano_transactions_importer.rs @@ -93,7 +93,7 @@ impl CardanoTransactionsImporter { debug!( self.logger, "TransactionsImporter will retrieve Cardano transactions between block_number '{}' and '{until}'", - from.as_ref().map(|c|c.block_number).unwrap_or(0) + from.as_ref().map(|c|c.block_number).unwrap_or(BlockNumber(0)) ); let mut streamer = self.block_scanner.scan(from, until).await?; @@ -130,7 +130,7 @@ impl CardanoTransactionsImporter { }, ) { // No block range root stored yet, start from the beginning - None => BlockRange::all_block_ranges_in(0..=(until)), + None => BlockRange::all_block_ranges_in(BlockNumber(0)..=(until)), // Not enough block to form at least one block range Some(ranges) if ranges.is_empty() => return Ok(()), Some(ranges) => ranges, @@ -138,7 +138,7 @@ impl CardanoTransactionsImporter { debug!( self.logger, "TransactionsImporter - computing Block Range Roots"; - "start_block" => block_ranges.start(), "end_block" => block_ranges.end(), + "start_block" => *block_ranges.start(), "end_block" => *block_ranges.end(), ); let mut block_ranges_with_merkle_root: Vec<(BlockRange, MKTreeNode)> = vec![]; @@ -232,11 +232,11 @@ mod tests { start_block_number: BlockNumber, number_of_consecutive_block: BlockNumber, ) -> Vec { - (start_block_number..(start_block_number + number_of_consecutive_block)) + (*start_block_number..*(start_block_number + number_of_consecutive_block)) .map(|block_number| { ScannedBlock::new( format!("block_hash-{}", block_number), - block_number, + BlockNumber(block_number), block_number * 100, vec![format!("tx_hash-{}", block_number)], ) @@ -267,17 +267,27 @@ mod tests { ))); let blocks = vec![ - ScannedBlock::new("block_hash-1", 10, 15, vec!["tx_hash-1", "tx_hash-2"]), - ScannedBlock::new("block_hash-2", 20, 25, vec!["tx_hash-3", "tx_hash-4"]), + ScannedBlock::new( + "block_hash-1", + BlockNumber(10), + 15, + vec!["tx_hash-1", "tx_hash-2"], + ), + ScannedBlock::new( + "block_hash-2", + BlockNumber(20), + 25, + vec!["tx_hash-3", "tx_hash-4"], + ), ]; let expected_transactions = into_transactions(&blocks); - let up_to_block_number = 1000; + let up_to_block_number = BlockNumber(1000); let importer = { let mut scanner_mock = MockBlockScannerImpl::new(); scanner_mock .expect_scan() - .withf(move |from, until| from.is_none() && until == &up_to_block_number) + .withf(move |from, until| from.is_none() && until == up_to_block_number) .return_once(move |_, _| { Ok(Box::new(DumbBlockStreamer::new().forwards(vec![blocks]))) }); @@ -301,7 +311,7 @@ mod tests { ))); let up_to_block_number = BlockRange::LENGTH * 5; - let blocks = build_blocks(0, up_to_block_number + 1); + let blocks = build_blocks(BlockNumber(0), up_to_block_number + 1); let transactions = into_transactions(&blocks); repository.store_transactions(transactions).await.unwrap(); @@ -318,7 +328,7 @@ mod tests { let block_range_roots = repository.get_all_block_range_root().unwrap(); assert_eq!( vec![ - BlockRange::from_block_number(0), + BlockRange::from_block_number(BlockNumber(0)), BlockRange::from_block_number(BlockRange::LENGTH), BlockRange::from_block_number(BlockRange::LENGTH * 2), BlockRange::from_block_number(BlockRange::LENGTH * 3), @@ -341,7 +351,7 @@ mod tests { let up_to_block_number = BlockRange::LENGTH * 4; // Two block ranges with a gap let blocks: Vec = [ - build_blocks(0, BlockRange::LENGTH), + build_blocks(BlockNumber(0), BlockRange::LENGTH), build_blocks(BlockRange::LENGTH * 3, BlockRange::LENGTH), ] .concat(); @@ -361,7 +371,7 @@ mod tests { let block_range_roots = repository.get_all_block_range_root().unwrap(); assert_eq!( vec![ - BlockRange::from_block_number(0), + BlockRange::from_block_number(BlockNumber(0)), BlockRange::from_block_number(BlockRange::LENGTH * 3), ], block_range_roots @@ -384,7 +394,7 @@ mod tests { ); importer - .import_block_ranges(10_000) + .import_block_ranges(BlockNumber(10_000)) .await .expect("Transactions Importer should succeed"); @@ -397,17 +407,27 @@ mod tests { #[tokio::test] async fn if_all_transactions_stored_nothing_is_parsed_and_stored() { - let up_to_block_number = 12; + let up_to_block_number = BlockNumber(12); let connection = cardano_tx_db_connection().unwrap(); let repository = Arc::new(CardanoTransactionRepository::new(Arc::new( SqliteConnectionPool::build_from_connection(connection), ))); let scanner = DumbBlockScanner::new().forwards(vec![vec![ - ScannedBlock::new("block_hash-1", 10, 15, vec!["tx_hash-1", "tx_hash-2"]), - ScannedBlock::new("block_hash-2", 20, 25, vec!["tx_hash-3", "tx_hash-4"]), + ScannedBlock::new( + "block_hash-1", + BlockNumber(10), + 15, + vec!["tx_hash-1", "tx_hash-2"], + ), + ScannedBlock::new( + "block_hash-2", + BlockNumber(20), + 25, + vec!["tx_hash-3", "tx_hash-4"], + ), ]]); - let last_tx = CardanoTransaction::new("tx-20", 30, 35, "block_hash-3"); + let last_tx = CardanoTransaction::new("tx-20", BlockNumber(30), 35, "block_hash-3"); repository .store_transactions(vec![last_tx.clone()]) .await @@ -432,21 +452,25 @@ mod tests { SqliteConnectionPool::build_from_connection(connection), ))); - let highest_stored_chain_point = ChainPoint::new(134, 10, "block_hash-1"); + let highest_stored_chain_point = ChainPoint::new(134, BlockNumber(10), "block_hash-1"); let stored_block = ScannedBlock::new( highest_stored_chain_point.block_hash.clone(), highest_stored_chain_point.block_number, highest_stored_chain_point.slot_number, vec!["tx_hash-1", "tx_hash-2"], ); - let to_store_block = - ScannedBlock::new("block_hash-2", 20, 229, vec!["tx_hash-3", "tx_hash-4"]); + let to_store_block = ScannedBlock::new( + "block_hash-2", + BlockNumber(20), + 229, + vec!["tx_hash-3", "tx_hash-4"], + ); let expected_transactions: Vec = [ stored_block.clone().into_transactions(), to_store_block.clone().into_transactions(), ] .concat(); - let up_to_block_number = 22; + let up_to_block_number = BlockNumber(22); repository .store_transactions(stored_block.clone().into_transactions()) @@ -491,12 +515,12 @@ mod tests { ))); let up_to_block_number = BlockRange::LENGTH * 4; - let blocks = build_blocks(0, up_to_block_number + 1); + let blocks = build_blocks(BlockNumber(0), up_to_block_number + 1); let transactions = into_transactions(&blocks); repository.store_transactions(transactions).await.unwrap(); repository .store_block_range_roots( - blocks[0..((BlockRange::LENGTH * 2) as usize)] + blocks[0..(*(BlockRange::LENGTH * 2) as usize)] .iter() .map(|b| { ( @@ -517,7 +541,7 @@ mod tests { let block_range_roots = repository.get_all_block_range_root().unwrap(); assert_eq!( vec![ - BlockRange::from_block_number(0), + BlockRange::from_block_number(BlockNumber(0)), BlockRange::from_block_number(BlockRange::LENGTH), ], block_range_roots @@ -534,7 +558,7 @@ mod tests { let block_range_roots = repository.get_all_block_range_root().unwrap(); assert_eq!( vec![ - BlockRange::from_block_number(0), + BlockRange::from_block_number(BlockNumber(0)), BlockRange::from_block_number(BlockRange::LENGTH), BlockRange::from_block_number(BlockRange::LENGTH * 2), BlockRange::from_block_number(BlockRange::LENGTH * 3), @@ -586,7 +610,7 @@ mod tests { ))); // For the block range (15..=29) we only have transactions in the 10 first blocks (15..=24) - let blocks = build_blocks(BlockRange::LENGTH, 10); + let blocks = build_blocks(BlockRange::LENGTH, BlockNumber(10)); let transactions = into_transactions(&blocks); repository.store_transactions(transactions).await.unwrap(); @@ -613,13 +637,13 @@ mod tests { #[tokio::test] async fn block_range_root_retrieves_only_strictly_required_transactions() { fn transactions_for_block(range: Range) -> StdResult> { - Ok(build_blocks(range.start, range.count() as BlockNumber) + Ok(build_blocks(range.start, range.end - range.start) .into_iter() .flat_map(|b| b.into_transactions()) .collect()) } const HIGHEST_BLOCK_RANGE_START: BlockNumber = BlockRange::LENGTH; - const UP_TO_BLOCK_NUMBER: BlockNumber = BlockRange::LENGTH * 5; + let up_to_block_number = BlockRange::LENGTH * 5; let importer = { let mut store_mock = MockTransactionStore::new(); @@ -635,8 +659,8 @@ mod tests { .expect_get_transactions_in_range() // Lower bound should be the end block number of the last known block range // Upper bound should be the block number provided to `import_block_ranges` - .withf(|range| { - BlockRangesSequence::new(HIGHEST_BLOCK_RANGE_START..=UP_TO_BLOCK_NUMBER) + .withf(move |range| { + BlockRangesSequence::new(HIGHEST_BLOCK_RANGE_START..=up_to_block_number) .contains(range) }) .returning(transactions_for_block); @@ -651,7 +675,7 @@ mod tests { }; importer - .import_block_ranges(UP_TO_BLOCK_NUMBER) + .import_block_ranges(up_to_block_number) .await .expect("Transactions Importer should succeed"); } @@ -665,17 +689,17 @@ mod tests { // 2 block ranges worth of blocks with one more block that should be ignored for merkle root computation let up_to_block_number = BlockRange::LENGTH * 2; - let blocks = build_blocks(0, up_to_block_number + 1); + let blocks = build_blocks(BlockNumber(0), up_to_block_number + 1); let transactions = into_transactions(&blocks); let expected_block_range_roots = vec![ ( - BlockRange::from_block_number(0), - merkle_root_for_blocks(&blocks[0..(BlockRange::LENGTH as usize)]), + BlockRange::from_block_number(BlockNumber(0)), + merkle_root_for_blocks(&blocks[0..(*BlockRange::LENGTH as usize)]), ), ( BlockRange::from_block_number(BlockRange::LENGTH), merkle_root_for_blocks( - &blocks[(BlockRange::LENGTH as usize)..((BlockRange::LENGTH * 2) as usize)], + &blocks[(*BlockRange::LENGTH as usize)..((*BlockRange::LENGTH * 2) as usize)], ), ), ]; @@ -706,10 +730,20 @@ mod tests { async fn importing_twice_starting_with_nothing_in_a_real_db_should_yield_transactions_in_same_order( ) { let blocks = vec![ - ScannedBlock::new("block_hash-1", 10, 15, vec!["tx_hash-1", "tx_hash-2"]), - ScannedBlock::new("block_hash-2", 20, 25, vec!["tx_hash-3", "tx_hash-4"]), + ScannedBlock::new( + "block_hash-1", + BlockNumber(10), + 15, + vec!["tx_hash-1", "tx_hash-2"], + ), + ScannedBlock::new( + "block_hash-2", + BlockNumber(20), + 25, + vec!["tx_hash-3", "tx_hash-4"], + ), ]; - let up_to_block_number = 1000; + let up_to_block_number = BlockNumber(1000); let transactions = into_transactions(&blocks); let (importer, repository) = { @@ -746,9 +780,13 @@ mod tests { SqliteConnectionPool::build_from_connection(connection), ))); - let expected_remaining_transactions = - ScannedBlock::new("block_hash-130", 130, 5, vec!["tx_hash-6", "tx_hash-7"]) - .into_transactions(); + let expected_remaining_transactions = ScannedBlock::new( + "block_hash-130", + BlockNumber(130), + 5, + vec!["tx_hash-6", "tx_hash-7"], + ) + .into_transactions(); repository .store_transactions(expected_remaining_transactions.clone()) .await @@ -757,7 +795,7 @@ mod tests { .store_transactions( ScannedBlock::new( "block_hash-131", - 131, + BlockNumber(131), 10, vec!["tx_hash-8", "tx_hash-9", "tx_hash-10"], ) @@ -766,14 +804,14 @@ mod tests { .await .unwrap(); - let chain_point = ChainPoint::new(5, 130, "block_hash-130"); + let chain_point = ChainPoint::new(5, BlockNumber(130), "block_hash-130"); let scanner = DumbBlockScanner::new().backward(chain_point); let importer = CardanoTransactionsImporter::new_for_test(Arc::new(scanner), repository.clone()); importer - .import_transactions(3000) + .import_transactions(BlockNumber(3000)) .await .expect("Transactions Importer should succeed"); @@ -789,7 +827,7 @@ mod tests { ))); let expected_remaining_block_ranges = vec![ - BlockRange::from_block_number(0), + BlockRange::from_block_number(BlockNumber(0)), BlockRange::from_block_number(BlockRange::LENGTH), BlockRange::from_block_number(BlockRange::LENGTH * 2), ]; @@ -839,7 +877,7 @@ mod tests { CardanoTransactionsImporter::new_for_test(Arc::new(scanner), repository.clone()); importer - .import_transactions(3000) + .import_transactions(BlockNumber(3000)) .await .expect("Transactions Importer should succeed"); @@ -870,7 +908,7 @@ mod tests { }), ); - let importer_future = importer.import(100); + let importer_future = importer.import(BlockNumber(100)); let counter_task = task::spawn_local(async { while COUNTER.load(std::sync::atomic::Ordering::SeqCst) < MAX_COUNTER { tokio::time::sleep(Duration::from_millis(1)).await; diff --git a/mithril-aggregator/src/services/prover.rs b/mithril-aggregator/src/services/prover.rs index 931c51e48d4..8fd0fe69589 100644 --- a/mithril-aggregator/src/services/prover.rs +++ b/mithril-aggregator/src/services/prover.rs @@ -168,7 +168,7 @@ impl ProverService for MithrilProverService { info!( self.logger, "Prover starts computing the Merkle map pool resource of size {pool_size}"; - "up_to_block_number" => up_to, + "up_to_block_number" => *up_to, ); let mk_map_cache = self .block_range_root_retriever diff --git a/mithril-aggregator/src/services/signed_entity.rs b/mithril-aggregator/src/services/signed_entity.rs index 73d0e495f23..d2e44b23e43 100644 --- a/mithril-aggregator/src/services/signed_entity.rs +++ b/mithril-aggregator/src/services/signed_entity.rs @@ -580,7 +580,7 @@ mod tests { async fn build_cardano_transactions_snapshot_artifact_when_given_cardano_transactions_type() { let mut mock_container = MockDependencyInjector::new(); - let block_number = 151; + let block_number = BlockNumber(151); let expected = CardanoTransactionsSnapshot::new("merkle_root".to_string(), block_number); mock_container @@ -608,7 +608,7 @@ mod tests { #[tokio::test] async fn should_store_the_artifact_when_creating_artifact_for_cardano_transactions() { - let block_number = 149; + let block_number = BlockNumber(149); generic_test_that_the_artifact_is_stored( SignedEntityType::CardanoTransactions(Epoch(1), block_number), CardanoTransactionsSnapshot::new("merkle_root".to_string(), block_number), diff --git a/mithril-aggregator/tests/certificate_chain.rs b/mithril-aggregator/tests/certificate_chain.rs index 37ec1a57e33..1d01e196284 100644 --- a/mithril-aggregator/tests/certificate_chain.rs +++ b/mithril-aggregator/tests/certificate_chain.rs @@ -3,7 +3,7 @@ mod test_extensions; use mithril_aggregator::Configuration; use mithril_common::{ entities::{ - CardanoDbBeacon, ChainPoint, Epoch, ProtocolParameters, SignedEntityType, + BlockNumber, CardanoDbBeacon, ChainPoint, Epoch, ProtocolParameters, SignedEntityType, SignedEntityTypeDiscriminants, StakeDistribution, StakeDistributionParty, TimePoint, }, test_utils::MithrilFixtureBuilder, @@ -23,7 +23,7 @@ async fn certificate_chain() { ..Configuration::new_sample() }; let mut tester = RuntimeTester::build( - TimePoint::new(1, 1, ChainPoint::new(10, 1, "block_hash-1")), + TimePoint::new(1, 1, ChainPoint::new(10, BlockNumber(1), "block_hash-1")), configuration, ) .await; diff --git a/mithril-aggregator/tests/create_certificate.rs b/mithril-aggregator/tests/create_certificate.rs index 47a367efd8c..853b540ab44 100644 --- a/mithril-aggregator/tests/create_certificate.rs +++ b/mithril-aggregator/tests/create_certificate.rs @@ -3,8 +3,9 @@ mod test_extensions; use mithril_aggregator::Configuration; use mithril_common::{ entities::{ - CardanoDbBeacon, CardanoTransactionsSigningConfig, ChainPoint, Epoch, ProtocolParameters, - SignedEntityType, SignedEntityTypeDiscriminants, StakeDistributionParty, TimePoint, + BlockNumber, CardanoDbBeacon, CardanoTransactionsSigningConfig, ChainPoint, Epoch, + ProtocolParameters, SignedEntityType, SignedEntityTypeDiscriminants, + StakeDistributionParty, TimePoint, }, test_utils::MithrilFixtureBuilder, }; @@ -22,8 +23,8 @@ async fn create_certificate() { signed_entity_types: Some(SignedEntityTypeDiscriminants::CardanoTransactions.to_string()), data_stores_directory: get_test_dir("create_certificate"), cardano_transactions_signing_config: CardanoTransactionsSigningConfig { - security_parameter: 0, - step: 30, + security_parameter: BlockNumber(0), + step: BlockNumber(30), }, ..Configuration::new_sample() }; @@ -33,7 +34,7 @@ async fn create_certificate() { immutable_file_number: 1, chain_point: ChainPoint { slot_number: 10, - block_number: 100, + block_number: BlockNumber(100), block_hash: "block_hash-100".to_string(), }, }, @@ -166,7 +167,7 @@ async fn create_certificate() { .map(|s| s.signer_with_stake.clone().into()) .collect::>(), fixture.compute_and_encode_avk(), - SignedEntityType::CardanoTransactions(Epoch(1), 179), + SignedEntityType::CardanoTransactions(Epoch(1), BlockNumber(179)), ExpectedCertificate::genesis_identifier(&CardanoDbBeacon::new( "devnet".to_string(), 1, @@ -179,7 +180,10 @@ async fn create_certificate() { "Got rollback to block number 149 from cardano chain, the state machine should be signing CardanoTransactions for block 120" ); - tester.cardano_chain_send_rollback(149).await.unwrap(); + tester + .cardano_chain_send_rollback(BlockNumber(149)) + .await + .unwrap(); cycle!(tester, "signing"); let signers_for_transaction = &fixture.signers_fixture()[2..=6]; tester @@ -201,7 +205,7 @@ async fn create_certificate() { .map(|s| s.signer_with_stake.clone().into()) .collect::>(), fixture.compute_and_encode_avk(), - SignedEntityType::CardanoTransactions(Epoch(1), 119), + SignedEntityType::CardanoTransactions(Epoch(1), BlockNumber(119)), ExpectedCertificate::genesis_identifier(&CardanoDbBeacon::new( "devnet".to_string(), 1, diff --git a/mithril-aggregator/tests/era_checker.rs b/mithril-aggregator/tests/era_checker.rs index 64fef52dbc3..65e901633d3 100644 --- a/mithril-aggregator/tests/era_checker.rs +++ b/mithril-aggregator/tests/era_checker.rs @@ -1,7 +1,7 @@ mod test_extensions; use mithril_aggregator::{Configuration, RuntimeError}; use mithril_common::{ - entities::{ChainPoint, Epoch, ProtocolParameters, TimePoint}, + entities::{BlockNumber, ChainPoint, Epoch, ProtocolParameters, TimePoint}, era::{EraMarker, SupportedEra}, test_utils::MithrilFixtureBuilder, }; @@ -24,7 +24,7 @@ async fn testing_eras() { ..Configuration::new_sample() }; let mut tester = RuntimeTester::build( - TimePoint::new(1, 1, ChainPoint::new(10, 1, "block_hash-1")), + TimePoint::new(1, 1, ChainPoint::new(10, BlockNumber(1), "block_hash-1")), configuration, ) .await; diff --git a/mithril-aggregator/tests/genesis_to_signing.rs b/mithril-aggregator/tests/genesis_to_signing.rs index f93034825af..e002d75edb9 100644 --- a/mithril-aggregator/tests/genesis_to_signing.rs +++ b/mithril-aggregator/tests/genesis_to_signing.rs @@ -2,7 +2,7 @@ mod test_extensions; use mithril_aggregator::Configuration; use mithril_common::{ - entities::{CardanoDbBeacon, ChainPoint, ProtocolParameters, TimePoint}, + entities::{BlockNumber, CardanoDbBeacon, ChainPoint, ProtocolParameters, TimePoint}, test_utils::MithrilFixtureBuilder, }; use test_extensions::{utilities::get_test_dir, ExpectedCertificate, RuntimeTester}; @@ -20,7 +20,7 @@ async fn genesis_to_signing() { ..Configuration::new_sample() }; let mut tester = RuntimeTester::build( - TimePoint::new(1, 1, ChainPoint::new(10, 1, "block_hash-1")), + TimePoint::new(1, 1, ChainPoint::new(10, BlockNumber(1), "block_hash-1")), configuration, ) .await; diff --git a/mithril-aggregator/tests/open_message_expiration.rs b/mithril-aggregator/tests/open_message_expiration.rs index f88a18480df..ed771a2cefb 100644 --- a/mithril-aggregator/tests/open_message_expiration.rs +++ b/mithril-aggregator/tests/open_message_expiration.rs @@ -5,7 +5,7 @@ use std::time::Duration; use mithril_aggregator::Configuration; use mithril_common::{ entities::{ - CardanoDbBeacon, ChainPoint, ProtocolParameters, SignedEntityType, + BlockNumber, CardanoDbBeacon, ChainPoint, ProtocolParameters, SignedEntityType, SignedEntityTypeDiscriminants, TimePoint, }, test_utils::MithrilFixtureBuilder, @@ -25,7 +25,7 @@ async fn open_message_expiration() { ..Configuration::new_sample() }; let mut tester = RuntimeTester::build( - TimePoint::new(1, 1, ChainPoint::new(10, 1, "block_hash-1")), + TimePoint::new(1, 1, ChainPoint::new(10, BlockNumber(1), "block_hash-1")), configuration, ) .await; diff --git a/mithril-aggregator/tests/open_message_newer_exists.rs b/mithril-aggregator/tests/open_message_newer_exists.rs index f4e20b3978c..1f5a655b1a9 100644 --- a/mithril-aggregator/tests/open_message_newer_exists.rs +++ b/mithril-aggregator/tests/open_message_newer_exists.rs @@ -3,7 +3,7 @@ mod test_extensions; use mithril_aggregator::Configuration; use mithril_common::{ entities::{ - CardanoDbBeacon, ChainPoint, Epoch, ProtocolParameters, SignedEntityType, + BlockNumber, CardanoDbBeacon, ChainPoint, Epoch, ProtocolParameters, SignedEntityType, SignedEntityTypeDiscriminants, StakeDistributionParty, TimePoint, }, test_utils::MithrilFixtureBuilder, @@ -23,7 +23,7 @@ async fn open_message_newer_exists() { ..Configuration::new_sample() }; let mut tester = RuntimeTester::build( - TimePoint::new(1, 1, ChainPoint::new(10, 1, "block_hash-1")), + TimePoint::new(1, 1, ChainPoint::new(10, BlockNumber(1), "block_hash-1")), configuration, ) .await; diff --git a/mithril-aggregator/tests/prove_transactions.rs b/mithril-aggregator/tests/prove_transactions.rs index 761710e350b..10ce0e8edcb 100644 --- a/mithril-aggregator/tests/prove_transactions.rs +++ b/mithril-aggregator/tests/prove_transactions.rs @@ -1,7 +1,7 @@ use mithril_aggregator::Configuration; use mithril_common::{ entities::{ - CardanoDbBeacon, CardanoTransactionsSigningConfig, ChainPoint, Epoch, + BlockNumber, CardanoDbBeacon, CardanoTransactionsSigningConfig, ChainPoint, Epoch, ProtocolMessagePartKey, ProtocolParameters, SignedEntityType, SignedEntityTypeDiscriminants, TimePoint, }, @@ -25,8 +25,8 @@ async fn prove_transactions() { signed_entity_types: Some(SignedEntityTypeDiscriminants::CardanoTransactions.to_string()), data_stores_directory: get_test_dir("prove_transactions"), cardano_transactions_signing_config: CardanoTransactionsSigningConfig { - security_parameter: 0, - step: 30, + security_parameter: BlockNumber(0), + step: BlockNumber(30), }, ..Configuration::new_sample() }; @@ -36,7 +36,7 @@ async fn prove_transactions() { immutable_file_number: 1, chain_point: ChainPoint { slot_number: 10, - block_number: 100, + block_number: BlockNumber(100), block_hash: "block_hash-100".to_string(), }, }, @@ -107,7 +107,7 @@ async fn prove_transactions() { .map(|s| s.signer_with_stake.clone().into()) .collect::>(), fixture.compute_and_encode_avk(), - SignedEntityType::CardanoTransactions(Epoch(1), 179), + SignedEntityType::CardanoTransactions(Epoch(1), BlockNumber(179)), ExpectedCertificate::genesis_identifier(&CardanoDbBeacon::new("devnet", 1, 1)), ) ); diff --git a/mithril-aggregator/tests/test_extensions/runtime_tester.rs b/mithril-aggregator/tests/test_extensions/runtime_tester.rs index 4b3bbefedc2..3a0781645f9 100644 --- a/mithril-aggregator/tests/test_extensions/runtime_tester.rs +++ b/mithril-aggregator/tests/test_extensions/runtime_tester.rs @@ -276,7 +276,7 @@ impl RuntimeTester { let slot_number = 10 * block_number; ScannedBlock::new( block_hash, - block_number, + BlockNumber(block_number), slot_number, vec![tx_hash(block_number, 1)], ) @@ -300,7 +300,7 @@ impl RuntimeTester { let decrement = actual_block_number - rollback_to_block_number; let new_block_number = self .chain_observer - .decrease_block_number(decrement) + .decrease_block_number(*decrement) .await .ok_or_else(|| anyhow!("no block number returned".to_string()))?; diff --git a/mithril-aggregator/tests/test_extensions/utilities.rs b/mithril-aggregator/tests/test_extensions/utilities.rs index c07622f4d39..2a42d9cb634 100644 --- a/mithril-aggregator/tests/test_extensions/utilities.rs +++ b/mithril-aggregator/tests/test_extensions/utilities.rs @@ -1,4 +1,3 @@ -use mithril_common::entities::BlockNumber; use mithril_common::test_utils::TempDir; use slog_scope::debug; use std::{ @@ -20,7 +19,7 @@ pub fn comment(comment: String) { debug!("COMMENT {:02} 💬 {}", old_count + 1, comment); } -pub fn tx_hash(block_number: BlockNumber, tx_index: u64) -> String { +pub fn tx_hash(block_number: u64, tx_index: u64) -> String { format!("tx_hash-{block_number}-{tx_index}") } diff --git a/mithril-client/Cargo.toml b/mithril-client/Cargo.toml index 8bd9c015d72..38cafc7de2d 100644 --- a/mithril-client/Cargo.toml +++ b/mithril-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-client" -version = "0.8.7" +version = "0.8.8" description = "Mithril client library" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-client/src/cardano_transaction_client.rs b/mithril-client/src/cardano_transaction_client.rs index 4230a12ef06..71506f21ac9 100644 --- a/mithril-client/src/cardano_transaction_client.rs +++ b/mithril-client/src/cardano_transaction_client.rs @@ -158,16 +158,18 @@ impl CardanoTransactionClient { #[cfg(test)] mod tests { + use std::sync::Arc; + + use anyhow::anyhow; + use chrono::{DateTime, Utc}; + use mockall::predicate::eq; + use crate::aggregator_client::{AggregatorClientError, MockAggregatorHTTPClient}; - use crate::common::Epoch; + use crate::common::{BlockNumber, Epoch}; use crate::{ CardanoTransactionSnapshot, CardanoTransactionSnapshotListItem, CardanoTransactionsProofs, CardanoTransactionsSetProof, }; - use anyhow::anyhow; - use chrono::{DateTime, Utc}; - use mockall::predicate::eq; - use std::sync::Arc; use super::*; @@ -176,7 +178,7 @@ mod tests { CardanoTransactionSnapshotListItem { merkle_root: "mk-123".to_string(), epoch: Epoch(1), - block_number: 24, + block_number: BlockNumber(24), hash: "hash-123".to_string(), certificate_hash: "cert-hash-123".to_string(), created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") @@ -186,7 +188,7 @@ mod tests { CardanoTransactionSnapshotListItem { merkle_root: "mk-456".to_string(), epoch: Epoch(1), - block_number: 24, + block_number: BlockNumber(24), hash: "hash-456".to_string(), certificate_hash: "cert-hash-456".to_string(), created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") @@ -217,7 +219,7 @@ mod tests { let message = CardanoTransactionSnapshot { merkle_root: "mk-123".to_string(), epoch: Epoch(1), - block_number: 24, + block_number: BlockNumber(24), hash: "hash-123".to_string(), certificate_hash: "cert-hash-123".to_string(), created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") @@ -250,7 +252,7 @@ mod tests { &certificate_hash, vec![set_proof.clone()], vec![], - 99999, + BlockNumber(99999), ); let expected_transactions_proofs = transactions_proofs.clone(); aggregator_client diff --git a/mithril-client/tests/extensions/fake.rs b/mithril-client/tests/extensions/fake.rs index e9a0f339d1e..dbc8813da51 100644 --- a/mithril-client/tests/extensions/fake.rs +++ b/mithril-client/tests/extensions/fake.rs @@ -143,11 +143,12 @@ impl FakeAggregator { #[cfg(feature = "unstable")] mod proof { - use super::*; - use mithril_client::common::ProtocolMessagePartKey; + use mithril_client::common::{BlockNumber, ProtocolMessagePartKey}; use mithril_client::{CardanoTransactionsProofs, CardanoTransactionsSetProof}; use mithril_common::crypto_helper::{MKProof, ProtocolMkProof}; + use super::*; + impl FakeAggregator { pub fn spawn_with_transactions_proofs( &self, @@ -165,7 +166,7 @@ mod proof { .unwrap(), }], non_certified_transactions: vec![], - latest_block_number: 9999, + latest_block_number: BlockNumber(9999), }) .unwrap(); diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index d25094cb163..08f8b3f4216 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.34" +version = "0.4.35" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-common/benches/block_range.rs b/mithril-common/benches/block_range.rs index 6e8cee67900..375de7c065d 100644 --- a/mithril-common/benches/block_range.rs +++ b/mithril-common/benches/block_range.rs @@ -1,6 +1,6 @@ use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}; -use mithril_common::entities::BlockRange; +use mithril_common::entities::{BlockNumber, BlockRange}; fn all_block_ranges_in(c: &mut Criterion) { let mut group = c.benchmark_group("all_block_ranges_in"); @@ -14,7 +14,7 @@ fn all_block_ranges_in(c: &mut Criterion) { BenchmarkId::from_parameter(format!("0..{end_bound}")), &end_bound, |b, &end_bound| { - b.iter(|| BlockRange::all_block_ranges_in(0..=end_bound)); + b.iter(|| BlockRange::all_block_ranges_in(BlockNumber(0)..=end_bound)); }, ); } diff --git a/mithril-common/benches/merkle_map.rs b/mithril-common/benches/merkle_map.rs index 9036b96d957..fc0825ff2a0 100644 --- a/mithril-common/benches/merkle_map.rs +++ b/mithril-common/benches/merkle_map.rs @@ -1,5 +1,3 @@ -use std::ops::Range; - use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}; use mithril_common::{ crypto_helper::{MKMap, MKMapNode, MKMapValue, MKTree, MKTreeNode}, @@ -39,13 +37,12 @@ fn generate_block_ranges_nodes_iterator( "total_block_ranges should be strictly greater than 0" ); (0..total_block_ranges).map(move |block_range_index| { - let block_range = BlockRange::new( - block_range_index * total_transactions_per_block_range, - (block_range_index + 1) * total_transactions_per_block_range, - ); + let start = block_range_index * total_transactions_per_block_range; + let end = (block_range_index + 1) * total_transactions_per_block_range; + let block_range = BlockRange::from(start..end); let mk_map_node = if block_range_index <= total_block_ranges - max_uncompressed_block_ranges { - let leaves = as Clone>::clone(&block_range) + let leaves = (*block_range.start..*block_range.end) .map(|leaf_index| leaf_index.to_string()) .collect::>(); let merkle_tree_block_range = MKTree::new(&leaves).unwrap(); diff --git a/mithril-common/src/cardano_block_scanner/chain_reader_block_streamer.rs b/mithril-common/src/cardano_block_scanner/chain_reader_block_streamer.rs index db5e158ddc9..903e87b42dc 100644 --- a/mithril-common/src/cardano_block_scanner/chain_reader_block_streamer.rs +++ b/mithril-common/src/cardano_block_scanner/chain_reader_block_streamer.rs @@ -166,7 +166,7 @@ mod tests { #[tokio::test] async fn test_parse_expected_nothing_strictly_above_block_number_threshold() { - let until_block_number = 10; + let until_block_number = BlockNumber(10); let chain_reader = Arc::new(Mutex::new(FakeChainReader::new(vec![ ChainBlockNextAction::RollForward { parsed_block: ScannedBlock::new( @@ -224,16 +224,16 @@ mod tests { async fn test_parse_expected_multiple_rollforwards_below_block_number_threshold() { let chain_reader = Arc::new(Mutex::new(FakeChainReader::new(vec![ ChainBlockNextAction::RollForward { - parsed_block: ScannedBlock::new("hash-1", 1, 10, Vec::<&str>::new()), + parsed_block: ScannedBlock::new("hash-1", BlockNumber(1), 10, Vec::<&str>::new()), }, ChainBlockNextAction::RollForward { - parsed_block: ScannedBlock::new("hash-2", 2, 20, Vec::<&str>::new()), + parsed_block: ScannedBlock::new("hash-2", BlockNumber(2), 20, Vec::<&str>::new()), }, ]))); let mut block_streamer = ChainReaderBlockStreamer::try_new( chain_reader, None, - 100, + BlockNumber(100), MAX_ROLL_FORWARDS_PER_POLL, TestLogger::stdout(), ) @@ -244,8 +244,8 @@ mod tests { assert_eq!( Some(ChainScannedBlocks::RollForwards(vec![ - ScannedBlock::new("hash-1", 1, 10, Vec::<&str>::new()), - ScannedBlock::new("hash-2", 2, 20, Vec::<&str>::new()) + ScannedBlock::new("hash-1", BlockNumber(1), 10, Vec::<&str>::new()), + ScannedBlock::new("hash-2", BlockNumber(2), 20, Vec::<&str>::new()) ])), scanned_blocks, ); @@ -255,19 +255,19 @@ mod tests { async fn test_parse_expected_maximum_rollforwards_retrieved_per_poll() { let chain_reader = Arc::new(Mutex::new(FakeChainReader::new(vec![ ChainBlockNextAction::RollForward { - parsed_block: ScannedBlock::new("hash-1", 1, 10, Vec::<&str>::new()), + parsed_block: ScannedBlock::new("hash-1", BlockNumber(1), 10, Vec::<&str>::new()), }, ChainBlockNextAction::RollForward { - parsed_block: ScannedBlock::new("hash-2", 2, 20, Vec::<&str>::new()), + parsed_block: ScannedBlock::new("hash-2", BlockNumber(2), 20, Vec::<&str>::new()), }, ChainBlockNextAction::RollForward { - parsed_block: ScannedBlock::new("hash-3", 3, 30, Vec::<&str>::new()), + parsed_block: ScannedBlock::new("hash-3", BlockNumber(3), 30, Vec::<&str>::new()), }, ]))); let mut block_streamer = ChainReaderBlockStreamer::try_new( chain_reader, None, - 100, + BlockNumber(100), MAX_ROLL_FORWARDS_PER_POLL, TestLogger::stdout(), ) @@ -278,8 +278,8 @@ mod tests { let scanned_blocks = block_streamer.poll_next().await.expect("poll_next failed"); assert_eq!( Some(ChainScannedBlocks::RollForwards(vec![ - ScannedBlock::new("hash-1", 1, 10, Vec::<&str>::new()), - ScannedBlock::new("hash-2", 2, 20, Vec::<&str>::new()) + ScannedBlock::new("hash-1", BlockNumber(1), 10, Vec::<&str>::new()), + ScannedBlock::new("hash-2", BlockNumber(2), 20, Vec::<&str>::new()) ])), scanned_blocks, ); @@ -288,7 +288,7 @@ mod tests { assert_eq!( Some(ChainScannedBlocks::RollForwards(vec![ScannedBlock::new( "hash-3", - 3, + BlockNumber(3), 30, Vec::<&str>::new() ),])), @@ -306,8 +306,8 @@ mod tests { ]))); let mut block_streamer = ChainReaderBlockStreamer::try_new( chain_reader, - Some(ChainPoint::new(100, 10, "hash-123")), - 1, + Some(ChainPoint::new(100, BlockNumber(10), "hash-123")), + BlockNumber(1), MAX_ROLL_FORWARDS_PER_POLL, TestLogger::stdout(), ) @@ -327,7 +327,7 @@ mod tests { let mut block_streamer = ChainReaderBlockStreamer::try_new( chain_reader, None, - 1, + BlockNumber(1), MAX_ROLL_FORWARDS_PER_POLL, TestLogger::stdout(), ) @@ -347,20 +347,25 @@ mod tests { ) { let chain_reader = Arc::new(Mutex::new(FakeChainReader::new(vec![ ChainBlockNextAction::RollForward { - parsed_block: ScannedBlock::new("hash-8", 80, 8, Vec::<&str>::new()), + parsed_block: ScannedBlock::new("hash-8", BlockNumber(80), 8, Vec::<&str>::new()), }, ChainBlockNextAction::RollForward { - parsed_block: ScannedBlock::new("hash-9", 90, 9, Vec::<&str>::new()), + parsed_block: ScannedBlock::new("hash-9", BlockNumber(90), 9, Vec::<&str>::new()), }, ChainBlockNextAction::RollForward { - parsed_block: ScannedBlock::new("hash-10", 100, 10, Vec::<&str>::new()), + parsed_block: ScannedBlock::new( + "hash-10", + BlockNumber(100), + 10, + Vec::<&str>::new(), + ), }, ChainBlockNextAction::RollBackward { slot_number: 9 }, ]))); let mut block_streamer = ChainReaderBlockStreamer::try_new( chain_reader, None, - 1000, + BlockNumber(1000), MAX_ROLL_FORWARDS_PER_POLL, TestLogger::stdout(), ) @@ -371,8 +376,8 @@ mod tests { assert_eq!( Some(ChainScannedBlocks::RollForwards(vec![ - ScannedBlock::new("hash-8", 80, 8, Vec::<&str>::new()), - ScannedBlock::new("hash-9", 90, 9, Vec::<&str>::new()) + ScannedBlock::new("hash-8", BlockNumber(80), 8, Vec::<&str>::new()), + ScannedBlock::new("hash-9", BlockNumber(90), 9, Vec::<&str>::new()) ])), scanned_blocks, ); @@ -383,17 +388,17 @@ mod tests { ) { let chain_reader = Arc::new(Mutex::new(FakeChainReader::new(vec![ ChainBlockNextAction::RollForward { - parsed_block: ScannedBlock::new("hash-8", 80, 8, Vec::<&str>::new()), + parsed_block: ScannedBlock::new("hash-8", BlockNumber(80), 8, Vec::<&str>::new()), }, ChainBlockNextAction::RollForward { - parsed_block: ScannedBlock::new("hash-9", 90, 9, Vec::<&str>::new()), + parsed_block: ScannedBlock::new("hash-9", BlockNumber(90), 9, Vec::<&str>::new()), }, ChainBlockNextAction::RollBackward { slot_number: 3 }, ]))); let mut block_streamer = ChainReaderBlockStreamer::try_new( chain_reader, None, - 1000, + BlockNumber(1000), MAX_ROLL_FORWARDS_PER_POLL, TestLogger::stdout(), ) @@ -411,7 +416,7 @@ mod tests { let mut block_streamer = ChainReaderBlockStreamer::try_new( chain_reader, None, - 1, + BlockNumber(1), MAX_ROLL_FORWARDS_PER_POLL, TestLogger::stdout(), ) diff --git a/mithril-common/src/cardano_block_scanner/dumb_block_scanner.rs b/mithril-common/src/cardano_block_scanner/dumb_block_scanner.rs index 370f385fcaa..91ce30fde75 100644 --- a/mithril-common/src/cardano_block_scanner/dumb_block_scanner.rs +++ b/mithril-common/src/cardano_block_scanner/dumb_block_scanner.rs @@ -131,7 +131,12 @@ mod tests { #[tokio::test] async fn polling_with_one_set_of_block_returns_some_once() { - let expected_blocks = vec![ScannedBlock::new("hash-1", 1, 10, Vec::<&str>::new())]; + let expected_blocks = vec![ScannedBlock::new( + "hash-1", + BlockNumber(1), + 10, + Vec::<&str>::new(), + )]; let mut streamer = DumbBlockStreamer::new().forwards(vec![expected_blocks.clone()]); let blocks = streamer.poll_next().await.unwrap(); @@ -147,12 +152,22 @@ mod tests { #[tokio::test] async fn polling_with_multiple_sets_of_blocks_returns_some_once() { let expected_blocks = vec![ - vec![ScannedBlock::new("hash-1", 1, 10, Vec::<&str>::new())], + vec![ScannedBlock::new( + "hash-1", + BlockNumber(1), + 10, + Vec::<&str>::new(), + )], vec![ - ScannedBlock::new("hash-2", 2, 11, Vec::<&str>::new()), - ScannedBlock::new("hash-3", 3, 12, Vec::<&str>::new()), + ScannedBlock::new("hash-2", BlockNumber(2), 11, Vec::<&str>::new()), + ScannedBlock::new("hash-3", BlockNumber(3), 12, Vec::<&str>::new()), ], - vec![ScannedBlock::new("hash-4", 4, 13, Vec::<&str>::new())], + vec![ScannedBlock::new( + "hash-4", + BlockNumber(4), + 13, + Vec::<&str>::new(), + )], ]; let mut streamer = DumbBlockStreamer::new().forwards(expected_blocks.clone()); @@ -180,10 +195,15 @@ mod tests { #[tokio::test] async fn dumb_scanned_construct_a_streamer_based_on_its_stored_blocks() { - let expected_blocks = vec![ScannedBlock::new("hash-1", 1, 10, Vec::<&str>::new())]; + let expected_blocks = vec![ScannedBlock::new( + "hash-1", + BlockNumber(1), + 10, + Vec::<&str>::new(), + )]; let scanner = DumbBlockScanner::new().forwards(vec![expected_blocks.clone()]); - let mut streamer = scanner.scan(None, 5).await.unwrap(); + let mut streamer = scanner.scan(None, BlockNumber(5)).await.unwrap(); let blocks = streamer.poll_all().await.unwrap(); assert_eq!(blocks, expected_blocks); @@ -191,13 +211,18 @@ mod tests { #[tokio::test] async fn dumb_scanned_construct_a_streamer_based_on_its_stored_chain_scanned_blocks() { - let expected_blocks = vec![ScannedBlock::new("hash-1", 1, 10, Vec::<&str>::new())]; - let expected_chain_point = ChainPoint::new(10, 2, "block-hash"); + let expected_blocks = vec![ScannedBlock::new( + "hash-1", + BlockNumber(1), + 10, + Vec::<&str>::new(), + )]; + let expected_chain_point = ChainPoint::new(10, BlockNumber(2), "block-hash"); let scanner = DumbBlockScanner::new() .forwards(vec![expected_blocks.clone()]) .backward(expected_chain_point.clone()); - let mut streamer = scanner.scan(None, 5).await.unwrap(); + let mut streamer = scanner.scan(None, BlockNumber(5)).await.unwrap(); let blocks = streamer.poll_next().await.unwrap(); assert_eq!( @@ -217,11 +242,21 @@ mod tests { #[tokio::test] async fn polling_with_can_return_roll_backward() { let expected_blocks = vec![ - vec![ScannedBlock::new("hash-1", 1, 10, Vec::<&str>::new())], - vec![ScannedBlock::new("hash-4", 4, 13, Vec::<&str>::new())], + vec![ScannedBlock::new( + "hash-1", + BlockNumber(1), + 10, + Vec::<&str>::new(), + )], + vec![ScannedBlock::new( + "hash-4", + BlockNumber(4), + 13, + Vec::<&str>::new(), + )], ]; - let expected_chain_point = ChainPoint::new(10, 2, "block-hash"); + let expected_chain_point = ChainPoint::new(10, BlockNumber(2), "block-hash"); let mut streamer = DumbBlockStreamer::new() .forwards(expected_blocks.clone()) diff --git a/mithril-common/src/cardano_block_scanner/scanned_block.rs b/mithril-common/src/cardano_block_scanner/scanned_block.rs index bf620ab731c..06dc9c393b2 100644 --- a/mithril-common/src/cardano_block_scanner/scanned_block.rs +++ b/mithril-common/src/cardano_block_scanner/scanned_block.rs @@ -39,7 +39,7 @@ impl ScannedBlock { Self::new( multi_era_block.hash().to_string(), - multi_era_block.number(), + BlockNumber(multi_era_block.number()), multi_era_block.slot(), transactions, ) diff --git a/mithril-common/src/cardano_transactions_preloader.rs b/mithril-common/src/cardano_transactions_preloader.rs index 720204f0dd6..7b6c0139fa7 100644 --- a/mithril-common/src/cardano_transactions_preloader.rs +++ b/mithril-common/src/cardano_transactions_preloader.rs @@ -116,9 +116,7 @@ impl CardanoTransactionsPreloader { .with_context(|| { "No chain point yielded by the chain observer, is your cardano node ready?" })?; - let up_to_block_number = chain_point - .block_number - .saturating_sub(self.security_parameter); + let up_to_block_number = chain_point.block_number - self.security_parameter; self.importer.import(up_to_block_number).await?; Ok(()) @@ -154,8 +152,8 @@ mod tests { #[tokio::test] async fn call_its_inner_importer_when_is_activated() { - let chain_block_number = 5000; - let security_parameter = 542; + let chain_block_number = BlockNumber(5000); + let security_parameter = BlockNumber(542); let chain_observer = FakeObserver::new(Some(TimePoint { chain_point: ChainPoint { block_number: chain_block_number, @@ -194,7 +192,7 @@ mod tests { let preloader = CardanoTransactionsPreloader::new( Arc::new(SignedEntityTypeLock::default()), Arc::new(importer), - 542, + BlockNumber(542), Arc::new(chain_observer), TestLogger::stdout(), Arc::new(CardanoTransactionsPreloaderActivation::new(false)), @@ -218,7 +216,7 @@ mod tests { let preloader = CardanoTransactionsPreloader::new( Arc::new(SignedEntityTypeLock::default()), Arc::new(importer), - 542, + BlockNumber(542), Arc::new(chain_observer), TestLogger::stdout(), Arc::new(preloader_checker), @@ -239,7 +237,7 @@ mod tests { let preloader = CardanoTransactionsPreloader::new( Arc::new(SignedEntityTypeLock::default()), Arc::new(importer), - 0, + BlockNumber(0), Arc::new(chain_observer), TestLogger::stdout(), Arc::new(CardanoTransactionsPreloaderActivation::new(true)), @@ -260,7 +258,7 @@ mod tests { Arc::new(ImporterWithSignedEntityTypeLockCheck { signed_entity_type_lock: signed_entity_type_lock.clone(), }), - 0, + BlockNumber(0), Arc::new(FakeObserver::new(Some(TimePoint::dummy()))), TestLogger::stdout(), Arc::new(CardanoTransactionsPreloaderActivation::new(true)), @@ -291,7 +289,7 @@ mod tests { Arc::new(ImporterWithSignedEntityTypeLockCheck { signed_entity_type_lock: signed_entity_type_lock.clone(), }), - 0, + BlockNumber(0), Arc::new(chain_observer), TestLogger::stdout(), Arc::new(CardanoTransactionsPreloaderActivation::new(true)), diff --git a/mithril-common/src/chain_observer/cli_observer.rs b/mithril-common/src/chain_observer/cli_observer.rs index 3efe2e892e5..300cc3eedfa 100644 --- a/mithril-common/src/chain_observer/cli_observer.rs +++ b/mithril-common/src/chain_observer/cli_observer.rs @@ -12,7 +12,7 @@ use tokio::process::Command; use crate::chain_observer::interface::{ChainObserver, ChainObserverError}; use crate::chain_observer::{ChainAddress, TxDatum}; use crate::crypto_helper::{encode_bech32, KESPeriod, OpCert, SerDeShelleyFileFormat}; -use crate::entities::{ChainPoint, Epoch, StakeDistribution}; +use crate::entities::{BlockNumber, ChainPoint, Epoch, StakeDistribution}; use crate::{CardanoNetwork, StdResult}; /// `CliRunner` trait defines the asynchronous methods @@ -446,7 +446,7 @@ impl ChainObserver for CardanoCliChainObserver { if let Value::String(hash) = &v["hash"] { Ok(Some(ChainPoint { slot_number: v["slot"].as_u64().unwrap_or_default(), - block_number: v["block"].as_u64().unwrap_or_default(), + block_number: BlockNumber(v["block"].as_u64().unwrap_or_default()), block_hash: hash.to_string(), })) } else { @@ -540,7 +540,7 @@ mod tests { assert_eq!( ChainPoint { slot_number: 25886617, - block_number: 1270276, + block_number: BlockNumber(1270276), block_hash: "7383b17d7b05b0953cf0649abff60173995eb9febe556889333e20e1e5b7ca84" .to_string(), }, diff --git a/mithril-common/src/chain_observer/fake_observer.rs b/mithril-common/src/chain_observer/fake_observer.rs index 36a7f71fb34..ed9788ffb88 100644 --- a/mithril-common/src/chain_observer/fake_observer.rs +++ b/mithril-common/src/chain_observer/fake_observer.rs @@ -47,21 +47,21 @@ impl FakeObserver { /// Increase the block number of the [current_time_point][`FakeObserver::current_time_point`] by /// the given increment. - pub async fn increase_block_number(&self, increment: BlockNumber) -> Option { + pub async fn increase_block_number(&self, increment: u64) -> Option { self.change_block_number(|actual_block_number| actual_block_number + increment) .await } /// Decrease the block number of the [current_time_point][`FakeObserver::current_time_point`] by /// the given decrement. - pub async fn decrease_block_number(&self, decrement: BlockNumber) -> Option { + pub async fn decrease_block_number(&self, decrement: u64) -> Option { self.change_block_number(|actual_block_number| actual_block_number - decrement) .await } async fn change_block_number( &self, - change_to_apply: impl Fn(u64) -> u64, + change_to_apply: impl Fn(BlockNumber) -> BlockNumber, ) -> Option { let mut current_time_point = self.current_time_point.write().await; @@ -274,7 +274,7 @@ mod tests { fake_observer .set_current_time_point(Some(TimePoint { chain_point: ChainPoint { - block_number: 1000, + block_number: BlockNumber(1000), ..TimePoint::dummy().chain_point }, ..TimePoint::dummy() @@ -285,7 +285,7 @@ mod tests { let chain_point = fake_observer.get_current_chain_point().await.unwrap(); assert_eq!( Some(ChainPoint { - block_number: 200, + block_number: BlockNumber(200), ..TimePoint::dummy().chain_point }), chain_point, diff --git a/mithril-common/src/chain_observer/pallas_observer.rs b/mithril-common/src/chain_observer/pallas_observer.rs index 2df10fd95a9..c7bfc1f1cf3 100644 --- a/mithril-common/src/chain_observer/pallas_observer.rs +++ b/mithril-common/src/chain_observer/pallas_observer.rs @@ -1,3 +1,6 @@ +use std::collections::BTreeSet; +use std::path::{Path, PathBuf}; + use anyhow::{anyhow, Context}; use async_trait::async_trait; use pallas_addresses::Address; @@ -15,17 +18,12 @@ use pallas_network::{ Point, }, }; - use pallas_primitives::ToCanonicalJson; -use std::{ - collections::BTreeSet, - path::{Path, PathBuf}, -}; use crate::{ chain_observer::{interface::*, ChainAddress, TxDatum}, crypto_helper::{encode_bech32, KESPeriod, OpCert}, - entities::{ChainPoint, Epoch, StakeDistribution}, + entities::{BlockNumber, ChainPoint, Epoch, StakeDistribution}, CardanoNetwork, StdResult, }; @@ -333,7 +331,7 @@ impl PallasChainObserver { Ok(ChainPoint { slot_number: chain_point.slot_or_default(), block_hash: header_hash.unwrap_or_default(), - block_number: chain_block_number.block_number as u64, + block_number: BlockNumber(chain_block_number.block_number as u64), }) } @@ -494,10 +492,11 @@ mod tests { }; use tokio::net::UnixListener; - use super::*; use crate::test_utils::TempDir; use crate::{crypto_helper::ColdKeyGenerator, CardanoNetwork}; + use super::*; + fn get_fake_utxo_by_address() -> UTxOByAddress { let tx_hex = "1e4e5cf2889d52f1745b941090f04a65dea6ce56c5e5e66e69f65c8e36347c17"; let tx_bytes: [u8; 32] = hex::decode(tx_hex).unwrap().try_into().unwrap(); @@ -879,7 +878,7 @@ mod tests { Some(ChainPoint { slot_number: 52851885, block_hash: "010203".to_string(), - block_number: 52851885 + block_number: BlockNumber(52851885) }) ); } diff --git a/mithril-common/src/chain_reader/fake_chain_reader.rs b/mithril-common/src/chain_reader/fake_chain_reader.rs index bf83b702ed7..b1d57b7797c 100644 --- a/mithril-common/src/chain_reader/fake_chain_reader.rs +++ b/mithril-common/src/chain_reader/fake_chain_reader.rs @@ -1,6 +1,7 @@ -use async_trait::async_trait; use std::{collections::VecDeque, sync::Mutex}; +use async_trait::async_trait; + use crate::{entities::ChainPoint, StdResult}; use super::{ChainBlockNextAction, ChainBlockReader}; @@ -33,13 +34,14 @@ impl ChainBlockReader for FakeChainReader { #[cfg(test)] mod tests { use crate::cardano_block_scanner::ScannedBlock; + use crate::entities::BlockNumber; use super::*; fn build_chain_point(id: u64) -> ChainPoint { ChainPoint { slot_number: id, - block_number: id, + block_number: BlockNumber(id), block_hash: format!("point-hash-{id}"), } } @@ -48,10 +50,10 @@ mod tests { async fn test_get_next_chain_block() { let expected_chain_point_next_actions = vec![ ChainBlockNextAction::RollForward { - parsed_block: ScannedBlock::new("hash-1", 1, 10, Vec::<&str>::new()), + parsed_block: ScannedBlock::new("hash-1", BlockNumber(1), 10, Vec::<&str>::new()), }, ChainBlockNextAction::RollForward { - parsed_block: ScannedBlock::new("hash-2", 2, 11, Vec::<&str>::new()), + parsed_block: ScannedBlock::new("hash-2", BlockNumber(2), 11, Vec::<&str>::new()), }, ChainBlockNextAction::RollBackward { slot_number: build_chain_point(1).slot_number, diff --git a/mithril-common/src/chain_reader/pallas_chain_reader.rs b/mithril-common/src/chain_reader/pallas_chain_reader.rs index 3a96434bef7..b0585ba1783 100644 --- a/mithril-common/src/chain_reader/pallas_chain_reader.rs +++ b/mithril-common/src/chain_reader/pallas_chain_reader.rs @@ -154,7 +154,7 @@ mod tests { /// Returns a fake block number for testing purposes. fn get_fake_block_number() -> BlockNumber { - 1337 + BlockNumber(1337) } /// Returns a fake chain point for testing purposes. @@ -206,7 +206,7 @@ mod tests { chainsync_server .send_intersect_found( known_point.clone(), - Tip(known_point.clone(), tip_block_number), + Tip(known_point.clone(), *tip_block_number), ) .await .unwrap(); @@ -222,7 +222,7 @@ mod tests { chainsync_server .send_roll_backward( known_point.clone(), - Tip(known_point.clone(), tip_block_number), + Tip(known_point.clone(), *tip_block_number), ) .await .unwrap(); @@ -230,7 +230,7 @@ mod tests { ServerAction::RollForward => { let block = BlockContent(get_fake_raw_block()); chainsync_server - .send_roll_forward(block, Tip(known_point.clone(), tip_block_number)) + .send_roll_forward(block, Tip(known_point.clone(), *tip_block_number)) .await .unwrap(); } diff --git a/mithril-common/src/crypto_helper/merkle_map.rs b/mithril-common/src/crypto_helper/merkle_map.rs index 77a2c48f0c9..89d9d5ba840 100644 --- a/mithril-common/src/crypto_helper/merkle_map.rs +++ b/mithril-common/src/crypto_helper/merkle_map.rs @@ -461,11 +461,9 @@ impl TryFrom> for MKTreeNode { #[cfg(test)] mod tests { - use std::collections::BTreeSet; - use std::ops::Range; - use crate::entities::BlockRange; + use crate::entities::{BlockNumber, BlockRange}; use super::*; @@ -475,9 +473,11 @@ mod tests { ) -> Vec<(BlockRange, MKTree)> { (0..total_leaves / block_range_length) .map(|block_range_index| { - let block_range = - BlockRange::from_block_number_and_length(block_range_index, block_range_length) - .unwrap(); + let block_range = BlockRange::from_block_number_and_length( + BlockNumber(block_range_index), + BlockNumber(block_range_length), + ) + .unwrap(); let merkle_tree_block_range = generate_merkle_tree(&block_range); (block_range, merkle_tree_block_range) }) @@ -485,7 +485,7 @@ mod tests { } fn generate_merkle_tree(block_range: &BlockRange) -> MKTree { - let leaves = as Clone>::clone(block_range) + let leaves = (*block_range.start..*block_range.end) .map(|leaf_index| leaf_index.to_string()) .collect::>(); MKTree::new(&leaves).unwrap() diff --git a/mithril-common/src/entities/arithmetic_operation_wrapper.rs b/mithril-common/src/entities/arithmetic_operation_wrapper.rs new file mode 100644 index 00000000000..f0ddb0bdde5 --- /dev/null +++ b/mithril-common/src/entities/arithmetic_operation_wrapper.rs @@ -0,0 +1,549 @@ +macro_rules! impl_add_to_wrapper { + ( $wrapper:ident, $inner:ty ) => { + use std::ops::{Add, AddAssign}; + + impl Add for $wrapper { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + self + *rhs + } + } + + impl Add<$inner> for $wrapper { + type Output = Self; + + fn add(self, rhs: $inner) -> Self::Output { + $wrapper(*self + rhs) + } + } + + impl Add<&$inner> for $wrapper { + type Output = Self; + + fn add(self, rhs: &$inner) -> Self::Output { + self.add(*rhs) + } + } + + impl Add<$wrapper> for $inner { + type Output = $wrapper; + + fn add(self, rhs: $wrapper) -> Self::Output { + rhs.add(self) + } + } + + impl Add<&$wrapper> for $inner { + type Output = $wrapper; + + fn add(self, rhs: &$wrapper) -> Self::Output { + rhs.add(self) + } + } + + impl Add<$wrapper> for &$inner { + type Output = $wrapper; + + fn add(self, rhs: $wrapper) -> Self::Output { + rhs.add(self) + } + } + + impl Add<&$wrapper> for &$inner { + type Output = $wrapper; + + fn add(self, rhs: &$wrapper) -> Self::Output { + rhs.add(self) + } + } + + impl AddAssign for $wrapper { + fn add_assign(&mut self, rhs: Self) { + *self = self.add(rhs); + } + } + + impl AddAssign<$inner> for $wrapper { + fn add_assign(&mut self, rhs: $inner) { + *self = self.add(rhs); + } + } + + impl AddAssign<&$inner> for $wrapper { + fn add_assign(&mut self, rhs: &$inner) { + *self = self.add(rhs); + } + } + + impl AddAssign<$wrapper> for $inner { + fn add_assign(&mut self, rhs: $wrapper) { + *self = self.add(rhs.0); + } + } + + impl AddAssign<&$wrapper> for $inner { + fn add_assign(&mut self, rhs: &$wrapper) { + *self = self.add(rhs.0); + } + } + }; +} +pub(crate) use impl_add_to_wrapper; + +macro_rules! impl_sub_to_wrapper { + ( $wrapper:ident, $inner:ty ) => { + use std::ops::{Sub, SubAssign}; + + impl Sub for $wrapper { + type Output = Self; + + fn sub(self, rhs: Self) -> Self::Output { + self - *rhs + } + } + + impl Sub<$inner> for $wrapper { + type Output = Self; + + fn sub(self, rhs: $inner) -> Self::Output { + $wrapper(self.saturating_sub(rhs)) + } + } + + impl Sub<&$inner> for $wrapper { + type Output = Self; + + fn sub(self, rhs: &$inner) -> Self::Output { + self.sub(*rhs) + } + } + + impl Sub<$wrapper> for $inner { + type Output = $wrapper; + + fn sub(self, rhs: $wrapper) -> Self::Output { + rhs.sub(self) + } + } + + impl Sub<&$wrapper> for $inner { + type Output = $wrapper; + + fn sub(self, rhs: &$wrapper) -> Self::Output { + rhs.sub(self) + } + } + + impl Sub<$wrapper> for &$inner { + type Output = $wrapper; + + fn sub(self, rhs: $wrapper) -> Self::Output { + rhs.sub(self) + } + } + + impl Sub<&$wrapper> for &$inner { + type Output = $wrapper; + + fn sub(self, rhs: &$wrapper) -> Self::Output { + rhs.sub(self) + } + } + + impl SubAssign for $wrapper { + fn sub_assign(&mut self, rhs: Self) { + *self = self.sub(rhs); + } + } + + impl SubAssign<$inner> for $wrapper { + fn sub_assign(&mut self, rhs: $inner) { + *self = self.sub(rhs); + } + } + + impl SubAssign<&$inner> for $wrapper { + fn sub_assign(&mut self, rhs: &$inner) { + *self = self.sub(rhs); + } + } + + impl SubAssign<$wrapper> for $inner { + fn sub_assign(&mut self, rhs: $wrapper) { + *self = self.sub(rhs.0); + } + } + + impl SubAssign<&$wrapper> for $inner { + fn sub_assign(&mut self, rhs: &$wrapper) { + *self = self.sub(rhs.0); + } + } + }; +} +pub(crate) use impl_sub_to_wrapper; + +macro_rules! impl_mul_to_wrapper { + ( $wrapper:ident, $inner:ty ) => { + use std::ops::{Mul, MulAssign}; + + impl Mul for $wrapper { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + self * *rhs + } + } + + impl Mul<$inner> for $wrapper { + type Output = Self; + + fn mul(self, rhs: $inner) -> Self::Output { + $wrapper(*self * rhs) + } + } + + impl Mul<&$inner> for $wrapper { + type Output = Self; + + fn mul(self, rhs: &$inner) -> Self::Output { + self.mul(*rhs) + } + } + + impl Mul<$wrapper> for $inner { + type Output = $wrapper; + + fn mul(self, rhs: $wrapper) -> Self::Output { + rhs.mul(self) + } + } + + impl Mul<&$wrapper> for $inner { + type Output = $wrapper; + + fn mul(self, rhs: &$wrapper) -> Self::Output { + rhs.mul(self) + } + } + + impl Mul<$wrapper> for &$inner { + type Output = $wrapper; + + fn mul(self, rhs: $wrapper) -> Self::Output { + rhs.mul(self) + } + } + + impl Mul<&$wrapper> for &$inner { + type Output = $wrapper; + + fn mul(self, rhs: &$wrapper) -> Self::Output { + rhs.mul(self) + } + } + + impl MulAssign for $wrapper { + fn mul_assign(&mut self, rhs: Self) { + *self = self.mul(rhs); + } + } + + impl MulAssign<$inner> for $wrapper { + fn mul_assign(&mut self, rhs: $inner) { + *self = self.mul(rhs); + } + } + + impl MulAssign<&$inner> for $wrapper { + fn mul_assign(&mut self, rhs: &$inner) { + *self = self.mul(rhs); + } + } + + impl MulAssign<$wrapper> for $inner { + fn mul_assign(&mut self, rhs: $wrapper) { + *self = self.mul(rhs.0); + } + } + + impl MulAssign<&$wrapper> for $inner { + fn mul_assign(&mut self, rhs: &$wrapper) { + *self = self.mul(rhs.0); + } + } + }; +} +pub(crate) use impl_mul_to_wrapper; + +macro_rules! impl_div_to_wrapper { + ( $wrapper:ident, $inner:ty ) => { + use std::ops::{Div, DivAssign}; + + impl Div for $wrapper { + type Output = Self; + + fn div(self, rhs: Self) -> Self::Output { + self / *rhs + } + } + + impl Div<$inner> for $wrapper { + type Output = Self; + + fn div(self, rhs: $inner) -> Self::Output { + $wrapper(*self / rhs) + } + } + + impl Div<&$inner> for $wrapper { + type Output = Self; + + fn div(self, rhs: &$inner) -> Self::Output { + self.div(*rhs) + } + } + + impl Div<$wrapper> for $inner { + type Output = $wrapper; + + fn div(self, rhs: $wrapper) -> Self::Output { + $wrapper(self.div(rhs.0)) + } + } + + impl Div<&$wrapper> for $inner { + type Output = $wrapper; + + fn div(self, rhs: &$wrapper) -> Self::Output { + self.div(*rhs) + } + } + + impl Div<$wrapper> for &$inner { + type Output = $wrapper; + + fn div(self, rhs: $wrapper) -> Self::Output { + (*self).div(rhs) + } + } + + impl Div<&$wrapper> for &$inner { + type Output = $wrapper; + + fn div(self, rhs: &$wrapper) -> Self::Output { + (*self).div(*rhs) + } + } + + impl DivAssign for $wrapper { + fn div_assign(&mut self, rhs: Self) { + *self = self.div(rhs); + } + } + + impl DivAssign<$inner> for $wrapper { + fn div_assign(&mut self, rhs: $inner) { + *self = self.div(rhs); + } + } + + impl DivAssign<&$inner> for $wrapper { + fn div_assign(&mut self, rhs: &$inner) { + *self = self.div(rhs); + } + } + + impl DivAssign<$wrapper> for $inner { + fn div_assign(&mut self, rhs: $wrapper) { + *self = self.div(rhs.0); + } + } + + impl DivAssign<&$wrapper> for $inner { + fn div_assign(&mut self, rhs: &$wrapper) { + *self = self.div(rhs.0); + } + } + }; +} +pub(crate) use impl_div_to_wrapper; + +macro_rules! impl_rem_to_wrapper { + ( $wrapper:ident, $inner:ty ) => { + use std::ops::{Rem, RemAssign}; + + impl Rem for $wrapper { + type Output = Self; + + fn rem(self, rhs: Self) -> Self::Output { + self % *rhs + } + } + + impl Rem<$inner> for $wrapper { + type Output = Self; + + fn rem(self, rhs: $inner) -> Self::Output { + $wrapper(*self % rhs) + } + } + + impl Rem<&$inner> for $wrapper { + type Output = Self; + + fn rem(self, rhs: &$inner) -> Self::Output { + self.rem(*rhs) + } + } + + impl Rem<$wrapper> for $inner { + type Output = $wrapper; + + fn rem(self, rhs: $wrapper) -> Self::Output { + $wrapper(self.rem(rhs.0)) + } + } + + impl Rem<&$wrapper> for $inner { + type Output = $wrapper; + + fn rem(self, rhs: &$wrapper) -> Self::Output { + self.rem(*rhs) + } + } + + impl Rem<$wrapper> for &$inner { + type Output = $wrapper; + + fn rem(self, rhs: $wrapper) -> Self::Output { + (*self).rem(rhs) + } + } + + impl Rem<&$wrapper> for &$inner { + type Output = $wrapper; + + fn rem(self, rhs: &$wrapper) -> Self::Output { + (*self).rem(*rhs) + } + } + + impl RemAssign for $wrapper { + fn rem_assign(&mut self, rhs: Self) { + *self = self.rem(rhs); + } + } + + impl RemAssign<$inner> for $wrapper { + fn rem_assign(&mut self, rhs: $inner) { + *self = self.rem(rhs); + } + } + + impl RemAssign<&$inner> for $wrapper { + fn rem_assign(&mut self, rhs: &$inner) { + *self = self.rem(rhs); + } + } + + impl RemAssign<$wrapper> for $inner { + fn rem_assign(&mut self, rhs: $wrapper) { + *self = self.rem(rhs.0); + } + } + + impl RemAssign<&$wrapper> for $inner { + fn rem_assign(&mut self, rhs: &$wrapper) { + *self = self.rem(rhs.0); + } + } + }; +} +pub(crate) use impl_rem_to_wrapper; + +macro_rules! impl_partial_eq_to_wrapper { + ( $wrapper:ty, $inner:ty ) => { + impl PartialEq<$inner> for $wrapper { + fn eq(&self, other: &$inner) -> bool { + self.0.eq(other) + } + } + + impl PartialEq<&$inner> for $wrapper { + fn eq(&self, other: &&$inner) -> bool { + self.0.eq(*other) + } + } + + impl PartialEq<&$wrapper> for $wrapper { + fn eq(&self, other: &&$wrapper) -> bool { + other.0.eq(self) + } + } + + impl PartialEq<$inner> for &$wrapper { + fn eq(&self, other: &$inner) -> bool { + self.0.eq(other) + } + } + + impl PartialEq<$wrapper> for &$wrapper { + fn eq(&self, other: &$wrapper) -> bool { + other.0.eq(self) + } + } + + impl PartialEq<$wrapper> for $inner { + fn eq(&self, other: &$wrapper) -> bool { + other.0.eq(self) + } + } + + impl PartialEq<&$wrapper> for $inner { + fn eq(&self, other: &&$wrapper) -> bool { + other.0.eq(self) + } + } + + impl PartialEq<$wrapper> for &$inner { + fn eq(&self, other: &$wrapper) -> bool { + other.0.eq(*self) + } + } + }; +} +pub(crate) use impl_partial_eq_to_wrapper; + +#[cfg(test)] +pub(crate) mod tests { + macro_rules! test_op_assign { + ( $right:expr, +=, $left:expr => $expected:expr ) => {{ + let mut number = $right; + number += $left; + assert_eq!($expected, number); + }}; + ( $right:expr, -=, $left:expr => $expected:expr ) => {{ + let mut number = $right; + number -= $left; + assert_eq!($expected, number); + }}; + ( $right:expr, *=, $left:expr => $expected:expr ) => {{ + let mut number = $right; + number *= $left; + assert_eq!($expected, number); + }}; + ( $right:expr, /=, $left:expr => $expected:expr ) => {{ + let mut number = $right; + number /= $left; + assert_eq!($expected, number); + }}; + ( $right:expr, %=, $left:expr => $expected:expr ) => {{ + let mut number = $right; + number %= $left; + assert_eq!($expected, number); + }}; + } + pub(crate) use test_op_assign; +} diff --git a/mithril-common/src/entities/block_number.rs b/mithril-common/src/entities/block_number.rs new file mode 100644 index 00000000000..89d1e98c5cb --- /dev/null +++ b/mithril-common/src/entities/block_number.rs @@ -0,0 +1,207 @@ +use std::fmt::{Display, Formatter}; +use std::num::TryFromIntError; +use std::ops::{Deref, DerefMut}; + +use serde::{Deserialize, Serialize}; + +use crate::entities::arithmetic_operation_wrapper::{ + impl_add_to_wrapper, impl_div_to_wrapper, impl_mul_to_wrapper, impl_partial_eq_to_wrapper, + impl_rem_to_wrapper, impl_sub_to_wrapper, +}; +use crate::signable_builder::Beacon; + +#[cfg(target_family = "wasm")] +use wasm_bindgen::prelude::*; + +/// BlockNumber is the block number of a Cardano transaction. +#[derive( + Debug, Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, Hash, +)] +#[cfg_attr(target_family = "wasm", wasm_bindgen)] +pub struct BlockNumber(pub u64); + +impl Beacon for BlockNumber {} + +impl Display for BlockNumber { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} + +impl Deref for BlockNumber { + type Target = u64; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for BlockNumber { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +// Useful for conversion to sqlite number (that use i64) +impl TryFrom for i64 { + type Error = TryFromIntError; + + fn try_from(value: BlockNumber) -> Result { + value.0.try_into() + } +} + +impl_add_to_wrapper!(BlockNumber, u64); +impl_sub_to_wrapper!(BlockNumber, u64); +impl_mul_to_wrapper!(BlockNumber, u64); +impl_div_to_wrapper!(BlockNumber, u64); +impl_rem_to_wrapper!(BlockNumber, u64); +impl_partial_eq_to_wrapper!(BlockNumber, u64); + +#[cfg(test)] +mod tests { + use crate::entities::arithmetic_operation_wrapper::tests::test_op_assign; + + use super::*; + + #[test] + fn test_display() { + assert_eq!(format!("{}", BlockNumber(72)), "72"); + assert_eq!(format!("{}", &BlockNumber(13224)), "13224"); + } + + #[test] + fn test_serialize() { + assert_eq!(serde_json::to_string(&BlockNumber(72)).unwrap(), "72"); + } + + #[test] + fn test_deserialize() { + let block_number: BlockNumber = serde_json::from_str("13224").unwrap(); + assert_eq!(block_number, BlockNumber(13224)); + } + + #[test] + #[allow(clippy::op_ref)] + fn test_add() { + assert_eq!(BlockNumber(4), BlockNumber(1) + BlockNumber(3)); + assert_eq!(BlockNumber(4), BlockNumber(1) + 3_u64); + assert_eq!(BlockNumber(4), BlockNumber(1) + &3_u64); + + assert_eq!(BlockNumber(4), 3_u64 + BlockNumber(1)); + assert_eq!(BlockNumber(4), 3_u64 + &BlockNumber(1)); + assert_eq!(BlockNumber(4), &3_u64 + BlockNumber(1)); + assert_eq!(BlockNumber(4), &3_u64 + &BlockNumber(1)); + + test_op_assign!(BlockNumber(1), +=, BlockNumber(3) => BlockNumber(4)); + test_op_assign!(BlockNumber(1), +=, 3_u64 => BlockNumber(4)); + test_op_assign!(BlockNumber(1), +=, &3_u64 => BlockNumber(4)); + + test_op_assign!(1_u64, +=, BlockNumber(3) => 4_u64); + test_op_assign!(1_u64, +=, &BlockNumber(3) => 4_u64); + } + + #[test] + #[allow(clippy::op_ref)] + fn test_sub() { + assert_eq!(BlockNumber(8), BlockNumber(14) - BlockNumber(6)); + assert_eq!(BlockNumber(8), BlockNumber(14) - 6_u64); + assert_eq!(BlockNumber(8), BlockNumber(14) - &6_u64); + + assert_eq!(BlockNumber(8), 6_u64 - BlockNumber(14)); + assert_eq!(BlockNumber(8), 6_u64 - &BlockNumber(14)); + assert_eq!(BlockNumber(8), &6_u64 - BlockNumber(14)); + assert_eq!(BlockNumber(8), &6_u64 - &BlockNumber(14)); + + test_op_assign!(BlockNumber(14), -=, BlockNumber(6) => BlockNumber(8)); + test_op_assign!(BlockNumber(14), -=, 6_u64 => BlockNumber(8)); + test_op_assign!(BlockNumber(14), -=, &6_u64 => BlockNumber(8)); + + test_op_assign!(14_u64, -=, BlockNumber(6) => 8_u64); + test_op_assign!(14_u64, -=, &BlockNumber(6) => 8_u64); + } + + #[test] + fn saturating_sub() { + assert_eq!(BlockNumber(0), BlockNumber(1) - BlockNumber(5)); + assert_eq!(BlockNumber(0), BlockNumber(1) - 5_u64); + } + + #[test] + #[allow(clippy::op_ref)] + fn test_mul() { + assert_eq!(BlockNumber(6), BlockNumber(2) * BlockNumber(3)); + assert_eq!(BlockNumber(6), BlockNumber(2) * 3_u64); + assert_eq!(BlockNumber(6), BlockNumber(2) * &3_u64); + + assert_eq!(BlockNumber(6), 3_u64 * BlockNumber(2)); + assert_eq!(BlockNumber(6), 3_u64 * &BlockNumber(2)); + assert_eq!(BlockNumber(6), &3_u64 * BlockNumber(2)); + assert_eq!(BlockNumber(6), &3_u64 * &BlockNumber(2)); + + test_op_assign!(BlockNumber(2), *=, BlockNumber(3) => BlockNumber(6)); + test_op_assign!(BlockNumber(2), *=, 3_u64 => BlockNumber(6)); + test_op_assign!(BlockNumber(2), *=, &3_u64 => BlockNumber(6)); + + test_op_assign!(2_u64, *=, BlockNumber(3) => 6_u64); + test_op_assign!(2_u64, *=, &BlockNumber(3) => 6_u64); + } + + #[test] + #[allow(clippy::op_ref)] + fn test_div() { + assert_eq!(BlockNumber(6), BlockNumber(18) / BlockNumber(3)); + assert_eq!(BlockNumber(6), BlockNumber(18) / 3_u64); + assert_eq!(BlockNumber(6), BlockNumber(18) / &3_u64); + + assert_eq!(BlockNumber(6), 12_u64 / BlockNumber(2)); + assert_eq!(BlockNumber(6), 12_u64 / &BlockNumber(2)); + assert_eq!(BlockNumber(6), &12_u64 / BlockNumber(2)); + assert_eq!(BlockNumber(6), &12_u64 / &BlockNumber(2)); + + test_op_assign!(BlockNumber(18), /=, BlockNumber(3) => BlockNumber(6)); + test_op_assign!(BlockNumber(18), /=, 3_u64 => BlockNumber(6)); + test_op_assign!(BlockNumber(18), /=, &3_u64 => BlockNumber(6)); + + test_op_assign!(18_u64, /=, BlockNumber(3) => 6_u64); + test_op_assign!(18_u64, /=, &BlockNumber(3) => 6_u64); + } + + #[test] + #[allow(clippy::op_ref)] + fn test_rem() { + assert_eq!(BlockNumber(3), BlockNumber(18) % BlockNumber(5)); + assert_eq!(BlockNumber(3), BlockNumber(18) % 5_u64); + assert_eq!(BlockNumber(3), BlockNumber(18) % &5_u64); + + assert_eq!(BlockNumber(6), 20_u64 % BlockNumber(7)); + assert_eq!(BlockNumber(6), 20_u64 % &BlockNumber(7)); + assert_eq!(BlockNumber(6), &20_u64 % BlockNumber(7)); + assert_eq!(BlockNumber(6), &20_u64 % &BlockNumber(7)); + + test_op_assign!(BlockNumber(18), %=, BlockNumber(5) => BlockNumber(3)); + test_op_assign!(BlockNumber(18), %=, 5_u64 => BlockNumber(3)); + test_op_assign!(BlockNumber(18), %=, &5_u64 => BlockNumber(3)); + + test_op_assign!(18_u64, %=, BlockNumber(5) => 3_u64); + test_op_assign!(18_u64, %=, &BlockNumber(5) => 3_u64); + } + + #[test] + fn test_eq() { + assert_eq!(BlockNumber(1), BlockNumber(1)); + assert_eq!(BlockNumber(2), &BlockNumber(2)); + assert_eq!(&BlockNumber(3), BlockNumber(3)); + assert_eq!(&BlockNumber(4), &BlockNumber(4)); + + assert_eq!(BlockNumber(5), 5); + assert_eq!(BlockNumber(6), &6); + assert_eq!(&BlockNumber(7), 7); + assert_eq!(&BlockNumber(8), &8); + + assert_eq!(9, BlockNumber(9)); + assert_eq!(10, &BlockNumber(10)); + assert_eq!(&11, BlockNumber(11)); + assert_eq!(&12, &BlockNumber(12)); + } +} diff --git a/mithril-common/src/entities/block_range.rs b/mithril-common/src/entities/block_range.rs index 4420ba053cc..51e8c1bdfbb 100644 --- a/mithril-common/src/entities/block_range.rs +++ b/mithril-common/src/entities/block_range.rs @@ -14,27 +14,27 @@ use crate::{ }; /// BlockRangeLength is the length of a block range. -pub type BlockRangeLength = u64; +pub type BlockRangeLength = BlockNumber; /// BlockRange for the Cardano chain #[derive(Serialize, Deserialize, Clone, Eq, PartialEq, Debug, Hash)] pub struct BlockRange { - inner_range: Range, + inner_range: Range, } impl BlockRange { /// The length of the block range /// Important: this value should be updated with extreme care (probably with an era change) in order to avoid signing disruptions. - pub const LENGTH: BlockRangeLength = 15; + pub const LENGTH: BlockRangeLength = BlockNumber(15); - /// BlockRange factory - pub fn new(start: BlockNumber, end: BlockNumber) -> Self { - Self { - inner_range: start..end, + cfg_test_tools! { + /// BlockRange factory + pub fn new(start: u64, end: u64) -> Self { + Self { + inner_range: BlockNumber(start)..BlockNumber(end), + } } - } - cfg_test_tools! { /// Try to add two BlockRanges pub fn try_add(&self, other: &BlockRange) -> StdResult { if self.inner_range.end.max(other.inner_range.end) @@ -82,9 +82,7 @@ impl BlockRange { } let block_range_start = Self::start_with_length(number, length); let block_range_end = block_range_start + length; - Ok(Self { - inner_range: block_range_start..block_range_end, - }) + Ok(Self::from(*block_range_start..*block_range_end)) } /// Get the start of the block range of given length that contains the given block number @@ -102,7 +100,7 @@ impl Display for BlockRange { } impl Deref for BlockRange { - type Target = Range; + type Target = Range; fn deref(&self) -> &Self::Target { &self.inner_range @@ -127,7 +125,9 @@ impl Ord for BlockRange { impl From> for BlockRange { fn from(other: Range) -> Self { - BlockRange { inner_range: other } + BlockRange { + inner_range: BlockNumber(other.start)..BlockNumber(other.end), + } } } @@ -160,7 +160,7 @@ impl BlockRangesSequence { /// /// The interval bounds will be corrected to be multiples of [BlockRange::LENGTH]. pub fn new(interval: RangeInclusive) -> Self { - let start = if (interval.start() % BlockRange::LENGTH) == 0 { + let start = if (*interval.start() % BlockRange::LENGTH) == 0 { *interval.start() } else { BlockRange::start(*interval.start()) + BlockRange::LENGTH @@ -169,7 +169,10 @@ impl BlockRangesSequence { let end = BlockRange::start(*interval.end() + 1); if start >= end { - Self { start: 0, end: 0 } + Self { + start: BlockNumber(0), + end: BlockNumber(0), + } } else { Self { start, end } } @@ -215,13 +218,13 @@ impl Iterator for BlockRangesSequence { } fn size_hint(&self) -> (usize, Option) { - (self.start as usize, Some(self.end as usize)) + (*self.start as usize, Some(*self.end as usize)) } } impl ExactSizeIterator for BlockRangesSequence { fn len(&self) -> usize { - ((self.end - self.start) / BlockRange::LENGTH) as usize + *((self.end - self.start) / BlockRange::LENGTH) as usize } } @@ -235,13 +238,13 @@ mod tests { fn test_block_range_contains() { let block_range = BlockRange::new(1, 10); - assert!(block_range.contains(&1)); - assert!(block_range.contains(&6)); - assert!(block_range.contains(&9)); + assert!(block_range.contains(&BlockNumber(1))); + assert!(block_range.contains(&BlockNumber(6))); + assert!(block_range.contains(&BlockNumber(9))); - assert!(block_range.contains(&0).not()); + assert!(block_range.contains(&BlockNumber(0)).not()); // The end of the range is exclusive - assert!(block_range.contains(&10).not()); + assert!(block_range.contains(&BlockNumber(10)).not()); } #[test] @@ -280,38 +283,50 @@ mod tests { #[test] fn test_block_range_start() { - assert_eq!(BlockRange::start(0), 0); - assert_eq!(BlockRange::start(1), 0); - assert_eq!(BlockRange::start(14), 0); - assert_eq!(BlockRange::start(15), 15); - assert_eq!(BlockRange::start(16), 15); - assert_eq!(BlockRange::start(29), 15); + assert_eq!(BlockRange::start(BlockNumber(0)), 0); + assert_eq!(BlockRange::start(BlockNumber(1)), 0); + assert_eq!(BlockRange::start(BlockNumber(14)), 0); + assert_eq!(BlockRange::start(BlockNumber(15)), 15); + assert_eq!(BlockRange::start(BlockNumber(16)), 15); + assert_eq!(BlockRange::start(BlockNumber(29)), 15); } #[test] fn test_block_range_all_block_ranges_in() { - assert_eq!(BlockRange::all_block_ranges_in(0..=0).into_vec(), vec![]); - assert_eq!(BlockRange::all_block_ranges_in(0..=1).into_vec(), vec![]); - assert_eq!(BlockRange::all_block_ranges_in(0..=13).into_vec(), vec![]); - assert_eq!(BlockRange::all_block_ranges_in(1..=14).into_vec(), vec![]); assert_eq!( - BlockRange::all_block_ranges_in(0..=14).into_vec(), + BlockRange::all_block_ranges_in(BlockNumber(0)..=BlockNumber(0)).into_vec(), + vec![] + ); + assert_eq!( + BlockRange::all_block_ranges_in(BlockNumber(0)..=BlockNumber(1)).into_vec(), + vec![] + ); + assert_eq!( + BlockRange::all_block_ranges_in(BlockNumber(0)..=BlockNumber(13)).into_vec(), + vec![] + ); + assert_eq!( + BlockRange::all_block_ranges_in(BlockNumber(1)..=BlockNumber(14)).into_vec(), + vec![] + ); + assert_eq!( + BlockRange::all_block_ranges_in(BlockNumber(0)..=BlockNumber(14)).into_vec(), vec![BlockRange::new(0, 15)] ); assert_eq!( - BlockRange::all_block_ranges_in(0..=15).into_vec(), + BlockRange::all_block_ranges_in(BlockNumber(0)..=BlockNumber(15)).into_vec(), vec![BlockRange::new(0, 15)] ); assert_eq!( - BlockRange::all_block_ranges_in(14..=29).into_vec(), + BlockRange::all_block_ranges_in(BlockNumber(14)..=BlockNumber(29)).into_vec(), vec![BlockRange::new(15, 30)] ); assert_eq!( - BlockRange::all_block_ranges_in(14..=30).into_vec(), + BlockRange::all_block_ranges_in(BlockNumber(14)..=BlockNumber(30)).into_vec(), vec![BlockRange::new(15, 30)] ); assert_eq!( - BlockRange::all_block_ranges_in(14..=60).into_vec(), + BlockRange::all_block_ranges_in(BlockNumber(14)..=BlockNumber(60)).into_vec(), vec![ BlockRange::new(15, 30), BlockRange::new(30, 45), @@ -322,29 +337,49 @@ mod tests { #[test] fn test_block_ranges_sequence_is_empty() { - assert!(BlockRange::all_block_ranges_in(0..=0).is_empty()); - assert!(BlockRange::all_block_ranges_in(0..=1).is_empty()); - assert!(BlockRange::all_block_ranges_in(0..=13).is_empty()); - assert!(BlockRange::all_block_ranges_in(1..=14).is_empty()); - assert!(BlockRange::all_block_ranges_in(0..=14).is_empty().not()); - assert!(BlockRange::all_block_ranges_in(0..=15).is_empty().not()); - assert!(BlockRange::all_block_ranges_in(14..=29).is_empty().not()); - assert!(BlockRange::all_block_ranges_in(14..=30).is_empty().not()); - assert!(BlockRange::all_block_ranges_in(14..=60).is_empty().not()); + assert!(BlockRange::all_block_ranges_in(BlockNumber(0)..=BlockNumber(0)).is_empty()); + assert!(BlockRange::all_block_ranges_in(BlockNumber(0)..=BlockNumber(1)).is_empty()); + assert!(BlockRange::all_block_ranges_in(BlockNumber(0)..=BlockNumber(13)).is_empty()); + assert!(BlockRange::all_block_ranges_in(BlockNumber(1)..=BlockNumber(14)).is_empty()); + assert!( + BlockRange::all_block_ranges_in(BlockNumber(0)..=BlockNumber(14)) + .is_empty() + .not() + ); + assert!( + BlockRange::all_block_ranges_in(BlockNumber(0)..=BlockNumber(15)) + .is_empty() + .not() + ); + assert!( + BlockRange::all_block_ranges_in(BlockNumber(14)..=BlockNumber(29)) + .is_empty() + .not() + ); + assert!( + BlockRange::all_block_ranges_in(BlockNumber(14)..=BlockNumber(30)) + .is_empty() + .not() + ); + assert!( + BlockRange::all_block_ranges_in(BlockNumber(14)..=BlockNumber(60)) + .is_empty() + .not() + ); } #[test] fn test_block_ranges_sequence_len() { assert_eq!( - BlockRange::all_block_ranges_in(0..=(BlockRange::LENGTH - 2)).len(), + BlockRange::all_block_ranges_in(BlockNumber(0)..=(BlockRange::LENGTH - 2)).len(), 0 ); assert_eq!( - BlockRange::all_block_ranges_in(0..=(BlockRange::LENGTH - 1)).len(), + BlockRange::all_block_ranges_in(BlockNumber(0)..=(BlockRange::LENGTH - 1)).len(), 1 ); assert_eq!( - BlockRange::all_block_ranges_in(0..=(BlockRange::LENGTH * 15)).len(), + BlockRange::all_block_ranges_in(BlockNumber(0)..=(BlockRange::LENGTH * 15)).len(), 15 ); } @@ -352,58 +387,89 @@ mod tests { #[test] fn test_block_ranges_sequence_contains() { let block_range = BlockRange::new(15, 30); - assert!(BlockRange::all_block_ranges_in(0..=14) - .contains(&block_range) - .not()); - assert!(BlockRange::all_block_ranges_in(30..=59) - .contains(&block_range) - .not()); - assert!(BlockRange::all_block_ranges_in(0..=29).contains(&block_range)); - assert!(BlockRange::all_block_ranges_in(15..=29).contains(&block_range)); - assert!(BlockRange::all_block_ranges_in(15..=44).contains(&block_range)); + assert!( + BlockRange::all_block_ranges_in(BlockNumber(0)..=BlockNumber(14)) + .contains(&block_range) + .not() + ); + assert!( + BlockRange::all_block_ranges_in(BlockNumber(30)..=BlockNumber(59)) + .contains(&block_range) + .not() + ); + assert!( + BlockRange::all_block_ranges_in(BlockNumber(0)..=BlockNumber(29)) + .contains(&block_range) + ); + assert!( + BlockRange::all_block_ranges_in(BlockNumber(15)..=BlockNumber(29)) + .contains(&block_range) + ); + assert!( + BlockRange::all_block_ranges_in(BlockNumber(15)..=BlockNumber(44)) + .contains(&block_range) + ); } #[test] fn test_block_range_from_number() { - assert_eq!(BlockRange::from_block_number(0), BlockRange::new(0, 15)); - assert_eq!(BlockRange::from_block_number(1), BlockRange::new(0, 15)); - assert_eq!(BlockRange::from_block_number(14), BlockRange::new(0, 15)); - assert_eq!(BlockRange::from_block_number(15), BlockRange::new(15, 30)); - assert_eq!(BlockRange::from_block_number(16), BlockRange::new(15, 30)); - assert_eq!(BlockRange::from_block_number(29), BlockRange::new(15, 30)); + assert_eq!( + BlockRange::from_block_number(BlockNumber(0)), + BlockRange::new(0, 15) + ); + assert_eq!( + BlockRange::from_block_number(BlockNumber(1)), + BlockRange::new(0, 15) + ); + assert_eq!( + BlockRange::from_block_number(BlockNumber(14)), + BlockRange::new(0, 15) + ); + assert_eq!( + BlockRange::from_block_number(BlockNumber(15)), + BlockRange::new(15, 30) + ); + assert_eq!( + BlockRange::from_block_number(BlockNumber(16)), + BlockRange::new(15, 30) + ); + assert_eq!( + BlockRange::from_block_number(BlockNumber(29)), + BlockRange::new(15, 30) + ); } #[test] fn test_block_range_from_number_and_length_with_valid_input() { assert_eq!( - BlockRange::from_block_number_and_length(0, 10).unwrap(), + BlockRange::from_block_number_and_length(BlockNumber(0), BlockNumber(10)).unwrap(), BlockRange::new(0, 10) ); assert_eq!( - BlockRange::from_block_number_and_length(1, 10).unwrap(), + BlockRange::from_block_number_and_length(BlockNumber(1), BlockNumber(10)).unwrap(), BlockRange::new(0, 10) ); assert_eq!( - BlockRange::from_block_number_and_length(9, 10).unwrap(), + BlockRange::from_block_number_and_length(BlockNumber(9), BlockNumber(10)).unwrap(), BlockRange::new(0, 10) ); assert_eq!( - BlockRange::from_block_number_and_length(10, 10).unwrap(), + BlockRange::from_block_number_and_length(BlockNumber(10), BlockNumber(10)).unwrap(), BlockRange::new(10, 20) ); assert_eq!( - BlockRange::from_block_number_and_length(11, 10).unwrap(), + BlockRange::from_block_number_and_length(BlockNumber(11), BlockNumber(10)).unwrap(), BlockRange::new(10, 20) ); assert_eq!( - BlockRange::from_block_number_and_length(19, 10).unwrap(), + BlockRange::from_block_number_and_length(BlockNumber(19), BlockNumber(10)).unwrap(), BlockRange::new(10, 20) ); } #[test] fn test_block_range_from_number_and_length_with_invalid_input() { - BlockRange::from_block_number_and_length(10, 0) + BlockRange::from_block_number_and_length(BlockNumber(10), BlockNumber(0)) .expect_err("BlockRange should not be computed with a length of 0"); } @@ -411,7 +477,7 @@ mod tests { // allow to specify a range with start > end #[allow(clippy::reversed_empty_ranges)] fn test_building_sequence_with_start_greater_than_end_yield_empty_iterator() { - let sequence = BlockRange::all_block_ranges_in(30..=15); + let sequence = BlockRange::all_block_ranges_in(BlockNumber(30)..=BlockNumber(15)); assert_eq!(sequence.clone().into_vec(), vec![]); assert!(sequence.is_empty()); } diff --git a/mithril-common/src/entities/cardano_chain_point.rs b/mithril-common/src/entities/cardano_chain_point.rs index 506dedd0825..41488fdf8dc 100644 --- a/mithril-common/src/entities/cardano_chain_point.rs +++ b/mithril-common/src/entities/cardano_chain_point.rs @@ -3,20 +3,15 @@ use std::fmt::{Display, Formatter}; use serde::{Deserialize, Serialize}; +use crate::entities::BlockNumber; + cfg_fs! { use pallas_network::miniprotocols::{chainsync::Tip, Point}; } -use crate::signable_builder::Beacon; - /// [Cardano Slot number](https://docs.cardano.org/learn/cardano-node/#slotsandepochs) pub type SlotNumber = u64; -/// BlockNumber is the block number of a Cardano transaction. -pub type BlockNumber = u64; - -impl Beacon for BlockNumber {} - /// Hash of a Cardano Block pub type BlockHash = String; @@ -51,7 +46,7 @@ impl ChainPoint { pub fn origin() -> ChainPoint { ChainPoint { slot_number: 0, - block_number: 0, + block_number: BlockNumber(0), block_hash: String::new(), } } @@ -66,7 +61,7 @@ impl ChainPoint { pub fn dummy() -> Self { Self { slot_number: 100, - block_number: 50, + block_number: BlockNumber(0), block_hash: "block_hash-50".to_string(), } } @@ -116,12 +111,12 @@ cfg_fs! { match point { Point::Specific(slot_number, block_hash) => Self { slot_number, - block_number: 0, + block_number: BlockNumber(0), block_hash: hex::encode(block_hash), }, Point::Origin => Self { slot_number: 0, - block_number: 0, + block_number: BlockNumber(0), block_hash: String::new(), }, } @@ -133,7 +128,7 @@ cfg_fs! { let chain_point: Self = tip.0.into(); Self { slot_number: chain_point.slot_number, - block_number: tip.1, + block_number: BlockNumber(tip.1), block_hash: chain_point.block_hash, } } @@ -143,7 +138,7 @@ cfg_fs! { fn from(chain_point: ChainPoint) -> Self { let block_number = chain_point.block_number; let point: Point = chain_point.into(); - Tip(point, block_number) + Tip(point, *block_number) } } } @@ -158,12 +153,12 @@ mod tests { fn chain_point_ord_cmp_block_number_take_precedence_over_other_fields() { let chain_point1 = ChainPoint { slot_number: 15, - block_number: 10, + block_number: BlockNumber(10), block_hash: "hash2".to_string(), }; let chain_point2 = ChainPoint { slot_number: 5, - block_number: 20, + block_number: BlockNumber(20), block_hash: "hash1".to_string(), }; @@ -174,12 +169,12 @@ mod tests { fn chain_point_ord_cmp_if_block_number_equals_then_compare_slot_numbers() { let chain_point1 = ChainPoint { slot_number: 15, - block_number: 0, + block_number: BlockNumber(0), block_hash: "hash2".to_string(), }; let chain_point2 = ChainPoint { slot_number: 5, - block_number: 0, + block_number: BlockNumber(0), block_hash: "hash1".to_string(), }; @@ -190,12 +185,12 @@ mod tests { fn chain_point_ord_cmp_if_block_number_and_slot_number_equals_then_compare_block_hash() { let chain_point1 = ChainPoint { slot_number: 5, - block_number: 10, + block_number: BlockNumber(10), block_hash: "hash1".to_string(), }; let chain_point2 = ChainPoint { slot_number: 5, - block_number: 10, + block_number: BlockNumber(10), block_hash: "hash2".to_string(), }; diff --git a/mithril-common/src/entities/cardano_transaction.rs b/mithril-common/src/entities/cardano_transaction.rs index 9bb3b465abf..d0ecdd4fa4e 100644 --- a/mithril-common/src/entities/cardano_transaction.rs +++ b/mithril-common/src/entities/cardano_transaction.rs @@ -57,7 +57,7 @@ mod tests { #[test] fn test_convert_cardano_transaction_to_merkle_tree_node() { - let transaction = CardanoTransaction::new("tx-hash-123", 10, 4, "block_hash"); + let transaction = CardanoTransaction::new("tx-hash-123", BlockNumber(10), 4, "block_hash"); let computed_mktree_node: MKTreeNode = transaction.into(); let expected_mk_tree_node = MKTreeNode::new("tx-hash-123".as_bytes().to_vec()); diff --git a/mithril-common/src/entities/cardano_transactions_set_proof.rs b/mithril-common/src/entities/cardano_transactions_set_proof.rs index 14881e19595..f605ce350c0 100644 --- a/mithril-common/src/entities/cardano_transactions_set_proof.rs +++ b/mithril-common/src/entities/cardano_transactions_set_proof.rs @@ -57,12 +57,12 @@ impl CardanoTransactionsSetProof { /// Retrieve a dummy proof (for test only) pub fn dummy() -> Self { let leaves = vec![ - (0, "tx-1".to_string()), - (1, "tx-2".to_string()), - (1, "tx-3".to_string()), - (10, "tx-4".to_string()), - (20, "tx-5".to_string()), - (22, "tx-6".to_string()), + (BlockNumber(0), "tx-1".to_string()), + (BlockNumber(1), "tx-2".to_string()), + (BlockNumber(1), "tx-3".to_string()), + (BlockNumber(10), "tx-4".to_string()), + (BlockNumber(20), "tx-5".to_string()), + (BlockNumber(22), "tx-6".to_string()), ]; Self::from_leaves(&leaves).unwrap() @@ -133,12 +133,12 @@ mod tests { #[test] fn should_verify_where_all_hashes_are_contained_in_the_proof() { let leaves = vec![ - (0, "tx-1".to_string()), - (1, "tx-2".to_string()), - (1, "tx-3".to_string()), - (10, "tx-4".to_string()), - (20, "tx-5".to_string()), - (22, "tx-6".to_string()), + (BlockNumber(0), "tx-1".to_string()), + (BlockNumber(1), "tx-2".to_string()), + (BlockNumber(1), "tx-3".to_string()), + (BlockNumber(10), "tx-4".to_string()), + (BlockNumber(20), "tx-5".to_string()), + (BlockNumber(22), "tx-6".to_string()), ]; let proof = CardanoTransactionsSetProof::from_leaves(&leaves).unwrap(); @@ -148,12 +148,12 @@ mod tests { #[test] fn shouldnt_verify_where_at_least_one_hash_is_not_contained_in_the_proof() { let leaves = vec![ - (0, "tx-1".to_string()), - (1, "tx-2".to_string()), - (1, "tx-3".to_string()), - (10, "tx-4".to_string()), - (20, "tx-5".to_string()), - (22, "tx-6".to_string()), + (BlockNumber(0), "tx-1".to_string()), + (BlockNumber(1), "tx-2".to_string()), + (BlockNumber(1), "tx-3".to_string()), + (BlockNumber(10), "tx-4".to_string()), + (BlockNumber(20), "tx-5".to_string()), + (BlockNumber(22), "tx-6".to_string()), ]; let proof = CardanoTransactionsSetProof::from_leaves(&leaves).unwrap(); let mut transactions_hashes_tampered = proof.transactions_hashes().to_vec(); diff --git a/mithril-common/src/entities/cardano_transactions_snapshot.rs b/mithril-common/src/entities/cardano_transactions_snapshot.rs index 3165a650e36..a3dedd38018 100644 --- a/mithril-common/src/entities/cardano_transactions_snapshot.rs +++ b/mithril-common/src/entities/cardano_transactions_snapshot.rs @@ -57,17 +57,20 @@ mod tests { assert_eq!( hash_expected, - CardanoTransactionsSnapshot::new("mk-root-123".to_string(), 50).compute_hash() + CardanoTransactionsSnapshot::new("mk-root-123".to_string(), BlockNumber(50)) + .compute_hash() ); assert_ne!( hash_expected, - CardanoTransactionsSnapshot::new("mk-root-456".to_string(), 50).compute_hash() + CardanoTransactionsSnapshot::new("mk-root-456".to_string(), BlockNumber(50)) + .compute_hash() ); assert_ne!( hash_expected, - CardanoTransactionsSnapshot::new("mk-root-123".to_string(), 47).compute_hash() + CardanoTransactionsSnapshot::new("mk-root-123".to_string(), BlockNumber(47)) + .compute_hash() ); } } diff --git a/mithril-common/src/entities/epoch.rs b/mithril-common/src/entities/epoch.rs index e000e2ea6eb..c9bc61ba4f7 100644 --- a/mithril-common/src/entities/epoch.rs +++ b/mithril-common/src/entities/epoch.rs @@ -1,12 +1,13 @@ -use serde::{Deserialize, Serialize}; +use std::fmt::{Display, Formatter}; use std::num::TryFromIntError; use std::ops::{Deref, DerefMut}; -use std::{ - fmt::{Display, Formatter}, - ops::{Add, AddAssign, Sub, SubAssign}, -}; + +use serde::{Deserialize, Serialize}; use thiserror::Error; +use crate::entities::arithmetic_operation_wrapper::{ + impl_add_to_wrapper, impl_partial_eq_to_wrapper, impl_sub_to_wrapper, +}; use crate::signable_builder::Beacon as SignableBeacon; /// Epoch represents a Cardano epoch @@ -99,85 +100,9 @@ impl DerefMut for Epoch { } } -impl Add for Epoch { - type Output = Self; - - fn add(self, rhs: Self) -> Self::Output { - Epoch(self.0 + rhs.0) - } -} - -impl Add for Epoch { - type Output = Self; - - fn add(self, rhs: u64) -> Self::Output { - Self(self.0 + rhs) - } -} - -impl AddAssign for Epoch { - fn add_assign(&mut self, rhs: Self) { - *self = self.add(rhs); - } -} - -impl AddAssign for Epoch { - fn add_assign(&mut self, rhs: u64) { - *self = self.add(rhs); - } -} - -impl Sub for Epoch { - type Output = Self; - - fn sub(self, rhs: Self) -> Self::Output { - Self(self.0.saturating_sub(rhs.0)) - } -} - -impl Sub for Epoch { - type Output = Self; - - fn sub(self, rhs: u64) -> Self::Output { - Self(self.0.saturating_sub(rhs)) - } -} - -impl SubAssign for Epoch { - fn sub_assign(&mut self, rhs: Self) { - *self = self.sub(rhs); - } -} - -impl SubAssign for Epoch { - fn sub_assign(&mut self, rhs: u64) { - *self = self.sub(rhs); - } -} - -impl PartialEq for Epoch { - fn eq(&self, other: &u64) -> bool { - self.0.eq(other) - } -} - -impl PartialEq for u64 { - fn eq(&self, other: &Epoch) -> bool { - other.0.eq(self) - } -} - -impl PartialEq for &Epoch { - fn eq(&self, other: &u64) -> bool { - self.0.eq(other) - } -} - -impl PartialEq<&Epoch> for u64 { - fn eq(&self, other: &&Epoch) -> bool { - other.0.eq(self) - } -} +impl_add_to_wrapper!(Epoch, u64); +impl_sub_to_wrapper!(Epoch, u64); +impl_partial_eq_to_wrapper!(Epoch, u64); impl Display for Epoch { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { @@ -213,34 +138,65 @@ pub enum EpochError { #[cfg(test)] mod tests { + use crate::entities::arithmetic_operation_wrapper::tests::test_op_assign; + use super::*; #[test] + fn test_display() { + assert_eq!(format!("{}", Epoch(72)), "72"); + assert_eq!(format!("{}", &Epoch(13224)), "13224"); + } + + #[test] + fn test_serialize() { + assert_eq!(serde_json::to_string(&Epoch(72)).unwrap(), "72"); + } + + #[test] + fn test_deserialize() { + let block_number: Epoch = serde_json::from_str("13224").unwrap(); + assert_eq!(block_number, Epoch(13224)); + } + + #[test] + #[allow(clippy::op_ref)] fn test_add() { assert_eq!(Epoch(4), Epoch(1) + Epoch(3)); assert_eq!(Epoch(4), Epoch(1) + 3_u64); + assert_eq!(Epoch(4), Epoch(1) + &3_u64); + + assert_eq!(Epoch(4), 3_u64 + Epoch(1)); + assert_eq!(Epoch(4), 3_u64 + &Epoch(1)); + assert_eq!(Epoch(4), &3_u64 + Epoch(1)); + assert_eq!(Epoch(4), &3_u64 + &Epoch(1)); - let mut epoch = Epoch(1); - epoch += Epoch(3); - assert_eq!(Epoch(4), epoch); + test_op_assign!(Epoch(1), +=, Epoch(3) => Epoch(4)); + test_op_assign!(Epoch(1), +=, 3_u64 => Epoch(4)); + test_op_assign!(Epoch(1), +=, &3_u64 => Epoch(4)); - let mut epoch = Epoch(1); - epoch += 3_u64; - assert_eq!(Epoch(4), epoch); + test_op_assign!(1_u64, +=, Epoch(3) => 4_u64); + test_op_assign!(1_u64, +=, &Epoch(3) => 4_u64); } #[test] + #[allow(clippy::op_ref)] fn test_sub() { assert_eq!(Epoch(8), Epoch(14) - Epoch(6)); assert_eq!(Epoch(8), Epoch(14) - 6_u64); + assert_eq!(Epoch(8), Epoch(14) - &6_u64); + + assert_eq!(Epoch(8), 6_u64 - Epoch(14)); + assert_eq!(Epoch(8), 6_u64 - &Epoch(14)); + assert_eq!(Epoch(8), &6_u64 - Epoch(14)); + assert_eq!(Epoch(8), &6_u64 - &Epoch(14)); - let mut epoch = Epoch(14); - epoch -= Epoch(6); - assert_eq!(Epoch(8), epoch); + test_op_assign!(Epoch(14), -=, Epoch(6) => Epoch(8)); + test_op_assign!(Epoch(14), -=, 6_u64 => Epoch(8)); + test_op_assign!(Epoch(14), -=, &6_u64 => Epoch(8)); - let mut epoch = Epoch(14); - epoch -= 6_u64; - assert_eq!(Epoch(8), epoch); + test_op_assign!(14_u64, -=, Epoch(6) => 8_u64); + test_op_assign!(14_u64, -=, &Epoch(6) => 8_u64); } #[test] @@ -262,10 +218,20 @@ mod tests { #[test] fn test_eq() { - assert_eq!(Epoch(3), 3); - assert_eq!(&Epoch(4), 4); - assert_eq!(5, Epoch(5)); - assert_eq!(6, &Epoch(6)); + assert_eq!(Epoch(1), Epoch(1)); + assert_eq!(Epoch(2), &Epoch(2)); + assert_eq!(&Epoch(3), Epoch(3)); + assert_eq!(&Epoch(4), &Epoch(4)); + + assert_eq!(Epoch(5), 5); + assert_eq!(Epoch(6), &6); + assert_eq!(&Epoch(7), 7); + assert_eq!(&Epoch(8), &8); + + assert_eq!(9, Epoch(9)); + assert_eq!(10, &Epoch(10)); + assert_eq!(&11, Epoch(11)); + assert_eq!(&12, &Epoch(12)); } #[test] diff --git a/mithril-common/src/entities/mod.rs b/mithril-common/src/entities/mod.rs index 6d794ad5691..21d0532c673 100644 --- a/mithril-common/src/entities/mod.rs +++ b/mithril-common/src/entities/mod.rs @@ -1,5 +1,7 @@ //! The entities used by, and exchanged between, the aggregator, signers and client. +pub(crate) mod arithmetic_operation_wrapper; +mod block_number; mod block_range; mod cardano_chain_point; mod cardano_db_beacon; @@ -25,8 +27,9 @@ mod snapshot; mod time_point; mod type_alias; +pub use block_number::BlockNumber; pub use block_range::{BlockRange, BlockRangeLength, BlockRangesSequence}; -pub use cardano_chain_point::{BlockHash, BlockNumber, ChainPoint, SlotNumber}; +pub use cardano_chain_point::{BlockHash, ChainPoint, SlotNumber}; pub use cardano_db_beacon::CardanoDbBeacon; pub use cardano_network::CardanoNetwork; pub use cardano_transaction::{CardanoTransaction, TransactionHash}; diff --git a/mithril-common/src/entities/signed_entity.rs b/mithril-common/src/entities/signed_entity.rs index 36ca43f6ba3..de499ee8c31 100644 --- a/mithril-common/src/entities/signed_entity.rs +++ b/mithril-common/src/entities/signed_entity.rs @@ -1,12 +1,14 @@ use chrono::{DateTime, Utc}; +use crate::entities::{ + CardanoTransactionsSnapshot, MithrilStakeDistribution, SignedEntityType, Snapshot, +}; use crate::signable_builder::Artifact; #[cfg(any(test, feature = "test_tools"))] use crate::test_utils::fake_data; #[cfg(any(test, feature = "test_tools"))] use super::{CardanoDbBeacon, Epoch}; -use super::{CardanoTransactionsSnapshot, MithrilStakeDistribution, SignedEntityType, Snapshot}; /// Aggregate for signed entity #[derive(Debug, Clone)] @@ -68,7 +70,7 @@ impl SignedEntity { cfg_test_tools! { /// Create a dummy [SignedEntity] for [CardanoTransactionsSnapshot] entity pub fn dummy() -> Self { - let block_number = 50; + let block_number = crate::entities::BlockNumber(50); SignedEntity { signed_entity_id: "snapshot-id-123".to_string(), signed_entity_type: SignedEntityType::CardanoTransactions(Epoch(5), block_number), diff --git a/mithril-common/src/entities/signed_entity_config.rs b/mithril-common/src/entities/signed_entity_config.rs index a949f3145aa..7e98dd2ed08 100644 --- a/mithril-common/src/entities/signed_entity_config.rs +++ b/mithril-common/src/entities/signed_entity_config.rs @@ -118,8 +118,8 @@ impl CardanoTransactionsSigningConfig { /// Create a dummy config pub fn dummy() -> Self { Self { - security_parameter: 0, - step: 15, + security_parameter: BlockNumber(0), + step: BlockNumber(15), } } } @@ -148,8 +148,8 @@ impl CardanoTransactionsSigningConfig { let adjusted_step = std::cmp::max(adjusted_step, BlockRange::LENGTH); let block_number_to_be_signed = - (block_number.saturating_sub(self.security_parameter)) / adjusted_step * adjusted_step; - block_number_to_be_signed.saturating_sub(1) + (block_number - self.security_parameter) / adjusted_step * adjusted_step; + block_number_to_be_signed - 1 } } @@ -167,7 +167,7 @@ mod tests { immutable_file_number: 5, chain_point: ChainPoint { slot_number: 73, - block_number: 20, + block_number: BlockNumber(20), block_hash: "block_hash-20".to_string(), }, }; @@ -175,8 +175,8 @@ mod tests { allowed_discriminants: SignedEntityTypeDiscriminants::all(), network: CardanoNetwork::DevNet(12), cardano_transactions_signing_config: CardanoTransactionsSigningConfig { - security_parameter: 0, - step: 15, + security_parameter: BlockNumber(0), + step: BlockNumber(15), }, }; @@ -208,7 +208,7 @@ mod tests { // the security parameter is 0. // This is further tested in the "computing_block_number_to_be_signed" tests below. assert_eq!( - SignedEntityType::CardanoTransactions(Epoch(1), 14), + SignedEntityType::CardanoTransactions(Epoch(1), BlockNumber(14)), config.time_point_to_signed_entity( SignedEntityTypeDiscriminants::CardanoTransactions, &time_point @@ -221,37 +221,37 @@ mod tests { // **block_number = ((tip.block_number - k') / n) × n** assert_eq!( CardanoTransactionsSigningConfig { - security_parameter: 0, - step: 15, + security_parameter: BlockNumber(0), + step: BlockNumber(15), } - .compute_block_number_to_be_signed(105), + .compute_block_number_to_be_signed(BlockNumber(105)), 104 ); assert_eq!( CardanoTransactionsSigningConfig { - security_parameter: 5, - step: 15, + security_parameter: BlockNumber(5), + step: BlockNumber(15), } - .compute_block_number_to_be_signed(100), + .compute_block_number_to_be_signed(BlockNumber(100)), 89 ); assert_eq!( CardanoTransactionsSigningConfig { - security_parameter: 85, - step: 15, + security_parameter: BlockNumber(85), + step: BlockNumber(15), } - .compute_block_number_to_be_signed(100), + .compute_block_number_to_be_signed(BlockNumber(100)), 14 ); assert_eq!( CardanoTransactionsSigningConfig { - security_parameter: 0, - step: 30, + security_parameter: BlockNumber(0), + step: BlockNumber(30), } - .compute_block_number_to_be_signed(29), + .compute_block_number_to_be_signed(BlockNumber(29)), 0 ); } @@ -260,10 +260,10 @@ mod tests { fn computing_block_number_to_be_signed_should_not_overlow_on_security_parameter() { assert_eq!( CardanoTransactionsSigningConfig { - security_parameter: 100, - step: 30, + security_parameter: BlockNumber(100), + step: BlockNumber(30), } - .compute_block_number_to_be_signed(50), + .compute_block_number_to_be_signed(BlockNumber(50)), 0 ); } @@ -272,7 +272,7 @@ mod tests { fn computing_block_number_to_be_signed_round_step_to_a_block_range_start() { assert_eq!( CardanoTransactionsSigningConfig { - security_parameter: 0, + security_parameter: BlockNumber(0), step: BlockRange::LENGTH * 2 - 1, } .compute_block_number_to_be_signed(BlockRange::LENGTH * 5 + 1), @@ -281,7 +281,7 @@ mod tests { assert_eq!( CardanoTransactionsSigningConfig { - security_parameter: 0, + security_parameter: BlockNumber(0), step: BlockRange::LENGTH * 2 + 1, } .compute_block_number_to_be_signed(BlockRange::LENGTH * 5 + 1), @@ -291,7 +291,7 @@ mod tests { // Adjusted step is always at least BLOCK_RANGE_LENGTH. assert_eq!( CardanoTransactionsSigningConfig { - security_parameter: 0, + security_parameter: BlockNumber(0), step: BlockRange::LENGTH - 1, } .compute_block_number_to_be_signed(BlockRange::LENGTH * 10 - 1), @@ -300,7 +300,7 @@ mod tests { assert_eq!( CardanoTransactionsSigningConfig { - security_parameter: 0, + security_parameter: BlockNumber(0), step: BlockRange::LENGTH - 1, } .compute_block_number_to_be_signed(BlockRange::LENGTH - 1), @@ -402,7 +402,7 @@ mod tests { ..fake_data::beacon() }; let chain_point = ChainPoint { - block_number: 45, + block_number: BlockNumber(45), ..ChainPoint::dummy() }; let time_point = TimePoint::new( @@ -417,8 +417,8 @@ mod tests { ]), network, cardano_transactions_signing_config: CardanoTransactionsSigningConfig { - security_parameter: 0, - step: 15, + security_parameter: BlockNumber(0), + step: BlockNumber(15), }, }; diff --git a/mithril-common/src/entities/signed_entity_type.rs b/mithril-common/src/entities/signed_entity_type.rs index f84e2fa1b90..09b9b85e23f 100644 --- a/mithril-common/src/entities/signed_entity_type.rs +++ b/mithril-common/src/entities/signed_entity_type.rs @@ -263,14 +263,23 @@ mod tests { )) ); - let reference_hash = hash(SignedEntityType::CardanoTransactions(Epoch(35), 77)); + let reference_hash = hash(SignedEntityType::CardanoTransactions( + Epoch(35), + BlockNumber(77), + )); assert_ne!( reference_hash, - hash(SignedEntityType::CardanoTransactions(Epoch(3), 77)) + hash(SignedEntityType::CardanoTransactions( + Epoch(3), + BlockNumber(77) + )) ); assert_ne!( reference_hash, - hash(SignedEntityType::CardanoTransactions(Epoch(35), 98765)) + hash(SignedEntityType::CardanoTransactions( + Epoch(35), + BlockNumber(98765) + )) ); } @@ -281,9 +290,10 @@ mod tests { .unwrap(); assert_same_json!("25", &cardano_stake_distribution_json); - let cardano_transactions_json = SignedEntityType::CardanoTransactions(Epoch(35), 77) - .get_json_beacon() - .unwrap(); + let cardano_transactions_json = + SignedEntityType::CardanoTransactions(Epoch(35), BlockNumber(77)) + .get_json_beacon() + .unwrap(); assert_same_json!( r#"{"epoch":35,"block_number":77}"#, &cardano_transactions_json diff --git a/mithril-common/src/entities/time_point.rs b/mithril-common/src/entities/time_point.rs index 6716ad0ddd6..7b7f29585e8 100644 --- a/mithril-common/src/entities/time_point.rs +++ b/mithril-common/src/entities/time_point.rs @@ -68,6 +68,8 @@ impl Display for TimePoint { mod tests { use std::cmp::Ordering; + use crate::entities::BlockNumber; + use super::*; #[test] @@ -77,7 +79,7 @@ mod tests { immutable_file_number: 0, chain_point: ChainPoint { slot_number: 10, - block_number: 20, + block_number: BlockNumber(20), block_hash: "hash1".to_string(), }, }; @@ -86,7 +88,7 @@ mod tests { immutable_file_number: 1, chain_point: ChainPoint { slot_number: 15, - block_number: 25, + block_number: BlockNumber(25), block_hash: "hash2".to_string(), }, }; @@ -101,7 +103,7 @@ mod tests { immutable_file_number: 5, chain_point: ChainPoint { slot_number: 10, - block_number: 20, + block_number: BlockNumber(20), block_hash: "hash1".to_string(), }, }; @@ -110,7 +112,7 @@ mod tests { immutable_file_number: 0, chain_point: ChainPoint { slot_number: 15, - block_number: 25, + block_number: BlockNumber(25), block_hash: "hash2".to_string(), }, }; @@ -125,7 +127,7 @@ mod tests { immutable_file_number: 0, chain_point: ChainPoint { slot_number: 10, - block_number: 20, + block_number: BlockNumber(20), block_hash: "hash1".to_string(), }, }; @@ -134,7 +136,7 @@ mod tests { immutable_file_number: 0, chain_point: ChainPoint { slot_number: 15, - block_number: 25, + block_number: BlockNumber(25), block_hash: "hash2".to_string(), }, }; diff --git a/mithril-common/src/messages/cardano_transaction_snapshot.rs b/mithril-common/src/messages/cardano_transaction_snapshot.rs index 06c825ef3be..ee496f18f74 100644 --- a/mithril-common/src/messages/cardano_transaction_snapshot.rs +++ b/mithril-common/src/messages/cardano_transaction_snapshot.rs @@ -33,7 +33,7 @@ impl CardanoTransactionSnapshotMessage { Self { merkle_root: "mkroot-123".to_string(), epoch: Epoch(10), - block_number: 100, + block_number: BlockNumber(100), hash: "hash-123".to_string(), certificate_hash: "cert-hash-123".to_string(), created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") @@ -52,7 +52,7 @@ mod tests { CardanoTransactionSnapshotMessage { merkle_root: "mkroot-123".to_string(), epoch: Epoch(8), - block_number: 6, + block_number: BlockNumber(6), hash: "hash-123".to_string(), certificate_hash: "certificate-hash-123".to_string(), created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") diff --git a/mithril-common/src/messages/cardano_transaction_snapshot_list.rs b/mithril-common/src/messages/cardano_transaction_snapshot_list.rs index 23c40afb38c..827779f9682 100644 --- a/mithril-common/src/messages/cardano_transaction_snapshot_list.rs +++ b/mithril-common/src/messages/cardano_transaction_snapshot_list.rs @@ -35,7 +35,7 @@ impl CardanoTransactionSnapshotListItemMessage { Self { merkle_root: "mkroot-123".to_string(), epoch: Epoch(10), - block_number: 100, + block_number: BlockNumber(100), hash: "hash-123".to_string(), certificate_hash: "cert-hash-123".to_string(), created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") @@ -54,7 +54,7 @@ mod tests { vec![CardanoTransactionSnapshotListItemMessage { merkle_root: "mkroot-123".to_string(), epoch: Epoch(7), - block_number: 5, + block_number: BlockNumber(5), hash: "hash-123".to_string(), certificate_hash: "certificate-hash-123".to_string(), created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z") diff --git a/mithril-common/src/messages/cardano_transactions_proof.rs b/mithril-common/src/messages/cardano_transactions_proof.rs index 89c87a5096f..aba37c78e95 100644 --- a/mithril-common/src/messages/cardano_transactions_proof.rs +++ b/mithril-common/src/messages/cardano_transactions_proof.rs @@ -194,7 +194,7 @@ mod tests { proof: "invalid".to_string(), }], vec![], - 99999, + BlockNumber(99999), ); let error = txs_proofs @@ -212,7 +212,8 @@ mod tests { #[test] fn verify_no_certified_transaction_fail() { - let txs_proofs = CardanoTransactionsProofsMessage::new("whatever", vec![], vec![], 99999); + let txs_proofs = + CardanoTransactionsProofsMessage::new("whatever", vec![], vec![], BlockNumber(99999)); let error = txs_proofs .verify() @@ -234,13 +235,13 @@ mod tests { certificate_hash: "whatever".to_string(), merkle_root: set_proof.merkle_root(), certified_transactions: set_proof.transactions_hashes().to_vec(), - latest_block_number: 99999, + latest_block_number: BlockNumber(99999), }; let txs_proofs = CardanoTransactionsProofsMessage::new( "whatever", vec![set_proof.try_into().unwrap()], vec![], - 99999, + BlockNumber(99999), ); let verified_txs = txs_proofs @@ -260,7 +261,7 @@ mod tests { "whatever", vec![set_proof.try_into().unwrap()], vec![], - 99999, + BlockNumber(99999), ); let error = txs_proofs @@ -296,7 +297,7 @@ mod tests { .map(|p| p.try_into().unwrap()) .collect(), vec![], - 99999, + BlockNumber(99999), ); let error = txs_proofs @@ -330,20 +331,20 @@ mod tests { async fn verify_hashes_from_verified_cardano_transaction_and_from_signable_builder_are_equals( ) { let transactions = vec![ - CardanoTransaction::new("tx-hash-123", 10, 1, "block_hash"), - CardanoTransaction::new("tx-hash-456", 20, 2, "block_hash"), + CardanoTransaction::new("tx-hash-123", BlockNumber(10), 1, "block_hash"), + CardanoTransaction::new("tx-hash-456", BlockNumber(20), 2, "block_hash"), ]; assert_eq!( from_verified_cardano_transaction(&transactions, 99999).compute_hash(), - from_signable_builder(&transactions, 99999) + from_signable_builder(&transactions, BlockNumber(99999)) .await .compute_hash() ); assert_ne!( from_verified_cardano_transaction(&transactions, 99999).compute_hash(), - from_signable_builder(&transactions, 123456) + from_signable_builder(&transactions, BlockNumber(123456)) .await .compute_hash() ); @@ -366,7 +367,7 @@ mod tests { certificate_hash: "whatever".to_string(), merkle_root: set_proof.merkle_root(), certified_transactions: set_proof.transactions_hashes().to_vec(), - latest_block_number: block_number, + latest_block_number: BlockNumber(block_number), }; let mut message = ProtocolMessage::new(); diff --git a/mithril-common/src/signable_builder/cardano_transactions.rs b/mithril-common/src/signable_builder/cardano_transactions.rs index 00394243f16..e451d7fef8b 100644 --- a/mithril-common/src/signable_builder/cardano_transactions.rs +++ b/mithril-common/src/signable_builder/cardano_transactions.rs @@ -125,7 +125,7 @@ mod tests { #[tokio::test] async fn test_compute_signable() { // Arrange - let block_number = 1453; + let block_number = BlockNumber(1453); let transactions = CardanoTransactionsBuilder::new().build_transactions(3); let mk_map = compute_mk_map_from_transactions(transactions.clone()); let mut transaction_importer = MockTransactionsImporter::new(); @@ -165,7 +165,7 @@ mod tests { #[tokio::test] async fn test_compute_signable_with_no_block_range_root_return_error() { - let block_number = 50; + let block_number = BlockNumber(50); let mut transaction_importer = MockTransactionsImporter::new(); transaction_importer.expect_import().return_once(|_| Ok(())); let mut block_range_root_retriever = MockBlockRangeRootRetriever::new(); diff --git a/mithril-common/src/signable_builder/signable_builder_service.rs b/mithril-common/src/signable_builder/signable_builder_service.rs index 58d97b29af2..9d87ac10d24 100644 --- a/mithril-common/src/signable_builder/signable_builder_service.rs +++ b/mithril-common/src/signable_builder/signable_builder_service.rs @@ -185,7 +185,7 @@ mod tests { Arc::new(mock_cardano_transactions_signable_builder), ); - let signed_entity_type = SignedEntityType::CardanoTransactions(Epoch(5), 1000); + let signed_entity_type = SignedEntityType::CardanoTransactions(Epoch(5), BlockNumber(1000)); signable_builder_service .compute_protocol_message(signed_entity_type) .await diff --git a/mithril-common/src/test_utils/cardano_transactions_builder.rs b/mithril-common/src/test_utils/cardano_transactions_builder.rs index e96a2541ca9..2204c950f66 100644 --- a/mithril-common/src/test_utils/cardano_transactions_builder.rs +++ b/mithril-common/src/test_utils/cardano_transactions_builder.rs @@ -1,4 +1,4 @@ -use crate::entities::{BlockRange, CardanoTransaction}; +use crate::entities::{BlockNumber, BlockRange, CardanoTransaction}; /// Builder to easily build transactions with consistent values. /// @@ -7,7 +7,7 @@ use crate::entities::{BlockRange, CardanoTransaction}; /// # Example 'build_transactions' /// /// ``` -/// use mithril_common::entities::CardanoTransaction; +/// use mithril_common::entities::{BlockNumber, CardanoTransaction}; /// use mithril_common::test_utils::CardanoTransactionsBuilder; /// /// let txs = CardanoTransactionsBuilder::new() @@ -18,14 +18,14 @@ use crate::entities::{BlockRange, CardanoTransaction}; /// assert_eq!(8, txs.len()); /// assert_eq!( /// vec![ -/// CardanoTransaction::new("tx-hash-0-100", 0, 100, "block-hash-0"), -/// CardanoTransaction::new("tx-hash-0-101", 0, 101, "block-hash-0"), -/// CardanoTransaction::new("tx-hash-0-102", 0, 102, "block-hash-0"), -/// CardanoTransaction::new("tx-hash-1-103", 1, 103, "block-hash-1"), -/// CardanoTransaction::new("tx-hash-1-104", 1, 104, "block-hash-1"), -/// CardanoTransaction::new("tx-hash-1-105", 1, 105, "block-hash-1"), -/// CardanoTransaction::new("tx-hash-15-106", 15, 106, "block-hash-15"), -/// CardanoTransaction::new("tx-hash-15-107", 15, 107, "block-hash-15") +/// CardanoTransaction::new("tx-hash-0-100", BlockNumber(0), 100, "block-hash-0"), +/// CardanoTransaction::new("tx-hash-0-101", BlockNumber(0), 101, "block-hash-0"), +/// CardanoTransaction::new("tx-hash-0-102", BlockNumber(0), 102, "block-hash-0"), +/// CardanoTransaction::new("tx-hash-1-103", BlockNumber(1), 103, "block-hash-1"), +/// CardanoTransaction::new("tx-hash-1-104", BlockNumber(1), 104, "block-hash-1"), +/// CardanoTransaction::new("tx-hash-1-105", BlockNumber(1), 105, "block-hash-1"), +/// CardanoTransaction::new("tx-hash-15-106", BlockNumber(15), 106, "block-hash-15"), +/// CardanoTransaction::new("tx-hash-15-107", BlockNumber(15), 107, "block-hash-15") /// ], /// txs /// ); @@ -34,7 +34,7 @@ use crate::entities::{BlockRange, CardanoTransaction}; /// # Example 'build_block_ranges' /// /// ``` -/// use mithril_common::entities::CardanoTransaction; +/// use mithril_common::entities::{BlockNumber, CardanoTransaction}; /// use mithril_common::test_utils::CardanoTransactionsBuilder; /// /// let txs = CardanoTransactionsBuilder::new() @@ -45,18 +45,18 @@ use crate::entities::{BlockRange, CardanoTransaction}; /// assert_eq!(3 * 2 * 2, txs.len()); /// assert_eq!( /// vec![ -/// CardanoTransaction::new("tx-hash-0-100", 0, 100, "block-hash-0"), -/// CardanoTransaction::new("tx-hash-0-101", 0, 101, "block-hash-0"), -/// CardanoTransaction::new("tx-hash-0-102", 0, 102, "block-hash-0"), -/// CardanoTransaction::new("tx-hash-1-103", 1, 103, "block-hash-1"), -/// CardanoTransaction::new("tx-hash-1-104", 1, 104, "block-hash-1"), -/// CardanoTransaction::new("tx-hash-1-105", 1, 105, "block-hash-1"), -/// CardanoTransaction::new("tx-hash-15-106", 15, 106, "block-hash-15"), -/// CardanoTransaction::new("tx-hash-15-107", 15, 107, "block-hash-15"), -/// CardanoTransaction::new("tx-hash-15-108", 15, 108, "block-hash-15"), -/// CardanoTransaction::new("tx-hash-16-109", 16, 109, "block-hash-16"), -/// CardanoTransaction::new("tx-hash-16-110", 16, 110, "block-hash-16"), -/// CardanoTransaction::new("tx-hash-16-111", 16, 111, "block-hash-16"), +/// CardanoTransaction::new("tx-hash-0-100", BlockNumber(0), 100, "block-hash-0"), +/// CardanoTransaction::new("tx-hash-0-101", BlockNumber(0), 101, "block-hash-0"), +/// CardanoTransaction::new("tx-hash-0-102", BlockNumber(0), 102, "block-hash-0"), +/// CardanoTransaction::new("tx-hash-1-103", BlockNumber(1), 103, "block-hash-1"), +/// CardanoTransaction::new("tx-hash-1-104", BlockNumber(1), 104, "block-hash-1"), +/// CardanoTransaction::new("tx-hash-1-105", BlockNumber(1), 105, "block-hash-1"), +/// CardanoTransaction::new("tx-hash-15-106", BlockNumber(15), 106, "block-hash-15"), +/// CardanoTransaction::new("tx-hash-15-107", BlockNumber(15), 107, "block-hash-15"), +/// CardanoTransaction::new("tx-hash-15-108", BlockNumber(15), 108, "block-hash-15"), +/// CardanoTransaction::new("tx-hash-16-109", BlockNumber(16), 109, "block-hash-16"), +/// CardanoTransaction::new("tx-hash-16-110", BlockNumber(16), 110, "block-hash-16"), +/// CardanoTransaction::new("tx-hash-16-111", BlockNumber(16), 111, "block-hash-16"), /// ], /// txs /// ); @@ -90,7 +90,7 @@ impl CardanoTransactionsBuilder { /// Define how many blocks we generate in each block_range. /// If we set too many blocks for a block_range, this function panic. pub fn blocks_per_block_range(mut self, blocks_per_block_range: usize) -> Self { - if blocks_per_block_range > BlockRange::LENGTH as usize { + if blocks_per_block_range > *BlockRange::LENGTH as usize { panic!( "blocks_per_block_range should be less than {}", BlockRange::LENGTH @@ -123,7 +123,7 @@ impl CardanoTransactionsBuilder { self.build_transactions(nb_txs) } - fn block_number_from_transaction_index(&self, tx_index: usize) -> u64 { + fn block_number_from_transaction_index(&self, tx_index: usize) -> BlockNumber { let max_transactions_per_block_range = self.max_transactions_per_block * self.max_blocks_per_block_range; let index_block_range = tx_index / max_transactions_per_block_range; @@ -135,7 +135,11 @@ impl CardanoTransactionsBuilder { } /// Create a transaction with a given index and block number. - fn create_transaction(&self, transaction_id: u64, block_number: u64) -> CardanoTransaction { + fn create_transaction( + &self, + transaction_id: u64, + block_number: BlockNumber, + ) -> CardanoTransaction { CardanoTransaction::new( format!("tx-hash-{}-{}", block_number, transaction_id), block_number, @@ -335,6 +339,6 @@ mod test { #[test] #[should_panic] fn should_panic_when_too_many_blocks_per_block_range() { - CardanoTransactionsBuilder::new().blocks_per_block_range(BlockRange::LENGTH as usize + 1); + CardanoTransactionsBuilder::new().blocks_per_block_range(*BlockRange::LENGTH as usize + 1); } } diff --git a/mithril-common/src/test_utils/fake_data.rs b/mithril-common/src/test_utils/fake_data.rs index 8f1c2b7801f..57d68443ec7 100644 --- a/mithril-common/src/test_utils/fake_data.rs +++ b/mithril-common/src/test_utils/fake_data.rs @@ -3,16 +3,13 @@ use chrono::{DateTime, Utc}; use semver::Version; -use crate::crypto_helper::ProtocolMultiSignature; -use crate::{ - crypto_helper, - entities::{ - self, CertificateMetadata, CertificateSignature, CompressionAlgorithm, Epoch, LotteryIndex, - ProtocolMessage, ProtocolMessagePartKey, SignedEntityType, SingleSignatures, - StakeDistributionParty, - }, - test_utils::MithrilFixtureBuilder, +use crate::crypto_helper::{self, ProtocolMultiSignature}; +use crate::entities::{ + self, BlockNumber, CertificateMetadata, CertificateSignature, CompressionAlgorithm, Epoch, + LotteryIndex, ProtocolMessage, ProtocolMessagePartKey, SignedEntityType, SingleSignatures, + StakeDistributionParty, }; +use crate::test_utils::MithrilFixtureBuilder; use super::fake_keys; @@ -32,7 +29,7 @@ pub fn beacon() -> entities::CardanoDbBeacon { pub fn chain_point() -> entities::ChainPoint { entities::ChainPoint { slot_number: 500, - block_number: 42, + block_number: BlockNumber(42), block_hash: "1b69b3202fbe500".to_string(), } } @@ -242,7 +239,12 @@ pub fn mithril_stake_distributions(total: u64) -> Vec Vec { (1..total + 1) - .map(|idx| entities::CardanoTransactionsSnapshot::new(format!("merkleroot-{idx}"), idx)) + .map(|idx| { + entities::CardanoTransactionsSnapshot::new( + format!("merkleroot-{idx}"), + BlockNumber(idx), + ) + }) .collect() } diff --git a/mithril-common/src/ticker_service.rs b/mithril-common/src/ticker_service.rs index c751997e4cb..a0a552f6ecd 100644 --- a/mithril-common/src/ticker_service.rs +++ b/mithril-common/src/ticker_service.rs @@ -106,7 +106,7 @@ impl TickerService for MithrilTickerService { mod tests { use crate::chain_observer::{ChainAddress, ChainObserver, ChainObserverError, TxDatum}; use crate::digesters::DumbImmutableFileObserver; - use crate::entities::{ChainPoint, Epoch, StakeDistribution}; + use crate::entities::{BlockNumber, ChainPoint, Epoch, StakeDistribution}; use anyhow::anyhow; use super::*; @@ -129,7 +129,7 @@ mod tests { async fn get_current_chain_point(&self) -> Result, ChainObserverError> { Ok(Some(ChainPoint { slot_number: 800, - block_number: 51, + block_number: BlockNumber(51), block_hash: "1b69b3202fbe500".to_string(), })) } @@ -168,7 +168,7 @@ mod tests { 500, ChainPoint { slot_number: 800, - block_number: 51, + block_number: BlockNumber(51), block_hash: "1b69b3202fbe500".to_string(), }, ), diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index b47e9638135..7c4a8dd018c 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-signer" -version = "0.2.167" +version = "0.2.168" description = "A Mithril Signer" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-signer/src/cardano_transactions_importer.rs b/mithril-signer/src/cardano_transactions_importer.rs index a8492292edd..4ead0dc4069 100644 --- a/mithril-signer/src/cardano_transactions_importer.rs +++ b/mithril-signer/src/cardano_transactions_importer.rs @@ -93,7 +93,7 @@ impl CardanoTransactionsImporter { debug!( self.logger, "TransactionsImporter will retrieve Cardano transactions between block_number '{}' and '{until}'", - from.as_ref().map(|c|c.block_number).unwrap_or(0) + from.as_ref().map(|c|c.block_number).unwrap_or(BlockNumber(0)) ); let mut streamer = self.block_scanner.scan(from, until).await?; @@ -130,7 +130,7 @@ impl CardanoTransactionsImporter { }, ) { // No block range root stored yet, start from the beginning - None => BlockRange::all_block_ranges_in(0..=(until)), + None => BlockRange::all_block_ranges_in(BlockNumber(0)..=(until)), // Not enough block to form at least one block range Some(ranges) if ranges.is_empty() => return Ok(()), Some(ranges) => ranges, @@ -138,7 +138,7 @@ impl CardanoTransactionsImporter { debug!( self.logger, "TransactionsImporter - computing Block Range Roots"; - "start_block" => block_ranges.start(), "end_block" => block_ranges.end(), + "start_block" => *block_ranges.start(), "end_block" => *block_ranges.end(), ); let mut block_ranges_with_merkle_root: Vec<(BlockRange, MKTreeNode)> = vec![]; @@ -232,11 +232,11 @@ mod tests { start_block_number: BlockNumber, number_of_consecutive_block: BlockNumber, ) -> Vec { - (start_block_number..(start_block_number + number_of_consecutive_block)) + (*start_block_number..*(start_block_number + number_of_consecutive_block)) .map(|block_number| { ScannedBlock::new( format!("block_hash-{}", block_number), - block_number, + BlockNumber(block_number), block_number * 100, vec![format!("tx_hash-{}", block_number)], ) @@ -267,17 +267,27 @@ mod tests { ))); let blocks = vec![ - ScannedBlock::new("block_hash-1", 10, 15, vec!["tx_hash-1", "tx_hash-2"]), - ScannedBlock::new("block_hash-2", 20, 25, vec!["tx_hash-3", "tx_hash-4"]), + ScannedBlock::new( + "block_hash-1", + BlockNumber(10), + 15, + vec!["tx_hash-1", "tx_hash-2"], + ), + ScannedBlock::new( + "block_hash-2", + BlockNumber(20), + 25, + vec!["tx_hash-3", "tx_hash-4"], + ), ]; let expected_transactions = into_transactions(&blocks); - let up_to_block_number = 1000; + let up_to_block_number = BlockNumber(1000); let importer = { let mut scanner_mock = MockBlockScannerImpl::new(); scanner_mock .expect_scan() - .withf(move |from, until| from.is_none() && until == &up_to_block_number) + .withf(move |from, until| from.is_none() && until == up_to_block_number) .return_once(move |_, _| { Ok(Box::new(DumbBlockStreamer::new().forwards(vec![blocks]))) }); @@ -301,7 +311,7 @@ mod tests { ))); let up_to_block_number = BlockRange::LENGTH * 5; - let blocks = build_blocks(0, up_to_block_number + 1); + let blocks = build_blocks(BlockNumber(0), up_to_block_number + 1); let transactions = into_transactions(&blocks); repository.store_transactions(transactions).await.unwrap(); @@ -318,7 +328,7 @@ mod tests { let block_range_roots = repository.get_all_block_range_root().unwrap(); assert_eq!( vec![ - BlockRange::from_block_number(0), + BlockRange::from_block_number(BlockNumber(0)), BlockRange::from_block_number(BlockRange::LENGTH), BlockRange::from_block_number(BlockRange::LENGTH * 2), BlockRange::from_block_number(BlockRange::LENGTH * 3), @@ -341,7 +351,7 @@ mod tests { let up_to_block_number = BlockRange::LENGTH * 4; // Two block ranges with a gap let blocks: Vec = [ - build_blocks(0, BlockRange::LENGTH), + build_blocks(BlockNumber(0), BlockRange::LENGTH), build_blocks(BlockRange::LENGTH * 3, BlockRange::LENGTH), ] .concat(); @@ -361,7 +371,7 @@ mod tests { let block_range_roots = repository.get_all_block_range_root().unwrap(); assert_eq!( vec![ - BlockRange::from_block_number(0), + BlockRange::from_block_number(BlockNumber(0)), BlockRange::from_block_number(BlockRange::LENGTH * 3), ], block_range_roots @@ -384,7 +394,7 @@ mod tests { ); importer - .import_block_ranges(10_000) + .import_block_ranges(BlockNumber(10_000)) .await .expect("Transactions Importer should succeed"); @@ -397,17 +407,27 @@ mod tests { #[tokio::test] async fn if_all_transactions_stored_nothing_is_parsed_and_stored() { - let up_to_block_number = 12; + let up_to_block_number = BlockNumber(12); let connection = cardano_tx_db_connection().unwrap(); let repository = Arc::new(CardanoTransactionRepository::new(Arc::new( SqliteConnectionPool::build_from_connection(connection), ))); let scanner = DumbBlockScanner::new().forwards(vec![vec![ - ScannedBlock::new("block_hash-1", 10, 15, vec!["tx_hash-1", "tx_hash-2"]), - ScannedBlock::new("block_hash-2", 20, 25, vec!["tx_hash-3", "tx_hash-4"]), + ScannedBlock::new( + "block_hash-1", + BlockNumber(10), + 15, + vec!["tx_hash-1", "tx_hash-2"], + ), + ScannedBlock::new( + "block_hash-2", + BlockNumber(20), + 25, + vec!["tx_hash-3", "tx_hash-4"], + ), ]]); - let last_tx = CardanoTransaction::new("tx-20", 30, 35, "block_hash-3"); + let last_tx = CardanoTransaction::new("tx-20", BlockNumber(30), 35, "block_hash-3"); repository .store_transactions(vec![last_tx.clone()]) .await @@ -432,21 +452,25 @@ mod tests { SqliteConnectionPool::build_from_connection(connection), ))); - let highest_stored_chain_point = ChainPoint::new(134, 10, "block_hash-1"); + let highest_stored_chain_point = ChainPoint::new(134, BlockNumber(10), "block_hash-1"); let stored_block = ScannedBlock::new( highest_stored_chain_point.block_hash.clone(), highest_stored_chain_point.block_number, highest_stored_chain_point.slot_number, vec!["tx_hash-1", "tx_hash-2"], ); - let to_store_block = - ScannedBlock::new("block_hash-2", 20, 229, vec!["tx_hash-3", "tx_hash-4"]); + let to_store_block = ScannedBlock::new( + "block_hash-2", + BlockNumber(20), + 229, + vec!["tx_hash-3", "tx_hash-4"], + ); let expected_transactions: Vec = [ stored_block.clone().into_transactions(), to_store_block.clone().into_transactions(), ] .concat(); - let up_to_block_number = 22; + let up_to_block_number = BlockNumber(22); repository .store_transactions(stored_block.clone().into_transactions()) @@ -491,12 +515,12 @@ mod tests { ))); let up_to_block_number = BlockRange::LENGTH * 4; - let blocks = build_blocks(0, up_to_block_number + 1); + let blocks = build_blocks(BlockNumber(0), up_to_block_number + 1); let transactions = into_transactions(&blocks); repository.store_transactions(transactions).await.unwrap(); repository .store_block_range_roots( - blocks[0..((BlockRange::LENGTH * 2) as usize)] + blocks[0..(*(BlockRange::LENGTH * 2) as usize)] .iter() .map(|b| { ( @@ -517,7 +541,7 @@ mod tests { let block_range_roots = repository.get_all_block_range_root().unwrap(); assert_eq!( vec![ - BlockRange::from_block_number(0), + BlockRange::from_block_number(BlockNumber(0)), BlockRange::from_block_number(BlockRange::LENGTH), ], block_range_roots @@ -534,7 +558,7 @@ mod tests { let block_range_roots = repository.get_all_block_range_root().unwrap(); assert_eq!( vec![ - BlockRange::from_block_number(0), + BlockRange::from_block_number(BlockNumber(0)), BlockRange::from_block_number(BlockRange::LENGTH), BlockRange::from_block_number(BlockRange::LENGTH * 2), BlockRange::from_block_number(BlockRange::LENGTH * 3), @@ -586,7 +610,7 @@ mod tests { ))); // For the block range (15..=29) we only have transactions in the 10 first blocks (15..=24) - let blocks = build_blocks(BlockRange::LENGTH, 10); + let blocks = build_blocks(BlockRange::LENGTH, BlockNumber(10)); let transactions = into_transactions(&blocks); repository.store_transactions(transactions).await.unwrap(); @@ -613,13 +637,13 @@ mod tests { #[tokio::test] async fn block_range_root_retrieves_only_strictly_required_transactions() { fn transactions_for_block(range: Range) -> StdResult> { - Ok(build_blocks(range.start, range.count() as BlockNumber) + Ok(build_blocks(range.start, range.end - range.start) .into_iter() .flat_map(|b| b.into_transactions()) .collect()) } const HIGHEST_BLOCK_RANGE_START: BlockNumber = BlockRange::LENGTH; - const UP_TO_BLOCK_NUMBER: BlockNumber = BlockRange::LENGTH * 5; + let up_to_block_number = BlockRange::LENGTH * 5; let importer = { let mut store_mock = MockTransactionStore::new(); @@ -635,8 +659,8 @@ mod tests { .expect_get_transactions_in_range() // Lower bound should be the end block number of the last known block range // Upper bound should be the block number provided to `import_block_ranges` - .withf(|range| { - BlockRangesSequence::new(HIGHEST_BLOCK_RANGE_START..=UP_TO_BLOCK_NUMBER) + .withf(move |range| { + BlockRangesSequence::new(HIGHEST_BLOCK_RANGE_START..=up_to_block_number) .contains(range) }) .returning(transactions_for_block); @@ -651,7 +675,7 @@ mod tests { }; importer - .import_block_ranges(UP_TO_BLOCK_NUMBER) + .import_block_ranges(up_to_block_number) .await .expect("Transactions Importer should succeed"); } @@ -665,17 +689,17 @@ mod tests { // 2 block ranges worth of blocks with one more block that should be ignored for merkle root computation let up_to_block_number = BlockRange::LENGTH * 2; - let blocks = build_blocks(0, up_to_block_number + 1); + let blocks = build_blocks(BlockNumber(0), up_to_block_number + 1); let transactions = into_transactions(&blocks); let expected_block_range_roots = vec![ ( - BlockRange::from_block_number(0), - merkle_root_for_blocks(&blocks[0..(BlockRange::LENGTH as usize)]), + BlockRange::from_block_number(BlockNumber(0)), + merkle_root_for_blocks(&blocks[0..(*BlockRange::LENGTH as usize)]), ), ( BlockRange::from_block_number(BlockRange::LENGTH), merkle_root_for_blocks( - &blocks[(BlockRange::LENGTH as usize)..((BlockRange::LENGTH * 2) as usize)], + &blocks[(*BlockRange::LENGTH as usize)..((*BlockRange::LENGTH * 2) as usize)], ), ), ]; @@ -706,10 +730,20 @@ mod tests { async fn importing_twice_starting_with_nothing_in_a_real_db_should_yield_transactions_in_same_order( ) { let blocks = vec![ - ScannedBlock::new("block_hash-1", 10, 15, vec!["tx_hash-1", "tx_hash-2"]), - ScannedBlock::new("block_hash-2", 20, 25, vec!["tx_hash-3", "tx_hash-4"]), + ScannedBlock::new( + "block_hash-1", + BlockNumber(10), + 15, + vec!["tx_hash-1", "tx_hash-2"], + ), + ScannedBlock::new( + "block_hash-2", + BlockNumber(20), + 25, + vec!["tx_hash-3", "tx_hash-4"], + ), ]; - let up_to_block_number = 1000; + let up_to_block_number = BlockNumber(1000); let transactions = into_transactions(&blocks); let (importer, repository) = { @@ -746,9 +780,13 @@ mod tests { SqliteConnectionPool::build_from_connection(connection), ))); - let expected_remaining_transactions = - ScannedBlock::new("block_hash-130", 130, 5, vec!["tx_hash-6", "tx_hash-7"]) - .into_transactions(); + let expected_remaining_transactions = ScannedBlock::new( + "block_hash-130", + BlockNumber(130), + 5, + vec!["tx_hash-6", "tx_hash-7"], + ) + .into_transactions(); repository .store_transactions(expected_remaining_transactions.clone()) .await @@ -757,7 +795,7 @@ mod tests { .store_transactions( ScannedBlock::new( "block_hash-131", - 131, + BlockNumber(131), 10, vec!["tx_hash-8", "tx_hash-9", "tx_hash-10"], ) @@ -766,14 +804,14 @@ mod tests { .await .unwrap(); - let chain_point = ChainPoint::new(5, 130, "block_hash-130"); + let chain_point = ChainPoint::new(5, BlockNumber(130), "block_hash-130"); let scanner = DumbBlockScanner::new().backward(chain_point); let importer = CardanoTransactionsImporter::new_for_test(Arc::new(scanner), repository.clone()); importer - .import_transactions(3000) + .import_transactions(BlockNumber(3000)) .await .expect("Transactions Importer should succeed"); @@ -789,7 +827,7 @@ mod tests { ))); let expected_remaining_block_ranges = vec![ - BlockRange::from_block_number(0), + BlockRange::from_block_number(BlockNumber(0)), BlockRange::from_block_number(BlockRange::LENGTH), BlockRange::from_block_number(BlockRange::LENGTH * 2), ]; @@ -839,7 +877,7 @@ mod tests { CardanoTransactionsImporter::new_for_test(Arc::new(scanner), repository.clone()); importer - .import_transactions(3000) + .import_transactions(BlockNumber(3000)) .await .expect("Transactions Importer should succeed"); @@ -870,7 +908,7 @@ mod tests { }), ); - let importer_future = importer.import(100); + let importer_future = importer.import(BlockNumber(100)); let counter_task = task::spawn_local(async { while COUNTER.load(std::sync::atomic::Ordering::SeqCst) < MAX_COUNTER { tokio::time::sleep(Duration::from_millis(1)).await; diff --git a/mithril-signer/src/configuration.rs b/mithril-signer/src/configuration.rs index 1545579fa2c..8ceab92ae38 100644 --- a/mithril-signer/src/configuration.rs +++ b/mithril-signer/src/configuration.rs @@ -132,8 +132,8 @@ impl Configuration { db_directory: PathBuf::new(), network: "devnet".to_string(), network_magic: Some(42), - network_security_parameter: 2160, - preload_security_parameter: 30, + network_security_parameter: BlockNumber(2160), + preload_security_parameter: BlockNumber(30), party_id: Some(party_id), run_interval: 5000, data_stores_directory: PathBuf::new(), @@ -151,7 +151,7 @@ impl Configuration { metrics_server_port: 9090, allow_unparsable_block: false, enable_transaction_pruning: false, - transactions_import_block_chunk_size: 1000, + transactions_import_block_chunk_size: BlockNumber(1000), cardano_transactions_block_streamer_max_roll_forwards_per_poll: 1000, } } @@ -215,16 +215,16 @@ pub struct DefaultConfiguration { pub metrics_server_port: u16, /// Network security parameter - pub network_security_parameter: BlockNumber, + pub network_security_parameter: u64, /// Transaction pruning toggle pub enable_transaction_pruning: bool, /// Preload security parameter - pub preload_security_parameter: BlockNumber, + pub preload_security_parameter: u64, /// Chunk size for importing transactions - pub transactions_import_block_chunk_size: BlockNumber, + pub transactions_import_block_chunk_size: u64, /// The maximum number of roll forwards during a poll of the block streamer when importing transactions. pub cardano_transactions_block_streamer_max_roll_forwards_per_poll: u32, diff --git a/mithril-signer/src/runtime/runner.rs b/mithril-signer/src/runtime/runner.rs index a0184ca1bf4..3861005519b 100644 --- a/mithril-signer/src/runtime/runner.rs +++ b/mithril-signer/src/runtime/runner.rs @@ -577,7 +577,7 @@ mod tests { )); let metrics_service = Arc::new(MetricsService::new().unwrap()); let signed_entity_type_lock = Arc::new(SignedEntityTypeLock::default()); - let security_parameter = 0; + let security_parameter = BlockNumber(0); let cardano_transactions_preloader = Arc::new(CardanoTransactionsPreloader::new( signed_entity_type_lock.clone(), transactions_importer.clone(), diff --git a/mithril-signer/src/transactions_importer_by_chunk.rs b/mithril-signer/src/transactions_importer_by_chunk.rs index 287aed4c40c..a571c75e63a 100644 --- a/mithril-signer/src/transactions_importer_by_chunk.rs +++ b/mithril-signer/src/transactions_importer_by_chunk.rs @@ -47,7 +47,7 @@ impl TransactionsImporter for TransactionsImporterByChunk { .highest_transaction_block_number_getter .get() .await? - .unwrap_or(0); + .unwrap_or(BlockNumber(0)); while intermediate_up_to < up_to_beacon { let next_up_to = (intermediate_up_to + self.chunk_size).min(up_to_beacon); @@ -92,7 +92,9 @@ mod tests { }) } - fn create_transaction_importer_mock(expected_values: Vec) -> MockTransactionImporterImpl { + fn create_transaction_importer_mock( + expected_values: Vec, + ) -> MockTransactionImporterImpl { let mut seq = Sequence::new(); let mut wrapped_importer = MockTransactionImporterImpl::new(); for expected_value in expected_values { @@ -108,8 +110,8 @@ mod tests { #[tokio::test] async fn test_import_nothing_to_do_when_highest_block_number_lower_or_equal_up_to_beacon() { - let highest_block_number = 10; - let chunk_size = 5; + let highest_block_number = BlockNumber(10); + let chunk_size = BlockNumber(5); let highest_transaction_block_number_getter = create_highest_transaction_block_number_getter_mock(highest_block_number); @@ -133,7 +135,7 @@ mod tests { #[tokio::test] async fn test_import_even_when_highest_block_number_is_none() { let highest_block_number = None; - let chunk_size = 5; + let chunk_size = BlockNumber(5); let up_to_beacon = chunk_size - 1; let highest_transaction_block_number_getter = Arc::new({ @@ -156,8 +158,8 @@ mod tests { #[tokio::test] async fn test_import_only_once_when_block_delta_less_than_chunk_size() { - let highest_block_number = 10; - let chunk_size = 5; + let highest_block_number = BlockNumber(10); + let chunk_size = BlockNumber(5); let up_to_beacon = highest_block_number + chunk_size - 1; let highest_transaction_block_number_getter = @@ -176,8 +178,8 @@ mod tests { #[tokio::test] async fn test_import_multiple_times_when_block_delta_is_not_a_multiple_of_chunk_size() { - let highest_block_number = 10; - let chunk_size = 5; + let highest_block_number = BlockNumber(10); + let chunk_size = BlockNumber(5); let up_to_beacon = highest_block_number + chunk_size * 2 + 1; let highest_transaction_block_number_getter = @@ -200,8 +202,8 @@ mod tests { #[tokio::test] async fn test_import_multiple_times_when_block_delta_is_a_multiple_of_chunk_size() { - let highest_block_number = 10; - let chunk_size = 5; + let highest_block_number = BlockNumber(10); + let chunk_size = BlockNumber(5); let up_to_beacon = highest_block_number + chunk_size * 2; let highest_transaction_block_number_getter = diff --git a/mithril-signer/src/transactions_importer_with_pruner.rs b/mithril-signer/src/transactions_importer_with_pruner.rs index c7aeaf08593..9fbad429ae6 100644 --- a/mithril-signer/src/transactions_importer_with_pruner.rs +++ b/mithril-signer/src/transactions_importer_with_pruner.rs @@ -52,7 +52,7 @@ impl TransactionsImporter for TransactionsImporterWithPruner { debug!( self.logger, "Transaction Import finished - Pruning transactions included in block range roots"; - "number_of_blocks_to_keep" => number_of_blocks_to_keep, + "number_of_blocks_to_keep" => *number_of_blocks_to_keep, ); self.transaction_pruner .prune(number_of_blocks_to_keep) @@ -117,12 +117,15 @@ mod tests { }, ); - importer.import(100).await.expect("Import should not fail"); + importer + .import(BlockNumber(100)) + .await + .expect("Import should not fail"); } #[tokio::test] async fn test_does_prune_if_a_block_number_is_configured() { - let expected_block_number: BlockNumber = 5; + let expected_block_number = BlockNumber(5); let importer = TransactionsImporterWithPruner::new_with_mock( Some(expected_block_number), |mock| { @@ -136,6 +139,9 @@ mod tests { }, ); - importer.import(100).await.expect("Import should not fail"); + importer + .import(BlockNumber(100)) + .await + .expect("Import should not fail"); } } diff --git a/mithril-signer/src/transactions_importer_with_vacuum.rs b/mithril-signer/src/transactions_importer_with_vacuum.rs index 480530d9e24..fa5bff5a239 100644 --- a/mithril-signer/src/transactions_importer_with_vacuum.rs +++ b/mithril-signer/src/transactions_importer_with_vacuum.rs @@ -122,7 +122,10 @@ mod tests { let initial_size = db_path.metadata().unwrap().len(); - importer.import(100).await.expect("Import should not fail"); + importer + .import(BlockNumber(100)) + .await + .expect("Import should not fail"); let after_import_size = db_path.metadata().unwrap().len(); diff --git a/mithril-signer/tests/create_cardano_transaction_single_signature.rs b/mithril-signer/tests/create_cardano_transaction_single_signature.rs index 42b19245755..dfcb173328a 100644 --- a/mithril-signer/tests/create_cardano_transaction_single_signature.rs +++ b/mithril-signer/tests/create_cardano_transaction_single_signature.rs @@ -2,7 +2,7 @@ mod test_extensions; use mithril_common::{ crypto_helper::tests_setup, - entities::{ChainPoint, Epoch, SignedEntityTypeDiscriminants, TimePoint}, + entities::{BlockNumber, ChainPoint, Epoch, SignedEntityTypeDiscriminants, TimePoint}, test_utils::MithrilFixtureBuilder, }; @@ -24,7 +24,7 @@ async fn test_create_cardano_transaction_single_signature() { slot_number: 100, // Note: the starting block number must be greater than the cardano_transactions_signing_config.step // so first block range root computation is not on block 0. - block_number: 100, + block_number: BlockNumber(100), block_hash: "block_hash-100".to_string(), }, }; diff --git a/mithril-signer/tests/create_immutable_files_full_single_signature.rs b/mithril-signer/tests/create_immutable_files_full_single_signature.rs index c7666a3450b..fab46d5609e 100644 --- a/mithril-signer/tests/create_immutable_files_full_single_signature.rs +++ b/mithril-signer/tests/create_immutable_files_full_single_signature.rs @@ -2,7 +2,7 @@ mod test_extensions; use mithril_common::{ crypto_helper::tests_setup, - entities::{ChainPoint, Epoch, TimePoint}, + entities::{BlockNumber, ChainPoint, Epoch, TimePoint}, test_utils::MithrilFixtureBuilder, }; @@ -20,7 +20,7 @@ async fn test_create_immutable_files_full_single_signature() { immutable_file_number: 1, chain_point: ChainPoint { slot_number: 1, - block_number: 100, + block_number: BlockNumber(100), block_hash: "block_hash-100".to_string(), }, }; diff --git a/mithril-signer/tests/era_switch.rs b/mithril-signer/tests/era_switch.rs index d351112e376..17d798d05b8 100644 --- a/mithril-signer/tests/era_switch.rs +++ b/mithril-signer/tests/era_switch.rs @@ -2,11 +2,10 @@ mod test_extensions; use mithril_common::{ crypto_helper::tests_setup, - entities::{ChainPoint, Epoch, TimePoint}, + entities::{BlockNumber, ChainPoint, Epoch, TimePoint}, era::{EraMarker, SupportedEra}, test_utils::MithrilFixtureBuilder, }; - use test_extensions::StateMachineTester; #[rustfmt::skip] @@ -20,7 +19,7 @@ async fn era_fail_at_startup() { immutable_file_number: 1, chain_point: ChainPoint { slot_number: 1, - block_number: 100, + block_number: BlockNumber(100), block_hash: "block_hash-100".to_string(), }, }; diff --git a/mithril-signer/tests/test_extensions/state_machine_tester.rs b/mithril-signer/tests/test_extensions/state_machine_tester.rs index bd809355cb1..cb9aeeb8463 100644 --- a/mithril-signer/tests/test_extensions/state_machine_tester.rs +++ b/mithril-signer/tests/test_extensions/state_machine_tester.rs @@ -15,7 +15,7 @@ use mithril_common::{ chain_observer::{ChainObserver, FakeObserver}, digesters::{DumbImmutableDigester, DumbImmutableFileObserver, ImmutableFileObserver}, entities::{ - CardanoTransactionsSigningConfig, ChainPoint, Epoch, SignedEntityConfig, + BlockNumber, CardanoTransactionsSigningConfig, ChainPoint, Epoch, SignedEntityConfig, SignedEntityTypeDiscriminants, SignerWithStake, SlotNumber, TimePoint, }, era::{adapters::EraReaderDummyAdapter, EraChecker, EraMarker, EraReader, SupportedEra}, @@ -129,8 +129,8 @@ impl StateMachineTester { immutable_observer.clone(), )); let cardano_transactions_signing_config = CardanoTransactionsSigningConfig { - security_parameter: 0, - step: 30, + security_parameter: BlockNumber(0), + step: BlockNumber(30), }; let certificate_handler = Arc::new(FakeAggregator::new( SignedEntityConfig { @@ -203,7 +203,7 @@ impl StateMachineTester { let metrics_service = Arc::new(MetricsService::new().unwrap()); let expected_metrics_service = Arc::new(MetricsService::new().unwrap()); let signed_entity_type_lock = Arc::new(SignedEntityTypeLock::default()); - let security_parameter = 0; + let security_parameter = BlockNumber(0); let cardano_transactions_preloader = Arc::new(CardanoTransactionsPreloader::new( signed_entity_type_lock.clone(), transactions_importer.clone(), @@ -451,7 +451,7 @@ impl StateMachineTester { let slot_number = block_number; ScannedBlock::new( block_hash, - block_number, + BlockNumber(block_number), slot_number, vec![format!("tx_hash-{block_number}-1")], ) @@ -488,7 +488,7 @@ impl StateMachineTester { let chain_point = ChainPoint { slot_number: rollback_to_slot_number, - block_number: rollback_to_slot_number, + block_number: BlockNumber(rollback_to_slot_number), block_hash: format!("block_hash-{rollback_to_slot_number}"), }; self.block_scanner.add_backward(chain_point);