Mavryk_shell.Distributed_dbMavryk 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_messagetype db = tval create : Mavryk_store.Store.t -> p2p -> tval store : db -> Mavryk_store.Store.tval shutdown : t -> unit Lwt.tval activate :
t ->
Mavryk_store.Store.Chain.t ->
P2p_reader.callback ->
chain_dbThe 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 optionLook for the database of an active chain.
val deactivate : chain_db -> unit Lwt.tdeactivate 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.tKick a given peer.
val greylist : chain_db -> Mavryk_base.P2p_peer.Id.t -> unit Lwt.tGreylist a given peer.
Various accessors.
val chain_store : chain_db -> Mavryk_store.Store.chain_storeval information :
chain_db ->
Mavryk_shell_services.Chain_validator_worker_state.Distributed_db_state.viewval my_peer_id : chain_db -> Mavryk_base.P2p_peer.Id.tReturn the peer id of the node
val get_peer_metadata :
chain_db ->
Mavryk_base.P2p_peer.Id.t ->
Mavryk_p2p_services.Peer_metadata.tmodule Request : sig ... endmodule Advertise : sig ... endmodule Block_header : sig ... endIndex 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.tIndex 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.tStore 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.tStore 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.tInject 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.tInject 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 := unitIndex of operations (for the mempool).
module Protocol : sig ... endIndex of protocol sources.
val commit_protocol :
db ->
Mavryk_base.TzPervasives.Protocol_hash.t ->
Protocol.t ->
bool Mavryk_base.TzPervasives.tzresult Lwt.tStore on disk protocol sources.