Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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
9 changes: 7 additions & 2 deletions broadcastclient/broadcastclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,7 @@ func (bc *BroadcastClient) startBackgroundReader(earlyFrameData io.Reader) {
}
if res.Version == 1 {
if len(res.Messages) > 0 {
isValidSignature := true
for _, message := range res.Messages {
if message == nil {
log.Warn("ignoring nil feed message")
Expand All @@ -471,12 +472,16 @@ func (bc *BroadcastClient) startBackgroundReader(earlyFrameData io.Reader) {
err := bc.isValidSignature(ctx, message)
if err != nil {
log.Error("error validating feed signature", "error", err, "sequence number", message.SequenceNumber)
bc.fatalErrChan <- fmt.Errorf("error validating feed signature %v: %w", message.SequenceNumber, err)
continue
isValidSignature = false
break
}

bc.nextSeqNum = message.SequenceNumber + 1
}
if !isValidSignature {
log.Error("error validating one or more feed signatures, skipping the message")
continue
}
if err := bc.txStreamer.AddBroadcastMessages(res.Messages); err != nil {
if errors.Is(err, TransactionStreamerBlockCreationStopped) {
log.Info("stopping block creation in broadcast client because transaction streamer has stopped")
Expand Down
72 changes: 0 additions & 72 deletions broadcastclient/broadcastclient_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ package broadcastclient

import (
"context"
"crypto/ecdsa"
"errors"
"fmt"
"net"
Expand Down Expand Up @@ -101,77 +100,6 @@ func testReceiveMessages(t *testing.T, clientCompression bool, serverCompression

}

func TestInvalidSignature(t *testing.T) {
t.Parallel()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()

settings := wsbroadcastserver.DefaultTestBroadcasterConfig

messageCount := 1
chainId := uint64(9742)

privateKey, err := crypto.GenerateKey()
Require(t, err)
dataSigner := signature.DataSignerFromPrivateKey(privateKey)

fatalErrChan := make(chan error, 10)
b := broadcaster.NewBroadcaster(func() *wsbroadcastserver.BroadcasterConfig { return &settings }, chainId, fatalErrChan, dataSigner)

Require(t, b.Initialize())
Require(t, b.Start(ctx))
defer b.StopAndWait()

badPrivateKey, err := crypto.GenerateKey()
Require(t, err)
badPublicKey := badPrivateKey.Public()
badECDSA, ok := badPublicKey.(*ecdsa.PublicKey)
if !ok {
t.Fatal("badPublicKey is not an ecdsa.PublicKey")
}
badSequencerAddr := crypto.PubkeyToAddress(*badECDSA)
config := DefaultTestConfig

ts := NewDummyTransactionStreamer(chainId, &badSequencerAddr)
broadcastClient, err := newTestBroadcastClient(
config,
b.ListenerAddr(),
chainId,
0,
ts,
nil,
fatalErrChan,
&badSequencerAddr,
t,
)
Require(t, err)
broadcastClient.Start(ctx)

go func() {
for i := 0; i < messageCount; i++ {
// #nosec G115
Require(t, b.BroadcastSingle(arbostypes.TestMessageWithMetadataAndRequestId, arbutil.MessageIndex(i), nil, nil))
}
}()

timer := time.NewTimer(2 * time.Second)
select {
case err := <-fatalErrChan:
if errors.Is(err, signature.ErrSignatureNotVerified) {
t.Log("feed error found as expected")
return
}
t.Errorf("unexpected error occurred: %v", err)
return
case <-timer.C:
t.Error("no feed errors detected")
return
case <-ctx.Done():
timer.Stop()
return
}
}

type dummyTransactionStreamer struct {
messageReceiver chan message.BroadcastFeedMessage
chainId uint64
Expand Down
Loading