Struct ChainState

Source
pub struct ChainState<PersistedState: ChainStore> { /* private fields */ }
Expand description

The high-level chain backend managing the blockchain state.

ChainState is responsible for:

  • Keeping track of the chain state with the help of a ChainStore for persisted storage.
  • Correctly updating the state using consensus functions.
  • Interfacing with other components and providing data about the current view of the chain.

Implementations§

Source§

impl<PersistedState: ChainStore> ChainState<PersistedState>

Source

pub fn push_headers( &self, headers: Vec<BlockHeader>, height: u32, ) -> Result<(), BlockchainError>

Just adds headers to the chainstate, without validating them.

Source

pub fn new( chainstore: PersistedState, network: Network, assume_valid: AssumeValidArg, ) -> ChainState<PersistedState>

Source

pub fn load_chain_state( chainstore: PersistedState, network: Network, assume_valid: AssumeValidArg, ) -> Result<ChainState<PersistedState>, BlockchainError>

Source

pub fn acc(&self) -> Stump

Source

pub fn get_bip34_height(&self, block: &Block) -> Option<u32>

Source

pub fn validate_block_no_acc( &self, block: &Block, height: u32, inputs: HashMap<OutPoint, UtxoData>, ) -> Result<(), BlockchainError>

Validates the block without checking whether the inputs are present in the UTXO set. This function contains the core validation logic.

The methods BlockchainInterface::validate_block and UpdatableChainstate::connect_block call this and additionally verify the inclusion proof (i.e., they perform full validation).

Trait Implementations§

Source§

impl<PersistedState: ChainStore> BlockchainInterface for ChainState<PersistedState>

Source§

type Error = BlockchainError

Source§

fn get_params(&self) -> Params

Source§

fn acc(&self) -> Stump

Source§

fn get_fork_point(&self, block: BlockHash) -> Result<BlockHash, Self::Error>

Source§

fn update_acc( &self, acc: Stump, block: UtreexoBlock, height: u32, proof: Proof, del_hashes: Vec<Hash>, ) -> Result<Stump, Self::Error>

Source§

fn get_chain_tips(&self) -> Result<Vec<BlockHash>, Self::Error>

Source§

fn validate_block( &self, block: &Block, proof: Proof, inputs: HashMap<OutPoint, UtxoData>, del_hashes: Vec<Hash>, acc: Stump, ) -> Result<(), Self::Error>

Source§

fn get_block_locator_for_tip( &self, tip: BlockHash, ) -> Result<Vec<BlockHash>, BlockchainError>

Returns a block locator from a given tip Read more
Source§

fn is_in_ibd(&self) -> bool

Tells whether or not we are on IBD
Source§

fn get_block_height(&self, hash: &BlockHash) -> Result<Option<u32>, Self::Error>

Returns the height of a block, given it’s hash
Source§

fn get_block_hash(&self, height: u32) -> Result<BlockHash, Self::Error>

Returns the block with a given height in our current tip.
Source§

fn get_tx(&self, _txid: &Txid) -> Result<Option<Transaction>, Self::Error>

Returns a bitcoin [Transaction] given it’s txid.
Source§

fn get_height(&self) -> Result<u32, Self::Error>

Get the height of our best know chain.
Source§

fn broadcast(&self, tx: &Transaction) -> Result<(), Self::Error>

Broadcasts a transaction to the network.
Source§

fn estimate_fee(&self, target: usize) -> Result<f64, Self::Error>

Returns fee estimation for inclusion in target blocks.
Source§

fn get_block(&self, _hash: &BlockHash) -> Result<Block, Self::Error>

Returns a block with a given hash if any.
Source§

fn get_best_block(&self) -> Result<(u32, BlockHash), Self::Error>

Returns the best known block
Source§

fn get_block_header(&self, hash: &BlockHash) -> Result<Header, Self::Error>

Returns associated header for block with hash
Source§

fn subscribe(&self, tx: Arc<dyn BlockConsumer>)

