Skip to content

Commit 61c42ec

Browse files
committed
refactor: rely on builder api to provide gaslimit
1 parent d7f4c28 commit 61c42ec

File tree

6 files changed

+59
-32
lines changed

6 files changed

+59
-32
lines changed

common/types.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,15 +133,15 @@ func NewEthNetworkDetails(networkName string) (ret *EthNetworkDetails, err error
133133
func (e *EthNetworkDetails) String() string {
134134
return fmt.Sprintf(
135135
`EthNetworkDetails{
136-
Name: %s,
137-
GenesisForkVersionHex: %s,
136+
Name: %s,
137+
GenesisForkVersionHex: %s,
138138
GenesisValidatorsRootHex: %s,
139-
BellatrixForkVersionHex: %s,
140-
CapellaForkVersionHex: %s,
139+
BellatrixForkVersionHex: %s,
140+
CapellaForkVersionHex: %s,
141141
DenebForkVersionHex: %s,
142-
DomainBuilder: %x,
143-
DomainBeaconProposerBellatrix: %x,
144-
DomainBeaconProposerCapella: %x,
142+
DomainBuilder: %x,
143+
DomainBeaconProposerBellatrix: %x,
144+
DomainBeaconProposerCapella: %x,
145145
DomainBeaconProposerDeneb: %x
146146
}`,
147147
e.Name,
@@ -1070,3 +1070,8 @@ func (s *SubmitBlockRequestV2Optimistic) SizeSSZ() (size int) {
10701070

10711071
return
10721072
}
1073+
1074+
type BuilderBlockValidationResponseV2 struct {
1075+
NewGasLimit uint64 `json:"new_gas_limit,string"`
1076+
NewBlockHash phase0.Hash32 `json:"new_block_hash"`
1077+
}

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: 9 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

@@ -50,7 +50,7 @@ func NewBlockSimulationRateLimiter(blockSimURL string) *BlockSimulationRateLimit
5050
}
5151
}
5252

53-
func (b *BlockSimulationRateLimiter) Send(context context.Context, payload *common.BuilderBlockValidationRequest, isHighPrio, fastTrack bool) (requestErr, validationErr error) {
53+
func (b *BlockSimulationRateLimiter) Send(context context.Context, payload *common.BuilderBlockValidationRequest, isHighPrio, fastTrack bool) (resp *common.BuilderBlockValidationResponseV2, requestErr, validationErr error) {
5454
b.cv.L.Lock()
5555
cnt := atomic.AddInt64(&b.counter, 1)
5656
if maxConcurrentBlocks > 0 && cnt > maxConcurrentBlocks {
@@ -66,12 +66,12 @@ func (b *BlockSimulationRateLimiter) Send(context context.Context, payload *comm
6666
}()
6767

6868
if err := context.Err(); err != nil {
69-
return fmt.Errorf("%w, %w", ErrRequestClosed, err), nil
69+
return nil, fmt.Errorf("%w, %w", ErrRequestClosed, err), nil
7070
}
7171

7272
var simReq *jsonrpc.JSONRPCRequest
7373
if payload.Capella == nil {
74-
return ErrNoCapellaPayload, nil
74+
return nil, ErrNoCapellaPayload, nil
7575
}
7676
// TODO: add deneb support.
7777

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

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

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

services/api/mock_blocksim_ratelimiter.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@ 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+
) {
17+
return &m.overrides, nil, m.simulationError
1518
}
1619

1720
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: 31 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,13 @@ func (api *RelayAPI) handleReadyz(w http.ResponseWriter, req *http.Request) {
23752381
api.RespondMsg(w, http.StatusServiceUnavailable, "not ready")
23762382
}
23772383
}
2384+
2385+
func overrideGasValues(
2386+
req *common.BuilderBlockValidationRequest,
2387+
overrides *common.BuilderBlockValidationResponseV2,
2388+
) {
2389+
if overrides != nil {
2390+
req.Capella.ExecutionPayload.BlockHash = overrides.NewBlockHash
2391+
req.Capella.ExecutionPayload.GasLimit = overrides.NewGasLimit
2392+
}
2393+
}

0 commit comments

Comments
 (0)