mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-01 03:07:56 +00:00
Dispute Coordinator Subsystem (#3150)
* skeleton for dispute-coordinator * add coordinator and participation message types * begin dispute-coordinator DB * functions for loading * implement strongly-typed DB transaction * add some tests for DB transaction * core logic for pruning * guide: update candidate-votes key for coordinator * update candidate-votes key * use big-endian encoding for session, and implement upper bound generator * finish implementing pruning * add a test for note_current_session * define state of the subsystem itself * barebones subsystem definition * control flow * more control flow * implement session-updating logic * trace * control flow for message handling * Update node/core/dispute-coordinator/src/lib.rs Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> * Update node/subsystem/src/messages.rs Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> * some more control flow * guide: remove overlay * more control flow * implement some DB getters * make progress on importing statements * add SignedDisputeStatement struct * move ApprovalVote to shared primitives * add a signing-payload API to explicit dispute statements * add signing-payload to CompactStatement * add relay-parent hash to seconded/valid dispute variatns * correct import * type-safe wrapper around dispute statements * use checked dispute statement in message type * extract rolling session window cache to subsystem-util * extract session window tests * approval-voting: use rolling session info cache * reduce dispute window to match runtime in practice * add byzantine_threshold and supermajority_threshold utilities to primitives * integrate rolling session window * Add PartialOrd to CandidateHash * add Ord to CandidateHash * implement active dispute update * add dispute messages to AllMessages * add dispute stubs to overseer * inform dispute participation to participate * implement issue_local_statement * implement `determine_undisputed_chain` * fix warnings * test harness for dispute coordinator tests * add more helpers to test harness * add some more helpers * some tests for dispute coordinator * ignore wrong validator indices * test finality voting rule constraint * add more tests * add variants to network bridge * fix test compilation * remove most dispute coordinator functionality as of #3222 we can do most of the work within the approval voting subsystem * Revert "remove most dispute coordinator functionality" This reverts commit 9cd615e8eb6ca0b382cbaff525d813e753d6004e. * Use thiserror Co-authored-by: Bernhard Schuster <bernhard@ahoi.io> * Update node/core/dispute-coordinator/src/lib.rs Co-authored-by: Bernhard Schuster <bernhard@ahoi.io> * extract tests to separate module * address nit * adjust run_iteration API Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> Co-authored-by: Bernhard Schuster <bernhard@ahoi.io>
This commit is contained in:
committed by
GitHub
parent
7f344df160
commit
5bc2b2779d
@@ -33,20 +33,19 @@ use polkadot_node_subsystem::{
|
||||
};
|
||||
use polkadot_node_subsystem_util::{
|
||||
metrics::{self, prometheus},
|
||||
rolling_session_window::RollingSessionWindow,
|
||||
};
|
||||
use polkadot_primitives::v1::{
|
||||
ValidatorIndex, Hash, SessionIndex, SessionInfo, CandidateHash,
|
||||
CandidateReceipt, BlockNumber, PersistedValidationData,
|
||||
ValidationCode, CandidateDescriptor, ValidatorPair, ValidatorSignature, ValidatorId,
|
||||
CandidateIndex, GroupIndex,
|
||||
CandidateIndex, GroupIndex, ApprovalVote,
|
||||
};
|
||||
use polkadot_node_primitives::{ValidationResult, PoV};
|
||||
use polkadot_node_primitives::approval::{
|
||||
IndirectAssignmentCert, IndirectSignedApprovalVote, ApprovalVote, DelayTranche,
|
||||
BlockApprovalMeta,
|
||||
IndirectAssignmentCert, IndirectSignedApprovalVote, DelayTranche, BlockApprovalMeta,
|
||||
};
|
||||
use polkadot_node_jaeger as jaeger;
|
||||
use parity_scale_codec::Encode;
|
||||
use sc_keystore::LocalKeystore;
|
||||
use sp_consensus::SyncOracle;
|
||||
use sp_consensus_slots::Slot;
|
||||
@@ -497,7 +496,7 @@ struct ApprovalStatus {
|
||||
}
|
||||
|
||||
struct State<T> {
|
||||
session_window: import::RollingSessionWindow,
|
||||
session_window: RollingSessionWindow,
|
||||
keystore: Arc<LocalKeystore>,
|
||||
slot_duration_millis: u64,
|
||||
db: T,
|
||||
@@ -591,7 +590,7 @@ async fn run<C>(
|
||||
{
|
||||
let (background_tx, background_rx) = mpsc::channel::<BackgroundRequest>(64);
|
||||
let mut state = State {
|
||||
session_window: Default::default(),
|
||||
session_window: RollingSessionWindow::new(APPROVAL_SESSIONS),
|
||||
keystore: subsystem.keystore,
|
||||
slot_duration_millis: subsystem.slot_duration_millis,
|
||||
db: ApprovalDBV1Reader::new(subsystem.db.clone(), subsystem.db_config.clone()),
|
||||
@@ -1226,15 +1225,6 @@ async fn handle_approved_ancestor(
|
||||
Ok(all_approved_max)
|
||||
}
|
||||
|
||||
fn approval_signing_payload(
|
||||
approval_vote: ApprovalVote,
|
||||
session_index: SessionIndex,
|
||||
) -> Vec<u8> {
|
||||
const MAGIC: [u8; 4] = *b"APPR";
|
||||
|
||||
(MAGIC, approval_vote, session_index).encode()
|
||||
}
|
||||
|
||||
// `Option::cmp` treats `None` as less than `Some`.
|
||||
fn min_prefer_some<T: std::cmp::Ord>(
|
||||
a: Option<T>,
|
||||
@@ -1466,10 +1456,8 @@ fn check_and_import_approval<T>(
|
||||
None => respond_early!(ApprovalCheckResult::Bad)
|
||||
};
|
||||
|
||||
let approval_payload = approval_signing_payload(
|
||||
ApprovalVote(approved_candidate_hash),
|
||||
block_entry.session(),
|
||||
);
|
||||
let approval_payload = ApprovalVote(approved_candidate_hash)
|
||||
.signing_payload(block_entry.session());
|
||||
|
||||
let pubkey = match session_info.validators.get(approval.validator.0 as usize) {
|
||||
Some(k) => k,
|
||||
@@ -2147,10 +2135,7 @@ fn sign_approval(
|
||||
) -> Option<ValidatorSignature> {
|
||||
let key = keystore.key_pair::<ValidatorPair>(public).ok().flatten()?;
|
||||
|
||||
let payload = approval_signing_payload(
|
||||
ApprovalVote(candidate_hash),
|
||||
session_index,
|
||||
);
|
||||
let payload = ApprovalVote(candidate_hash).signing_payload(session_index);
|
||||
|
||||
Some(key.sign(&payload[..]))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user