{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE TypeApplications #-}
module Ouroboros.Consensus.Shelley.Protocol.EnvelopeChecks
( EnvelopeError (..)
, EnvelopeHeaderView (..)
, envelopeCheck
) where
import Cardano.Ledger.BaseTypes (Version)
import Cardano.Ledger.Chain (ChainChecksPParams (ccMaxBBSize, ccMaxBHSize))
import Control.Monad (unless)
import Control.Monad.Except (Except, throwError)
import Data.Word (Word16, Word32)
import GHC.Generics (Generic)
import NoThunks.Class (NoThunks)
data EnvelopeError
=
ObsoleteNode !Version !Version
| !Int !Word16
| BlockSizeTooLarge !Word32 !Word32
deriving (EnvelopeError -> EnvelopeError -> Bool
(EnvelopeError -> EnvelopeError -> Bool)
-> (EnvelopeError -> EnvelopeError -> Bool) -> Eq EnvelopeError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: EnvelopeError -> EnvelopeError -> Bool
== :: EnvelopeError -> EnvelopeError -> Bool
$c/= :: EnvelopeError -> EnvelopeError -> Bool
/= :: EnvelopeError -> EnvelopeError -> Bool
Eq, (forall x. EnvelopeError -> Rep EnvelopeError x)
-> (forall x. Rep EnvelopeError x -> EnvelopeError)
-> Generic EnvelopeError
forall x. Rep EnvelopeError x -> EnvelopeError
forall x. EnvelopeError -> Rep EnvelopeError x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. EnvelopeError -> Rep EnvelopeError x
from :: forall x. EnvelopeError -> Rep EnvelopeError x
$cto :: forall x. Rep EnvelopeError x -> EnvelopeError
to :: forall x. Rep EnvelopeError x -> EnvelopeError
Generic, Int -> EnvelopeError -> ShowS
[EnvelopeError] -> ShowS
EnvelopeError -> String
(Int -> EnvelopeError -> ShowS)
-> (EnvelopeError -> String)
-> ([EnvelopeError] -> ShowS)
-> Show EnvelopeError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EnvelopeError -> ShowS
showsPrec :: Int -> EnvelopeError -> ShowS
$cshow :: EnvelopeError -> String
show :: EnvelopeError -> String
$cshowList :: [EnvelopeError] -> ShowS
showList :: [EnvelopeError] -> ShowS
Show)
instance NoThunks EnvelopeError
data =
{ EnvelopeHeaderView -> Version
ehvProtVer :: !Version
, :: !Int
, EnvelopeHeaderView -> Word32
ehvBodySize :: !Word32
}
envelopeCheck ::
Version ->
ChainChecksPParams ->
EnvelopeHeaderView ->
Except EnvelopeError ()
envelopeCheck :: Version
-> ChainChecksPParams
-> EnvelopeHeaderView
-> Except EnvelopeError ()
envelopeCheck Version
maxpv ChainChecksPParams
ccd EnvelopeHeaderView{Version
ehvProtVer :: EnvelopeHeaderView -> Version
ehvProtVer :: Version
ehvProtVer, Int
ehvHeaderSize :: EnvelopeHeaderView -> Int
ehvHeaderSize :: Int
ehvHeaderSize, Word32
ehvBodySize :: EnvelopeHeaderView -> Word32
ehvBodySize :: Word32
ehvBodySize} = do
Bool -> Except EnvelopeError () -> Except EnvelopeError ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Version
ehvProtVer Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
<= Version
maxpv) (Except EnvelopeError () -> Except EnvelopeError ())
-> Except EnvelopeError () -> Except EnvelopeError ()
forall a b. (a -> b) -> a -> b
$
EnvelopeError -> Except EnvelopeError ()
forall a. EnvelopeError -> ExceptT EnvelopeError Identity a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (EnvelopeError -> Except EnvelopeError ())
-> EnvelopeError -> Except EnvelopeError ()
forall a b. (a -> b) -> a -> b
$
Version -> Version -> EnvelopeError
ObsoleteNode Version
ehvProtVer Version
maxpv
Bool -> Except EnvelopeError () -> Except EnvelopeError ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Int
ehvHeaderSize Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= forall a b. (Integral a, Num b) => a -> b
fromIntegral @Word16 @Int (ChainChecksPParams -> Word16
ccMaxBHSize ChainChecksPParams
ccd)) (Except EnvelopeError () -> Except EnvelopeError ())
-> Except EnvelopeError () -> Except EnvelopeError ()
forall a b. (a -> b) -> a -> b
$
EnvelopeError -> Except EnvelopeError ()
forall a. EnvelopeError -> ExceptT EnvelopeError Identity a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (EnvelopeError -> Except EnvelopeError ())
-> EnvelopeError -> Except EnvelopeError ()
forall a b. (a -> b) -> a -> b
$
Int -> Word16 -> EnvelopeError
HeaderSizeTooLarge Int
ehvHeaderSize (ChainChecksPParams -> Word16
ccMaxBHSize ChainChecksPParams
ccd)
Bool -> Except EnvelopeError () -> Except EnvelopeError ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Word32
ehvBodySize Word32 -> Word32 -> Bool
forall a. Ord a => a -> a -> Bool
<= ChainChecksPParams -> Word32
ccMaxBBSize ChainChecksPParams
ccd) (Except EnvelopeError () -> Except EnvelopeError ())
-> Except EnvelopeError () -> Except EnvelopeError ()
forall a b. (a -> b) -> a -> b
$
EnvelopeError -> Except EnvelopeError ()
forall a. EnvelopeError -> ExceptT EnvelopeError Identity a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (EnvelopeError -> Except EnvelopeError ())
-> EnvelopeError -> Except EnvelopeError ()
forall a b. (a -> b) -> a -> b
$
Word32 -> Word32 -> EnvelopeError
BlockSizeTooLarge Word32
ehvBodySize (ChainChecksPParams -> Word32
ccMaxBBSize ChainChecksPParams
ccd)