pub enum EquivocationProof {
LockViolation {
validator: ValidatorPublicKey,
confirmed_header: BlockHeader,
confirmed_round: Round,
confirmed_attested: bool,
confirmed_commitment: Option<CryptoHash>,
confirmed_signature: ValidatorSignature,
validated_header: BlockHeader,
validated_round: Round,
validated_unlocking_round: Option<Round>,
validated_commitment: Option<CryptoHash>,
validated_signature: ValidatorSignature,
},
DoubleVote {Show 13 fields
validator: ValidatorPublicKey,
round: Round,
kind: CertificateKind,
first_header: BlockHeader,
first_unlocking_round: Option<Round>,
first_attested: bool,
first_commitment: Option<CryptoHash>,
first_signature: ValidatorSignature,
second_header: BlockHeader,
second_unlocking_round: Option<Round>,
second_attested: bool,
second_commitment: Option<CryptoHash>,
second_signature: ValidatorSignature,
},
FirstRoundViolation {
validator: ValidatorPublicKey,
attested_header: BlockHeader,
attested_round: Round,
attested_commitment: Option<CryptoHash>,
attested_signature: ValidatorSignature,
earlier_header: BlockHeader,
earlier_round: Round,
earlier_attested: bool,
earlier_commitment: Option<CryptoHash>,
earlier_signature: ValidatorSignature,
},
InvalidJustification {
validator: ValidatorPublicKey,
header: BlockHeader,
round: Round,
kind: CertificateKind,
unlocking_round: Option<Round>,
first_round: bool,
signature: ValidatorSignature,
opening: CommittedQuorum,
},
}Expand description
A self-contained proof that a single validator misbehaved.
Variants§
LockViolation
The validator voted to validate one block under an unlocking round while having voted to confirm a different block in a round at or above it — contradicting its own unlocking-round claim.
Fields
validator: ValidatorPublicKeyThe misbehaving validator.
confirmed_header: BlockHeaderThe header of the block the validator voted to confirm. Its hash, chain ID and height
are read from here; it must share the chain and height of validated_header.
confirmed_commitment: Option<CryptoHash>The justification commitment the confirmation vote signed.
confirmed_signature: ValidatorSignatureIts ConfirmedBlock signature.
validated_header: BlockHeaderThe header of the different block the validator voted to validate.
validated_unlocking_round: Option<Round>The unlocking round the validation vote signed, contradicted by the confirmation.
validated_commitment: Option<CryptoHash>The justification commitment the validation vote signed.
validated_signature: ValidatorSignatureIts ValidatedBlock signature.
DoubleVote
The validator cast two votes of the same kind for different blocks in the same round:
either two ConfirmedBlock votes, or two ValidatedBlock votes (illegal regardless of
the unlocking rounds, since a validator may vote for at most one block per round and kind).
Fields
validator: ValidatorPublicKeyThe misbehaving validator.
kind: CertificateKindThe certificate kind both votes share.
first_header: BlockHeaderThe header of the first block voted for. The two headers must share a chain and height.
first_unlocking_round: Option<Round>The unlocking round the first vote signed (None for ConfirmedBlock votes).
first_attested: boolThe first-round attestation the first vote signed (false for ValidatedBlock votes).
first_commitment: Option<CryptoHash>The justification commitment the first vote signed.
first_signature: ValidatorSignatureThe signature on the first vote.
second_header: BlockHeaderThe header of the second, different block voted for.
second_unlocking_round: Option<Round>The unlocking round the second vote signed (None for ConfirmedBlock votes).
second_attested: boolThe first-round attestation the second vote signed (false for ValidatedBlock votes).
second_commitment: Option<CryptoHash>The justification commitment the second vote signed.
second_signature: ValidatorSignatureThe signature on the second vote.
FirstRoundViolation
The validator voted to confirm a block with the first-round attestation — asserting that no lower round exists at this height — while having also voted to confirm a block in a lower round. The two votes cannot both be honest, regardless of the blocks they are for.
Fields
validator: ValidatorPublicKeyThe misbehaving validator.
attested_header: BlockHeaderThe header of the block confirmed with the attestation. It must share the chain and
height of earlier_header.
attested_commitment: Option<CryptoHash>The justification commitment the attested vote signed.
attested_signature: ValidatorSignatureThe ConfirmedBlock signature carrying the attestation.
earlier_header: BlockHeaderThe header of the block the earlier vote confirmed.
earlier_commitment: Option<CryptoHash>The justification commitment the earlier vote signed.
earlier_signature: ValidatorSignatureIts ConfirmedBlock signature.
InvalidJustification
The validator signed a justification commitment whose opening is not a quorum it could honestly have cited: the opening’s signatures are invalid or below the quorum threshold, it validates a different block, or its round does not ground the vote that cited it. By signing the commitment the validator attested that it had verified the cited quorum — certificate verification relies on that attestation instead of re-checking the chain — so an invalid opening is individually attributable, with no conflicting certificate needed.
Fields
validator: ValidatorPublicKeyThe misbehaving validator.
header: BlockHeaderThe header of the block the attesting vote was for.
kind: CertificateKindThe kind of the attesting vote.
signature: ValidatorSignatureThe attesting vote’s signature. Its payload contains the opening’s hash as the justification commitment, binding the signature to the opening.
opening: CommittedQuorumThe opening of the signed commitment: the cited quorum, which is not valid.
Implementations§
Source§impl EquivocationProof
impl EquivocationProof
Sourcepub fn validator(&self) -> ValidatorPublicKey
pub fn validator(&self) -> ValidatorPublicKey
Returns the misbehaving validator.
Trait Implementations§
Source§impl Clone for EquivocationProof
impl Clone for EquivocationProof
Source§fn clone(&self) -> EquivocationProof
fn clone(&self) -> EquivocationProof
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for EquivocationProof
impl RefUnwindSafe for EquivocationProof
impl Send for EquivocationProof
impl Sync for EquivocationProof
impl Unpin for EquivocationProof
impl UnsafeUnpin for EquivocationProof
impl UnwindSafe for EquivocationProof
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
Source§impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.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 moreSource§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T> MockResults for T
impl<T> MockResults for T
Source§type Results = T
type Results = T
MockInstance.Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§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 moreSource§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 moreSource§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
Source§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
Source§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.Source§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.Source§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.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<M, I> RuntimeMemory<&mut I> for Mwhere
M: RuntimeMemory<I>,
impl<M, I> RuntimeMemory<&mut I> for Mwhere
M: RuntimeMemory<I>,
Source§fn read<'instance>(
&self,
instance: &'instance &mut I,
location: GuestPointer,
length: u32,
) -> Result<Cow<'instance, [u8]>, RuntimeError>
fn read<'instance>( &self, instance: &'instance &mut I, location: GuestPointer, length: u32, ) -> Result<Cow<'instance, [u8]>, RuntimeError>
Reads length bytes from memory from the provided location.
Source§fn write(
&mut self,
instance: &mut &mut I,
location: GuestPointer,
bytes: &[u8],
) -> Result<(), RuntimeError>
fn write( &mut self, instance: &mut &mut I, location: GuestPointer, bytes: &[u8], ) -> Result<(), RuntimeError>
Writes the bytes to memory at the provided location.
Source§impl<T> Tap for T
impl<T> Tap for T
Source§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.