mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 14:37:57 +00:00
Stop Importing Full Header Chain (#707)
* Make AncestryProof type more flexible * Only import single finalized header instead of a chain * Fix unchecked header import tests * Add option for limiting ancestry proof size * Update finality verifier Config in runtimes * Update some documentation * Fix Clippy warning * Allow AncestryChecker to return proof size Stops us from abusing the `Size` trait * Remove Size impl for Vec<T> * Remove size contraints for ancestry proofs With different proof types its unclear how to "size" should be interpreted, so we remove this requirement all together to avoid confusion.
This commit is contained in:
committed by
Bastian Köcher
parent
2f44aecd97
commit
fb7c191234
@@ -375,25 +375,8 @@ impl<T: Config> bp_header_chain::HeaderChain<BridgedHeader<T>, sp_runtime::Dispa
|
||||
PalletStorage::<T>::new().current_authority_set()
|
||||
}
|
||||
|
||||
fn append_finalized_chain(
|
||||
headers: impl IntoIterator<Item = BridgedHeader<T>>,
|
||||
) -> Result<(), sp_runtime::DispatchError> {
|
||||
let mut storage = PalletStorage::<T>::new();
|
||||
|
||||
let mut header_iter = headers.into_iter().peekable();
|
||||
let first_header = header_iter.peek().ok_or(Error::<T>::NotDescendant)?;
|
||||
|
||||
// Quick ancestry check to make sure we're not writing complete nonsense to storage
|
||||
ensure!(
|
||||
<BestFinalized<T>>::get() == *first_header.parent_hash(),
|
||||
Error::<T>::NotDescendant,
|
||||
);
|
||||
|
||||
for header in header_iter {
|
||||
import_header_unchecked::<_, T>(&mut storage, header);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
fn append_header(header: BridgedHeader<T>) {
|
||||
import_header_unchecked::<_, T>(&mut PalletStorage::<T>::new(), header);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -923,36 +906,15 @@ mod tests {
|
||||
init_with_origin(Origin::root()).unwrap();
|
||||
let storage = PalletStorage::<TestRuntime>::new();
|
||||
|
||||
let child = test_header(2);
|
||||
let header = test_header(3);
|
||||
let header = test_header(2);
|
||||
Module::<TestRuntime>::append_header(header.clone());
|
||||
|
||||
let header_chain = vec![child.clone(), header.clone()];
|
||||
assert_ok!(Module::<TestRuntime>::append_finalized_chain(header_chain));
|
||||
|
||||
assert!(storage.header_by_hash(child.hash()).unwrap().is_finalized);
|
||||
assert!(storage.header_by_hash(header.hash()).unwrap().is_finalized);
|
||||
|
||||
assert_eq!(storage.best_finalized_header().header, header);
|
||||
assert_eq!(storage.best_headers()[0].hash, header.hash());
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn prevents_unchecked_header_import_if_headers_are_unrelated() {
|
||||
run_test(|| {
|
||||
init_with_origin(Origin::root()).unwrap();
|
||||
|
||||
// Pallet is expecting test_header(2) as the child
|
||||
let not_a_child = test_header(3);
|
||||
let header_chain = vec![not_a_child];
|
||||
|
||||
assert_noop!(
|
||||
Module::<TestRuntime>::append_finalized_chain(header_chain),
|
||||
Error::<TestRuntime>::NotDescendant,
|
||||
);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn importing_unchecked_headers_enacts_new_authority_set() {
|
||||
run_test(|| {
|
||||
@@ -968,7 +930,7 @@ mod tests {
|
||||
header.digest = fork_tests::change_log(0);
|
||||
|
||||
// Let's import our test header
|
||||
assert_ok!(Module::<TestRuntime>::append_finalized_chain(vec![header.clone()]));
|
||||
Module::<TestRuntime>::append_header(header.clone());
|
||||
|
||||
// Make sure that our header is the best finalized
|
||||
assert_eq!(storage.best_finalized_header().header, header);
|
||||
@@ -998,8 +960,8 @@ mod tests {
|
||||
let header = test_header(3);
|
||||
|
||||
// Let's import our test headers
|
||||
let header_chain = vec![schedules_change, header.clone()];
|
||||
assert_ok!(Module::<TestRuntime>::append_finalized_chain(header_chain));
|
||||
Module::<TestRuntime>::append_header(schedules_change);
|
||||
Module::<TestRuntime>::append_header(header.clone());
|
||||
|
||||
// Make sure that our header is the best finalized
|
||||
assert_eq!(storage.best_finalized_header().header, header);
|
||||
@@ -1039,8 +1001,7 @@ mod tests {
|
||||
|
||||
// We are expecting an authority set change at height 2, so this header should enact
|
||||
// that upon being imported.
|
||||
let header_chain = vec![test_header(2)];
|
||||
assert_ok!(Module::<TestRuntime>::append_finalized_chain(header_chain));
|
||||
Module::<TestRuntime>::append_header(test_header(2));
|
||||
|
||||
// Make sure that the authority set actually changed upon importing our header
|
||||
assert_eq!(
|
||||
|
||||
Reference in New Issue
Block a user