pub enum DisputeCoordinatorMessage {
ImportStatements {
candidate_receipt: CandidateReceiptV2,
session: u32,
statements: Vec<(SignedDisputeStatement, ValidatorIndex)>,
pending_confirmation: Option<Sender<ImportStatementsResult>>,
},
RecentDisputes(Sender<Vec<(u32, CandidateHash, DisputeStatus)>>),
ActiveDisputes(Sender<Vec<(u32, CandidateHash, DisputeStatus)>>),
QueryCandidateVotes(Vec<(u32, CandidateHash)>, Sender<Vec<(u32, CandidateHash, CandidateVotes)>>),
IssueLocalStatement(u32, CandidateHash, CandidateReceiptV2, bool),
DetermineUndisputedChain {
base: (u32, H256),
block_descriptions: Vec<BlockDescription>,
tx: Sender<(u32, H256)>,
},
}
Expand description
Messages received by the dispute coordinator subsystem.
NOTE: Any response oneshots might get cancelled if the DisputeCoordinator
was not yet
properly initialized for some reason.
Variants§
ImportStatements
Import statements by validators about a candidate.
The subsystem will silently discard ancient statements or sets of only dispute-specific statements for candidates that are previously unknown to the subsystem. The former is simply because ancient data is not relevant and the latter is as a DoS prevention mechanism. Both backing and approval statements already undergo anti-DoS procedures in their respective subsystems, but statements cast specifically for disputes are not necessarily relevant to any candidate the system is already aware of and thus present a DoS vector. Our expectation is that nodes will notify each other of disputes over the network by providing (at least) 2 conflicting statements, of which one is either a backing or validation statement.
This does not do any checking of the message signature.
Fields
candidate_receipt: CandidateReceiptV2
The candidate receipt itself.
statements: Vec<(SignedDisputeStatement, ValidatorIndex)>
Statements, with signatures checked, by validators participating in disputes.
The validator index passed alongside each statement should correspond to the index of the validator in the set.
pending_confirmation: Option<Sender<ImportStatementsResult>>
Inform the requester once we finished importing (if a sender was provided).
This is:
- we discarded the votes because
- they were ancient or otherwise invalid (result:
InvalidImport
) - or we were not able to recover availability for an unknown candidate (result:InvalidImport
) - or were known already (in that case the result will still beValidImport
) - or we recorded them because (
ValidImport
) - we cast our own vote already on that dispute - or we have approval votes on that candidate - or other explicit votes on that candidate already recorded - or recovered availability for the candidate - or the imported statements are backing/approval votes, which are always accepted.
RecentDisputes(Sender<Vec<(u32, CandidateHash, DisputeStatus)>>)
Fetch a list of all recent disputes the coordinator is aware of. These are disputes which have occurred any time in recent sessions, and which may have already concluded.
ActiveDisputes(Sender<Vec<(u32, CandidateHash, DisputeStatus)>>)
Fetch a list of all active disputes that the coordinator is aware of. These disputes are either not yet concluded or recently concluded.
QueryCandidateVotes(Vec<(u32, CandidateHash)>, Sender<Vec<(u32, CandidateHash, CandidateVotes)>>)
Get candidate votes for a candidate.
IssueLocalStatement(u32, CandidateHash, CandidateReceiptV2, bool)
Sign and issue local dispute votes. A value of true
indicates validity, and false
invalidity.
DetermineUndisputedChain
Determine the highest undisputed block within the given chain, based on where candidates
were included. If even the base block should not be finalized due to a dispute,
then None
should be returned on the channel.
The block descriptions begin counting upwards from the block after the given base_number
.
The base_number
is typically the number of the last finalized block but may be slightly
higher. This block is inevitably going to be finalized so it is not accounted for by this
function.
Trait Implementations§
§impl AssociateOutgoing for DisputeCoordinatorMessage
impl AssociateOutgoing for DisputeCoordinatorMessage
§type OutgoingMessages = DisputeCoordinatorOutgoingMessages
type OutgoingMessages = DisputeCoordinatorOutgoingMessages
Self
.source§impl Debug for DisputeCoordinatorMessage
impl Debug for DisputeCoordinatorMessage
§impl From<DisputeCoordinatorMessage> for AllMessages
impl From<DisputeCoordinatorMessage> for AllMessages
§fn from(message: DisputeCoordinatorMessage) -> AllMessages
fn from(message: DisputeCoordinatorMessage) -> AllMessages
§impl From<DisputeCoordinatorMessage> for ApprovalVotingOutgoingMessages
impl From<DisputeCoordinatorMessage> for ApprovalVotingOutgoingMessages
§fn from(message: DisputeCoordinatorMessage) -> ApprovalVotingOutgoingMessages
fn from(message: DisputeCoordinatorMessage) -> ApprovalVotingOutgoingMessages
§impl From<DisputeCoordinatorMessage> for ApprovalVotingParallelOutgoingMessages
impl From<DisputeCoordinatorMessage> for ApprovalVotingParallelOutgoingMessages
§fn from(
message: DisputeCoordinatorMessage,
) -> ApprovalVotingParallelOutgoingMessages
fn from( message: DisputeCoordinatorMessage, ) -> ApprovalVotingParallelOutgoingMessages
§impl From<DisputeCoordinatorMessage> for DisputeDistributionOutgoingMessages
impl From<DisputeCoordinatorMessage> for DisputeDistributionOutgoingMessages
§fn from(
message: DisputeCoordinatorMessage,
) -> DisputeDistributionOutgoingMessages
fn from( message: DisputeCoordinatorMessage, ) -> DisputeDistributionOutgoingMessages
§impl From<DisputeCoordinatorMessage> for ProvisionerOutgoingMessages
impl From<DisputeCoordinatorMessage> for ProvisionerOutgoingMessages
§fn from(message: DisputeCoordinatorMessage) -> ProvisionerOutgoingMessages
fn from(message: DisputeCoordinatorMessage) -> ProvisionerOutgoingMessages
§impl TryFrom<AllMessages> for DisputeCoordinatorMessage
impl TryFrom<AllMessages> for DisputeCoordinatorMessage
§fn try_from(
message: AllMessages,
) -> Result<DisputeCoordinatorMessage, <DisputeCoordinatorMessage as TryFrom<AllMessages>>::Error>
fn try_from( message: AllMessages, ) -> Result<DisputeCoordinatorMessage, <DisputeCoordinatorMessage as TryFrom<AllMessages>>::Error>
Auto Trait Implementations§
impl Freeze for DisputeCoordinatorMessage
impl !RefUnwindSafe for DisputeCoordinatorMessage
impl Send for DisputeCoordinatorMessage
impl Sync for DisputeCoordinatorMessage
impl Unpin for DisputeCoordinatorMessage
impl !UnwindSafe for DisputeCoordinatorMessage
Blanket Implementations§
§impl<T> AnySync for T
impl<T> AnySync for T
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CheckedConversion for T
impl<T> CheckedConversion for T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<Src, Dest> IntoTuple<Dest> for Srcwhere
Dest: FromTuple<Src>,
impl<Src, Dest> IntoTuple<Dest> for Srcwhere
Dest: FromTuple<Src>,
fn into_tuple(self) -> Dest
source§impl<T, Outer> IsWrappedBy<Outer> for T
impl<T, Outer> IsWrappedBy<Outer> for T
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<T> SaturatedConversion for T
impl<T> SaturatedConversion for T
source§fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
source§fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
T
. Read more§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.§impl<T> TryConv for T
impl<T> TryConv for T
source§impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
source§fn unchecked_into(self) -> T
fn unchecked_into(self) -> T
unchecked_from
.source§impl<T, S> UniqueSaturatedInto<T> for S
impl<T, S> UniqueSaturatedInto<T> for S
source§fn unique_saturated_into(self) -> T
fn unique_saturated_into(self) -> T
T
.