Skip to content

Commit 686e219

Browse files
committed
Simplify CardanoTransaction signed entity type to Epoch,BlockNumber
Instead of `Epoch,ChainPoint`. This is because we use this value as the upper bound of the blocks to import and can't known easily the associated block hash and slot number needed to constitute a ChainPoint (and we only need them for the lower bound to allow Pallas to known the starting point).
1 parent 6eade6c commit 686e219

File tree

8 files changed

+53
-98
lines changed

8 files changed

+53
-98
lines changed

internal/mithril-persistence/src/database/hydrator.rs

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
use serde::Deserialize;
44

55
use mithril_common::entities::{
6-
BlockNumber, CardanoDbBeacon, ChainPoint, Epoch, SignedEntityType,
7-
SignedEntityTypeDiscriminants, SlotNumber,
6+
BlockNumber, CardanoDbBeacon, Epoch, SignedEntityType, SignedEntityTypeDiscriminants,
87
};
98

109
use crate::sqlite::HydrationError;
@@ -75,9 +74,7 @@ impl Hydrator {
7574
#[derive(Deserialize)]
7675
struct CardanoTransactionsBeacon {
7776
epoch: Epoch,
78-
slot_number: SlotNumber,
7977
block_number: BlockNumber,
80-
block_hash: String,
8178
}
8279

8380
let beacon: CardanoTransactionsBeacon =
@@ -86,10 +83,7 @@ impl Hydrator {
8683
"Invalid Beacon JSON in open_message.beacon: '{beacon_str}'. Error: {e}"
8784
))
8885
})?;
89-
SignedEntityType::CardanoTransactions(
90-
beacon.epoch,
91-
ChainPoint::new(beacon.slot_number, beacon.block_number, beacon.block_hash),
92-
)
86+
SignedEntityType::CardanoTransactions(beacon.epoch, beacon.block_number)
9387
}
9488
};
9589

