mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-09 20:11:09 +00:00
Fixed GrandpaConsensusLogReader::find_scheduled_change (#4208)
This commit is contained in:
committed by
GitHub
parent
04a9071e2a
commit
21308d893e
@@ -32,7 +32,9 @@ use core::{clone::Clone, cmp::Eq, default::Default, fmt::Debug};
|
||||
use frame_support::PalletError;
|
||||
use scale_info::TypeInfo;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use sp_consensus_grandpa::{AuthorityList, ConsensusLog, SetId, GRANDPA_ENGINE_ID};
|
||||
use sp_consensus_grandpa::{
|
||||
AuthorityList, ConsensusLog, ScheduledChange, SetId, GRANDPA_ENGINE_ID,
|
||||
};
|
||||
use sp_runtime::{traits::Header as HeaderT, Digest, RuntimeDebug};
|
||||
use sp_std::{boxed::Box, vec::Vec};
|
||||
|
||||
@@ -147,24 +149,23 @@ pub struct GrandpaConsensusLogReader<Number>(sp_std::marker::PhantomData<Number>
|
||||
|
||||
impl<Number: Codec> GrandpaConsensusLogReader<Number> {
|
||||
/// Find and return scheduled (regular) change digest item.
|
||||
pub fn find_scheduled_change(
|
||||
digest: &Digest,
|
||||
) -> Option<sp_consensus_grandpa::ScheduledChange<Number>> {
|
||||
pub fn find_scheduled_change(digest: &Digest) -> Option<ScheduledChange<Number>> {
|
||||
use sp_runtime::generic::OpaqueDigestItemId;
|
||||
let id = OpaqueDigestItemId::Consensus(&GRANDPA_ENGINE_ID);
|
||||
|
||||
let filter_log = |log: ConsensusLog<Number>| match log {
|
||||
ConsensusLog::ScheduledChange(change) => Some(change),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
// find the first consensus digest with the right ID which converts to
|
||||
// the right kind of consensus log.
|
||||
digest
|
||||
.convert_first(|log| log.consensus_try_to(&GRANDPA_ENGINE_ID))
|
||||
.and_then(|log| match log {
|
||||
ConsensusLog::ScheduledChange(change) => Some(change),
|
||||
_ => None,
|
||||
})
|
||||
digest.convert_first(|l| l.try_to(id).and_then(filter_log))
|
||||
}
|
||||
|
||||
/// Find and return forced change digest item. Or light client can't do anything
|
||||
/// with forced changes, so we can't accept header with the forced change digest.
|
||||
pub fn find_forced_change(
|
||||
digest: &Digest,
|
||||
) -> Option<(Number, sp_consensus_grandpa::ScheduledChange<Number>)> {
|
||||
pub fn find_forced_change(digest: &Digest) -> Option<(Number, ScheduledChange<Number>)> {
|
||||
// find the first consensus digest with the right ID which converts to
|
||||
// the right kind of consensus log.
|
||||
digest
|
||||
@@ -346,7 +347,7 @@ mod tests {
|
||||
use super::*;
|
||||
use bp_runtime::ChainId;
|
||||
use frame_support::weights::Weight;
|
||||
use sp_runtime::{testing::H256, traits::BlakeTwo256, MultiSignature};
|
||||
use sp_runtime::{testing::H256, traits::BlakeTwo256, DigestItem, MultiSignature};
|
||||
|
||||
struct TestChain;
|
||||
|
||||
@@ -385,4 +386,35 @@ mod tests {
|
||||
max_expected_submit_finality_proof_arguments_size::<TestChain>(false, 100),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn find_scheduled_change_works() {
|
||||
let scheduled_change = ScheduledChange { next_authorities: vec![], delay: 0 };
|
||||
|
||||
// first
|
||||
let mut digest = Digest::default();
|
||||
digest.push(DigestItem::Consensus(
|
||||
GRANDPA_ENGINE_ID,
|
||||
ConsensusLog::ScheduledChange(scheduled_change.clone()).encode(),
|
||||
));
|
||||
assert_eq!(
|
||||
GrandpaConsensusLogReader::find_scheduled_change(&digest),
|
||||
Some(scheduled_change.clone())
|
||||
);
|
||||
|
||||
// not first
|
||||
let mut digest = Digest::default();
|
||||
digest.push(DigestItem::Consensus(
|
||||
GRANDPA_ENGINE_ID,
|
||||
ConsensusLog::<u64>::OnDisabled(0).encode(),
|
||||
));
|
||||
digest.push(DigestItem::Consensus(
|
||||
GRANDPA_ENGINE_ID,
|
||||
ConsensusLog::ScheduledChange(scheduled_change.clone()).encode(),
|
||||
));
|
||||
assert_eq!(
|
||||
GrandpaConsensusLogReader::find_scheduled_change(&digest),
|
||||
Some(scheduled_change.clone())
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user