IntersectMBO / ouroboros-consensus

Implementation of a Consensus Layer for the Ouroboros family of protocols
https://ouroboros-consensus.cardano.intersectmbo.org
Apache License 2.0
31 stars 22 forks source link

Conway block does not roundtrip via FlatTerm #481

Closed dnadales closed 10 months ago

dnadales commented 10 months ago

The error can be reproduced by running:

cabal test ouroboros-consensus-cardano:cardano-test --test-show-details=direct --test-options='-p "/Example/&&/Block.Conway/"'

in ourboros-consensus.

One problem seems to be that the headerBytes are empty in the decoded FlatTerm.

dnadales commented 10 months ago

Test output:

```haskell { getHardForkBlock = S ( S ( S ( S ( S ( S ( Z ( I ( ShelleyBlock { shelleyBlockRaw = Block' ( HeaderConstr { headerRaw = HeaderRaw { headerRawBody = HeaderBody { hbBlockNo = BlockNo 3 , hbSlotNo = SlotNo 9 , hbPrev = BlockHash ( HashHeader { unHashHeader = "bb30a42c1e62f0afda5f0a4e8a562f7a13a24cea00ee81917b86b89e801314aa" } ) , hbVk = VKey ( VerKeyEd25519DSIGN "8a88e3dd7409f195fd52db2d3cba5d72ca6709bf1d94121bf3748801b40f6f5c" ) , hbVrfVk = VerKeyPraosVRF "\x8a\x88ãÝt\x9ñ\x95ýRÛ-<º]rÊg\x9¿\x1d\x94\x12\x1bót\x88\x1´\xfo\" , hbVrfRes = CertifiedVRF { certifiedOutput = OutputVRF { getOutputVRFBytes = "OïÇÇ\x18i;WÈqpκ"\x3\x82¯½ÑHÀ¥;J\x0\x9c¦:Ññ\x1H:apÈ:wò=6*hܵ\x2\x80-÷ù\x8f¤÷§\x8b@\x82²\x11S\xe\x1240" } , certifiedProof = CertPraosVRF "÷pöv\x9aé\x87\x1dB¹pübT»\x92|!\x81ÿôX\x97òA½r"\x1d\x86Ó<\x8döL <\x8c»\x9a¥/ï\x19\x1dr\x2F\Rß\x8d3rz8ÇÜ]@\x86Mu3H£@ø¯Ë³»\x5Ô ?\x16±\x8\xd" } , hbBodySize = 2345 , hbBodyHash = "62f8193aab76b2048d91852b85aed4632439a3303ae148f9a5c375006356e687" , hbOCert = OCert { ocertVkHot = VerKeySumKES "d298da3803eb9958f01c02e73f2410f2f9bb2ecbc346526b1b76772e1bdd7db5" , ocertN = 0 , ocertKESPeriod = KESPeriod 0 , ocertSigma = SignedDSIGN ( SigEd25519DSIGN "940f8a3696847e4a238705bdd27a345086282067b9bc5cb7b69847ca8756085844d576f59ab056c169a504320cc1eab4c11fd529482b3c57da6fa96d44635b08" ) } , hbProtVer = ProtVer { pvMajor = Version 2 , pvMinor = 0 } } , headerRawSig = SignedKES { getSig = SigSumKES ( SigSumKES ( SigSumKES ( SigSumKES ( SigSumKES ( SigSumKES ( SigSingleKES ( SigEd25519DSIGN "83473ded4325b19fe50adf277be2ba7b40db30040e6c7566479e873d6aee25e7b44df5006c1242331f658841e9386ef32cc0086ca5e0819338e3e5d9c2e16208" ) ) ( VerKeySingleKES ( VerKeyEd25519DSIGN "cc6a5ab5c9b40f817c715df558af7d07b6186f0ccf31715ec2fb00980730ac16" ) ) ( VerKeySingleKES ( VerKeyEd25519DSIGN "6af657e6670608afe1bf651d496e01b1c7ff1eb44614d8cfd1b7e32b2c293934" ) ) ) ( VerKeySumKES "9236cc0ada145d8d8d7ad919ef1e60c8bbad31dbedf9f395849705a00c14a878" ) ( VerKeySumKES "5106aae31f55abc5b1f2089cbef16d9401f158704c1e4f740f7125cfc700a99d" ) ) ( VerKeySumKES "97d0332eacb33e4bbc8dab2872ec2b3df9e113addaebd156bfc64fdfc732614d" ) ( VerKeySumKES "2aedd10a58a34993b7b08c822af3aa615b6bbb9b267bc902e4f1075e194aed08" ) ) ( VerKeySumKES "4ca18f8bcde1a6b094bf3f5295a0d454c0a083ed5b74f7092fc0a7346c03979a" ) ( VerKeySumKES "30eeea76d686e512ba48d21544ba874886cdd166cbf275b11f1f3881f4c4277c" ) ) ( VerKeySumKES "09a24b88fc6168f4578267bdc9d62cb9b78b8dfc888ccce226a177725f39e7d5" ) ( VerKeySumKES "0930552861d1e88b7898971c780dc3b773321ba1854422b5cecead7d50e77783" ) ) ( VerKeySumKES "050eeae2cd9595b9cd91681c72e5d53bb7d12f28dec9b2847ee70a3d7781fb11" ) ( VerKeySumKES "33aea3b169f536ff5945ec0a76950e51beded0627bb78120617a2f0842e50e39" ) } } , headerBytes = "\x82\x8a\x3\x9X »0¤,\x1ebð¯Ú_ N\x8aV/z\x13¢Lê\x0î\x81\x91{\x86¸\x9e\x80\x13\x14ªX \x8a\x88ãÝt\x9ñ\x95ýRÛ-<º]rÊg\x9¿\x1d\x94\x12\x1bót\x88\x1´\xfo\X \x8a\x88ãÝt\x9ñ\x95ýRÛ-<º]rÊg\x9¿\x1d\x94\x12\x1bót\x88\x1´\xfo\\x82X@OïÇÇ\x18i;WÈqpκ"\x3\x82¯½ÑHÀ¥;J\x0\x9c¦:Ññ\x1H:apÈ:wò=6*hܵ\x2\x80-÷ù\x8f¤÷§\x8b@\x82²\x11S\xe\x1240XP÷pöv\x9aé\x87\x1dB¹pübT»\x92|!\x81ÿôX\x97òA½r"\x1d\x86Ó<\x8döL <\x8c»\x9a¥/ï\x19\x1dr\x2F\Rß\x8d3rz8ÇÜ]@\x86Mu3H£@ø¯Ë³»\x5Ô ?\x16±\x8\xd\x19\x9)X bø\x19:«v²\x4\x8d\x91\x85+\x85®Ôc$9£0:áHù¥Ãu\x0cVæ\x87\x84X Ò\x98Ú8\x3ë\x99Xð\x1c\x2ç?$\x10òù».ËÃFRk\x1bvw.\x1bÝ}µ\x0\x0X@\x94\xf\x8a6\x96\x84~J#\x87\x5½Òz4P\x86( g¹¼\·¶\x98GÊ\x87V\x8XDÕvõ\x9a°VÁi¥\x42\xcÁê´Á\x1fÕ)H+K¼\x8d«(rì+=ùá\x13\xadÚëÑV¿ÆOßÇ2aM*íÑ X£I\x93·°\x8c\x82*óªa[k»\x9b&{É\x2äñ\x7^\x19Jí\x8L¡\x8f\x8bÍᦰ\x94¿?R\x95 ÔTÀ \x83í[t÷\x9/À§4l\x3\x97\x9a0îêvÖ\x86å\x12ºHÒ\x15Dº\x87H\x86ÍÑfËòu±\x1f\x1f8\x81ôÄ'|\x9¢K\x88üahôW\x82g½ÉÖ,¹·\x8b\x8dü\x88\x8cÌâ&¡wr_9çÕ\x90U(aÑè\x8bx\x98\x97\x1cx\xd÷s2\x1b¡\x85D"µÎÎ\xad}Pçw\x83\x5\xeêâÍ\x95\x95¹Í\x91h\x1cråÕ;·Ñ/(Þɲ\x84~ç =w\x81û\x113®£±iõ6ÿYEì v\x95\xeQ¾ÞÐb{·\x81 az/\x8Bå\xe9" } ) ( TxSeq' { txSeqTxns = StrictSeq { fromStrict = fromList [ AlonzoTx { body = TxBodyConstr ConwayTxBodyRaw { ctbrSpendInputs = fromList [ TxIn ( TxId { unTxId = SafeHash "ee155ace9c40292074cb6aff8c9ccdd273c81648ff1149ef36bcea6ebb8a3e25" } ) ( TxIx 0 ) ] , ctbrCollateralInputs = fromList [ TxIn ( TxId { unTxId = SafeHash "bb30a42c1e62f0afda5f0a4e8a562f7a13a24cea00ee81917b86b89e801314aa" } ) ( TxIx 1 ) ] , ctbrReferenceInputs = fromList [ TxIn ( TxId { unTxId = SafeHash "ee155ace9c40292074cb6aff8c9ccdd273c81648ff1149ef36bcea6ebb8a3e25" } ) ( TxIx 3 ) ] , ctbrOutputs = StrictSeq { fromStrict = fromList [ Sized { sizedValue = ( Addr Testnet ( KeyHashObj ( KeyHash "cb9358529df4729c3246a2a033cb9821abbfd16de4888005904abc41" ) ) ( StakeRefBase ( KeyHashObj ( KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" ) ) ) , MaryValue 100 ( MultiAsset ( fromList [ ( PolicyID { policyID = ScriptHash "a646474b8f5431261506b6c273d307c7569a4eb6c96b42dd4a29520a" } , fromList [ ( "636f75747473436f696e" , 1000 ) ] ) ] ) ) , Datum "\x18¿" , SJust PlutusScript PlutusV2 ScriptHash "f3fbfa47030ad28189ae30b6218704ebe707f3035e5526e5a391df4d" ) , sizedSize = 134 } ] } , ctbrCollateralReturn = SJust ( Sized { sizedValue = ( Addr Testnet ( KeyHashObj ( KeyHash "cb9358529df4729c3246a2a033cb9821abbfd16de4888005904abc41" ) ) ( StakeRefBase ( KeyHashObj ( KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" ) ) ) , MaryValue 8675309 ( MultiAsset ( fromList [] ) ) , NoDatum , SNothing ) , sizedSize = 65 } ) , ctbrTotalCollateral = SJust ( Coin 8675309 ) , ctbrCerts = OSet { osSSeq = StrictSeq { fromStrict = fromList [ ConwayTxCertPool ( RegPool ( PoolParams { ppId = KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" , ppVrf = "c5e21ab1c9f6022d81c3b25e3436cb7f1df77f9652ae3e1310c28e621dd87b4c" , ppPledge = Coin 1 , ppCost = Coin 5 , ppMargin = 1 % 10 , ppRewardAcnt = RewardAcnt { getRwdNetwork = Testnet , getRwdCred = KeyHashObj ( KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" ) } , ppOwners = fromList [ KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" ] , ppRelays = StrictSeq { fromStrict = fromList [] } , ppMetadata = SJust ( PoolMetadata { pmUrl = Url { urlToText = "consensus.pool" } , pmHash = "{}" } ) } ) ) ] } , osSet = fromList [ ConwayTxCertPool ( RegPool ( PoolParams { ppId = KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" , ppVrf = "c5e21ab1c9f6022d81c3b25e3436cb7f1df77f9652ae3e1310c28e621dd87b4c" , ppPledge = Coin 1 , ppCost = Coin 5 , ppMargin = 1 % 10 , ppRewardAcnt = RewardAcnt { getRwdNetwork = Testnet , getRwdCred = KeyHashObj ( KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" ) } , ppOwners = fromList [ KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" ] , ppRelays = StrictSeq { fromStrict = fromList [] } , ppMetadata = SJust ( PoolMetadata { pmUrl = Url { urlToText = "consensus.pool" } , pmHash = "{}" } ) } ) ) ] } , ctbrWithdrawals = Withdrawals { unWithdrawals = fromList [ ( RewardAcnt { getRwdNetwork = Testnet , getRwdCred = KeyHashObj ( KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" ) } , Coin 100 ) ] } , ctbrTxfee = Coin 999 , ctbrVldt = ValidityInterval { invalidBefore = SJust ( SlotNo 2 ) , invalidHereafter = SJust ( SlotNo 4 ) } , ctbrReqSignerHashes = fromList [ KeyHash "f81ce66e0f52da5ca48193386e7511fde5b030a307b4c3681736c6f0" ] , ctbrMint = MultiAsset ( fromList [ ( PolicyID { policyID = ScriptHash "b16b56f5ec064be6ac3cab6035efae86b366cc3dc4a0d571603d70e5" } , fromList [ ( "636f75747473436f696e" , 1000 ) ] ) ] ) , ctbrScriptIntegrityHash = SJust ( SafeHash "9e1199a988ba72ffd6e9c269cadb3b53b5f360ff99f112d9b2ee30c4d74ad88b" ) , ctbrAuxDataHash = SJust ( AuxiliaryDataHash { unsafeAuxiliaryDataHash = SafeHash "9e1199a988ba72ffd6e9c269cadb3b53b5f360ff99f112d9b2ee30c4d74ad88b" } ) , ctbrTxNetworkId = SJust Mainnet , ctbrVotingProcedures = VotingProcedures { unVotingProcedures = fromList [] } , ctbrProposalProcedures = OSet { osSSeq = StrictSeq { fromStrict = fromList [] } , osSet = fromList [] } , ctbrCurrentTreasuryValue = SJust ( Coin 867530900000 ) , ctbrTreasuryDonation = Coin 0 } ( blake2b_256: SafeHash "2625c0e2a8e0c3a636ac20b1a4ec7fc52db681c607cefae360bd8943abadf95a" ) , wits = AlonzoTxWitsRaw { atwrAddrTxWits = fromList [ WitVKeyInternal { wvkKey = VKey ( VerKeyEd25519DSIGN "3b6a27bcceb6a42d62a3a8d02a6f0d73653215771de243a63ac048a18b59da29" ) , wvkSig = SignedDSIGN ( SigEd25519DSIGN "81c22faf4cabefa8eccf88713f1303e8289e8340c89c9f2db5ccc411b57da9143a61369961db25e18ff893f4c90c2c174044122a15b2e2e48bfb012b5d548304" ) , wvkKeyHash = KeyHash "cb9358529df4729c3246a2a033cb9821abbfd16de4888005904abc41" , wvkBytes = "\x82X ;j'¼Î¶¤-b£¨Ð*o\xdse2\x15w\x1dâC¦:ÀH¡\x8bYÚ)X@\x81Â/¯L«ï¨ìÏ\x88q?\x13\x3è(\x9e\x83@È\x9c\x9f-µÌÄ\x11µ}©\x14:a6\x99aÛ%á\x8fø\x93ôÉ\xc,\x17@D\x12*\x15²âä\x8bû\x1+]T\x83\x4" } ] , atwrBootAddrTxWits = fromList [] , atwrScriptTxWits = fromList [ ( ScriptHash "58503a1d89a21fc9fc53d6a7cccef47341175a8f47636f57ccbdca2d" , PlutusScript PlutusV1 ScriptHash "58503a1d89a21fc9fc53d6a7cccef47341175a8f47636f57ccbdca2d" ) ] , atwrDatsTxWits = TxDatsConstr TxDatsRaw ( fromList [ ( SafeHash "570a4d77865350e57cfc54d4c2b56b515eddeb29f98f0a52fb0ffaca11fdfbeb" , DataConstr I 191 ( blake2b_256: SafeHash "570a4d77865350e57cfc54d4c2b56b515eddeb29f98f0a52fb0ffaca11fdfbeb" ) ) ] ) ( blake2b_256: SafeHash "6e186def6cd8d7005cbb4eb39ec3c55d6696e4a6f0e52d19b05bce1ad6c5420b" ) , atwrRdmrsTxWits = RedeemersConstr RedeemersRaw ( fromList [ ( RdmrPtr Spend 0 , ( DataConstr I 919 ( blake2b_256: SafeHash "c3639d7e69559c602afb1ab2f3bcc5a0c6155ebf462bfb2c23ec63ff8a152640" ) , WrapExUnits { unWrapExUnits = ExUnits' { exUnitsMem' = 5000 , exUnitsSteps' = 5000 } } ) ) ] ) ( blake2b_256: SafeHash "5dcc714201b5bfc49423ab63e668a4568f6de745650ce14385d55e3260de6403" ) } ( blake2b_256: SafeHash "80360ae48d91ccde85ad6175395ed88a9a456a052dd50577395ed49000f90fbf" ) , isValid = IsValid True , auxiliaryData = SJust ( AuxiliaryDataConstr AlonzoTxAuxDataRaw { atadrMetadata = fromList [ ( 1 , S "string" ) , ( 2 , B "bytes" ) , ( 3 , List [ I 1 , I 2 ] ) , ( 4 , Map [ ( I 3 , B "b" ) ] ) ] , atadrTimelock = StrictSeq { fromStrict = fromList [ TimelockConstr AllOf ( StrictSeq { fromStrict = fromList [] } ) ( blake2b_256: SafeHash "898071af99074b7870088f538bc504295f218f0685f34988f065afe85c339978" ) ] } , atadrPlutus = fromList [ ( PlutusV1 , "RQEAACJh" :| [] ) ] } ( blake2b_256: SafeHash "4d5237e1601e3d0ceeda753ef90f94c09309c18da21eca29fd660c3488f30be9" ) ) } ] } , txSeqBodyBytes = "\x81±\x0\x81\x82X î\x15ZÎ\x9c@) tËjÿ\x8c\x9cÍÒsÈ\x16Hÿ\x11Iï6¼ên»\x8a>%\x0\xd\x81\x82X »0¤,\x1ebð¯Ú_ N\x8aV/z\x13¢Lê\x0î\x81\x91{\x86¸\x9e\x80\x13\x14ª\x1\x12\x81\x82X î\x15ZÎ\x9c@) tËjÿ\x8c\x9cÍÒsÈ\x16Hÿ\x11Iï6¼ên»\x8a>%\x3\x1\x81¤\x0X9\x0Ë\x93XR\x9dôr\x9c2F¢ 3Ë\x98!«¿Ñmä\x88\x80\x5\x90J¼A\xdjW~\x94A\xad\x8eÙf91\x90nMCìèø,q+\x1d\x25¯û\x6\x1\x82\x18d¡X\x1c¦FGK\x8fT1&\x15\x6¶ÂsÓ\x7ÇV\x9aN¶ÉkBÝJ)R ¡JcouttsCoin\x19\x3è\x2\x82\x1Ø\x18B\x18¿\x3Ø\x18K\x82\x2HG\x1\x0\x0""\x0\x11\x10\x82X9\x0Ë\x93XR\x9dôr\x9c2F¢ 3Ë\x98!«¿Ñmä\x88\x80\x5\x90J¼A\xdjW~\x94A\xad\x8eÙf91\x90nMCìèø,q+\x1d\x25¯û\x6\x1a\x0\x84_í\x11\x1a\x0\x84_í\x2\x19\x3ç\x3\x4\x4Ù\x1\x2\x81\x8a\x3X\x1c\xdjW~\x94A\xad\x8eÙf91\x90nMCìèø,q+\x1d\x25¯û\x6X Åâ\x1a±Éö\x2-\x81ò^46Ë\x7f\x1d÷\x7f\x96R®>\x13\x10Â\x8eb\x1dØ{L\x1\x5Ø\x1e\x82\x1 X\x1dà\xdjW~\x94A\xad\x8eÙf91\x90nMCìèø,q+\x1d\x25¯û\x6\x81X\x1c\xdjW~\x94A\xad\x8eÙf91\x90nMCìèø,q+\x1d\x25¯û\x6\x80\x82nconsensus.poolB{}\x5¡X\x1dà\xdjW~\x94A\xad\x8eÙf91\x90nMCìèø,q+\x1d\x25¯û\x6\x18d\x8\x2\xe\x81X\x1cø\x1cæn\xfRÚ\¤\x81\x938nu\x11ýå°0£\x7´Ãh\x176Æð\x9¡X\x1c±kVõì\x6Kæ¬<«`5ï®\x86³fÌ=Ä Õq`=på¡JcouttsCoin\x19\x3è\xbX \x9e\x11\x99©\x88ºrÿÖéÂiÊÛ;Sµó`ÿ\x99ñ\x12Ù²î0Ä×JØ\x8b\x7X \x9e\x11\x99©\x88ºrÿÖéÂiÊÛ;Sµó`ÿ\x99ñ\x12Ù²î0Ä×JØ\x8b\xf\x1\x15\x1b\x0\x0\x0Éüß\x2 " , txSeqWitsBytes = "\x81¤\x0\x81\x82X ;j'¼Î¶¤-b£¨Ð*o\xdse2\x15w\x1dâC¦:ÀH¡\x8bYÚ)X@\x81Â/¯L«ï¨ìÏ\x88q?\x13\x3è(\x9e\x83@È\x9c\x9f-µÌÄ\x11µ}©\x14:a6\x99aÛ%á\x8fø\x93ôÉ\xc,\x17@D\x12*\x15²âä\x8bû\x1+]T\x83\x4\x3\x81HG\x1\x0\x0""\x0\x11\x4\x81\x18¿\x5\x81\x84\x0\x0\x19\x3\x97\x82\x19\x13\x88\x19\x13\x88" , txSeqMetadataBytes = "¡\x0Ù\x1\x3£\x0¤\x1fstring\x2Ebytes\x3\x82\x1\x2\x4¡\x3Ab\x1\x81\x82\x1\x80\x2\x81FE\x1\x0\x0"a" , txSeqIsValidBytes = "\x80" } ) "\x85\x82\x8a\x3\x9X »0¤,\x1ebð¯Ú_ N\x8aV/z\x13¢Lê\x0î\x81\x91{\x86¸\x9e\x80\x13\x14ªX \x8a\x88ãÝt\x9ñ\x95ýRÛ-<º]rÊg\x9¿\x1d\x94\x12\x1bót\x88\x1´\xfo\X \x8a\x88ãÝt\x9ñ\x95ýRÛ-<º]rÊg\x9¿\x1d\x94\x12\x1bót\x88\x1´\xfo\\x82X@OïÇÇ\x18i;WÈqpκ"\x3\x82¯½ÑHÀ¥;J\x0\x9c¦:Ññ\x1H:apÈ:wò=6*hܵ\x2\x80-÷ù\x8f¤÷§\x8b@\x82²\x11S\xe\x1240XP÷pöv\x9aé\x87\x1dB¹pübT»\x92|!\x81ÿôX\x97òA½r"\x1d\x86Ó<\x8döL <\x8c»\x9a¥/ï\x19\x1dr\x2F\Rß\x8d3rz8ÇÜ]@\x86Mu3H£@ø¯Ë³»\x5Ô ?\x16±\x8\xd\x19\x9)X bø\x19:«v²\x4\x8d\x91\x85+\x85®Ôc$9£0:áHù¥Ãu\x0cVæ\x87\x84X Ò\x98Ú8\x3ë\x99Xð\x1c\x2ç?$\x10òù».ËÃFRk\x1bvw.\x1bÝ}µ\x0\x0X@\x94\xf\x8a6\x96\x84~J#\x87\x5½Òz4P\x86( g¹¼\·¶\x98GÊ\x87V\x8XDÕvõ\x9a°VÁi¥\x42\xcÁê´Á\x1fÕ)H+K¼\x8d«(rì+=ùá\x13\xadÚëÑV¿ÆOßÇ2aM*íÑ X£I\x93·°\x8c\x82*óªa[k»\x9b&{É\x2äñ\x7^\x19Jí\x8L¡\x8f\x8bÍᦰ\x94¿?R\x95 ÔTÀ \x83í[t÷\x9/À§4l\x3\x97\x9a0îêvÖ\x86å\x12ºHÒ\x15Dº\x87H\x86ÍÑfËòu±\x1f\x1f8\x81ôÄ'|\x9¢K\x88üahôW\x82g½ÉÖ,¹·\x8b\x8dü\x88\x8cÌâ&¡wr_9çÕ\x90U(aÑè\x8bx\x98\x97\x1cx\xd÷s2\x1b¡\x85D"µÎÎ\xad}Pçw\x83\x5\xeêâÍ\x95\x95¹Í\x91h\x1cråÕ;·Ñ/(Þɲ\x84~ç =w\x81û\x113®£±iõ6ÿYEì v\x95\xeQ¾ÞÐb{·\x81 az/\x8Bå\xe9\x81±\x0\x81\x82X î\x15ZÎ\x9c@) tËjÿ\x8c\x9cÍÒsÈ\x16Hÿ\x11Iï6¼ên»\x8a>%\x0\xd\x81\x82X »0¤,\x1ebð¯Ú_ N\x8aV/z\x13¢Lê\x0î\x81\x91{\x86¸\x9e\x80\x13\x14ª\x1\x12\x81\x82X î\x15ZÎ\x9c@) tËjÿ\x8c\x9cÍÒsÈ\x16Hÿ\x11Iï6¼ên»\x8a>%\x3\x1\x81¤\x0X9\x0Ë\x93XR\x9dôr\x9c2F¢ 3Ë\x98!«¿Ñmä\x88\x80\x5\x90J¼A\xdjW~\x94A\xad\x8eÙf91\x90nMCìèø,q+\x1d\x25¯û\x6\x1\x82\x18d¡X\x1c¦FGK\x8fT1&\x15\x6¶ÂsÓ\x7ÇV\x9aN¶ÉkBÝJ)R ¡JcouttsCoin\x19\x3è\x2\x82\x1Ø\x18B\x18¿\x3Ø\x18K\x82\x2HG\x1\x0\x0""\x0\x11\x10\x82X9\x0Ë\x93XR\x9dôr\x9c2F¢ 3Ë\x98!«¿Ñmä\x88\x80\x5\x90J¼A\xdjW~\x94A\xad\x8eÙf91\x90nMCìèø,q+\x1d\x25¯û\x6\x1a\x0\x84_í\x11\x1a\x0\x84_í\x2\x19\x3ç\x3\x4\x4Ù\x1\x2\x81\x8a\x3X\x1c\xdjW~\x94A\xad\x8eÙf91\x90nMCìèø,q+\x1d\x25¯û\x6X Åâ\x1a±Éö\x2-\x81ò^46Ë\x7f\x1d÷\x7f\x96R®>\x13\x10Â\x8eb\x1dØ{L\x1\x5Ø\x1e\x82\x1 X\x1dà\xdjW~\x94A\xad\x8eÙf91\x90nMCìèø,q+\x1d\x25¯û\x6\x81X\x1c\xdjW~\x94A\xad\x8eÙf91\x90nMCìèø,q+\x1d\x25¯û\x6\x80\x82nconsensus.poolB{}\x5¡X\x1dà\xdjW~\x94A\xad\x8eÙf91\x90nMCìèø,q+\x1d\x25¯û\x6\x18d\x8\x2\xe\x81X\x1cø\x1cæn\xfRÚ\¤\x81\x938nu\x11ýå°0£\x7´Ãh\x176Æð\x9¡X\x1c±kVõì\x6Kæ¬<«`5ï®\x86³fÌ=Ä Õq`=på¡JcouttsCoin\x19\x3è\xbX \x9e\x11\x99©\x88ºrÿÖéÂiÊÛ;Sµó`ÿ\x99ñ\x12Ù²î0Ä×JØ\x8b\x7X \x9e\x11\x99©\x88ºrÿÖéÂiÊÛ;Sµó`ÿ\x99ñ\x12Ù²î0Ä×JØ\x8b\xf\x1\x15\x1b\x0\x0\x0Éüß\x2 \x81¤\x0\x81\x82X ;j'¼Î¶¤-b£¨Ð*o\xdse2\x15w\x1dâC¦:ÀH¡\x8bYÚ)X@\x81Â/¯L«ï¨ìÏ\x88q?\x13\x3è(\x9e\x83@È\x9c\x9f-µÌÄ\x11µ}©\x14:a6\x99aÛ%á\x8fø\x93ôÉ\xc,\x17@D\x12*\x15²âä\x8bû\x1+]T\x83\x4\x3\x81HG\x1\x0\x0""\x0\x11\x4\x81\x18¿\x5\x81\x84\x0\x0\x19\x3\x97\x82\x19\x13\x88\x19\x13\x88¡\x0Ù\x1\x3£\x0¤\x1fstring\x2Ebytes\x3\x82\x1\x2\x4¡\x3Ab\x1\x81\x82\x1\x80\x2\x81FE\x1\x0\x0"a\x80" , shelleyBlockHeaderHash = ShelleyHash { unShelleyHash = "60cfa796a4b94df632d2bcbee178fb65aa6dc2bfb1d0872726c34ae8d7be3204" } } ) ) ) ) ) ) ) ) } /= HardForkBlock { getHardForkBlock = S ( S ( S ( S ( S ( S ( Z ( I ( ShelleyBlock { shelleyBlockRaw = Block' ( HeaderConstr { headerRaw = HeaderRaw { headerRawBody = HeaderBody { hbBlockNo = BlockNo 3 , hbSlotNo = SlotNo 9 , hbPrev = BlockHash ( HashHeader { unHashHeader = "bb30a42c1e62f0afda5f0a4e8a562f7a13a24cea00ee81917b86b89e801314aa" } ) , hbVk = VKey ( VerKeyEd25519DSIGN "8a88e3dd7409f195fd52db2d3cba5d72ca6709bf1d94121bf3748801b40f6f5c" ) , hbVrfVk = VerKeyPraosVRF "\x8a\x88ãÝt\x9ñ\x95ýRÛ-<º]rÊg\x9¿\x1d\x94\x12\x1bót\x88\x1´\xfo\" , hbVrfRes = CertifiedVRF { certifiedOutput = OutputVRF { getOutputVRFBytes = "OïÇÇ\x18i;WÈqpκ"\x3\x82¯½ÑHÀ¥;J\x0\x9c¦:Ññ\x1H:apÈ:wò=6*hܵ\x2\x80-÷ù\x8f¤÷§\x8b@\x82²\x11S\xe\x1240" } , certifiedProof = CertPraosVRF "÷pöv\x9aé\x87\x1dB¹pübT»\x92|!\x81ÿôX\x97òA½r"\x1d\x86Ó<\x8döL <\x8c»\x9a¥/ï\x19\x1dr\x2F\Rß\x8d3rz8ÇÜ]@\x86Mu3H£@ø¯Ë³»\x5Ô ?\x16±\x8\xd" } , hbBodySize = 2345 , hbBodyHash = "62f8193aab76b2048d91852b85aed4632439a3303ae148f9a5c375006356e687" , hbOCert = OCert { ocertVkHot = VerKeySumKES "d298da3803eb9958f01c02e73f2410f2f9bb2ecbc346526b1b76772e1bdd7db5" , ocertN = 0 , ocertKESPeriod = KESPeriod 0 , ocertSigma = SignedDSIGN ( SigEd25519DSIGN "940f8a3696847e4a238705bdd27a345086282067b9bc5cb7b69847ca8756085844d576f59ab056c169a504320cc1eab4c11fd529482b3c57da6fa96d44635b08" ) } , hbProtVer = ProtVer { pvMajor = Version 2 , pvMinor = 0 } } , headerRawSig = SignedKES { getSig = SigSumKES ( SigSumKES ( SigSumKES ( SigSumKES ( SigSumKES ( SigSumKES ( SigSingleKES ( SigEd25519DSIGN "83473ded4325b19fe50adf277be2ba7b40db30040e6c7566479e873d6aee25e7b44df5006c1242331f658841e9386ef32cc0086ca5e0819338e3e5d9c2e16208" ) ) ( VerKeySingleKES ( VerKeyEd25519DSIGN "cc6a5ab5c9b40f817c715df558af7d07b6186f0ccf31715ec2fb00980730ac16" ) ) ( VerKeySingleKES ( VerKeyEd25519DSIGN "6af657e6670608afe1bf651d496e01b1c7ff1eb44614d8cfd1b7e32b2c293934" ) ) ) ( VerKeySumKES "9236cc0ada145d8d8d7ad919ef1e60c8bbad31dbedf9f395849705a00c14a878" ) ( VerKeySumKES "5106aae31f55abc5b1f2089cbef16d9401f158704c1e4f740f7125cfc700a99d" ) ) ( VerKeySumKES "97d0332eacb33e4bbc8dab2872ec2b3df9e113addaebd156bfc64fdfc732614d" ) ( VerKeySumKES "2aedd10a58a34993b7b08c822af3aa615b6bbb9b267bc902e4f1075e194aed08" ) ) ( VerKeySumKES "4ca18f8bcde1a6b094bf3f5295a0d454c0a083ed5b74f7092fc0a7346c03979a" ) ( VerKeySumKES "30eeea76d686e512ba48d21544ba874886cdd166cbf275b11f1f3881f4c4277c" ) ) ( VerKeySumKES "09a24b88fc6168f4578267bdc9d62cb9b78b8dfc888ccce226a177725f39e7d5" ) ( VerKeySumKES "0930552861d1e88b7898971c780dc3b773321ba1854422b5cecead7d50e77783" ) ) ( VerKeySumKES "050eeae2cd9595b9cd91681c72e5d53bb7d12f28dec9b2847ee70a3d7781fb11" ) ( VerKeySumKES "33aea3b169f536ff5945ec0a76950e51beded0627bb78120617a2f0842e50e39" ) } } , headerBytes = "" } ) ( TxSeq' { txSeqTxns = StrictSeq { fromStrict = fromList [ AlonzoTx { body = TxBodyConstr ConwayTxBodyRaw { ctbrSpendInputs = fromList [ TxIn ( TxId { unTxId = SafeHash "ee155ace9c40292074cb6aff8c9ccdd273c81648ff1149ef36bcea6ebb8a3e25" } ) ( TxIx 0 ) ] , ctbrCollateralInputs = fromList [ TxIn ( TxId { unTxId = SafeHash "bb30a42c1e62f0afda5f0a4e8a562f7a13a24cea00ee81917b86b89e801314aa" } ) ( TxIx 1 ) ] , ctbrReferenceInputs = fromList [ TxIn ( TxId { unTxId = SafeHash "ee155ace9c40292074cb6aff8c9ccdd273c81648ff1149ef36bcea6ebb8a3e25" } ) ( TxIx 3 ) ] , ctbrOutputs = StrictSeq { fromStrict = fromList [ Sized { sizedValue = ( Addr Testnet ( KeyHashObj ( KeyHash "cb9358529df4729c3246a2a033cb9821abbfd16de4888005904abc41" ) ) ( StakeRefBase ( KeyHashObj ( KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" ) ) ) , MaryValue 100 ( MultiAsset ( fromList [ ( PolicyID { policyID = ScriptHash "a646474b8f5431261506b6c273d307c7569a4eb6c96b42dd4a29520a" } , fromList [ ( "636f75747473436f696e" , 1000 ) ] ) ] ) ) , Datum "\x18¿" , SJust PlutusScript PlutusV2 ScriptHash "f3fbfa47030ad28189ae30b6218704ebe707f3035e5526e5a391df4d" ) , sizedSize = 0 } ] } , ctbrCollateralReturn = SJust ( Sized { sizedValue = ( Addr Testnet ( KeyHashObj ( KeyHash "cb9358529df4729c3246a2a033cb9821abbfd16de4888005904abc41" ) ) ( StakeRefBase ( KeyHashObj ( KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" ) ) ) , MaryValue 8675309 ( MultiAsset ( fromList [] ) ) , NoDatum , SNothing ) , sizedSize = 0 } ) , ctbrTotalCollateral = SJust ( Coin 8675309 ) , ctbrCerts = OSet { osSSeq = StrictSeq { fromStrict = fromList [ ConwayTxCertPool ( RegPool ( PoolParams { ppId = KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" , ppVrf = "c5e21ab1c9f6022d81c3b25e3436cb7f1df77f9652ae3e1310c28e621dd87b4c" , ppPledge = Coin 1 , ppCost = Coin 5 , ppMargin = 1 % 10 , ppRewardAcnt = RewardAcnt { getRwdNetwork = Testnet , getRwdCred = KeyHashObj ( KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" ) } , ppOwners = fromList [ KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" ] , ppRelays = StrictSeq { fromStrict = fromList [] } , ppMetadata = SJust ( PoolMetadata { pmUrl = Url { urlToText = "consensus.pool" } , pmHash = "{}" } ) } ) ) ] } , osSet = fromList [ ConwayTxCertPool ( RegPool ( PoolParams { ppId = KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" , ppVrf = "c5e21ab1c9f6022d81c3b25e3436cb7f1df77f9652ae3e1310c28e621dd87b4c" , ppPledge = Coin 1 , ppCost = Coin 5 , ppMargin = 1 % 10 , ppRewardAcnt = RewardAcnt { getRwdNetwork = Testnet , getRwdCred = KeyHashObj ( KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" ) } , ppOwners = fromList [ KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" ] , ppRelays = StrictSeq { fromStrict = fromList [] } , ppMetadata = SJust ( PoolMetadata { pmUrl = Url { urlToText = "consensus.pool" } , pmHash = "{}" } ) } ) ) ] } , ctbrWithdrawals = Withdrawals { unWithdrawals = fromList [ ( RewardAcnt { getRwdNetwork = Testnet , getRwdCred = KeyHashObj ( KeyHash "0d6a577e9441ad8ed9663931906e4d43ece8f82c712b1d0235affb06" ) } , Coin 100 ) ] } , ctbrTxfee = Coin 999 , ctbrVldt = ValidityInterval { invalidBefore = SJust ( SlotNo 2 ) , invalidHereafter = SJust ( SlotNo 4 ) } , ctbrReqSignerHashes = fromList [ KeyHash "f81ce66e0f52da5ca48193386e7511fde5b030a307b4c3681736c6f0" ] , ctbrMint = MultiAsset ( fromList [ ( PolicyID { policyID = ScriptHash "b16b56f5ec064be6ac3cab6035efae86b366cc3dc4a0d571603d70e5" } , fromList [ ( "636f75747473436f696e" , 1000 ) ] ) ] ) , ctbrScriptIntegrityHash = SJust ( SafeHash "9e1199a988ba72ffd6e9c269cadb3b53b5f360ff99f112d9b2ee30c4d74ad88b" ) , ctbrAuxDataHash = SJust ( AuxiliaryDataHash { unsafeAuxiliaryDataHash = SafeHash "9e1199a988ba72ffd6e9c269cadb3b53b5f360ff99f112d9b2ee30c4d74ad88b" } ) , ctbrTxNetworkId = SJust Mainnet , ctbrVotingProcedures = VotingProcedures { unVotingProcedures = fromList [] } , ctbrProposalProcedures = OSet { osSSeq = StrictSeq { fromStrict = fromList [] } , osSet = fromList [] } , ctbrCurrentTreasuryValue = SJust ( Coin 867530900000 ) , ctbrTreasuryDonation = Coin 0 } ( blake2b_256: SafeHash "0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8" ) , wits = AlonzoTxWitsRaw { atwrAddrTxWits = fromList [ WitVKeyInternal { wvkKey = VKey ( VerKeyEd25519DSIGN "3b6a27bcceb6a42d62a3a8d02a6f0d73653215771de243a63ac048a18b59da29" ) , wvkSig = SignedDSIGN ( SigEd25519DSIGN "81c22faf4cabefa8eccf88713f1303e8289e8340c89c9f2db5ccc411b57da9143a61369961db25e18ff893f4c90c2c174044122a15b2e2e48bfb012b5d548304" ) , wvkKeyHash = KeyHash "cb9358529df4729c3246a2a033cb9821abbfd16de4888005904abc41" , wvkBytes = "" } ] , atwrBootAddrTxWits = fromList [] , atwrScriptTxWits = fromList [ ( ScriptHash "58503a1d89a21fc9fc53d6a7cccef47341175a8f47636f57ccbdca2d" , PlutusScript PlutusV1 ScriptHash "58503a1d89a21fc9fc53d6a7cccef47341175a8f47636f57ccbdca2d" ) ] , atwrDatsTxWits = TxDatsConstr TxDatsRaw ( fromList [ ( SafeHash "0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8" , DataConstr I 191 ( blake2b_256: SafeHash "0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8" ) ) ] ) ( blake2b_256: SafeHash "0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8" ) , atwrRdmrsTxWits = RedeemersConstr RedeemersRaw ( fromList [ ( RdmrPtr Spend 0 , ( DataConstr I 919 ( blake2b_256: SafeHash "0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8" ) , WrapExUnits { unWrapExUnits = ExUnits' { exUnitsMem' = 5000 , exUnitsSteps' = 5000 } } ) ) ] ) ( blake2b_256: SafeHash "0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8" ) } ( blake2b_256: SafeHash "0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8" ) , isValid = IsValid True , auxiliaryData = SJust ( AuxiliaryDataConstr AlonzoTxAuxDataRaw { atadrMetadata = fromList [ ( 1 , S "string" ) , ( 2 , B "bytes" ) , ( 3 , List [ I 1 , I 2 ] ) , ( 4 , Map [ ( I 3 , B "b" ) ] ) ] , atadrTimelock = StrictSeq { fromStrict = fromList [ TimelockConstr AllOf ( StrictSeq { fromStrict = fromList [] } ) ( blake2b_256: SafeHash "0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8" ) ] } , atadrPlutus = fromList [ ( PlutusV1 , "RQEAACJh" :| [] ) ] } ( blake2b_256: SafeHash "0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8" ) ) } ] } , txSeqBodyBytes = "" , txSeqWitsBytes = "" , txSeqMetadataBytes = "" , txSeqIsValidBytes = "" } ) "" , shelleyBlockHeaderHash = ShelleyHash { unShelleyHash = "0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8" } } ) ) ) ) ) ) ) ) } ```
dnadales commented 10 months ago

These fields are also empty when encoded via FlatTerm:

                                                          , txSeqBodyBytes = ""
                                                          , txSeqWitsBytes = ""
                                                          , txSeqMetadataBytes = ""
                                                          , txSeqIsValidBytes = ""
dnadales commented 10 months ago

The decoding via FlatTerm seems to be tripping on lazy bytestrings.

dnadales commented 10 months ago

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 = ""}