pub struct TimeoutCertificate3<T: NodeType> {
pub view_number: ViewNumber,
pub epoch: EpochNumber,
pub latest: LatestTimeoutSignatures<T>,
pub earlier: Vec<TimeoutSignatures<T>>,
}Expand description
A timeout certificate over TimeoutData3.
Every signer signs the lock it held when it timed out, so signers holding
different locks sign different data. Signers holding the same lock form one
group, whose signatures aggregate as in any other certificate. The
certificate’s lock is the latest group’s, and that group carries the
Certificate1 that shows the lock exists: a signer cannot claim a lock that
no quorum certified. The lock is read from that certificate, so the two
cannot disagree.
Fields§
§view_number: ViewNumberThe view that timed out.
epoch: EpochNumberThe epoch every signer named.
latest: LatestTimeoutSignatures<T>The signers holding the certificate’s lock, the latest any signer holds.
earlier: Vec<TimeoutSignatures<T>>The signers holding earlier locks, one aggregate per lock, earliest first.
Implementations§
Source§impl<T: NodeType> TimeoutCertificate3<T>
impl<T: NodeType> TimeoutCertificate3<T>
Sourcepub fn assemble(
view: ViewNumber,
epoch: EpochNumber,
stake_table: &[<T::SignatureKey as SignatureKey>::StakeTableEntry],
votes: impl IntoIterator<Item = (Option<LockView>, T::SignatureKey, <T::SignatureKey as SignatureKey>::PureAssembledSignatureType)>,
lock_cert: Option<QuorumCertificate2<T>>,
) -> Result<Self>
pub fn assemble( view: ViewNumber, epoch: EpochNumber, stake_table: &[<T::SignatureKey as SignatureKey>::StakeTableEntry], votes: impl IntoIterator<Item = (Option<LockView>, T::SignatureKey, <T::SignatureKey as SignatureKey>::PureAssembledSignatureType)>, lock_cert: Option<QuorumCertificate2<T>>, ) -> Result<Self>
Aggregate signed timeout votes into a certificate.
votes are each signer’s lock and signature over
TimeoutData3 { view, epoch, lock }; they are not checked here.
lock_cert must certify the latest of their locks.
Sourcepub fn lock(&self) -> Option<LockView>
pub fn lock(&self) -> Option<LockView>
The certificate’s lock: the latest lock any of its signers signed.
Sourcepub fn lock_cert(&self) -> Option<&QuorumCertificate2<T>>
pub fn lock_cert(&self) -> Option<&QuorumCertificate2<T>>
The certificate of the certificate’s lock.
Only its LockView is verified unless the lock is recent (see
LatestTimeoutSignatures::lock_cert).
Sourcepub fn timeout_lock(&self) -> TimeoutLock<'_, T>
pub fn timeout_lock(&self) -> TimeoutLock<'_, T>
The certificate’s lock, by what is checked of it.
Sourcepub fn data(&self, lock: Option<LockView>) -> TimeoutData3
pub fn data(&self, lock: Option<LockView>) -> TimeoutData3
The data the signers of the group holding lock signed.
Sourcefn groups(
&self,
) -> impl Iterator<Item = (Option<LockView>, &<T::SignatureKey as SignatureKey>::QcType)>
fn groups( &self, ) -> impl Iterator<Item = (Option<LockView>, &<T::SignatureKey as SignatureKey>::QcType)>
Every group: its lock and aggregate signature, earliest lock first.
Sourcepub fn check_lock(&self) -> Result<()>
pub fn check_lock(&self) -> Result<()>
Check that the certificate’s lock is no later than its view and its epoch, as the lock of every honest signer is.
Needs no committee, so a certificate can be checked before the lock’s epoch is known.
Sourcepub fn check_signatures(
&self,
stake_table: &[<T::SignatureKey as SignatureKey>::StakeTableEntry],
threshold: U256,
upgrade_lock: &UpgradeLock<T>,
) -> Result<()>
pub fn check_signatures( &self, stake_table: &[<T::SignatureKey as SignatureKey>::StakeTableEntry], threshold: U256, upgrade_lock: &UpgradeLock<T>, ) -> Result<()>
Check everything but the lock certificate’s own signatures.
The earlier groups must be in lock order with no lock twice, all
earlier than the certificate’s lock, which must pass
Self::check_lock. Every group must have a signer, and no signer may
be in two groups. Each group’s signature must be valid over its own
data, and together the groups must reach threshold. That the lock
certificate is signed by a quorum of its own epoch is
Self::lock_epoch’s committee’s to check, and is not checked here: a
certificate is valid only with both.
Sourcepub fn lock_epoch(&self) -> Option<EpochNumber>
pub fn lock_epoch(&self) -> Option<EpochNumber>
The epoch whose committee signed the lock certificate.
Trait Implementations§
Source§impl<T: Clone + NodeType> Clone for TimeoutCertificate3<T>
impl<T: Clone + NodeType> Clone for TimeoutCertificate3<T>
Source§fn clone(&self) -> TimeoutCertificate3<T>
fn clone(&self) -> TimeoutCertificate3<T>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<T: NodeType> Committable for TimeoutCertificate3<T>
Covers the lock certificate as sent. For a lock that is not checked, two
certificates that differ only in the unverified parts of it both verify and
commit differently, so the commitment does not identify the certificate’s
signed content. Nothing keys on it: consensus keys timeout certificates by
view, and a proposal’s leaf commitment covers the evidence its leader
signed.
impl<T: NodeType> Committable for TimeoutCertificate3<T>
Covers the lock certificate as sent. For a lock that is not checked, two certificates that differ only in the unverified parts of it both verify and commit differently, so the commitment does not identify the certificate’s signed content. Nothing keys on it: consensus keys timeout certificates by view, and a proposal’s leaf commitment covers the evidence its leader signed.
Source§impl<'de, T: NodeType> Deserialize<'de> for TimeoutCertificate3<T>
impl<'de, T: NodeType> Deserialize<'de> for TimeoutCertificate3<T>
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl<T: Eq + NodeType> Eq for TimeoutCertificate3<T>
Source§impl<T: NodeType> HasEpoch for TimeoutCertificate3<T>
impl<T: NodeType> HasEpoch for TimeoutCertificate3<T>
Source§fn epoch(&self) -> Option<EpochNumber>
fn epoch(&self) -> Option<EpochNumber>
EpochSource§impl<T: NodeType> HasViewNumber for TimeoutCertificate3<T>
impl<T: NodeType> HasViewNumber for TimeoutCertificate3<T>
Source§fn view_number(&self) -> ViewNumber
fn view_number(&self) -> ViewNumber
Source§impl<T> Serialize for TimeoutCertificate3<T>
impl<T> Serialize for TimeoutCertificate3<T>
impl<T: PartialEq + NodeType> StructuralPartialEq for TimeoutCertificate3<T>
Auto Trait Implementations§
impl<T> Freeze for TimeoutCertificate3<T>
impl<T> RefUnwindSafe for TimeoutCertificate3<T>
impl<T> Send for TimeoutCertificate3<T>
impl<T> Sync for TimeoutCertificate3<T>
impl<T> Unpin for TimeoutCertificate3<T>
impl<T> UnsafeUnpin for TimeoutCertificate3<T>
impl<T> UnwindSafe for TimeoutCertificate3<T>
Blanket Implementations§
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
§impl<T> CallHasher for T
impl<T> CallHasher for T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
impl<T> Element for T
impl<T> Element for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§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> ⓘ
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<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
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
impl<C> Sealed for Cwhere
C: Committable,
§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.