cuprated::blockchain::manager

Struct BlockchainManager

Source
pub struct BlockchainManager {
    blockchain_write_handle: BlockchainWriteHandle,
    blockchain_read_handle: BlockchainReadHandle,
    txpool_write_handle: TxpoolWriteHandle,
    blockchain_context_service: BlockChainContextService,
    cached_blockchain_context: RawBlockChainContext,
    block_verifier_service: BlockVerifierService<BlockChainContextService, TxVerifierService<MapErr<BlockchainReadHandle, fn(_: RuntimeError) -> BoxError>>, MapErr<BlockchainReadHandle, fn(_: RuntimeError) -> BoxError>>,
    stop_current_block_downloader: Arc<Notify>,
    broadcast_svc: BroadcastSvc<ClearNet>,
}
Expand description

The blockchain manager.

This handles all mutation of the blockchain, anything that changes the state of the blockchain must go through this.

Other parts of Cuprate can interface with this by using the functions in interface.

Fields§

§blockchain_write_handle: BlockchainWriteHandle

The BlockchainWriteHandle, this is the only part of Cuprate where a BlockchainWriteHandle is held.

§blockchain_read_handle: BlockchainReadHandle§txpool_write_handle: TxpoolWriteHandle§blockchain_context_service: BlockChainContextService

The blockchain context cache, this caches the current state of the blockchain to quickly calculate/retrieve values without needing to go to a BlockchainReadHandle.

§cached_blockchain_context: RawBlockChainContext

A cached context representing the current state.

§block_verifier_service: BlockVerifierService<BlockChainContextService, TxVerifierService<MapErr<BlockchainReadHandle, fn(_: RuntimeError) -> BoxError>>, MapErr<BlockchainReadHandle, fn(_: RuntimeError) -> BoxError>>

The block verifier service, to verify incoming blocks.

§stop_current_block_downloader: Arc<Notify>

A Notify to tell the syncer that we want to cancel this current download attempt.

§broadcast_svc: BroadcastSvc<ClearNet>

The broadcast service, to broadcast new blocks.

Implementations§

Source§

impl BlockchainManager

Source

pub async fn handle_command(&mut self, command: BlockchainManagerCommand)

Handle an incoming command from another part of Cuprate.

§Panics

This function will panic if any internal service returns an unexpected error that we cannot recover from.

Source

async fn broadcast_block( &mut self, block_bytes: Bytes, blockchain_height: usize, )

Broadcast a valid block to the network.

Source

pub async fn handle_incoming_block( &mut self, block: Block, prepared_txs: HashMap<[u8; 32], TransactionVerificationData>, ) -> Result<IncomingBlockOk, Error>

Handle an incoming Block.

This function will route to Self::handle_incoming_alt_block if the block does not follow the top of the main chain.

Otherwise, this function will validate and add the block to the main chain.

§Panics

This function will panic if any internal service returns an unexpected error that we cannot recover from.

Source

pub async fn handle_incoming_block_batch(&mut self, batch: BlockBatch)

Handle an incoming BlockBatch.

This function will route to Self::handle_incoming_block_batch_main_chain or Self::handle_incoming_block_batch_alt_chain depending on if the first block in the batch follows from the top of our chain.

§Panics

This function will panic if the batch is empty or if any internal service returns an unexpected error that we cannot recover from or if the incoming batch contains no blocks.

Source

async fn handle_incoming_block_batch_main_chain(&mut self, batch: BlockBatch)

Handles an incoming BlockBatch that follows the main chain.

This function will handle validating the blocks in the batch and adding them to the blockchain database and context cache.

This function will also handle banning the peer and canceling the block downloader if the block is invalid.

§Panics

This function will panic if any internal service returns an unexpected error that we cannot recover from or if the incoming batch contains no blocks.

Source

async fn handle_incoming_block_batch_alt_chain(&mut self, batch: BlockBatch)

Handles an incoming BlockBatch that does not follow the main-chain.

This function will handle validating the alt-blocks to add them to our cache and reorging the chain if the alt-chain has a higher cumulative difficulty.

This function will also handle banning the peer and canceling the block downloader if the alt block is invalid or if a reorg fails.

§Panics

This function will panic if any internal service returns an unexpected error that we cannot recover from.

Source

async fn handle_incoming_alt_block( &mut self, block: Block, prepared_txs: HashMap<[u8; 32], TransactionVerificationData>, ) -> Result<AddAltBlock, Error>

Handles an incoming alt Block.

This function will do some pre-validation of the alt block, then if the cumulative difficulty of the alt chain is higher than the main chain it will attempt a reorg otherwise it will add the alt block to the alt block cache.

§Errors

This will return an Err if:

  • The alt block was invalid.
  • An attempt to reorg the chain failed.
§Panics

This function will panic if any internal service returns an unexpected error that we cannot recover from.

Source

async fn try_do_reorg( &mut self, top_alt_block: AltBlockInformation, ) -> Result<(), Error>

Attempt a re-org with the given top block of the alt-chain.

This function will take a write lock on REORG_LOCK and then set up the blockchain database and context cache to verify the alt-chain. It will then attempt to verify and add each block in the alt-chain to the main-chain. Releasing the lock on REORG_LOCK when finished.

§Errors

This function will return an Err if the re-org was unsuccessful, if this happens the chain will be returned back into its state it was at when then function was called.

§Panics

This function will panic if any internal service returns an unexpected error that we cannot recover from.

Source

async fn verify_add_alt_blocks_to_main_chain( &mut self, alt_blocks: Vec<AltBlockInformation>, ) -> Result<(), Error>

Verify and add a list of AltBlockInformations to the main-chain.

This function assumes the first AltBlockInformation is the next block in the blockchain for the blockchain database and the context cache, or in other words that the blockchain database and context cache have already had the top blocks popped to where the alt-chain meets the main-chain.

§Errors

This function will return an Err if the alt-blocks were invalid, in this case the re-org should be aborted and the chain should be returned to its previous state.

§Panics

This function will panic if any internal service returns an unexpected error that we cannot recover from.

Source

pub async fn add_valid_block_to_main_chain( &mut self, verified_block: VerifiedBlockInformation, )

Adds a VerifiedBlockInformation to the main-chain.

This function will update the blockchain database and the context cache, it will also update Self::cached_blockchain_context.

§Panics

This function will panic if any internal service returns an unexpected error that we cannot recover from.

Source§

impl BlockchainManager

Source

pub async fn run( self, block_batch_rx: Receiver<BlockBatch>, command_rx: Receiver<BlockchainManagerCommand>, )

Auto Trait Implementations§

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> Conv for T

Source§

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

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

impl<T> FmtForward for T

Source§

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

Source§

impl<T> Instrument for T

Source§

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

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

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

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

Source§

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

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

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

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

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

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

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

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

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

impl<T> Pointable for T

Source§

const ALIGN: usize = _

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

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

Initializes a with the given initializer. Read more
Source§

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

Dereferences the given pointer. Read more
Source§

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

Mutably dereferences the given pointer. Read more
Source§

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> Tap for T

Source§

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

Immutable access to a value. Read more
Source§

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

Mutable access to a value. Read more
Source§

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

impl<T> TryConv for T

Source§

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

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

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

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

fn with_current_subscriber(self) -> WithDispatch<Self>

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

Layout§

Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.

Size: 400 bytes