pub struct Consensus {
pub blockchain: Blockchain,
pub confirmation_threshold: usize,
pub forks: RwLock<Vec<Fork>>,
pub module: RwLock<PoWModule>,
pub append_lock: RwLock<()>,
}Expand description
This struct represents the information required by the consensus algorithm
Fields§
§blockchain: BlockchainCanonical (confirmed) blockchain
confirmation_threshold: usizeFork size(length) after which it can be confirmed
forks: RwLock<Vec<Fork>>Fork chains containing block proposals
module: RwLock<PoWModule>Canonical blockchain PoW module state
append_lock: RwLock<()>Lock to restrict when proposals appends can happen
Implementations§
Source§impl Consensus
impl Consensus
Sourcepub fn new(
blockchain: Blockchain,
confirmation_threshold: usize,
pow_target: u32,
pow_fixed_difficulty: Option<BigUint>,
) -> Result<Self>
pub fn new( blockchain: Blockchain, confirmation_threshold: usize, pow_target: u32, pow_fixed_difficulty: Option<BigUint>, ) -> Result<Self>
Generate a new Consensus state.
Sourcepub async fn generate_empty_fork(&self) -> Result<()>
pub async fn generate_empty_fork(&self) -> Result<()>
Generate a new empty fork.
Sourcepub async fn append_proposal(
&self,
proposal: &Proposal,
verify_fees: bool,
) -> Result<()>
pub async fn append_proposal( &self, proposal: &Proposal, verify_fees: bool, ) -> Result<()>
Given a proposal, the node verifys it and finds which fork it extends. If the proposal extends the canonical blockchain, a new fork chain is created.
Sourcepub async fn find_extended_fork(
&self,
proposal: &Proposal,
) -> Result<(Fork, Option<usize>)>
pub async fn find_extended_fork( &self, proposal: &Proposal, ) -> Result<(Fork, Option<usize>)>
Given a proposal, find the fork chain it extends, and return its full clone. If the proposal extends the fork not on its tail, a new fork is created and we re-apply the proposals up to the extending one. If proposal extends canonical, a new fork is created. Additionally, we return the fork index if a new fork was not created, so caller can replace the fork.
Sourcepub async fn confirmation(&self) -> Result<Option<usize>>
pub async fn confirmation(&self) -> Result<Option<usize>>
Check if best fork proposals can be confirmed. Consensus confirmation logic:
- If the current best fork has reached greater length than the security threshold, and no other fork exist with same rank, first proposal(s) in that fork can be appended to canonical blockchain (confirme).
When best fork can be confirmed, first block(s) should be appended to canonical, and forks should be rebuilt.
Sourcepub async fn get_fork_header_hash(
&self,
height: u32,
fork_header: &HeaderHash,
) -> Result<Option<HeaderHash>>
pub async fn get_fork_header_hash( &self, height: u32, fork_header: &HeaderHash, ) -> Result<Option<HeaderHash>>
Auxiliary function to retrieve the fork header hash of provided height. The fork is identified by the provided header hash.
Sourcepub async fn get_fork_headers(
&self,
headers: &[HeaderHash],
fork_header: &HeaderHash,
) -> Result<Vec<Header>>
pub async fn get_fork_headers( &self, headers: &[HeaderHash], fork_header: &HeaderHash, ) -> Result<Vec<Header>>
Auxiliary function to retrieve the fork headers of provided hashes. The fork is identified by the provided header hash. If fork doesn’t exists, an empty vector is returned.
Sourcepub async fn get_fork_proposals(
&self,
headers: &[HeaderHash],
fork_header: &HeaderHash,
) -> Result<Vec<Proposal>>
pub async fn get_fork_proposals( &self, headers: &[HeaderHash], fork_header: &HeaderHash, ) -> Result<Vec<Proposal>>
Auxiliary function to retrieve the fork proposals of provided hashes. The fork is identified by the provided header hash. If fork doesn’t exists, an empty vector is returned.
Sourcepub async fn get_fork_proposals_after(
&self,
tip: HeaderHash,
fork_tip: Option<HeaderHash>,
limit: u32,
) -> Result<Vec<Proposal>>
pub async fn get_fork_proposals_after( &self, tip: HeaderHash, fork_tip: Option<HeaderHash>, limit: u32, ) -> Result<Vec<Proposal>>
Auxiliary function to retrieve a fork proposals, starting from provided tip.
If provided tip is too far behind, unknown, or fork doesn’t exists, an empty
vector is returned. The fork is identified by the optional provided header hash.
If its None, we use our best fork.
Sourcepub async fn current_mining_randomx_key(&self) -> Result<HeaderHash>
pub async fn current_mining_randomx_key(&self) -> Result<HeaderHash>
Auxiliary function to grab current mining RandomX key, based on next block height. If no forks exist, returns the canonical key.
Sourcepub async fn best_current_fork(&self) -> Result<Fork>
pub async fn best_current_fork(&self) -> Result<Fork>
Auxiliary function to grab best current fork full clone.
Sourcepub async fn best_fork_last_header(&self) -> Result<(u32, HeaderHash)>
pub async fn best_fork_last_header(&self) -> Result<(u32, HeaderHash)>
Auxiliary function to retrieve current best fork last header. If no forks exist, grab the last header from canonical.
Sourcepub async fn reset_forks(
&self,
prefix: &[HeaderHash],
confirmed_fork_index: &usize,
confirmed_txs: &[Transaction],
) -> Result<()>
pub async fn reset_forks( &self, prefix: &[HeaderHash], confirmed_fork_index: &usize, confirmed_txs: &[Transaction], ) -> Result<()>
Auxiliary function to purge current forks and reset the ones starting with the provided prefix, excluding provided confirmed fork. Additionally, remove confirmed transactions from the forks mempools, along with the unporposed transactions sled trees. This function assumes that the prefix blocks have already been appended to canonical chain from the confirmed fork.
Sourcepub async fn purge_forks(&self) -> Result<()>
pub async fn purge_forks(&self) -> Result<()>
Auxiliary function to fully purge current forks and leave only a new empty fork.
Sourcepub async fn reset_pow_module(&self) -> Result<()>
pub async fn reset_pow_module(&self) -> Result<()>
Auxiliary function to reset PoW module.
Sourcepub async fn healthcheck(&self) -> Result<()>
pub async fn healthcheck(&self) -> Result<()>
Auxiliary function to check current contracts states Monotree(SMT) validity in all active forks and canonical.
Auto Trait Implementations§
impl !Freeze for Consensus
impl !RefUnwindSafe for Consensus
impl Send for Consensus
impl Sync for Consensus
impl Unpin for Consensus
impl !UnwindSafe for Consensus
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<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>, which can then be
downcast into Box<dyn 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>, which 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> DowncastSend for T
impl<T> DowncastSend for T
§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> 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, N1, N2> Niching<NichedOption<T, N1>> for N2where
T: SharedNiching<N1, N2>,
N1: Niching<T>,
N2: Niching<T>,
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2where
T: SharedNiching<N1, N2>,
N1: Niching<T>,
N2: Niching<T>,
§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> Pointee for T
impl<T> Pointee 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.