Skip to content

Commit

Permalink
Add the peer handshake failure reason information to the server output
Browse files Browse the repository at this point in the history
  • Loading branch information
ffakenz committed Apr 30, 2024
1 parent 84bbf45 commit 4f50060
Show file tree
Hide file tree
Showing 9 changed files with 90 additions and 39 deletions.
13 changes: 11 additions & 2 deletions hydra-node/json-schemas/api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -584,16 +584,25 @@ components:
type: object
required:
- tag
- host
- remoteHost
- ourVersion
- theirVersions
- seq
- timestamp
properties:
tag:
type: string
enum: ["PeerHandshakeFailure"]
host:
remoteHost:
type: object
$ref: "api.yaml#/components/schemas/IP"
ourVersion:
type: integer
minimum: 0
theirVersions:
type: array
items:
type: integer
seq:
$ref: "api.yaml#/components/schemas/SequenceNumber"
timestamp:
Expand Down
13 changes: 11 additions & 2 deletions hydra-node/json-schemas/logs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1650,14 +1650,23 @@ definitions:
additionalProperties: false
required:
- tag
- host
- remoteHost
- ourVersion
- theirVersions
properties:
tag:
type: string
enum: ["HandshakeFailure"]
host:
remoteHost:
type: object
$ref: "api.yaml#/components/schemas/IP"
ourVersion:
type: integer
minimum: 0
theirVersions:
type: array
items:
type: integer

- title: ReceivedMessage
type: object
Expand Down
12 changes: 8 additions & 4 deletions hydra-node/src/Hydra/API/ServerOutput.hs
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ import Hydra.Crypto (MultiSignature)
import Hydra.HeadId (HeadId)
import Hydra.HeadLogic.State (HeadState)
import Hydra.Ledger (IsTx, UTxOType, ValidationError)
import Hydra.Network (NodeId)
import Hydra.Network.Ouroboros (Host)
import Hydra.Network (Host, NodeId)
import Hydra.Network.Message (HydraVersionedProtocolNumber, KnownHydraVersions)
import Hydra.OnChainId (OnChainId)
import Hydra.Party (Party)
import Hydra.Prelude hiding (seq)
Expand Down Expand Up @@ -54,7 +54,11 @@ instance IsChainState tx => FromJSON (TimedServerOutput tx) where
data ServerOutput tx
= PeerConnected {peer :: NodeId}
| PeerDisconnected {peer :: NodeId}
| PeerHandshakeFailure {host :: Host}
| PeerHandshakeFailure
{ remoteHost :: Host
, ourVersion :: HydraVersionedProtocolNumber
, theirVersions :: KnownHydraVersions
}
| HeadIsInitializing {headId :: HeadId, parties :: [Party]}
| Committed {headId :: HeadId, party :: Party, utxo :: UTxOType tx}
| HeadIsOpen {headId :: HeadId, utxo :: UTxOType tx}
Expand Down Expand Up @@ -131,7 +135,7 @@ instance
shrink = \case
PeerConnected p -> PeerConnected <$> shrink p
PeerDisconnected p -> PeerDisconnected <$> shrink p
PeerHandshakeFailure p -> PeerHandshakeFailure <$> shrink p
PeerHandshakeFailure rh ov tv -> PeerHandshakeFailure <$> shrink rh <*> shrink ov <*> shrink tv
HeadIsInitializing headId xs -> HeadIsInitializing <$> shrink headId <*> shrink xs
Committed headId p u -> Committed <$> shrink headId <*> shrink p <*> shrink u
HeadIsOpen headId u -> HeadIsOpen <$> shrink headId <*> shrink u
Expand Down
4 changes: 2 additions & 2 deletions hydra-node/src/Hydra/HeadLogic.hs
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,8 @@ onConnectionEvent = \case
causes [ClientEffect (ServerOutput.PeerConnected nodeId)]
Disconnected{nodeId} ->
causes [ClientEffect (ServerOutput.PeerDisconnected nodeId)]
HandshakeFailure{host} ->
causes [ClientEffect (ServerOutput.PeerHandshakeFailure host)]
HandshakeFailure{remoteHost, ourVersion, theirVersions} ->
causes [ClientEffect (ServerOutput.PeerHandshakeFailure{remoteHost, ourVersion, theirVersions})]

