diff --git a/beacon-chain/rpc/beaconv1/BUILD.bazel b/beacon-chain/rpc/beaconv1/BUILD.bazel new file mode 100644 index 000000000000..27fff0480dd0 --- /dev/null +++ b/beacon-chain/rpc/beaconv1/BUILD.bazel @@ -0,0 +1,40 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_test") +load("@prysm//tools/go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "blocks.go", + "config.go", + "pool.go", + "server.go", + "state.go", + "validator.go", + ], + importpath = "github.com/prysmaticlabs/prysm/beacon-chain/rpc/beaconv1", + visibility = ["//beacon-chain:__subpackages__"], + deps = [ + "//beacon-chain/blockchain:go_default_library", + "//beacon-chain/cache/depositcache:go_default_library", + "//beacon-chain/core/feed/block:go_default_library", + "//beacon-chain/core/feed/operation:go_default_library", + "//beacon-chain/core/feed/state:go_default_library", + "//beacon-chain/db:go_default_library", + "//beacon-chain/operations/attestations:go_default_library", + "//beacon-chain/operations/slashings:go_default_library", + "//beacon-chain/p2p:go_default_library", + "//beacon-chain/powchain:go_default_library", + "//beacon-chain/state/stategen:go_default_library", + "//beacon-chain/sync:go_default_library", + "//proto/beacon/p2p/v1:go_default_library", + "@com_github_gogo_protobuf//types:go_default_library", + "@com_github_prysmaticlabs_ethereumapis//eth/v1:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = ["server_test.go"], + embed = [":go_default_library"], + deps = ["@com_github_prysmaticlabs_ethereumapis//eth/v1:go_default_library"], +) diff --git a/beacon-chain/rpc/beaconv1/blocks.go b/beacon-chain/rpc/beaconv1/blocks.go new file mode 100644 index 000000000000..2e1977d4cc49 --- /dev/null +++ b/beacon-chain/rpc/beaconv1/blocks.go @@ -0,0 +1,43 @@ +package beaconv1 + +import ( + "context" + "errors" + + ptypes "github.com/gogo/protobuf/types" + ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1" +) + +// GetBlockHeader retrieves block header for given block id. +func (bs *Server) GetBlockHeader(ctx context.Context, req *ethpb.BlockRequest) (*ethpb.BlockHeaderResponse, error) { + return nil, errors.New("unimplemented") +} + +// ListBlockHeaders retrieves block headers matching given query. By default it will fetch current head slot blocks. +func (bs *Server) ListBlockHeaders(ctx context.Context, req *ethpb.BlockHeadersRequest) (*ethpb.BlockHeadersResponse, error) { + return nil, errors.New("unimplemented") +} + +// SubmitBlock instructs the beacon node to broadcast a newly signed beacon block to the beacon network, to be +// included in the beacon chain. The beacon node is not required to validate the signed BeaconBlock, and a successful +// response (20X) only indicates that the broadcast has been successful. The beacon node is expected to integrate the +// new block into its state, and therefore validate the block internally, however blocks which fail the validation are +// still broadcast but a different status code is returned (202). +func (bs *Server) SubmitBlock(ctx context.Context, req *ethpb.BeaconBlockContainer) (*ptypes.Empty, error) { + return nil, errors.New("unimplemented") +} + +// GetBlock retrieves block details for given block id. +func (bs *Server) GetBlock(ctx context.Context, req *ethpb.BlockRequest) (*ethpb.BlockResponse, error) { + return nil, errors.New("unimplemented") +} + +// GetBlockRoot retrieves hashTreeRoot of BeaconBlock/BeaconBlockHeader. +func (bs *Server) GetBlockRoot(ctx context.Context, req *ethpb.BlockRequest) (*ethpb.BlockRootResponse, error) { + return nil, errors.New("unimplemented") +} + +// ListBlockAttestations retrieves attestation included in requested block. +func (bs *Server) ListBlockAttestations(ctx context.Context, req *ethpb.BlockRequest) (*ethpb.BlockAttestationsResponse, error) { + return nil, errors.New("unimplemented") +} diff --git a/beacon-chain/rpc/beaconv1/config.go b/beacon-chain/rpc/beaconv1/config.go new file mode 100644 index 000000000000..28db5ebd2c02 --- /dev/null +++ b/beacon-chain/rpc/beaconv1/config.go @@ -0,0 +1,27 @@ +package beaconv1 + +import ( + "context" + "errors" + + ptypes "github.com/gogo/protobuf/types" + ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1" +) + +// GetForkSchedule retrieve all scheduled upcoming forks this node is aware of. +func (bs *Server) GetForkSchedule(ctx context.Context, req *ptypes.Empty) (*ethpb.ForkScheduleResponse, error) { + return nil, errors.New("unimplemented") +} + +// GetSpec retrieves specification configuration (without Phase 1 params) used on this node. Specification params list +// Values are returned with following format: +// - any value starting with 0x in the spec is returned as a hex string. +// - all other values are returned as number. +func (bs *Server) GetSpec(ctx context.Context, req *ptypes.Empty) (*ethpb.SpecResponse, error) { + return nil, errors.New("unimplemented") +} + +// GetDepositContract retrieves deposit contract address and genesis fork version. +func (bs *Server) GetDepositContract(ctx context.Context, req *ptypes.Empty) (*ethpb.DepositContractResponse, error) { + return nil, errors.New("unimplemented") +} diff --git a/beacon-chain/rpc/beaconv1/pool.go b/beacon-chain/rpc/beaconv1/pool.go new file mode 100644 index 000000000000..1efbfed08dfa --- /dev/null +++ b/beacon-chain/rpc/beaconv1/pool.go @@ -0,0 +1,58 @@ +package beaconv1 + +import ( + "context" + "errors" + + ptypes "github.com/gogo/protobuf/types" + + ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1" +) + +// ListPoolAttestations retrieves attestations known by the node but +// not necessarily incorporated into any block. +func (bs *Server) ListPoolAttestations(ctx context.Context, req *ethpb.AttestationsPoolRequest) (*ethpb.AttestationsPoolResponse, error) { + return nil, errors.New("unimplemented") +} + +// SubmitAttestation submits Attestation object to node. If attestation passes all validation +// constraints, node MUST publish attestation on appropriate subnet. +func (bs *Server) SubmitAttestation(ctx context.Context, req *ethpb.Attestation) (*ptypes.Empty, error) { + return nil, errors.New("unimplemented") +} + +// ListPoolAttesterSlashings retrieves attester slashings known by the node but +// not necessarily incorporated into any block. +func (bs *Server) ListPoolAttesterSlashings(ctx context.Context, req *ptypes.Empty) (*ethpb.AttesterSlashingsPoolResponse, error) { + return nil, errors.New("unimplemented") +} + +// SubmitAttesterSlashing submits AttesterSlashing object to node's pool and +// if passes validation node MUST broadcast it to network. +func (bs *Server) SubmitAttesterSlashing(ctx context.Context, req *ethpb.AttesterSlashing) (*ptypes.Empty, error) { + return nil, errors.New("unimplemented") +} + +// ListPoolProposerSlashings retrieves proposer slashings known by the node +// but not necessarily incorporated into any block. +func (bs *Server) ListPoolProposerSlashings(ctx context.Context, req *ptypes.Empty) (*ethpb.ProposerSlashingPoolResponse, error) { + return nil, errors.New("unimplemented") +} + +// SubmitProposerSlashing submits AttesterSlashing object to node's pool and if +// passes validation node MUST broadcast it to network. +func (bs *Server) SubmitProposerSlashing(ctx context.Context, req *ethpb.ProposerSlashing) (*ptypes.Empty, error) { + return nil, errors.New("unimplemented") +} + +// ListPoolVoluntaryExits retrieves voluntary exits known by the node but +// not necessarily incorporated into any block. +func (bs *Server) ListPoolVoluntaryExits(ctx context.Context, req *ptypes.Empty) (*ethpb.VoluntaryExitsPoolResponse, error) { + return nil, errors.New("unimplemented") +} + +// SubmitVoluntaryExit submits SignedVoluntaryExit object to node's pool +// and if passes validation node MUST broadcast it to network. +func (bs *Server) SubmitVoluntaryExit(ctx context.Context, req *ethpb.SignedVoluntaryExit) (*ptypes.Empty, error) { + return nil, errors.New("unimplemented") +} diff --git a/beacon-chain/rpc/beaconv1/server.go b/beacon-chain/rpc/beaconv1/server.go new file mode 100644 index 000000000000..d9bac5e62120 --- /dev/null +++ b/beacon-chain/rpc/beaconv1/server.go @@ -0,0 +1,49 @@ +// Package beaconv1 defines a gRPC beacon service implementation, +// following the official API standards https://ethereum.github.io/eth2.0-APIs/#/. +// This package includes the beacon and config endpoints. +package beaconv1 + +import ( + "context" + "time" + + "github.com/prysmaticlabs/prysm/beacon-chain/blockchain" + "github.com/prysmaticlabs/prysm/beacon-chain/cache/depositcache" + blockfeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/block" + "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/operation" + statefeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/state" + "github.com/prysmaticlabs/prysm/beacon-chain/db" + "github.com/prysmaticlabs/prysm/beacon-chain/operations/attestations" + "github.com/prysmaticlabs/prysm/beacon-chain/operations/slashings" + "github.com/prysmaticlabs/prysm/beacon-chain/p2p" + "github.com/prysmaticlabs/prysm/beacon-chain/powchain" + "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + "github.com/prysmaticlabs/prysm/beacon-chain/sync" + pbp2p "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1" +) + +// Server defines a server implementation of the gRPC Beacon Chain service, +// providing RPC endpoints to access data relevant to the Ethereum 2.0 phase 0 +// beacon chain. +type Server struct { + BeaconDB db.ReadOnlyDatabase + Ctx context.Context + ChainStartFetcher powchain.ChainStartFetcher + HeadFetcher blockchain.HeadFetcher + FinalizationFetcher blockchain.FinalizationFetcher + DepositFetcher depositcache.DepositFetcher + BlockFetcher powchain.POWBlockFetcher + GenesisTimeFetcher blockchain.TimeFetcher + GenesisFetcher blockchain.GenesisFetcher + BlockReceiver blockchain.BlockReceiver + StateNotifier statefeed.Notifier + BlockNotifier blockfeed.Notifier + AttestationNotifier operation.Notifier + Broadcaster p2p.Broadcaster + AttestationsPool attestations.Pool + SlashingsPool *slashings.Pool + CanonicalStateChan chan *pbp2p.BeaconState + ChainStartChan chan time.Time + StateGen *stategen.State + SyncChecker sync.Checker +} diff --git a/beacon-chain/rpc/beaconv1/server_test.go b/beacon-chain/rpc/beaconv1/server_test.go new file mode 100644 index 000000000000..a1aaa3f7b54b --- /dev/null +++ b/beacon-chain/rpc/beaconv1/server_test.go @@ -0,0 +1,5 @@ +package beaconv1 + +import ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1" + +var _ = ethpb.BeaconChainServer(&Server{}) diff --git a/beacon-chain/rpc/beaconv1/state.go b/beacon-chain/rpc/beaconv1/state.go new file mode 100644 index 000000000000..ea61c00ebfb7 --- /dev/null +++ b/beacon-chain/rpc/beaconv1/state.go @@ -0,0 +1,30 @@ +package beaconv1 + +import ( + "context" + "errors" + + ptypes "github.com/gogo/protobuf/types" + ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1" +) + +// GetGenesis retrieves details of the chain's genesis which can be used to identify chain. +func (bs *Server) GetGenesis(ctx context.Context, _ *ptypes.Empty) (*ethpb.GenesisResponse, error) { + return nil, errors.New("unimplemented") +} + +// GetStateRoot calculates HashTreeRoot for state with given 'stateId'. If stateId is root, same value will be returned. +func (bs *Server) GetStateRoot(ctx context.Context, req *ethpb.StateRequest) (*ethpb.StateRootResponse, error) { + return nil, errors.New("unimplemented") +} + +// GetStateFork returns Fork object for state with given 'stateId'. +func (bs *Server) GetStateFork(ctx context.Context, req *ethpb.StateRequest) (*ethpb.StateForkResponse, error) { + return nil, errors.New("unimplemented") +} + +// GetFinalityCheckpoints returns finality checkpoints for state with given 'stateId'. In case finality is +// not yet achieved, checkpoint should return epoch 0 and ZERO_HASH as root. +func (bs *Server) GetFinalityCheckpoints(ctx context.Context, req *ethpb.StateRequest) (*ethpb.StateFinalityCheckpointResponse, error) { + return nil, errors.New("unimplemented") +} diff --git a/beacon-chain/rpc/beaconv1/validator.go b/beacon-chain/rpc/beaconv1/validator.go new file mode 100644 index 000000000000..b78e6cfa8b62 --- /dev/null +++ b/beacon-chain/rpc/beaconv1/validator.go @@ -0,0 +1,28 @@ +package beaconv1 + +import ( + "context" + "errors" + + ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1" +) + +// GetValidator returns a validator specified by state and id or public key along with status and balance. +func (bs *Server) GetValidator(ctx context.Context, req *ethpb.StateValidatorRequest) (*ethpb.StateValidatorResponse, error) { + return nil, errors.New("unimplemented") +} + +// ListValidators returns filterable list of validators with their balance, status and index. +func (bs *Server) ListValidators(ctx context.Context, req *ethpb.StateValidatorsRequest) (*ethpb.StateValidatorsResponse, error) { + return nil, errors.New("unimplemented") +} + +// ListValidatorBalances returns a filterable list of validator balances. +func (bs *Server) ListValidatorBalances(ctx context.Context, req *ethpb.StateValidatorsRequest) (*ethpb.ValidatorBalancesResponse, error) { + return nil, errors.New("unimplemented") +} + +// ListCommittees retrieves the committees for the given state at the given epoch. +func (bs *Server) ListCommittees(ctx context.Context, req *ethpb.StateCommitteesRequest) (*ethpb.StateCommitteesResponse, error) { + return nil, errors.New("unimplemented") +} diff --git a/deps.bzl b/deps.bzl index 7601b04da036..84d14f7c866f 100644 --- a/deps.bzl +++ b/deps.bzl @@ -2552,8 +2552,8 @@ def prysm_deps(): name = "com_github_prysmaticlabs_ethereumapis", build_file_generation = "off", importpath = "github.com/prysmaticlabs/ethereumapis", - sum = "h1:zM15JmyZ5v6B3xqVsYe34a8IXAoklYJo6glJ5V0kXyU=", - version = "v0.0.0-20201002012750-b612cbd9e525", + sum = "h1:dGeuKeaXxCepTbwsz7kYSfP1yazw1uRMn58CqNCcPP4=", + version = "v0.0.0-20201003171600-a72e5f77d233", ) go_repository( name = "com_github_prysmaticlabs_go_bitfield", diff --git a/go.mod b/go.mod index 51afbb733a73..bf3ad8e6e5c5 100644 --- a/go.mod +++ b/go.mod @@ -87,7 +87,7 @@ require ( github.com/prometheus/client_golang v1.7.1 github.com/prometheus/tsdb v0.10.0 // indirect github.com/protolambda/zssz v0.1.5 - github.com/prysmaticlabs/ethereumapis v0.0.0-20201002012750-b612cbd9e525 + github.com/prysmaticlabs/ethereumapis v0.0.0-20201003171600-a72e5f77d233 github.com/prysmaticlabs/go-bitfield v0.0.0-20200618145306-2ae0807bef65 github.com/prysmaticlabs/go-ssz v0.0.0-20200612203617-6d5c9aa213ae github.com/prysmaticlabs/prombbolt v0.0.0-20200324184628-09789ef63796 diff --git a/go.sum b/go.sum index 486f5060d36c..14dd8cc8267a 100644 --- a/go.sum +++ b/go.sum @@ -996,8 +996,8 @@ github.com/protolambda/zssz v0.1.5 h1:7fjJjissZIIaa2QcvmhS/pZISMX21zVITt49sW1oue github.com/protolambda/zssz v0.1.5/go.mod h1:a4iwOX5FE7/JkKA+J/PH0Mjo9oXftN6P8NZyL28gpag= github.com/prysmaticlabs/bazel-go-ethereum v0.0.0-20200922100503-3794d0d7ca25 h1:yoOj4FD6uNdWDjgZqlKGxmUYnR6tI9zN1NrE8tJ3/xE= github.com/prysmaticlabs/bazel-go-ethereum v0.0.0-20200922100503-3794d0d7ca25/go.mod h1:FQjK3ZwD8C5DYn7ukTmFee36rq1dOMESiUfXr5RUc1w= -github.com/prysmaticlabs/ethereumapis v0.0.0-20201002012750-b612cbd9e525 h1:zM15JmyZ5v6B3xqVsYe34a8IXAoklYJo6glJ5V0kXyU= -github.com/prysmaticlabs/ethereumapis v0.0.0-20201002012750-b612cbd9e525/go.mod h1:k7b2dxy6RppCG6kmOJkNOXzRpEoTdsPygc2aQhsUsZk= +github.com/prysmaticlabs/ethereumapis v0.0.0-20201003171600-a72e5f77d233 h1:dGeuKeaXxCepTbwsz7kYSfP1yazw1uRMn58CqNCcPP4= +github.com/prysmaticlabs/ethereumapis v0.0.0-20201003171600-a72e5f77d233/go.mod h1:k7b2dxy6RppCG6kmOJkNOXzRpEoTdsPygc2aQhsUsZk= github.com/prysmaticlabs/go-bitfield v0.0.0-20191017011753-53b773adde52/go.mod h1:hCwmef+4qXWjv0jLDbQdWnL0Ol7cS7/lCSS26WR+u6s= github.com/prysmaticlabs/go-bitfield v0.0.0-20200322041314-62c2aee71669 h1:cX6YRZnZ9sgMqM5U14llxUiXVNJ3u07Res1IIjTOgtI= github.com/prysmaticlabs/go-bitfield v0.0.0-20200322041314-62c2aee71669/go.mod h1:hCwmef+4qXWjv0jLDbQdWnL0Ol7cS7/lCSS26WR+u6s=