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
10 changes: 5 additions & 5 deletions eth/api_backend_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ func TestRelayMethodWiring(t *testing.T) {

t.Run("all flags enabled", func(t *testing.T) {
t.Parallel()
rs := relay.Init(true, true, true, true, nil)
rs := relay.Init(true, true, true, true, nil, 0, 0)
defer rs.Close()
b := &EthAPIBackend{relay: rs}

Expand All @@ -307,7 +307,7 @@ func TestRelayMethodWiring(t *testing.T) {

t.Run("all flags disabled", func(t *testing.T) {
t.Parallel()
rs := relay.Init(false, false, false, false, nil)
rs := relay.Init(false, false, false, false, nil, 0, 0)
defer rs.Close()
b := &EthAPIBackend{relay: rs}

Expand All @@ -321,7 +321,7 @@ func TestRelayMethodWiring(t *testing.T) {
t.Parallel()
// Init with enablePreconf=true, enablePrivateTx=true but no URLs
// → txRelay created with nil multiclient → methods return errors, proving wiring works
rs := relay.Init(true, true, false, false, nil)
rs := relay.Init(true, true, false, false, nil, 0, 0)
defer rs.Close()
b := &EthAPIBackend{relay: rs}

Expand All @@ -339,7 +339,7 @@ func TestRelayMethodWiring(t *testing.T) {

t.Run("record and purge private tx do not panic", func(t *testing.T) {
t.Parallel()
rs := relay.Init(false, false, false, true, nil) // creates privateTxStore
rs := relay.Init(false, false, false, true, nil, 0, 0) // creates privateTxStore
defer rs.Close()
b := &EthAPIBackend{relay: rs}

Expand Down Expand Up @@ -368,7 +368,7 @@ func TestRelayGracefulShutdownOnStop(t *testing.T) {
t.Parallel()
// enablePreconf=true creates a Service with background goroutines
// (processPreconfTasks, cleanup). Close() must signal them and wait.
rs := relay.Init(true, true, true, true, nil)
rs := relay.Init(true, true, true, true, nil, 0, 0)
b := &EthAPIBackend{relay: rs}

require.True(t, b.PreconfEnabled(), "relay should be operational before shutdown")
Expand Down
2 changes: 1 addition & 1 deletion eth/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) {
closeCh: make(chan struct{}),
}

relayService := relay.Init(config.EnablePreconfs, config.EnablePrivateTx, config.AcceptPreconfTx, config.AcceptPrivateTx, config.BlockProducerRpcEndpoints)
relayService := relay.Init(config.EnablePreconfs, config.EnablePrivateTx, config.AcceptPreconfTx, config.AcceptPrivateTx, config.BlockProducerRpcEndpoints, config.MaxConcurrentPreconfs, config.MaxConcurrentPrivateTxs)
privateTxGetter := relayService.GetPrivateTxGetter()

// START: Bor changes
Expand Down
2 changes: 2 additions & 0 deletions eth/ethconfig/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,8 @@ type Config struct {
EnablePreconfs bool
EnablePrivateTx bool
BlockProducerRpcEndpoints []string
MaxConcurrentPreconfs uint64
MaxConcurrentPrivateTxs uint64

// Preconf / Private transaction related settings for block producers
AcceptPreconfTx bool
Expand Down
13 changes: 11 additions & 2 deletions eth/relay/relay.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ type RelayService struct {
txRelay *Service
}

func Init(enablePreconf, enablePrivateTx, acceptPreconfTx, acceptPrivateTx bool, blockProducerURLs []string) *RelayService {
func Init(enablePreconf, enablePrivateTx, acceptPreconfTx, acceptPrivateTx bool, blockProducerURLs []string, maxConcurrentPreconfs, maxConcurrentPrivateTxs uint64) *RelayService {
config := Config{
enablePreconf: enablePreconf,
enablePrivateTx: enablePrivateTx,
Expand All @@ -48,7 +48,16 @@ func Init(enablePreconf, enablePrivateTx, acceptPreconfTx, acceptPrivateTx bool,
if len(blockProducerURLs) == 0 {
log.Warn("Relay service enabled but no block producer URLs provided; relay will be non-functional")
}
txRelay = NewService(blockProducerURLs, nil)
// Build a service config from defaults, then override the two
// operator-tunable concurrency caps when callers supplied non-zero values.
serviceConfig := DefaultServiceConfig
if maxConcurrentPreconfs > 0 {
serviceConfig.maxConcurrentPreconfs = maxConcurrentPreconfs
}
if maxConcurrentPrivateTxs > 0 {
serviceConfig.maxConcurrentPrivateTxs = maxConcurrentPrivateTxs
}
txRelay = NewService(blockProducerURLs, &serviceConfig)
}
return &RelayService{
config: config,
Expand Down
56 changes: 28 additions & 28 deletions eth/relay/relay_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,39 +12,39 @@ func TestInit(t *testing.T) {
t.Parallel()

t.Run("all flags disabled creates neither component", func(t *testing.T) {
rs := Init(false, false, false, false, nil)
rs := Init(false, false, false, false, nil, 0, 0)
defer rs.Close()

require.Nil(t, rs.txRelay, "expected nil txRelay when all flags disabled")
require.Nil(t, rs.privateTxStore, "expected nil privateTxStore when all flags disabled")
})

t.Run("enablePreconf only creates txRelay", func(t *testing.T) {
rs := Init(true, false, false, false, nil)
rs := Init(true, false, false, false, nil, 0, 0)
defer rs.Close()

require.NotNil(t, rs.txRelay, "expected txRelay when enablePreconf is true")
require.Nil(t, rs.privateTxStore, "expected nil privateTxStore when only enablePreconf is true")
})

t.Run("enablePrivateTx creates both components", func(t *testing.T) {
rs := Init(false, true, false, false, nil)
rs := Init(false, true, false, false, nil, 0, 0)
defer rs.Close()

require.NotNil(t, rs.txRelay, "expected txRelay when enablePrivateTx is true")
require.NotNil(t, rs.privateTxStore, "expected privateTxStore when enablePrivateTx is true")
})

t.Run("acceptPreconfTx only creates neither component", func(t *testing.T) {
rs := Init(false, false, true, false, nil)
rs := Init(false, false, true, false, nil, 0, 0)
defer rs.Close()

require.Nil(t, rs.txRelay, "expected nil txRelay when only acceptPreconfTx is true")
require.Nil(t, rs.privateTxStore, "expected nil privateTxStore when only acceptPreconfTx is true")
})

t.Run("acceptPrivateTx only creates store", func(t *testing.T) {
rs := Init(false, false, false, true, nil)
rs := Init(false, false, false, true, nil, 0, 0)
defer rs.Close()

require.Nil(t, rs.txRelay, "expected nil txRelay when only acceptPrivateTx is true")
Expand All @@ -55,15 +55,15 @@ func TestInit(t *testing.T) {
server := newMockRpcServer()
defer server.close()

rs := Init(true, true, true, true, []string{server.server.URL})
rs := Init(true, true, true, true, []string{server.server.URL}, 0, 0)
defer rs.Close()

require.NotNil(t, rs.txRelay, "expected txRelay when all flags enabled")
require.NotNil(t, rs.privateTxStore, "expected privateTxStore when all flags enabled")
})

t.Run("empty URLs creates txRelay with nil multiclient", func(t *testing.T) {
rs := Init(true, false, false, false, []string{})
rs := Init(true, false, false, false, []string{}, 0, 0)
defer rs.Close()

require.NotNil(t, rs.txRelay, "expected txRelay to be created")
Expand All @@ -74,7 +74,7 @@ func TestInit(t *testing.T) {
server := newMockRpcServer()
defer server.close()

rs := Init(true, false, false, false, []string{server.server.URL})
rs := Init(true, false, false, false, []string{server.server.URL}, 0, 0)
defer rs.Close()

require.NotNil(t, rs.txRelay, "expected txRelay to be created")
Expand All @@ -85,7 +85,7 @@ func TestInit(t *testing.T) {
func TestConfigAccessors(t *testing.T) {
t.Parallel()

rs := Init(true, false, true, false, nil)
rs := Init(true, false, true, false, nil, 0, 0)
defer rs.Close()

require.True(t, rs.PreconfEnabled(), "expected PreconfEnabled to be true")
Expand All @@ -98,7 +98,7 @@ func TestRelaySubmitPreconfTransaction(t *testing.T) {
t.Parallel()

t.Run("returns wrapped error when txRelay is nil", func(t *testing.T) {
rs := Init(false, false, false, false, nil)
rs := Init(false, false, false, false, nil, 0, 0)
defer rs.Close()

tx := types.NewTransaction(1, common.Address{}, nil, 0, nil, nil)
Expand All @@ -110,7 +110,7 @@ func TestRelaySubmitPreconfTransaction(t *testing.T) {

t.Run("wraps underlying service error", func(t *testing.T) {
// Empty URLs → nil multiclient → SubmitTransactionForPreconf returns errRpcClientUnavailable
rs := Init(true, false, false, false, []string{})
rs := Init(true, false, false, false, []string{}, 0, 0)
defer rs.Close()

tx := types.NewTransaction(1, common.Address{}, nil, 0, nil, nil)
Expand All @@ -124,7 +124,7 @@ func TestRelaySubmitPreconfTransaction(t *testing.T) {
server := newMockRpcServer()
defer server.close()

rs := Init(true, false, false, false, []string{server.server.URL})
rs := Init(true, false, false, false, []string{server.server.URL}, 0, 0)
defer rs.Close()

tx := types.NewTransaction(1, common.Address{}, nil, 0, nil, nil)
Expand All @@ -137,7 +137,7 @@ func TestRelaySubmitPrivateTransaction(t *testing.T) {
t.Parallel()

t.Run("returns wrapped error when txRelay is nil", func(t *testing.T) {
rs := Init(false, false, false, false, nil)
rs := Init(false, false, false, false, nil, 0, 0)
defer rs.Close()

tx := types.NewTransaction(1, common.Address{}, nil, 0, nil, nil)
Expand All @@ -150,7 +150,7 @@ func TestRelaySubmitPrivateTransaction(t *testing.T) {
t.Run("returns unwrapped error from underlying service", func(t *testing.T) {
// Empty URLs → nil multiclient → SubmitPrivateTx returns errRpcClientUnavailable
// SubmitPrivateTransaction returns it as-is (no "request dropped:" wrapping)
rs := Init(false, true, false, false, []string{})
rs := Init(false, true, false, false, []string{}, 0, 0)
defer rs.Close()

tx := types.NewTransaction(1, common.Address{}, nil, 0, nil, nil)
Expand All @@ -165,7 +165,7 @@ func TestRelaySubmitPrivateTransaction(t *testing.T) {
server := newMockRpcServer()
defer server.close()

rs := Init(false, true, false, false, []string{server.server.URL})
rs := Init(false, true, false, false, []string{server.server.URL}, 0, 0)
defer rs.Close()

tx := types.NewTransaction(1, common.Address{}, nil, 0, nil, nil)
Expand All @@ -178,7 +178,7 @@ func TestRelayCheckPreconfStatus(t *testing.T) {
t.Parallel()

t.Run("returns wrapped error when txRelay is nil", func(t *testing.T) {
rs := Init(false, false, false, false, nil)
rs := Init(false, false, false, false, nil, 0, 0)
defer rs.Close()

hash := common.HexToHash("0x1")
Expand All @@ -191,7 +191,7 @@ func TestRelayCheckPreconfStatus(t *testing.T) {

t.Run("wraps underlying service error", func(t *testing.T) {
// Empty URLs → nil multiclient → CheckTxPreconfStatus returns errRpcClientUnavailable
rs := Init(true, false, false, false, []string{})
rs := Init(true, false, false, false, []string{}, 0, 0)
defer rs.Close()

hash := common.HexToHash("0x1")
Expand All @@ -207,7 +207,7 @@ func TestRelayCheckPreconfStatus(t *testing.T) {
server := newMockRpcServer()
defer server.close()

rs := Init(true, false, false, false, []string{server.server.URL})
rs := Init(true, false, false, false, []string{server.server.URL}, 0, 0)
defer rs.Close()

hash := common.HexToHash("0x1")
Expand All @@ -221,7 +221,7 @@ func TestRelayClose(t *testing.T) {
t.Parallel()

t.Run("no panic when both components are nil", func(t *testing.T) {
rs := Init(false, false, false, false, nil)
rs := Init(false, false, false, false, nil, 0, 0)
require.Nil(t, rs.txRelay)
require.Nil(t, rs.privateTxStore)

Expand All @@ -234,7 +234,7 @@ func TestRelayClose(t *testing.T) {
server := newMockRpcServer()
defer server.close()

rs := Init(true, true, true, true, []string{server.server.URL})
rs := Init(true, true, true, true, []string{server.server.URL}, 0, 0)
require.NotNil(t, rs.txRelay)
require.NotNil(t, rs.privateTxStore)

Expand All @@ -244,7 +244,7 @@ func TestRelayClose(t *testing.T) {
})

t.Run("no panic when only privateTxStore exists", func(t *testing.T) {
rs := Init(false, false, false, true, nil)
rs := Init(false, false, false, true, nil, 0, 0)
require.Nil(t, rs.txRelay)
require.NotNil(t, rs.privateTxStore)

Expand All @@ -258,15 +258,15 @@ func TestGetPrivateTxGetter(t *testing.T) {
t.Parallel()

t.Run("returns nil interface when store is nil", func(t *testing.T) {
rs := Init(false, false, false, false, nil)
rs := Init(false, false, false, false, nil, 0, 0)
defer rs.Close()

getter := rs.GetPrivateTxGetter()
require.Nil(t, getter, "expected true nil interface when privateTxStore is nil")
})

t.Run("returns working getter when store exists", func(t *testing.T) {
rs := Init(false, false, false, true, nil)
rs := Init(false, false, false, true, nil, 0, 0)
defer rs.Close()

getter := rs.GetPrivateTxGetter()
Expand All @@ -285,7 +285,7 @@ func TestRelayNilSafety(t *testing.T) {
t.Parallel()

t.Run("RecordPrivateTx with nil store", func(t *testing.T) {
rs := Init(false, false, false, false, nil)
rs := Init(false, false, false, false, nil, 0, 0)
defer rs.Close()

require.Nil(t, rs.privateTxStore)
Expand All @@ -295,7 +295,7 @@ func TestRelayNilSafety(t *testing.T) {
})

t.Run("PurgePrivateTx with nil store", func(t *testing.T) {
rs := Init(false, false, false, false, nil)
rs := Init(false, false, false, false, nil, 0, 0)
defer rs.Close()

require.Nil(t, rs.privateTxStore)
Expand All @@ -305,7 +305,7 @@ func TestRelayNilSafety(t *testing.T) {
})

t.Run("SetTxGetter with nil txRelay", func(t *testing.T) {
rs := Init(false, false, false, false, nil)
rs := Init(false, false, false, false, nil, 0, 0)
defer rs.Close()

require.Nil(t, rs.txRelay)
Expand All @@ -317,7 +317,7 @@ func TestRelayNilSafety(t *testing.T) {
})

t.Run("SetchainEventSubFn with nil store", func(t *testing.T) {
rs := Init(false, false, false, false, nil)
rs := Init(false, false, false, false, nil, 0, 0)
defer rs.Close()

require.Nil(t, rs.privateTxStore)
Expand All @@ -330,7 +330,7 @@ func TestRelayNilSafety(t *testing.T) {
func TestRecordAndPurgePrivateTx(t *testing.T) {
t.Parallel()

rs := Init(false, false, false, true, nil)
rs := Init(false, false, false, true, nil, 0, 0)
defer rs.Close()

getter := rs.GetPrivateTxGetter()
Expand Down
Loading
Loading