ouroboros-network-0.1.0.1: A networking layer for the Ouroboros blockchain protocol
Safe Haskell None
Language Haskell2010

Ouroboros.Network.NodeToNode

Description

This is the starting point for a module that will bring together the overall node to node protocol, as a collection of mini-protocols.

Synopsis

Documentation

nodeToNodeProtocols :: MiniProtocolParameters -> ( ConnectionId addr -> STM m ControlMessage -> NodeToNodeProtocols muxMode bytes m a b) -> NodeToNodeVersion -> OuroborosBundle muxMode addr bytes m a b Source #

Make an OuroborosApplication for the bundle of mini-protocols that make up the overall node-to-node protocol.

This function specifies the wire format protocol numbers.

The application specific protocol numbers start from 2. The MiniProtocolNum 0 is reserved for the Handshake protocol, while MiniProtocolNum 1 is reserved for DeltaQ messages. Handshake protocol is not included in NodeToNodeProtocols as it runs before mux is started but it reusing MuxBearer to send and receive messages. Only when the handshake protocol succeeds, we will know which protocols to run / multiplex.

These are chosen to not overlap with the node to client protocol numbers (and the handshake protocol number). This is not essential for correctness, but is helpful to allow a single shared implementation of tools that can analyse both protocols, e.g. wireshark plugins.

data NodeToNodeProtocols appType bytes m a b Source #

Constructors

NodeToNodeProtocols

Fields

data MiniProtocolParameters Source #

Constructors

MiniProtocolParameters

Fields

data NodeToNodeVersion Source #

Enumeration of node to node protocol versions.

Constructors

NodeToNodeV_7

Changes:

  • new KeepAlive codec
  • Enable CardanoNodeToNodeVersion5 , i.e., Alonzo
NodeToNodeV_8

Changes:

  • Enable block diffusion pipelining in ChainSync and BlockFetch logic.
NodeToNodeV_9

Changes:

  • Enable CardanoNodeToNodeVersion6 , i.e., Babbage
NodeToNodeV_10

Changes:

  • Enable full duplex connections. NOTE: This is an experimental protocol version, which is not yet released. Until initial P2P version it must be kept as the last version, which allows us to keep it as an experimental version.

Instances

Instances details
Bounded NodeToNodeVersion Source #
Instance details

Defined in Ouroboros.Network.NodeToNode.Version

Enum NodeToNodeVersion Source #
Instance details

Defined in Ouroboros.Network.NodeToNode.Version

Eq NodeToNodeVersion Source #
Instance details

Defined in Ouroboros.Network.NodeToNode.Version

Ord NodeToNodeVersion Source #
Instance details

Defined in Ouroboros.Network.NodeToNode.Version

Show NodeToNodeVersion Source #
Instance details

Defined in Ouroboros.Network.NodeToNode.Version

data NetworkConnectTracers addr vNumber Source #

