Skip to main content

BlockBuilder

Struct BlockBuilder 

Source
pub struct BlockBuilder<T: NodeType> {
Show 19 fields instance: Arc<T::InstanceState>, membership: EpochMembershipCoordinator<T>, retry_pending: HashMap<Commitment<T::Transaction>, RetryEntry<T>>, retry_order: BTreeSet<(ViewNumber, Commitment<T::Transaction>)>, retry_total_bytes: u64, leader_buffer: HashMap<Commitment<T::Transaction>, PoolEntry<T>>, leader_order: BTreeSet<(ViewNumber, Commitment<T::Transaction>)>, leader_total_bytes: u64, dedups: BTreeMap<ViewNumber, HashSet<Commitment<T::Transaction>>>, undecided: BTreeMap<(ViewNumber, VidCommitment2), Vec<Commitment<T::Transaction>>>, decided: BTreeSet<(ViewNumber, VidCommitment2)>, config: BlockBuilderConfig, upgrade_lock: UpgradeLock<T>, current_view: ViewNumber, calculations: BTreeMap<(ViewNumber, Commitment<Leaf2<T>>), AbortHandle>, view_transactions: BTreeMap<ViewNumber, PooledBlock<T>>, tasks: JoinSet<Result<BlockBuilderOutput<T>, BlockError>>, commitments_duration_metric: Option<Arc<dyn Histogram>>, tracer: Option<LeaderTracerHandle>,
}

Fields§

§instance: Arc<T::InstanceState>§membership: EpochMembershipCoordinator<T>§retry_pending: HashMap<Commitment<T::Transaction>, RetryEntry<T>>§retry_order: BTreeSet<(ViewNumber, Commitment<T::Transaction>)>§retry_total_bytes: u64§leader_buffer: HashMap<Commitment<T::Transaction>, PoolEntry<T>>§leader_order: BTreeSet<(ViewNumber, Commitment<T::Transaction>)>§leader_total_bytes: u64§dedups: BTreeMap<ViewNumber, HashSet<Commitment<T::Transaction>>>§undecided: BTreeMap<(ViewNumber, VidCommitment2), Vec<Commitment<T::Transaction>>>§decided: BTreeSet<(ViewNumber, VidCommitment2)>§config: BlockBuilderConfig§upgrade_lock: UpgradeLock<T>§current_view: ViewNumber§calculations: BTreeMap<(ViewNumber, Commitment<Leaf2<T>>), AbortHandle>§view_transactions: BTreeMap<ViewNumber, PooledBlock<T>>

The transactions taken for the first block of each view, with their hashes.

Every later block for the view is built from exactly these. A leader disperses a block as soon as it is built, and peers keep one share per leader and view, so a second block for the view is votable only if its payload is the same. It is the same whenever the new parent does not change how the payload is built.

§tasks: JoinSet<Result<BlockBuilderOutput<T>, BlockError>>§commitments_duration_metric: Option<Arc<dyn Histogram>>§tracer: Option<LeaderTracerHandle>

Records the four block-builder events (request, payload start, commitments start/end), when set.

Implementations§

Source§

impl<T: NodeType> BlockBuilder<T>

Source

pub fn new( instance: Arc<T::InstanceState>, membership: EpochMembershipCoordinator<T>, config: BlockBuilderConfig, upgrade_lock: UpgradeLock<T>, ) -> Self

Source

pub fn with_tracer(self, tracer: Option<LeaderTracerHandle>) -> Self

Registers the leader tracer; builder-style like with_metrics.

Source

pub fn with_metrics( self, commitments_duration: Option<Arc<dyn Histogram>>, ) -> Self

Source

pub fn request_block(&mut self, request: BlockAndHeaderRequest<T>)

Source

fn transactions_for(&mut self, view: ViewNumber) -> PooledBlock<T>

Source

fn take_block( &mut self, view: ViewNumber, ) -> (Vec<T::Transaction>, Vec<Commitment<T::Transaction>>)

Removes up to one block of pooled transactions, those sent for the earliest views first, and returns them with their hashes.

Source

fn remove_pooled( &mut self, hash: &Commitment<T::Transaction>, ) -> Option<T::Transaction>

Source

pub async fn next( &mut self, ) -> Option<Result<BlockBuilderOutput<T>, BlockError>>

Source

pub fn gc(&mut self, view_number: ViewNumber)

Source

pub fn fanout(&self) -> NonZeroU64

Source

pub fn start_at(&mut self, view: ViewNumber)

Starts the builder at view instead of genesis. Transactions can be submitted before the first on_view_changed, and would otherwise target the leaders of the first views and expire at the first view change.

Source

pub fn outstanding_transactions(&self) -> (usize, usize)

Source

pub fn on_submit_transaction( &mut self, tx: T::Transaction, ) -> Result<Option<TransactionMessage<T>>, SubmitError>

Returns the message for the upcoming leaders, addressed to the view SEND_LEAD ahead, which the coordinator sends on to the leaders of the fanout views from there. Resubmitting a queued transaction succeeds without queueing or sending it twice.

Source

pub fn on_transactions(&mut self, msg: TransactionMessage<T>)

Source

pub fn on_dedup_manifest(&mut self, manifest: DedupManifest<T>)

Source

pub fn on_view_changed( &mut self, view: ViewNumber, ) -> Option<TransactionMessage<T>>

Returns the pending transactions to send again, within one block and one message, addressed like on_submit_transaction. A transaction is sent again only once every leader it went to has had its turn without including it.

Source

fn resend_batch(&mut self, view: ViewNumber) -> Vec<T::Transaction>

Source

fn expire_pooled(&mut self, view: ViewNumber)

Drops pooled transactions sent for views more than ttl behind view: their senders have stopped retrying them.

Source

fn expire_block_records(&mut self, view: ViewNumber)

Drops the records of blocks more than ttl views behind view: everything submitted before such a block was built has expired by now, so its record can no longer clear anything from retry_pending.

Source

fn remove_pending(&mut self, hash: &Commitment<T::Transaction>)

Source

fn block_size(&self, view: ViewNumber) -> u64

The block size of the protocol version running at view.

Source

pub fn on_block_reconstructed( &mut self, view: ViewNumber, payload_commitment: VidCommitment2, tx_commitments: Vec<Commitment<T::Transaction>>, )

Call for every block this node proposes or reconstructs, so it drops copies of the block’s transactions that reach it later. It keeps forwarding its own submissions until Self::on_blocks_decided confirms the block: a proposed, or even locked, block can still be abandoned, and its transactions would otherwise be lost.

Source

pub fn on_blocks_decided( &mut self, blocks: impl IntoIterator<Item = (ViewNumber, VidCommitment2)>, )

Call with every decided block. Its transactions leave retry_pending. The records of older blocks stay: a view that decides after a newer one is a gap fill, not an abandoned branch, and records expire with the retry TTL anyway.

Source

fn mark_included( &mut self, view: ViewNumber, hashes: Vec<Commitment<T::Transaction>>, )

Auto Trait Implementations§

§

impl<T> !RefUnwindSafe for BlockBuilder<T>

§

impl<T> !UnwindSafe for BlockBuilder<T>

§

impl<T> Freeze for BlockBuilder<T>

§

impl<T> Send for BlockBuilder<T>

§

impl<T> Sync for BlockBuilder<T>

§

impl<T> Unpin for BlockBuilder<T>
where <T as NodeType>::Transaction: Unpin,

§

impl<T> UnsafeUnpin for BlockBuilder<T>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert 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>

Convert 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)

Convert &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)

Convert &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
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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 T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows 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) -> R
where R: 'a,

Mutably borrows 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
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more