Skip to content

Commit 9ad1a26

Browse files
committed
refactor: rely on builder api to provide gaslimit
1 parent 51dffae commit 9ad1a26

File tree

6 files changed

+61
-32
lines changed

6 files changed

+61
-32
lines changed

common/types.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -132,15 +132,15 @@ func NewEthNetworkDetails(networkName string) (ret *EthNetworkDetails, err error
132132
func (e *EthNetworkDetails) String() string {
133133
return fmt.Sprintf(
134134
`EthNetworkDetails{
135-
Name: %s,
136-
GenesisForkVersionHex: %s,
135+
Name: %s,
136+
GenesisForkVersionHex: %s,
137137
GenesisValidatorsRootHex: %s,
138-
BellatrixForkVersionHex: %s,
139-
CapellaForkVersionHex: %s,
138+
BellatrixForkVersionHex: %s,
139+
CapellaForkVersionHex: %s,
140140
DenebForkVersionHex: %s,
141-
DomainBuilder: %x,
142-
DomainBeaconProposerBellatrix: %x,
143-
DomainBeaconProposerCapella: %x,
141+
DomainBuilder: %x,
142+
DomainBeaconProposerBellatrix: %x,
143+
DomainBeaconProposerCapella: %x,
144144
DomainBeaconProposerDeneb: %x
145145
}`,
146146
e.Name,
@@ -802,3 +802,9 @@ func (b *BuilderSubmitBlockRequest) Withdrawals() []*consensuscapella.Withdrawal
802802
}
803803
return nil
804804
}
805+
806+
type BuilderBlockValidationResponseV2 struct {
807+
NewGasLimit uint64 `json:"new_gas_limit,string"`
808+
NewBlockHash phase0.Hash32 `json:"new_block_hash"`
809+
}
810+

database/database.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ func (s *DatabaseService) SaveBuilderBlockSubmission(payload *common.BuilderSubm
241241
}
242242

243243
func (s *DatabaseService) GetBlockSubmissionEntry(slot uint64, proposerPubkey, blockHash string) (entry *BuilderBlockSubmissionEntry, err error) {
244-
query := `SELECT id, inserted_at, received_at, eligible_at, execution_payload_id, sim_success, sim_error, signature, slot, parent_hash, block_hash, builder_pubkey, proposer_pubkey, proposer_fee_recipient, gas_used, gas_limit, num_tx, value, epoch, block_number, decode_duration, prechecks_duration, simulation_duration, redis_update_duration, total_duration, optimistic_submission
244+
query := `SELECT id, inserted_at, received_at, eligible_at, execution_payload_id, sim_success, sim_error, signature, slot, parent_hash, block_hash, builder_pubkey, proposer_pubkey, proposer_fee_recipient, gas_used, gas_limit, num_tx, value, epoch, block_number, decode_duration, prechecks_duration, simulation_duration, redis_update_duration, total_duration, optimistic_submission
245245
FROM ` + vars.TableBuilderBlockSubmission + `
246246
WHERE slot=$1 AND proposer_pubkey=$2 AND block_hash=$3
247247
ORDER BY builder_pubkey ASC

services/api/blocksim_ratelimiter.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ var (
2828
)
2929

3030
type IBlockSimRateLimiter interface {
31-
Send(context context.Context, payload *common.BuilderBlockValidationRequest, isHighPrio, fastTrack bool) (error, error)
31+
Send(context context.Context, payload *common.BuilderBlockValidationRequest, isHighPrio, fastTrack bool) (*common.BuilderBlockValidationResponseV2, error, error)
3232
CurrentCounter() int64
3333
}
3434

@@ -39,6 +39,7 @@ type BlockSimulationRateLimiter struct {
3939
client http.Client
4040
}
4141

42+
4243
func NewBlockSimulationRateLimiter(blockSimURL string) *BlockSimulationRateLimiter {
4344
return &BlockSimulationRateLimiter{
4445
cv: sync.NewCond(&sync.Mutex{}),
@@ -50,7 +51,7 @@ func NewBlockSimulationRateLimiter(blockSimURL string) *BlockSimulationRateLimit
5051
}
5152
}
5253

53-
func (b *BlockSimulationRateLimiter) Send(context context.Context, payload *common.BuilderBlockValidationRequest, isHighPrio, fastTrack bool) (requestErr, validationErr error) {
54+
func (b *BlockSimulationRateLimiter) Send(context context.Context, payload *common.BuilderBlockValidationRequest, isHighPrio, fastTrack bool) (resp *common.BuilderBlockValidationResponseV2, requestErr, validationErr error) {
5455
b.cv.L.Lock()
5556
cnt := atomic.AddInt64(&b.counter, 1)
5657
if maxConcurrentBlocks > 0 && cnt > maxConcurrentBlocks {
@@ -66,12 +67,12 @@ func (b *BlockSimulationRateLimiter) Send(context context.Context, payload *comm
6667
}()
6768

6869
if err := context.Err(); err != nil {
69-
return fmt.Errorf("%w, %w", ErrRequestClosed, err), nil
70+
return nil, fmt.Errorf("%w, %w", ErrRequestClosed, err), nil
7071
}
7172

7273
var simReq *jsonrpc.JSONRPCRequest
7374
if payload.Capella == nil {
74-
return ErrNoCapellaPayload, nil
75+
return nil, ErrNoCapellaPayload, nil
7576
}
7677
// TODO: add deneb support.
7778

@@ -87,8 +88,11 @@ func (b *BlockSimulationRateLimiter) Send(context context.Context, payload *comm
8788

8889
// Create and fire off JSON-RPC request
8990
simReq = jsonrpc.NewJSONRPCRequest("1", "flashbots_validateBuilderSubmissionV2", payload)
90-
_, requestErr, validationErr = SendJSONRPCRequest(&b.client, *simReq, b.blockSimURL, headers)
91-
return requestErr, validationErr
91+
rawResp, requestErr, validationErr := SendJSONRPCRequest(&b.client, *simReq, b.blockSimURL, headers)
92+
93+
json.Unmarshal(rawResp.Result, resp)
94+
95+
return resp, requestErr, validationErr
9296
}
9397

9498
// CurrentCounter returns the number of waiting and active requests

services/api/mock_blocksim_ratelimiter.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ import (
77
)
88

99
type MockBlockSimulationRateLimiter struct {
10+
overrides common.BuilderBlockValidationResponseV2
1011
simulationError error
1112
}
1213

13-
func (m *MockBlockSimulationRateLimiter) Send(context context.Context, payload *common.BuilderBlockValidationRequest, isHighPrio, fastTrack bool) (error, error) {
14-
return nil, m.simulationError
14+
func (m *MockBlockSimulationRateLimiter) Send(context context.Context, payload *common.BuilderBlockValidationRequest, isHighPrio, fastTrack bool) (
15+
*common.BuilderBlockValidationResponseV2, error, error) {
16+
return &m.overrides, nil, m.simulationError
1517
}
1618

1719
func (m *MockBlockSimulationRateLimiter) CurrentCounter() int64 {

services/api/optimistic_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ func TestSimulateBlock(t *testing.T) {
180180
backend.relay.blockSimRateLimiter = &MockBlockSimulationRateLimiter{
181181
simulationError: tc.simulationError,
182182
}
183-
_, simErr := backend.relay.simulateBlock(context.Background(), blockSimOptions{
183+
_, _, simErr := backend.relay.simulateBlock(context.Background(), blockSimOptions{
184184
isHighPrio: true,
185185
log: backend.relay.log,
186186
builder: &blockBuilderCacheEntry{

services/api/service.go

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -550,9 +550,10 @@ func (api *RelayAPI) startValidatorRegistrationDBProcessor() {
550550
}
551551

552552
// simulateBlock sends a request for a block simulation to blockSimRateLimiter.
553-
func (api *RelayAPI) simulateBlock(ctx context.Context, opts blockSimOptions) (requestErr, validationErr error) {
553+
func (api *RelayAPI) simulateBlock(ctx context.Context, opts blockSimOptions) (overrides *common.BuilderBlockValidationResponseV2, requestErr, validationErr error) {
554554
t := time.Now()
555-
requestErr, validationErr = api.blockSimRateLimiter.Send(ctx, opts.req, opts.isHighPrio, opts.fastTrack)
555+
overrides, requestErr, validationErr = api.blockSimRateLimiter.Send(ctx, opts.req, opts.isHighPrio, opts.fastTrack)
556+
556557
log := opts.log.WithFields(logrus.Fields{
557558
"durationMs": time.Since(t).Milliseconds(),
558559
"numWaiting": api.blockSimRateLimiter.CurrentCounter(),
@@ -563,18 +564,18 @@ func (api *RelayAPI) simulateBlock(ctx context.Context, opts blockSimOptions) (r
563564
ignoreError := validationErr.Error() == ErrBlockAlreadyKnown || validationErr.Error() == ErrBlockRequiresReorg || strings.Contains(validationErr.Error(), ErrMissingTrieNode)
564565
if ignoreError {
565566
log.WithError(validationErr).Warn("block validation failed with ignorable error")
566-
return nil, nil
567+
return nil, nil, nil
567568
}
568569
}
569570
log.WithError(validationErr).Warn("block validation failed")
570-
return nil, validationErr
571+
return nil, nil, validationErr
571572
}
572573
if requestErr != nil {
573574
log.WithError(requestErr).Warn("block validation failed: request error")
574-
return requestErr, nil
575+
return nil, requestErr, nil
575576
}
576577
log.Info("block validation successful")
577-
return nil, nil
578+
return overrides, nil, nil
578579
}
579580

580581
func (api *RelayAPI) demoteBuilder(pubkey string, req *common.BuilderSubmitBlockRequest, simError error) {
@@ -620,7 +621,13 @@ func (api *RelayAPI) processOptimisticBlock(opts blockSimOptions, simResultC cha
620621
// it for logging, it is not atomic to avoid the performance impact.
621622
"optBlocksInFlight": api.optimisticBlocksInFlight,
622623
}).Infof("simulating optimistic block with hash: %v", opts.req.BuilderSubmitBlockRequest.BlockHash())
623-
reqErr, simErr := api.simulateBlock(ctx, opts)
624+
overrides, reqErr, simErr := api.simulateBlock(ctx, opts)
625+
626+
overrideGasValues(
627+
opts.req,
628+
overrides,
629+
)
630+
624631
simResultC <- &blockSimResult{reqErr == nil, true, reqErr, simErr}
625632
if reqErr != nil || simErr != nil {
626633
// Mark builder as non-optimistic.
@@ -1785,13 +1792,6 @@ func (api *RelayAPI) handleSubmitNewBlock(w http.ResponseWriter, req *http.Reque
17851792
}
17861793
}
17871794

1788-
// Refuse blocks outside the specified gas limit
1789-
if payload.Capella.ExecutionPayload.GasLimit > RelayActualGasLimit {
1790-
return
1791-
}
1792-
// Overwrite the builder's gasLimit with the relay-set fictitious limit
1793-
payload.Capella.ExecutionPayload.GasLimit = RelayFictitiousGasLimit
1794-
17951795
nextTime = time.Now().UTC()
17961796
pf.Decode = uint64(nextTime.Sub(prevTime).Microseconds())
17971797
prevTime = nextTime
@@ -1964,7 +1964,13 @@ func (api *RelayAPI) handleSubmitNewBlock(w http.ResponseWriter, req *http.Reque
19641964
go api.processOptimisticBlock(opts, simResultC)
19651965
} else {
19661966
// Simulate block (synchronously).
1967-
requestErr, validationErr := api.simulateBlock(context.Background(), opts) // success/error logging happens inside
1967+
overrides, requestErr, validationErr := api.simulateBlock(context.Background(), opts) // success/error logging happens inside
1968+
1969+
overrideGasValues(
1970+
opts.req,
1971+
overrides,
1972+
)
1973+
19681974
simResultC <- &blockSimResult{requestErr == nil, false, requestErr, validationErr}
19691975
validationDurationMs := time.Since(timeBeforeValidation).Milliseconds()
19701976
log = log.WithFields(logrus.Fields{
@@ -2375,3 +2381,14 @@ func (api *RelayAPI) handleReadyz(w http.ResponseWriter, req *http.Request) {
23752381
api.RespondMsg(w, http.StatusServiceUnavailable, "not ready")
23762382
}
23772383
}
2384+
2385+
2386+
func overrideGasValues(
2387+
req *common.BuilderBlockValidationRequest,
2388+
overrides *common.BuilderBlockValidationResponseV2,
2389+
) {
2390+
if overrides != nil {
2391+
req.Capella.ExecutionPayload.BlockHash = overrides.NewBlockHash
2392+
req.Capella.ExecutionPayload.GasLimit = overrides.NewGasLimit
2393+
}
2394+
}

0 commit comments

Comments
 (0)