Skip to content

Commit df5e354

Browse files
authored
RelayEntry arg support (#208)
* RelayEntry arg support * send mev-boost version as query arg
1 parent fa8967e commit df5e354

File tree

6 files changed

+64
-49
lines changed

6 files changed

+64
-49
lines changed

cmd/mev-boost/main.go

+3
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ func main() {
5353
flag.Parse()
5454
logrus.SetOutput(os.Stdout)
5555

56+
// Set the server version
57+
server.Version = version
58+
5659
if *logJSON {
5760
log.Logger.SetFormatter(&logrus.JSONFormatter{})
5861
} else {

server/backend.go

+3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package server
22

3+
// Version is used to get the version of the backend. It is set by the cli
4+
var Version = "dev"
5+
36
// Router paths
47
var (
58
pathStatus = "/eth/v1/builder/status"

server/relay_entry.go

+14-7
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@ import (
88
)
99

1010
// RelayEntry represents a relay that mev-boost connects to.
11-
// Address will be scheme://hostname:port
12-
// PublicKey holds the relay's BLS public key used to verify message signatures.
1311
type RelayEntry struct {
14-
Address string
1512
PublicKey types.PublicKey
1613
URL *url.URL
1714
}
@@ -20,6 +17,14 @@ func (r *RelayEntry) String() string {
2017
return r.URL.String()
2118
}
2219

20+
// GetURI returns the full request URI with scheme, host, path and args.
21+
func (r *RelayEntry) GetURI(path string) string {
22+
u2 := *r.URL
23+
u2.User = nil
24+
u2.Path = path
25+
return u2.String()
26+
}
27+
2328
// NewRelayEntry creates a new instance based on an input string
2429
// relayURL can be IP@PORT, PUBKEY@IP:PORT, https://IP, etc.
2530
func NewRelayEntry(relayURL string) (entry RelayEntry, err error) {
@@ -29,18 +34,20 @@ func NewRelayEntry(relayURL string) (entry RelayEntry, err error) {
2934
}
3035

3136
// Parse the provided relay's URL and save the parsed URL in the RelayEntry.
32-
entry.URL, err = url.Parse(relayURL)
37+
entry.URL, err = url.ParseRequestURI(relayURL)
3338
if err != nil {
3439
return entry, err
3540
}
3641

37-
// Build the relay's address.
38-
entry.Address = entry.URL.Scheme + "://" + entry.URL.Host
39-
4042
// Extract the relay's public key from the parsed URL.
4143
if entry.URL.User.Username() == "" {
4244
return entry, ErrMissingRelayPubkey
4345
}
46+
47+
q := entry.URL.Query()
48+
q.Set("boost", Version)
49+
entry.URL.RawQuery = q.Encode()
50+
4451
err = entry.PublicKey.UnmarshalText([]byte(entry.URL.User.Username()))
4552
return entry, err
4653
}

server/relay_entry_test.go

+23-25
Original file line numberDiff line numberDiff line change
@@ -15,74 +15,72 @@ func TestParseRelaysURLs(t *testing.T) {
1515
testCases := []struct {
1616
name string
1717
relayURL string
18+
path string
1819

1920
expectedErr error
20-
expectedAddress string
21+
expectedURI string // full URI with scheme, host, path and args
2122
expectedPublicKey string
2223
expectedURL string
2324
}{
2425
{
2526
name: "Relay URL with protocol scheme",
2627
relayURL: fmt.Sprintf("http://%[email protected]", publicKey.String()),
2728

28-
expectedErr: nil,
29-
expectedAddress: "http://foo.com",
29+
expectedURI: "http://foo.com?boost=dev",
3030
expectedPublicKey: publicKey.String(),
31-
expectedURL: fmt.Sprintf("http://%[email protected]", publicKey.String()),
31+
expectedURL: fmt.Sprintf("http://%[email protected]?boost=dev", publicKey.String()),
3232
},
3333
{
3434
name: "Relay URL without protocol scheme, without public key",
3535
relayURL: "foo.com",
3636

37-
expectedErr: ErrMissingRelayPubkey,
38-
expectedAddress: "",
39-
expectedPublicKey: "",
40-
expectedURL: "",
37+
expectedErr: ErrMissingRelayPubkey,
4138
},
4239
{
4340
name: "Relay URL without protocol scheme and with public key",
4441
relayURL: publicKey.String() + "@foo.com",
4542

46-
expectedErr: nil,
47-
expectedAddress: "http://foo.com",
43+
expectedURI: "http://foo.com?boost=dev",
4844
expectedPublicKey: publicKey.String(),
49-
expectedURL: "http://" + publicKey.String() + "@foo.com",
45+
expectedURL: "http://" + publicKey.String() + "@foo.com?boost=dev",
5046
},
5147
{
5248
name: "Relay URL with public key host and port",
5349
relayURL: publicKey.String() + "@foo.com:9999",
5450

55-
expectedErr: nil,
56-
expectedAddress: "http://foo.com:9999",
51+
expectedURI: "http://foo.com:9999?boost=dev",
5752
expectedPublicKey: publicKey.String(),
58-
expectedURL: "http://" + publicKey.String() + "@foo.com:9999",
53+
expectedURL: "http://" + publicKey.String() + "@foo.com:9999?boost=dev",
5954
},
6055
{
6156
name: "Relay URL with IP and port",
6257
relayURL: publicKey.String() + "@12.345.678:9999",
6358

64-
expectedErr: nil,
65-
expectedAddress: "http://12.345.678:9999",
59+
expectedURI: "http://12.345.678:9999?boost=dev",
6660
expectedPublicKey: publicKey.String(),
67-
expectedURL: "http://" + publicKey.String() + "@12.345.678:9999",
61+
expectedURL: "http://" + publicKey.String() + "@12.345.678:9999?boost=dev",
6862
},
6963
{
7064
name: "Relay URL with https IP and port",
7165
relayURL: "https://" + publicKey.String() + "@12.345.678:9999",
7266

73-
expectedErr: nil,
74-
expectedAddress: "https://12.345.678:9999",
67+
expectedURI: "https://12.345.678:9999?boost=dev",
7568
expectedPublicKey: publicKey.String(),
76-
expectedURL: "https://" + publicKey.String() + "@12.345.678:9999",
69+
expectedURL: "https://" + publicKey.String() + "@12.345.678:9999?boost=dev",
7770
},
7871
{
7972
name: "Invalid relay public key",
8073
relayURL: "http://[email protected]",
8174

82-
expectedErr: types.ErrLength,
83-
expectedAddress: "",
84-
expectedPublicKey: "",
85-
expectedURL: "",
75+
expectedErr: types.ErrLength,
76+
},
77+
{
78+
name: "Relay URL with query arg",
79+
relayURL: fmt.Sprintf("http://%[email protected]?id=foo&bar=1", publicKey.String()),
80+
81+
expectedURI: "http://foo.com?bar=1&boost=dev&id=foo",
82+
expectedPublicKey: publicKey.String(),
83+
expectedURL: fmt.Sprintf("http://%[email protected]?bar=1&boost=dev&id=foo", publicKey.String()),
8684
},
8785
}
8886

@@ -95,7 +93,7 @@ func TestParseRelaysURLs(t *testing.T) {
9593

9694
// Now perform content assertions.
9795
if tt.expectedErr == nil {
98-
require.Equal(t, tt.expectedAddress, relayEntry.Address)
96+
require.Equal(t, tt.expectedURI, relayEntry.GetURI(tt.path))
9997
require.Equal(t, tt.expectedPublicKey, relayEntry.PublicKey.String())
10098
require.Equal(t, tt.expectedURL, relayEntry.String())
10199
}

server/service.go

+17-14
Original file line numberDiff line numberDiff line change
@@ -167,11 +167,10 @@ func (m *BoostService) handleStatus(w http.ResponseWriter, req *http.Request) {
167167

168168
go func(relay RelayEntry) {
169169
defer wg.Done()
170-
171-
log := m.log.WithField("relay", relay.Address)
170+
url := relay.GetURI(pathStatus)
171+
log := m.log.WithField("url", url)
172172
log.Debug("Checking relay status")
173173

174-
url := relay.Address + pathStatus
175174
_, err := SendHTTPRequest(ctx, m.httpClient, http.MethodGet, url, nil, nil)
176175
if err != nil && ctx.Err() != context.Canceled {
177176
log.WithError(err).Error("failed to retrieve relay status")
@@ -212,9 +211,9 @@ func (m *BoostService) handleRegisterValidator(w http.ResponseWriter, req *http.
212211
var wg sync.WaitGroup
213212
for _, relay := range m.relays {
214213
wg.Add(1)
215-
go func(relayAddr string) {
214+
go func(relay RelayEntry) {
216215
defer wg.Done()
217-
url := relayAddr + pathRegisterValidator
216+
url := relay.GetURI(pathRegisterValidator)
218217
log := log.WithField("url", url)
219218

220219
_, err := SendHTTPRequest(context.Background(), m.httpClient, http.MethodPost, url, payload, nil)
@@ -226,7 +225,7 @@ func (m *BoostService) handleRegisterValidator(w http.ResponseWriter, req *http.
226225
mu.Lock()
227226
defer mu.Unlock()
228227
numSuccessRequestsToRelay++
229-
}(relay.Address)
228+
}(relay)
230229
}
231230

232231
// Wait for all requests to complete...
@@ -275,9 +274,10 @@ func (m *BoostService) handleGetHeader(w http.ResponseWriter, req *http.Request)
275274
var wg sync.WaitGroup
276275
for _, relay := range m.relays {
277276
wg.Add(1)
278-
go func(relayAddr string, relayPubKey types.PublicKey) {
277+
go func(relay RelayEntry) {
279278
defer wg.Done()
280-
url := fmt.Sprintf("%s/eth/v1/builder/header/%s/%s/%s", relayAddr, slot, parentHashHex, pubkey)
279+
path := fmt.Sprintf("/eth/v1/builder/header/%s/%s/%s", slot, parentHashHex, pubkey)
280+
url := relay.GetURI(path)
281281
log := log.WithField("url", url)
282282
responsePayload := new(types.GetHeaderResponse)
283283
code, err := SendHTTPRequest(context.Background(), m.httpClient, http.MethodGet, url, nil, responsePayload)
@@ -304,7 +304,7 @@ func (m *BoostService) handleGetHeader(w http.ResponseWriter, req *http.Request)
304304
})
305305

306306
// Verify the relay signature in the relay response
307-
ok, err := types.VerifySignature(responsePayload.Data.Message, m.builderSigningDomain, relayPubKey[:], responsePayload.Data.Signature[:])
307+
ok, err := types.VerifySignature(responsePayload.Data.Message, m.builderSigningDomain, relay.PublicKey[:], responsePayload.Data.Signature[:])
308308
if err != nil {
309309
log.WithError(err).Error("error verifying relay signature")
310310
return
@@ -335,7 +335,7 @@ func (m *BoostService) handleGetHeader(w http.ResponseWriter, req *http.Request)
335335
// Use this relay's response as mev-boost response because it's most profitable
336336
*result = *responsePayload
337337
log.Info("successfully got more valuable payload header")
338-
}(relay.Address, relay.PublicKey)
338+
}(relay)
339339
}
340340

341341
// Wait for all requests to complete...
@@ -373,10 +373,12 @@ func (m *BoostService) handleGetPayload(w http.ResponseWriter, req *http.Request
373373

374374
for _, relay := range m.relays {
375375
wg.Add(1)
376-
go func(relayAddr string) {
376+
go func(relay RelayEntry) {
377377
defer wg.Done()
378-
url := fmt.Sprintf("%s%s", relayAddr, pathGetPayload)
378+
url := relay.GetURI(pathGetPayload)
379379
log := log.WithField("url", url)
380+
log.Debug("calling getPayload")
381+
380382
responsePayload := new(types.GetPayloadResponse)
381383
_, err := SendHTTPRequest(requestCtx, m.httpClient, http.MethodPost, url, payload, responsePayload)
382384

@@ -414,7 +416,7 @@ func (m *BoostService) handleGetPayload(w http.ResponseWriter, req *http.Request
414416
"blockHash": responsePayload.Data.BlockHash,
415417
"blockNumber": responsePayload.Data.BlockNumber,
416418
}).Info("getPayload: received payload from relay")
417-
}(relay.Address)
419+
}(relay)
418420
}
419421

420422
// Wait for all requests to complete...
@@ -434,7 +436,8 @@ func (m *BoostService) CheckRelays() bool {
434436
for _, relay := range m.relays {
435437
m.log.WithField("relay", relay).Info("Checking relay")
436438

437-
_, err := SendHTTPRequest(context.Background(), m.httpClient, http.MethodGet, relay.Address+pathStatus, nil, nil)
439+
url := relay.GetURI(pathStatus)
440+
_, err := SendHTTPRequest(context.Background(), m.httpClient, http.MethodGet, url, nil, nil)
438441
if err != nil {
439442
m.log.WithError(err).WithField("relay", relay).Error("relay check failed")
440443
return false

server/service_test.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"math"
99
"net/http"
1010
"net/http/httptest"
11+
"net/url"
1112
"strings"
1213
"testing"
1314
"time"
@@ -469,7 +470,6 @@ func TestCheckRelays(t *testing.T) {
469470
t.Run("At least one relay is okay", func(t *testing.T) {
470471
backend := newTestBackend(t, 3, time.Second)
471472
status := backend.boost.CheckRelays()
472-
473473
require.Equal(t, true, status)
474474
})
475475

@@ -478,7 +478,6 @@ func TestCheckRelays(t *testing.T) {
478478
backend.relays[0].Server.Close()
479479

480480
status := backend.boost.CheckRelays()
481-
482481
require.Equal(t, false, status)
483482
})
484483

@@ -489,7 +488,9 @@ func TestCheckRelays(t *testing.T) {
489488
http.Redirect(w, r, redirectAddress, http.StatusTemporaryRedirect)
490489
}))
491490

492-
backend.boost.relays[0].Address = backend.relays[0].Server.URL
491+
url, err := url.ParseRequestURI(backend.relays[0].Server.URL)
492+
require.NoError(t, err)
493+
backend.boost.relays[0].URL = url
493494
status := backend.boost.CheckRelays()
494495
require.Equal(t, false, status)
495496
})

0 commit comments

Comments
 (0)