From 9e98e914a131e3886debf19bce347d139d90ca5f Mon Sep 17 00:00:00 2001 From: Preston Van Loon Date: Sun, 2 Jun 2019 11:33:44 -0400 Subject: [PATCH] Add a gRPC gateway (#2604) --- BUILD.bazel | 24 ++- WORKSPACE | 24 ++- beacon-chain/BUILD.bazel | 13 +- beacon-chain/gateway/BUILD.bazel | 23 ++ beacon-chain/gateway/gateway.go | 144 +++++++++++++ beacon-chain/gateway/handlers.go | 26 +++ beacon-chain/gateway/log.go | 5 + beacon-chain/gateway/server/BUILD.bazel | 52 +++++ beacon-chain/gateway/server/main.go | 75 +++++++ beacon-chain/main.go | 116 +++++----- beacon-chain/node/BUILD.bazel | 1 + beacon-chain/node/node.go | 15 ++ beacon-chain/usage.go | 20 ++ beacon-chain/usage_test.go | 41 ++++ beacon-chain/utils/flags.go | 9 +- k8s/api.prylabs.net.yaml | 34 ++- k8s/beacon-chain/public-api.yaml | 151 +++++++++++++ proto/beacon/rpc/v1/BUILD.bazel | 34 ++- proto/beacon/rpc/v1/services.pb.go | 270 +++++++++++++----------- proto/beacon/rpc/v1/services.proto | 43 +++- 20 files changed, 929 insertions(+), 191 deletions(-) create mode 100644 beacon-chain/gateway/BUILD.bazel create mode 100644 beacon-chain/gateway/gateway.go create mode 100644 beacon-chain/gateway/handlers.go create mode 100644 beacon-chain/gateway/log.go create mode 100644 beacon-chain/gateway/server/BUILD.bazel create mode 100644 beacon-chain/gateway/server/main.go create mode 100644 beacon-chain/usage_test.go create mode 100644 k8s/beacon-chain/public-api.yaml diff --git a/BUILD.bazel b/BUILD.bazel index 551b682bb..d9f2b262e 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -32,6 +32,24 @@ alias( ], ) +# Protobuf gRPC compiler without gogoproto. Required for gRPC gateway. +alias( + name = "grpc_nogogo_proto_compiler", + actual = "@io_bazel_rules_go//proto:go_grpc", + visibility = [ + "//proto:__subpackages__", + ], +) + +# Protobuf gRPC gateway compiler +alias( + name = "grpc_gateway_proto_compiler", + actual = "@grpc_ecosystem_grpc_gateway//protoc-gen-grpc-gateway:go_gen_grpc_gateway", + visibility = [ + "//proto:__subpackages__", + ], +) + gometalinter( name = "gometalinter", config = "//:.gometalinter.json", @@ -44,8 +62,8 @@ gometalinter( goimports( name = "goimports", display_diffs = True, - write = False, prefix = prefix, + write = False, ) workspace_binary( @@ -55,6 +73,8 @@ workspace_binary( nogo( name = "nogo", + config = "nogo_config.json", + visibility = ["//visibility:public"], deps = [ "@org_golang_x_tools//go/analysis/passes/unsafeptr:go_tool_library", "@org_golang_x_tools//go/analysis/passes/unreachable:go_tool_library", @@ -87,6 +107,4 @@ nogo( "@org_golang_x_tools//go/analysis/passes/inspect:go_tool_library", "@org_golang_x_tools//go/analysis/passes/asmdecl:go_tool_library", ], - visibility = ["//visibility:public"], - config = "nogo_config.json", ) diff --git a/WORKSPACE b/WORKSPACE index ef976dbde..0cd95b957 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -129,11 +129,21 @@ http_archive( url = "https://github.com/kubernetes/repo-infra/archive/df02ded38f9506e5bbcbf21702034b4fef815f2f.tar.gz", ) +http_archive( + name = "com_github_bazelbuild_buildtools", + strip_prefix = "buildtools-bf564b4925ab5876a3f64d8b90fab7f769013d42", + url = "https://github.com/bazelbuild/buildtools/archive/bf564b4925ab5876a3f64d8b90fab7f769013d42.zip", +) + +load("@com_github_bazelbuild_buildtools//buildifier:deps.bzl", "buildifier_dependencies") + +buildifier_dependencies() + http_archive( name = "com_github_prysmaticlabs_go_ssz", + sha256 = "9e753a6e5c4f6f7f3b4af584f326b1c650aee6af85fc98416fbe7d1579d6e4d7", strip_prefix = "go-ssz-85eecc65d2c7a3b20501fe662210e5045f7bcbe1", url = "https://github.com/prysmaticlabs/go-ssz/archive/85eecc65d2c7a3b20501fe662210e5045f7bcbe1.tar.gz", - sha256 = "9e753a6e5c4f6f7f3b4af584f326b1c650aee6af85fc98416fbe7d1579d6e4d7", ) load("@com_github_prysmaticlabs_go_ssz//:deps.bzl", "go_ssz_dependencies") @@ -1101,3 +1111,15 @@ go_repository( commit = "13fe31bbdd7a6f706b9114e188cdb53856be4d64", importpath = "github.com/joonix/log", ) + +go_repository( + name = "grpc_ecosystem_grpc_gateway", + commit = "8fd5fd9d19ce68183a6b0934519dfe7fe6269612", + importpath = "github.com/grpc-ecosystem/grpc-gateway", +) + +go_repository( + name = "com_github_ghodss_yaml", + commit = "25d852aebe32c875e9c044af3eef9c7dc6bc777f", + importpath = "github.com/ghodss/yaml", +) diff --git a/beacon-chain/BUILD.bazel b/beacon-chain/BUILD.bazel index 84cee5c8f..8ee07f175 100644 --- a/beacon-chain/BUILD.bazel +++ b/beacon-chain/BUILD.bazel @@ -1,4 +1,4 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") +load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library", "go_test") load("@io_bazel_rules_docker//go:image.bzl", "go_image") load("@io_bazel_rules_docker//container:container.bzl", "container_push") @@ -8,6 +8,9 @@ go_library( "main.go", "usage.go", ], + data = [ + "//proto/beacon/rpc/v1:swagger", + ], importpath = "github.com/prysmaticlabs/prysm/beacon-chain", visibility = ["//beacon-chain:__subpackages__"], deps = [ @@ -69,3 +72,11 @@ go_binary( embed = [":go_default_library"], visibility = ["//beacon-chain:__subpackages__"], ) + +go_test( + name = "go_default_test", + size = "small", + srcs = ["usage_test.go"], + embed = [":go_default_library"], + deps = ["@com_github_urfave_cli//:go_default_library"], +) diff --git a/beacon-chain/gateway/BUILD.bazel b/beacon-chain/gateway/BUILD.bazel new file mode 100644 index 000000000..2550d10b9 --- /dev/null +++ b/beacon-chain/gateway/BUILD.bazel @@ -0,0 +1,23 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "gateway.go", + "handlers.go", + "log.go", + ], + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/gateway", + visibility = [ + "//beacon-chain/gateway/server:__pkg__", + "//beacon-chain/node:__pkg__", + ], + deps = [ + "//proto/beacon/rpc/v1:v1_grpc_gateway_proto", + "//shared:go_default_library", + "@com_github_sirupsen_logrus//:go_default_library", + "@grpc_ecosystem_grpc_gateway//runtime:go_default_library", + "@org_golang_google_grpc//:go_default_library", + "@org_golang_google_grpc//connectivity:go_default_library", + ], +) diff --git a/beacon-chain/gateway/gateway.go b/beacon-chain/gateway/gateway.go new file mode 100644 index 000000000..08742512b --- /dev/null +++ b/beacon-chain/gateway/gateway.go @@ -0,0 +1,144 @@ +package gateway + +import ( + "context" + "fmt" + "net" + "net/http" + "time" + + gwruntime "github.com/grpc-ecosystem/grpc-gateway/runtime" + pb "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1_gateway" + "github.com/prysmaticlabs/prysm/shared" + "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" +) + +var _ = shared.Service(&Gateway{}) + +// Gateway is the gRPC gateway to serve HTTP JSON traffic as a proxy and forward +// it to the beacon-chain gRPC server. +type Gateway struct { + conn *grpc.ClientConn + ctx context.Context + cancel context.CancelFunc + gatewayAddr string + remoteAddr string + server *http.Server + mux *http.ServeMux + + startFailure error +} + +// Start the gateway service. This serves the HTTP JSON traffic on the specified +// port. +func (g *Gateway) Start() { + ctx, cancel := context.WithCancel(g.ctx) + g.cancel = cancel + + log.WithField("address", g.gatewayAddr).Info("Starting gRPC gateway.") + + conn, err := dial(ctx, "tcp", g.remoteAddr) + if err != nil { + log.WithError(err).Error("Failed to connect to gRPC server") + g.startFailure = err + return + } + + g.conn = conn + + gwmux := gwruntime.NewServeMux() + for _, f := range []func(context.Context, *gwruntime.ServeMux, *grpc.ClientConn) error{ + pb.RegisterBeaconServiceHandler, + } { + if err := f(ctx, gwmux, conn); err != nil { + log.WithError(err).Error("Failed to start gateway") + g.startFailure = err + return + } + } + + g.mux.Handle("/", gwmux) + + g.server = &http.Server{ + Addr: g.gatewayAddr, + Handler: g.mux, + } + go func() { + if err := g.server.ListenAndServe(); err != http.ErrServerClosed { + log.WithError(err).Error("Failed to listen and serve") + g.startFailure = err + return + } + }() + + return +} + +// Status of grpc gateway. Returns an error if this service is unhealthy. +func (g *Gateway) Status() error { + if g.startFailure != nil { + return g.startFailure + } + + if s := g.conn.GetState(); s != connectivity.Ready { + return fmt.Errorf("grpc server is %s", s) + } + + return nil +} + +// Stop the gateway with a graceful shutdown. +func (g *Gateway) Stop() error { + if err := g.server.Shutdown(g.ctx); err != nil { + log.WithError(err).Error("Failed to shut down server") + } + + if g.cancel != nil { + g.cancel() + } + + return nil +} + +// New returns a new gateway server which translates HTTP into gRPC. +// Accepts a context and optional http.ServeMux. +func New(ctx context.Context, remoteAddress, gatewayAddress string, mux *http.ServeMux) *Gateway { + if mux == nil { + mux = http.NewServeMux() + } + + return &Gateway{ + remoteAddr: remoteAddress, + gatewayAddr: gatewayAddress, + ctx: ctx, + mux: mux, + } +} + +// dial the gRPC server. +func dial(ctx context.Context, network, addr string) (*grpc.ClientConn, error) { + switch network { + case "tcp": + return dialTCP(ctx, addr) + case "unix": + return dialUnix(ctx, addr) + default: + return nil, fmt.Errorf("unsupported network type %q", network) + } +} + +// dialTCP creates a client connection via TCP. +// "addr" must be a valid TCP address with a port number. +func dialTCP(ctx context.Context, addr string) (*grpc.ClientConn, error) { + return grpc.DialContext(ctx, addr, grpc.WithInsecure()) +} + +// dialUnix creates a client connection via a unix domain socket. +// "addr" must be a valid path to the socket. +func dialUnix(ctx context.Context, addr string) (*grpc.ClientConn, error) { + d := func(addr string, timeout time.Duration) (net.Conn, error) { + return net.DialTimeout("unix", addr, timeout) + } + return grpc.DialContext(ctx, addr, grpc.WithInsecure(), grpc.WithDialer(d)) +} diff --git a/beacon-chain/gateway/handlers.go b/beacon-chain/gateway/handlers.go new file mode 100644 index 000000000..0f968a0ba --- /dev/null +++ b/beacon-chain/gateway/handlers.go @@ -0,0 +1,26 @@ +package gateway + +import ( + "net/http" + "path" + "strings" +) + +// Swagger directory for the runtime files provided by bazel data. +const swaggerDir = "proto/beacon/rpc/v1/" + +// SwaggerServer returns swagger specification files located under "/swagger/" +func SwaggerServer() http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if !strings.HasSuffix(r.URL.Path, ".swagger.json") { + log.Debugf("Not Found: %s", r.URL.Path) + http.NotFound(w, r) + return + } + + log.Debugf("Serving %s\n", r.URL.Path) + p := strings.TrimPrefix(r.URL.Path, "/swagger/") + p = path.Join(swaggerDir, p) + http.ServeFile(w, r, p) + } +} diff --git a/beacon-chain/gateway/log.go b/beacon-chain/gateway/log.go new file mode 100644 index 000000000..fe3dcc54c --- /dev/null +++ b/beacon-chain/gateway/log.go @@ -0,0 +1,5 @@ +package gateway + +import "github.com/sirupsen/logrus" + +var log = logrus.WithField("prefix", "gateway") diff --git a/beacon-chain/gateway/server/BUILD.bazel b/beacon-chain/gateway/server/BUILD.bazel new file mode 100644 index 000000000..5d699489e --- /dev/null +++ b/beacon-chain/gateway/server/BUILD.bazel @@ -0,0 +1,52 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") +load("@io_bazel_rules_docker//go:image.bzl", "go_image") +load("@io_bazel_rules_docker//container:container.bzl", "container_push") + +go_library( + name = "go_default_library", + srcs = ["main.go"], + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/gateway/server", + visibility = ["//visibility:private"], + deps = [ + "//beacon-chain/gateway:go_default_library", + "@com_github_joonix_log//:go_default_library", + "@com_github_sirupsen_logrus//:go_default_library", + "@grpc_ecosystem_grpc_gateway//runtime:go_default_library", + ], +) + +go_binary( + name = "server", + embed = [":go_default_library"], + visibility = ["//visibility:private"], +) + +go_image( + name = "image", + srcs = [ + "main.go", + ], + goarch = "amd64", + goos = "linux", + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/gateway/server", + race = "off", + tags = ["manual"], + visibility = ["//visibility:private"], + deps = [ + "//beacon-chain/gateway:go_default_library", + "@com_github_joonix_log//:go_default_library", + "@com_github_sirupsen_logrus//:go_default_library", + "@grpc_ecosystem_grpc_gateway//runtime:go_default_library", + ], +) + +container_push( + name = "push_image", + format = "Docker", + image = ":image", + registry = "gcr.io", + repository = "prysmaticlabs/prysm/beacon-chain/gateway", + tag = "latest", + tags = ["manual"], + visibility = ["//visibility:private"], +) diff --git a/beacon-chain/gateway/server/main.go b/beacon-chain/gateway/server/main.go new file mode 100644 index 000000000..5aeda25b0 --- /dev/null +++ b/beacon-chain/gateway/server/main.go @@ -0,0 +1,75 @@ +package main + +import ( + "context" + "flag" + "fmt" + "net/http" + + gwruntime "github.com/grpc-ecosystem/grpc-gateway/runtime" + joonix "github.com/joonix/log" + "github.com/prysmaticlabs/prysm/beacon-chain/gateway" + "github.com/sirupsen/logrus" +) + +// Endpoint describes a gRPC endpoint +type Endpoint struct { + Network, Addr string +} + +// Options is a set of options to be passed to Run +type Options struct { + // Addr is the address to listen + Addr string + + // GRPCServer defines an endpoint of a gRPC service + GRPCServer Endpoint + + // SwaggerDir is a path to a directory from which the server + // serves swagger specs. + SwaggerDir string + + // Mux is a list of options to be passed to the grpc-gateway multiplexer + Mux []gwruntime.ServeMuxOption +} + +var ( + beaconRPC = flag.String("beacon-rpc", "localhost:4000", "Beacon chain gRPC endpoint") + port = flag.Int("port", 8000, "Port to serve on") + debug = flag.Bool("debug", false, "Enable debug logging") +) + +func init() { + logrus.SetFormatter(joonix.NewFormatter()) +} + +var log = logrus.New() + +func main() { + flag.Parse() + if *debug { + log.SetLevel(logrus.DebugLevel) + } + + mux := http.NewServeMux() + gw := gateway.New(context.Background(), *beaconRPC, fmt.Sprintf("0.0.0.0:%d", *port), mux) + mux.HandleFunc("/swagger/", gateway.SwaggerServer()) + mux.HandleFunc("/healthz", healthzServer(gw)) + gw.Start() + + select {} +} + +// healthzServer returns a simple health handler which returns ok. +func healthzServer(gw *gateway.Gateway) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + if err := gw.Status(); err != nil { + http.Error(w, err.Error(), http.StatusBadGateway) + return + } + if _, err := fmt.Fprintln(w, "ok"); err != nil { + log.WithError(err).Error("failed to respond to healthz") + } + } +} diff --git a/beacon-chain/main.go b/beacon-chain/main.go index e532c28d5..1080513c2 100644 --- a/beacon-chain/main.go +++ b/beacon-chain/main.go @@ -7,6 +7,10 @@ import ( "runtime" joonix "github.com/joonix/log" + "github.com/sirupsen/logrus" + "github.com/urfave/cli" + "github.com/x-cray/logrus-prefixed-formatter" + "github.com/prysmaticlabs/prysm/beacon-chain/node" "github.com/prysmaticlabs/prysm/beacon-chain/utils" "github.com/prysmaticlabs/prysm/shared/cmd" @@ -14,25 +18,49 @@ import ( "github.com/prysmaticlabs/prysm/shared/featureconfig" "github.com/prysmaticlabs/prysm/shared/logutil" "github.com/prysmaticlabs/prysm/shared/version" - "github.com/sirupsen/logrus" - "github.com/urfave/cli" - prefixed "github.com/x-cray/logrus-prefixed-formatter" ) -func startNode(ctx *cli.Context) error { - verbosity := ctx.GlobalString(cmd.VerbosityFlag.Name) - level, err := logrus.ParseLevel(verbosity) - if err != nil { - return err - } - logrus.SetLevel(level) +var appFlags = []cli.Flag{ + utils.NoCustomConfigFlag, + utils.DepositContractFlag, + utils.Web3ProviderFlag, + utils.HTTPWeb3ProviderFlag, + utils.RPCPort, + utils.CertFlag, + utils.KeyFlag, + utils.EnableDBCleanup, + utils.GRPCGatewayPort, + cmd.BootstrapNode, + cmd.NoDiscovery, + cmd.StaticPeers, + cmd.RelayNode, + cmd.P2PPort, + cmd.P2PHost, + cmd.P2PMaxPeers, + cmd.P2PPrivKey, + cmd.P2PWhitelist, + cmd.DataDirFlag, + cmd.VerbosityFlag, + cmd.EnableTracingFlag, + cmd.TracingProcessNameFlag, + cmd.TracingEndpointFlag, + cmd.TraceSampleFractionFlag, + cmd.MonitoringPortFlag, + cmd.DisableMonitoringFlag, + cmd.ClearDB, + cmd.LogFormat, + cmd.MaxGoroutines, + debug.PProfFlag, + debug.PProfAddrFlag, + debug.PProfPortFlag, + debug.MemProfileRateFlag, + debug.CPUProfileFlag, + debug.TraceFlag, + cmd.LogFileName, +} - beacon, err := node.NewBeaconNode(ctx) - if err != nil { - return err - } - beacon.Start() - return nil +func init() { + appFlags = append(appFlags, featureconfig.BeaconChainFlags...) } func main() { @@ -43,45 +71,7 @@ func main() { app.Action = startNode app.Version = version.GetVersion() - app.Flags = []cli.Flag{ - utils.NoCustomConfigFlag, - utils.DepositContractFlag, - utils.Web3ProviderFlag, - utils.HTTPWeb3ProviderFlag, - utils.RPCPort, - utils.CertFlag, - utils.KeyFlag, - utils.EnableDBCleanup, - cmd.BootstrapNode, - cmd.NoDiscovery, - cmd.StaticPeers, - cmd.RelayNode, - cmd.P2PPort, - cmd.P2PHost, - cmd.P2PMaxPeers, - cmd.P2PPrivKey, - cmd.P2PWhitelist, - cmd.DataDirFlag, - cmd.VerbosityFlag, - cmd.EnableTracingFlag, - cmd.TracingProcessNameFlag, - cmd.TracingEndpointFlag, - cmd.TraceSampleFractionFlag, - cmd.MonitoringPortFlag, - cmd.DisableMonitoringFlag, - cmd.ClearDB, - cmd.LogFormat, - cmd.MaxGoroutines, - debug.PProfFlag, - debug.PProfAddrFlag, - debug.PProfPortFlag, - debug.MemProfileRateFlag, - debug.CPUProfileFlag, - debug.TraceFlag, - cmd.LogFileName, - } - - app.Flags = append(app.Flags, featureconfig.BeaconChainFlags...) + app.Flags = appFlags app.Before = func(ctx *cli.Context) error { format := ctx.GlobalString(cmd.LogFormat.Name) @@ -121,3 +111,19 @@ func main() { os.Exit(1) } } + +func startNode(ctx *cli.Context) error { + verbosity := ctx.GlobalString(cmd.VerbosityFlag.Name) + level, err := logrus.ParseLevel(verbosity) + if err != nil { + return err + } + logrus.SetLevel(level) + + beacon, err := node.NewBeaconNode(ctx) + if err != nil { + return err + } + beacon.Start() + return nil +} diff --git a/beacon-chain/node/BUILD.bazel b/beacon-chain/node/BUILD.bazel index 6ca6abbfb..b802cc934 100644 --- a/beacon-chain/node/BUILD.bazel +++ b/beacon-chain/node/BUILD.bazel @@ -13,6 +13,7 @@ go_library( "//beacon-chain/attestation:go_default_library", "//beacon-chain/blockchain:go_default_library", "//beacon-chain/db:go_default_library", + "//beacon-chain/gateway:go_default_library", "//beacon-chain/operations:go_default_library", "//beacon-chain/powchain:go_default_library", "//beacon-chain/rpc:go_default_library", diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index 57c7f6a61..aff8d0a17 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -16,6 +16,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/attestation" "github.com/prysmaticlabs/prysm/beacon-chain/blockchain" "github.com/prysmaticlabs/prysm/beacon-chain/db" + "github.com/prysmaticlabs/prysm/beacon-chain/gateway" "github.com/prysmaticlabs/prysm/beacon-chain/operations" "github.com/prysmaticlabs/prysm/beacon-chain/powchain" "github.com/prysmaticlabs/prysm/beacon-chain/rpc" @@ -110,6 +111,10 @@ func NewBeaconNode(ctx *cli.Context) (*BeaconNode, error) { return nil, err } + if err := beacon.registerGRPCGateway(ctx); err != nil { + return nil, err + } + if !ctx.GlobalBool(cmd.DisableMonitoringFlag.Name) { if err := beacon.registerPrometheusService(ctx); err != nil { return nil, err @@ -397,3 +402,13 @@ func (b *BeaconNode) registerAttestationService() error { return b.services.RegisterService(attsService) } + +func (b *BeaconNode) registerGRPCGateway(ctx *cli.Context) error { + gatewayPort := ctx.GlobalInt(utils.GRPCGatewayPort.Name) + if gatewayPort > 0 { + selfAddress := fmt.Sprintf("127.0.0.1:%d", ctx.GlobalInt(utils.RPCPort.Name)) + gatewayAddress := fmt.Sprintf("127.0.0.1:%d", gatewayPort) + return b.services.RegisterService(gateway.New(context.Background(), selfAddress, gatewayAddress, nil /*optional mux*/)) + } + return nil +} diff --git a/beacon-chain/usage.go b/beacon-chain/usage.go index 241084ad9..587549496 100644 --- a/beacon-chain/usage.go +++ b/beacon-chain/usage.go @@ -57,6 +57,7 @@ var appHelpFlagGroups = []flagGroup{ cmd.MonitoringPortFlag, cmd.DisableMonitoringFlag, cmd.MaxGoroutines, + cmd.ClearDB, }, }, { @@ -80,6 +81,25 @@ var appHelpFlagGroups = []flagGroup{ utils.CertFlag, utils.KeyFlag, utils.EnableDBCleanup, + utils.GRPCGatewayPort, + utils.HTTPWeb3ProviderFlag, + }, + }, + { + Name: "p2p", + Flags: []cli.Flag{ + cmd.P2PHost, + cmd.P2PMaxPeers, + cmd.P2PPrivKey, + cmd.P2PWhitelist, + cmd.StaticPeers, + }, + }, + { + Name: "log", + Flags: []cli.Flag{ + cmd.LogFormat, + cmd.LogFileName, }, }, { diff --git a/beacon-chain/usage_test.go b/beacon-chain/usage_test.go new file mode 100644 index 000000000..a8652d502 --- /dev/null +++ b/beacon-chain/usage_test.go @@ -0,0 +1,41 @@ +package main + +import ( + "testing" + + "github.com/urfave/cli" +) + +func TestAllFlagsExistInHelp(t *testing.T) { + // If this test is failing, it is because you've recently added/removed a + // flag in beacon chain main.go, but did not add/remove it to the usage.go + // flag grouping (appHelpFlagGroups). + + var helpFlags []cli.Flag + for _, group := range appHelpFlagGroups { + helpFlags = append(helpFlags, group.Flags...) + } + + for _, flag := range appFlags { + if !doesFlagExist(flag, helpFlags) { + t.Errorf("Flag %s does not exist in help/usage flags.", flag.GetName()) + } + } + + for _, flag := range helpFlags { + if !doesFlagExist(flag, appFlags) { + t.Errorf("Flag %s does not exist in main.go, "+ + "but exists in help flags", flag.GetName()) + } + } +} + +func doesFlagExist(flag cli.Flag, flags []cli.Flag) bool { + for _, f := range flags { + if f == flag { + return true + } + } + + return false +} diff --git a/beacon-chain/utils/flags.go b/beacon-chain/utils/flags.go index 493ed51ea..81f1496e8 100644 --- a/beacon-chain/utils/flags.go +++ b/beacon-chain/utils/flags.go @@ -28,10 +28,10 @@ var ( Usage: "Deposit contract address. Beacon chain node will listen logs coming from the deposit contract to determine when validator is eligible to participate.", } // RPCPort defines a beacon node RPC port to open. - RPCPort = cli.StringFlag{ + RPCPort = cli.IntFlag{ Name: "rpc-port", Usage: "RPC port exposed by a beacon node", - Value: "4000", + Value: 4000, } // CertFlag defines a flag for the node's TLS certificate. CertFlag = cli.StringFlag{ @@ -48,4 +48,9 @@ var ( Name: "enable-db-cleanup", Usage: "Enable automatic DB cleanup routine", } + // GRPCGatewayPort enables a gRPC gateway to be exposed for Prysm. + GRPCGatewayPort = cli.IntFlag{ + Name: "grpc-gateway-port", + Usage: "Enable gRPC gateway for JSON requests", + } ) diff --git a/k8s/api.prylabs.net.yaml b/k8s/api.prylabs.net.yaml index 2f50451b7..245e1f658 100644 --- a/k8s/api.prylabs.net.yaml +++ b/k8s/api.prylabs.net.yaml @@ -9,6 +9,23 @@ spec: gateways: - prylabs-wildcard-gateway http: + - match: + - uri: + prefix: /v1/beacon + - uri: + prefix: /swagger/ + route: + - destination: + port: + number: 8000 + host: public-api-gateway.beacon-chain.svc.cluster.local + corsPolicy: + allowOrigin: + - "*" + allowHeaders: + - content-type + allowMethods: + - GET - match: - uri: prefix: /faucet.FaucetService @@ -76,4 +93,19 @@ spec: - grpc-status - grpc-message retries: - attempts: 3 \ No newline at end of file + attempts: 3 + - match: + - uri: + prefix: / + route: + - destination: + port: + number: 8080 + host: public-api-ui.beacon-chain.svc.cluster.local + corsPolicy: + allowOrigin: + - "*" + allowHeaders: + - content-type + allowMethods: + - GET \ No newline at end of file diff --git a/k8s/beacon-chain/public-api.yaml b/k8s/beacon-chain/public-api.yaml new file mode 100644 index 000000000..98db23340 --- /dev/null +++ b/k8s/beacon-chain/public-api.yaml @@ -0,0 +1,151 @@ +kind: Deployment +apiVersion: apps/v1 +metadata: + name: public-api-swagger-ui + namespace: beacon-chain + labels: + app: beacon-chain + component: public-api-swagger-ui + version: production +spec: + replicas: 1 + selector: + matchLabels: + app: beacon-chain + component: public-api-swagger-ui + version: production + template: + metadata: + labels: + app: beacon-chain + component: public-api-swagger-ui + version: production + spec: + priorityClassName: production-priority + containers: + - name: ui + image: swaggerapi/swagger-ui:v3.0.5 + ports: + - containerPort: 8080 + name: http-ui + env: + - name: API_URL + value: https://api.prylabs.net/swagger/services.swagger.json + livenessProbe: + httpGet: + path: / + port: 8080 + initialDelaySeconds: 3 + periodSeconds: 15 + resources: + requests: + cpu: "100m" +--- +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: public-api-swagger-ui + namespace: beacon-chain +spec: + scaleTargetRef: + apiVersion: extensions/v1beta1 + kind: Deployment + name: public-api-swagger-ui + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + targetAverageUtilization: 80 +--- +kind: Deployment +apiVersion: apps/v1 +metadata: + name: public-api-gateway + namespace: beacon-chain + labels: + app: beacon-chain + component: public-api-gateway + version: production +spec: + replicas: 1 + selector: + matchLabels: + app: beacon-chain + component: public-api-gateway + version: production + template: + metadata: + labels: + app: beacon-chain + component: public-api-gateway + version: production + spec: + priorityClassName: production-priority + containers: + - name: server + image: gcr.io/prysmaticlabs/prysm/beacon-chain/gateway:latest + args: + - --beacon-rpc=beacon-chain.beacon-chain.svc.cluster.local:4000 + - --port=8000 + ports: + - containerPort: 8000 + name: http-gateway + livenessProbe: + httpGet: + path: /healthz + port: 8000 + initialDelaySeconds: 3 + periodSeconds: 15 + resources: + requests: + cpu: "100m" +--- +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: public-api-gateway + namespace: beacon-chain +spec: + scaleTargetRef: + apiVersion: extensions/v1beta1 + kind: Deployment + name: public-api-gateway + minReplicas: 1 + maxReplicas: 10 + metrics: + - type: Resource + resource: + name: cpu + targetAverageUtilization: 80 +--- +kind: Service +apiVersion: v1 +metadata: + name: public-api-gateway + namespace: beacon-chain +spec: + selector: + app: beacon-chain + component: public-api-gateway + ports: + - port: 8000 + targetPort: 8000 + name: http + type: ClusterIP +--- +kind: Service +apiVersion: v1 +metadata: + name: public-api-ui + namespace: beacon-chain +spec: + selector: + app: beacon-chain + component: public-api-swagger-ui + ports: + - port: 8080 + targetPort: 8080 + name: http + type: ClusterIP diff --git a/proto/beacon/rpc/v1/BUILD.bazel b/proto/beacon/rpc/v1/BUILD.bazel index d670267de..2b40a0af7 100644 --- a/proto/beacon/rpc/v1/BUILD.bazel +++ b/proto/beacon/rpc/v1/BUILD.bazel @@ -1,17 +1,37 @@ # gazelle:ignore load("@io_bazel_rules_go//go:def.bzl", "go_library") load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library") +load("@grpc_ecosystem_grpc_gateway//protoc-gen-swagger:defs.bzl", "protoc_gen_swagger") go_proto_library( name = "v1_go_proto", + compiler = "//:grpc_proto_compiler", importpath = "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1", proto = ":v1_proto", visibility = ["//visibility:public"], deps = [ "//proto/beacon/p2p/v1:go_default_library", "//proto/sharding/p2p/v1:go_default_library", + "@go_googleapis//google/api:annotations_go_proto", + "@grpc_ecosystem_grpc_gateway//protoc-gen-swagger/options:options_go_proto", + ], +) + +go_proto_library( + name = "v1_grpc_gateway_proto", + compilers = [ + "//:grpc_nogogo_proto_compiler", + "//:grpc_gateway_proto_compiler", + ], + importpath = "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1_gateway", + proto = ":v1_proto", + visibility = ["//visibility:public"], + deps = [ + "//proto/beacon/p2p/v1:go_default_library", + "//proto/sharding/p2p/v1:go_default_library", + "@go_googleapis//google/api:annotations_go_proto", + "@grpc_ecosystem_grpc_gateway//protoc-gen-swagger/options:options_go_proto", ], - compiler = "//:grpc_proto_compiler", ) go_library( @@ -23,12 +43,22 @@ go_library( proto_library( name = "v1_proto", - srcs = ["services.proto"], + srcs = [ + "services.proto", + ], visibility = ["//visibility:public"], deps = [ "//proto/beacon/p2p/v1:v1_proto", "//proto/sharding/p2p/v1:v1_proto", "@com_google_protobuf//:empty_proto", "@com_google_protobuf//:timestamp_proto", + "@go_googleapis//google/api:annotations_proto", + "@grpc_ecosystem_grpc_gateway//protoc-gen-swagger/options:options_proto", ], ) + +protoc_gen_swagger( + name = "swagger", + proto = ":v1_proto", + visibility = ["//visibility:public"], +) diff --git a/proto/beacon/rpc/v1/services.pb.go b/proto/beacon/rpc/v1/services.pb.go index 9d297b36d..bd62baff0 100755 --- a/proto/beacon/rpc/v1/services.pb.go +++ b/proto/beacon/rpc/v1/services.pb.go @@ -9,7 +9,9 @@ import ( fmt "fmt" proto "github.com/gogo/protobuf/proto" types "github.com/gogo/protobuf/types" + _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" v1 "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1" + _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" io "io" math "math" @@ -1763,130 +1765,150 @@ func init() { func init() { proto.RegisterFile("proto/beacon/rpc/v1/services.proto", fileDescriptor_9eb4e94b85965285) } var fileDescriptor_9eb4e94b85965285 = []byte{ - // 1967 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0x4b, 0x6f, 0xdb, 0xc8, - 0x1d, 0x5f, 0xca, 0xb2, 0x23, 0xff, 0x25, 0x5b, 0xf4, 0xf8, 0x21, 0x45, 0xce, 0xc3, 0xcb, 0x05, - 0x1a, 0x27, 0x68, 0xe4, 0x44, 0x59, 0x64, 0x77, 0x13, 0x04, 0x5b, 0xc9, 0x96, 0x13, 0x75, 0x0d, - 0xc5, 0xa1, 0xb4, 0x4e, 0x5b, 0x14, 0x20, 0x46, 0xd2, 0x58, 0x66, 0x2d, 0x71, 0x18, 0x72, 0x64, - 0xc4, 0x97, 0x2d, 0x7a, 0x2c, 0x7a, 0xeb, 0x07, 0x68, 0xbf, 0x44, 0x8b, 0x9e, 0x7b, 0xeb, 0xb1, - 0x9f, 0xa0, 0x28, 0x82, 0xa2, 0xbd, 0xf7, 0x13, 0x14, 0xf3, 0x20, 0x45, 0x51, 0xa2, 0x2d, 0xf7, - 0x46, 0xfe, 0x9f, 0x33, 0xbf, 0xf9, 0xbf, 0x66, 0xc0, 0x70, 0x3d, 0xca, 0xe8, 0x5e, 0x87, 0xe0, - 0x2e, 0x75, 0xf6, 0x3c, 0xb7, 0xbb, 0x77, 0xf1, 0x74, 0xcf, 0x27, 0xde, 0x85, 0xdd, 0x25, 0x7e, - 0x59, 0x30, 0xd1, 0x16, 0x61, 0x67, 0xc4, 0x23, 0xa3, 0x61, 0x59, 0x8a, 0x95, 0x3d, 0xb7, 0x5b, - 0xbe, 0x78, 0x5a, 0xda, 0xee, 0x53, 0xda, 0x1f, 0x90, 0x3d, 0x21, 0xd5, 0x19, 0x9d, 0xee, 0x91, - 0xa1, 0xcb, 0x2e, 0xa5, 0x52, 0xe9, 0x7e, 0x9c, 0xc9, 0xec, 0x21, 0xf1, 0x19, 0x1e, 0xba, 0x81, - 0xc0, 0x84, 0x67, 0xb7, 0xe2, 0x72, 0xcf, 0xec, 0xd2, 0x0d, 0xdc, 0x1a, 0xc7, 0xb0, 0x7d, 0x82, - 0x07, 0x76, 0x0f, 0x33, 0xea, 0x1d, 0x13, 0xef, 0x94, 0x7a, 0x43, 0xec, 0x74, 0x89, 0x49, 0x3e, - 0x8c, 0x88, 0xcf, 0x10, 0x82, 0xb4, 0x3f, 0xa0, 0xac, 0xa8, 0xed, 0x68, 0xbb, 0x69, 0x53, 0x7c, - 0xa3, 0xbb, 0x00, 0xee, 0xa8, 0x33, 0xb0, 0xbb, 0xd6, 0x39, 0xb9, 0x2c, 0xa6, 0x76, 0xb4, 0xdd, - 0x9c, 0xb9, 0x2c, 0x29, 0xdf, 0x91, 0x4b, 0xe3, 0x5f, 0x1a, 0xdc, 0x99, 0x6d, 0xd2, 0x77, 0xa9, - 0xe3, 0x13, 0x54, 0x84, 0x5b, 0x1d, 0x3c, 0xe0, 0x24, 0x65, 0x36, 0xf8, 0x45, 0x0f, 0x41, 0x67, - 0x94, 0xe1, 0x81, 0x75, 0x11, 0xe8, 0xfb, 0xc2, 0x7e, 0xda, 0xcc, 0x0b, 0x7a, 0x68, 0xd6, 0x47, - 0xcf, 0xa1, 0x20, 0x45, 0x71, 0x97, 0xd9, 0x17, 0x24, 0xaa, 0xb1, 0x20, 0x34, 0x36, 0x05, 0xbb, - 0x2a, 0xb8, 0x11, 0xbd, 0xd7, 0xb0, 0x83, 0x2f, 0x88, 0x87, 0xfb, 0x64, 0x4a, 0xd3, 0x0a, 0x56, - 0x95, 0xde, 0xd1, 0x76, 0x53, 0xe6, 0x5d, 0x25, 0x17, 0x33, 0x51, 0x93, 0x42, 0xc6, 0x2b, 0x28, - 0x85, 0x34, 0x21, 0x82, 0x99, 0x4d, 0x9d, 0x00, 0xb7, 0xfb, 0x90, 0x1d, 0x63, 0xe4, 0x17, 0xb5, - 0x9d, 0x85, 0xdd, 0x9c, 0x09, 0x21, 0x48, 0xbe, 0xf1, 0xc7, 0x54, 0x04, 0xf8, 0xa8, 0xbe, 0x02, - 0xe9, 0x39, 0x6c, 0x62, 0x49, 0x25, 0x3d, 0x6b, 0xca, 0x54, 0x2d, 0x55, 0xd4, 0xcc, 0xf5, 0x50, - 0xe0, 0x38, 0xb4, 0x8b, 0x4e, 0x20, 0xe3, 0x33, 0xcc, 0x46, 0x3e, 0xe1, 0xd0, 0x2d, 0xec, 0x66, - 0x2b, 0x2f, 0xca, 0xb3, 0x23, 0xab, 0x7c, 0x85, 0xfb, 0x72, 0x4b, 0xd8, 0x30, 0x43, 0x5b, 0x25, - 0x17, 0x96, 0x24, 0x2d, 0x76, 0xfc, 0x5a, 0xec, 0xf8, 0xd1, 0x6b, 0x58, 0x92, 0x4a, 0xe2, 0xe4, - 0xb2, 0x95, 0xbd, 0x6b, 0xdd, 0x2b, 0x5f, 0xca, 0xb5, 0xa9, 0xd4, 0x8d, 0x17, 0x50, 0xa8, 0x7f, - 0xb4, 0x19, 0xe9, 0x8d, 0x4f, 0x6f, 0x6e, 0x74, 0x5f, 0x42, 0x71, 0x5a, 0x57, 0x21, 0x7b, 0xad, - 0x72, 0x0d, 0xb6, 0xaa, 0x8c, 0xf1, 0x34, 0xe2, 0x90, 0x1c, 0x60, 0x86, 0x03, 0xbf, 0x1b, 0xb0, - 0xe8, 0x9f, 0x61, 0xaf, 0xa7, 0xe2, 0x56, 0xfe, 0x84, 0x39, 0x92, 0x1a, 0xe7, 0x88, 0xf1, 0x29, - 0x05, 0x85, 0x29, 0x23, 0x6a, 0x01, 0x5f, 0x41, 0x51, 0x22, 0x61, 0x75, 0x06, 0xb4, 0x7b, 0x6e, - 0x79, 0x94, 0x32, 0xeb, 0x0c, 0xfb, 0x67, 0xcf, 0x2a, 0x0a, 0xce, 0x4d, 0xc9, 0xaf, 0x71, 0xb6, - 0x49, 0x29, 0x7b, 0x23, 0x98, 0xe8, 0x25, 0x94, 0x88, 0x4b, 0xbb, 0x67, 0x56, 0x87, 0x8e, 0x9c, - 0x1e, 0xf6, 0x2e, 0x27, 0x54, 0x65, 0x22, 0x16, 0x84, 0x44, 0x4d, 0x09, 0x44, 0x94, 0x1f, 0x40, - 0xfe, 0x57, 0x23, 0x9f, 0xd9, 0xa7, 0x36, 0xe9, 0x59, 0x42, 0x48, 0x25, 0xca, 0x6a, 0x48, 0xae, - 0x73, 0x2a, 0x7a, 0x05, 0xdb, 0x63, 0xc1, 0xe9, 0x15, 0xa6, 0x85, 0x9b, 0x62, 0x28, 0x12, 0x5f, - 0xe4, 0x11, 0xe8, 0x03, 0xcc, 0x37, 0x6e, 0x75, 0x3d, 0xea, 0xfb, 0x03, 0xdb, 0x39, 0x2f, 0x2e, - 0x8a, 0x48, 0xf8, 0x7c, 0x2a, 0x12, 0xdc, 0x8a, 0xcb, 0x23, 0x61, 0x3f, 0x10, 0x34, 0xf3, 0x52, - 0x35, 0x24, 0xa0, 0x6d, 0x58, 0x3e, 0x23, 0xb8, 0x67, 0x09, 0x80, 0x97, 0xc4, 0x7a, 0x33, 0x9c, - 0xd0, 0xe2, 0x20, 0xff, 0x56, 0x83, 0xd2, 0x31, 0x71, 0x7a, 0xb6, 0xd3, 0x8f, 0x60, 0x1d, 0x46, - 0xc9, 0x4b, 0x28, 0x9d, 0xda, 0x03, 0x46, 0x3c, 0xcb, 0x23, 0xb8, 0x77, 0x69, 0x9d, 0x52, 0xcf, - 0xb2, 0x9d, 0xee, 0x60, 0xe4, 0xdb, 0xd4, 0x11, 0x48, 0x67, 0xcc, 0x82, 0x94, 0x30, 0xb9, 0xc0, - 0x21, 0xf5, 0x1a, 0x01, 0x1b, 0x95, 0x61, 0xdd, 0xf5, 0xa8, 0x4b, 0x7d, 0x3c, 0x50, 0x20, 0x44, - 0xce, 0x78, 0x2d, 0x60, 0x89, 0xcd, 0x8b, 0xb5, 0x8c, 0x60, 0x7b, 0xe6, 0x52, 0xd4, 0x99, 0x9f, - 0xc0, 0x86, 0x2b, 0xd9, 0x16, 0x8e, 0xf0, 0x45, 0xf4, 0x65, 0x2b, 0x5f, 0x24, 0x21, 0x13, 0xb1, - 0x65, 0xae, 0xbb, 0xd3, 0xf6, 0x8d, 0x77, 0x80, 0xf6, 0xcf, 0xb0, 0xed, 0xb4, 0x18, 0xf6, 0x58, - 0xb4, 0xc2, 0xfa, 0x9c, 0x40, 0x7a, 0x6a, 0x9b, 0xc1, 0x2f, 0xfa, 0x1c, 0x72, 0x7d, 0xe2, 0x10, - 0xdf, 0xf6, 0x2d, 0xde, 0x2a, 0xd4, 0x7e, 0xb2, 0x8a, 0xd6, 0xb6, 0x87, 0xc4, 0xf8, 0x43, 0x0a, - 0x56, 0x8f, 0xc5, 0xfe, 0x48, 0x34, 0xdf, 0xb0, 0x47, 0x1c, 0x19, 0x04, 0x2a, 0x48, 0x41, 0x92, - 0xf8, 0xb1, 0x73, 0x01, 0x0e, 0x8f, 0xe5, 0x8c, 0x86, 0x1d, 0xe2, 0x29, 0xab, 0xc0, 0x49, 0x4d, - 0x41, 0x41, 0x5f, 0xc0, 0x8a, 0x87, 0x9d, 0x1e, 0xa6, 0x96, 0x47, 0x2e, 0x08, 0x1e, 0x88, 0xd8, - 0xcb, 0x99, 0x39, 0x49, 0x34, 0x05, 0x0d, 0xed, 0xc1, 0x7a, 0x04, 0x1c, 0xab, 0x63, 0xb3, 0x21, - 0xf6, 0xcf, 0x55, 0xc4, 0xa1, 0x08, 0xab, 0x26, 0x39, 0xe8, 0x05, 0xdc, 0x8e, 0x2a, 0xe0, 0x7e, - 0xdf, 0x23, 0x7d, 0xcc, 0x88, 0xe5, 0xdb, 0xfd, 0xe2, 0xe2, 0xce, 0xc2, 0x6e, 0xda, 0x2c, 0x44, - 0x04, 0xaa, 0x01, 0xbf, 0x65, 0xf7, 0xd1, 0xd7, 0xb0, 0x1c, 0x36, 0x4b, 0x11, 0x59, 0xd9, 0x4a, - 0xa9, 0x2c, 0xdb, 0x69, 0x39, 0x68, 0xa7, 0xe5, 0x76, 0x20, 0x61, 0x8e, 0x85, 0x8d, 0x57, 0x90, - 0x0f, 0xf1, 0x51, 0x80, 0x3f, 0x82, 0xb5, 0xa4, 0x5c, 0xce, 0x77, 0x26, 0x13, 0xc4, 0xf8, 0x0a, - 0x36, 0x94, 0xba, 0xd7, 0x70, 0x7a, 0xe4, 0x63, 0x04, 0xe4, 0x28, 0x86, 0x5a, 0x1c, 0x43, 0xe3, - 0x31, 0x6c, 0xc6, 0x14, 0x95, 0xf7, 0x0d, 0x58, 0xb4, 0x39, 0x21, 0x28, 0x4b, 0xe2, 0xc7, 0xa8, - 0xc0, 0x1a, 0xaf, 0xac, 0x84, 0xbb, 0x0e, 0x45, 0xef, 0x02, 0x70, 0x30, 0x88, 0x58, 0x68, 0x50, - 0xbc, 0xfd, 0x40, 0xcc, 0x78, 0x09, 0xab, 0x32, 0xbc, 0x42, 0x85, 0x87, 0xa0, 0x47, 0x21, 0x8e, - 0x9c, 0x7f, 0x3e, 0x42, 0xe7, 0x5b, 0x33, 0x9e, 0xc3, 0x66, 0x58, 0x6e, 0x27, 0x76, 0x76, 0x75, - 0xc7, 0x30, 0xca, 0xb0, 0x15, 0xd7, 0xbb, 0x72, 0x63, 0x16, 0x6c, 0xef, 0xd3, 0xe1, 0xd0, 0x66, - 0x8c, 0x90, 0xaa, 0xef, 0xdb, 0x7d, 0x67, 0x48, 0x1c, 0x16, 0x6d, 0x0e, 0xb2, 0x4a, 0x8a, 0x98, - 0x0f, 0x70, 0x14, 0x24, 0x91, 0x25, 0xf1, 0x06, 0x90, 0x9a, 0x6a, 0x00, 0x04, 0x0a, 0x2a, 0x97, - 0x0f, 0x88, 0x4b, 0x7d, 0x9b, 0x8d, 0xf3, 0xf8, 0xa7, 0xa0, 0x07, 0x79, 0xdc, 0x53, 0x3c, 0x95, - 0xc3, 0xf7, 0x93, 0x72, 0x58, 0xd9, 0x30, 0xf3, 0xee, 0xa4, 0x4d, 0xe3, 0x3f, 0xa9, 0x99, 0x1b, - 0x09, 0x7d, 0xf5, 0x01, 0x70, 0x48, 0x55, 0x5e, 0x5e, 0x27, 0x75, 0xd3, 0x2b, 0x0c, 0xcd, 0xe4, - 0x45, 0x4c, 0x97, 0xfe, 0xa1, 0xc1, 0xfa, 0x0c, 0x19, 0x74, 0x07, 0x96, 0xbb, 0x01, 0x59, 0xf8, - 0x4f, 0x9b, 0x63, 0xc2, 0xb8, 0x19, 0xa6, 0x66, 0x35, 0xc3, 0x85, 0xc8, 0xc0, 0x78, 0x1f, 0xb2, - 0xb6, 0x6f, 0xb9, 0x2a, 0x76, 0x45, 0x3e, 0x67, 0x4c, 0xb0, 0xfd, 0x20, 0x9a, 0x63, 0x01, 0xb2, - 0x18, 0x1f, 0x29, 0xbe, 0x0d, 0x47, 0x0a, 0x9e, 0xa7, 0xab, 0x95, 0x07, 0xf3, 0x8e, 0x14, 0xc1, - 0x28, 0xf1, 0x97, 0x14, 0x14, 0x12, 0xc6, 0x8d, 0x88, 0x71, 0xed, 0xff, 0x32, 0x8e, 0xbe, 0x81, - 0xdb, 0x84, 0x9d, 0x3d, 0x0d, 0xe2, 0x41, 0x75, 0x8b, 0x89, 0x4a, 0xc8, 0x67, 0xfb, 0xa7, 0xea, - 0xdc, 0x45, 0xcb, 0x50, 0x55, 0xf1, 0x4b, 0xd8, 0x0a, 0xb4, 0xc2, 0xc6, 0x64, 0x45, 0xe0, 0xdb, - 0x50, 0xdc, 0xb0, 0x2d, 0xf1, 0x56, 0x23, 0x52, 0x32, 0x9c, 0xd8, 0x54, 0x2b, 0x4f, 0xcb, 0x29, - 0x79, 0x4c, 0x97, 0xbd, 0xfc, 0x5b, 0xb8, 0x23, 0x0c, 0x70, 0x41, 0xdb, 0xb1, 0x22, 0x6a, 0x1f, - 0x46, 0x64, 0x44, 0x04, 0xd4, 0x69, 0xf3, 0x76, 0x20, 0xd3, 0x70, 0xc6, 0xa3, 0xe0, 0x3b, 0x2e, - 0x60, 0xbc, 0x03, 0xbd, 0xce, 0xd7, 0x1e, 0x9d, 0x5f, 0x5e, 0xc1, 0xb2, 0xdc, 0x30, 0x66, 0x58, - 0x80, 0x96, 0xad, 0xec, 0x24, 0x05, 0x7f, 0xa8, 0x9c, 0x21, 0xea, 0xcb, 0xf8, 0x7d, 0x0a, 0xd6, - 0x04, 0x08, 0x6d, 0x8f, 0x8c, 0x2b, 0xe8, 0x21, 0xa4, 0x99, 0xa7, 0xc2, 0x2c, 0x5b, 0xa9, 0x24, - 0x1d, 0xc2, 0x94, 0x62, 0x99, 0xff, 0x34, 0x69, 0x8f, 0x98, 0x42, 0xbf, 0xf4, 0x27, 0x0d, 0x32, - 0x01, 0x09, 0x7d, 0x03, 0x8b, 0xe2, 0x34, 0xd4, 0x2a, 0x13, 0xdb, 0x6c, 0x2d, 0x32, 0x6e, 0x49, - 0x0d, 0x1e, 0x92, 0xe3, 0x8a, 0x1e, 0x5c, 0x72, 0xc2, 0x52, 0x8e, 0x1e, 0x03, 0x72, 0xb1, 0xc7, - 0xec, 0xae, 0xed, 0x8a, 0x09, 0xfd, 0x82, 0x32, 0x12, 0xdc, 0x3c, 0xd6, 0xa2, 0x9c, 0x13, 0xce, - 0xe0, 0x19, 0xa0, 0x2e, 0x36, 0x42, 0x4e, 0x9e, 0x16, 0xc8, 0x3b, 0x0d, 0xa7, 0x18, 0x47, 0xb0, - 0xc1, 0x57, 0x1d, 0xce, 0x13, 0x41, 0x31, 0xdb, 0x86, 0x65, 0xd1, 0x14, 0x4e, 0x3d, 0x3a, 0x54, - 0xa5, 0x2c, 0xc3, 0x09, 0x87, 0x1e, 0x1d, 0xa2, 0x02, 0xdc, 0x12, 0x4c, 0x46, 0x55, 0x9c, 0x2d, - 0xf1, 0xdf, 0x36, 0x7d, 0xf4, 0x35, 0xac, 0x84, 0xd1, 0x6a, 0xd2, 0x01, 0x41, 0x59, 0xb8, 0xf5, - 0x7d, 0xf3, 0xbb, 0xe6, 0xdb, 0xf7, 0x4d, 0xfd, 0x33, 0x94, 0x83, 0x4c, 0xb5, 0xdd, 0xae, 0xb7, - 0xda, 0x75, 0x53, 0xd7, 0xf8, 0xdf, 0xb1, 0xf9, 0xf6, 0xf8, 0x6d, 0xab, 0x6e, 0xea, 0xa9, 0x47, - 0xbf, 0xd3, 0x20, 0x1f, 0x0b, 0x74, 0x84, 0x60, 0x55, 0x29, 0x5b, 0xad, 0x76, 0xb5, 0xfd, 0x7d, - 0x4b, 0xff, 0x8c, 0xd3, 0x8e, 0xeb, 0xcd, 0x83, 0x46, 0xf3, 0xb5, 0x55, 0xdd, 0x6f, 0x37, 0x4e, - 0xea, 0xba, 0x86, 0x00, 0x96, 0xd4, 0x77, 0x8a, 0xf3, 0x1b, 0xcd, 0x46, 0xbb, 0x51, 0x6d, 0xd7, - 0x0f, 0xac, 0xfa, 0xcf, 0x1a, 0x6d, 0x7d, 0x01, 0xe9, 0x90, 0x7b, 0xdf, 0x68, 0xbf, 0x39, 0x30, - 0xab, 0xef, 0xab, 0xb5, 0xa3, 0xba, 0x9e, 0xe6, 0x1a, 0x9c, 0x57, 0x3f, 0xd0, 0x17, 0xb9, 0x86, - 0xfc, 0xb6, 0x5a, 0x47, 0xd5, 0xd6, 0x9b, 0xfa, 0x81, 0xbe, 0x54, 0xf9, 0xf3, 0x22, 0xac, 0xc8, - 0xb3, 0x69, 0xc9, 0xcb, 0x32, 0xfa, 0x39, 0xac, 0xbd, 0xc7, 0x36, 0x3b, 0xa4, 0xde, 0x78, 0xec, - 0x41, 0x5b, 0x53, 0x7d, 0xbb, 0xce, 0xef, 0xc8, 0xa5, 0x47, 0x89, 0xc5, 0x72, 0x6a, 0x64, 0x7a, - 0xa2, 0xa1, 0x23, 0x58, 0xd9, 0xc7, 0x0e, 0x75, 0xec, 0x2e, 0x1e, 0xbc, 0x21, 0xb8, 0x97, 0x68, - 0x76, 0x9e, 0x30, 0x42, 0x26, 0xac, 0x1d, 0x89, 0x59, 0x36, 0x32, 0xae, 0xdd, 0xdc, 0x62, 0x44, - 0xf9, 0x89, 0x86, 0x7e, 0x01, 0xf9, 0x58, 0x5f, 0x4a, 0xb4, 0x98, 0x78, 0xeb, 0x4a, 0x6a, 0x6c, - 0x47, 0x90, 0x09, 0x72, 0x35, 0xd1, 0xe8, 0x6e, 0x92, 0xd1, 0xa9, 0x12, 0xf1, 0x13, 0xc8, 0x1c, - 0x52, 0xef, 0xfc, 0x4a, 0x6b, 0x77, 0x92, 0x36, 0xcd, 0x35, 0x51, 0x13, 0x96, 0xc3, 0x5c, 0x4f, - 0x34, 0xf1, 0x70, 0xee, 0x32, 0x81, 0xce, 0x41, 0x0f, 0x89, 0xb5, 0x4b, 0x9e, 0x62, 0x3e, 0xfa, - 0x71, 0x92, 0xfa, 0xac, 0x54, 0xbc, 0x81, 0xb3, 0xca, 0xbf, 0x35, 0xc8, 0xcb, 0xa3, 0x23, 0xde, - 0x38, 0x72, 0x41, 0x92, 0x44, 0x6c, 0xcd, 0x73, 0xe2, 0xa5, 0x1f, 0x25, 0x79, 0x8c, 0xcd, 0x68, - 0x1f, 0x61, 0x33, 0x76, 0xd7, 0xac, 0x32, 0xd1, 0x29, 0xca, 0x57, 0x1b, 0x88, 0xdf, 0x6f, 0x93, - 0xa3, 0x26, 0xe1, 0x2a, 0x5b, 0xf9, 0xeb, 0x42, 0x38, 0x0b, 0x87, 0x1b, 0x1d, 0xc0, 0xca, 0xc4, - 0x98, 0x9a, 0x0c, 0xf3, 0xac, 0x31, 0xb8, 0xf4, 0x78, 0x4e, 0x69, 0xb5, 0xf7, 0x1f, 0x60, 0x7d, - 0xc6, 0xbd, 0x0b, 0x55, 0xae, 0x89, 0xff, 0x19, 0xf7, 0xc5, 0xd2, 0xb3, 0x1b, 0xe9, 0x28, 0xff, - 0xbf, 0x84, 0x9c, 0x5a, 0x98, 0xcc, 0xfb, 0x79, 0x8a, 0x43, 0xe9, 0xc1, 0x35, 0x7b, 0x0c, 0xad, - 0x77, 0x40, 0xdf, 0xa7, 0x43, 0x77, 0xc4, 0x48, 0x38, 0xca, 0xcf, 0xe7, 0x21, 0x31, 0x58, 0xa7, - 0xae, 0x04, 0x95, 0xff, 0x2e, 0x82, 0x3e, 0x2e, 0xf9, 0xea, 0x10, 0x7f, 0x08, 0xeb, 0xec, 0x78, - 0x22, 0x48, 0x06, 0x35, 0xf9, 0x21, 0x2c, 0x19, 0xd4, 0x2b, 0x5e, 0x9f, 0x9e, 0x68, 0x88, 0xc2, - 0xea, 0xe4, 0x9d, 0x00, 0x3d, 0xbe, 0xd6, 0xd0, 0x44, 0x18, 0x95, 0xe7, 0x15, 0x57, 0x48, 0xff, - 0x7a, 0xf6, 0x08, 0xfc, 0xec, 0x06, 0xf3, 0xf6, 0xf5, 0x81, 0x74, 0xd5, 0xb4, 0xff, 0x61, 0xba, - 0xf1, 0xde, 0x70, 0xcb, 0x37, 0x7d, 0x69, 0x43, 0xbf, 0xd1, 0x60, 0x63, 0xd6, 0x4b, 0x2d, 0xba, - 0xfe, 0xd0, 0xa6, 0x9f, 0x8a, 0x4b, 0x5f, 0xde, 0x4c, 0x49, 0xad, 0x61, 0x04, 0x7a, 0xfc, 0xa5, - 0x0e, 0x25, 0x6e, 0x24, 0xe1, 0x3d, 0xb0, 0xf4, 0x64, 0x7e, 0x05, 0xe9, 0xb6, 0x96, 0xfb, 0xdb, - 0xa7, 0x7b, 0xda, 0xdf, 0x3f, 0xdd, 0xd3, 0xfe, 0xf9, 0xe9, 0x9e, 0xd6, 0x59, 0x12, 0x7d, 0xe5, - 0xd9, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x2c, 0xec, 0x2c, 0x7e, 0xa8, 0x17, 0x00, 0x00, + // 2278 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x59, 0x4d, 0x6f, 0x1b, 0xc7, + 0xf9, 0xcf, 0x52, 0x94, 0x22, 0x3d, 0x92, 0x45, 0x6a, 0xf4, 0x6a, 0xca, 0x2f, 0x9b, 0xcd, 0x1f, + 0xb1, 0x2c, 0x44, 0x4b, 0x99, 0x0e, 0x9c, 0x44, 0x86, 0x91, 0x50, 0x12, 0x25, 0x33, 0x11, 0x68, + 0x79, 0x49, 0xdb, 0xff, 0x16, 0x05, 0xb6, 0xc3, 0xe5, 0x88, 0xdc, 0x88, 0xdc, 0x59, 0xef, 0x0e, + 0x19, 0xb3, 0x87, 0x14, 0xed, 0xa5, 0x28, 0x7a, 0x73, 0xef, 0xcd, 0x97, 0x28, 0x50, 0xa0, 0xb7, + 0xde, 0x8a, 0x9e, 0x0a, 0xf4, 0x58, 0xa0, 0x28, 0x8c, 0xa0, 0xbd, 0xf7, 0x13, 0x14, 0x33, 0x3b, + 0xbb, 0x5c, 0x91, 0x5c, 0x89, 0xea, 0x49, 0xdc, 0xe7, 0x75, 0xe6, 0x37, 0xcf, 0xdb, 0x8c, 0x40, + 0x73, 0x3d, 0xca, 0x68, 0xbe, 0x4e, 0xb0, 0x45, 0x9d, 0xbc, 0xe7, 0x5a, 0xf9, 0xde, 0x83, 0xbc, + 0x4f, 0xbc, 0x9e, 0x6d, 0x11, 0x5f, 0x17, 0x4c, 0xb4, 0x46, 0x58, 0x8b, 0x78, 0xa4, 0xdb, 0xd1, + 0x03, 0x31, 0xdd, 0x73, 0x2d, 0xbd, 0xf7, 0x20, 0xb7, 0xd9, 0xa4, 0xb4, 0xd9, 0x26, 0x79, 0x21, + 0x55, 0xef, 0x9e, 0xe5, 0x49, 0xc7, 0x65, 0xfd, 0x40, 0x29, 0x77, 0x77, 0x98, 0xc9, 0xec, 0x0e, + 0xf1, 0x19, 0xee, 0xb8, 0xa1, 0xc0, 0x05, 0xcf, 0x6e, 0xc1, 0xe5, 0x9e, 0x59, 0xdf, 0x0d, 0xdd, + 0xe6, 0x6e, 0x49, 0x0b, 0xd8, 0xb5, 0xf3, 0xd8, 0x71, 0x28, 0xc3, 0xcc, 0xa6, 0x4e, 0xc8, 0xfd, + 0x58, 0xfc, 0xb1, 0x76, 0x9a, 0xc4, 0xd9, 0xf1, 0xbf, 0xc5, 0xcd, 0x26, 0xf1, 0xf2, 0xd4, 0x15, + 0x12, 0xa3, 0xd2, 0xda, 0x29, 0x6c, 0xbe, 0xc4, 0x6d, 0xbb, 0x81, 0x19, 0xf5, 0x4e, 0x89, 0x77, + 0x46, 0xbd, 0x0e, 0x76, 0x2c, 0x62, 0x90, 0xd7, 0x5d, 0xe2, 0x33, 0x84, 0x20, 0xed, 0xb7, 0x29, + 0xdb, 0x50, 0x54, 0x65, 0x2b, 0x6d, 0x88, 0xdf, 0xe8, 0x36, 0x80, 0xdb, 0xad, 0xb7, 0x6d, 0xcb, + 0x3c, 0x27, 0xfd, 0x8d, 0x94, 0xaa, 0x6c, 0x2d, 0x18, 0x73, 0x01, 0xe5, 0x6b, 0xd2, 0xd7, 0x7e, + 0x50, 0xe0, 0xd6, 0x78, 0x93, 0xbe, 0x4b, 0x1d, 0x9f, 0xa0, 0x0d, 0x78, 0xbf, 0x8e, 0xdb, 0x9c, + 0x24, 0xcd, 0x86, 0x9f, 0xe8, 0x3e, 0x64, 0x19, 0x65, 0xb8, 0x6d, 0xf6, 0x42, 0x7d, 0x5f, 0xd8, + 0x4f, 0x1b, 0x19, 0x41, 0x8f, 0xcc, 0xfa, 0xe8, 0x11, 0xac, 0x07, 0xa2, 0xd8, 0x62, 0x76, 0x8f, + 0xc4, 0x35, 0xa6, 0x84, 0xc6, 0xaa, 0x60, 0x17, 0x05, 0x37, 0xa6, 0x77, 0x0c, 0x2a, 0xee, 0x11, + 0x0f, 0x37, 0xc9, 0x88, 0xa6, 0x19, 0xae, 0x2a, 0xad, 0x2a, 0x5b, 0x29, 0xe3, 0xb6, 0x94, 0x1b, + 0x32, 0xb1, 0x1f, 0x08, 0x69, 0x4f, 0x20, 0x17, 0xd1, 0x84, 0x88, 0x80, 0x35, 0xc4, 0xed, 0x2e, + 0xcc, 0x0f, 0x30, 0xf2, 0x37, 0x14, 0x75, 0x6a, 0x6b, 0xc1, 0x80, 0x08, 0x24, 0x5f, 0xfb, 0x3e, + 0x15, 0x03, 0x3e, 0xae, 0x2f, 0x41, 0x7a, 0x04, 0xab, 0x38, 0xa0, 0x92, 0x86, 0x39, 0x62, 0x6a, + 0x3f, 0xb5, 0xa1, 0x18, 0xcb, 0x91, 0xc0, 0x69, 0x64, 0x17, 0xbd, 0x84, 0x59, 0x9f, 0x61, 0xd6, + 0xf5, 0x09, 0x87, 0x6e, 0x6a, 0x6b, 0xbe, 0xb0, 0xa7, 0x8f, 0x8f, 0x52, 0xfd, 0x12, 0xf7, 0x7a, + 0x55, 0xd8, 0x30, 0x22, 0x5b, 0x39, 0x17, 0x66, 0x02, 0xda, 0xd0, 0xf1, 0x2b, 0x43, 0xc7, 0x8f, + 0x8e, 0x61, 0x26, 0x50, 0x12, 0x27, 0x37, 0x5f, 0xc8, 0x5f, 0xe9, 0x5e, 0xfa, 0x92, 0xae, 0x0d, + 0xa9, 0xae, 0xed, 0xc1, 0x7a, 0xe9, 0x8d, 0xcd, 0x48, 0x63, 0x70, 0x7a, 0x13, 0xa3, 0xfb, 0x18, + 0x36, 0x46, 0x75, 0x25, 0xb2, 0x57, 0x2a, 0xef, 0xc3, 0x5a, 0x91, 0x31, 0x9e, 0x92, 0x1c, 0x92, + 0x43, 0xcc, 0x70, 0xe8, 0x77, 0x05, 0xa6, 0xfd, 0x16, 0xf6, 0x1a, 0x32, 0x6e, 0x83, 0x8f, 0x28, + 0x47, 0x52, 0x83, 0x1c, 0xd1, 0xde, 0xa5, 0x60, 0x7d, 0xc4, 0x88, 0x5c, 0xc0, 0xa7, 0xb0, 0x11, + 0x20, 0x61, 0xd6, 0xdb, 0xd4, 0x3a, 0x37, 0x3d, 0x4a, 0x99, 0xd9, 0xc2, 0x7e, 0xeb, 0x61, 0x41, + 0xc2, 0xb9, 0x1a, 0xf0, 0xf7, 0x39, 0xdb, 0xa0, 0x94, 0x3d, 0x15, 0x4c, 0xf4, 0x18, 0x72, 0xc4, + 0xa5, 0x56, 0xcb, 0xac, 0xd3, 0xae, 0xd3, 0xc0, 0x5e, 0xff, 0x82, 0x6a, 0x90, 0x88, 0xeb, 0x42, + 0x62, 0x5f, 0x0a, 0xc4, 0x94, 0xef, 0x41, 0xe6, 0x9b, 0xae, 0xcf, 0xec, 0x33, 0x9b, 0x34, 0x4c, + 0x21, 0x24, 0x13, 0x65, 0x31, 0x22, 0x97, 0x38, 0x15, 0x3d, 0x81, 0xcd, 0x81, 0xe0, 0xe8, 0x0a, + 0xd3, 0xc2, 0xcd, 0x46, 0x24, 0x32, 0xbc, 0xc8, 0x13, 0xc8, 0xb6, 0x31, 0xdf, 0xb8, 0x69, 0x79, + 0xd4, 0xf7, 0xdb, 0xb6, 0x73, 0xbe, 0x31, 0x2d, 0x22, 0xe1, 0x83, 0x91, 0x48, 0x70, 0x0b, 0x2e, + 0x8f, 0x84, 0x83, 0x50, 0xd0, 0xc8, 0x04, 0xaa, 0x11, 0x01, 0x6d, 0xc2, 0x5c, 0x8b, 0xe0, 0x86, + 0x29, 0x00, 0x9e, 0x11, 0xeb, 0x9d, 0xe5, 0x84, 0x2a, 0x07, 0xf9, 0xd7, 0x0a, 0xe4, 0x4e, 0x89, + 0xd3, 0xb0, 0x9d, 0x66, 0x0c, 0xeb, 0x28, 0x4a, 0x1e, 0x43, 0xee, 0xcc, 0x6e, 0x33, 0xe2, 0x99, + 0x1e, 0xc1, 0x8d, 0xbe, 0x79, 0x46, 0x3d, 0xd3, 0x76, 0xac, 0x76, 0xd7, 0xb7, 0xa9, 0x23, 0x90, + 0x9e, 0x35, 0xd6, 0x03, 0x09, 0x83, 0x0b, 0x1c, 0x51, 0xaf, 0x1c, 0xb2, 0x91, 0x0e, 0xcb, 0xae, + 0x47, 0x5d, 0xea, 0xe3, 0xb6, 0x04, 0x21, 0x76, 0xc6, 0x4b, 0x21, 0x4b, 0x6c, 0x5e, 0xac, 0xa5, + 0x0b, 0x9b, 0x63, 0x97, 0x22, 0xcf, 0xfc, 0x25, 0xac, 0xb8, 0x01, 0xdb, 0xc4, 0x31, 0xbe, 0x88, + 0xbe, 0xf9, 0xc2, 0x87, 0x49, 0xc8, 0xc4, 0x6c, 0x19, 0xcb, 0xee, 0xa8, 0x7d, 0xed, 0x39, 0xa0, + 0x83, 0x16, 0xb6, 0x9d, 0x2a, 0xc3, 0x1e, 0x8b, 0x57, 0x58, 0x9f, 0x13, 0x48, 0x43, 0x6e, 0x33, + 0xfc, 0x44, 0x1f, 0xc0, 0x42, 0x93, 0x38, 0xc4, 0xb7, 0x7d, 0x93, 0xb7, 0x1d, 0xb9, 0x9f, 0x79, + 0x49, 0xab, 0xd9, 0x1d, 0xa2, 0xfd, 0x2e, 0x05, 0x8b, 0xa7, 0x62, 0x7f, 0x24, 0x9e, 0x6f, 0xd8, + 0x23, 0x4e, 0x10, 0x04, 0x32, 0x48, 0x21, 0x20, 0xf1, 0x63, 0xe7, 0x02, 0x1c, 0x1e, 0xd3, 0xe9, + 0x76, 0xea, 0xc4, 0x93, 0x56, 0x81, 0x93, 0x2a, 0x82, 0x82, 0x3e, 0x84, 0x1b, 0x1e, 0x76, 0x1a, + 0x98, 0x9a, 0x1e, 0xe9, 0x11, 0xdc, 0x16, 0xb1, 0xb7, 0x60, 0x2c, 0x04, 0x44, 0x43, 0xd0, 0x50, + 0x1e, 0x96, 0x63, 0xe0, 0x98, 0x75, 0x9b, 0x75, 0xb0, 0x7f, 0x2e, 0x23, 0x0e, 0xc5, 0x58, 0xfb, + 0x01, 0x07, 0xed, 0xc1, 0xcd, 0xb8, 0x02, 0x6e, 0x36, 0x3d, 0xd2, 0xc4, 0x8c, 0x98, 0xbe, 0xdd, + 0xdc, 0x98, 0x56, 0xa7, 0xb6, 0xd2, 0xc6, 0x7a, 0x4c, 0xa0, 0x18, 0xf2, 0xab, 0x76, 0x13, 0x7d, + 0x06, 0x73, 0x51, 0xe3, 0x15, 0x91, 0x35, 0x5f, 0xc8, 0xe9, 0x41, 0x63, 0xd5, 0xc3, 0xd6, 0xac, + 0xd7, 0x42, 0x09, 0x63, 0x20, 0xac, 0x3d, 0x81, 0x4c, 0x84, 0x8f, 0x04, 0x7c, 0x1b, 0x96, 0x92, + 0x72, 0x39, 0x53, 0xbf, 0x98, 0x20, 0xda, 0xa7, 0xb0, 0x22, 0xd5, 0xbd, 0xb2, 0xd3, 0x20, 0x6f, + 0x62, 0x20, 0xc7, 0x31, 0x54, 0x86, 0x31, 0xd4, 0x76, 0x60, 0x75, 0x48, 0x51, 0x7a, 0x5f, 0x81, + 0x69, 0x9b, 0x13, 0xc2, 0xb2, 0x24, 0x3e, 0xb4, 0x02, 0x2c, 0xf1, 0xca, 0x4a, 0xb8, 0xeb, 0x48, + 0xf4, 0x36, 0x00, 0x07, 0x83, 0x88, 0x85, 0x86, 0xc5, 0xdb, 0x0f, 0xc5, 0xb4, 0xc7, 0xb0, 0x18, + 0x84, 0x57, 0xa4, 0x70, 0x1f, 0xb2, 0x71, 0x88, 0x63, 0xe7, 0x9f, 0x89, 0xd1, 0xf9, 0xd6, 0xb4, + 0x47, 0xb0, 0x1a, 0x95, 0xdb, 0x0b, 0x3b, 0xbb, 0xbc, 0x63, 0x68, 0x3a, 0xac, 0x0d, 0xeb, 0x5d, + 0xba, 0x31, 0x13, 0x36, 0x0f, 0x68, 0xa7, 0x63, 0x33, 0x46, 0x48, 0xd1, 0xf7, 0xed, 0xa6, 0xd3, + 0x21, 0x0e, 0x8b, 0x37, 0x87, 0xa0, 0x4a, 0x8a, 0x98, 0x0f, 0x71, 0x14, 0x24, 0x91, 0x25, 0xc3, + 0x0d, 0x20, 0x35, 0xd2, 0x00, 0x08, 0xac, 0xcb, 0x5c, 0x3e, 0x24, 0x2e, 0xf5, 0x6d, 0x36, 0xc8, + 0xe3, 0xaf, 0x20, 0x1b, 0xe6, 0x71, 0x43, 0xf2, 0x64, 0x0e, 0xdf, 0x4d, 0xca, 0x61, 0x69, 0xc3, + 0xc8, 0xb8, 0x17, 0x6d, 0x6a, 0xff, 0x4e, 0x8d, 0xdd, 0x48, 0xe4, 0xab, 0x09, 0x80, 0x23, 0xaa, + 0xf4, 0x72, 0x9c, 0xd4, 0x4d, 0x2f, 0x31, 0x34, 0x96, 0x17, 0x33, 0x9d, 0xfb, 0x87, 0x02, 0xcb, + 0x63, 0x64, 0xd0, 0x2d, 0x98, 0xb3, 0x42, 0xb2, 0xf0, 0x9f, 0x36, 0x06, 0x84, 0x41, 0x33, 0x4c, + 0x8d, 0x6b, 0x86, 0x53, 0xb1, 0x81, 0xf1, 0x2e, 0xcc, 0xdb, 0xbe, 0xe9, 0xca, 0xd8, 0x15, 0xf9, + 0x3c, 0x6b, 0x80, 0xed, 0x87, 0xd1, 0x3c, 0x14, 0x20, 0xd3, 0xc3, 0x23, 0xc5, 0x17, 0xd1, 0x48, + 0xc1, 0xf3, 0x74, 0xb1, 0x70, 0x6f, 0xd2, 0x91, 0x22, 0x1c, 0x25, 0xfe, 0x90, 0x82, 0xf5, 0x84, + 0x71, 0x23, 0x66, 0x5c, 0xf9, 0x9f, 0x8c, 0xa3, 0xcf, 0xe1, 0x26, 0x61, 0xad, 0x07, 0x61, 0x3c, + 0xc8, 0x6e, 0x71, 0xa1, 0x12, 0xf2, 0x7b, 0xc2, 0x03, 0x79, 0xee, 0xa2, 0x65, 0xc8, 0xaa, 0xf8, + 0x09, 0xac, 0x85, 0x5a, 0x51, 0x63, 0x32, 0x63, 0xf0, 0xad, 0x48, 0x6e, 0xd4, 0x96, 0x78, 0xab, + 0x11, 0x29, 0x19, 0x4d, 0x6c, 0xb2, 0x95, 0xa7, 0x83, 0x29, 0x79, 0x40, 0x0f, 0x7a, 0xf9, 0x17, + 0x70, 0x4b, 0x18, 0xe0, 0x82, 0xb6, 0x63, 0xc6, 0xd4, 0x5e, 0x77, 0x49, 0x97, 0x08, 0xa8, 0xd3, + 0xc6, 0xcd, 0x50, 0xa6, 0xec, 0x0c, 0x46, 0xc1, 0xe7, 0x5c, 0x40, 0x7b, 0x0e, 0xd9, 0x12, 0x5f, + 0x7b, 0x7c, 0x7e, 0x79, 0x02, 0x73, 0xc1, 0x86, 0x31, 0xc3, 0x02, 0xb4, 0xf9, 0x82, 0x9a, 0x14, + 0xfc, 0x91, 0xf2, 0x2c, 0x91, 0xbf, 0xb4, 0xb7, 0x29, 0x58, 0x12, 0x20, 0xd4, 0x3c, 0x32, 0xa8, + 0xa0, 0x47, 0x90, 0x66, 0x9e, 0x0c, 0xb3, 0xf9, 0x42, 0x21, 0xe9, 0x10, 0x46, 0x14, 0x75, 0xfe, + 0x51, 0xa1, 0x0d, 0x62, 0x08, 0xfd, 0xdc, 0xef, 0x15, 0x98, 0x0d, 0x49, 0xe8, 0x73, 0x98, 0x16, + 0xa7, 0x21, 0x57, 0x99, 0xd8, 0x66, 0xf7, 0x63, 0xe3, 0x56, 0xa0, 0xc1, 0x43, 0x72, 0x50, 0xd1, + 0xc3, 0x4b, 0x4e, 0x54, 0xca, 0xd1, 0x0e, 0x20, 0x17, 0x7b, 0xcc, 0xb6, 0x6c, 0x57, 0x4c, 0xe8, + 0x3d, 0xca, 0x48, 0x78, 0xf3, 0x58, 0x8a, 0x73, 0x5e, 0x72, 0x06, 0xcf, 0x00, 0x79, 0xb1, 0x11, + 0x72, 0xc1, 0x69, 0x41, 0x70, 0xa7, 0xe1, 0x14, 0xed, 0x04, 0x56, 0xf8, 0xaa, 0xa3, 0x79, 0x22, + 0x2c, 0x66, 0x9b, 0x30, 0x27, 0x9a, 0xc2, 0x99, 0x47, 0x3b, 0xb2, 0x94, 0xcd, 0x72, 0xc2, 0x91, + 0x47, 0x3b, 0x68, 0x1d, 0xde, 0x17, 0x4c, 0x46, 0x65, 0x9c, 0xcd, 0xf0, 0xcf, 0x1a, 0xdd, 0xfe, + 0x0c, 0x6e, 0x44, 0xd1, 0x6a, 0xd0, 0x36, 0x41, 0xf3, 0xf0, 0xfe, 0x8b, 0xca, 0xd7, 0x95, 0x67, + 0xaf, 0x2a, 0xd9, 0xf7, 0xd0, 0x02, 0xcc, 0x16, 0x6b, 0xb5, 0x52, 0xb5, 0x56, 0x32, 0xb2, 0x0a, + 0xff, 0x3a, 0x35, 0x9e, 0x9d, 0x3e, 0xab, 0x96, 0x8c, 0x6c, 0x6a, 0xfb, 0x37, 0x0a, 0x64, 0x86, + 0x02, 0x1d, 0x21, 0x58, 0x94, 0xca, 0x66, 0xb5, 0x56, 0xac, 0xbd, 0xa8, 0x66, 0xdf, 0xe3, 0xb4, + 0xd3, 0x52, 0xe5, 0xb0, 0x5c, 0x39, 0x36, 0x8b, 0x07, 0xb5, 0xf2, 0xcb, 0x52, 0x56, 0x41, 0x00, + 0x33, 0xf2, 0x77, 0x8a, 0xf3, 0xcb, 0x95, 0x72, 0xad, 0x5c, 0xac, 0x95, 0x0e, 0xcd, 0xd2, 0xff, + 0x97, 0x6b, 0xd9, 0x29, 0x94, 0x85, 0x85, 0x57, 0xe5, 0xda, 0xd3, 0x43, 0xa3, 0xf8, 0xaa, 0xb8, + 0x7f, 0x52, 0xca, 0xa6, 0xb9, 0x06, 0xe7, 0x95, 0x0e, 0xb3, 0xd3, 0x5c, 0x23, 0xf8, 0x6d, 0x56, + 0x4f, 0x8a, 0xd5, 0xa7, 0xa5, 0xc3, 0xec, 0x4c, 0xe1, 0x57, 0x33, 0x70, 0x23, 0x38, 0x9b, 0x6a, + 0x70, 0xf1, 0x46, 0x3f, 0x82, 0xa5, 0x57, 0xd8, 0x66, 0x47, 0xd4, 0x1b, 0x8c, 0x3d, 0x68, 0x6d, + 0xa4, 0x6f, 0x97, 0xf8, 0x7d, 0x3b, 0xb7, 0x9d, 0x58, 0x2c, 0x47, 0x46, 0xa6, 0x5d, 0x05, 0x9d, + 0xc0, 0x8d, 0x03, 0xec, 0x50, 0xc7, 0xb6, 0x70, 0xfb, 0x29, 0xc1, 0x8d, 0x44, 0xb3, 0x93, 0x84, + 0x11, 0x32, 0x60, 0xe9, 0x44, 0xcc, 0xb2, 0xb1, 0x71, 0xed, 0xfa, 0x16, 0x63, 0xca, 0xbb, 0x0a, + 0xfa, 0x31, 0x64, 0x86, 0xfa, 0x52, 0xa2, 0xc5, 0xc4, 0x5b, 0x57, 0x52, 0x63, 0x3b, 0x81, 0xd9, + 0x30, 0x57, 0x13, 0x8d, 0x6e, 0x25, 0x19, 0x1d, 0x29, 0x11, 0x5f, 0xc2, 0xec, 0x11, 0xf5, 0xce, + 0x2f, 0xb5, 0x76, 0x2b, 0x69, 0xd3, 0x5c, 0x13, 0x7d, 0xaf, 0xc0, 0x5c, 0x94, 0xec, 0x89, 0x36, + 0xee, 0x4f, 0x5c, 0x27, 0xb4, 0x67, 0x6f, 0x8b, 0xbb, 0x48, 0x3f, 0x22, 0xcc, 0x6a, 0x11, 0x5f, + 0x15, 0x99, 0xac, 0xf2, 0x8a, 0xa1, 0xfa, 0xb6, 0x63, 0x11, 0xb5, 0x8d, 0x7d, 0xa6, 0x9e, 0xd9, + 0x0e, 0x6e, 0xdb, 0x3f, 0x23, 0x8d, 0x80, 0xaf, 0xff, 0xf2, 0x6f, 0x3f, 0xfc, 0x36, 0xb5, 0x86, + 0x56, 0xf2, 0xbd, 0x07, 0xe1, 0x73, 0x8c, 0x60, 0x70, 0x3d, 0x74, 0x0e, 0xd9, 0xc8, 0xcb, 0x7e, + 0x9f, 0x27, 0xad, 0x8f, 0x3e, 0x4e, 0x5a, 0xcf, 0xb8, 0xe4, 0xbe, 0xc6, 0xea, 0x0b, 0xff, 0x52, + 0x20, 0x13, 0x04, 0x03, 0xf1, 0x06, 0xb9, 0x00, 0x01, 0x49, 0x44, 0xeb, 0x24, 0x31, 0x94, 0xfb, + 0x28, 0xc9, 0xe3, 0xd0, 0xd4, 0xf7, 0x06, 0x56, 0x87, 0x6e, 0xaf, 0x45, 0x26, 0x7a, 0x8f, 0x7e, + 0xb9, 0x81, 0xe1, 0x1b, 0x73, 0x72, 0x1c, 0x26, 0x5c, 0x8e, 0x0b, 0x7f, 0x9a, 0x8a, 0xa6, 0xeb, + 0x68, 0xa3, 0x6d, 0xb8, 0x71, 0x61, 0xf0, 0x4d, 0x86, 0x79, 0xdc, 0x60, 0x9d, 0xdb, 0x99, 0x50, + 0x5a, 0xee, 0xfd, 0x3b, 0x58, 0x1e, 0x73, 0x93, 0x43, 0x85, 0x2b, 0x32, 0x6a, 0xcc, 0x0d, 0x34, + 0xf7, 0xf0, 0x5a, 0x3a, 0xd2, 0xff, 0x4f, 0x60, 0x41, 0x2e, 0x2c, 0xa8, 0x24, 0x93, 0x94, 0x9b, + 0xdc, 0xbd, 0x2b, 0xf6, 0x18, 0x59, 0xaf, 0x43, 0xf6, 0x80, 0x76, 0xdc, 0x2e, 0x23, 0xd1, 0xe5, + 0x60, 0x32, 0x0f, 0x89, 0xc1, 0x3a, 0x72, 0xc9, 0x28, 0xfc, 0x67, 0x1a, 0xb2, 0x83, 0x26, 0x22, + 0x0f, 0xf1, 0xbb, 0xa8, 0x72, 0x0f, 0x66, 0x8c, 0x64, 0x50, 0x93, 0x9f, 0xd6, 0x92, 0x41, 0xbd, + 0xe4, 0x3d, 0x6b, 0x57, 0x41, 0x14, 0x16, 0x2f, 0xde, 0x32, 0xd0, 0xce, 0x95, 0x86, 0x2e, 0x84, + 0x91, 0x3e, 0xa9, 0xb8, 0x44, 0xfa, 0xe7, 0xe3, 0x87, 0xea, 0x87, 0xd7, 0x98, 0xe0, 0xaf, 0x0e, + 0xa4, 0xcb, 0xee, 0x0f, 0xaf, 0x47, 0x5b, 0xf9, 0x35, 0xb7, 0x7c, 0xdd, 0xb7, 0x3b, 0xf4, 0x0b, + 0x05, 0x56, 0xc6, 0xbd, 0xfd, 0xa2, 0xab, 0x0f, 0x6d, 0xf4, 0xf1, 0x39, 0xf7, 0xc9, 0xf5, 0x94, + 0xe4, 0x1a, 0xba, 0x90, 0x1d, 0x7e, 0xfb, 0x43, 0x89, 0x1b, 0x49, 0x78, 0x61, 0xcc, 0xed, 0x4e, + 0xae, 0x10, 0xb8, 0xdd, 0xff, 0xcb, 0xd4, 0xdb, 0xe2, 0x1f, 0xa7, 0xd0, 0xdf, 0x15, 0x98, 0x3e, + 0xf5, 0xfa, 0x7e, 0x07, 0xfd, 0xdf, 0x57, 0xd5, 0x67, 0x15, 0xd5, 0x38, 0x3d, 0x50, 0xc3, 0xff, + 0x1a, 0xa8, 0xae, 0x47, 0x7b, 0x76, 0x83, 0xb7, 0x97, 0xbe, 0x2a, 0x84, 0x74, 0xed, 0x00, 0x16, + 0xc5, 0x2f, 0xcc, 0x6c, 0x4b, 0x3d, 0xc1, 0x75, 0x1f, 0xdd, 0x6c, 0x31, 0xe6, 0xfa, 0x7b, 0xf9, + 0xbc, 0x1b, 0xd2, 0xdb, 0xb8, 0xee, 0xeb, 0x16, 0xed, 0xe4, 0xd6, 0x18, 0xc1, 0x9d, 0x2f, 0x47, + 0xe8, 0xdb, 0x3f, 0x85, 0xbb, 0xc7, 0x95, 0x17, 0xea, 0x31, 0x71, 0x88, 0x87, 0xdb, 0x6a, 0xf0, + 0x1c, 0xac, 0x9e, 0xd8, 0x16, 0x71, 0x7c, 0xa2, 0xf6, 0x1e, 0xea, 0xbb, 0xe8, 0x49, 0x68, 0xb5, + 0x69, 0xb3, 0x56, 0xb7, 0xce, 0xd5, 0x2e, 0x3a, 0x08, 0xbe, 0x78, 0x7f, 0xab, 0xe7, 0x3b, 0x98, + 0xf7, 0x99, 0xfc, 0x49, 0xf9, 0xa0, 0x54, 0xa9, 0x96, 0xf4, 0x4e, 0xa3, 0x30, 0xbd, 0xab, 0xef, + 0xea, 0xbb, 0xb9, 0x0c, 0x76, 0x6d, 0xdd, 0xf5, 0xfa, 0xc2, 0xb3, 0x43, 0xd8, 0xb6, 0x92, 0x2a, + 0x64, 0xb1, 0xeb, 0xb6, 0x6d, 0x4b, 0xe4, 0x5b, 0xfe, 0x1b, 0x9f, 0x3a, 0x85, 0x9b, 0x71, 0x4a, + 0xd3, 0x73, 0xad, 0x9d, 0x6f, 0x49, 0x7d, 0x87, 0x91, 0x37, 0x2c, 0x81, 0x75, 0x89, 0x16, 0x67, + 0xed, 0x8d, 0xb8, 0xd8, 0x4b, 0x76, 0xe1, 0x3d, 0xe2, 0xf5, 0xb3, 0xef, 0x77, 0xd4, 0x63, 0xb1, + 0x53, 0xf4, 0xd1, 0x64, 0x3b, 0xff, 0xf3, 0xbb, 0x3b, 0xca, 0x5f, 0xdf, 0xdd, 0x51, 0xfe, 0xf9, + 0xee, 0x8e, 0x52, 0x9f, 0x11, 0x73, 0xc6, 0xc3, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0xe7, 0x36, + 0x39, 0x4a, 0x05, 0x1a, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/proto/beacon/rpc/v1/services.proto b/proto/beacon/rpc/v1/services.proto index 264b141ab..d3f3607de 100644 --- a/proto/beacon/rpc/v1/services.proto +++ b/proto/beacon/rpc/v1/services.proto @@ -5,6 +5,38 @@ package ethereum.beacon.rpc.v1; import "google/protobuf/empty.proto"; import "google/protobuf/timestamp.proto"; import "proto/beacon/p2p/v1/types.proto"; +import "google/api/annotations.proto"; +import "protoc-gen-swagger/options/annotations.proto"; + +option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = { + info: { + title: "Prysm"; + version: "0.0.0"; + contact: { + name: "Prysmatic Labs"; + url: "https://prysmaticlabs.com"; + email: "team@prysmaticlabs.com"; + }; + license: { + name: "GNU General Public License v3.0"; + url: "https://github.com/prysmaticlabs/prysm/blob/master/LICENSE.md"; + }; + description: "JSON RPC services provided by Prysm." + }; + external_docs: { + url: "https://github.com/prysmaticlabs/prysm"; + description : "Prysm Github"; + }; + host: "api.prylabs.net", + schemes: HTTPS; + consumes: "application/json"; + consumes: "application/grpc-web-text"; + consumes: "application/grpc-web-json"; + produces: "application/json"; + produces: "application/grpc-web-text"; + consumes: "application/grpc-web-json"; +}; + service BeaconService { rpc WaitForChainStart(google.protobuf.Empty) returns (stream ChainStartResponse); @@ -15,7 +47,14 @@ service BeaconService { rpc PendingDeposits(google.protobuf.Empty) returns (PendingDepositsResponse); rpc Eth1Data(google.protobuf.Empty) returns (Eth1DataResponse); rpc ForkData(google.protobuf.Empty) returns (ethereum.beacon.p2p.v1.Fork); - rpc BlockTree(google.protobuf.Empty) returns (BlockTreeResponse); + rpc BlockTree(google.protobuf.Empty) returns (BlockTreeResponse) { + option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = { + summary: "Fetches block tree since last finalized block."; + }; + option (google.api.http) = { + get: "/v1/beacon/blocktree"; + }; + } rpc BlockTreeBySlots(TreeBlockSlotRequest) returns (BlockTreeResponse); } @@ -201,4 +240,4 @@ enum ValidatorStatus { message TreeBlockSlotRequest { uint64 slot_from = 1 ; uint64 slot_to = 2 ; -} \ No newline at end of file +}