diff --git a/substrate/client/finality-grandpa/src/aux_schema.rs b/substrate/client/finality-grandpa/src/aux_schema.rs index cac8e566d263660ca52952b5326d17700eace721..beb2103ec427227d1041863d3a22cf00fa4eb542 100644 --- a/substrate/client/finality-grandpa/src/aux_schema.rs +++ b/substrate/client/finality-grandpa/src/aux_schema.rs @@ -36,6 +36,7 @@ use crate::NewAuthoritySet; const VERSION_KEY: &[u8] = b"grandpa_schema_version"; const SET_STATE_KEY: &[u8] = b"grandpa_completed_round"; +const CONCLUDED_ROUNDS: &[u8] = b"grandpa_concluded_rounds"; const AUTHORITY_SET_KEY: &[u8] = b"grandpa_voters"; const CONSENSUS_CHANGES_KEY: &[u8] = b"grandpa_consensus_changes"; @@ -405,6 +406,18 @@ pub(crate) fn write_voter_set_state<Block: BlockT, B: AuxStore>( ) } +/// Write concluded round. +pub(crate) fn write_concluded_round<Block: BlockT, B: AuxStore>( + backend: &B, + round_data: &CompletedRound<Block>, +) -> ClientResult<()> { + let mut key = CONCLUDED_ROUNDS.to_vec(); + let round_number = round_data.number; + round_number.using_encoded(|n| key.extend(n)); + + backend.insert_aux(&[(&key[..], round_data.encode().as_slice())], &[]) +} + /// Update the consensus changes. pub(crate) fn update_consensus_changes<H, N, F, R>( set: &ConsensusChanges<H, N>, @@ -608,4 +621,29 @@ mod test { }, ); } + + #[test] + fn write_read_concluded_rounds() { + let client = test_client::new(); + let hash = H256::random(); + let round_state = RoundState::genesis((hash, 0)); + + let completed_round = CompletedRound::<test_client::runtime::Block> { + number: 42, + state: round_state.clone(), + base: round_state.prevote_ghost.unwrap(), + votes: vec![], + }; + + assert!(write_concluded_round(&client, &completed_round).is_ok()); + + let round_number = completed_round.number; + let mut key = CONCLUDED_ROUNDS.to_vec(); + round_number.using_encoded(|n| key.extend(n)); + + assert_eq!( + load_decode::<_, CompletedRound::<test_client::runtime::Block>>(&client, &key).unwrap(), + Some(completed_round), + ); + } } diff --git a/substrate/client/finality-grandpa/src/environment.rs b/substrate/client/finality-grandpa/src/environment.rs index af6e03743a42d2ff4f0093a89b4593c30b59251d..bc04ecef043f5060d970556b30660b6e25827ad2 100644 --- a/substrate/client/finality-grandpa/src/environment.rs +++ b/substrate/client/finality-grandpa/src/environment.rs @@ -865,6 +865,7 @@ where historical_votes.seen().iter().skip(n_existing_votes).cloned() ); already_completed.state = state; + crate::aux_schema::write_concluded_round(&*self.client, &already_completed); } let set_state = VoterSetState::<Block>::Live {