mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 09:21:04 +00:00
Include parent head in CandidateReceipt (#826)
* runtime: candidate receipt must pass parent head * construct parachain candidates using correct parent_head * validate that the parent header is correct in candidate receipt * fix test fallout * bump runtime versions
This commit is contained in:
committed by
GitHub
parent
703ac8bbbc
commit
1c2aff5b4d
@@ -231,6 +231,8 @@ decl_error! {
|
||||
InvalidSignature,
|
||||
/// Extra untagged validity votes along with candidate.
|
||||
UntaggedVotes,
|
||||
/// Wrong parent head for parachain receipt.
|
||||
ParentMismatch,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -781,6 +783,14 @@ impl<T: Trait> Module<T> {
|
||||
let validator_group = validator_groups.group_for(para_id)
|
||||
.ok_or(Error::<T>::NoValidatorGroup)?;
|
||||
|
||||
let actual_head = Self::parachain_head(¶_id)
|
||||
.map(primitives::parachain::HeadData);
|
||||
|
||||
ensure!(
|
||||
actual_head.as_ref() == Some(&candidate.candidate.parent_head),
|
||||
Error::<T>::ParentMismatch,
|
||||
);
|
||||
|
||||
ensure!(
|
||||
candidate.validity_votes.len() >= majority_of(validator_group.len()),
|
||||
Error::<T>::NotEnoughValidityVotes,
|
||||
@@ -1287,6 +1297,7 @@ mod tests {
|
||||
collator: Default::default(),
|
||||
signature: Default::default(),
|
||||
head_data: HeadData(vec![1, 2, 3]),
|
||||
parent_head: HeadData(vec![]),
|
||||
egress_queue_roots,
|
||||
fees: 0,
|
||||
block_data_hash: Default::default(),
|
||||
@@ -1308,6 +1319,7 @@ mod tests {
|
||||
collator: Default::default(),
|
||||
signature: Default::default(),
|
||||
head_data: HeadData(vec![1, 2, 3]),
|
||||
parent_head: HeadData(vec![]),
|
||||
egress_queue_roots: vec![],
|
||||
fees: 0,
|
||||
block_data_hash: Default::default(),
|
||||
@@ -1718,6 +1730,7 @@ mod tests {
|
||||
collator: Default::default(),
|
||||
signature: Default::default(),
|
||||
head_data: HeadData(vec![1, 2, 3]),
|
||||
parent_head: HeadData(vec![]),
|
||||
egress_queue_roots: vec![],
|
||||
fees: 0,
|
||||
block_data_hash: Default::default(),
|
||||
@@ -1750,6 +1763,7 @@ mod tests {
|
||||
collator: Default::default(),
|
||||
signature: Default::default(),
|
||||
head_data: HeadData(vec![1, 2, 3]),
|
||||
parent_head: HeadData(vec![]),
|
||||
egress_queue_roots: vec![],
|
||||
fees: 0,
|
||||
block_data_hash: Default::default(),
|
||||
@@ -1766,6 +1780,7 @@ mod tests {
|
||||
collator: Default::default(),
|
||||
signature: Default::default(),
|
||||
head_data: HeadData(vec![2, 3, 4]),
|
||||
parent_head: HeadData(vec![]),
|
||||
egress_queue_roots: vec![],
|
||||
fees: 0,
|
||||
block_data_hash: Default::default(),
|
||||
@@ -1806,6 +1821,7 @@ mod tests {
|
||||
collator: Default::default(),
|
||||
signature: Default::default(),
|
||||
head_data: HeadData(vec![1, 2, 3]),
|
||||
parent_head: HeadData(vec![]),
|
||||
egress_queue_roots: vec![],
|
||||
fees: 0,
|
||||
block_data_hash: Default::default(),
|
||||
@@ -1844,6 +1860,7 @@ mod tests {
|
||||
collator: Default::default(),
|
||||
signature: Default::default(),
|
||||
head_data: HeadData(vec![1, 2, 3]),
|
||||
parent_head: HeadData(vec![]),
|
||||
egress_queue_roots: vec![],
|
||||
fees: 0,
|
||||
block_data_hash: Default::default(),
|
||||
@@ -1878,10 +1895,18 @@ mod tests {
|
||||
assert_eq!(Parachains::ingress(ParaId::from(99), None), Some(Vec::new()));
|
||||
|
||||
init_block();
|
||||
|
||||
for i in 1..10 {
|
||||
run_to_block(i);
|
||||
|
||||
let from_a = vec![(1.into(), [i as u8; 32].into())];
|
||||
|
||||
let parent_head = HeadData(if i == 1 {
|
||||
vec![]
|
||||
} else {
|
||||
vec![1, 2, 3]
|
||||
});
|
||||
|
||||
let mut candidate_a = AttestedCandidate {
|
||||
validity_votes: vec![],
|
||||
validator_indices: BitVec::new(),
|
||||
@@ -1890,6 +1915,7 @@ mod tests {
|
||||
collator: Default::default(),
|
||||
signature: Default::default(),
|
||||
head_data: HeadData(vec![1, 2, 3]),
|
||||
parent_head: parent_head.clone(),
|
||||
egress_queue_roots: from_a.clone(),
|
||||
fees: 0,
|
||||
block_data_hash: Default::default(),
|
||||
@@ -1907,6 +1933,7 @@ mod tests {
|
||||
collator: Default::default(),
|
||||
signature: Default::default(),
|
||||
head_data: HeadData(vec![1, 2, 3]),
|
||||
parent_head,
|
||||
egress_queue_roots: from_b.clone(),
|
||||
fees: 0,
|
||||
block_data_hash: Default::default(),
|
||||
@@ -1969,6 +1996,7 @@ mod tests {
|
||||
collator: Default::default(),
|
||||
signature: Default::default(),
|
||||
head_data: HeadData(vec![1, 2, 3]),
|
||||
parent_head: HeadData(vec![4, 5, 6]),
|
||||
egress_queue_roots: Vec::new(),
|
||||
fees: 0,
|
||||
block_data_hash: Default::default(),
|
||||
|
||||
Reference in New Issue
Block a user