Legend:
Library
Module
Module type
Parameter
Class
Class type
Typed and encrypted connections to peers.
This module defines:
primitive functions to implement a session-establishment protocol (set up an authentication/encryption symmetric session key, check proof of work target, authenticate hosts, exchange meta data),
a higher-level, authenticated and encrypted, type of connection.
It is parametric in two (abstract data) types. 'msg is the unit of communication. 'meta is a type of message sent in session establishment.
Connections defined in this module wrap a P2p_io_scheduler.connection (which is simply a file descriptor on which R/W are regulated.)
Each connection has an associated internal read (resp. write) queue containing messages (of type 'msg), whose size can be limited by providing corresponding arguments to accept.
Types
type'meta authenticated_connection
Type of a connection that successfully passed the authentication phase, but has not been accepted yet. Parametrized by the type of expected parameter in the `ack` message.
type('msg, 'meta) t
Type of an accepted connection, parametrized by the type of messages exchanged between peers.
These should be used together to implement the session establishment protocol. Session establishment proceeds in three synchronous, symmetric, steps. First two steps are implemented by authenticate. Third step is implemented by either accept or nack.
1. Hosts send each other an authentication message. The message contains notably a public key, a nonce, and proof of work stamp computed from the public key. PoW work is checked, and a session key is established (authenticated key exchange). The session key will be used to encrypt/authenticate all subsequent messages over this connection.
2. Hosts send each other a 'meta message.
3. Each host send either an Ack message (accept function) or an Nack message (nack function). If both hosts send an Ack, the connection is established and they can start to read/write 'msg.
Note that P2p_errors.Decipher_error can be raised from all functions receiving messages after step 1, when a message can't be decrypted.
Typically, the calling module will make additional checks after step 2 to decide what to do in step 3. For instance, based on network version or 'meta information.
authenticate canceler pow incoming conn point ?port identity version meta returns a couple (info, auth_conn) tries to set up a session with the host connected via conn.
Can fail with
P2p_errors.Not_enough_proof_of_work if PoW target isn't reached
P2p_errors.Myself if both hosts are the same peer
P2p_errors.Connection_closed if the remote peer closes the connection
nack ac motive alts sends a Nack message with the rejection motive and a list of proposed alternative points to the remote peer, notifying it that its connection is rejected. It then closes the connection.
alts must contain less than 100 points or you will be greylisted
write_now conn msg is Ok true if msg has been added to conn's internal write queue, Ok false if msg has been dropped, or fails with a corresponding error otherwise.