Mavryk_shell.Distributed_db
Mavryk Shell - High-level API for the Gossip network and local storage.
It provides functions to query *static* resources such as blocks headers, operations, and functions to access dynamic resources such as heads and chains.
Several chains (mainchain, testchain, ...) can be managed independently. First a chain is activated using activate
, which provides a chain_db
from which it is possible to access resources. Eventually the chain is deactivated using deactivate
.
Static resources are accessible via "Requester" modules (Block_header
, Operation
, Operations
, Protocol
). These modules act as read-through caches in front of the local storage State
and the p2p layer. They centralize concurrent requests, and cache results in memory. They don't update State
directly.
For instance, from a block_header hash, one can fetch the actual block header using Block_header.fetch
, then the block operations with Operations.fetch
.
module Message = Distributed_db_message
type db = t
val create : Mavryk_store.Store.t -> p2p -> t
val store : db -> Mavryk_store.Store.t
val shutdown : t -> unit Lwt.t
val activate :
t ->
Mavryk_store.Store.Chain.t ->
P2p_reader.callback ->
chain_db
The first call to activate t chain callbacks
activates chain
, creates a chain_db
and sends a Get_current_branch chain_id
message to all neighbors, where chain_id
is the identifier of chain
. This informs the neighbors that this node expects notifications for new heads/mempools. The given callbacks
are given to the P2p_reader
for each peer
:
notify_branch peer locator
is called when the P2p_reader
receives the message Current_branch (chain, locator)
from peer peer
.notify_head peer head
is called when the P2p_reader
receives the message Current_head (chain, head, mempool)
from peer peer
.Disconnection peer
is called when the P2p_reader
receives the message Deactivate chain
from peer peer
or when the P2p_reader
associated to peer
is shutdown.Subsequent calls simply return the existing chain_db
.
val get_chain : t -> Mavryk_base.TzPervasives.Chain_id.t -> chain_db option
Look for the database of an active chain.
val deactivate : chain_db -> unit Lwt.t
deactivate chain_db
sends a Deactivate chain_id
message to all active neighbors for this chain. This notifies them that this node isn't interested in messages for this chain
val disconnect :
reason:string ->
chain_db ->
Mavryk_base.P2p_peer.Id.t ->
unit Lwt.t
Kick a given peer.
val greylist : chain_db -> Mavryk_base.P2p_peer.Id.t -> unit Lwt.t
Greylist a given peer.
Various accessors.
val chain_store : chain_db -> Mavryk_store.Store.chain_store
val information :
chain_db ->
Mavryk_shell_services.Chain_validator_worker_state.Distributed_db_state.view
val my_peer_id : chain_db -> Mavryk_base.P2p_peer.Id.t
Return the peer id of the node
val get_peer_metadata :
chain_db ->
Mavryk_base.P2p_peer.Id.t ->
Mavryk_p2p_services.Peer_metadata.t
module Request : sig ... end
module Advertise : sig ... end
module Block_header : sig ... end
Index of block headers.
module Operations :
Mavryk_requester.Requester.REQUESTER
with type t := chain_db
and type key = Mavryk_base.TzPervasives.Block_hash.t * int
and type value = Mavryk_base.Operation.t list
and type param := Mavryk_base.TzPervasives.Operation_list_list_hash.t
Index of all the operations of a given block (per validation pass).
val commit_block :
chain_db ->
Mavryk_base.TzPervasives.Block_hash.t ->
Block_header.t ->
Mavryk_base.Operation.t list list ->
Mavryk_validation.Block_validation.result ->
Mavryk_store.Store.Block.t option Mavryk_base.TzPervasives.tzresult Lwt.t
Store on disk all the data associated to a valid block.
val commit_invalid_block :
chain_db ->
Mavryk_base.TzPervasives.Block_hash.t ->
Block_header.t ->
Mavryk_base.TzPervasives.Error_monad.error list ->
unit Mavryk_base.TzPervasives.tzresult Lwt.t
Store on disk all the data associated to an invalid block.
val inject_operation :
chain_db ->
Mavryk_base.TzPervasives.Operation_hash.t ->
Mavryk_base.Operation.t ->
bool Lwt.t
Inject a new operation in the local index (memory only).
val inject_prechecked_block :
chain_db ->
Mavryk_base.TzPervasives.Block_hash.t ->
Block_header.t ->
Mavryk_base.Operation.t Mavryk_base.TzPervasives.trace
Mavryk_base.TzPervasives.trace ->
unit Mavryk_base.TzPervasives.tzresult Lwt.t
Inject a prechecked block in the precheck_blocks
memory table. This is to ensure the data availability of the operations once the block has been prechecked and advertised to our peers.
No need to remove the data explicitely of the precheck_blocks
memory table. The table is handled as an LRU cache.
module Operation :
Mavryk_requester.Requester.REQUESTER
with type t := chain_db
and type key := Mavryk_base.TzPervasives.Operation_hash.t
and type value := Mavryk_base.Operation.t
and type param := unit
Index of operations (for the mempool).
module Protocol : sig ... end
Index of protocol sources.
val commit_protocol :
db ->
Mavryk_base.TzPervasives.Protocol_hash.t ->
Protocol.t ->
bool Mavryk_base.TzPervasives.tzresult Lwt.t
Store on disk protocol sources.