Struct hotshot::types::handle::SystemContextHandle
source · pub struct SystemContextHandle<TYPES: NodeType, I: NodeImplementation<TYPES>, V: Versions> {
pub(crate) output_event_stream: (Sender<Event<TYPES>>, InactiveReceiver<Event<TYPES>>),
pub(crate) internal_event_stream: (Sender<Arc<HotShotEvent<TYPES>>>, InactiveReceiver<Arc<HotShotEvent<TYPES>>>),
pub(crate) consensus_registry: ConsensusTaskRegistry<HotShotEvent<TYPES>>,
pub(crate) network_registry: NetworkTaskRegistry,
pub hotshot: Arc<SystemContext<TYPES, I, V>>,
pub(crate) storage: Arc<RwLock<I::Storage>>,
pub network: Arc<I::Network>,
pub memberships: Arc<TYPES::Membership>,
pub epoch_height: u64,
}
Expand description
Event streaming handle for a SystemContext
instance running in the background
This type provides the means to message and interact with a background SystemContext
instance,
allowing the ability to receive Event
s from it, send transactions to it, and interact with
the underlying storage.
Fields§
§output_event_stream: (Sender<Event<TYPES>>, InactiveReceiver<Event<TYPES>>)
§internal_event_stream: (Sender<Arc<HotShotEvent<TYPES>>>, InactiveReceiver<Arc<HotShotEvent<TYPES>>>)
access to the internal event stream, in case we need to, say, shut something down
consensus_registry: ConsensusTaskRegistry<HotShotEvent<TYPES>>
registry for controlling consensus tasks
network_registry: NetworkTaskRegistry
registry for controlling network tasks
hotshot: Arc<SystemContext<TYPES, I, V>>
Internal reference to the underlying SystemContext
storage: Arc<RwLock<I::Storage>>
Reference to the internal storage for consensus datum.
network: Arc<I::Network>
Networks used by the instance of hotshot
memberships: Arc<TYPES::Membership>
Memberships used by consensus
epoch_height: u64
Number of blocks in an epoch, zero means there are no epochs
Implementations§
source§impl<TYPES: NodeType, I: NodeImplementation<TYPES> + 'static, V: Versions> SystemContextHandle<TYPES, I, V>
impl<TYPES: NodeType, I: NodeImplementation<TYPES> + 'static, V: Versions> SystemContextHandle<TYPES, I, V>
sourcepub fn add_task<S: TaskState<Event = HotShotEvent<TYPES>> + 'static>(
&mut self,
task_state: S,
)
pub fn add_task<S: TaskState<Event = HotShotEvent<TYPES>> + 'static>( &mut self, task_state: S, )
Adds a hotshot consensus-related task to the SystemContextHandle
.
sourcepub fn event_stream(&self) -> impl Stream<Item = Event<TYPES>>
pub fn event_stream(&self) -> impl Stream<Item = Event<TYPES>>
obtains a stream to expose to the user
sourcepub async fn send_external_message(
&self,
msg: Vec<u8>,
recipients: RecipientList<TYPES::SignatureKey>,
) -> Result<()>
pub async fn send_external_message( &self, msg: Vec<u8>, recipients: RecipientList<TYPES::SignatureKey>, ) -> Result<()>
Message other participants with a serialized message from the application
Receivers of this message will get an Event::ExternalMessageReceived
via
the event stream.
§Errors
Errors if serializing the request fails, or the request fails to be sent
sourcepub fn request_proposal(
&self,
view: TYPES::View,
epoch: TYPES::Epoch,
leaf_commitment: Commitment<Leaf2<TYPES>>,
) -> Result<impl Future<Output = Result<Proposal<TYPES, QuorumProposal2<TYPES>>>>>
pub fn request_proposal( &self, view: TYPES::View, epoch: TYPES::Epoch, leaf_commitment: Commitment<Leaf2<TYPES>>, ) -> Result<impl Future<Output = Result<Proposal<TYPES, QuorumProposal2<TYPES>>>>>
Request a proposal from the all other nodes. Will block until some node returns a valid proposal with the requested commitment. If nobody has the proposal this will block forever
§Errors
Errors if signing the request for proposal fails
sourcepub fn event_stream_known_impl(&self) -> Receiver<Event<TYPES>>
pub fn event_stream_known_impl(&self) -> Receiver<Event<TYPES>>
HACK so we can know the types when running tests… there are two cleaner solutions:
- make the stream generic and in nodetypes or nodeimpelmentation
- type wrapper
sourcepub fn internal_event_stream_sender(&self) -> Sender<Arc<HotShotEvent<TYPES>>>
pub fn internal_event_stream_sender(&self) -> Sender<Arc<HotShotEvent<TYPES>>>
HACK so we can create dependency tasks when running tests
sourcepub fn internal_event_stream_receiver_known_impl(
&self,
) -> Receiver<Arc<HotShotEvent<TYPES>>>
pub fn internal_event_stream_receiver_known_impl( &self, ) -> Receiver<Arc<HotShotEvent<TYPES>>>
HACK so we can know the types when running tests… there are two cleaner solutions:
- make the stream generic and in nodetypes or nodeimpelmentation
- type wrapper
NOTE: this is only used for sanity checks in our tests
sourcepub async fn decided_state(&self) -> Arc<TYPES::ValidatedState>
pub async fn decided_state(&self) -> Arc<TYPES::ValidatedState>
Get the last decided validated state of the SystemContext
instance.
§Panics
If the internal consensus is in an inconsistent state.
sourcepub async fn state(
&self,
view: TYPES::View,
) -> Option<Arc<TYPES::ValidatedState>>
pub async fn state( &self, view: TYPES::View, ) -> Option<Arc<TYPES::ValidatedState>>
Get the validated state from a given view
.
Returns the requested state, if the SystemContext
is tracking this view. Consensus
tracks views that have not yet been decided but could be in the future. This function may
return None
if the requested view has already been decided (but see
decided_state
) or if there is no path for the requested
view to ever be decided.
sourcepub async fn decided_leaf(&self) -> Leaf2<TYPES>
pub async fn decided_leaf(&self) -> Leaf2<TYPES>
Get the last decided leaf of the SystemContext
instance.
§Panics
If the internal consensus is in an inconsistent state.
sourcepub fn try_decided_leaf(&self) -> Option<Leaf2<TYPES>>
pub fn try_decided_leaf(&self) -> Option<Leaf2<TYPES>>
Tries to get the most recent decided leaf, returning instantly if we can’t acquire the lock.
§Panics
Panics if internal consensus is in an inconsistent state.
sourcepub async fn submit_transaction(
&self,
tx: TYPES::Transaction,
) -> Result<(), HotShotError<TYPES>>
pub async fn submit_transaction( &self, tx: TYPES::Transaction, ) -> Result<(), HotShotError<TYPES>>
Submits a transaction to the backing SystemContext
instance.
The current node broadcasts the transaction to all nodes on the network.
§Errors
Will return a HotShotError
if some error occurs in the underlying
SystemContext
instance.
sourcepub fn consensus(&self) -> Arc<RwLock<Consensus<TYPES>>>
pub fn consensus(&self) -> Arc<RwLock<Consensus<TYPES>>>
Get the underlying consensus state for this SystemContext
sourcepub async fn shut_down(&mut self)
pub async fn shut_down(&mut self)
Shut down the the inner hotshot and wait until all background threads are closed.
sourcepub fn next_view_timeout(&self) -> u64
pub fn next_view_timeout(&self) -> u64
return the timeout for a view of the underlying SystemContext
sourcepub async fn leader(
&self,
view_number: TYPES::View,
epoch_number: TYPES::Epoch,
) -> Result<TYPES::SignatureKey>
pub async fn leader( &self, view_number: TYPES::View, epoch_number: TYPES::Epoch, ) -> Result<TYPES::SignatureKey>
Wrapper for HotShotConsensusApi
’s leader
function
§Errors
Returns an error if the leader cannot be calculated
sourcepub fn public_key(&self) -> TYPES::SignatureKey
pub fn public_key(&self) -> TYPES::SignatureKey
Wrapper to get this node’s public key
sourcepub fn external_channel_sender(&self) -> Sender<Event<TYPES>>
pub fn external_channel_sender(&self) -> Sender<Event<TYPES>>
Get the sender side of the external event stream for testing purpose
sourcepub fn internal_channel_sender(&self) -> Sender<Arc<HotShotEvent<TYPES>>>
pub fn internal_channel_sender(&self) -> Sender<Arc<HotShotEvent<TYPES>>>
Get the sender side of the internal event stream for testing purpose
sourcepub fn storage(&self) -> Arc<RwLock<I::Storage>>
pub fn storage(&self) -> Arc<RwLock<I::Storage>>
Provides a reference to the underlying storage for this SystemContext
, allowing access to
historical data
Trait Implementations§
source§impl<TYPES: NodeType, I: NodeImplementation<TYPES>, V: Versions> ConsensusApi<TYPES, I> for SystemContextHandle<TYPES, I, V>
impl<TYPES: NodeType, I: NodeImplementation<TYPES>, V: Versions> ConsensusApi<TYPES, I> for SystemContextHandle<TYPES, I, V>
source§fn total_nodes(&self) -> NonZeroUsize
fn total_nodes(&self) -> NonZeroUsize
n
.source§fn builder_timeout(&self) -> Duration
fn builder_timeout(&self) -> Duration
source§fn send_event<'life0, 'async_trait>(
&'life0 self,
event: Event<TYPES>,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn send_event<'life0, 'async_trait>(
&'life0 self,
event: Event<TYPES>,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
hotshot-consensus
.source§fn public_key(&self) -> &TYPES::SignatureKey
fn public_key(&self) -> &TYPES::SignatureKey
source§fn private_key(&self) -> &<TYPES::SignatureKey as SignatureKey>::PrivateKey
fn private_key(&self) -> &<TYPES::SignatureKey as SignatureKey>::PrivateKey
Auto Trait Implementations§
impl<TYPES, I, V> Freeze for SystemContextHandle<TYPES, I, V>
impl<TYPES, I, V> !RefUnwindSafe for SystemContextHandle<TYPES, I, V>
impl<TYPES, I, V> Send for SystemContextHandle<TYPES, I, V>
impl<TYPES, I, V> Sync for SystemContextHandle<TYPES, I, V>
impl<TYPES, I, V> Unpin for SystemContextHandle<TYPES, I, V>
impl<TYPES, I, V> !UnwindSafe for SystemContextHandle<TYPES, I, V>
Blanket Implementations§
§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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> Conv for T
impl<T> Conv for T
§impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
§fn deserialize(
&self,
deserializer: &mut D,
) -> Result<With<T, W>, <D as Fallible>::Error>
fn deserialize( &self, deserializer: &mut D, ) -> Result<With<T, W>, <D as Fallible>::Error>
§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> 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> LayoutRaw for T
impl<T> LayoutRaw for T
§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
§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> 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.