Skip to content

Commit 8cc9e95

Browse files
committed
Make test on merkle root computation more explicit
1 parent 33060ae commit 8cc9e95

File tree

3 files changed

+55
-51
lines changed

3 files changed

+55
-51
lines changed

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

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -160,17 +160,6 @@ impl<'client> InsertCardanoTransactionProvider<'client> {
160160
}
161161

162162
fn get_insert_condition(&self, record: &CardanoTransactionRecord) -> StdResult<WhereCondition> {
163-
// let expression =
164-
// "(transaction_hash, block_number, slot_number, block_hash, immutable_file_number) values (?1, ?2, ?3, ?4, ?5)";
165-
// let parameters = vec![
166-
// Value::String(record.transaction_hash.clone()),
167-
// Value::Integer(record.block_number.try_into()?),
168-
// Value::Integer(record.slot_number.try_into()?),
169-
// Value::String(record.block_hash.clone()),
170-
// Value::Integer(record.immutable_file_number.try_into()?),
171-
// ];
172-
173-
// Ok(WhereCondition::new(expression, parameters))
174163
self.get_insert_many_condition(vec![record.clone()])
175164
}
176165

@@ -200,12 +189,6 @@ impl<'client> InsertCardanoTransactionProvider<'client> {
200189

201190
let values: Vec<Value> = values?.into_iter().flatten().collect();
202191

203-
// let values = transactions_records
204-
// .into_iter()
205-
// .flat_map(map_record) // Vec<StdResult<Vec<Value>>>
206-
// .flatten()
207-
// .collect::<Vec<Value>>();
208-
209192
Ok(WhereCondition::new(
210193
format!("{columns} values {}", values_columns.join(", ")).as_str(),
211194
values,
@@ -224,7 +207,7 @@ impl<'client> Provider<'client> for InsertCardanoTransactionProvider<'client> {
224207
let aliases = SourceAlias::new(&[("{:cardano_tx:}", "cardano_tx")]);
225208
let projection = Self::Entity::get_projection().expand(aliases);
226209

227-
format!("insert or ignore into cardano_tx {condition} returning {projection}")
210+
format!("insert or ignore into cardano_tx {condition} returning {projection}")
228211
}
229212
}
230213

mithril-common/src/signable_builder/cardano_transactions.rs

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -158,29 +158,39 @@ mod tests {
158158
}
159159

160160
#[tokio::test]
161-
async fn test_compute_merkle_root() {
162-
let transaction_1 = CardanoTransaction::new("tx-hash-123", 10, 1, "block_hash", 1);
163-
let transaction_2 = CardanoTransaction::new("tx-hash-456", 20, 2, "block_hash", 1);
164-
let transaction_3 = CardanoTransaction::new("tx-hash-789", 30, 3, "block_hash", 1);
165-
let transaction_4 = CardanoTransaction::new("tx-hash-abc", 40, 4, "block_hash", 1);
166-
167-
let transactions_set_reference = vec![
168-
transaction_1.clone(),
169-
transaction_2.clone(),
170-
transaction_3.clone(),
171-
];
161+
async fn test_compute_merkle_root_in_same_block_range() {
162+
let transaction_1 = CardanoTransaction::new("tx-hash-123", 1, 10, "block_hash", 1);
163+
let transaction_2 = CardanoTransaction::new("tx-hash-456", 2, 20, "block_hash", 1);
164+
let transaction_3 = CardanoTransaction::new("tx-hash-789", 3, 30, "block_hash", 1);
165+
let transaction_4 = CardanoTransaction::new("tx-hash-abc", 4, 40, "block_hash", 1);
166+
167+
for tx in [
168+
&transaction_1,
169+
&transaction_2,
170+
&transaction_3,
171+
&transaction_4,
172+
] {
173+
assert!(
174+
tx.block_number < BlockRange::LENGTH,
175+
"all manipulated transactions should be in the same block range"
176+
);
177+
}
178+
172179
let cardano_transaction_signable_builder = CardanoTransactionsSignableBuilder::new(
173-
Arc::new(DumbTransactionParser::new(
174-
transactions_set_reference.clone(),
175-
)),
180+
Arc::new(DumbTransactionParser::new(vec![])),
176181
Arc::new(MockTransactionStore::new()),
177182
Path::new("/tmp"),
178183
create_logger(),
179184
);
180185

181186
let merkle_root_reference = cardano_transaction_signable_builder
182-
.compute_merkle_root(&transactions_set_reference)
187+
.compute_merkle_root(&[
188+
transaction_1.clone(),
189+
transaction_2.clone(),
190+
transaction_3.clone(),
191+
])
183192
.unwrap();
193+
184194
{
185195
let transactions_set = vec![transaction_1.clone()];
186196
let mk_root = cardano_transaction_signable_builder
@@ -209,7 +219,7 @@ mod tests {
209219
}
210220

211221
{
212-
// Transactions in a different order returns a different merkle root.
222+
// In a same block range Transactions in a different order returns a different merkle root.
213223
let transactions_set = vec![
214224
transaction_1.clone(),
215225
transaction_3.clone(),
@@ -222,6 +232,34 @@ mod tests {
222232
}
223233
}
224234

235+
#[tokio::test]
236+
async fn test_compute_merkle_root_order_of_block_range_does_not_matter() {
237+
let transaction_1 =
238+
CardanoTransaction::new("tx-hash-123", BlockRange::LENGTH - 1, 10, "block_hash", 1);
239+
let transaction_2 =
240+
CardanoTransaction::new("tx-hash-456", BlockRange::LENGTH + 1, 20, "block_hash", 1);
241+
242+
let cardano_transaction_signable_builder = CardanoTransactionsSignableBuilder::new(
243+
Arc::new(DumbTransactionParser::new(vec![])),
244+
Arc::new(MockTransactionStore::new()),
245+
Path::new("/tmp"),
246+
create_logger(),
247+
);
248+
249+
let merkle_root_reference = cardano_transaction_signable_builder
250+
.compute_merkle_root(&[transaction_1.clone(), transaction_2.clone()])
251+
.unwrap();
252+
253+
// Transactions in two different block range compute the same merkle root as long as their
254+
// order in their block range is the same but the order of appearance of the block range
255+
// doesn't matter.
256+
let mk_root = cardano_transaction_signable_builder
257+
.compute_merkle_root(&[transaction_2.clone(), transaction_1.clone()])
258+
.unwrap();
259+
260+
assert_eq!(merkle_root_reference, mk_root);
261+
}
262+
225263
#[tokio::test]
226264
async fn test_compute_signable() {
227265
// Arrange

mithril-signer/src/database/provider/cardano_transaction.rs

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -158,17 +158,6 @@ impl<'client> InsertCardanoTransactionProvider<'client> {
158158
}
159159

160160
fn get_insert_condition(&self, record: &CardanoTransactionRecord) -> StdResult<WhereCondition> {
161-
// let expression =
162-
// "(transaction_hash, block_number, slot_number, block_hash, immutable_file_number) values (?1, ?2, ?3, ?4, ?5)";
163-
// let parameters = vec![
164-
// Value::String(record.transaction_hash.clone()),
165-
// Value::Integer(record.block_number.try_into()?),
166-
// Value::Integer(record.slot_number.try_into()?),
167-
// Value::String(record.block_hash.clone()),
168-
// Value::Integer(record.immutable_file_number.try_into()?),
169-
// ];
170-
171-
// Ok(WhereCondition::new(expression, parameters))
172161
self.get_insert_many_condition(vec![record.clone()])
173162
}
174163

@@ -198,12 +187,6 @@ impl<'client> InsertCardanoTransactionProvider<'client> {
198187

199188
let values: Vec<Value> = values?.into_iter().flatten().collect();
200189

201-
// let values = transactions_records
202-
// .into_iter()
203-
// .flat_map(map_record) // Vec<StdResult<Vec<Value>>>
204-
// .flatten()
205-
// .collect::<Vec<Value>>();
206-
207190
Ok(WhereCondition::new(
208191
format!("{columns} values {}", values_columns.join(", ")).as_str(),
209192
values,

0 commit comments

Comments
 (0)