Add candidate info to OccupiedCore (#2134)

* guide: add candidate information to OccupiedCore

* add descriptor and hash to occupied core type

* guide: add candidate hash to inclusion

* runtime: return candidate info in core state

* bitfield signing: stop querying runtime as much

* minimize going to runtime in availability distribution

* fix availability distribution tests

* guide: remove para ID from Occupied core

* get all crates compiling
This commit is contained in:
Robert Habermeier
2020-12-18 03:20:37 -05:00
committed by GitHub
parent eab86d6f4b
commit 38276b08a4
15 changed files with 129 additions and 208 deletions
+29 -1
View File
@@ -25,7 +25,7 @@ use primitives::v1::{
ValidatorId, CandidateCommitments, CandidateDescriptor, ValidatorIndex, Id as ParaId,
AvailabilityBitfield as AvailabilityBitfield, SignedAvailabilityBitfields, SigningContext,
BackedCandidate, CoreIndex, GroupIndex, CommittedCandidateReceipt,
CandidateReceipt, HeadData,
CandidateReceipt, HeadData, CandidateHash,
};
use frame_support::{
decl_storage, decl_module, decl_error, decl_event, ensure, debug,
@@ -58,6 +58,8 @@ pub struct AvailabilityBitfieldRecord<N> {
pub struct CandidatePendingAvailability<H, N> {
/// The availability core this is assigned to.
core: CoreIndex,
/// The candidate hash.
hash: CandidateHash,
/// The candidate descriptor.
descriptor: CandidateDescriptor<H>,
/// The received availability votes. One bit per validator.
@@ -85,6 +87,16 @@ impl<H, N> CandidatePendingAvailability<H, N> {
pub(crate) fn core_occupied(&self)-> CoreIndex {
self.core.clone()
}
/// Get the candidate hash.
pub(crate) fn candidate_hash(&self) -> CandidateHash {
self.hash
}
/// Get the canddiate descriptor.
pub(crate) fn candidate_descriptor(&self) -> &CandidateDescriptor<H> {
&self.descriptor
}
}
/// A hook for applying validator rewards
@@ -568,6 +580,8 @@ impl<T: Config> Module<T> {
candidate.candidate.commitments.head_data.clone(),
));
let candidate_hash = candidate.candidate.hash();
let (descriptor, commitments) = (
candidate.candidate.descriptor,
candidate.candidate.commitments,
@@ -575,6 +589,7 @@ impl<T: Config> Module<T> {
<PendingAvailability<T>>::insert(&para_id, CandidatePendingAvailability {
core,
hash: candidate_hash,
descriptor,
availability_votes,
relay_parent_number: check_cx.relay_parent_number,
@@ -1112,6 +1127,7 @@ mod tests {
let default_candidate = TestCandidateBuilder::default().build();
<PendingAvailability<Test>>::insert(chain_a, CandidatePendingAvailability {
core: CoreIndex::from(0),
hash: default_candidate.hash(),
descriptor: default_candidate.descriptor.clone(),
availability_votes: default_availability_votes(),
relay_parent_number: 0,
@@ -1122,6 +1138,7 @@ mod tests {
<PendingAvailability<Test>>::insert(&chain_b, CandidatePendingAvailability {
core: CoreIndex::from(1),
hash: default_candidate.hash(),
descriptor: default_candidate.descriptor,
availability_votes: default_availability_votes(),
relay_parent_number: 0,
@@ -1286,6 +1303,7 @@ mod tests {
let default_candidate = TestCandidateBuilder::default().build();
<PendingAvailability<Test>>::insert(chain_a, CandidatePendingAvailability {
core: CoreIndex::from(0),
hash: default_candidate.hash(),
descriptor: default_candidate.descriptor,
availability_votes: default_availability_votes(),
relay_parent_number: 0,
@@ -1321,6 +1339,7 @@ mod tests {
let default_candidate = TestCandidateBuilder::default().build();
<PendingAvailability<Test>>::insert(chain_a, CandidatePendingAvailability {
core: CoreIndex::from(0),
hash: default_candidate.hash(),
descriptor: default_candidate.descriptor,
availability_votes: default_availability_votes(),
relay_parent_number: 0,
@@ -1393,6 +1412,7 @@ mod tests {
<PendingAvailability<Test>>::insert(chain_a, CandidatePendingAvailability {
core: CoreIndex::from(0),
hash: candidate_a.hash(),
descriptor: candidate_a.descriptor,
availability_votes: default_availability_votes(),
relay_parent_number: 0,
@@ -1409,6 +1429,7 @@ mod tests {
<PendingAvailability<Test>>::insert(chain_b, CandidatePendingAvailability {
core: CoreIndex::from(1),
hash: candidate_b.hash(),
descriptor: candidate_b.descriptor,
availability_votes: default_availability_votes(),
relay_parent_number: 0,
@@ -1839,6 +1860,7 @@ mod tests {
let candidate = TestCandidateBuilder::default().build();
<PendingAvailability<Test>>::insert(&chain_a, CandidatePendingAvailability {
core: CoreIndex::from(0),
hash: candidate.hash(),
descriptor: candidate.descriptor,
availability_votes: default_availability_votes(),
relay_parent_number: 3,
@@ -2127,6 +2149,7 @@ mod tests {
<PendingAvailability<Test>>::get(&chain_a),
Some(CandidatePendingAvailability {
core: CoreIndex::from(0),
hash: candidate_a.hash(),
descriptor: candidate_a.descriptor,
availability_votes: default_availability_votes(),
relay_parent_number: System::block_number() - 1,
@@ -2143,6 +2166,7 @@ mod tests {
<PendingAvailability<Test>>::get(&chain_b),
Some(CandidatePendingAvailability {
core: CoreIndex::from(1),
hash: candidate_b.hash(),
descriptor: candidate_b.descriptor,
availability_votes: default_availability_votes(),
relay_parent_number: System::block_number() - 1,
@@ -2159,6 +2183,7 @@ mod tests {
<PendingAvailability<Test>>::get(&thread_a),
Some(CandidatePendingAvailability {
core: CoreIndex::from(2),
hash: candidate_c.hash(),
descriptor: candidate_c.descriptor,
availability_votes: default_availability_votes(),
relay_parent_number: System::block_number() - 1,
@@ -2254,6 +2279,7 @@ mod tests {
<PendingAvailability<Test>>::get(&chain_a),
Some(CandidatePendingAvailability {
core: CoreIndex::from(0),
hash: candidate_a.hash(),
descriptor: candidate_a.descriptor,
availability_votes: default_availability_votes(),
relay_parent_number: System::block_number() - 1,
@@ -2329,6 +2355,7 @@ mod tests {
let candidate = TestCandidateBuilder::default().build();
<PendingAvailability<Test>>::insert(&chain_a, CandidatePendingAvailability {
core: CoreIndex::from(0),
hash: candidate.hash(),
descriptor: candidate.descriptor.clone(),
availability_votes: default_availability_votes(),
relay_parent_number: 5,
@@ -2339,6 +2366,7 @@ mod tests {
<PendingAvailability<Test>>::insert(&chain_b, CandidatePendingAvailability {
core: CoreIndex::from(1),
hash: candidate.hash(),
descriptor: candidate.descriptor,
availability_votes: default_availability_votes(),
relay_parent_number: 6,
@@ -46,7 +46,7 @@ pub fn validator_groups<T: initializer::Config>() -> (
}
/// Implementation for the `availability_cores` function of the runtime API.
pub fn availability_cores<T: initializer::Config>() -> Vec<CoreState<T::BlockNumber>> {
pub fn availability_cores<T: initializer::Config>() -> Vec<CoreState<T::Hash, T::BlockNumber>> {
let cores = <scheduler::Module<T>>::availability_cores();
let parachains = <paras::Module<T>>::parachains();
let config = <configuration::Module<T>>::config();
@@ -96,7 +96,6 @@ pub fn availability_cores<T: initializer::Config>() -> Vec<CoreState<T::BlockNum
let backed_in_number = pending_availability.backed_in_number().clone();
OccupiedCore {
para_id,
next_up_on_available: <scheduler::Module<T>>::next_up_on_available(
CoreIndex(i as u32)
),
@@ -113,6 +112,8 @@ pub fn availability_cores<T: initializer::Config>() -> Vec<CoreState<T::BlockNum
backed_in_number,
pending_availability.core_occupied(),
),
candidate_hash: pending_availability.candidate_hash(),
candidate_descriptor: pending_availability.candidate_descriptor().clone(),
}
}
CoreOccupied::Parathread(p) => {
@@ -123,7 +124,6 @@ pub fn availability_cores<T: initializer::Config>() -> Vec<CoreState<T::BlockNum
let backed_in_number = pending_availability.backed_in_number().clone();
OccupiedCore {
para_id,
next_up_on_available: <scheduler::Module<T>>::next_up_on_available(
CoreIndex(i as u32)
),
@@ -140,6 +140,8 @@ pub fn availability_cores<T: initializer::Config>() -> Vec<CoreState<T::BlockNum
backed_in_number,
pending_availability.core_occupied(),
),
candidate_hash: pending_availability.candidate_hash(),
candidate_descriptor: pending_availability.candidate_descriptor().clone(),
}
}
})