ligo/src/lib_p2p/p2p.mli

270 lines
8.6 KiB
OCaml
Raw Normal View History

2016-09-08 21:13:10 +04:00
(**************************************************************************)
(* *)
2018-02-06 00:17:03 +04:00
(* Copyright (c) 2014 - 2018. *)
2016-09-08 21:13:10 +04:00
(* Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* *)
(* All rights reserved. No warranty, explicit or implicit, provided. *)
(* *)
(**************************************************************************)
2018-02-20 21:28:05 +04:00
(** Tezos Shell Net - Low level API for the Gossip network
This is the entry point of the peer-to-peer layer.
It is used by the Shell as the API to communicate with other
nodes.
*)
type 'peer_meta peer_meta_config = {
peer_meta_encoding : 'peer_meta Data_encoding.t;
peer_meta_initial : 'peer_meta;
score : 'peer_meta -> float ;
}
type 'conn_meta conn_meta_config = {
conn_meta_encoding : 'conn_meta Data_encoding.t;
conn_meta_value : P2p_peer.Id.t -> 'conn_meta ;
}
type 'msg app_message_encoding = Encoding : {
tag: int ;
encoding: 'a Data_encoding.t ;
wrap: 'a -> 'msg ;
unwrap: 'msg -> 'a option ;
max_length: int option ;
} -> 'msg app_message_encoding
type 'msg message_config = {
encoding : 'msg app_message_encoding list ;
versions : P2p_version.t list;
}
2016-09-08 21:13:10 +04:00
(** Network configuration *)
type config = {
2017-01-14 16:14:17 +04:00
listening_port : P2p_addr.port option;
2016-09-08 21:13:10 +04:00
(** Tells if incoming connections accepted, precising the TCP port
2016-11-07 17:32:10 +04:00
on which the peer can be reached *)
2017-01-14 16:14:17 +04:00
listening_addr : P2p_addr.t option;
2017-01-14 16:14:17 +04:00
(** When incoming connections are accepted, precising on which
IP adddress the node listen (default: [[::]]). *)
trusted_points : P2p_point.Id.t list ;
2017-01-14 16:14:17 +04:00
(** List of hard-coded known peers to bootstrap the network from. *)
2016-09-08 21:13:10 +04:00
peers_file : string ;
2017-01-14 16:14:17 +04:00
(** The path to the JSON file where the metadata associated to
2017-02-24 06:50:33 +04:00
peer_ids are loaded / stored. *)
2017-01-14 16:14:17 +04:00
2016-09-08 21:13:10 +04:00
closed_network : bool ;
2017-01-14 16:14:17 +04:00
(** If [true], the only accepted connections are from peers whose
2018-04-25 16:37:33 +04:00
addresses are in [trusted_points]. *)
2017-01-14 16:14:17 +04:00
identity : P2p_identity.t ;
2017-01-14 16:14:17 +04:00
(** Cryptographic identity of the peer. *)
proof_of_work_target : Crypto_box.target ;
(** Expected level of proof of work of peers' identity. *)
2016-09-08 21:13:10 +04:00
}
(** Network capacities *)
type limits = {
2017-01-14 16:14:17 +04:00
2018-02-20 21:28:05 +04:00
connection_timeout : float ;
(** Maximum time allowed to the establishment of a connection. *)
authentication_timeout : float ;
2017-01-14 16:14:17 +04:00
(** Delay granted to a peer to perform authentication, in seconds. *)
2018-04-25 16:37:33 +04:00
greylist_timeout : int ;
(** GC delay for the grelists tables, in seconds. *)
2016-09-08 21:13:10 +04:00
min_connections : int ;
2017-01-14 16:14:17 +04:00
(** Strict minimum number of connections (triggers an urgent maintenance) *)
expected_connections : int ;
(** Targeted number of connections to reach when bootstraping / maintaining *)
2017-01-14 16:14:17 +04:00
2016-09-08 21:13:10 +04:00
max_connections : int ;
2017-01-14 16:14:17 +04:00
(** Maximum number of connections (exceeding peers are disconnected) *)
2016-09-08 21:13:10 +04:00
2017-01-14 16:14:17 +04:00
backlog : int ;
(** Argument of [Lwt_unix.accept].*)
max_incoming_connections : int ;
(** Maximum not-yet-authenticated incoming connections. *)
2017-01-14 16:14:17 +04:00
max_download_speed : int option ;
(** Hard-limit in the number of bytes received per second. *)
2016-11-07 17:32:10 +04:00
2017-01-14 16:14:17 +04:00
max_upload_speed : int option ;
(** Hard-limit in the number of bytes sent per second. *)
2016-11-07 17:32:10 +04:00
2017-01-14 16:14:17 +04:00
read_buffer_size : int ;
(** Size in bytes of the buffer passed to [Lwt_unix.read]. *)
2016-11-07 17:32:10 +04:00
2017-01-14 16:14:17 +04:00
read_queue_size : int option ;
write_queue_size : int option ;
incoming_app_message_queue_size : int option ;
incoming_message_queue_size : int option ;
outgoing_message_queue_size : int option ;
(** Various bounds for internal queues. *)
2016-11-15 04:52:39 +04:00
2017-02-24 06:50:33 +04:00
known_peer_ids_history_size : int ;
known_points_history_size : int ;
(** Size of circular log buffers, in number of events recorded. *)
2017-02-24 06:50:33 +04:00
max_known_peer_ids : (int * int) option ;
max_known_points : (int * int) option ;
(** Optional limitation of internal hashtables (max, target) *)
2017-03-14 13:51:44 +04:00
swap_linger : float ;
(** Peer swapping does not occur more than once during a timespan of
[swap_linger] seconds. *)
2017-04-18 20:32:31 +04:00
binary_chunks_size : int option ;
(** Size (in bytes) of binary blocks that are sent to other
peers. Default value is 64 kB. Max value is 64kB. *)
2017-01-14 16:14:17 +04:00
}
2016-11-15 04:52:39 +04:00
2018-02-20 21:28:05 +04:00
(** Type of a P2P layer instance, parametrized by:
['msg]: type of messages exchanged between peers
['peer_meta]: type of the metadata associated with peers (score, etc.)
['conn_meta]: type of the metadata associated with connection (ack_cfg)
2018-02-20 21:28:05 +04:00
*)
type ('msg, 'peer_meta, 'conn_meta) t
type ('msg, 'peer_meta, 'conn_meta) net = ('msg, 'peer_meta, 'conn_meta) t
2016-11-07 17:32:10 +04:00
(** A faked p2p layer, which do not initiate any connection
nor open any listening socket *)
val faked_network :
'peer_meta peer_meta_config ->
('msg, 'peer_meta, 'conn_meta) net
2016-11-15 04:52:39 +04:00
(** Main network initialisation function *)
val create :
config:config -> limits:limits ->
'peer_meta peer_meta_config -> 'conn_meta conn_meta_config ->
'msg message_config -> ('msg, 'peer_meta, 'conn_meta) net tzresult Lwt.t
2016-11-07 17:32:10 +04:00
2017-02-24 06:50:33 +04:00
(** Return one's peer_id *)
val peer_id : ('msg, 'peer_meta, 'conn_meta) net -> P2p_peer.Id.t
2016-11-15 04:52:39 +04:00
(** A maintenance operation : try and reach the ideal number of peers *)
val maintain : ('msg, 'peer_meta, 'conn_meta) net -> unit Lwt.t
2016-11-07 17:32:10 +04:00
(** Voluntarily drop some peers and replace them by new buddies *)
val roll : ('msg, 'peer_meta, 'conn_meta) net -> unit Lwt.t
2016-11-07 17:32:10 +04:00
(** Close all connections properly *)
val shutdown : ('msg, 'peer_meta, 'conn_meta) net -> unit Lwt.t
2016-11-07 17:32:10 +04:00
(** A connection to a peer *)
type ('msg, 'peer_meta, 'conn_meta) connection
2016-11-29 02:01:37 +04:00
(** Access the domain of active peers *)
val connections :
('msg, 'peer_meta, 'conn_meta) net ->
('msg, 'peer_meta, 'conn_meta) connection list
2016-11-07 17:32:10 +04:00
2017-02-24 06:50:33 +04:00
(** Return the active peer with identity [peer_id] *)
val find_connection :
('msg, 'peer_meta, 'conn_meta) net ->
P2p_peer.Id.t ->
('msg, 'peer_meta, 'conn_meta) connection option
2016-11-07 17:32:10 +04:00
(** Access the info of an active peer, if available *)
val connection_info :
('msg, 'peer_meta, 'conn_meta) net ->
('msg, 'peer_meta, 'conn_meta) connection ->
P2p_connection.Info.t
val connection_metadata :
('msg, 'peer_meta, 'conn_meta) net ->
('msg, 'peer_meta, 'conn_meta) connection ->
'conn_meta
val connection_stat :
('msg, 'peer_meta, 'conn_meta) net ->
('msg, 'peer_meta, 'conn_meta) connection ->
P2p_stat.t
2017-09-29 20:43:13 +04:00
(** Cleanly closes a connection. *)
val disconnect :
('msg, 'peer_meta, 'conn_meta) net ->
?wait:bool ->
('msg, 'peer_meta, 'conn_meta) connection ->
unit Lwt.t
2017-09-29 20:43:13 +04:00
val global_stat : ('msg, 'peer_meta, 'conn_meta) net -> P2p_stat.t
2016-11-07 17:32:10 +04:00
(** Accessors for meta information about a global identifier *)
val get_peer_metadata :
('msg, 'peer_meta, 'conn_meta) net -> P2p_peer.Id.t -> 'peer_meta
val set_peer_metadata :
('msg, 'peer_meta, 'conn_meta) net -> P2p_peer.Id.t -> 'peer_meta -> unit
2016-09-08 21:13:10 +04:00
(** Wait for a message from a given connection. *)
val recv :
('msg, 'peer_meta, 'conn_meta) net ->
('msg, 'peer_meta, 'conn_meta) connection ->
'msg tzresult Lwt.t
2016-09-08 21:13:10 +04:00
(** Wait for a message from any active connections. *)
val recv_any :
('msg, 'peer_meta, 'conn_meta) net ->
(('msg, 'peer_meta, 'conn_meta) connection * 'msg) Lwt.t
2016-09-08 21:13:10 +04:00
(** [send net peer msg] is a thread that returns when [msg] has been
successfully enqueued in the send queue. *)
val send :
('msg, 'peer_meta, 'conn_meta) net ->
('msg, 'peer_meta, 'conn_meta) connection ->
'msg ->
unit tzresult Lwt.t
2016-09-08 21:13:10 +04:00
(** [try_send net peer msg] is [true] if [msg] has been added to the
send queue for [peer], [false] otherwise *)
val try_send :
('msg, 'peer_meta, 'conn_meta) net ->
('msg, 'peer_meta, 'conn_meta) connection ->
'msg ->
bool
2016-09-08 21:13:10 +04:00
(** Send a message to all peers *)
val broadcast : ('msg, 'peer_meta, 'conn_meta) net -> 'msg -> unit
2016-11-15 04:52:39 +04:00
val fold_connections :
('msg, 'peer_meta, 'conn_meta) net ->
init:'a ->
f:(P2p_peer.Id.t -> ('msg, 'peer_meta, 'conn_meta) connection -> 'a -> 'a) ->
'a
val iter_connections :
('msg, 'peer_meta, 'conn_meta) net ->
(P2p_peer.Id.t -> ('msg, 'peer_meta, 'conn_meta) connection -> unit) -> unit
val on_new_connection :
('msg, 'peer_meta, 'conn_meta) net ->
(P2p_peer.Id.t -> ('msg, 'peer_meta, 'conn_meta) connection -> unit) -> unit
val build_rpc_directory : _ t -> unit RPC_directory.t
val greylist_addr : ('msg, 'peer_meta, 'conn_meta) net -> P2p_addr.t -> unit
val greylist_peer : ('msg, 'peer_meta, 'conn_meta) net -> P2p_peer.Id.t -> unit
(**/**)
module Raw : sig
type 'a t =
| Bootstrap
| Advertise of P2p_point.Id.t list
| Swap_request of P2p_point.Id.t * P2p_peer.Id.t
| Swap_ack of P2p_point.Id.t * P2p_peer.Id.t
| Message of 'a
| Disconnect
val encoding: 'msg app_message_encoding list -> 'msg t Data_encoding.t
2016-11-07 17:32:10 +04:00
end