Register for receiving notifications for some event. Right now it only works for new blocks, but may work with transactions in the future too. if a module performs some heavy-lifting on the block’s data, it should pass in a vector or a channel where data can be transferred to the atual worker, otherwise chainstate will be stuck for as long as you have work to do.
Source§

fn get_block_locator(&self) -> Result<Vec<BlockHash>, BlockchainError>

Returns a block locator
Source§

fn get_validation_index(&self) -> Result<u32, Self::Error>

Returns the last block we validated
Source§

fn is_coinbase_mature( &self, height: u32, block: BlockHash, ) -> Result<bool, Self::Error>

Checks if a coinbase is mature
Source§

fn get_unbroadcasted(&self) -> Vec<Transaction>

Returns the list of unbroadcasted transactions.
Source§

impl<T: ChainStore> TryFrom<ChainStateBuilder<T>> for ChainState<T>

Source§

type Error = BlockchainBuilderError

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

fn try_from(builder: ChainStateBuilder<T>) -> Result<Self, Self::Error>

Performs the conversion.
Source§

impl<PersistedState: ChainStore> UpdatableChainstate for ChainState<PersistedState>

Source§

fn switch_chain(&self, new_tip: BlockHash) -> Result<(), BlockchainError>

Source§

fn get_acc(&self) -> Stump

Returns the current accumulator
Source§

fn mark_block_as_valid(&self, block: BlockHash) -> Result<(), BlockchainError>

Marks one block as being fully validated, this overrides a block that was explicitly marked as invalid.
Source§

fn mark_chain_as_assumed( &self, acc: Stump, assumed_hash: BlockHash, ) -> Result<bool, BlockchainError>

Marks a chain as fully-valid Read more
Source§

fn invalidate_block(&self, block: BlockHash) -> Result<(), BlockchainError>

Tells this blockchain to consider this block invalid, and not build on top of it
Source§

fn toggle_ibd(&self, is_ibd: bool)

Toggle IBD on/off
Source§

fn connect_block( &self, block: &Block, proof: Proof, inputs: HashMap<OutPoint, UtxoData>, del_hashes: Vec<Hash>, ) -> Result<u32, BlockchainError>

This is one of the most important methods for a ChainState, it gets a block and some utreexo data, validates this block and connects to our chain of blocks. This function is meant to be atomic and prone of running in parallel.
Source§

fn handle_transaction(&self) -> Result<(), BlockchainError>

Not used for now, but in a future blockchain with mempool, we can process transactions that are not in a block yet.
Source§

fn flush(&self) -> Result<(), BlockchainError>

Persists our data. Should be invoked periodically.
Source§

fn accept_header(&self, header: BlockHeader) -> Result<(), BlockchainError>

Accepts a new header to our chain. This method is called before connect_block, and makes some basic checks on a header and saves it on disk. We only accept a block as valid after calling connect_block. Read more
Source§

fn get_root_hashes(&self) -> Vec<BitcoinNodeHash>

Returns the root hashes of our utreexo forest
Source§

fn get_partial_chain( &self, initial_height: u32, final_height: u32, acc: Stump, ) -> Result<PartialChainState, BlockchainError>

Returns a partial chainstate from a range of blocks. Read more

Auto Trait Implementations§

§

impl<PersistedState> !Freeze for ChainState<PersistedState>

§

impl<PersistedState> !RefUnwindSafe for ChainState<PersistedState>

§

impl<PersistedState> Send for ChainState<PersistedState>
where PersistedState: Send,

§

impl<PersistedState> Sync for ChainState<PersistedState>
where PersistedState: Send + Sync,

§

impl<PersistedState> Unpin for ChainState<PersistedState>
where PersistedState: Unpin,

§

impl<PersistedState> !UnwindSafe for ChainState<PersistedState>

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

impl<T> Same for T

Source§

type Output = T

Should always be Self
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<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
Source§

impl<T> ChainBackend for T

Source§

impl<T> ThreadSafeChain for T
where T: ChainBackend + Sync + Send + 'static,