pub struct SenderQueue<D>where
D: SenderQueueableConsensusProtocol,{ /* private fields */ }Expand description
An instance of ConsensusProtocol wrapped with a queue of outgoing messages, that is, a sender
queue. This wrapping ensures that the messages sent to remote instances lead to progress of the
entire consensus network. In particular, messages to lagging remote nodes are queued and sent
only when those nodes’ epochs match the queued messages’ epochs. Thus all nodes can handle
incoming messages without queueing them and can ignore messages whose epochs are not currently
acccepted.
Implementations§
Source§impl<C, N> SenderQueue<DynamicHoneyBadger<C, N>>
impl<C, N> SenderQueue<DynamicHoneyBadger<C, N>>
Sourcepub fn propose<R: Rng>(
&mut self,
rng: &mut R,
contrib: C,
) -> Result<CpStep<SenderQueue<DynamicHoneyBadger<C, N>>>, Error<Error>>
pub fn propose<R: Rng>( &mut self, rng: &mut R, contrib: C, ) -> Result<CpStep<SenderQueue<DynamicHoneyBadger<C, N>>>, Error<Error>>
Proposes a contribution in the current epoch.
Returns an error if we already made a proposal in this epoch.
If we are the only validator, this will immediately output a batch, containing our proposal.
Sourcepub fn vote_for(
&mut self,
change: Change<N>,
) -> Result<CpStep<SenderQueue<DynamicHoneyBadger<C, N>>>, Error<Error>>
pub fn vote_for( &mut self, change: Change<N>, ) -> Result<CpStep<SenderQueue<DynamicHoneyBadger<C, N>>>, Error<Error>>
Casts a vote to change the set of validators or parameters.
This stores a pending vote for the change. It will be included in some future batch, and once enough validators have been voted for the same change, it will take effect.
Sourcepub fn vote_to_add(
&mut self,
node_id: N,
pub_key: PublicKey,
) -> Result<CpStep<SenderQueue<DynamicHoneyBadger<C, N>>>, Error<Error>>
pub fn vote_to_add( &mut self, node_id: N, pub_key: PublicKey, ) -> Result<CpStep<SenderQueue<DynamicHoneyBadger<C, N>>>, Error<Error>>
Casts a vote to add a node as a validator.
This stores a pending vote for the change. It will be included in some future batch, and once enough validators have been voted for the same change, it will take effect.
Sourcepub fn vote_to_remove(
&mut self,
node_id: &N,
) -> Result<CpStep<SenderQueue<DynamicHoneyBadger<C, N>>>, Error<Error>>
pub fn vote_to_remove( &mut self, node_id: &N, ) -> Result<CpStep<SenderQueue<DynamicHoneyBadger<C, N>>>, Error<Error>>
Casts a vote to demote a validator to observer.
This stores a pending vote for the change. It will be included in some future batch, and once enough validators have been voted for the same change, it will take effect.
Sourcepub fn restart<I, R: Rng>(
&mut self,
join_plan: JoinPlan<N>,
peer_ids: I,
rng: &mut R,
) -> Result<CpStep<SenderQueue<DynamicHoneyBadger<C, N>>>, Error<Error>>where
I: Iterator<Item = N>,
pub fn restart<I, R: Rng>(
&mut self,
join_plan: JoinPlan<N>,
peer_ids: I,
rng: &mut R,
) -> Result<CpStep<SenderQueue<DynamicHoneyBadger<C, N>>>, Error<Error>>where
I: Iterator<Item = N>,
Restarts the managed algorithm with the given join plan with a new list of peers and with the same secret key. In order to be restarted, the node should have completed the process of removing itself from the network. The node may not output a batch if it were not properly removed.
Source§impl<T, N, Q> SenderQueue<QueueingHoneyBadger<T, N, Q>>where
T: Contribution + Serialize + DeserializeOwned + Clone,
N: NodeIdT + Serialize + DeserializeOwned,
Q: TransactionQueue<T>,
Standard: Distribution<N>,
impl<T, N, Q> SenderQueue<QueueingHoneyBadger<T, N, Q>>where
T: Contribution + Serialize + DeserializeOwned + Clone,
N: NodeIdT + Serialize + DeserializeOwned,
Q: TransactionQueue<T>,
Standard: Distribution<N>,
Sourcepub fn push_transaction<R: Rng>(
&mut self,
tx: T,
rng: &mut R,
) -> Result<CpStep<SenderQueue<QueueingHoneyBadger<T, N, Q>>>, Error<Error>>
pub fn push_transaction<R: Rng>( &mut self, tx: T, rng: &mut R, ) -> Result<CpStep<SenderQueue<QueueingHoneyBadger<T, N, Q>>>, Error<Error>>
Adds a transaction to the queue.
This can be called at any time to append to the transaction queue. The new transaction will be proposed in some future epoch.
If no proposal has yet been made for the current epoch, this may trigger one. In this case, a nonempty step will returned, with the corresponding messages. (Or, if we are the only validator, even with the completed batch as an output.)
Sourcepub fn vote_for<R: Rng>(
&mut self,
change: Change<N>,
rng: &mut R,
) -> Result<CpStep<SenderQueue<QueueingHoneyBadger<T, N, Q>>>, Error<Error>>
pub fn vote_for<R: Rng>( &mut self, change: Change<N>, rng: &mut R, ) -> Result<CpStep<SenderQueue<QueueingHoneyBadger<T, N, Q>>>, Error<Error>>
Casts a vote to change the set of validators or parameters.
This stores a pending vote for the change. It will be included in some future batch, and once enough validators have been voted for the same change, it will take effect.
Sourcepub fn vote_to_add<R: Rng>(
&mut self,
node_id: N,
pub_key: PublicKey,
rng: &mut R,
) -> Result<CpStep<SenderQueue<QueueingHoneyBadger<T, N, Q>>>, Error<Error>>
pub fn vote_to_add<R: Rng>( &mut self, node_id: N, pub_key: PublicKey, rng: &mut R, ) -> Result<CpStep<SenderQueue<QueueingHoneyBadger<T, N, Q>>>, Error<Error>>
Casts a vote to add a node as a validator.
This stores a pending vote for the change. It will be included in some future batch, and once enough validators have been voted for the same change, it will take effect.
Sourcepub fn vote_to_remove<R: Rng>(
&mut self,
node_id: &N,
rng: &mut R,
) -> Result<CpStep<SenderQueue<QueueingHoneyBadger<T, N, Q>>>, Error<Error>>
pub fn vote_to_remove<R: Rng>( &mut self, node_id: &N, rng: &mut R, ) -> Result<CpStep<SenderQueue<QueueingHoneyBadger<T, N, Q>>>, Error<Error>>
Casts a vote to demote a validator to observer.
This stores a pending vote for the change. It will be included in some future batch, and once enough validators have been voted for the same change, it will take effect.
Source§impl<D> SenderQueue<D>where
D: SenderQueueableConsensusProtocol + Debug,
D::Message: Clone + SenderQueueableMessage<Epoch = D::Epoch>,
D::NodeId: NodeIdT,
D::Output: SenderQueueableOutput<D::NodeId, D::Epoch>,
impl<D> SenderQueue<D>where
D: SenderQueueableConsensusProtocol + Debug,
D::Message: Clone + SenderQueueableMessage<Epoch = D::Epoch>,
D::NodeId: NodeIdT,
D::Output: SenderQueueableOutput<D::NodeId, D::Epoch>,
Sourcepub fn builder<I>(algo: D, peer_ids: I) -> SenderQueueBuilder<D>
pub fn builder<I>(algo: D, peer_ids: I) -> SenderQueueBuilder<D>
Returns a new SenderQueueBuilder configured to manage a given DynamicHoneyBadger
instance.
Sourcepub fn handle_input<R: Rng>(
&mut self,
input: D::Input,
rng: &mut R,
) -> Result<CpStep<Self>, Error<D::Error>>
pub fn handle_input<R: Rng>( &mut self, input: D::Input, rng: &mut R, ) -> Result<CpStep<Self>, Error<D::Error>>
Handles an input. This will call the wrapped algorithm’s handle_input.
Sourcepub fn handle_message<R: Rng>(
&mut self,
sender_id: &D::NodeId,
message: Message<D::Message>,
rng: &mut R,
) -> Result<CpStep<Self>, Error<D::Error>>
pub fn handle_message<R: Rng>( &mut self, sender_id: &D::NodeId, message: Message<D::Message>, rng: &mut R, ) -> Result<CpStep<Self>, Error<D::Error>>
Handles a message received from sender_id.
This must be called with every message we receive from another node.
Sourcepub fn is_removed(&self) -> bool
pub fn is_removed(&self) -> bool
Returns true iff the node has been removed from the list of participants.
Trait Implementations§
Source§impl<D> ConsensusProtocol for SenderQueue<D>where
D: SenderQueueableConsensusProtocol + Debug,
D::Message: Clone + SenderQueueableMessage<Epoch = D::Epoch>,
D::NodeId: NodeIdT,
D::Output: SenderQueueableOutput<D::NodeId, D::Epoch>,
impl<D> ConsensusProtocol for SenderQueue<D>where
D: SenderQueueableConsensusProtocol + Debug,
D::Message: Clone + SenderQueueableMessage<Epoch = D::Epoch>,
D::NodeId: NodeIdT,
D::Output: SenderQueueableOutput<D::NodeId, D::Epoch>,
Source§type NodeId = <D as ConsensusProtocol>::NodeId
type NodeId = <D as ConsensusProtocol>::NodeId
Source§type Input = <D as ConsensusProtocol>::Input
type Input = <D as ConsensusProtocol>::Input
Source§type Output = <D as ConsensusProtocol>::Output
type Output = <D as ConsensusProtocol>::Output
Source§type Message = Message<<D as ConsensusProtocol>::Message>
type Message = Message<<D as ConsensusProtocol>::Message>
Source§type Error = Error<<D as ConsensusProtocol>::Error>
type Error = Error<<D as ConsensusProtocol>::Error>
Source§type FaultKind = <D as ConsensusProtocol>::FaultKind
type FaultKind = <D as ConsensusProtocol>::FaultKind
Source§fn handle_input<R: Rng>(
&mut self,
input: Self::Input,
rng: &mut R,
) -> Result<CpStep<Self>, Error<D::Error>>
fn handle_input<R: Rng>( &mut self, input: Self::Input, rng: &mut R, ) -> Result<CpStep<Self>, Error<D::Error>>
Source§fn handle_message<R: Rng>(
&mut self,
sender_id: &D::NodeId,
message: Self::Message,
rng: &mut R,
) -> Result<CpStep<Self>, Error<D::Error>>
fn handle_message<R: Rng>( &mut self, sender_id: &D::NodeId, message: Self::Message, rng: &mut R, ) -> Result<CpStep<Self>, Error<D::Error>>
sender_id.Source§fn terminated(&self) -> bool
fn terminated(&self) -> bool
true if execution has completed and this instance can be dropped.Auto Trait Implementations§
impl<D> Freeze for SenderQueue<D>
impl<D> RefUnwindSafe for SenderQueue<D>where
D: RefUnwindSafe,
<D as ConsensusProtocol>::NodeId: RefUnwindSafe,
<D as Epoched>::Epoch: RefUnwindSafe,
<D as ConsensusProtocol>::Message: RefUnwindSafe,
impl<D> Send for SenderQueue<D>
impl<D> Sync for SenderQueue<D>
impl<D> Unpin for SenderQueue<D>
impl<D> UnsafeUnpin for SenderQueue<D>
impl<D> UnwindSafe for SenderQueue<D>where
D: UnwindSafe,
<D as ConsensusProtocol>::NodeId: UnwindSafe + RefUnwindSafe,
<D as Epoched>::Epoch: RefUnwindSafe,
<D as ConsensusProtocol>::Message: RefUnwindSafe,
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
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.impl<M> Message for M
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.impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
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.