Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

init commit optimistic relay #1

Open
wants to merge 22 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e57024c
init commit optimistic relay
michaelneuder Dec 29, 2022
95e937a
optimistic relay updates
michaelneuder Dec 31, 2022
e666a4b
db updates
michaelneuder Dec 31, 2022
26ad103
flow (c) update database with new table to persist refunds
michaelneuder Dec 31, 2022
3dddf4b
adding collateral check and DB field
michaelneuder Jan 2, 2023
e7aa032
remove db update
michaelneuder Jan 2, 2023
234ff04
add block builder demotion in the case of a simulation error after a …
michaelneuder Jan 2, 2023
c36ef85
comments from Justin
michaelneuder Jan 2, 2023
8379b4e
adding signedValidatorRegistration to the refund table
michaelneuder Jan 2, 2023
442a7bf
normalize usage of BuilderStatus and builder_status instead of Builde…
michaelneuder Jan 2, 2023
c04edc8
rename refund to demotion
michaelneuder Jan 4, 2023
66b14f7
s/TableBuidlerDemotions/TableBuilderDemotions/g
michaelneuder Jan 4, 2023
6bb8bf3
normalizing use of builder instead of block builder except in the cas…
michaelneuder Jan 4, 2023
3a37075
collateral id and demotions
michaelneuder Jan 4, 2023
cae6c95
replacing $3 with $2 in SetBlockBuilderStatus
michaelneuder Jan 4, 2023
d9845af
unit test initial pass
michaelneuder Jan 5, 2023
fe81a12
remove bad test
michaelneuder Jan 5, 2023
8267845
Justin's comments round 2
michaelneuder Jan 5, 2023
ac4aaa2
Unit testing block simulation path
michaelneuder Jan 7, 2023
def09c6
unit test get payload optimistic
michaelneuder Jan 8, 2023
6692741
save full request from builder to justify demotion
michaelneuder Jan 8, 2023
a2c9662
temporarily set optimistic builders as high-prio if the winning block…
michaelneuder Jan 12, 2023
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
6 changes: 3 additions & 3 deletions common/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,16 @@ type HTTPServerTimeouts struct {
Idle time.Duration // Timeout to disconnect idle client connections. None if 0.
}

type BlockBuilderStatusCode uint8
type BlockBuilderStatus uint8

const (
LowPrio BlockBuilderStatusCode = iota
LowPrio BlockBuilderStatus = iota
HighPrio
Optimistic
Blacklisted
)

