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: Blockchain
Canonical (confirmed) blockchain
confirmation_threshold: usize
Fork 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 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.
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<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> 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> 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.