@@ -99,16 +93,11 @@ impl Hydrator {
9993

10094
#[cfg(test)]
10195
mod tests {
102-
use mithril_common::entities::ChainPoint;
103-
10496
use super::*;
10597

10698
#[test]
10799
fn hydrate_cardano_transaction_signed_entity_type() {
108-
let expected = SignedEntityType::CardanoTransactions(
109-
Epoch(35),
110-
ChainPoint::new(66, 77, "block-hash-77"),
111-
);
100+
let expected = SignedEntityType::CardanoTransactions(Epoch(35), 77);
112101
let signed_entity = Hydrator::hydrate_signed_entity_type(
113102
SignedEntityTypeDiscriminants::CardanoTransactions.index(),
114103
&expected.get_json_beacon().unwrap(),

internal/mithril-persistence/src/database/repository/cardano_transaction_repository.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ use async_trait::async_trait;
77
use mithril_common::cardano_block_scanner::ImmutableLowerBoundFinder;
88
use mithril_common::crypto_helper::MKTreeNode;
99
use mithril_common::entities::{
10-
BlockHash, BlockNumber, BlockRange, CardanoTransaction, ChainPoint, ImmutableFileNumber,
11-
SlotNumber, TransactionHash,
10+
BlockHash, BlockNumber, BlockRange, CardanoTransaction, ImmutableFileNumber, SlotNumber,
11+
TransactionHash,
1212
};
1313
use mithril_common::signable_builder::BlockRangeRootRetriever;
1414
use mithril_common::StdResult;
@@ -262,10 +262,10 @@ impl CardanoTransactionRepository {
262262
impl BlockRangeRootRetriever for CardanoTransactionRepository {
263263
async fn retrieve_block_range_roots(
264264
&self,
265-
up_to_beacon: &ChainPoint,
265+
up_to_beacon: BlockNumber,
266266
) -> StdResult<Box<dyn Iterator<Item = (BlockRange, MKTreeNode)>>> {
267267
let iterator = self
268-
.retrieve_block_range_roots_up_to(up_to_beacon.block_number)
268+
.retrieve_block_range_roots_up_to(up_to_beacon)
269269
.await?
270270
.collect::<Vec<_>>() // TODO: remove this collect to return the iterator directly
271271
.into_iter();

mithril-common/src/entities/cardano_chain_point.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ pub type SlotNumber = u64;
1616
/// BlockNumber is the block number of a Cardano transaction.
1717
pub type BlockNumber = u64;
1818

19+
impl Beacon for BlockNumber {}
20+
1921
/// Hash of a Cardano Block
2022
pub type BlockHash = String;
2123

@@ -69,8 +71,6 @@ impl ChainPoint {
6971
}
7072
}
7173

72-
impl Beacon for ChainPoint {}
73-
7474
impl Display for ChainPoint {
7575
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
7676
write!(

mithril-common/src/entities/signed_entity.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,12 @@ impl SignedEntity<CardanoTransactionsSnapshot> {
6868
cfg_test_tools! {
6969
/// Create a dummy [SignedEntity] for [CardanoTransactionsSnapshot] entity
7070
pub fn dummy() -> Self {
71+
// vvvvv todo: use block_number for snapshot
7172
let chain_point = ChainPoint::dummy();
7273

7374
SignedEntity {
7475
signed_entity_id: "snapshot-id-123".to_string(),
75-
signed_entity_type: SignedEntityType::CardanoTransactions(Epoch(5), chain_point.clone()),
76+
signed_entity_type: SignedEntityType::CardanoTransactions(Epoch(5), chain_point.block_number),
7677
certificate_id: "certificate-hash-123".to_string(),
7778
artifact: CardanoTransactionsSnapshot::new("mkroot123".to_string(), chain_point),
7879
created_at: DateTime::parse_from_rfc3339("2023-01-19T13:43:05.618857482Z")

mithril-common/src/entities/signed_entity_type.rs

Lines changed: 14 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use sha2::Sha256;
66
use std::time::Duration;
77
use strum::{AsRefStr, Display, EnumDiscriminants, EnumString};
88

9-
use super::{CardanoDbBeacon, ChainPoint, Epoch, TimePoint};
9+
use super::{BlockNumber, CardanoDbBeacon, Epoch, TimePoint};
1010

1111
/// Database representation of the SignedEntityType::MithrilStakeDistribution value
1212
const ENTITY_TYPE_MITHRIL_STAKE_DISTRIBUTION: usize = 0;
@@ -41,7 +41,7 @@ pub enum SignedEntityType {
4141
CardanoImmutableFilesFull(CardanoDbBeacon),
4242

4343
/// Cardano Transactions
44-
CardanoTransactions(Epoch, ChainPoint),
44+
CardanoTransactions(Epoch, BlockNumber),
4545
}
4646

4747
impl SignedEntityType {
@@ -82,12 +82,10 @@ impl SignedEntityType {
8282
Self::CardanoStakeDistribution(value) | Self::MithrilStakeDistribution(value) => {
8383
serde_json::to_string(value)?
8484
}
85-
Self::CardanoTransactions(epoch, chain_point) => {
85+
Self::CardanoTransactions(epoch, block_number) => {
8686
let json = serde_json::json!({
8787
"epoch": epoch,
88-
"slot_number": chain_point.slot_number,
89-
"block_number": chain_point.block_number,
90-
"block_hash": chain_point.block_hash
88+
"block_number": block_number,
9189
});
9290
serde_json::to_string(&json)?
9391
}
@@ -126,7 +124,7 @@ impl SignedEntityType {
126124
))
127125
}
128126
SignedEntityTypeDiscriminants::CardanoTransactions => {
129-
Self::CardanoTransactions(time_point.epoch, time_point.chain_point.clone())
127+
Self::CardanoTransactions(time_point.epoch, time_point.chain_point.block_number)
130128
}
131129
}
132130
}
@@ -142,9 +140,9 @@ impl SignedEntityType {
142140
hasher.update(&db_beacon.epoch.to_be_bytes());
143141
hasher.update(&db_beacon.immutable_file_number.to_be_bytes());
144142
}
145-
SignedEntityType::CardanoTransactions(epoch, chain_point) => {
143+
SignedEntityType::CardanoTransactions(epoch, block_number) => {
146144
hasher.update(&epoch.to_be_bytes());
147-
chain_point.feed_hash(hasher);
145+
hasher.update(&block_number.to_be_bytes())
148146
}
149147
}
150148
}
@@ -223,37 +221,14 @@ mod tests {
223221
))
224222
);
225223

226-
let reference_hash = hash(SignedEntityType::CardanoTransactions(
227-
Epoch(35),
228-
ChainPoint::new(66, 77, "block-hash-77"),
229-
));
224+
let reference_hash = hash(SignedEntityType::CardanoTransactions(Epoch(35), 77));
230225
assert_ne!(
231226
reference_hash,
232-
hash(SignedEntityType::CardanoTransactions(
233-
Epoch(3),
234-
ChainPoint::new(66, 77, "block-hash-77"),
235-
))
227+
hash(SignedEntityType::CardanoTransactions(Epoch(3), 77))
236228
);
237229
assert_ne!(
238230
reference_hash,
239-
hash(SignedEntityType::CardanoTransactions(
240-
Epoch(35),
241-
ChainPoint::new(12345, 77, "block-hash-77"),
242-
))
243-
);
244-
assert_ne!(
245-
reference_hash,
246-
hash(SignedEntityType::CardanoTransactions(
247-
Epoch(35),
248-
ChainPoint::new(66, 98765, "block-hash-77"),
249-
))
250-
);
251-
assert_ne!(
252-
reference_hash,
253-
hash(SignedEntityType::CardanoTransactions(
254-
Epoch(35),
255-
ChainPoint::new(66, 77, "other-block-hash"),
256-
))
231+
hash(SignedEntityType::CardanoTransactions(Epoch(35), 98765))
257232
);
258233
}
259234

@@ -264,14 +239,11 @@ mod tests {
264239
.unwrap();
265240
assert_same_json!("25", &cardano_stake_distribution_json);
266241

267-
let cardano_transactions_json = SignedEntityType::CardanoTransactions(
268-
Epoch(35),
269-
ChainPoint::new(66, 77, "block-hash-77"),
270-
)
271-
.get_json_beacon()
272-
.unwrap();
242+
let cardano_transactions_json = SignedEntityType::CardanoTransactions(Epoch(35), 77)
243+
.get_json_beacon()
244+
.unwrap();
273245
assert_same_json!(
274-
r#"{"epoch":35,"slot_number":66,"block_number":77,"block_hash":"block-hash-77"}"#,
246+
r#"{"epoch":35,"block_number":77}"#,
275247
&cardano_transactions_json
276248
);
277249

mithril-common/src/messages/cardano_transactions_proof.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ mod tests {
316316
#[cfg(feature = "fs")]
317317
mod fs_only {
318318
use crate::crypto_helper::{MKMap, MKMapNode};
319-
use crate::entities::{BlockNumber, BlockRange, CardanoTransaction, ChainPoint};
319+
use crate::entities::{BlockNumber, BlockRange, CardanoTransaction};
320320
use crate::signable_builder::{
321321
CardanoTransactionsSignableBuilder, MockBlockRangeRootRetriever,
322322
MockTransactionsImporter, SignableBuilder,
@@ -404,10 +404,7 @@ mod tests {
404404
Logger::root(slog::Discard, slog::o!()),
405405
);
406406
cardano_transaction_signable_builder
407-
.compute_protocol_message(ChainPoint {
408-
block_number,
409-
..ChainPoint::dummy()
410-
})
407+
.compute_protocol_message(block_number)
411408
.await
412409
.unwrap()
413410
}

mithril-common/src/signable_builder/cardano_transactions.rs

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use slog::{debug, Logger};
66

77
use crate::{
88
crypto_helper::{MKMap, MKMapNode, MKTreeNode},
9-
entities::{BlockRange, ChainPoint, ProtocolMessage, ProtocolMessagePartKey},
9+
entities::{BlockNumber, BlockRange, ProtocolMessage, ProtocolMessagePartKey},
1010
signable_builder::SignableBuilder,
1111
StdResult,
1212
};
@@ -19,7 +19,7 @@ use mockall::automock;
1919
#[async_trait]
2020
pub trait TransactionsImporter: Send + Sync {
2121
/// Returns all transactions up to the given beacon
22-
async fn import(&self, up_to_beacon: &ChainPoint) -> StdResult<()>;
22+
async fn import(&self, up_to_beacon: BlockNumber) -> StdResult<()>;
2323
}
2424

2525
/// Block Range Merkle roots retriever
@@ -29,13 +29,13 @@ pub trait BlockRangeRootRetriever: Send + Sync {
2929
/// Returns a Merkle map of the block ranges roots up to a given beacon
3030
async fn retrieve_block_range_roots(
3131
&self,
32-
up_to_beacon: &ChainPoint,
32+
up_to_beacon: BlockNumber,
3333
) -> StdResult<Box<dyn Iterator<Item = (BlockRange, MKTreeNode)>>>;
3434

3535
/// Returns a Merkle map of the block ranges roots up to a given beacon
3636
async fn compute_merkle_map_from_block_range_roots(
3737
&self,
38-
up_to_beacon: &ChainPoint,
38+
up_to_beacon: BlockNumber,
3939
) -> StdResult<MKMap<BlockRange, MKMapNode<BlockRange>>> {
4040
let block_range_roots_iterator = self
4141
.retrieve_block_range_roots(up_to_beacon)
@@ -71,18 +71,18 @@ impl CardanoTransactionsSignableBuilder {
7171
}
7272

7373
#[async_trait]
74-
impl SignableBuilder<ChainPoint> for CardanoTransactionsSignableBuilder {
75-
async fn compute_protocol_message(&self, beacon: ChainPoint) -> StdResult<ProtocolMessage> {
74+
impl SignableBuilder<BlockNumber> for CardanoTransactionsSignableBuilder {
75+
async fn compute_protocol_message(&self, beacon: BlockNumber) -> StdResult<ProtocolMessage> {
7676
debug!(
7777
self.logger,
78-
"Compute protocol message for CardanoTransactions at beacon: {beacon}"
78+
"Compute protocol message for CardanoTransactions at block_number: {beacon}"
7979
);
8080

81-
self.transaction_importer.import(&beacon).await?;
81+
self.transaction_importer.import(beacon).await?;
8282

8383
let mk_root = self
8484
.block_range_root_retriever
85-
.compute_merkle_map_from_block_range_roots(&beacon)
85+
.compute_merkle_map_from_block_range_roots(beacon)
8686
.await?
8787
.compute_root()?;
8888

@@ -93,7 +93,7 @@ impl SignableBuilder<ChainPoint> for CardanoTransactionsSignableBuilder {
9393
);
9494
protocol_message.set_message_part(
9595
ProtocolMessagePartKey::LatestBlockNumber,
96-
beacon.block_number.to_string(),
96+
beacon.to_string(),
9797
);
9898

9999
Ok(protocol_message)
@@ -125,10 +125,7 @@ mod tests {
125125
#[tokio::test]
126126
async fn test_compute_signable() {
127127
// Arrange
128-
let beacon = ChainPoint {
129-
block_number: 1453,
130-
..ChainPoint::dummy()
131-
};
128+
let block_number = 1453;
132129
let transactions = CardanoTransactionsBuilder::new().build_transactions(3);
133130
let mk_map = compute_mk_map_from_transactions(transactions.clone());
134131
let mut transaction_importer = MockTransactionsImporter::new();
@@ -149,7 +146,7 @@ mod tests {
149146

150147
// Action
151148
let signable = cardano_transactions_signable_builder
152-
.compute_protocol_message(beacon.clone())
149+
.compute_protocol_message(block_number)
153150
.await
154151
.unwrap();
155152

@@ -161,14 +158,14 @@ mod tests {
161158
);
162159
signable_expected.set_message_part(
163160
ProtocolMessagePartKey::LatestBlockNumber,
164-
format!("{}", beacon.block_number),
161+
format!("{}", block_number),
165162
);
166163
assert_eq!(signable_expected, signable);
167164
}
168165

169166
#[tokio::test]
170167
async fn test_compute_signable_with_no_block_range_root_return_error() {
171-
let beacon = ChainPoint::dummy();
168+
let block_number = 50;
172169
let mut transaction_importer = MockTransactionsImporter::new();
173170
transaction_importer.expect_import().return_once(|_| Ok(()));
174171
let mut block_range_root_retriever = MockBlockRangeRootRetriever::new();
@@ -182,7 +179,7 @@ mod tests {
182179
);
183180

184181
let result = cardano_transactions_signable_builder
185-
.compute_protocol_message(beacon.clone())
182+
.compute_protocol_message(block_number)
186183
.await;
187184

188185
assert!(result.is_err());

0 commit comments

Comments
 (0)