-- * The Coordinated Head protocol

Expand Down
39 changes: 36 additions & 3 deletions hydra-node/src/Hydra/Network/Message.hs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@ import Cardano.Binary (serialize')
import Cardano.Crypto.Util (SignableRepresentation, getSignableRepresentation)
import Hydra.Crypto (Signature)
import Hydra.Ledger (IsTx (TxIdType), UTxOType)
import Hydra.Network (NodeId)
import Hydra.Network.Ouroboros (Host)
import Hydra.Network (Host, NodeId)
import Hydra.Party (Party)
import Hydra.Snapshot (Snapshot, SnapshotNumber)

Expand All @@ -22,10 +21,44 @@ data NetworkEvent msg
instance Arbitrary msg => Arbitrary (NetworkEvent msg) where
arbitrary = genericArbitrary

type HydraVersionedProtocolNumber :: Type
newtype HydraVersionedProtocolNumber = MkHydraVersionedProtocolNumber {hydraVersionedProtocolNumber :: Int}
deriving stock (Eq, Show, Generic, Ord)
deriving anyclass (ToJSON, FromJSON)

instance Arbitrary HydraVersionedProtocolNumber where
arbitrary = genericArbitrary

type KnownHydraVersions :: Type
data KnownHydraVersions
= KnownHydraVersions {fromKnownHydraVersions :: [HydraVersionedProtocolNumber]}
| NoKnownHydraVersions
deriving stock (Eq, Show, Generic)
deriving anyclass (ToJSON, FromJSON)

instance Arbitrary KnownHydraVersions where
arbitrary = genericArbitrary

type HydraHandshakeRefused :: Type
data HydraHandshakeRefused = HydraHandshakeRefused
{ remoteHost :: Host
, ourVersion :: HydraVersionedProtocolNumber
, theirVersions :: KnownHydraVersions
}
deriving stock (Eq, Show, Generic)
deriving anyclass (ToJSON, FromJSON)

instance Arbitrary HydraHandshakeRefused where
arbitrary = genericArbitrary

data Connectivity
= Connected {nodeId :: NodeId}
| Disconnected {nodeId :: NodeId}
| HandshakeFailure {host :: Host}
| HandshakeFailure
{ remoteHost :: Host
, ourVersion :: HydraVersionedProtocolNumber
, theirVersions :: KnownHydraVersions
}
deriving stock (Generic, Eq, Show)
deriving anyclass (ToJSON, FromJSON)

Expand Down
8 changes: 5 additions & 3 deletions hydra-node/src/Hydra/Network/Ouroboros.hs
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,8 @@ module Hydra.Network.Ouroboros (

import Control.Monad.Class.MonadAsync (wait)
import Hydra.Network.Ouroboros.VersionedProtocol (
HydraHandshakeRefused (..),
HydraNetworkConfig (..),
HydraVersionedProtocolData (..),
HydraVersionedProtocolNumber (..),
KnownHydraVersions (..),
hydraVersionedProtocolCodec,
hydraVersionedProtocolDataCodec,
)
Expand Down Expand Up @@ -43,6 +40,11 @@ import Hydra.Network (
NetworkComponent,
PortNumber,
)
import Hydra.Network.Message (
HydraHandshakeRefused (..),
HydraVersionedProtocolNumber (..),
KnownHydraVersions (..),
)
import Hydra.Network.Ouroboros.Client as FireForget (
FireForgetClient (..),
fireForgetClientPeer,
Expand Down
19 changes: 1 addition & 18 deletions hydra-node/src/Hydra/Network/Ouroboros/VersionedProtocol.hs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import Hydra.Prelude
import Codec.CBOR.Term qualified as CBOR
import Data.Text qualified as T
import Hydra.Network (Host (..))
import Hydra.Network.Message (HydraVersionedProtocolNumber (..))
import Network.TypedProtocol.Pipelined ()
import Ouroboros.Network.CodecCBORTerm (CodecCBORTerm (..))
import Ouroboros.Network.Protocol.Handshake.Codec (VersionDataCodec, cborTermVersionDataCodec)
Expand All @@ -20,10 +21,6 @@ hydraVersionedProtocolCodec = CodecCBORTerm{encodeTerm, decodeTerm}
decodeTerm (CBOR.TInt x) = Right $ MkHydraVersionedProtocolNumber x
decodeTerm _ = Left ("unknown tag", Nothing)

type HydraVersionedProtocolNumber :: Type
newtype HydraVersionedProtocolNumber = MkHydraVersionedProtocolNumber {hydraVersionedProtocolNumber :: Int}
deriving stock (Eq, Show, Generic, Ord)

type HydraVersionedProtocolData :: Type
data HydraVersionedProtocolData = MkHydraVersionedProtocolData
deriving stock (Eq, Show, Generic, Ord)
Expand Down Expand Up @@ -59,17 +56,3 @@ data HydraNetworkConfig = HydraNetworkConfig
, remoteHosts :: [Host]
}
deriving stock (Eq, Show, Generic)

type KnownHydraVersions :: Type
data KnownHydraVersions
= KnownHydraVersions {fromKnownHydraVersions :: [HydraVersionedProtocolNumber]}
| NoKnownHydraVersions
deriving stock (Eq, Show, Generic)

type HydraHandshakeRefused :: Type
data HydraHandshakeRefused = HydraHandshakeRefused
{ remoteHost :: Host
, ourVersion :: HydraVersionedProtocolNumber
, theirVersions :: KnownHydraVersions
}
deriving stock (Eq, Show, Generic)
13 changes: 10 additions & 3 deletions hydra-node/src/Hydra/Node/Network.hs
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,14 @@ import Hydra.Logging.Messages (HydraLog (..))
import Hydra.Network (Host (..), IP, NetworkComponent, NodeId, PortNumber)
import Hydra.Network.Authenticate (Authenticated (..), Signed, withAuthentication)
import Hydra.Network.Heartbeat (Heartbeat (..), withHeartbeat)
import Hydra.Network.Message (Connectivity (..), Message, NetworkEvent (..))
import Hydra.Network.Ouroboros (HydraHandshakeRefused (..), HydraNetworkConfig (..), HydraVersionedProtocolNumber (..), TraceOuroborosNetwork, WithHost, withOuroborosNetwork)
import Hydra.Network.Message (
Connectivity (..),
HydraHandshakeRefused (..),
HydraVersionedProtocolNumber (..),
Message,
NetworkEvent (..),
)
import Hydra.Network.Ouroboros (HydraNetworkConfig (..), TraceOuroborosNetwork, WithHost, withOuroborosNetwork)
import Hydra.Network.Reliability (MessagePersistence, ReliableMsg, mkMessagePersistence, withReliability)
import Hydra.Node (HydraNodeLog (..))
import Hydra.Node.ParameterMismatch (ParamMismatch (..), ParameterMismatch (..))
Expand Down Expand Up @@ -140,7 +146,8 @@ withNetwork tracer configuration callback action = do
, localHost
, remoteHosts = peers
}
( \HydraHandshakeRefused{remoteHost} -> callback . ConnectivityEvent $ HandshakeFailure remoteHost
( \HydraHandshakeRefused{remoteHost, ourVersion, theirVersions} ->
callback . ConnectivityEvent $ HandshakeFailure{remoteHost, ourVersion, theirVersions}
)

withHeartbeat nodeId reliability (callback . mapHeartbeat) $ \network ->
Expand Down
8 changes: 6 additions & 2 deletions hydra-node/test/Hydra/NetworkSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@ import Control.Concurrent.Class.MonadSTM (modifyTVar', newTQueue, newTVarIO, rea
import Hydra.Ledger.Simple (SimpleTx (..))
import Hydra.Logging (nullTracer, showLogsOnFailure)
import Hydra.Network (Host (..), Network)
import Hydra.Network.Message (Message (..))
import Hydra.Network.Ouroboros (HydraHandshakeRefused (..), HydraNetworkConfig (..), HydraVersionedProtocolNumber (..), broadcast, withOuroborosNetwork)
import Hydra.Network.Message (
HydraHandshakeRefused (..),
HydraVersionedProtocolNumber (..),
Message (..),
)
import Hydra.Network.Ouroboros (HydraNetworkConfig (..), broadcast, withOuroborosNetwork)
import Hydra.Network.Reliability (MessagePersistence (..))
import Hydra.Node.Network (configureMessagePersistence)
import Hydra.Node.ParameterMismatch (ParameterMismatch)
Expand Down

0 comments on commit 4f50060

Please sign in to comment.