Babe initialization in tests

TL;DR @tuxmain comment en es-tu venu à ajouter mock_babe_initialize ?


Dans la fonction mock run_to_block des tests d’intégration du runtime gdev, tu as ajouté une fonction mock_babe_initialize (dans time-based UD) et incrémenté manuellement les slot BABE (dans distance-oracle).

J’ai un problème lors de la mise à jour v0.9.42 : le current_epoch_start n’est pas mis à jour, et donc les sessions sont incrémentées à chaque bloc (ShouldEndSession). Et vu que tu as modifié plusieurs trucs dans cette fonction lié à BABE, je me dis que tu as peut-être une idée.

J’ai ajouté un test test_session_change dans une branche hugo-test-session-change qui passe bien sur master, mais plus sur la mise à jour.

On dirait que Session::on_initialize(System::block_number()); est bien appelé, mais par on_new_session() de BABE.


Il y a deux possibilités pour que enact_epoch_change soit appelé :

  • on_new_session (dans notre cas)
  • trigger de EpochChangeTrigger si les autorités ne changent jamais

on_new_session devrait être appelé dans rotate_session de la pallet Session elle même appelée dans on_initialize. Si je résume :

  1. on_initialize de Session :heavy_check_mark:
  2. rotate_session de Session :heavy_check_mark:
  3. on_new_session de Babe :question:
  4. enact_epoch_change de Babe :x:


En attendant, j’ai ajouté un changement de session à ta fonction :

fn mock_babe_initialize(n: u32) {
    let slot: sp_consensus_babe::Slot = (n as u64).into();
    pallet_babe::CurrentSlot::<Runtime>::put(slot);
    // force epoch change based on session
    let session = Session::current_index() as u64;
    pallet_babe::EpochIndex::<Runtime>::put(session);
}

Le problème de l’EpochIndex est probablement le même que celui du CurrentSlot qui est également modifié dans initialize de Babe.

Je ne sais plus, j’ai dû trouver ça dans une branche d’Élois. Je regarderai ce soir.

Ce devait être parce qu’en mode manuel, Babe n’incrémente pas le slot, et que pour une certaine raison il y avait besoin du slot pour !178. J’avais bien recopié ce patch depuis la branche d’Élois correspondante.

Comme j’avais aussi eu besoin de toucher à ça pour la distance, la ligne suivante au mieux est annulée par mock_babe_initialize, au pire crée des incohérences à cause des deux lignes entre elle et l’appel à mock_babe_initialize :

pallet_babe::CurrentSlot::<Runtime>::put(pallet_babe::CurrentSlot::<Runtime>::get() + 1);
1 Like

Ok. Ce serait embêtant d’avoir des tests qui passent alors qu’il ne devraient pas juste parce que le mock est incohérent. On pourrait essayer de réécrire ces mocks en s’inspirant de polkadot :

fn run_to_block(n: u32) {
	assert!(System::block_number() < n);
	while System::block_number() < n {
		let block_number = System::block_number();
		AllPalletsWithSystem::on_finalize(block_number);
		System::set_block_number(block_number + 1);
		maybe_new_session(block_number + 1);
		AllPalletsWithSystem::on_initialize(block_number + 1);
	}
}

Je vais essayer de faire ça dans la MR de mise à jour après avoir réglé le problème des providers.

1 Like