package octez-shell-libs
Install
dune-project
Dependency
Authors
Maintainers
Sources
sha256=c6df840ebbf115e454db949028c595bec558a59a66cade73b52a6d099d6fa4d4
sha512=d8aee903b9fe130d73176bc8ec38b78c9ff65317da3cb4f3415f09af0c625b4384e7498201fdb61aa39086a7d5d409d0ab3423f9bc3ab989a680cf444a79bc13
doc/octez-shell-libs.shell/Tezos_shell/P2p_reader/index.html
Module Tezos_shell.P2p_readerSource
A P2p_reader.t is a worker that answers the application messages (see Messages) received from a remote peer on a P2p.connection.
The worker behavior is parameterized by callback functions passed by the caller (see type callback).
Terminology:
- *this peer* refers to the peer running the worker
- the *remote peer* refers to the peer on the other side of the
connection - a chain can be *active* or *inactive*. The activation status can refer to this peer, or to the remote peer. If not specified, active/inactive refers to this peer.
A chain can only be considered active for the remote peer if it is active for this peer. As a general rule, received messages that refer to a specific chain_id that is not active are ignored.
The protocol is defined as a message handling loop. We can classify a message in three categories. For each category, we describe the worker behavior when receiving the messages.
1. Administrative message
Deactivate chain_idmarks chainchain_idas inactive for the remote peer. Callcallback.disconnection gidwheregidis the remote peer id.
2. Chain-related messages
These messages are used for peers to get the most recent view of the chains they manage.
Get_current_branch chain_idIfchain_idis not active for this peer, simply ignores message and returns.
Only if chain_id is not active for the remote peer, sends a Get_current_branch chain_id message.
Then (in any case) sends a Current_branch (chain_id, chain_locator) message.
Current_branch (chain_id, locator)activateschain_idfor the remote peer if it is not active yet. If the locator contains any block known to be invalid, the connection is closed and the remote peer is greylisted. If the locator head timestamp is more than 15s ahead of this peer system time, the message is ignored. Otherwise callscallback.notify_branch locator.
Get_protocol_branch chain_id proto_levelIfchain_idis not active for this peer, or ifproto_levelis unknown simply ignores message and returns. Aproto_levelis unknown if it is non-positive or if it is strictly higher than the one of the current head.
Otherwise, sends a message Protocol_branch (chain_id, protocol_locator) where protocol_locator encodes the longest branch where all the blocks are on proto_level. This branch is a subbranch of the current branch for the requested chain_id.
Protocol_branch chain_id proto_level locatoris a no-op
Get_current_head chain_id: message is ignored if the chainchain_idis inactive for the remote peer. Otherwise, replies withCurrent_head (chain_id, head, mempool)whereheadis the current head for the requested chain.mempoolis the current mempool, or an empty mempool if the remote peer's mempool is disabled.
Current_head (chain_id, header, mempool): message is ignored if the chainchain_idis inactive for the remote peer. Ifheaderis known to be invalid, or if themempoolis non empty while this peer's mempool is disabled, the connection is closed and the remote peer is greylisted. Ifheader's timestamp is more than 15s ahead of this peer system time, the message is ignored. Otherwise, callscallback.notify_head.
Get_checkpoint chain_id: message is ignored if the chainchain_idis inactive for the remote peer. Otherwise, replies withCheckpoint (chain_id, checkpoint)wherecheckpointis the current checkpoint for the requested chain.
Checkpoint chain_id headeris a no-op
3. "Database" messages
These messages are used for peers to exchange "static" resources such as block headers, operations, protocols. The worker collaborates with the requesters defined in Distributed_db. Resources are requested by the requester, and the requester is notified by a P2p_reader upon reception of the resource.
Get_block_headers hashesSends aBlocker_header headerfor each of the requested hash known to this peer.
Block_header blocknotifies the requester that the value has been received. Ignores message if value wasn't requested.
Get_predecessor_header hash nSendsPredecessor_header hash n headerwhereheaderis the header of thenth predecessor of the blockhash.
Predecessor_header hash n headeris a no-op.
The other database messages work similarly
Get_operations hashes/Operation operationGet_protocols hashes/ProtocolGet_operation_hashes_for_blocks/Operation_hashes_for_blockGet_operations_for_blocks/Operation_for_block
module Block_hash_cache :
Aches.Vache.MAP with type key = Tezos_base.TzPervasives.Block_hash.ttype callback = {notify_branch : Tezos_base.P2p_peer.Id.t -> Tezos_base.Block_locator.t -> unit;(*callback function called on reception of a
*)Current_branchmessagenotify_head : Tezos_base.P2p_peer.Id.t -> Tezos_base.TzPervasives.Block_hash.t -> Tezos_base.Block_header.t -> Tezos_base.Mempool.t -> unit;(*callback function called on reception of a
*)Current_headmessagedisconnection : Tezos_base.P2p_peer.Id.t -> unit;
}type chain_db = {chain_store : Tezos_store.Store.Chain.t;operation_db : Distributed_db_requester.Raw_operation.t;block_header_db : Distributed_db_requester.Raw_block_header.t;operations_db : Distributed_db_requester.Raw_operations.t;callback : callback;active_peers : Tezos_base.P2p_peer.Set.t ref;(*Set of remote peers for which this chain is active.
*)active_connections : connection Tezos_base.P2p_peer.Table.t;
}val read_block_header :
t ->
Tezos_base.TzPervasives.Block_hash.t ->
(Tezos_base.TzPervasives.Chain_id.t * Tezos_base.Block_header.t) option Lwt.tLookup for block header in any active chains
val run :
register:(t -> unit) ->
unregister:(unit -> unit) ->
p2p ->
Tezos_store.Store.t ->
Distributed_db_requester.Raw_protocol.t ->
chain_db Tezos_base.TzPervasives.Chain_id.Table.t ->
Tezos_base.P2p_peer.Id.t ->
connection ->
unitrun ~register ~unregister p2p state protocol_db active_chains peer_id conn runs an answering worker on a p2p connection connection. peer_id is the peer id of the remote peer. register is called once the worker is created, and unregister when the worker stops.
active_chains is the table of active chains (i.e. test chain, main chain...)