Skip to content

Commit f4364d7

Browse files
authored
fix(ledger): block encoding nil lists (#1558)
Signed-off-by: Chris Gianelloni <wolf31o2@blinklabs.io>
1 parent 5b24c45 commit f4364d7

File tree

6 files changed

+97
-10
lines changed

6 files changed

+97
-10
lines changed

ledger/allegra/allegra.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,27 @@ func (b *AllegraBlock) UnmarshalCBOR(cborData []byte) error {
7676
return nil
7777
}
7878

79+
func (b *AllegraBlock) MarshalCBOR() ([]byte, error) {
80+
if b.Cbor() != nil {
81+
return b.Cbor(), nil
82+
}
83+
// Ensure nil slices encode as empty arrays, not CBOR null
84+
txBodies := b.TransactionBodies
85+
if txBodies == nil {
86+
txBodies = []AllegraTransactionBody{}
87+
}
88+
txWitnesses := b.TransactionWitnessSets
89+
if txWitnesses == nil {
90+
txWitnesses = []shelley.ShelleyTransactionWitnessSet{}
91+
}
92+
return cbor.Encode([]any{
93+
b.BlockHeader,
94+
txBodies,
95+
txWitnesses,
96+
b.TransactionMetadataSet,
97+
})
98+
}
99+
79100
func (AllegraBlock) Type() int {
80101
return BlockTypeAllegra
81102
}

ledger/alonzo/alonzo.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,16 @@ func (b *AlonzoBlock) MarshalCBOR() ([]byte, error) {
102102
InvalidTransactions cbor.IndefLengthList
103103
}
104104

105+
// Ensure nil slices encode as empty arrays, not CBOR null
106+
txBodies := b.TransactionBodies
107+
if txBodies == nil {
108+
txBodies = []AlonzoTransactionBody{}
109+
}
110+
txWitnesses := b.TransactionWitnessSets
111+
if txWitnesses == nil {
112+
txWitnesses = []AlonzoTransactionWitnessSet{}
113+
}
114+
105115
// Convert InvalidTransactions to IndefLengthList
106116
var invalidTx cbor.IndefLengthList
107117
if b.InvalidTransactions != nil {
@@ -113,8 +123,8 @@ func (b *AlonzoBlock) MarshalCBOR() ([]byte, error) {
113123

114124
temp := tmpBlock{
115125
BlockHeader: b.BlockHeader,
116-
TransactionBodies: b.TransactionBodies,
117-
TransactionWitnessSets: b.TransactionWitnessSets,
126+
TransactionBodies: txBodies,
127+
TransactionWitnessSets: txWitnesses,
118128
TransactionMetadataSet: b.TransactionMetadataSet,
119129
InvalidTransactions: invalidTx,
120130
}

ledger/babbage/babbage.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,16 +138,27 @@ func (b *BabbageBlock) MarshalCBOR() ([]byte, error) {
138138
return b.Cbor(), nil
139139
}
140140

141-
// Ensure InvalidTransactions is encoded as empty array if nil
141+
// Ensure nil slices are encoded as empty CBOR arrays (0x80)
142+
// rather than CBOR null (0xF6). The Cardano CDDL requires
143+
// arrays for transaction_bodies, transaction_witness_sets,
144+
// and invalid_transactions.
145+
txBodies := b.TransactionBodies
146+
if txBodies == nil {
147+
txBodies = []BabbageTransactionBody{}
148+
}
149+
txWitnesses := b.TransactionWitnessSets
150+
if txWitnesses == nil {
151+
txWitnesses = []BabbageTransactionWitnessSet{}
152+
}
142153
invalidTxs := b.InvalidTransactions
143154
if invalidTxs == nil {
144155
invalidTxs = []uint{}
145156
}
146157

147158
return cbor.Encode([]any{
148159
b.BlockHeader,
149-
b.TransactionBodies,
150-
b.TransactionWitnessSets,
160+
txBodies,
161+
txWitnesses,
151162
b.TransactionMetadataSet,
152163
invalidTxs,
153164
})

ledger/conway/conway.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,16 +139,27 @@ func (b *ConwayBlock) MarshalCBOR() ([]byte, error) {
139139
return b.Cbor(), nil
140140
}
141141

142-
// Ensure InvalidTransactions is encoded as empty array if nil
142+
// Ensure nil slices are encoded as empty CBOR arrays (0x80)
143+
// rather than CBOR null (0xF6). The Cardano CDDL requires
144+
// arrays for transaction_bodies, transaction_witness_sets,
145+
// and invalid_transactions.
146+
txBodies := b.TransactionBodies
147+
if txBodies == nil {
148+
txBodies = []ConwayTransactionBody{}
149+
}
150+
txWitnesses := b.TransactionWitnessSets
151+
if txWitnesses == nil {
152+
txWitnesses = []ConwayTransactionWitnessSet{}
153+
}
143154
invalidTxs := b.InvalidTransactions
144155
if invalidTxs == nil {
145156
invalidTxs = []uint{}
146157
}
147158

148159
return cbor.Encode([]any{
149160
b.BlockHeader,
150-
b.TransactionBodies,
151-
b.TransactionWitnessSets,
161+
txBodies,
162+
txWitnesses,
152163
b.TransactionMetadataSet,
153164
invalidTxs,
154165
})

ledger/mary/mary.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,21 @@ func (b *MaryBlock) MarshalCBOR() ([]byte, error) {
8585
if b.Cbor() != nil {
8686
return b.Cbor(), nil
8787
}
88-
// Otherwise, encode generically
89-
return cbor.EncodeGeneric(b)
88+
// Ensure nil slices encode as empty arrays, not CBOR null
89+
txBodies := b.TransactionBodies
90+
if txBodies == nil {
91+
txBodies = []MaryTransactionBody{}
92+
}
93+
txWitnesses := b.TransactionWitnessSets
94+
if txWitnesses == nil {
95+
txWitnesses = []shelley.ShelleyTransactionWitnessSet{}
96+
}
97+
return cbor.Encode([]any{
98+
b.BlockHeader,
99+
txBodies,
100+
txWitnesses,
101+
b.TransactionMetadataSet,
102+
})
90103
}
91104

92105
func (MaryBlock) Type() int {

ledger/shelley/shelley.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,27 @@ func (b *ShelleyBlock) UnmarshalCBOR(cborData []byte) error {
8383
return nil
8484
}
8585

86+
func (b *ShelleyBlock) MarshalCBOR() ([]byte, error) {
87+
if b.Cbor() != nil {
88+
return b.Cbor(), nil
89+
}
90+
// Ensure nil slices encode as empty arrays, not CBOR null
91+
txBodies := b.TransactionBodies
92+
if txBodies == nil {
93+
txBodies = []ShelleyTransactionBody{}
94+
}
95+
txWitnesses := b.TransactionWitnessSets
96+
if txWitnesses == nil {
97+
txWitnesses = []ShelleyTransactionWitnessSet{}
98+
}
99+
return cbor.Encode([]any{
100+
b.BlockHeader,
101+
txBodies,
102+
txWitnesses,
103+
b.TransactionMetadataSet,
104+
})
105+
}
106+
86107
func (ShelleyBlock) Type() int {
87108
return BlockTypeShelley
88109
}

0 commit comments

Comments
 (0)