-
Notifications
You must be signed in to change notification settings - Fork 86
Technical Architecture
NOTE: This document should be superseded by embedded documentation in the repository once PR #13 is merged
This document is constant work-in-progress which serves as raw material for more formal documents that would be published as part of the release lifecycle of Hydra node.
The following diagram represents the internal structure of the HydraNode and the interactions between its components.
Legend:
- Grayed boxes represent components which are not developed yet
- Black boxes represent components which are expected to be used as black box, eg. without any knowledge of their inner workings.
- Arrows depict the flow of data (Requests, messages, responses...)
- We represent some components that are not part of the Hydra node proper for legibility's sake
- The HydraNode is a handle to all other components' handles
- This handle is used by the main loop to
processNextEvent
andprocessEffect
- This component implements the Head Protocol's state machine as a pure function.
- The protocol is described in two parts in the Hydra paper:
- One part detailing how the Head deals with clients input, eg. ClientRequest:
- Another part detailing how the Head reacts to peers input provided by the network, eg. HydraMessage:
- The OnChain client implements the Head-Chain Interaction part of the protocol:
- Incoming and outgoing on-chain transactions are modelled as an OnChainTx data type that abstracts away the details of the structure of the transaction.
- The
ChainEffect
produced by the Head Logic's state machine represents a transaction to be posted on-chain. The node delegates the actual posting of the transaction to aOnChain
handle wrapping a singlepostTx
function. - Incoming transactions from the chain are handled using a similar Callback function which is passed to the actual chain client upon initialisation of the node.
- This function wraps incoming
OnChainTx
asChainEvent
and put them into the Event queue for later processing by the Node's Reactive loop
- This function wraps incoming
- In order to ease the development process, we provide an idealised version of a blockchain client, implemented using 0MQ.
- The server is implemented as a standalone executable which simply stores and forwards all transactions received to all connected clients using Pub/Sub connections.
- As clients can come and go at any time, the server also provides a
Rep
type socket for clients to request past transactions- The Hydra node catch-up with past transactions when it starts the On-Chain client.
Note: This client is not currently implemented, see the Chain Client and Smart Contracts section for more details.
- The Network component provides the Node an asynchronous messaging interface to the Hydra Network, e.g to other Hydra nodes
- Similar to the On-chain client:
- Incoming and outgoing messages are modelled as HydraMessage data type
- A
NetworkEffect
is produced by theHeadLogic
to request posting of a transaction by the actual network implementation, while the latter enqueues aNetworkEvent
when it receives a message from the a peer,
- The
HydraNetwork
's only interface isbroadcast
which means all messages are sent to all Hydra peersNOTE: This is a departure from the protocol's description in the original paper but it's hinted at as a possible alternative to unicast on p.21's footnote.
- We provide 2 implementations of the network, one based on the ouroboros-network framework and one based on 0MQ
NOTE: While it is more work to maintain two implementations for the same interface, we think this cost is more than offset by the benefits this provides: Interfaces must not leak implementation details and it provides options for deployment and configuration.
- The Ouroboros based network layer implements a dumb FireForget protocol
- Contrary to other protocols implemented in Ouroboros, this is a push-based protocol
- The 0MQ based network
- The main component of the Head is an interface to the Ledger which allows the head to maintain and update the state of Seen or Confirmed transactions and UTxOs according to its protocol.
- Structured logging is implemented using IOHK monitoring framework which provides backend for contra-tracer generic logging
- Each component defines its own tracing messages as a datatype and they are aggregated in the HydraLog datatype. Specialized
Tracer
s can be passed around from the top-level one usingcontramap
to peel one layer of the onion - Configuration of the main tracer is done via the withTracer wrapper function
- Metrics and monitoring are piggy-backed on tracing events:
- Monitoring collection is configured at start of the hydra-node
- Traced events can be interpreted as contributing to some specific metric value without trace producers needing to be aware of how this process happens
- Metrics are exposed using Prometheus format over URI
/metrics
from an HTTP server started on a configurable port.
- This article provides a detailed walkthrough of the design and implementation of Hydra head protocol on-chain smart contracts
- Those smart contracts will be embedded with a dedicated Plutus Application Backend