io-sim
-IOSim
simulator monad which supports asynchronous exceptions,STM
transactions andasync
interface, timers.io-classes
- type classes, all of them have instance for bothIOSim
andIO
.typed-protocols
- session type framework with support of protocol pipeliningouroboros-network
- ouroboros network package which implements protocols which to run ouroboros family of protocols, multiplexing layer.- The
byron-proxy
is a network protocol proxy between Byron and Shelley. It now lives in a separate repository.
We have two documents which describe various levels of the networking layer of the Cardano Shelley implementation:
-
Introduction to the design of Data Diffusion and Networking of Cardano Shelley
This document explains the technical requirements and key constraints for the networking layer of the Cardano Shelley implementation of Ouroboros Praos. This is a design document.
-
The Shelley Networking Protocol
This document is a technical specification of the networking protocol. It includes serialisation formats, necessary details of multiplexer and technical specifications of mini-protocols used by either node-to-node and node-to-client flavours of the protocol.
-
Official Cardano Documentation
Specifically the section "Explore Cardano" is helpful, since it talks about the Cardano Architecture, Cardano Design Rationale, the Cardano Network, etc. Although the Cardano documentation is less detailed, it is a good place to start and refresh some more basic concepts about Cardano.
The API consists of three layers:
• mini-protocol api's, which are GADTs for each mini-protocol under Ouroboros.Network.Protocol
; this hides heavy type machinery of session types. One only needs the typed Peer
type when one is using runPeer
or runPeerPipelined
function and each protocol exposes a function to create it (e.g. Ouroboros.Network.Protocol.ChainSync.Client.chainSyncClientPeer
)
• callback ptcl -> channel -> m ()
where ptcl
is enumeration for each mini-protocol, this is either NodeToNodeProtocols
or NodeToClientProtocols
. The callback is wrapped in OuroborosApplication
GADT which allows to differentiate the initiator / responder (or client / server) callbacks.
• versioning which is a map from version numbers to the above callbacks and version data (the tricky part here is that version data type can be different between different versions; there is a simple way of building this map using a semigroup). You can use simpleSingletonVersion
if your application does not depend on negotiated version data. However, Ouroboros.Network.NodeToNode
and Ouroboros.Network.NodeToClient
expose V1
api which hides versioning from the caller.
- demo-chain-sync
- cardano-ping
- mux-demo
- demo-ping-pong
- named-pipe-demo (Windows only)
- demo-ntp-client
Instructions
To run a demo type:cabal run <DEMO_NAME> --
After --
you will need to pass arguments, when a demo is run without
arguments it will specify what arguments it needs.
Consensus layer of the family Ouroboros blockchain protocols.
The ouroboros-consensus/docs
folder contains documentation about the
consensus layer. Start with the
README.md.
-
The Cardano Consensus and Storage Layer
This technical report explains the design of the consensus and storage layer.
The consensus team uses stylish-haskell
>= 0.11.0.0 to format its code. This
is enforced by CI.
Either enable editor integration or run the following command to manually format all of the consensus code (but not the network code):
stylish-haskell -i `git ls-files -- 'ouroboros-consensus*/*.hs' | grep -v Setup.hs`
Alternatively, call the script used by CI itself: https://github.com/input-output-hk/ouroboros-network/blob/master/scripts/buildkite/check-stylish.sh
./scripts/buildkite/check-stylish.sh
When using Nix, you can use the following command, which will build and use
the right version of stylish-haskell
.
nix-shell --run ./scripts/buildkite/check-stylish.sh