Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions cardano-api/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog for cardano-api

## 10.16.4.0

- The current canonicalisation functionality does not canonicalise CBOR maps in CBOR lists
(bugfix)
[PR 1056](https://github.com/IntersectMBO/cardano-api/pull/1056)

## 10.16.3.0

- Add `IsShelleyBasedEra` constraint to `EraCommonConstraints`
Expand Down
2 changes: 1 addition & 1 deletion cardano-api/cardano-api.cabal
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
cabal-version: 3.8
name: cardano-api
version: 10.16.3.0
version: 10.16.4.0
synopsis: The cardano API
description: The cardano API.
category:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,9 @@ canonicaliseTerm = \case
(TTagged tag term) ->
TTagged tag $ canonicaliseTerm term
(TListI terms) ->
TList terms
TList $ map canonicaliseTerm terms
(TList terms) ->
TList $ map canonicaliseTerm terms
term -> term

-- | Implements sorting of CBOR terms for canonicalisation. CBOR terms are compared by lexical order of their
Expand Down
23 changes: 18 additions & 5 deletions cardano-api/test/cardano-api-test/Test/Cardano/Api/CBOR.hs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import Data.List (sortOn)
import Data.Proxy (Proxy (..))
import Data.Text (Text)
import Data.Text qualified as T
import GHC.Stack (callStack)

import Test.Gen.Cardano.Api.Hardcoded
import Test.Gen.Cardano.Api.Typed
Expand Down Expand Up @@ -368,15 +369,27 @@ prop_canonicalise_cbor = property $ do
, (TBytes "bb", TString "h")
, (TBytes "ba", TListI [TString "i", TString "j"])
]
inputMapBs = CBOR.serialize' inputMap
inputMapTerm <- decodeExampleTerm inputMapBs
inputMapInIndefiniteList = TListI [inputMap]
inputMapInDefiniteList = TList [inputMap]

inputMapCanonicalisedBs <- H.leftFail $ canonicaliseCborBs inputMapBs
input <- forAll $ Gen.element [inputMap, inputMapInIndefiniteList, inputMapInDefiniteList]
let inputBs = CBOR.serialize' input

inputMapCanonicalisedTerm@(TMap elemTerms) <- decodeExampleTerm inputMapCanonicalisedBs
inputTerm <- decodeExampleTerm inputBs

inputCanonicalisedBs <- H.leftFail $ canonicaliseCborBs inputBs

decodedTerm <- decodeExampleTerm inputCanonicalisedBs
inputMapCanonicalisedTerm@(TMap elemTerms) <-
case decodedTerm of
TMap elemTerms -> pure $ TMap elemTerms
TList [TMap elemTerms] -> pure $ TMap elemTerms
t ->
H.failMessage callStack $
"Expected canonicalised term to be a map or a list with a single map: " <> show t

H.annotate "sanity check that cbor round trip does not change the order"
inputMap === inputMapTerm
input === inputTerm

H.annotate "Print bytes hex representation of the keys in the map"
H.annotateShow
Expand Down