Skip to content
Merged
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
7 changes: 7 additions & 0 deletions block/internal/syncing/da_retriever.go
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,13 @@ func (r *daRetriever) tryDecodeData(bz []byte, daHeight uint64) *types.Data {
return nil
}

// Reject data without metadata before using accessors (DACommitment,
// Height) that assume it is present.
if signedData.Metadata == nil {
r.logger.Debug().Msg("invalid signed data: missing metadata")
return nil
}

// Mark as DA included
dataHash := signedData.Data.DACommitment().String()
r.cache.SetDataDAIncluded(dataHash, daHeight, signedData.Height())
Expand Down
20 changes: 20 additions & 0 deletions block/internal/syncing/da_retriever_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,26 @@ func TestDARetriever_tryDecodeData_InvalidSignature(t *testing.T) {
assert.Nil(t, r.tryDecodeData(db, 55))
}

func TestDARetriever_tryDecodeData_NilMetadata(t *testing.T) {
addr, pub, signer := buildSyncTestSigner(t)
gen := genesis.Genesis{ChainID: "tchain", InitialHeight: 1, StartTime: time.Now().Add(-time.Second), ProposerAddress: addr}
r := newTestDARetriever(t, nil, config.DefaultConfig(), gen)

// A validly-signed blob whose Data carries no metadata must be rejected,
// not dereferenced: the accessors below (DACommitment, Height) assume
// Metadata is set.
d := &types.Data{Txs: types.Txs{types.Tx([]byte{0x01})}}
payload, err := d.MarshalBinary()
require.NoError(t, err)
sig, err := signer.Sign(t.Context(), payload)
require.NoError(t, err)
sd := &types.SignedData{Data: *d, Signature: sig, Signer: types.Signer{PubKey: pub, Address: addr}}
db, err := sd.MarshalBinary()
require.NoError(t, err)

assert.Nil(t, r.tryDecodeData(db, 99))
}

func TestDARetriever_validateBlobResponse(t *testing.T) {
r := &daRetriever{logger: zerolog.Nop()}
// StatusSuccess -> nil
Expand Down
Loading