Tracer used by connectToNode (and derivatives, like connectTo or 'Ouroboros.Network.NodeToClient.connectTo).

Constructors

NetworkConnectTracers

Fields

data NetworkServerTracers addr vNumber Source #

Tracers required by a server which handles inbound connections.

Constructors

NetworkServerTracers

Fields

data NetworkMutableState addr Source #

Mutable state maintained by the network component.

Constructors

NetworkMutableState

Fields

data AcceptedConnectionsLimit Source #

Policy which governs how to limit the number of accepted connections.

Constructors

AcceptedConnectionsLimit

Fields

withServer :: SocketSnocket -> NetworkServerTracers SockAddr NodeToNodeVersion -> NetworkMutableState SockAddr -> AcceptedConnectionsLimit -> Socket -> Versions NodeToNodeVersion NodeToNodeVersionData ( OuroborosApplication ResponderMode SockAddr ByteString IO a b) -> ErrorPolicies -> IO Void Source #

A specialised version of withServerNode . It forks a thread which runs an accept loop (server thread):

  • when the server thread throws an exception the main thread rethrows it (by wait )
  • when an async exception is thrown to kill the main thread the server thread will be cancelled as well (by withAsync )

P2P Governor

data DomainAccessPoint Source #

A product of a Domain and PortNumber . After resolving the domain we will use the PortNumber to form SockAddr .

Instances

Instances details
Eq DomainAccessPoint Source #
Instance details

Defined in Ouroboros.Network.PeerSelection.RelayAccessPoint

Ord DomainAccessPoint Source #
Instance details

Defined in Ouroboros.Network.PeerSelection.RelayAccessPoint

Show DomainAccessPoint Source #
Instance details

Defined in Ouroboros.Network.PeerSelection.RelayAccessPoint

ToJSON DomainAccessPoint Source #
Instance details

Defined in Ouroboros.Network.PeerSelection.RelayAccessPoint

FromJSON DomainAccessPoint Source #
Instance details

Defined in Ouroboros.Network.PeerSelection.RelayAccessPoint

data PeerAdvertise Source #

Should this peer be advertised to other peers asking for known peers? For certain peers specified by configuration it would be an appropriate policy to keep them private.

Instances

Instances details
Eq PeerAdvertise Source #
Instance details

Defined in Ouroboros.Network.PeerSelection.Types

Ord PeerAdvertise Source #
Instance details

Defined in Ouroboros.Network.PeerSelection.Types

Show PeerAdvertise Source #
Instance details

Defined in Ouroboros.Network.PeerSelection.Types

Generic PeerAdvertise Source #
Instance details

Defined in Ouroboros.Network.PeerSelection.Types

ToJSON PeerAdvertise Source #
Instance details

Defined in Ouroboros.Network.PeerSelection.Types

FromJSON PeerAdvertise Source #
Instance details

Defined in Ouroboros.Network.PeerSelection.Types

type Rep PeerAdvertise Source #
Instance details

Defined in Ouroboros.Network.PeerSelection.Types

type Rep PeerAdvertise = D1 (' MetaData "PeerAdvertise" "Ouroboros.Network.PeerSelection.Types" "ouroboros-network-0.1.0.1-2UgqzRSdBh49QYumtriFSI" ' False ) ( C1 (' MetaCons "DoNotAdvertisePeer" ' PrefixI ' False ) ( U1 :: Type -> Type ) :+: C1 (' MetaCons "DoAdvertisePeer" ' PrefixI ' False ) ( U1 :: Type -> Type ))

data PeerSelectionTargets Source #

Adjustable targets for the peer selection mechanism.

These are used by the peer selection governor as targets. They are used by the peer churn governor loop as knobs to adjust, to influence the peer selection governor.

The known , established and active peer targets are targets both from below and from above: the governor will attempt to grow or shrink the sets to hit these targets.

Unlike the other targets, the root peer target is "one sided", it is only a target from below. The governor does not try to shrink the root set to hit it, it simply stops looking for more.

There is also an implicit target that enough local root peers are selected as active. This comes from the configuration for local roots, and is not an independently adjustable target.

Subscription Workers

IP subscription worker

data NetworkSubscriptionTracers withIPList addr vNumber Source #

IP subscription tracers.

Constructors

NetworkSubscriptionTracers

Fields

DNS subscription worker

data NetworkDNSSubscriptionTracers vNumber addr Source #

DNS subscription tracers.

Constructors

NetworkDNSSubscriptionTracers

Fields

Versions

newtype Versions vNum vData r Source #

The version map supported by the local agent keyed on the version identifier.

Each Version contains a function which takes negotiated version data and returns negotiated application (the r type variable).

If one needs to combine multiple versions the simplest way is to use one of the combinators: foldMapVersions , combineVersions or the Semigroup instance directly:

fold $ (simpleSingletonVersions ...)
      :| [ (simpleSingletonVersions ...)
         , (simpleSingletonVersions ...)
         , ...
         ]

Constructors

Versions

Fields

Instances

Instances details
Functor ( Versions vNum extra)
Instance details

Defined in Ouroboros.Network.Protocol.Handshake.Version

Methods

fmap :: (a -> b) -> Versions vNum extra a -> Versions vNum extra b Source #

(<$) :: a -> Versions vNum extra b -> Versions vNum extra a Source #

Ord vNum => Semigroup ( Versions vNum vData r)
Instance details

Defined in Ouroboros.Network.Protocol.Handshake.Version

Methods

(<>) :: Versions vNum vData r -> Versions vNum vData r -> Versions vNum vData r Source #

sconcat :: NonEmpty ( Versions vNum vData r) -> Versions vNum vData r Source #

stimes :: Integral b => b -> Versions vNum vData r -> Versions vNum vData r Source #

data DiffusionMode Source #

The flag which indicates wheather the node runs only initiator or both initiator or responder node. It does not however specify weather the node is using duplex connections, this is implicit see NodeToNodeV_4

simpleSingletonVersions :: vNum -> vData -> r -> Versions vNum vData r Source #

Singleton smart constructor for Versions .

foldMapVersions :: ( Ord vNum, Foldable f, HasCallStack ) => (x -> Versions vNum extra r) -> f x -> Versions vNum extra r Source #

Useful for folding multiple Versions .

A foldMap restricted to the Versions Semigroup .

PRECONDITION: f x is non-empty.

Codecs

Re-exports

data ConnectionId addr Source #

Connection is identified by local and remote address.

TODO: the type variable which this data type fills in is called peerid . We should renamed to connectionId .

Constructors

ConnectionId

Fields

Instances

Instances details
Eq addr => Eq ( ConnectionId addr)
Instance details

Defined in Ouroboros.Network.ConnectionId

Ord addr => Ord ( ConnectionId addr)
Instance details

Defined in Ouroboros.Network.ConnectionId

Show addr => Show ( ConnectionId addr)
Instance details

Defined in Ouroboros.Network.ConnectionId

Generic ( ConnectionId addr)
Instance details

Defined in Ouroboros.Network.ConnectionId

Associated Types

type Rep ( ConnectionId addr) :: Type -> Type Source #

Hashable a => Hashable ( ConnectionId a)
Instance details

Defined in Ouroboros.Network.ConnectionId

Typeable addr => NoThunks ( ConnectionId addr)
Instance details

Defined in Ouroboros.Network.ConnectionId

type Rep ( ConnectionId addr)
Instance details

Defined in Ouroboros.Network.ConnectionId

type Rep ( ConnectionId addr) = D1 (' MetaData "ConnectionId" "Ouroboros.Network.ConnectionId" "ouroboros-network-framework-0.1.0.1-8Cos8Lgj9CwATl9eblNk02" ' False ) ( C1 (' MetaCons "ConnectionId" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "localAddress") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 addr) :*: S1 (' MetaSel (' Just "remoteAddress") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 addr)))

data Handshake (vNumber :: k) (vParams :: k1) Source #

The handshake mini-protocol is used initially to agree the version and associated parameters of the protocol to use for all subsequent communication.

Instances

Instances details
ShowProxy ( Handshake vNumber vParams :: Type )
Instance details

Defined in Ouroboros.Network.Protocol.Handshake.Type

Show ( ClientHasAgency st)
Instance details

Defined in Ouroboros.Network.Protocol.Handshake.Type

Show ( ServerHasAgency st)
Instance details

Defined in Ouroboros.Network.Protocol.Handshake.Type

( Show vNumber, Show vParams) => Show ( Message ( Handshake vNumber vParams) from to)
Instance details

Defined in Ouroboros.Network.Protocol.Handshake.Type

Protocol ( Handshake vNumber vParams)
Instance details

Defined in Ouroboros.Network.Protocol.Handshake.Type

data Message ( Handshake vNumber vParams) (from :: Handshake vNumber vParams) (to :: Handshake vNumber vParams)
Instance details

Defined in Ouroboros.Network.Protocol.Handshake.Type

data Message ( Handshake vNumber vParams) (from :: Handshake vNumber vParams) (to :: Handshake vNumber vParams) where
data ClientHasAgency (st :: Handshake vNumber vParams)
Instance details

Defined in Ouroboros.Network.Protocol.Handshake.Type

data ClientHasAgency (st :: Handshake vNumber vParams) where
data ServerHasAgency (st :: Handshake vNumber vParams)
Instance details

Defined in Ouroboros.Network.Protocol.Handshake.Type

data ServerHasAgency (st :: Handshake vNumber vParams) where
data NobodyHasAgency (st :: Handshake vNumber vParams)
Instance details

Defined in Ouroboros.Network.Protocol.Handshake.Type

data NobodyHasAgency (st :: Handshake vNumber vParams) where

data LocalAddresses addr Source #

Constructors

LocalAddresses

Fields

  • laIpv4 :: Maybe addr

    Local IPv4 address to use, Nothing indicates don't use IPv4

  • laIpv6 :: Maybe addr

    Local IPv6 address to use, Nothing indicates don't use IPv6

  • laUnix :: Maybe addr

    Local Unix address to use, Nothing indicates don't use Unix sockets

isPipeliningEnabled :: NodeToNodeVersion -> Bool Source #

Check whether a version enabling diffusion pipelining has been negotiated.

Error Policies and Peer state

data ErrorPolicies Source #

List of error policies for exception handling and a policy for handing application return values.

Constructors

ErrorPolicies

Fields

remoteNetworkErrorPolicy :: ErrorPolicies Source #

A minimal error policy for remote peers, which only handles exceptions raised by `ouroboros-network`.

localNetworkErrorPolicy :: ErrorPolicies Source #

Error policy for local clients. This is equivalent to nullErrorPolicies , but explicit in the errors which can be caught.

We are very permissive here, and very strict in the networkErrorPolicy . After any failure the client will be killed and not penalised by this policy. This allows to restart the local client without a delay.

data ErrorPolicy where Source #

Constructors

ErrorPolicy

Fields

data SuspendDecision t Source #

Semigroup of commands which acts on PeerState . The t variable might be initiated to DiffTime or Time m .

This semigroup allows to either suspend both consumer and producer or just the consumer part.

Constructors

SuspendPeer !t !t

peer is suspend; The first t is the time until which a local producer is suspended, the second one is the time until which a local consumer is suspended.

SuspendConsumer !t

suspend local consumer / initiator side until t (this mean we are not allowing to communicate with the producer / responder of a remote peer).

Throw

throw an error from the main thread.

Instances

Instances details
Functor SuspendDecision
Instance details

Defined in Ouroboros.Network.Subscription.PeerState

Eq t => Eq ( SuspendDecision t)
Instance details

Defined in Ouroboros.Network.Subscription.PeerState

Ord t => Ord ( SuspendDecision t)
Instance details

Defined in Ouroboros.Network.Subscription.PeerState

Show t => Show ( SuspendDecision t)
Instance details

Defined in Ouroboros.Network.Subscription.PeerState

Ord t => Semigroup ( SuspendDecision t)

The semigroup instance. Note that composing SuspendPeer with SuspendConsumer gives SuspendPeer . SuspendPeer and SuspendConsumer form a sub-semigroup.

Instance details

Defined in Ouroboros.Network.Subscription.PeerState

SAct ( SuspendDecision Time ) ( Maybe ( PeerState m))

Action of SuspendDecision on Maybe PeerState . We use this action together with alter function.

Note: SuspendDecision does not act on PeerState , only the sub-semigroup generated by SuspendConsumer and SuspendPeer does.

Instance details

Defined in Ouroboros.Network.Subscription.PeerState

Traces

data AcceptConnectionsPolicyTrace Source #

Trace for the AcceptConnectionsLimit policy.

data ErrorPolicyTrace Source #

Trace data for error policies

Constructors

ErrorPolicySuspendPeer ( Maybe (ConnectionOrApplicationExceptionTrace SomeException )) DiffTime DiffTime

suspending peer with a given exception until

ErrorPolicySuspendConsumer ( Maybe (ConnectionOrApplicationExceptionTrace SomeException )) DiffTime

suspending consumer until

ErrorPolicyLocalNodeError (ConnectionOrApplicationExceptionTrace SomeException )

caught a local exception

ErrorPolicyResumePeer

resume a peer (both consumer and producer)

ErrorPolicyKeepSuspended

consumer was suspended until producer will resume

ErrorPolicyResumeConsumer

resume consumer

ErrorPolicyResumeProducer

resume producer

ErrorPolicyUnhandledApplicationException SomeException

an application throwed an exception, which was not handled by any ErrorPolicy .

ErrorPolicyUnhandledConnectionException SomeException

connect throwed an exception, which was not handled by any ErrorPolicy .

ErrorPolicyAcceptException IOException

accept throwed an exception

data WithAddr addr a Source #

Constructors

WithAddr

Fields

For Consensus ThreadNet Tests