Closed dnadales closed 10 months ago
Test output:
These fields are also empty when encoded via FlatTerm
:
, txSeqBodyBytes = ""
, txSeqWitsBytes = ""
, txSeqMetadataBytes = ""
, txSeqIsValidBytes = ""
The decoding via FlatTerm
seems to be tripping on lazy bytestrings.
Decoding via FlatTerm
if there are decoders that rely on byte peeking. See this comment. Therefore, I do not see an immediate solution to this problem. Considering that testing roundtripping via FlatTerm
was nice to have for solving this issue, I will mark this as "wont-fix".
The issue can be reproduced with the following code:
import qualified Cardano.Ledger.Binary.Plain as Plain
import Data.Int (Int64)
import qualified Data.ByteString as BS
import Cardano.Ledger.Binary (Annotator (..), CBORGroup (unCBORGroup),
DecCBOR (decCBOR), EncCBOR (..), ToCBOR (..),
encodedSigKESSizeExpr, serialize', withSlice)
data X = X { aNum :: Int64, aNumBytes :: BS.ByteString }
deriving (Show)
mkX i = X i (Plain.serialize' i)
instance Plain.ToCBOR X where
toCBOR (X _ bytes) = Plain.encodePreEncoded bytes
instance DecCBOR (Annotator Int64) where
decCBOR = pure <$> decCBOR
instance DecCBOR (Annotator X) where
decCBOR = do
(Annotator getANum, Annotator getBytes) <- withSlice decCBOR
pure (Annotator (\fullBytes -> X (getANum fullBytes) (BSL.toStrict $ getBytes fullBytes)))
test :: IO ()
test = do
let
enc = toCBOR (mkX 42)
dec = (toPlainDecoder byronProtVer decCBOR :: Plain.Decoder s (Annotator X))
bs = toLazyByteString enc
flatTerm = toFlatTerm enc
Right (bsRem, fDec) = deserialiseFromBytes dec bs
Right fDec' = fromFlatTerm dec flatTerm
print (runAnnotator fDec (Full bs) )
print (runAnnotator fDec' (Full bs) )
On ghci:
ghci> test
X {aNum = 42, aNumBytes = "\CAN*"}
X {aNum = 42, aNumBytes = ""}
The error can be reproduced by running:
in
ourboros-consensus
.One problem seems to be that the
headerBytes
are empty in the decodedFlatTerm
.