Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 12 additions & 14 deletions node/core/backing/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,10 @@ use polkadot_primitives::v1::{
CommittedCandidateReceipt, BackedCandidate, Id as ParaId, ValidatorId,
ValidatorIndex, SigningContext, PoV,
CandidateDescriptor, AvailableData, ValidatorSignature, Hash, CandidateReceipt,
CandidateCommitments, CoreState, CoreIndex, CollatorId,
CandidateCommitments, CoreState, CoreIndex, CollatorId, ValidationOutputs,
};
use polkadot_node_primitives::{
FromTableMisbehavior, Statement, SignedFullStatement, MisbehaviorReport,
ValidationOutputs, ValidationResult,
FromTableMisbehavior, Statement, SignedFullStatement, MisbehaviorReport, ValidationResult,
};
use polkadot_subsystem::{
messages::{
Expand Down Expand Up @@ -287,7 +286,7 @@ impl CandidateBackingJob {
let candidate_hash = candidate.hash();

let statement = match valid {
ValidationResult::Valid(outputs) => {
ValidationResult::Valid(outputs, validation_data) => {
// make PoV available for later distribution. Send data to the availability
// store to keep. Sign and dispatch `valid` statement to network if we
// have not seconded the given candidate.
Expand All @@ -296,6 +295,7 @@ impl CandidateBackingJob {
// the collator, do not make available and report the collator.
let commitments_check = self.make_pov_available(
pov,
validation_data,
outputs,
|commitments| if commitments.hash() == candidate.commitments_hash {
Ok(CommittedCandidateReceipt {
Expand Down Expand Up @@ -510,10 +510,11 @@ impl CandidateBackingJob {
let v = self.request_candidate_validation(descriptor, pov.clone()).await?;

let statement = match v {
ValidationResult::Valid(outputs) => {
ValidationResult::Valid(outputs, validation_data) => {
// If validation produces a new set of commitments, we vote the candidate as invalid.
let commitments_check = self.make_pov_available(
(&*pov).clone(),
validation_data,
outputs,
|commitments| if commitments == expected_commitments {
Ok(())
Expand Down Expand Up @@ -652,12 +653,13 @@ impl CandidateBackingJob {
async fn make_pov_available<T, E>(
&mut self,
pov: PoV,
validation_data: polkadot_primitives::v1::PersistedValidationData,
outputs: ValidationOutputs,
with_commitments: impl FnOnce(CandidateCommitments) -> Result<T, E>,
) -> Result<Result<T, E>, Error> {
let available_data = AvailableData {
pov,
validation_data: outputs.validation_data,
validation_data,
};

let chunks = erasure_coding::obtain_chunks_v1(
Expand Down Expand Up @@ -1147,12 +1149,11 @@ mod tests {
) if pov == pov && &c == candidate.descriptor() => {
tx.send(Ok(
ValidationResult::Valid(ValidationOutputs {
validation_data: test_state.validation_data.persisted,
head_data: expected_head_data.clone(),
upward_messages: Vec::new(),
fees: Default::default(),
new_validation_code: None,
}),
}, test_state.validation_data.persisted),
)).unwrap();
}
);
Expand Down Expand Up @@ -1267,12 +1268,11 @@ mod tests {
) if pov == pov && &c == candidate_a.descriptor() => {
tx.send(Ok(
ValidationResult::Valid(ValidationOutputs {
validation_data: test_state.validation_data.persisted,
head_data: expected_head_data.clone(),
upward_messages: Vec::new(),
fees: Default::default(),
new_validation_code: None,
}),
}, test_state.validation_data.persisted),
)).unwrap();
}
);
Expand Down Expand Up @@ -1406,12 +1406,11 @@ mod tests {
) if pov == pov && &c == candidate_a.descriptor() => {
tx.send(Ok(
ValidationResult::Valid(ValidationOutputs {
validation_data: test_state.validation_data.persisted,
head_data: expected_head_data.clone(),
upward_messages: Vec::new(),
fees: Default::default(),
new_validation_code: None,
}),
}, test_state.validation_data.persisted),
)).unwrap();
}
);
Expand Down Expand Up @@ -1562,12 +1561,11 @@ mod tests {
) if pov == pov && &c == candidate_b.descriptor() => {
tx.send(Ok(
ValidationResult::Valid(ValidationOutputs {
validation_data: test_state.validation_data.persisted,
head_data: expected_head_data.clone(),
upward_messages: Vec::new(),
fees: Default::default(),
new_validation_code: None,
}),
}, test_state.validation_data.persisted),
)).unwrap();
}
);
Expand Down
29 changes: 17 additions & 12 deletions node/core/candidate-selection/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,10 @@ async fn candidate_is_valid_inner(
CandidateValidationMessage::ValidateFromChainState(candidate_descriptor, pov, tx),
))
.await?;
Ok(std::matches!(rx.await, Ok(Ok(ValidationResult::Valid(_)))))
Ok(std::matches!(
rx.await,
Ok(Ok(ValidationResult::Valid(_, _)))
))
}

async fn second_candidate(
Expand Down Expand Up @@ -445,8 +448,7 @@ delegated_subsystem!(CandidateSelectionJob((), Metrics) <- ToJob as CandidateSel
mod tests {
use super::*;
use futures::lock::Mutex;
use polkadot_node_primitives::ValidationOutputs;
use polkadot_primitives::v1::{BlockData, HeadData, PersistedValidationData};
use polkadot_primitives::v1::{BlockData, HeadData, PersistedValidationData, ValidationOutputs};
use sp_core::crypto::Public;

fn test_harness<Preconditions, TestBuilder, Test, Postconditions>(
Expand Down Expand Up @@ -478,25 +480,27 @@ mod tests {
postconditions(job, job_result);
}

fn default_validation_outputs() -> ValidationOutputs {
fn default_validation_outputs_and_data() -> (ValidationOutputs, polkadot_primitives::v1::PersistedValidationData) {
let head_data: Vec<u8> = (0..32).rev().cycle().take(256).collect();
let parent_head_data = head_data
.iter()
.copied()
.map(|x| x.saturating_sub(1))
.collect();

ValidationOutputs {
head_data: HeadData(head_data),
validation_data: PersistedValidationData {
(
ValidationOutputs {
head_data: HeadData(head_data),
upward_messages: Vec::new(),
fees: 0,
new_validation_code: None,
},
PersistedValidationData {
parent_head: HeadData(parent_head_data),
block_number: 123,
hrmp_mqc_heads: Vec::new(),
},
upward_messages: Vec::new(),
fees: 0,
new_validation_code: None,
}
)
}

/// when nothing is seconded so far, the collation is fetched and seconded
Expand Down Expand Up @@ -556,8 +560,9 @@ mod tests {
assert_eq!(got_candidate_descriptor, candidate_receipt.descriptor);
assert_eq!(got_pov.as_ref(), &pov);

let (outputs, data) = default_validation_outputs_and_data();
return_sender
.send(Ok(ValidationResult::Valid(default_validation_outputs())))
.send(Ok(ValidationResult::Valid(outputs, data)))
.unwrap();
}
FromJob::Backing(CandidateBackingMessage::Second(
Expand Down
Loading