Fix Up Builder Evaluator (#13395)

* fix it up

* fix evaluator

* fix evaluator again

* fix it

* gaz
This commit is contained in:
Nishant Das 2024-01-02 18:40:26 +08:00 committed by GitHub
parent 2319b7d4bd
commit 88685bb3bd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 50 additions and 2 deletions

View File

@ -38,6 +38,7 @@ go_library(
"//container/slice:go_default_library",
"//crypto/bls:go_default_library",
"//encoding/bytesutil:go_default_library",
"//encoding/ssz:go_default_library",
"//encoding/ssz/detect:go_default_library",
"//network/forks:go_default_library",
"//network/httputil:go_default_library",

View File

@ -6,6 +6,7 @@ import (
"github.com/pkg/errors"
"github.com/prysmaticlabs/prysm/v4/config/params"
"github.com/prysmaticlabs/prysm/v4/consensus-types/primitives"
"github.com/prysmaticlabs/prysm/v4/encoding/ssz"
ethpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1"
"github.com/prysmaticlabs/prysm/v4/testing/endtoend/policies"
e2etypes "github.com/prysmaticlabs/prysm/v4/testing/endtoend/types"
@ -42,6 +43,10 @@ func builderActive(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientConn) err
if lowestBound < params.BeaconConfig().BellatrixForkEpoch {
lowestBound = params.BeaconConfig().BellatrixForkEpoch
}
emptyRt, err := ssz.TransactionsRoot([][]byte{})
if err != nil {
return err
}
blockCtrs, err := beaconClient.ListBeaconBlocks(context.Background(), &ethpb.ListBlocksRequest{QueryFilter: &ethpb.ListBlocksRequest_Epoch{Epoch: lowestBound}})
if err != nil {
return errors.Wrap(err, "failed to get beacon blocks")
@ -67,6 +72,15 @@ func builderActive(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientConn) err
if err != nil {
return err
}
txRoot, err := execPayload.TransactionsRoot()
if err != nil {
return err
}
if [32]byte(txRoot) == emptyRt && string(execPayload.ExtraData()) != "prysm-builder" {
// If a local payload is built with 0 transactions, builder cannot build a payload with more transactions
// since they both utilize the same EL.
continue
}
if string(execPayload.ExtraData()) != "prysm-builder" {
return errors.Errorf("block with slot %d was not built by the builder. It has an extra data of %s", b.Block().Slot(), string(execPayload.ExtraData()))
}
@ -101,9 +115,21 @@ func builderActive(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientConn) err
if err != nil {
return err
}
txRoot, err := execPayload.TransactionsRoot()
if err != nil {
return err
}
if [32]byte(txRoot) == emptyRt && string(execPayload.ExtraData()) != "prysm-builder" {
// If a local payload is built with 0 transactions, builder cannot build a payload with more transactions
// since they both utilize the same EL.
continue
}
if string(execPayload.ExtraData()) != "prysm-builder" {
return errors.Errorf("block with slot %d was not built by the builder. It has an extra data of %s", b.Block().Slot(), string(execPayload.ExtraData()))
}
if execPayload.GasLimit() == 0 {
return errors.Errorf("block with slot %d has a gas limit of 0, when it should be in the 30M range", b.Block().Slot())
}
}
return nil
}

View File

@ -13,6 +13,7 @@ import (
"net/http"
"strconv"
"strings"
"sync"
"time"
"github.com/ethereum/go-ethereum/beacon/engine"
@ -115,6 +116,7 @@ type Builder struct {
blobBundle *v1.BlobsBundle
mux *gMux.Router
validatorMap map[string]*eth.ValidatorRegistrationV1
valLock sync.RWMutex
srv *http.Server
}
@ -160,7 +162,9 @@ func New(opts ...Option) (*Builder, error) {
p.address = addr
p.srv = srv
p.execClient = execClient
p.valLock.Lock()
p.validatorMap = map[string]*eth.ValidatorRegistrationV1{}
p.valLock.Unlock()
p.mux = router
return p, nil
}
@ -247,7 +251,9 @@ func (p *Builder) handleEngineCalls(req, resp []byte) {
p.cfg.logger.Errorf("Could not unmarshal fcu: %v", err)
return
}
p.currId = result.Result.PayloadId
if result.Result.PayloadId != nil && *result.Result.PayloadId != [8]byte{} {
p.currId = result.Result.PayloadId
}
if rpcObj.Method == ForkchoiceUpdatedMethodV3 {
attr := &v1.PayloadAttributesV3{}
obj, err := json.Marshal(rpcObj.Params[1])
@ -261,7 +267,17 @@ func (p *Builder) handleEngineCalls(req, resp []byte) {
}
p.prevBeaconRoot = attr.ParentBeaconBlockRoot
}
p.cfg.logger.Infof("Received payload id of %#x", result.Result.PayloadId)
payloadID := [8]byte{}
status := ""
lastValHash := []byte{}
if result.Result.PayloadId != nil {
payloadID = *result.Result.PayloadId
}
if result.Result.Status != nil {
status = result.Result.Status.Status.String()
lastValHash = result.Result.Status.LatestValidHash
}
p.cfg.logger.Infof("Received payload id of %#x and status of %s along with a valid hash of %#x", payloadID, status, lastValHash)
}
}
@ -281,7 +297,9 @@ func (p *Builder) registerValidators(w http.ResponseWriter, req *http.Request) {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
p.valLock.Lock()
p.validatorMap[r.Message.Pubkey] = msg
p.valLock.Unlock()
}
// TODO: Verify Signatures from validators
w.WriteHeader(http.StatusOK)
@ -664,6 +682,7 @@ func (p *Builder) retrievePendingBlock() (*v1.ExecutionPayload, error) {
if err = json.Unmarshal(marshalledOutput, bellatrixPayload); err != nil {
return nil, err
}
p.currId = nil
return bellatrixPayload, nil
}
@ -688,6 +707,7 @@ func (p *Builder) retrievePendingBlockCapella() (*v1.ExecutionPayloadCapellaWith
if err = json.Unmarshal(marshalledOutput, capellaPayload); err != nil {
return nil, err
}
p.currId = nil
return capellaPayload, nil
}
@ -716,6 +736,7 @@ func (p *Builder) retrievePendingBlockDeneb() (*v1.ExecutionPayloadDenebWithValu
if err = json.Unmarshal(marshalledOutput, denebPayload); err != nil {
return nil, err
}
p.currId = nil
return denebPayload, nil
}