diff --git a/beacon-chain/builder/BUILD.bazel b/beacon-chain/builder/BUILD.bazel new file mode 100644 index 0000000000..229882c3fd --- /dev/null +++ b/beacon-chain/builder/BUILD.bazel @@ -0,0 +1,22 @@ +load("@prysm//tools/go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "option.go", + "service.go", + ], + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/builder", + visibility = ["//visibility:public"], + deps = [ + "//api/client/builder:go_default_library", + "//cmd/beacon-chain/flags:go_default_library", + "//consensus-types/primitives:go_default_library", + "//network:go_default_library", + "//network/authorization:go_default_library", + "//proto/engine/v1:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + "@com_github_pkg_errors//:go_default_library", + "@com_github_urfave_cli_v2//:go_default_library", + ], +) diff --git a/beacon-chain/builder/option.go b/beacon-chain/builder/option.go new file mode 100644 index 0000000000..5dbba7d0e2 --- /dev/null +++ b/beacon-chain/builder/option.go @@ -0,0 +1,36 @@ +package builder + +import ( + "github.com/prysmaticlabs/prysm/cmd/beacon-chain/flags" + "github.com/prysmaticlabs/prysm/network" + "github.com/prysmaticlabs/prysm/network/authorization" + "github.com/urfave/cli/v2" +) + +type Option func(s *Service) error + +// FlagOptions for builder service flag configurations. +func FlagOptions(c *cli.Context) ([]Option, error) { + endpoint := c.String(flags.MevRelayEndpoint.Name) + opts := []Option{ + WithBuilderEndpoints(endpoint), + } + return opts, nil +} + +// WithBuilderEndpoints sets the endpoint for the beacon chain builder service. +func WithBuilderEndpoints(endpoint string) Option { + return func(s *Service) error { + s.cfg.builderEndpoint = covertEndPoint(endpoint) + return nil + } +} + +func covertEndPoint(ep string) network.Endpoint { + return network.Endpoint{ + Url: ep, + Auth: network.AuthorizationData{ // Auth is not used for builder. + Method: authorization.None, + Value: "", + }} +} diff --git a/beacon-chain/builder/service.go b/beacon-chain/builder/service.go new file mode 100644 index 0000000000..17369eb46e --- /dev/null +++ b/beacon-chain/builder/service.go @@ -0,0 +1,77 @@ +package builder + +import ( + "context" + + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/api/client/builder" + types "github.com/prysmaticlabs/prysm/consensus-types/primitives" + "github.com/prysmaticlabs/prysm/network" + v1 "github.com/prysmaticlabs/prysm/proto/engine/v1" + ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// BlockBuilder defines the interface for interacting with the block builder +type BlockBuilder interface { + SubmitBlindedBlock(ctx context.Context, block *ethpb.SignedBlindedBeaconBlockBellatrix) (*v1.ExecutionPayload, error) + GetHeader(ctx context.Context, slot types.Slot, parentHash [32]byte, pubKey [48]byte) (*ethpb.SignedBuilderBid, error) + Status() error + RegisterValidator(ctx context.Context, reg *ethpb.SignedValidatorRegistrationV1) error +} + +// config defines a config struct for dependencies into the service. +type config struct { + builderEndpoint network.Endpoint +} + +// Service defines a service that provides a client for interacting with the beacon chain and MEV relay network. +type Service struct { + cfg *config + c *builder.Client +} + +// NewService instantiates a new service. +func NewService(ctx context.Context, opts ...Option) (*Service, error) { + s := &Service{} + for _, opt := range opts { + if err := opt(s); err != nil { + return nil, err + } + } + if s.cfg.builderEndpoint.Url != "" { + c, err := builder.NewClient(s.cfg.builderEndpoint.Url) + if err != nil { + return nil, err + } + s.c = c + } + return s, nil +} + +// Start initializes the service. +func (*Service) Start() {} + +// Stop halts the service. +func (*Service) Stop() error { + return nil +} + +// SubmitBlindedBlock is currently a stub. +func (*Service) SubmitBlindedBlock(context.Context, *ethpb.SignedBlindedBeaconBlockBellatrix) (*v1.ExecutionPayload, error) { + return nil, errors.New("not implemented") +} + +// GetHeader is currently a stub. +func (*Service) GetHeader(context.Context, types.Slot, [32]byte, [48]byte) (*ethpb.SignedBuilderBid, error) { + return nil, errors.New("not implemented") +} + +// Status is currently a stub. +func (*Service) Status() error { + return errors.New("not implemented") +} + +// RegisterValidator is currently a stub. +func (*Service) RegisterValidator(context.Context, *ethpb.SignedValidatorRegistrationV1) error { + return errors.New("not implemented") +} diff --git a/beacon-chain/node/BUILD.bazel b/beacon-chain/node/BUILD.bazel index 7ef5ea56f9..c05b31e1bf 100644 --- a/beacon-chain/node/BUILD.bazel +++ b/beacon-chain/node/BUILD.bazel @@ -18,6 +18,7 @@ go_library( "//api/gateway:go_default_library", "//async/event:go_default_library", "//beacon-chain/blockchain:go_default_library", + "//beacon-chain/builder:go_default_library", "//beacon-chain/cache:go_default_library", "//beacon-chain/cache/depositcache:go_default_library", "//beacon-chain/db:go_default_library", diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index 8187b6fcbc..dde89c94f0 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -20,6 +20,7 @@ import ( apigateway "github.com/prysmaticlabs/prysm/api/gateway" "github.com/prysmaticlabs/prysm/async/event" "github.com/prysmaticlabs/prysm/beacon-chain/blockchain" + "github.com/prysmaticlabs/prysm/beacon-chain/builder" "github.com/prysmaticlabs/prysm/beacon-chain/cache" "github.com/prysmaticlabs/prysm/beacon-chain/cache/depositcache" "github.com/prysmaticlabs/prysm/beacon-chain/db" @@ -76,6 +77,7 @@ const debugGrpcMaxMsgSize = 1 << 27 type serviceFlagOpts struct { blockchainFlagOpts []blockchain.Option powchainFlagOpts []powchain.Option + builderOpts []builder.Option } // BeaconNode defines a struct that handles the services running a random beacon chain diff --git a/beacon-chain/node/options.go b/beacon-chain/node/options.go index 4add468832..2bfdb59756 100644 --- a/beacon-chain/node/options.go +++ b/beacon-chain/node/options.go @@ -2,6 +2,7 @@ package node import ( "github.com/prysmaticlabs/prysm/beacon-chain/blockchain" + "github.com/prysmaticlabs/prysm/beacon-chain/builder" "github.com/prysmaticlabs/prysm/beacon-chain/powchain" ) @@ -23,3 +24,11 @@ func WithPowchainFlagOptions(opts []powchain.Option) Option { return nil } } + +// WithBuilderFlagOptions includes functional options for the builder service related to CLI flags. +func WithBuilderFlagOptions(opts []builder.Option) Option { + return func(bn *BeaconNode) error { + bn.serviceFlagOpts.builderOpts = opts + return nil + } +} diff --git a/cmd/beacon-chain/BUILD.bazel b/cmd/beacon-chain/BUILD.bazel index 9696d754a8..2551aaf750 100644 --- a/cmd/beacon-chain/BUILD.bazel +++ b/cmd/beacon-chain/BUILD.bazel @@ -15,6 +15,7 @@ go_library( importpath = "github.com/prysmaticlabs/prysm/cmd/beacon-chain", visibility = ["//beacon-chain:__subpackages__"], deps = [ + "//beacon-chain/builder:go_default_library", "//beacon-chain/node:go_default_library", "//cmd:go_default_library", "//cmd/beacon-chain/blockchain:go_default_library", diff --git a/cmd/beacon-chain/flags/base.go b/cmd/beacon-chain/flags/base.go index e4ae78f4aa..eb24033f55 100644 --- a/cmd/beacon-chain/flags/base.go +++ b/cmd/beacon-chain/flags/base.go @@ -11,6 +11,12 @@ import ( ) var ( + // MevRelayEndpoint provides an HTTP access endpoint to a MEV builder network. + MevRelayEndpoint = &cli.StringFlag{ + Name: "http-mev-relay", + Usage: "A MEV builder relay string http endpoint, this wil be used to interact MEV builder network using API defined in: https://ethereum.github.io/builder-specs/#/Builder", + Value: "", + } // HTTPWeb3ProviderFlag provides an HTTP access endpoint to an ETH 1.0 RPC. HTTPWeb3ProviderFlag = &cli.StringFlag{ Name: "http-web3provider", diff --git a/cmd/beacon-chain/main.go b/cmd/beacon-chain/main.go index 96a4ebd2d5..8da816a2d0 100644 --- a/cmd/beacon-chain/main.go +++ b/cmd/beacon-chain/main.go @@ -11,6 +11,7 @@ import ( gethlog "github.com/ethereum/go-ethereum/log" golog "github.com/ipfs/go-log/v2" joonix "github.com/joonix/log" + "github.com/prysmaticlabs/prysm/beacon-chain/builder" "github.com/prysmaticlabs/prysm/beacon-chain/node" "github.com/prysmaticlabs/prysm/cmd" blockchaincmd "github.com/prysmaticlabs/prysm/cmd/beacon-chain/blockchain" @@ -72,6 +73,7 @@ var appFlags = []cli.Flag{ flags.TerminalTotalDifficultyOverride, flags.TerminalBlockHashOverride, flags.TerminalBlockHashActivationEpochOverride, + flags.MevRelayEndpoint, cmd.EnableBackupWebhookFlag, cmd.BackupWebhookOutputDir, cmd.MinimalConfigFlag, @@ -251,9 +253,14 @@ func startNode(ctx *cli.Context) error { if err != nil { return err } + builderFlagOpts, err := builder.FlagOptions(ctx) + if err != nil { + return err + } opts := []node.Option{ node.WithBlockchainFlagOptions(blockchainFlagOpts), node.WithPowchainFlagOptions(powchainFlagOpts), + node.WithBuilderFlagOptions(builderFlagOpts), } optFuncs := []func(*cli.Context) (node.Option, error){ diff --git a/cmd/beacon-chain/usage.go b/cmd/beacon-chain/usage.go index 05e4ee3f7d..f7f3f569d7 100644 --- a/cmd/beacon-chain/usage.go +++ b/cmd/beacon-chain/usage.go @@ -126,6 +126,7 @@ var appHelpFlagGroups = []flagGroup{ flags.WeakSubjectivityCheckpoint, flags.Eth1HeaderReqLimit, flags.MinPeersPerSubnet, + flags.MevRelayEndpoint, checkpoint.BlockPath, checkpoint.StatePath, checkpoint.RemoteURL,