mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-31 04:01:02 +00:00
Merge commit 'f9c24ef0db390c355241445af37a5c7999a7dc66' into hc-bump-bridges-subtree-take-2
This commit is contained in:
@@ -42,7 +42,7 @@ use bp_header_chain::justification::GrandpaJustification;
|
||||
use bp_header_chain::InitializationData;
|
||||
use bp_runtime::{BlockNumberOf, Chain, HashOf, HasherOf, HeaderOf};
|
||||
use finality_grandpa::voter_set::VoterSet;
|
||||
use frame_support::ensure;
|
||||
use frame_support::{ensure, fail};
|
||||
use frame_system::{ensure_signed, RawOrigin};
|
||||
use sp_finality_grandpa::{ConsensusLog, GRANDPA_ENGINE_ID};
|
||||
use sp_runtime::traits::{BadOrigin, Header as HeaderT, Zero};
|
||||
@@ -143,11 +143,17 @@ pub mod pallet {
|
||||
let (hash, number) = (finality_target.hash(), finality_target.number());
|
||||
log::trace!(target: "runtime::bridge-grandpa", "Going to try and finalize header {:?}", finality_target);
|
||||
|
||||
let best_finalized = <ImportedHeaders<T, I>>::get(<BestFinalized<T, I>>::get()).expect(
|
||||
"In order to reach this point the bridge must have been initialized. Afterwards,
|
||||
every time `BestFinalized` is updated `ImportedHeaders` is also updated. Therefore
|
||||
`ImportedHeaders` must contain an entry for `BestFinalized`.",
|
||||
);
|
||||
let best_finalized = match <ImportedHeaders<T, I>>::get(<BestFinalized<T, I>>::get()) {
|
||||
Some(best_finalized) => best_finalized,
|
||||
None => {
|
||||
log::error!(
|
||||
target: "runtime::bridge-grandpa",
|
||||
"Cannot finalize header {:?} because pallet is not yet initialized",
|
||||
finality_target,
|
||||
);
|
||||
fail!(<Error<T, I>>::NotInitialized);
|
||||
}
|
||||
};
|
||||
|
||||
// We do a quick check here to ensure that our header chain is making progress and isn't
|
||||
// "travelling back in time" (which could be indicative of something bad, e.g a hard-fork).
|
||||
@@ -158,20 +164,8 @@ pub mod pallet {
|
||||
verify_justification::<T, I>(&justification, hash, *number, authority_set)?;
|
||||
|
||||
let _enacted = try_enact_authority_change::<T, I>(&finality_target, set_id)?;
|
||||
let index = <ImportedHashesPointer<T, I>>::get();
|
||||
let pruning = <ImportedHashes<T, I>>::try_get(index);
|
||||
<BestFinalized<T, I>>::put(hash);
|
||||
<ImportedHeaders<T, I>>::insert(hash, finality_target);
|
||||
<ImportedHashes<T, I>>::insert(index, hash);
|
||||
<RequestCount<T, I>>::mutate(|count| *count += 1);
|
||||
|
||||
// Update ring buffer pointer and remove old header.
|
||||
<ImportedHashesPointer<T, I>>::put((index + 1) % T::HeadersToKeep::get());
|
||||
if let Ok(hash) = pruning {
|
||||
log::debug!(target: "runtime::bridge-grandpa", "Pruning old header: {:?}.", hash);
|
||||
<ImportedHeaders<T, I>>::remove(hash);
|
||||
}
|
||||
|
||||
insert_header::<T, I>(finality_target, hash);
|
||||
log::info!(target: "runtime::bridge-grandpa", "Succesfully imported finalized header with hash {:?}!", hash);
|
||||
|
||||
Ok(().into())
|
||||
@@ -346,6 +340,8 @@ pub mod pallet {
|
||||
///
|
||||
/// This is the case for non-standard (e.g forced) authority set changes.
|
||||
UnsupportedScheduledChange,
|
||||
/// The pallet is not yet initialized.
|
||||
NotInitialized,
|
||||
/// The pallet has already been initialized.
|
||||
AlreadyInitialized,
|
||||
/// All pallet operations are halted.
|
||||
@@ -427,6 +423,25 @@ pub mod pallet {
|
||||
)
|
||||
}
|
||||
|
||||
/// Import a previously verified header to the storage.
|
||||
///
|
||||
/// Note this function solely takes care of updating the storage and pruning old entries,
|
||||
/// but does not verify the validaty of such import.
|
||||
pub(crate) fn insert_header<T: Config<I>, I: 'static>(header: BridgedHeader<T, I>, hash: BridgedBlockHash<T, I>) {
|
||||
let index = <ImportedHashesPointer<T, I>>::get();
|
||||
let pruning = <ImportedHashes<T, I>>::try_get(index);
|
||||
<BestFinalized<T, I>>::put(hash);
|
||||
<ImportedHeaders<T, I>>::insert(hash, header);
|
||||
<ImportedHashes<T, I>>::insert(index, hash);
|
||||
|
||||
// Update ring buffer pointer and remove old header.
|
||||
<ImportedHashesPointer<T, I>>::put((index + 1) % T::HeadersToKeep::get());
|
||||
if let Ok(hash) = pruning {
|
||||
log::debug!(target: "runtime::bridge-grandpa", "Pruning old header: {:?}.", hash);
|
||||
<ImportedHeaders<T, I>>::remove(hash);
|
||||
}
|
||||
}
|
||||
|
||||
/// Since this writes to storage with no real checks this should only be used in functions that
|
||||
/// were called by a trusted origin.
|
||||
pub(crate) fn initialize_bridge<T: Config<I>, I: 'static>(
|
||||
@@ -441,8 +456,8 @@ pub mod pallet {
|
||||
|
||||
let initial_hash = header.hash();
|
||||
<InitialHash<T, I>>::put(initial_hash);
|
||||
<BestFinalized<T, I>>::put(initial_hash);
|
||||
<ImportedHeaders<T, I>>::insert(initial_hash, header);
|
||||
<ImportedHashesPointer<T, I>>::put(0);
|
||||
insert_header::<T, I>(header, initial_hash);
|
||||
|
||||
let authority_set = bp_header_chain::AuthoritySet::new(authority_list, set_id);
|
||||
<CurrentAuthoritySet<T, I>>::put(authority_set);
|
||||
@@ -450,6 +465,29 @@ pub mod pallet {
|
||||
<IsHalted<T, I>>::put(is_halted);
|
||||
}
|
||||
|
||||
#[cfg(feature = "runtime-benchmarks")]
|
||||
pub(crate) fn bootstrap_bridge<T: Config<I>, I: 'static>(
|
||||
init_params: super::InitializationData<BridgedHeader<T, I>>,
|
||||
) {
|
||||
let start_number = *init_params.header.number();
|
||||
let end_number = start_number + T::HeadersToKeep::get().into();
|
||||
initialize_bridge::<T, I>(init_params);
|
||||
|
||||
let mut number = start_number;
|
||||
while number < end_number {
|
||||
number = number + sp_runtime::traits::One::one();
|
||||
let header = <BridgedHeader<T, I>>::new(
|
||||
number,
|
||||
Default::default(),
|
||||
Default::default(),
|
||||
Default::default(),
|
||||
Default::default(),
|
||||
);
|
||||
let hash = header.hash();
|
||||
insert_header::<T, I>(header, hash);
|
||||
}
|
||||
}
|
||||
|
||||
/// Ensure that the origin is either root, or `PalletOwner`.
|
||||
fn ensure_owner_or_root<T: Config<I>, I: 'static>(origin: T::Origin) -> Result<(), BadOrigin> {
|
||||
match origin.into() {
|
||||
@@ -737,6 +775,13 @@ mod tests {
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pallet_rejects_header_if_not_initialized_yet() {
|
||||
run_test(|| {
|
||||
assert_noop!(submit_finality_proof(1), Error::<TestRuntime>::NotInitialized);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn succesfully_imports_header_with_valid_finality() {
|
||||
run_test(|| {
|
||||
|
||||
Reference in New Issue
Block a user