pub struct Validator {
pub blockchain: Blockchain,
pub consensus: Consensus,
pub synced: RwLock<bool>,
pub verify_fees: bool,
}Expand description
This struct represents a DarkFi validator node.
Fields§
§blockchain: BlockchainCanonical (confirmed) blockchain
consensus: ConsensusHot/Live data used by the consensus algorithm
synced: RwLock<bool>Flag signalling node has finished initial sync
verify_fees: boolFlag to enable tx fee verification
Implementations§
Source§impl Validator
impl Validator
pub async fn new(db: &Db, config: &ValidatorConfig) -> Result<ValidatorPtr>
Sourcepub async fn calculate_fee(
&self,
tx: &Transaction,
verify_fee: bool,
) -> Result<u64>
pub async fn calculate_fee( &self, tx: &Transaction, verify_fee: bool, ) -> Result<u64>
Auxiliary function to compute provided transaction’s required fee,
against current best fork.
The function takes a boolean called verify_fee to overwrite
the nodes configured verify_fees flag.
Sourcepub async fn append_tx(&self, tx: &Transaction, write: bool) -> Result<()>
pub async fn append_tx(&self, tx: &Transaction, write: bool) -> Result<()>
The node retrieves a transaction, validates its state transition, and appends it to the pending txs store.
Sourcepub async fn purge_pending_txs(&self) -> Result<()>
pub async fn purge_pending_txs(&self) -> Result<()>
The node removes invalid transactions from the pending txs store.
Sourcepub async fn append_proposal(&self, proposal: &Proposal) -> Result<()>
pub async fn append_proposal(&self, proposal: &Proposal) -> Result<()>
The node locks its consensus state and tries to append provided proposal.
Sourcepub async fn confirmation(&self) -> Result<Vec<BlockInfo>>
pub async fn confirmation(&self) -> Result<Vec<BlockInfo>>
The node checks if best fork can be confirmed. If proposals can be confirmed, node appends them to canonical, and resets the current forks.
Sourcepub async fn add_checkpoint_blocks(
&self,
blocks: &[BlockInfo],
headers: &[HeaderHash],
) -> Result<()>
pub async fn add_checkpoint_blocks( &self, blocks: &[BlockInfo], headers: &[HeaderHash], ) -> Result<()>
Apply provided set of BlockInfo without doing formal verification.
A set of HeaderHash is also provided, to verify that the provided
block hash matches the expected header one.
Note: this function should only be used for blocks received using a
checkpoint, since in that case we enforce the node to follow the sequence,
assuming all its blocks are valid. Additionally, it will update
any forks to a single empty one, holding the updated module.
Sourcepub async fn add_test_blocks(&self, blocks: &[BlockInfo]) -> Result<()>
pub async fn add_test_blocks(&self, blocks: &[BlockInfo]) -> Result<()>
Validate a set of BlockInfo in sequence and apply them if all are valid.
Note: this function should only be used in tests when we don’t want to
perform consensus logic.
Sourcepub async fn add_test_transactions(
&self,
txs: &[Transaction],
verifying_block_height: u32,
block_target: u32,
write: bool,
verify_fees: bool,
) -> Result<(u64, u64)>
pub async fn add_test_transactions( &self, txs: &[Transaction], verifying_block_height: u32, block_target: u32, write: bool, verify_fees: bool, ) -> Result<(u64, u64)>
Validate a set of Transaction in sequence and apply them if all are valid.
In case any of the transactions fail, they will be returned to the caller.
The function takes a boolean called write which tells it to actually write
the state transitions to the database, and a boolean called verify_fees to
overwrite the nodes configured verify_fees flag.
Returns the total gas used and total paid fees for the given transactions. Note: this function should only be used in tests.
Sourcepub async fn add_test_producer_transaction(
&self,
tx: &Transaction,
verifying_block_height: u32,
block_target: u32,
write: bool,
) -> Result<()>
pub async fn add_test_producer_transaction( &self, tx: &Transaction, verifying_block_height: u32, block_target: u32, write: bool, ) -> Result<()>
Validate a producer Transaction and apply it if valid.
In case the transactions fail, ir will be returned to the caller.
The function takes a boolean called write which tells it to actually write
the state transitions to the database.
This should be only used for test purposes.
Sourcepub async fn validate_blockchain(
&self,
pow_target: u32,
pow_fixed_difficulty: Option<BigUint>,
) -> Result<()>
pub async fn validate_blockchain( &self, pow_target: u32, pow_fixed_difficulty: Option<BigUint>, ) -> Result<()>
Retrieve all existing blocks and try to apply them to an in memory overlay to verify their correctness. Be careful as this will try to load everything in memory.
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_next_block_height(&self) -> Result<u32>
pub async fn best_fork_next_block_height(&self) -> Result<u32>
Auxiliary function to retrieve current best fork next block height.
Sourcepub async fn reset_to_height(&self, height: u32) -> Result<()>
pub async fn reset_to_height(&self, height: u32) -> Result<()>
Auxiliary function to reset the validator blockchain and consensus states to the provided block height.
Auto Trait Implementations§
impl !Freeze for Validator
impl !RefUnwindSafe for Validator
impl Send for Validator
impl Sync for Validator
impl Unpin for Validator
impl !UnwindSafe for Validator
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.