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:
Hernando Castano
2021-02-10 05:14:58 -05:00
committed by Bastian Köcher
parent 2f44aecd97
commit fb7c191234
7 changed files with 38 additions and 146 deletions
+8 -47
View File
@@ -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!(