Skip to content

Commit 6ffc3fd

Browse files
committed
Allow to simulate a rollback In integration tests with a specific SlotNumber and BlockNumber
1 parent 0112207 commit 6ffc3fd

File tree

5 files changed

+84
-68
lines changed

5 files changed

+84
-68
lines changed

mithril-aggregator/tests/create_certificate.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,7 @@ async fn create_certificate() {
3333
epoch: Epoch(1),
3434
immutable_file_number: 1,
3535
chain_point: ChainPoint {
36-
// TODO: It's probably not a good idea to have the same slot_number and block_number. Can we change this?
37-
// Note: slot_number and block_number need to be equal
38-
// to check the expected when we increase both with `increase_block_number_and_slot_number`
39-
slot_number: SlotNumber(100),
36+
slot_number: SlotNumber(10),
4037
block_number: BlockNumber(100),
4138
block_hash: "block_hash-100".to_string(),
4239
},
@@ -149,7 +146,7 @@ async fn create_certificate() {
149146
the state machine should be signing CardanoTransactions for block 179"
150147
);
151148
tester
152-
.increase_block_number_and_slot_number(85, 185)
149+
.increase_block_number_and_slot_number(85, SlotNumber(95), BlockNumber(185))
153150
.await
154151
.unwrap();
155152
cycle!(tester, "signing");
@@ -187,7 +184,7 @@ async fn create_certificate() {
187184
the state machine should be signing CardanoTransactions for block 120"
188185
);
189186
tester
190-
.cardano_chain_send_rollback(SlotNumber(149))
187+
.cardano_chain_send_rollback(SlotNumber(95), BlockNumber(149))
191188
.await
192189
.unwrap();
193190
cycle!(tester, "signing");

mithril-aggregator/tests/prove_transactions.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,7 @@ async fn prove_transactions() {
3535
epoch: Epoch(1),
3636
immutable_file_number: 1,
3737
chain_point: ChainPoint {
38-
// TODO: It's probably not a good idea to have the same slot_number and block_number. Can we change this?
39-
// Note: slot_number and block_number need to be equal
40-
// to check the expected when we increase both with `increase_block_number_and_slot_number`
41-
slot_number: SlotNumber(100),
38+
slot_number: SlotNumber(10),
4239
block_number: BlockNumber(100),
4340
block_hash: "block_hash-100".to_string(),
4441
},
@@ -93,7 +90,7 @@ async fn prove_transactions() {
9390
the state machine should be signing CardanoTransactions up to block 179 included"
9491
);
9592
tester
96-
.increase_block_number_and_slot_number(85, 185)
93+
.increase_block_number_and_slot_number(85, SlotNumber(95), BlockNumber(185))
9794
.await
9895
.unwrap();
9996
cycle!(tester, "signing");

mithril-aggregator/tests/test_extensions/runtime_tester.rs

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -261,40 +261,42 @@ impl RuntimeTester {
261261
pub async fn increase_block_number_and_slot_number(
262262
&mut self,
263263
increment: u64,
264-
expected: u64,
264+
expected_slot_number: SlotNumber,
265+
expected_block_number: BlockNumber,
265266
) -> StdResult<()> {
266-
let new_block_number = self
267-
.chain_observer
268-
.increase_block_number(increment)
269-
.await
270-
.ok_or_else(|| anyhow!("no block number returned".to_string()))?;
271-
272267
let new_slot_number = self
273268
.chain_observer
274269
.increase_slot_number(increment)
275270
.await
276271
.ok_or_else(|| anyhow!("no slot number returned".to_string()))?;
277272

273+
let new_block_number = self
274+
.chain_observer
275+
.increase_block_number(increment)
276+
.await
277+
.ok_or_else(|| anyhow!("no block number returned".to_string()))?;
278+
278279
anyhow::ensure!(
279-
expected == new_block_number,
280-
"expected to increase block number up to {expected}, got {new_block_number}",
280+
expected_slot_number == new_slot_number,
281+
format!("expected to increase slot number up to {expected_slot_number}, got {new_slot_number}"),
281282
);
282283

283284
anyhow::ensure!(
284-
expected == new_slot_number,
285-
format!("expected to increase slot number up to {expected}, got {new_slot_number}"),
285+
expected_block_number == new_block_number,
286+
"expected to increase block number up to {expected_block_number}, got {new_block_number}",
286287
);
287288

288289
// Make the block scanner return new blocks
289-
let blocks_to_scan: Vec<ScannedBlock> = ((expected - increment + 1)..=expected)
290-
.map(|block_number| {
290+
let blocks_to_scan: Vec<ScannedBlock> = (1..=increment)
291+
.map(|index_number| {
292+
let block_number = expected_block_number - increment + index_number;
293+
let slot_number = expected_slot_number - increment + index_number;
291294
let block_hash = format!("block_hash-{block_number}");
292-
let slot_number = block_number;
293295
ScannedBlock::new(
294296
block_hash,
295-
BlockNumber(block_number),
296-
SlotNumber(slot_number),
297-
vec![tx_hash(block_number, 1)],
297+
block_number,
298+
slot_number,
299+
vec![tx_hash(*block_number, 1)],
298300
)
299301
})
300302
.collect();
@@ -306,38 +308,43 @@ impl RuntimeTester {
306308
pub async fn cardano_chain_send_rollback(
307309
&mut self,
308310
rollback_to_slot_number: SlotNumber,
311+
rollback_to_block_number: BlockNumber,
309312
) -> StdResult<()> {
310-
let actual_slot_number = self
313+
let chain_point = self
311314
.chain_observer
312315
.get_current_chain_point()
313316
.await?
314-
.map(|c| c.slot_number)
315-
.ok_or_else(|| anyhow!("no slot number returned".to_string()))?;
317+
.ok_or_else(|| anyhow!("no chain point returned".to_string()))?;
318+
319+
let decrement_slot_number = chain_point.slot_number - rollback_to_slot_number;
320+
let decrement_block_number = chain_point.block_number - rollback_to_block_number;
316321

317-
let decrement = actual_slot_number - rollback_to_slot_number;
318322
let new_slot_number = self
319323
.chain_observer
320-
.decrease_slot_number(*decrement)
324+
.decrease_slot_number(*decrement_slot_number)
321325
.await
322326
.ok_or_else(|| anyhow!("no slot number returned".to_string()))?;
323327

324-
// TODO: Needed for CardanoTransaction that use the block number. Is it normal ?
325-
// Without this decrease_block_number, the create_certificate fail trying to sign a CardanoTransaction after a rollback.
326-
let _new_block_number = self
328+
let new_block_number = self
327329
.chain_observer
328-
.decrease_block_number(*decrement)
330+
.decrease_block_number(*decrement_block_number)
329331
.await
330332
.ok_or_else(|| anyhow!("no block number returned".to_string()))?;
331333

332334
anyhow::ensure!(
333335
rollback_to_slot_number == new_slot_number,
334-
"expected to increase slot number up to {rollback_to_slot_number}, got {new_slot_number}",
336+
"expected to decrease slot number to {rollback_to_slot_number}, got {new_slot_number}",
337+
);
338+
339+
anyhow::ensure!(
340+
rollback_to_block_number == new_block_number,
341+
"expected to decrease block number to {rollback_to_block_number}, got {new_block_number}",
335342
);
336343

337344
let chain_point = ChainPoint {
338345
slot_number: rollback_to_slot_number,
339-
block_number: BlockNumber(*rollback_to_slot_number),
340-
block_hash: format!("block_hash-{rollback_to_slot_number}"),
346+
block_number: rollback_to_block_number,
347+
block_hash: format!("block_hash-{rollback_to_slot_number}-{rollback_to_block_number}"),
341348
};
342349
self.block_scanner.add_backward(chain_point);
343350

mithril-signer/tests/create_cardano_transaction_single_signature.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ async fn test_create_cardano_transaction_single_signature() {
2323
epoch: Epoch(1),
2424
immutable_file_number: 1,
2525
chain_point: ChainPoint {
26-
slot_number: SlotNumber(100),
26+
slot_number: SlotNumber(10),
2727
// Note: the starting block number must be greater than the cardano_transactions_signing_config.step
2828
// so first block range root computation is not on block 0.
2929
block_number: BlockNumber(100),
@@ -58,7 +58,7 @@ async fn test_create_cardano_transaction_single_signature() {
5858
.cycle_unregistered().await.unwrap()
5959

6060
.comment("creating a new certificate pending with a cardano transaction signed entity → Registered")
61-
.increase_block_number_and_slot_number(70, 170).await.unwrap()
61+
.increase_block_number_and_slot_number(70, SlotNumber(80), BlockNumber(170)).await.unwrap()
6262
.cycle_registered().await.unwrap()
6363

6464
.comment("signer can now create a single signature → Signed")
@@ -69,8 +69,8 @@ async fn test_create_cardano_transaction_single_signature() {
6969
.cycle_signed().await.unwrap()
7070

7171
.comment("new blocks means a new signature with the same stake distribution → Signed")
72-
.increase_block_number_and_slot_number(125, 295).await.unwrap()
73-
.cardano_chain_send_rollback(SlotNumber(230)).await.unwrap()
72+
.increase_block_number_and_slot_number(125, SlotNumber(205), BlockNumber(295)).await.unwrap()
73+
.cardano_chain_send_rollback(SlotNumber(205), BlockNumber(230)).await.unwrap()
7474
.cycle_registered().await.unwrap()
7575
.cycle_signed().await.unwrap()
7676

mithril-signer/tests/test_extensions/state_machine_tester.rs

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -420,39 +420,41 @@ impl StateMachineTester {
420420
pub async fn increase_block_number_and_slot_number(
421421
&mut self,
422422
increment: u64,
423-
expected: u64,
423+
expected_slot_number: SlotNumber,
424+
expected_block_number: BlockNumber,
424425
) -> Result<&mut Self> {
425-
let new_block_number = self
426-
.chain_observer
427-
.increase_block_number(increment)
428-
.await
429-
.ok_or_else(|| TestError::ValueError("no block number returned".to_string()))?;
430-
431426
let new_slot_number = self
432427
.chain_observer
433428
.increase_slot_number(increment)
434429
.await
435430
.ok_or_else(|| TestError::ValueError("no slot number returned".to_string()))?;
436431

432+
let new_block_number = self
433+
.chain_observer
434+
.increase_block_number(increment)
435+
.await
436+
.ok_or_else(|| TestError::ValueError("no block number returned".to_string()))?;
437+
437438
self.assert(
438-
expected == new_block_number,
439-
format!("expected to increase block number up to {expected}, got {new_block_number}"),
439+
expected_slot_number == new_slot_number,
440+
format!("expected to increase slot number up to {expected_slot_number}, got {new_slot_number}"),
440441
)?;
441442

442443
self.assert(
443-
expected == new_slot_number,
444-
format!("expected to increase slot number up to {expected}, got {new_slot_number}"),
444+
expected_block_number == new_block_number,
445+
format!("expected to increase block number up to {expected_block_number}, got {new_block_number}"),
445446
)?;
446447

447448
// Make the block scanner return new blocks
448-
let blocks_to_scan: Vec<ScannedBlock> = ((expected - increment + 1)..=expected)
449-
.map(|block_number| {
449+
let blocks_to_scan: Vec<ScannedBlock> = (1..=increment)
450+
.map(|index_number| {
451+
let block_number = expected_block_number - increment + index_number;
452+
let slot_number = expected_slot_number - increment + index_number;
450453
let block_hash = format!("block_hash-{block_number}");
451-
let slot_number = block_number;
452454
ScannedBlock::new(
453455
block_hash,
454-
BlockNumber(block_number),
455-
SlotNumber(slot_number),
456+
block_number,
457+
slot_number,
456458
vec![format!("tx_hash-{block_number}-1")],
457459
)
458460
})
@@ -465,31 +467,44 @@ impl StateMachineTester {
465467
pub async fn cardano_chain_send_rollback(
466468
&mut self,
467469
rollback_to_slot_number: SlotNumber,
470+
rollback_to_block_number: BlockNumber,
468471
) -> Result<&mut Self> {
469-
let actual_slot_number = self
472+
let chain_point = self
470473
.chain_observer
471474
.get_current_chain_point()
472475
.await
473476
.map_err(|err| TestError::SubsystemError(anyhow!(err)))?
474-
.map(|c| c.slot_number)
475-
.ok_or_else(|| TestError::ValueError("no slot number returned".to_string()))?;
477+
.ok_or_else(|| anyhow!("no chain point returned".to_string()))?;
478+
479+
let decrement_slot_number = chain_point.slot_number - rollback_to_slot_number;
480+
let decrement_block_number = chain_point.block_number - rollback_to_block_number;
476481

477-
let decrement = actual_slot_number - rollback_to_slot_number;
478482
let new_slot_number = self
479483
.chain_observer
480-
.decrease_slot_number(*decrement)
484+
.decrease_slot_number(*decrement_slot_number)
481485
.await
482486
.ok_or_else(|| TestError::ValueError("no slot number returned".to_string()))?;
483487

488+
let new_block_number = self
489+
.chain_observer
490+
.decrease_block_number(*decrement_block_number)
491+
.await
492+
.ok_or_else(|| TestError::ValueError("no block number returned".to_string()))?;
493+
484494
self.assert(
485495
rollback_to_slot_number == new_slot_number,
486-
format!("expected to increase slot number up to {rollback_to_slot_number}, got {new_slot_number}"),
496+
format!("expected to decrease slot number to {rollback_to_slot_number}, got {new_slot_number}"),
497+
)?;
498+
499+
self.assert(
500+
rollback_to_block_number == new_block_number,
501+
format!("expected to decrease block number to {rollback_to_block_number}, got {new_block_number}"),
487502
)?;
488503

489504
let chain_point = ChainPoint {
490505
slot_number: rollback_to_slot_number,
491-
block_number: BlockNumber(*rollback_to_slot_number),
492-
block_hash: format!("block_hash-{rollback_to_slot_number}"),
506+
block_number: rollback_to_block_number,
507+
block_hash: format!("block_hash-{rollback_to_slot_number}-{rollback_to_block_number}"),
493508
};
494509
self.block_scanner.add_backward(chain_point);
495510

0 commit comments

Comments
 (0)