Skip to content

Commit 932072f

Browse files
authored
refactor: set custom CBOR decoder options (#114)
Signed-off-by: Aurora Gaffney <[email protected]>
1 parent 045fe57 commit 932072f

File tree

1 file changed

+23
-6
lines changed

1 file changed

+23
-6
lines changed

data/decode.go

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package data
22

33
import (
4+
"bytes"
45
"fmt"
56
"math/big"
67

@@ -28,6 +29,22 @@ func Decode(b []byte) (PlutusData, error) {
2829
return decodeRaw(v)
2930
}
3031

32+
// cborUnmarshal acts like cbor.Unmarshal but allows us to set our own decoder options
33+
func cborUnmarshal(dataBytes []byte, dest any) error {
34+
data := bytes.NewReader(dataBytes)
35+
// Create a custom decoder that returns an error on unknown fields
36+
decOptions := cbor.DecOptions{
37+
// This defaults to 32, but there are blocks in the wild using >64 nested levels
38+
MaxNestedLevels: 256,
39+
}
40+
decMode, err := decOptions.DecMode()
41+
if err != nil {
42+
return err
43+
}
44+
dec := decMode.NewDecoder(data)
45+
return dec.Decode(dest)
46+
}
47+
3148
// decodeCborRaw is an alternative to cbor.Unmarshal() that converts cbor.Tag to Constr
3249
// This is needed because cbor.Tag with a slice as the content (such as in a Constr) is
3350
// not hashable and cannot be used as a map key
@@ -36,7 +53,7 @@ func decodeCborRaw(data []byte) (any, error) {
3653
switch cborType {
3754
case CborTypeByteString:
3855
var tmpData cbor.ByteString
39-
if err := cbor.Unmarshal(data, &tmpData); err != nil {
56+
if err := cborUnmarshal(data, &tmpData); err != nil {
4057
return nil, err
4158
}
4259
return tmpData, nil
@@ -46,14 +63,14 @@ func decodeCborRaw(data []byte) (any, error) {
4663
return decodeCborRawMap(data)
4764
case CborTypeTag:
4865
var tmpTag cbor.RawTag
49-
if err := cbor.Unmarshal(data, &tmpTag); err != nil {
66+
if err := cborUnmarshal(data, &tmpTag); err != nil {
5067
return nil, err
5168
}
5269
return decodeRawTag(tmpTag)
5370
default:
5471
// Decode using default representation
5572
var tmpData any
56-
if err := cbor.Unmarshal(data, &tmpData); err != nil {
73+
if err := cborUnmarshal(data, &tmpData); err != nil {
5774
return nil, err
5875
}
5976
return tmpData, nil
@@ -62,7 +79,7 @@ func decodeCborRaw(data []byte) (any, error) {
6279

6380
func decodeCborRawList(data []byte) (any, error) {
6481
var tmpData []cbor.RawMessage
65-
if err := cbor.Unmarshal(data, &tmpData); err != nil {
82+
if err := cborUnmarshal(data, &tmpData); err != nil {
6683
return nil, err
6784
}
6885
tmpItems := make([]PlutusData, len(tmpData))
@@ -82,7 +99,7 @@ func decodeCborRawList(data []byte) (any, error) {
8299

83100
func decodeCborRawMap(data []byte) (any, error) {
84101
var tmpData map[RawMessageStr]RawMessageStr
85-
if err := cbor.Unmarshal(data, &tmpData); err != nil {
102+
if err := cborUnmarshal(data, &tmpData); err != nil {
86103
return nil, err
87104
}
88105
pairs := make([][2]PlutusData, 0, len(tmpData))
@@ -225,7 +242,7 @@ func decodeRawTag(tag cbor.RawTag) (PlutusData, error) {
225242
Alternative uint64
226243
FieldsRaw cbor.RawMessage
227244
}
228-
if err := cbor.Unmarshal(tag.Content, &tmpData); err != nil {
245+
if err := cborUnmarshal(tag.Content, &tmpData); err != nil {
229246
return nil, err
230247
}
231248
ret, retErr = decodeConstr(tmpData.Alternative, tmpData.FieldsRaw)

0 commit comments

Comments
 (0)