Skip to content

Commit e209cd6

Browse files
Merge #3993
3993: PLT-106: Add encoder and decoder for `LedgerState` r=zliu41 a=zliu41 One use case is for `foldBlocks` to checkpoint the ledger state to avoid having to start from Genisys. cc `@JaredCorduan` Co-authored-by: Ziyang Liu <[email protected]>
2 parents 23e4052 + 1896e34 commit e209cd6

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

cardano-api/src/Cardano/Api.hs

+2
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,8 @@ module Cardano.Api (
541541
envSecurityParam,
542542
LedgerState(..),
543543
initialLedgerState,
544+
encodeLedgerState,
545+
decodeLedgerState,
544546
applyBlock,
545547
ValidationMode(..),
546548

cardano-api/src/Cardano/Api/LedgerState.hs

+31-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ module Cardano.Api.LedgerState
2424
, LedgerStateMary
2525
, LedgerStateAlonzo
2626
)
27+
, encodeLedgerState
28+
, decodeLedgerState
2729
, initialLedgerState
2830
, applyBlock
2931
, ValidationMode(..)
@@ -52,6 +54,7 @@ module Cardano.Api.LedgerState
5254
)
5355
where
5456

57+
import qualified Cardano.Binary as CBOR
5558
import Control.Exception
5659
import Control.Monad (when)
5760
import Control.Monad.Trans.Class
@@ -78,7 +81,7 @@ import qualified Data.Sequence as Seq
7881
import Data.Set (Set)
7982
import qualified Data.Set as Set
8083
import Data.Sharing (FromSharedCBOR, Interns, Share)
81-
import Data.SOP.Strict (NP (..))
84+
import Data.SOP.Strict (K (..), NP (..), fn, (:.:) (Comp))
8285
import Data.Text (Text)
8386
import qualified Data.Text as Text
8487
import qualified Data.Text.Encoding as Text
@@ -142,6 +145,7 @@ import Cardano.Slotting.Slot (WithOrigin (At, Origin))
142145
import qualified Cardano.Slotting.Slot as Slot
143146
import qualified Ouroboros.Consensus.Block.Abstract as Consensus
144147
import qualified Ouroboros.Consensus.Byron.Ledger.Block as Byron
148+
import qualified Ouroboros.Consensus.Byron.Ledger.Ledger as Byron
145149
import qualified Ouroboros.Consensus.Cardano as Consensus
146150
import qualified Ouroboros.Consensus.Cardano.Block as Consensus
147151
import qualified Ouroboros.Consensus.Cardano.CanHardFork as Consensus
@@ -150,6 +154,7 @@ import qualified Ouroboros.Consensus.Config as Consensus
150154
import qualified Ouroboros.Consensus.HardFork.Combinator as Consensus
151155
import qualified Ouroboros.Consensus.HardFork.Combinator.AcrossEras as HFC
152156
import qualified Ouroboros.Consensus.HardFork.Combinator.Basics as HFC
157+
import qualified Ouroboros.Consensus.HardFork.Combinator.Serialisation.Common as HFC
153158
import qualified Ouroboros.Consensus.Ledger.Abstract as Ledger
154159
import Ouroboros.Consensus.Ledger.Basics (LedgerResult (lrEvents), lrResult)
155160
import qualified Ouroboros.Consensus.Ledger.Extended as Ledger
@@ -866,6 +871,31 @@ newtype LedgerState = LedgerState
866871
(Consensus.CardanoEras Consensus.StandardCrypto))
867872
}
868873

874+
encodeLedgerState :: LedgerState -> CBOR.Encoding
875+
encodeLedgerState (LedgerState (HFC.HardForkLedgerState st)) =
876+
HFC.encodeTelescope
877+
(byron :* shelley :* allegra :* mary :* alonzo :* babbage :* Nil)
878+
st
879+
where
880+
byron = fn (K . Byron.encodeByronLedgerState)
881+
shelley = fn (K . Shelley.encodeShelleyLedgerState)
882+
allegra = fn (K . Shelley.encodeShelleyLedgerState)
883+
mary = fn (K . Shelley.encodeShelleyLedgerState)
884+
alonzo = fn (K . Shelley.encodeShelleyLedgerState)
885+
babbage = fn (K . Shelley.encodeShelleyLedgerState)
886+
887+
decodeLedgerState :: forall s. CBOR.Decoder s LedgerState
888+
decodeLedgerState =
889+
LedgerState . HFC.HardForkLedgerState
890+
<$> HFC.decodeTelescope (byron :* shelley :* allegra :* mary :* alonzo :* babbage :* Nil)
891+
where
892+
byron = Comp Byron.decodeByronLedgerState
893+
shelley = Comp Shelley.decodeShelleyLedgerState
894+
allegra = Comp Shelley.decodeShelleyLedgerState
895+
mary = Comp Shelley.decodeShelleyLedgerState
896+
alonzo = Comp Shelley.decodeShelleyLedgerState
897+
babbage = Comp Shelley.decodeShelleyLedgerState
898+
869899
type LedgerStateEvents = (LedgerState, [LedgerEvent])
870900

871901
toLedgerStateEvents ::

0 commit comments

Comments
 (0)