Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PVF: drop backing jobs if it is too late #5616

Merged
merged 123 commits into from
Nov 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
123 commits
Select commit Hold shift + click to select a range
ff40792
Add execution priority
AndreiEres Jun 19, 2024
fca9a11
Move priority to PendingExecutionRequest
AndreiEres Jun 19, 2024
7ec65f8
Update candidate validation
AndreiEres Jun 19, 2024
0d0926a
Add scheduling logic
AndreiEres Jun 20, 2024
f9bf225
Rename PreparePriority
AndreiEres Jun 20, 2024
fc7f27a
Set low priority for backing
AndreiEres Jun 20, 2024
9b8a5e9
Add additional option for disputes
AndreiEres Jun 25, 2024
610f0cc
Fix clippy
AndreiEres Jun 25, 2024
507113c
Fix types
AndreiEres Jun 25, 2024
3fbecab
Fix type
AndreiEres Jun 25, 2024
9192602
Update polkadot/node/core/pvf/src/priority.rs
AndreiEres Jun 26, 2024
bafb6c2
Update
AndreiEres Jun 26, 2024
0c1edcf
Update logic
AndreiEres Jul 10, 2024
7442c99
Fix
AndreiEres Jul 10, 2024
cb13533
Fix
AndreiEres Jul 10, 2024
4ec2e5e
Fix
AndreiEres Jul 11, 2024
b70c247
Assign system backing
AndreiEres Jul 17, 2024
2dfbffc
Replace probability with counter
AndreiEres Jul 18, 2024
7e40ef6
Merge branch 'master' into AndreiEres/pvf-execution-priority
AndreiEres Jul 19, 2024
98a4e64
Update iteration
AndreiEres Jul 19, 2024
5060a81
Update description
AndreiEres Jul 19, 2024
7e071f6
Add logging
AndreiEres Jul 19, 2024
34b6363
Update
AndreiEres Jul 22, 2024
531629d
Fix clippy warning
AndreiEres Jul 23, 2024
2b05b64
Merge branch 'master' into AndreiEres/pvf-execution-priority
AndreiEres Jul 23, 2024
c2e791c
Merge branch 'master' into AndreiEres/pvf-execution-priority
AndreiEres Jul 23, 2024
59b74bf
Update tests
AndreiEres Jul 23, 2024
b261cc5
Rename PreparePriority back
AndreiEres Jul 25, 2024
e7223fe
Fix docs
AndreiEres Jul 25, 2024
d3d55d6
Update logic and explanations
AndreiEres Jul 25, 2024
dc78fec
Update logic
AndreiEres Jul 25, 2024
a9e628c
Add metrics
AndreiEres Jul 25, 2024
25170af
Update nits
AndreiEres Jul 30, 2024
78279e8
Update tests
AndreiEres Jul 30, 2024
2b2fedf
Add debug
AndreiEres Jul 30, 2024
69a1043
Show how ordering works in a testcase
AndreiEres Jul 31, 2024
880b133
Add nits
AndreiEres Aug 7, 2024
cb7de40
Merge branch 'master' into AndreiEres/pvf-execution-priority
AndreiEres Aug 8, 2024
20bc090
Merge branch 'master' into AndreiEres/pvf-execution-priority
AndreiEres Aug 22, 2024
ebcfffe
Fix errors after conflicts resolving
AndreiEres Aug 22, 2024
602daaa
Merge branch 'master' into AndreiEres/pvf-execution-priority
AndreiEres Aug 26, 2024
afab63e
Fix errors after conflicts resolving
AndreiEres Aug 26, 2024
01f0659
Merge branch 'master' into AndreiEres/pvf-execution-priority
AndreiEres Sep 4, 2024
d9c118f
Fix imports
AndreiEres Sep 4, 2024
eceb060
Scaffold the solution
AndreiEres Sep 6, 2024
c3f08c5
Calculate real deadline
AndreiEres Sep 6, 2024
9068b8f
Fix warning
AndreiEres Sep 11, 2024
6798870
Add debug
AndreiEres Sep 12, 2024
e456a5a
Merge branch 'master' into AndreiEres/pvf-execution-priority
AndreiEres Sep 13, 2024
3f97c59
Merge branch 'AndreiEres/pvf-execution-priority' into AndreiEres/issu…
AndreiEres Sep 13, 2024
56ddc4c
Add pr doc
AndreiEres Sep 17, 2024
7261b9b
Update PR doc
AndreiEres Sep 17, 2024
c2c4704
Update PR doc
AndreiEres Sep 17, 2024
0bfef59
Update PR doc
AndreiEres Sep 17, 2024
1478b18
Address comments
AndreiEres Sep 20, 2024
df2ee37
Merge remote-tracking branch 'origin/master' into AndreiEres/pvf-exec…
AndreiEres Sep 20, 2024
0812542
Update lockfile
AndreiEres Sep 20, 2024
b979bb5
Add prdoc
AndreiEres Sep 20, 2024
54c2812
Update prdoc
AndreiEres Sep 20, 2024
6ce2f5a
Update prdoc
AndreiEres Sep 20, 2024
6924446
Merge branch 'master' into AndreiEres/pvf-execution-priority
AndreiEres Sep 23, 2024
7f743e9
Fix tests
AndreiEres Sep 24, 2024
632b996
Merge branch 'AndreiEres/pvf-execution-priority' into AndreiEres/issu…
AndreiEres Sep 25, 2024
9808c3e
Fix exec_deadline in the past
AndreiEres Sep 27, 2024
c29383b
Revert "Fix tests"
AndreiEres Sep 27, 2024
568830c
Try assigning the job again if the deadline has been exceeded.
AndreiEres Oct 1, 2024
c52675e
Add tests
AndreiEres Oct 1, 2024
c19bba4
Add dynamic exec deadline
AndreiEres Oct 2, 2024
94f242c
fix up
AndreiEres Oct 2, 2024
59b1a5d
fix up
AndreiEres Oct 2, 2024
3da2890
fix up
AndreiEres Oct 2, 2024
2a61500
Fix tests
AndreiEres Oct 2, 2024
b1d065b
Fix nits
AndreiEres Oct 4, 2024
8bbce8d
Add additional tests
AndreiEres Oct 4, 2024
7b577b5
Rename PvfExecPriority -> PvfExecKind
AndreiEres Oct 9, 2024
191dd44
Merge branch 'master' into AndreiEres/pvf-execution-priority
AndreiEres Oct 9, 2024
d630b34
Fix renaming
AndreiEres Oct 9, 2024
6964069
Rename execute_priority -> exec_kind
AndreiEres Oct 9, 2024
314aa19
Fix minimal-example
AndreiEres Oct 9, 2024
83c5f57
Merge branch 'AndreiEres/pvf-execution-priority' into AndreiEres/issu…
AndreiEres Oct 9, 2024
40dbd8e
Fix imports
AndreiEres Oct 9, 2024
4249b24
Merge branch 'AndreiEres/pvf-execution-priority' into AndreiEres/issu…
AndreiEres Oct 9, 2024
41f2cb9
Merge branch 'master' into AndreiEres/issue5530
AndreiEres Oct 10, 2024
16d9b03
Fix missing ttl
AndreiEres Oct 10, 2024
f1cda91
Fix PvfExecKind
AndreiEres Oct 10, 2024
140268e
Update prdoc
AndreiEres Oct 10, 2024
1e163c6
Fix fmt
AndreiEres Oct 10, 2024
2873f7f
Remove ttl from ValidateFromExhaustive
AndreiEres Oct 10, 2024
d6e0630
Use ttl as BlockNumber
AndreiEres Oct 10, 2024
b45c9e3
Add active leaf to execute queue
AndreiEres Oct 11, 2024
18e94c5
Remove leftovers
AndreiEres Oct 11, 2024
bfe677d
Fix error
AndreiEres Oct 11, 2024
210a3dd
Update docs
AndreiEres Oct 11, 2024
8f00e86
Add ttl to PvfExecKind
AndreiEres Oct 11, 2024
ecfef63
Rename update_best_block
AndreiEres Oct 15, 2024
b972d83
Polish
AndreiEres Oct 15, 2024
65a0c1e
Fix errors
AndreiEres Oct 15, 2024
e86d71e
Fix Errors
AndreiEres Oct 15, 2024
df2720c
Fix errors
AndreiEres Oct 15, 2024
bd65553
Address review comments
AndreiEres Oct 17, 2024
690e508
Merge branch 'master' into AndreiEres/issue5530
AndreiEres Nov 4, 2024
3475e02
Fix matching
AndreiEres Nov 4, 2024
249e7b8
Fix exec kind
AndreiEres Nov 4, 2024
429f683
Fix fmt
AndreiEres Nov 4, 2024
7a2099f
Add fork tracking
AndreiEres Nov 4, 2024
673abeb
Fix request_candidate_validation
AndreiEres Nov 4, 2024
25c5ecd
Fix types
AndreiEres Nov 4, 2024
f7605fa
Fix deadline
AndreiEres Nov 4, 2024
182d2ad
Fix
AndreiEres Nov 5, 2024
26bf737
Fix
AndreiEres Nov 5, 2024
ef2e81b
Fix
AndreiEres Nov 5, 2024
282088a
Increase ancestors depth
AndreiEres Nov 5, 2024
f5a0b65
Update get_block_ancestors
AndreiEres Nov 6, 2024
4c4732a
Update pr doc
AndreiEres Nov 6, 2024
f309750
Address the feedback
AndreiEres Nov 6, 2024
138c803
Address feedback
AndreiEres Nov 6, 2024
39e31a0
Test pruning
AndreiEres Nov 6, 2024
1ef4bed
Remove not relevant test
AndreiEres Nov 6, 2024
aa102f7
Fix clippy
AndreiEres Nov 6, 2024
d15226e
Update
AndreiEres Nov 6, 2024
9ada1ad
Update
AndreiEres Nov 6, 2024
bcfba8d
Merge branch 'master' into AndreiEres/issue5530
bkontur Nov 6, 2024
b0189ee
Address feedback
AndreiEres Nov 7, 2024
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
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions polkadot/node/core/backing/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -632,6 +632,7 @@ async fn request_candidate_validation(
) -> Result<ValidationResult, Error> {
let (tx, rx) = oneshot::channel();
let is_system = candidate_receipt.descriptor.para_id().is_system();
let relay_parent = candidate_receipt.descriptor.relay_parent();

sender
.send_message(CandidateValidationMessage::ValidateFromExhaustive {
Expand All @@ -641,9 +642,9 @@ async fn request_candidate_validation(
pov,
executor_params,
exec_kind: if is_system {
PvfExecKind::BackingSystemParas
PvfExecKind::BackingSystemParas(relay_parent)
} else {
PvfExecKind::Backing
PvfExecKind::Backing(relay_parent)
},
response_sender: tx,
})
Expand Down
20 changes: 10 additions & 10 deletions polkadot/node/core/backing/src/tests/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,7 @@ async fn assert_validate_from_exhaustive(
) if validation_data == *assert_pvd &&
validation_code == *assert_validation_code &&
*pov == *assert_pov && candidate_receipt.descriptor == assert_candidate.descriptor &&
exec_kind == PvfExecKind::BackingSystemParas &&
matches!(exec_kind, PvfExecKind::BackingSystemParas(_)) &&
candidate_receipt.commitments_hash == assert_candidate.commitments.hash() =>
{
response_sender.send(Ok(ValidationResult::Valid(
Expand Down Expand Up @@ -652,7 +652,7 @@ fn backing_works(#[case] elastic_scaling_mvp: bool) {
) if validation_data == pvd_ab &&
validation_code == validation_code_ab &&
*pov == pov_ab && candidate_receipt.descriptor == candidate_a.descriptor &&
exec_kind == PvfExecKind::BackingSystemParas &&
matches!(exec_kind, PvfExecKind::BackingSystemParas(_)) &&
candidate_receipt.commitments_hash == candidate_a_commitments_hash =>
{
response_sender.send(Ok(
Expand Down Expand Up @@ -1288,7 +1288,7 @@ fn backing_works_while_validation_ongoing() {
) if validation_data == pvd_abc &&
validation_code == validation_code_abc &&
*pov == pov_abc && candidate_receipt.descriptor == candidate_a.descriptor &&
exec_kind == PvfExecKind::BackingSystemParas &&
matches!(exec_kind, PvfExecKind::BackingSystemParas(_)) &&
candidate_a_commitments_hash == candidate_receipt.commitments_hash =>
{
// we never validate the candidate. our local node
Expand Down Expand Up @@ -1455,7 +1455,7 @@ fn backing_misbehavior_works() {
) if validation_data == pvd_a &&
validation_code == validation_code_a &&
*pov == pov_a && candidate_receipt.descriptor == candidate_a.descriptor &&
exec_kind == PvfExecKind::BackingSystemParas &&
matches!(exec_kind, PvfExecKind::BackingSystemParas(_)) &&
candidate_a_commitments_hash == candidate_receipt.commitments_hash =>
{
response_sender.send(Ok(
Expand Down Expand Up @@ -1622,7 +1622,7 @@ fn backing_dont_second_invalid() {
) if validation_data == pvd_a &&
validation_code == validation_code_a &&
*pov == pov_block_a && candidate_receipt.descriptor == candidate_a.descriptor &&
exec_kind == PvfExecKind::BackingSystemParas &&
matches!(exec_kind, PvfExecKind::BackingSystemParas(_)) &&
candidate_a.commitments.hash() == candidate_receipt.commitments_hash =>
{
response_sender.send(Ok(ValidationResult::Invalid(InvalidCandidate::BadReturn))).unwrap();
Expand Down Expand Up @@ -1662,7 +1662,7 @@ fn backing_dont_second_invalid() {
) if validation_data == pvd_b &&
validation_code == validation_code_b &&
*pov == pov_block_b && candidate_receipt.descriptor == candidate_b.descriptor &&
exec_kind == PvfExecKind::BackingSystemParas &&
matches!(exec_kind, PvfExecKind::BackingSystemParas(_)) &&
candidate_b.commitments.hash() == candidate_receipt.commitments_hash =>
{
response_sender.send(Ok(
Expand Down Expand Up @@ -1789,7 +1789,7 @@ fn backing_second_after_first_fails_works() {
) if validation_data == pvd_a &&
validation_code == validation_code_a &&
*pov == pov_a && candidate_receipt.descriptor == candidate.descriptor &&
exec_kind == PvfExecKind::BackingSystemParas &&
matches!(exec_kind, PvfExecKind::BackingSystemParas(_)) &&
candidate.commitments.hash() == candidate_receipt.commitments_hash =>
{
response_sender.send(Ok(ValidationResult::Invalid(InvalidCandidate::BadReturn))).unwrap();
Expand Down Expand Up @@ -1933,7 +1933,7 @@ fn backing_works_after_failed_validation() {
) if validation_data == pvd_a &&
validation_code == validation_code_a &&
*pov == pov_a && candidate_receipt.descriptor == candidate.descriptor &&
exec_kind == PvfExecKind::BackingSystemParas &&
matches!(exec_kind, PvfExecKind::BackingSystemParas(_)) &&
candidate.commitments.hash() == candidate_receipt.commitments_hash =>
{
response_sender.send(Err(ValidationFailed("Internal test error".into()))).unwrap();
Expand Down Expand Up @@ -2212,7 +2212,7 @@ fn retry_works() {
) if validation_data == pvd_a &&
validation_code == validation_code_a &&
*pov == pov_a && candidate_receipt.descriptor == candidate.descriptor &&
exec_kind == PvfExecKind::BackingSystemParas &&
matches!(exec_kind, PvfExecKind::BackingSystemParas(_)) &&
candidate.commitments.hash() == candidate_receipt.commitments_hash
);
virtual_overseer
Expand Down Expand Up @@ -2754,7 +2754,7 @@ fn validator_ignores_statements_from_disabled_validators() {
) if validation_data == pvd &&
validation_code == expected_validation_code &&
*pov == expected_pov && candidate_receipt.descriptor == candidate.descriptor &&
exec_kind == PvfExecKind::BackingSystemParas &&
matches!(exec_kind, PvfExecKind::BackingSystemParas(_)) &&
candidate_commitments_hash == candidate_receipt.commitments_hash =>
{
response_sender.send(Ok(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ async fn assert_validate_seconded_candidate(
&validation_code == assert_validation_code &&
&*pov == assert_pov &&
candidate_receipt.descriptor == candidate.descriptor &&
exec_kind == PvfExecKind::BackingSystemParas &&
matches!(exec_kind, PvfExecKind::BackingSystemParas(_)) &&
candidate.commitments.hash() == candidate_receipt.commitments_hash =>
{
response_sender.send(Ok(ValidationResult::Valid(
Expand Down
106 changes: 99 additions & 7 deletions polkadot/node/core/candidate-validation/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,16 @@ use polkadot_node_primitives::{InvalidCandidate, PoV, ValidationResult};
use polkadot_node_subsystem::{
errors::RuntimeApiError,
messages::{
CandidateValidationMessage, PreCheckOutcome, PvfExecKind, RuntimeApiMessage,
RuntimeApiRequest, ValidationFailed,
CandidateValidationMessage, ChainApiMessage, PreCheckOutcome, PvfExecKind,
RuntimeApiMessage, RuntimeApiRequest, ValidationFailed,
},
overseer, FromOrchestra, OverseerSignal, SpawnedSubsystem, SubsystemError, SubsystemResult,
SubsystemSender,
};
use polkadot_node_subsystem_util::{self as util, runtime::ClaimQueueSnapshot};
use polkadot_node_subsystem_util::{
self as util,
runtime::{prospective_parachains_mode, ClaimQueueSnapshot, ProspectiveParachainsMode},
};
use polkadot_overseer::ActiveLeavesUpdate;
use polkadot_parachain_primitives::primitives::ValidationResult as WasmValidationResult;
use polkadot_primitives::{
Expand Down Expand Up @@ -279,6 +282,7 @@ async fn run<Context>(
comm = ctx.recv().fuse() => {
match comm {
Ok(FromOrchestra::Signal(OverseerSignal::ActiveLeaves(update))) => {
update_active_leaves(ctx.sender(), validation_host.clone(), update.clone()).await;
maybe_prepare_validation(ctx.sender(), keystore.clone(), validation_host.clone(), update, &mut prepare_state).await;
},
Ok(FromOrchestra::Signal(OverseerSignal::BlockFinalized(..))) => {},
Expand Down Expand Up @@ -551,6 +555,66 @@ where
Some(processed_code_hashes)
}

async fn update_active_leaves<Sender>(
sender: &mut Sender,
mut validation_backend: impl ValidationBackend,
AndreiEres marked this conversation as resolved.
Show resolved Hide resolved
update: ActiveLeavesUpdate,
) where
Sender: SubsystemSender<ChainApiMessage> + SubsystemSender<RuntimeApiMessage>,
{
let ancestors = get_block_ancestors(sender, update.activated.as_ref().map(|x| x.hash)).await;
if let Err(err) = validation_backend.update_active_leaves(update, ancestors).await {
gum::warn!(
target: LOG_TARGET,
?err,
"cannot update active leaves in validation backend",
);
};
}

async fn get_allowed_ancestry_len<Sender>(sender: &mut Sender, relay_parent: Hash) -> Option<usize>
where
Sender: SubsystemSender<ChainApiMessage> + SubsystemSender<RuntimeApiMessage>,
{
match prospective_parachains_mode(sender, relay_parent).await {
AndreiEres marked this conversation as resolved.
Show resolved Hide resolved
Ok(ProspectiveParachainsMode::Enabled { allowed_ancestry_len, .. }) =>
Some(allowed_ancestry_len),
res => {
gum::warn!(target: LOG_TARGET, ?res, "async backing is disabled");
None
},
}
}

async fn get_block_ancestors<Sender>(
sender: &mut Sender,
maybe_relay_parent: Option<Hash>,
) -> Vec<Hash>
where
Sender: SubsystemSender<ChainApiMessage> + SubsystemSender<RuntimeApiMessage>,
{
let Some(relay_parent) = maybe_relay_parent else { return vec![] };
let Some(allowed_ancestry_len) = get_allowed_ancestry_len(sender, relay_parent).await else {
return vec![]
};

let (tx, rx) = oneshot::channel();
sender
.send_message(ChainApiMessage::Ancestors {
hash: relay_parent,
k: allowed_ancestry_len,
response_channel: tx,
})
.await;
match rx.await {
Ok(Ok(x)) => x,
res => {
gum::warn!(target: LOG_TARGET, ?res, "cannot request ancestors");
vec![]
},
}
}

struct RuntimeRequestFailed;

async fn runtime_api_request<T, Sender>(
Expand Down Expand Up @@ -698,7 +762,7 @@ async fn validate_candidate_exhaustive(

// We only check the session index for backing.
match (exec_kind, candidate_receipt.descriptor.session_index()) {
(PvfExecKind::Backing | PvfExecKind::BackingSystemParas, Some(session_index)) => {
(PvfExecKind::Backing(_) | PvfExecKind::BackingSystemParas(_), Some(session_index)) => {
let Some(expected_session_index) = maybe_expected_session_index else {
let error = "cannot fetch session index from the runtime";
gum::warn!(
Expand Down Expand Up @@ -731,7 +795,7 @@ async fn validate_candidate_exhaustive(
let result = match exec_kind {
// Retry is disabled to reduce the chance of nondeterministic blocks getting backed and
// honest backers getting slashed.
PvfExecKind::Backing | PvfExecKind::BackingSystemParas => {
PvfExecKind::Backing(_) | PvfExecKind::BackingSystemParas(_) => {
let prep_timeout = pvf_prep_timeout(&executor_params, PvfPrepKind::Prepare);
let exec_timeout = pvf_exec_timeout(&executor_params, exec_kind.into());
let pvf = PvfPrepData::from_code(
Expand Down Expand Up @@ -809,6 +873,15 @@ async fn validate_candidate_exhaustive(
);
Err(ValidationFailed(e.to_string()))
},
Err(e @ ValidationError::ExecutionDeadline) => {
gum::warn!(
target: LOG_TARGET,
?para_id,
?e,
"Job assigned too late, execution queue probably overloaded",
);
Err(ValidationFailed(e.to_string()))
},
Ok(res) =>
if res.head_data.hash() != candidate_receipt.descriptor.para_head() {
gum::info!(target: LOG_TARGET, ?para_id, "Invalid candidate (para_head)");
Expand Down Expand Up @@ -846,7 +919,7 @@ async fn validate_candidate_exhaustive(
// descriptor core index.
(
Some(_core_index),
PvfExecKind::Backing | PvfExecKind::BackingSystemParas,
PvfExecKind::Backing(_) | PvfExecKind::BackingSystemParas(_),
) => {
let Some(claim_queue) = maybe_claim_queue else {
let error = "cannot fetch the claim queue from the runtime";
Expand Down Expand Up @@ -994,7 +1067,12 @@ trait ValidationBackend {
retry_immediately = true;
},

Ok(_) | Err(ValidationError::Invalid(_) | ValidationError::Preparation(_)) => break,
Ok(_) |
Err(
ValidationError::Invalid(_) |
ValidationError::Preparation(_) |
ValidationError::ExecutionDeadline,
) => break,
}

// If we got a possibly transient error, retry once after a brief delay, on the
Expand Down Expand Up @@ -1035,6 +1113,12 @@ trait ValidationBackend {
async fn precheck_pvf(&mut self, pvf: PvfPrepData) -> Result<(), PrepareError>;

async fn heads_up(&mut self, active_pvfs: Vec<PvfPrepData>) -> Result<(), String>;

async fn update_active_leaves(
&mut self,
update: ActiveLeavesUpdate,
ancestors: Vec<Hash>,
) -> Result<(), String>;
}

#[async_trait]
Expand Down Expand Up @@ -1085,6 +1169,14 @@ impl ValidationBackend for ValidationHost {
async fn heads_up(&mut self, active_pvfs: Vec<PvfPrepData>) -> Result<(), String> {
self.heads_up(active_pvfs).await
}

async fn update_active_leaves(
&mut self,
update: ActiveLeavesUpdate,
ancestors: Vec<Hash>,
) -> Result<(), String> {
self.update_active_leaves(update, ancestors).await
}
}

/// Does basic checks of a candidate. Provide the encoded PoV-block. Returns `Ok` if basic checks
Expand Down
Loading
Loading