ouroboros-consensus- Consensus layer for the Ouroboros blockchain protocol
Safe Haskell None
Language Haskell2010



Intended for qualified import

import Ouroboros.Consensus.Fragment.InFuture (CheckInFuture(..), ClockSkew(..))
import qualified Ouroboros.Consensus.Fragment.InFuture as InFuture


data InFuture m blk Source #

Header of block that we found to be in the future




Clock skew

clockSkewInSeconds :: Double -> ClockSkew Source #

Specify maximum clock skew in seconds

defaultClockSkew :: ClockSkew Source #

Default maximum permissible clock skew

See ClockSkew for details. We allow for 5 seconds skew by default.


data ClockSkew Source #

Maximum permissible clock skew

When running NTP, systems clocks will never be perfectly synchronized. The maximum clock skew records how much of a difference we consider acceptable.

For example. Suppose

  • Two nodes A and B
  • A's clock is 0.5 ahead of B's
  • A produces a block and sends it to B
  • When B translates the SlotNo of that block to a time, it may find that it is 0.5 seconds ahead of its current clock (worst case).

The maximum permissible clock skew decides if B will consider this block to be valid (even if it will not yet consider it for chain seleciton) or as invalid (and disconnect from A, since A is sending it invalid blocks).

Use defaultClockSkew when unsure.


dontCheck :: Monad m => CheckInFuture m blk Source #

Trivial InFuture check that doesn't do any check at all

This is useful for testing and tools such as the DB converter.

miracle Source #


:: forall m blk. ( MonadSTM m, HasHeader ( Header blk))
=> STM m SlotNo

Get current slot

-> Word64

Maximum clock skew (in terms of slots)

-> CheckInFuture m blk

If by some miracle we have a function that can always tell us what the correct slot is, implementing CheckInFuture is easy

NOTE: Use of miracle in tests means that none of the hard fork infrastructure for converting slots to time is tested.