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>
§broadcast_svc: BroadcastSvc<ClearNet>
The broadcast service, to broadcast new blocks.
Implementations§
Source§impl BlockchainManager
impl BlockchainManager
Sourcepub async fn handle_command(&mut self, command: BlockchainManagerCommand)
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.
Sourceasync fn broadcast_block(
&mut self,
block_bytes: Bytes,
blockchain_height: usize,
)
async fn broadcast_block( &mut self, block_bytes: Bytes, blockchain_height: usize, )
Broadcast a valid block to the network.
Sourcepub async fn handle_incoming_block(
&mut self,
block: Block,
prepared_txs: HashMap<[u8; 32], TransactionVerificationData>,
) -> Result<IncomingBlockOk, Error>
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.
Sourcepub async fn handle_incoming_block_batch(&mut self, batch: BlockBatch)
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.
Sourceasync fn handle_incoming_block_batch_main_chain(&mut self, batch: BlockBatch)
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.
Sourceasync fn handle_incoming_block_batch_alt_chain(&mut self, batch: BlockBatch)
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.
Sourceasync fn handle_incoming_alt_block(
&mut self,
block: Block,
prepared_txs: HashMap<[u8; 32], TransactionVerificationData>,
) -> Result<AddAltBlock, Error>
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.
Sourceasync fn try_do_reorg(
&mut self,
top_alt_block: AltBlockInformation,
) -> Result<(), Error>
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.
Sourceasync fn verify_add_alt_blocks_to_main_chain(
&mut self,
alt_blocks: Vec<AltBlockInformation>,
) -> Result<(), Error>
async fn verify_add_alt_blocks_to_main_chain( &mut self, alt_blocks: Vec<AltBlockInformation>, ) -> Result<(), Error>
Verify and add a list of AltBlockInformation
s 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.
Sourcepub async fn add_valid_block_to_main_chain(
&mut self,
verified_block: VerifiedBlockInformation,
)
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
impl BlockchainManager
Sourcepub async fn run(
self,
block_batch_rx: Receiver<BlockBatch>,
command_rx: Receiver<BlockchainManagerCommand>,
)
pub async fn run( self, block_batch_rx: Receiver<BlockBatch>, command_rx: Receiver<BlockchainManagerCommand>, )
The BlockchainManager
task.
Auto Trait Implementations§
impl Freeze for BlockchainManager
impl !RefUnwindSafe for BlockchainManager
impl Send for BlockchainManager
impl Sync for BlockchainManager
impl Unpin for BlockchainManager
impl !UnwindSafe for BlockchainManager
Blanket Implementations§
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
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§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 moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§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 moreSource§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 moreSource§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
Source§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
Source§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.Source§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.Source§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.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> Tap for T
impl<T> Tap for T
Source§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
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