Skip to content

Commit

Permalink
fix: insert error stage to rpc error in OpSealPayload engine api (#255)
Browse files Browse the repository at this point in the history
  • Loading branch information
bnoieh authored Jan 20, 2025
1 parent eac68dd commit 41f0426
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 10 deletions.
5 changes: 5 additions & 0 deletions beacon/engine/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ func (e *EngineAPIError) With(err error) *EngineAPIError {
}
}

// SetStage sets error stage in seal payload
func (e *EngineAPIError) SetStage(stage string) {
e.msg = stage + e.msg
}

var (
_ rpc.Error = new(EngineAPIError)
_ rpc.DataError = new(EngineAPIError)
Expand Down
6 changes: 3 additions & 3 deletions beacon/engine/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ import (
type PayloadVersion byte

const (
GetPayloadStage = "getPayload"
NewPayloadStage = "newPayload"
ForkchoiceUpdatedStage = "forkchoiceUpdated"
GetPayloadStage = "sealApiGetPayloadErrStage"
NewPayloadStage = "sealApiNewPayloadErrStage"
ForkchoiceUpdatedStage = "sealApiForkchoiceUpdatedErrStage"
)

var (
Expand Down
41 changes: 34 additions & 7 deletions eth/catalyst/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -723,11 +723,18 @@ func (api *ConsensusAPI) opSealPayload(payloadID engine.PayloadID, update engine
} else if version == "V3" {
payloadEnvelope, err = api.GetPayloadV3(payloadID)
} else {
return engine.OpSealPayloadResponse{ErrStage: engine.GetPayloadStage}, engine.UnsupportedFork.With(errors.New("invalid engine api version"))
forkErr := engine.UnsupportedFork.With(errors.New(engine.GetPayloadStage + "invalid engine api version"))
forkErr.SetStage(engine.GetPayloadStage)
return engine.OpSealPayloadResponse{ErrStage: engine.GetPayloadStage}, forkErr
}
if err != nil {
if engineApiErr, ok := err.(*engine.EngineAPIError); ok {
engineApiErr.SetStage(engine.GetPayloadStage)
log.Error("Seal payload engineApiError when get payload", "error", engineApiErr.Error(), "code", engineApiErr.ErrorCode(), "payloadID", payloadID)
return engine.OpSealPayloadResponse{ErrStage: engine.GetPayloadStage}, engineApiErr
}
log.Error("Seal payload error when get payload", "error", err, "payloadID", payloadID)
return engine.OpSealPayloadResponse{ErrStage: engine.GetPayloadStage}, err
return engine.OpSealPayloadResponse{ErrStage: engine.GetPayloadStage}, fmt.Errorf("sealApiGetPayloadErrStage: %w", err)
}

var payloadStatus engine.PayloadStatusV1
Expand All @@ -736,18 +743,38 @@ func (api *ConsensusAPI) opSealPayload(payloadID engine.PayloadID, update engine
} else if version == "V3" {
payloadStatus, err = api.NewPayloadV3(*payloadEnvelope.ExecutionPayload, []common.Hash{}, payloadEnvelope.ParentBeaconBlockRoot)
} else {
return engine.OpSealPayloadResponse{ErrStage: engine.NewPayloadStage}, engine.UnsupportedFork.With(errors.New("invalid engine api version"))
forkErr := engine.UnsupportedFork.With(errors.New(engine.NewPayloadStage + "invalid engine api version"))
forkErr.SetStage(engine.NewPayloadStage)
return engine.OpSealPayloadResponse{ErrStage: engine.NewPayloadStage}, forkErr
}
if err != nil || payloadStatus.Status != engine.VALID {
if err != nil {
if engineApiErr, ok := err.(*engine.EngineAPIError); ok {
engineApiErr.SetStage(engine.NewPayloadStage)
log.Error("Seal payload engineApiError when new payload", "error", engineApiErr.Error(), "code", engineApiErr.ErrorCode(), "payloadStatus", payloadStatus)
return engine.OpSealPayloadResponse{ErrStage: engine.NewPayloadStage, PayloadStatus: payloadStatus}, engineApiErr
}
log.Error("Seal payload error when new payload", "error", err, "payloadStatus", payloadStatus)
return engine.OpSealPayloadResponse{ErrStage: engine.NewPayloadStage, PayloadStatus: payloadStatus}, err
return engine.OpSealPayloadResponse{ErrStage: engine.NewPayloadStage, PayloadStatus: payloadStatus}, fmt.Errorf("sealApiNewPayloadErrStage: %w", err)
}
if payloadStatus.Status != engine.VALID {
log.Error("Seal payload status error when new payload", "payloadStatus", payloadStatus)
return engine.OpSealPayloadResponse{ErrStage: engine.NewPayloadStage, PayloadStatus: payloadStatus}, nil
}

update.HeadBlockHash = payloadEnvelope.ExecutionPayload.BlockHash
updateResponse, err := api.ForkchoiceUpdatedV3(update, nil)
if err != nil || updateResponse.PayloadStatus.Status != engine.VALID {
if err != nil {
if engineApiErr, ok := err.(*engine.EngineAPIError); ok {
engineApiErr.SetStage(engine.ForkchoiceUpdatedStage)
log.Error("Seal payload engineApiError when forkchoiceUpdated", "error", engineApiErr.Error(), "code", engineApiErr.ErrorCode(), "payloadStatus", updateResponse.PayloadStatus)
return engine.OpSealPayloadResponse{ErrStage: engine.ForkchoiceUpdatedStage, PayloadStatus: updateResponse.PayloadStatus}, engineApiErr
}
log.Error("Seal payload error when forkchoiceUpdated", "error", err, "payloadStatus", updateResponse.PayloadStatus)
return engine.OpSealPayloadResponse{ErrStage: engine.ForkchoiceUpdatedStage, PayloadStatus: updateResponse.PayloadStatus}, err
return engine.OpSealPayloadResponse{ErrStage: engine.ForkchoiceUpdatedStage, PayloadStatus: updateResponse.PayloadStatus}, fmt.Errorf("sealApiForkchoiceUpdatedErrStage: %w", err)
}
if updateResponse.PayloadStatus.Status != engine.VALID {
log.Error("Seal payload status error when forkchoiceUpdated", "payloadStatus", updateResponse.PayloadStatus)
return engine.OpSealPayloadResponse{ErrStage: engine.ForkchoiceUpdatedStage, PayloadStatus: updateResponse.PayloadStatus}, nil
}

log.Info("opSealPayload succeed", "hash", payloadEnvelope.ExecutionPayload.BlockHash, "number", payloadEnvelope.ExecutionPayload.Number, "id", payloadID, "payloadStatus", updateResponse.PayloadStatus)
Expand Down

0 comments on commit 41f0426

Please sign in to comment.