pub struct ConsensusHandle<T: NodeType, S> {
epoch_height: BlockNumber,
event_rx: InactiveReceiver<CoordinatorEvent<T>>,
upgrade_lock: UpgradeLock<T>,
membership_coordinator: EpochMembershipCoordinator<T>,
resting: Arc<RwLock<Resting<T>>>,
coordinator: Arc<RwLock<CoordinatorState<T, S>>>,
exited: CancellationToken,
}Expand description
The node’s handle on consensus: the Coordinator, run on its own task from
start_consensus on, and what the rest of the node reads from it.
Fields§
§epoch_height: BlockNumber§event_rx: InactiveReceiver<CoordinatorEvent<T>>§upgrade_lock: UpgradeLock<T>§membership_coordinator: EpochMembershipCoordinator<T>§resting: Arc<RwLock<Resting<T>>>§coordinator: Arc<RwLock<CoordinatorState<T, S>>>§exited: CancellationTokenCancelled once the coordinator task has ended, however it ended.
Implementations§
Source§impl<T, S> ConsensusHandle<T, S>where
T: NodeType,
S: NewProtocolStorage<T>,
impl<T, S> ConsensusHandle<T, S>where
T: NodeType,
S: NewProtocolStorage<T>,
pub fn new( coordinator: Coordinator<T, S>, external_rx: UnboundedReceiver<OpaqueMessage<T::SignatureKey>>, upgrade_lock: UpgradeLock<T>, membership_coordinator: EpochMembershipCoordinator<T>, initializer: &HotShotInitializer<T>, event_channel_capacity: usize, metrics: &dyn Metrics, ) -> Self
pub async fn start_consensus(&self)
pub fn event_stream(&self) -> BoxStream<'static, CoordinatorEvent<T>>
Sourcepub async fn stopped(&self)
pub async fn stopped(&self)
Resolves once the coordinator task has ended, whether shut_down stopped it or it died
on a critical error or a panic. Never resolves if consensus never started.
Sourcepub async fn current_view(&self) -> ViewNumber
pub async fn current_view(&self) -> ViewNumber
Serves the resting state once the coordinator has been told to shut down, waiting for the state it leaves on the way out if a request fails meanwhile. Panics if the coordinator died instead: the node must not answer as if the chain had stopped.
Sourcepub async fn decided_leaf(&self) -> Leaf2<T>
pub async fn decided_leaf(&self) -> Leaf2<T>
See Self::current_view.
Sourcepub async fn decided_state(&self) -> Option<Arc<T::ValidatedState>>
pub async fn decided_state(&self) -> Option<Arc<T::ValidatedState>>
See Self::current_view.
Sourceasync fn resting_unless_dead(
&self,
err: QueryError,
) -> RwLockReadGuard<'_, Resting<T>>
async fn resting_unless_dead( &self, err: QueryError, ) -> RwLockReadGuard<'_, Resting<T>>
Where a failed request leaves a reader: the coordinator was told to shut down and the resting state it leaves behind answers, or no shutdown was asked for, so it died.
pub async fn state(&self, view: ViewNumber) -> Option<Arc<T::ValidatedState>>
pub async fn state_and_delta(&self, view: ViewNumber) -> StateAndDelta<T>
pub async fn undecided_leaves(&self) -> Vec<Leaf2<T>>
pub async fn current_epoch(&self) -> Option<EpochNumber>
pub fn epoch_height(&self) -> BlockNumber
pub fn membership_coordinator(&self) -> EpochMembershipCoordinator<T>
pub fn upgrade_lock(&self) -> UpgradeLock<T>
pub async fn current_proposal_participation( &self, ) -> HashMap<T::SignatureKey, f64>
pub async fn proposal_participation( &self, epoch: EpochNumber, ) -> HashMap<T::SignatureKey, f64>
pub async fn current_vote_participation( &self, ) -> HashMap<<T::SignatureKey as SignatureKey>::VerificationKeyType, f64>
pub async fn vote_participation( &self, epoch: EpochNumber, ) -> HashMap<<T::SignatureKey as SignatureKey>::VerificationKeyType, f64>
pub async fn request_proposal( &self, view: ViewNumber, leaf_commitment: Commitment<Leaf2<T>>, ) -> Result<BoxFuture<'static, Result<SignedProposal<T, QuorumProposalWrapper<T>>>>>
pub async fn submit_transaction(&self, tx: T::Transaction) -> Result<()>
pub async fn update_leaf( &self, leaf: Leaf2<T>, state: Arc<T::ValidatedState>, delta: Option<Arc<<T::ValidatedState as ValidatedState<T>>::Delta>>, ) -> Result<()>
Sourcepub async fn shut_down(&self)
pub async fn shut_down(&self)
Stops the coordinator if it runs, and drops it if it never started so that nothing can start it afterwards; the readers serve the resting state from here on.
pub(crate) async fn client_api(&self) -> Option<ClientApi<T>>
Trait Implementations§
Source§impl<P: SequencerPersistence> ConsensusSource for ConsensusHandle<SeqTypes, Arc<P>>
impl<P: SequencerPersistence> ConsensusSource for ConsensusHandle<SeqTypes, Arc<P>>
fn decided_leaf<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Leaf2> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn decided_state<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Option<Arc<ValidatedState>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn state<'life0, 'async_trait>(
&'life0 self,
view: ViewNumber,
) -> Pin<Box<dyn Future<Output = Option<Arc<ValidatedState>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn state_and_delta<'life0, 'async_trait>(
&'life0 self,
view: ViewNumber,
) -> Pin<Box<dyn Future<Output = StateAndDelta<SeqTypes>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn undecided_leaves<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Vec<Leaf2>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn current_epoch<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Option<EpochNumber>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn membership_coordinator<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = EpochMembershipCoordinator<SeqTypes>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn upgrade_lock<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = UpgradeLock<SeqTypes>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn submit_transaction<'life0, 'async_trait>(
&'life0 self,
tx: Transaction,
) -> Pin<Box<dyn Future<Output = Result<Commitment<Transaction>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn submit_transaction<'life0, 'async_trait>(
&'life0 self,
tx: Transaction,
) -> Pin<Box<dyn Future<Output = Result<Commitment<Transaction>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn update_leaf<'life0, 'async_trait>(
&'life0 self,
leaf: Leaf2,
state: Arc<ValidatedState>,
delta: Option<Arc<Delta>>,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn update_leaf<'life0, 'async_trait>(
&'life0 self,
leaf: Leaf2,
state: Arc<ValidatedState>,
delta: Option<Arc<Delta>>,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn current_proposal_participation<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = HashMap<PubKey, f64>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn proposal_participation<'life0, 'async_trait>(
&'life0 self,
epoch: EpochNumber,
) -> Pin<Box<dyn Future<Output = HashMap<PubKey, f64>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn current_vote_participation<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = HashMap<PubKey, f64>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn vote_participation<'life0, 'async_trait>(
&'life0 self,
epoch: EpochNumber,
) -> Pin<Box<dyn Future<Output = HashMap<PubKey, f64>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Auto Trait Implementations§
impl<T, S> !RefUnwindSafe for ConsensusHandle<T, S>
impl<T, S> !UnwindSafe for ConsensusHandle<T, S>
impl<T, S> Freeze for ConsensusHandle<T, S>
impl<T, S> Send for ConsensusHandle<T, S>
impl<T, S> Sync for ConsensusHandle<T, S>
impl<T, S> Unpin for ConsensusHandle<T, S>
impl<T, S> UnsafeUnpin for ConsensusHandle<T, S>
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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
§impl<T> Conv for T
impl<T> Conv for T
§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> 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> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
§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> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Requestimpl<T> JsonSchemaMaybe for T
§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered].§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> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
§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.