func (b BlockBuilderStatusCode) String() string {
func (b BlockBuilderStatus) String() string {
switch b {
case Optimistic:
return "optimistic"
Expand Down
6 changes: 3 additions & 3 deletions database/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ type IDatabaseService interface {

GetBlockBuilders() ([]*BlockBuilderEntry, error)
GetBlockBuilderByPubkey(pubkey string) (*BlockBuilderEntry, error)
SetBlockBuilderStatus(pubkey string, status common.BlockBuilderStatusCode) error
SetBlockBuilderStatus(pubkey string, builderStatus common.BlockBuilderStatus) error
UpsertBlockBuilderEntryAfterSubmission(lastSubmission *BuilderBlockSubmissionEntry, isError bool) error
IncBlockBuilderStatsAfterGetPayload(builderPubkey string) error

Expand Down Expand Up @@ -463,9 +463,9 @@ func (s *DatabaseService) GetBlockBuilderByPubkey(pubkey string) (*BlockBuilderE
return entry, err
}

func (s *DatabaseService) SetBlockBuilderStatus(pubkey string, builderStatus common.BlockBuilderStatusCode) error {
func (s *DatabaseService) SetBlockBuilderStatus(pubkey string, builderStatusCode common.BlockBuilderStatus) error {
query := `UPDATE ` + vars.TableBlockBuilder + ` SET builder_status=$1 WHERE builder_pubkey=$3;`
_, err := s.DB.Exec(query, uint8(builderStatus), pubkey)
_, err := s.DB.Exec(query, uint8(builderStatusCode), pubkey)
return err
}

Expand Down
4 changes: 2 additions & 2 deletions database/migrations/001_init_database.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,8 @@ var Migration001InitDatabase = &migrate.Migration{
builder_pubkey varchar(98) NOT NULL,
description text NOT NULL,

builder_status bigint NOT NULL,
builder_collateral NUMERIC(48, 0),
builder_status_code bigint NOT NULL,
builder_collateral NUMERIC(48, 0),

last_submission_id bigint references ` + vars.TableBuilderBlockSubmission + `(id) on delete set null,
last_submission_slot bigint NOT NULL,
Expand Down
2 changes: 1 addition & 1 deletion database/mockdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ func (db MockDB) GetBlockBuilderByPubkey(pubkey string) (*BlockBuilderEntry, err
return nil, nil
}

func (db MockDB) SetBlockBuilderStatus(pubkey string, builderStatus common.BlockBuilderStatusCode) error {
func (db MockDB) SetBlockBuilderStatus(pubkey string, builderStatus common.BlockBuilderStatus) error {
return nil
}

Expand Down
2 changes: 1 addition & 1 deletion database/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ type BlockBuilderEntry struct {
BuilderPubkey string `db:"builder_pubkey" json:"builder_pubkey"`
Description string `db:"description" json:"description"`

BuilderStatus uint8 `db:"builder_status" json:"builder_status"`
BuilderStatus uint8 `db:"builder_status" json:"builder_status"`
BuilderCollateral string `db:"builder_collateral" json:"builder_collateral"`

LastSubmissionID sql.NullInt64 `db:"last_submission_id" json:"last_submission_id"`
Expand Down
12 changes: 6 additions & 6 deletions datastore/redis.go
Original file line number Diff line number Diff line change
Expand Up @@ -317,20 +317,20 @@ func (r *RedisCache) GetBidTrace(slot uint64, proposerPubkey, blockHash string)
return resp, err
}

func (r *RedisCache) SetBlockBuilderStatus(builderPubkey string, code common.BlockBuilderStatusCode) (err error) {
return r.client.HSet(context.Background(), r.keyBlockBuilderStatus, builderPubkey, code).Err()
func (r *RedisCache) SetBlockBuilderStatus(builderPubkey string, status common.BlockBuilderStatus) (err error) {
return r.client.HSet(context.Background(), r.keyBlockBuilderStatus, builderPubkey, status).Err()
}

func (r *RedisCache) GetBlockBuilderStatus(builderPubkey string) (code common.BlockBuilderStatusCode, err error) {
func (r *RedisCache) GetBlockBuilderStatus(builderPubkey string) (status common.BlockBuilderStatus, err error) {
res, err := r.client.HGet(context.Background(), r.keyBlockBuilderStatus, builderPubkey).Result()
if errors.Is(err, redis.Nil) {
return code, nil
return status, nil
}
in, err := strconv.Atoi(res)
if err != nil {
return code, err
return status, err
}
return common.BlockBuilderStatusCode(in), nil
return common.BlockBuilderStatus(in), nil
}

func (r *RedisCache) SetBlockBuilderCollateral(builderPubkey, value string) (err error) {
Expand Down
22 changes: 11 additions & 11 deletions services/api/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -1058,24 +1058,24 @@ func (api *RelayAPI) handleSubmitNewBlock(w http.ResponseWriter, req *http.Reque
}
}

builderStatusCode, err := api.redis.GetBlockBuilderStatus(payload.Message.BuilderPubkey.String())
builderStatus, err := api.redis.GetBlockBuilderStatus(payload.Message.BuilderPubkey.String())
log = log.WithFields(logrus.Fields{
"builderStatus": builderStatusCode,
"builderStatusStr": builderStatusCode.String(),
"builderStatus": builderStatus,
"builderStatusStr": builderStatus.String(),
})
if err != nil {
log.WithError(err).Error("could not get block builder status")
}

if builderStatusCode == common.Blacklisted {
if builderStatus == common.Blacklisted {
log.Info("builder is blacklisted")
time.Sleep(200 * time.Millisecond)
w.WriteHeader(http.StatusOK)
return
}

// Check for collateral in optimistic case.
if builderStatusCode == common.Optimistic {
if builderStatus == common.Optimistic {
builderCollateralStr, err := api.redis.GetBlockBuilderCollateral(payload.Message.BuilderPubkey.String())
if err != nil {
log.WithError(err).Error("could not get block builder collateral")
Expand All @@ -1092,7 +1092,7 @@ func (api *RelayAPI) handleSubmitNewBlock(w http.ResponseWriter, req *http.Reque

// Check if builder collateral exceeds the value of the block. If not, set as just high prio instead of optimistic.
if builderCollateral.Cmp((*types.U256Str)(&payload.Message.Value)) < 0 {
builderStatusCode = common.HighPrio
builderStatus = common.HighPrio
}
}

Expand Down Expand Up @@ -1128,16 +1128,16 @@ func (api *RelayAPI) handleSubmitNewBlock(w http.ResponseWriter, req *http.Reque
}

// In case only high-prio requests are accepted, fail others
if api.ffDisableLowPrioBuilders && builderStatusCode != common.HighPrio {
if api.ffDisableLowPrioBuilders && builderStatus != common.HighPrio {
log.Info("rejecting low-prio builder (ff-disable-low-prio-builders)")
time.Sleep(200 * time.Millisecond)
w.WriteHeader(http.StatusOK)
return
}

log = log.WithFields(logrus.Fields{
"builderStatus": builderStatusCode,
"builderStatusStr": builderStatusCode.String(),
"builderStatus": builderStatus,
"builderStatusStr": builderStatus.String(),
"proposerPubkey": payload.Message.ProposerPubkey.String(),
"parentHash": payload.Message.ParentHash.String(),
"value": payload.Message.Value.String(),
Expand Down Expand Up @@ -1207,7 +1207,7 @@ func (api *RelayAPI) handleSubmitNewBlock(w http.ResponseWriter, req *http.Reque
// Construct simulation request.
opts := blockSimOptions{
ctx: req.Context(),
highPrio: builderStatusCode == common.HighPrio || builderStatusCode == common.Optimistic,
highPrio: builderStatus == common.HighPrio || builderStatus == common.Optimistic,
log: log,
req: &BuilderBlockValidationRequest{
BuilderSubmitBlockRequest: *payload,
Expand All @@ -1216,7 +1216,7 @@ func (api *RelayAPI) handleSubmitNewBlock(w http.ResponseWriter, req *http.Reque
}

// Only perform simulation on hot path if we are in non-optimistic mode.
if builderStatusCode == common.Optimistic {
if builderStatus == common.Optimistic {
// Write optimistic block to channel for async validation.
api.optimisticBlockC <- opts
} else {
Expand Down
2 changes: 1 addition & 1 deletion services/housekeeper/housekeeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ func (hk *Housekeeper) updateBlockBuildersInRedis() {

hk.log.Infof("updating %d block builders in Redis...", len(builders))
for _, builder := range builders {
code := common.BlockBuilderStatusCode(builder.BuilderStatus)
code := common.BlockBuilderStatus(builder.BuilderStatus)
hk.log.Infof("updating block builder in Redis: %s - %s", builder.BuilderPubkey, code.String())
err = hk.redis.SetBlockBuilderStatus(builder.BuilderPubkey, code)
if err != nil {
Expand Down