7
7
{-# LANGUAGE OverloadedStrings #-}
8
8
{-# LANGUAGE PatternSynonyms #-}
9
9
{-# LANGUAGE PolyKinds #-}
10
+ {-# LANGUAGE RecordWildCards #-}
10
11
{-# LANGUAGE ScopedTypeVariables #-}
11
12
{-# LANGUAGE StandaloneDeriving #-}
12
13
{-# LANGUAGE TypeApplications #-}
13
14
{-# LANGUAGE TypeFamilies #-}
14
- {-# LANGUAGE TypeOperators #-}
15
15
{-# LANGUAGE UndecidableInstances #-}
16
+ {-# LANGUAGE ViewPatterns #-}
16
17
17
18
module Cardano.Ledger.Keys.Bootstrap (
18
19
BootstrapWitness (
@@ -22,6 +23,7 @@ module Cardano.Ledger.Keys.Bootstrap (
22
23
bwChainCode ,
23
24
bwAttributes
24
25
),
26
+ BootstrapWitnessRaw ,
25
27
ChainCode (.. ),
26
28
bootstrapWitKeyHash ,
27
29
unpackByronVKey ,
@@ -41,11 +43,9 @@ import Cardano.Ledger.Binary (
41
43
Annotator ,
42
44
DecCBOR (.. ),
43
45
EncCBOR (.. ),
44
- annotatorSlice ,
45
46
byronProtVer ,
46
47
decodeRecordNamed ,
47
48
encodeListLen ,
48
- serialize ,
49
49
serialize' ,
50
50
)
51
51
import Cardano.Ledger.Binary.Crypto (
@@ -62,41 +62,68 @@ import Cardano.Ledger.Keys.Internal (
62
62
)
63
63
import Cardano.Ledger.MemoBytes (
64
64
EqRaw (.. ),
65
- MemoBytes (Memo ),
66
- decodeMemoized ,
65
+ Mem ,
66
+ MemoBytes ,
67
+ Memoized (.. ),
68
+ getMemoRawType ,
69
+ mkMemoized ,
67
70
)
68
71
import Control.DeepSeq (NFData )
69
72
import Data.ByteString (ByteString )
70
- import qualified Data.ByteString.Lazy as LBS
71
- import qualified Data.ByteString.Short as SBS
72
73
import Data.Coerce (coerce )
73
74
import Data.Maybe (fromMaybe )
74
75
import Data.Ord (comparing )
75
76
import Data.Proxy (Proxy (.. ))
76
77
import GHC.Generics (Generic )
77
- import NoThunks.Class (AllowThunksIn ( .. ), NoThunks (.. ))
78
+ import NoThunks.Class (NoThunks (.. ))
78
79
import Quiet
79
80
80
81
newtype ChainCode = ChainCode { unChainCode :: ByteString }
81
82
deriving (Eq , Generic )
82
83
deriving (Show ) via Quiet ChainCode
83
84
deriving newtype (NoThunks , EncCBOR , DecCBOR , NFData )
84
85
85
- data BootstrapWitness = BootstrapWitness'
86
- { bwKey' :: ! (VKey 'Witness)
87
- , bwSig' :: ! (SignedDSIGN DSIGN (Hash HASH EraIndependentTxBody ))
88
- , bwChainCode' :: ! ChainCode
89
- , bwAttributes' :: ! ByteString
90
- , bwBytes :: LBS. ByteString
86
+ data BootstrapWitnessRaw = BootstrapWitnessRaw
87
+ { bwrKey :: ! (VKey 'Witness)
88
+ , bwrSignature :: ! (SignedDSIGN DSIGN (Hash HASH EraIndependentTxBody ))
89
+ , bwrChainCode :: ! ChainCode
90
+ , bwrAttributes :: ! ByteString
91
91
}
92
92
deriving (Generic , Show , Eq )
93
93
94
- instance NFData BootstrapWitness
94
+ instance NFData BootstrapWitnessRaw
95
+ instance NoThunks BootstrapWitnessRaw
96
+
97
+ instance EncCBOR BootstrapWitnessRaw where
98
+ encCBOR cwr@ (BootstrapWitnessRaw _ _ _ _) =
99
+ let BootstrapWitnessRaw {.. } = cwr
100
+ in encodeListLen 4
101
+ <> encCBOR bwrKey
102
+ <> encodeSignedDSIGN bwrSignature
103
+ <> encCBOR bwrChainCode
104
+ <> encCBOR bwrAttributes
105
+
106
+ instance DecCBOR BootstrapWitnessRaw where
107
+ decCBOR =
108
+ decodeRecordNamed " BootstrapWitnessRaw" (const 4 ) $
109
+ BootstrapWitnessRaw <$> decCBOR <*> decodeSignedDSIGN <*> decCBOR <*> decCBOR
110
+
111
+ instance DecCBOR (Annotator BootstrapWitnessRaw ) where
112
+ decCBOR = pure <$> decCBOR
113
+
114
+ newtype BootstrapWitness = BootstrapWitnessConstr (MemoBytes BootstrapWitnessRaw )
115
+ deriving (Generic )
116
+ deriving newtype (Show , Eq , NFData , NoThunks , Plain.ToCBOR , DecCBOR )
117
+
118
+ instance Memoized BootstrapWitness where
119
+ type RawType BootstrapWitness = BootstrapWitnessRaw
120
+
121
+ instance EncCBOR BootstrapWitness
95
122
96
123
deriving via
97
- ( AllowThunksIn '[ " bwBytes " ] BootstrapWitness )
124
+ Mem BootstrapWitnessRaw
98
125
instance
99
- NoThunks BootstrapWitness
126
+ DecCBOR ( Annotator BootstrapWitness )
100
127
101
128
pattern BootstrapWitness ::
102
129
VKey 'Witness ->
@@ -105,55 +132,17 @@ pattern BootstrapWitness ::
105
132
ByteString ->
106
133
BootstrapWitness
107
134
pattern BootstrapWitness {bwKey, bwSig, bwChainCode, bwAttributes} <-
108
- BootstrapWitness' bwKey bwSig bwChainCode bwAttributes _
135
+ ( getMemoRawType ->
136
+ BootstrapWitnessRaw bwKey bwSig bwChainCode bwAttributes
137
+ )
109
138
where
110
- BootstrapWitness key sig cc attributes =
111
- let bytes =
112
- serialize byronProtVer $
113
- encodeListLen 4
114
- <> encCBOR key
115
- <> encodeSignedDSIGN sig
116
- <> encCBOR cc
117
- <> encCBOR attributes
118
- in BootstrapWitness' key sig cc attributes bytes
119
-
139
+ BootstrapWitness bwKey bwSig bwChainCode bwAttributes =
140
+ mkMemoized minBound $ BootstrapWitnessRaw bwKey bwSig bwChainCode bwAttributes
120
141
{-# COMPLETE BootstrapWitness #-}
121
142
122
143
instance Ord BootstrapWitness where
123
144
compare = comparing bootstrapWitKeyHash
124
145
125
- instance Plain. ToCBOR BootstrapWitness where
126
- toCBOR = Plain. encodePreEncoded . LBS. toStrict . bwBytes
127
-
128
- -- | Encodes memoized bytes created upon construction.
129
- instance EncCBOR BootstrapWitness
130
-
131
- instance DecCBOR (Annotator BootstrapWitness ) where
132
- decCBOR = annotatorSlice $
133
- decodeRecordNamed " BootstrapWitness" (const 4 ) $ do
134
- key <- decCBOR
135
- sig <- decodeSignedDSIGN
136
- cc <- decCBOR
137
- attributes <- decCBOR
138
- pure . pure $ BootstrapWitness' key sig cc attributes
139
-
140
- data BootstrapWitnessRaw
141
- = BootstrapWitnessRaw
142
- ! (VKey 'Witness)
143
- ! (SignedDSIGN DSIGN (Hash HASH EraIndependentTxBody ))
144
- ! ChainCode
145
- ! ByteString
146
-
147
- instance DecCBOR BootstrapWitnessRaw where
148
- decCBOR =
149
- decodeRecordNamed " BootstrapWitnessRaw" (const 4 ) $
150
- BootstrapWitnessRaw <$> decCBOR <*> decodeSignedDSIGN <*> decCBOR <*> decCBOR
151
-
152
- instance DecCBOR BootstrapWitness where
153
- decCBOR = do
154
- Memo (BootstrapWitnessRaw k s c a) bs <- decodeMemoized (decCBOR @ BootstrapWitnessRaw )
155
- pure $ BootstrapWitness' k s c a (LBS. fromStrict (SBS. fromShort bs))
156
-
157
146
-- | Rebuild the addrRoot of the corresponding address.
158
147
bootstrapWitKeyHash ::
159
148
BootstrapWitness ->
0 commit comments