Compare commits

...

9 Commits

Author SHA1 Message Date
Preston Van Loon
0cec0ee6c3 Release --optimize-process-epoch to all (#4080)
* Release optimize-proces-epoch to all
* Merge branch 'master' into deprecate-ff-optimize-process-epoch
* Merge branch 'master' of github.com:prysmaticlabs/prysm into deprecate-ff-optimize-process-epoch
* Merge refs/heads/master into deprecate-ff-optimize-process-epoch
* Merge refs/heads/master into deprecate-ff-optimize-process-epoch
* Merge refs/heads/master into deprecate-ff-optimize-process-epoch
* Merge refs/heads/master into deprecate-ff-optimize-process-epoch
2019-11-22 09:40:53 +00:00
Nishant Das
2f392544a6 Add Lock When Accessing Checkpoints (#4086)
* fix data races
* Merge branch 'master' into checkpointLock
* Merge branch 'master' into checkpointLock
* Merge refs/heads/master into checkpointLock
2019-11-22 06:34:42 +00:00
Preston Van Loon
75ce8359eb Buildkite: Disable failing BES (#4087)
* Disable failing BES
2019-11-22 06:11:41 +00:00
terence tsao
f5cb04012e Aggregator selection from RPC to validator client (#4071)
* Config
* Updated proto
* Updated pool
* Updated RPC
* Updated validator client
* run time works
* Clean ups
* Fix tests
* Visibility
* Merge branch 'master' of https://github.com/prysmaticlabs/prysm into aggregator
* Raul's feedback
* Tests for RPC server
* Tests for validator client
* Span
* More tests
* Use go routine for SubmitAggregateAndProof
* Go routines
* Updated comments
* Use array of roles
* Fixed tests
* Build
* Update validator/client/runner.go

Co-Authored-By: Preston Van Loon <preston@prysmaticlabs.com>
* Update validator/client/runner.go

Co-Authored-By: Preston Van Loon <preston@prysmaticlabs.com>
* If
* Merge branch 'refactor-validator-roles' of https://github.com/prysmaticlabs/prysm into refactor-validator-roles
* Empty
* Feedback
* Merge branch 'master' of https://github.com/prysmaticlabs/prysm into aggregator
* Removed proto/eth/v1alpha1/shard_chain.pb.go?
* Cleaned up
* Revert
* Comments
* Lint
* Comment
* Merge branch 'master' into aggregator
2019-11-22 05:11:38 +00:00
Raul Jordan
f461d1e024 Resolve Panic in ListValidatorBalances RPC (#4051)
* adding default response
* regression test for archival
* include full regression test
* Merge branch 'master' into resolve-panic-rpc
* Merge branch 'master' into resolve-panic-rpc
* Merge branch 'master' into resolve-panic-rpc
* Merge branch 'master' into resolve-panic-rpc
* listbal
* Merge branch 'master' into resolve-panic-rpc
* Merge branch 'master' into resolve-panic-rpc
* Merge branch 'master' into resolve-panic-rpc
* Merge refs/heads/master into resolve-panic-rpc
2019-11-22 04:39:28 +00:00
Preston Van Loon
bdbd0aaeb8 Deprecate feature flag --scatter (#4079)
* deprecate --scatter. issue #4031
* forgot one for #4061
* use deprecatedUsage
* hidden
* Merge branch 'master' into deprecate-ff-scatter
* Merge branch 'master' into deprecate-ff-scatter
2019-11-22 04:08:49 +00:00
Preston Van Loon
715d06a215 gRPC Gateway: Emit JSON empty fields by default (#4085)
* Emit JSON empty fields by default
* Merge branch 'master' into emit-json-empty-fields
2019-11-22 03:36:47 +00:00
terence tsao
976a3af637 Refactor validator roles into an array (#4081) 2019-11-21 14:35:20 -08:00
Raul Jordan
8f8d2d36c0 Filter ListValidators by Active in RPC (#4061)
* update workspace

* include active filter

* fix up latest changes to match naming

* better comments, fix evaluators

* latest master

* filter items

* filter only active validators
2019-11-21 14:29:24 -06:00
45 changed files with 1900 additions and 626 deletions

View File

@@ -11,10 +11,10 @@ build:remote-cache --strategy=Closure=standalone
build:remote-cache --strategy=Genrule=standalone
# Build results backend.
build:remote-cache --bes_results_url="https://source.cloud.google.com/results/invocations/"
build:remote-cache --bes_backend=buildeventservice.googleapis.com
build:remote-cache --bes_timeout=60s
build:remote-cache --project_id=prysmaticlabs
#build:remote-cache --bes_results_url="https://source.cloud.google.com/results/invocations/"
#build:remote-cache --bes_backend=buildeventservice.googleapis.com
#build:remote-cache --bes_timeout=60s
#build:remote-cache --project_id=prysmaticlabs
# Prysm specific remote-cache properties.
build:remote-cache --disk_cache=

View File

@@ -87,34 +87,8 @@ func (s *Store) OnBlock(ctx context.Context, b *ethpb.BeaconBlock) error {
return errors.Wrap(err, "could not save state")
}
// Update justified check point.
if postState.CurrentJustifiedCheckpoint.Epoch > s.JustifiedCheckpt().Epoch {
s.justifiedCheckpt = postState.CurrentJustifiedCheckpoint
if err := s.db.SaveJustifiedCheckpoint(ctx, postState.CurrentJustifiedCheckpoint); err != nil {
return errors.Wrap(err, "could not save justified checkpoint")
}
}
// Update finalized check point.
// Prune the block cache and helper caches on every new finalized epoch.
if postState.FinalizedCheckpoint.Epoch > s.finalizedCheckpt.Epoch {
s.clearSeenAtts()
helpers.ClearAllCaches()
if err := s.db.SaveFinalizedCheckpoint(ctx, postState.FinalizedCheckpoint); err != nil {
return errors.Wrap(err, "could not save finalized checkpoint")
}
startSlot := helpers.StartSlot(s.prevFinalizedCheckpt.Epoch) + 1
endSlot := helpers.StartSlot(s.finalizedCheckpt.Epoch)
if endSlot > startSlot {
if err := s.rmStatesOlderThanLastFinalized(ctx, startSlot, endSlot); err != nil {
return errors.Wrapf(err, "could not delete states prior to finalized check point, range: %d, %d",
startSlot, endSlot)
}
}
s.prevFinalizedCheckpt = s.finalizedCheckpt
s.finalizedCheckpt = postState.FinalizedCheckpoint
if err := s.updateCheckpoints(ctx, postState); err != nil {
return errors.Wrap(err, "could not update checkpoint")
}
// Update validator indices in database as needed.
@@ -174,35 +148,8 @@ func (s *Store) OnBlockNoVerifyStateTransition(ctx context.Context, b *ethpb.Bea
return errors.Wrap(err, "could not save state")
}
// Update justified check point.
if postState.CurrentJustifiedCheckpoint.Epoch > s.JustifiedCheckpt().Epoch {
s.justifiedCheckpt = postState.CurrentJustifiedCheckpoint
if err := s.db.SaveJustifiedCheckpoint(ctx, postState.CurrentJustifiedCheckpoint); err != nil {
return errors.Wrap(err, "could not save justified checkpoint")
}
}
// Update finalized check point.
// Prune the block cache and helper caches on every new finalized epoch.
if postState.FinalizedCheckpoint.Epoch > s.finalizedCheckpt.Epoch {
s.clearSeenAtts()
helpers.ClearAllCaches()
startSlot := helpers.StartSlot(s.prevFinalizedCheckpt.Epoch) + 1
endSlot := helpers.StartSlot(s.finalizedCheckpt.Epoch)
if endSlot > startSlot {
if err := s.rmStatesOlderThanLastFinalized(ctx, startSlot, endSlot); err != nil {
return errors.Wrapf(err, "could not delete states prior to finalized check point, range: %d, %d",
startSlot, endSlot)
}
}
if err := s.db.SaveFinalizedCheckpoint(ctx, postState.FinalizedCheckpoint); err != nil {
return errors.Wrap(err, "could not save finalized checkpoint")
}
s.prevFinalizedCheckpt = s.finalizedCheckpt
s.finalizedCheckpt = postState.FinalizedCheckpoint
if err := s.updateCheckpoints(ctx, postState); err != nil {
return errors.Wrap(err, "could not update checkpoint")
}
// Update validator indices in database as needed.
@@ -314,6 +261,41 @@ func (s *Store) updateBlockAttestationVote(ctx context.Context, att *ethpb.Attes
return nil
}
func (s *Store) updateCheckpoints(ctx context.Context, postState *pb.BeaconState) error {
s.checkPointLock.Lock()
defer s.checkPointLock.Unlock()
// Update justified check point.
if postState.CurrentJustifiedCheckpoint.Epoch > s.justifiedCheckpt.Epoch {
s.justifiedCheckpt = postState.CurrentJustifiedCheckpoint
if err := s.db.SaveJustifiedCheckpoint(ctx, postState.CurrentJustifiedCheckpoint); err != nil {
return errors.Wrap(err, "could not save justified checkpoint")
}
}
// Update finalized check point.
// Prune the block cache and helper caches on every new finalized epoch.
if postState.FinalizedCheckpoint.Epoch > s.finalizedCheckpt.Epoch {
s.clearSeenAtts()
helpers.ClearAllCaches()
if err := s.db.SaveFinalizedCheckpoint(ctx, postState.FinalizedCheckpoint); err != nil {
return errors.Wrap(err, "could not save finalized checkpoint")
}
startSlot := helpers.StartSlot(s.prevFinalizedCheckpt.Epoch) + 1
endSlot := helpers.StartSlot(s.finalizedCheckpt.Epoch)
if endSlot > startSlot {
if err := s.rmStatesOlderThanLastFinalized(ctx, startSlot, endSlot); err != nil {
return errors.Wrapf(err, "could not delete states prior to finalized check point, range: %d, %d",
startSlot, endSlot)
}
}
s.prevFinalizedCheckpt = s.finalizedCheckpt
s.finalizedCheckpt = postState.FinalizedCheckpoint
}
return nil
}
// verifyBlkPreState validates input block has a valid pre-state.
func (s *Store) verifyBlkPreState(ctx context.Context, b *ethpb.BeaconBlock) (*pb.BeaconState, error) {
preState, err := s.db.State(ctx, bytesutil.ToBytes32(b.ParentRoot))

View File

@@ -36,6 +36,7 @@ type Store struct {
db db.Database
justifiedCheckpt *ethpb.Checkpoint
finalizedCheckpt *ethpb.Checkpoint
checkPointLock sync.RWMutex
prevFinalizedCheckpt *ethpb.Checkpoint
checkpointState *cache.CheckpointStateCache
checkpointStateLock sync.Mutex
@@ -78,9 +79,11 @@ func (s *Store) GenesisStore(
justifiedCheckpoint *ethpb.Checkpoint,
finalizedCheckpoint *ethpb.Checkpoint) error {
s.checkPointLock.Lock()
s.justifiedCheckpt = proto.Clone(justifiedCheckpoint).(*ethpb.Checkpoint)
s.finalizedCheckpt = proto.Clone(finalizedCheckpoint).(*ethpb.Checkpoint)
s.prevFinalizedCheckpt = proto.Clone(finalizedCheckpoint).(*ethpb.Checkpoint)
s.checkPointLock.Unlock()
justifiedState, err := s.db.State(ctx, bytesutil.ToBytes32(s.justifiedCheckpt.Root))
if err != nil {
@@ -88,7 +91,7 @@ func (s *Store) GenesisStore(
}
if err := s.checkpointState.AddCheckpointState(&cache.CheckpointState{
Checkpoint: s.justifiedCheckpt,
Checkpoint: s.JustifiedCheckpt(),
State: justifiedState,
}); err != nil {
return errors.Wrap(err, "could not save genesis state in check point cache")
@@ -245,10 +248,14 @@ func (s *Store) Head(ctx context.Context) ([]byte, error) {
// JustifiedCheckpt returns the latest justified check point from fork choice store.
func (s *Store) JustifiedCheckpt() *ethpb.Checkpoint {
s.checkPointLock.RLock()
defer s.checkPointLock.RUnlock()
return proto.Clone(s.justifiedCheckpt).(*ethpb.Checkpoint)
}
// FinalizedCheckpt returns the latest finalized check point from fork choice store.
func (s *Store) FinalizedCheckpt() *ethpb.Checkpoint {
s.checkPointLock.RLock()
defer s.checkPointLock.RUnlock()
return proto.Clone(s.finalizedCheckpt).(*ethpb.Checkpoint)
}

View File

@@ -102,6 +102,10 @@ func (ms *mockOperationService) AttestationPoolForForkchoice(ctx context.Context
return nil, nil
}
func (ms *mockOperationService) AttestationsBySlotCommittee(ctx context.Context, slot uint64, index uint64) ([]*ethpb.Attestation, error) {
return nil, nil
}
type mockClient struct{}
func (m *mockClient) SubscribeNewHead(ctx context.Context, ch chan<- *gethTypes.Header) (ethereum.Subscription, error) {

View File

@@ -2,7 +2,6 @@ package helpers
import (
"encoding/binary"
"fmt"
"github.com/gogo/protobuf/proto"
"github.com/pkg/errors"
@@ -144,7 +143,7 @@ func IsAggregator(state *pb.BeaconState, slot uint64, index uint64, slotSig *bls
if len(committee)/int(params.BeaconConfig().TargetAggregatorsPerCommittee) > 1 {
modulo = uint64(len(committee)) / params.BeaconConfig().TargetAggregatorsPerCommittee
}
fmt.Println(modulo)
b := hashutil.Hash(slotSig.Marshal())
return binary.LittleEndian.Uint64(b[:8])%modulo == 0, nil
}

View File

@@ -10,7 +10,6 @@ import (
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
"github.com/prysmaticlabs/prysm/beacon-chain/core/state"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
"github.com/prysmaticlabs/prysm/shared/featureconfig"
"github.com/prysmaticlabs/prysm/shared/params/spectest"
"github.com/prysmaticlabs/prysm/shared/testutil"
"gopkg.in/d4l3k/messagediff.v1"
@@ -53,7 +52,6 @@ func runSlotProcessingTests(t *testing.T, config string) {
if err := ssz.Unmarshal(postBeaconStateFile, postBeaconState); err != nil {
t.Fatalf("Failed to unmarshal: %v", err)
}
beaconStateCopy := proto.Clone(beaconState).(*pb.BeaconState)
postState, err := state.ProcessSlots(context.Background(), beaconState, beaconState.Slot+uint64(slotsCount))
if err != nil {
t.Fatal(err)
@@ -63,24 +61,6 @@ func runSlotProcessingTests(t *testing.T, config string) {
diff, _ := messagediff.PrettyDiff(beaconState, postBeaconState)
t.Fatalf("Post state does not match expected. Diff between states %s", diff)
}
// Process slots and epoch with optimizations.
f := featureconfig.Get()
f.OptimizeProcessEpoch = true
featureconfig.Init(f)
if c := featureconfig.Get(); !c.OptimizeProcessEpoch {
t.Errorf("OptimizeProcessEpoch in FeatureFlags incorrect. Wanted true, got false")
}
postState, err = state.ProcessSlots(context.Background(), beaconStateCopy, beaconStateCopy.Slot+uint64(slotsCount))
if err != nil {
t.Fatal(err)
}
if !proto.Equal(postState, postBeaconState) {
diff, _ := messagediff.PrettyDiff(beaconState, postBeaconState)
t.Fatalf("Post state does not match expected. Diff between states %s", diff)
}
})
}
}

View File

@@ -288,18 +288,10 @@ func ProcessSlots(ctx context.Context, state *pb.BeaconState, slot uint64) (*pb.
return nil, errors.Wrap(err, "could not process slot")
}
if CanProcessEpoch(state) {
if featureconfig.Get().OptimizeProcessEpoch {
state, err = ProcessEpochPrecompute(ctx, state)
if err != nil {
traceutil.AnnotateError(span, err)
return nil, errors.Wrap(err, "could not process epoch with optimizations")
}
} else {
state, err = ProcessEpoch(ctx, state)
if err != nil {
traceutil.AnnotateError(span, err)
return nil, errors.Wrap(err, "could not process epoch")
}
state, err = ProcessEpochPrecompute(ctx, state)
if err != nil {
traceutil.AnnotateError(span, err)
return nil, errors.Wrap(err, "could not process epoch with optimizations")
}
}
state.Slot++

View File

@@ -47,7 +47,7 @@ func (g *Gateway) Start() {
g.conn = conn
gwmux := gwruntime.NewServeMux(gwruntime.WithMarshalerOption(gwruntime.MIMEWildcard, &gwruntime.JSONPb{OrigName: false}))
gwmux := gwruntime.NewServeMux(gwruntime.WithMarshalerOption(gwruntime.MIMEWildcard, &gwruntime.JSONPb{OrigName: false, EmitDefaults: true}))
for _, f := range []func(context.Context, *gwruntime.ServeMux, *grpc.ClientConn) error{
ethpb.RegisterNodeHandler,
ethpb.RegisterBeaconChainHandler,

View File

@@ -25,6 +25,7 @@ type Pool interface {
AttestationPool(ctx context.Context, requestedSlot uint64) ([]*ethpb.Attestation, error)
AttestationPoolNoVerify(ctx context.Context) ([]*ethpb.Attestation, error)
AttestationPoolForForkchoice(ctx context.Context) ([]*ethpb.Attestation, error)
AttestationsBySlotCommittee(ctx context.Context, slot uint64, index uint64) ([]*ethpb.Attestation, error)
}
// Handler defines an interface for a struct equipped for receiving block operations.
@@ -137,6 +138,26 @@ func (s *Service) AttestationPoolNoVerify(ctx context.Context) ([]*ethpb.Attesta
return atts, nil
}
// AttestationsBySlotCommittee returns the attestations from the attestations pool filtered
// by slot and committee index.
func (s *Service) AttestationsBySlotCommittee(ctx context.Context, slot uint64, index uint64) ([]*ethpb.Attestation, error) {
ctx, span := trace.StartSpan(ctx, "operations.AttestationsBySlotCommittee")
defer span.End()
s.attestationPoolLock.RLock()
defer s.attestationPoolLock.RUnlock()
atts := make([]*ethpb.Attestation, 0, len(s.attestationPool))
for _, ac := range s.attestationPool {
if ac.Data.Slot == slot && ac.Data.Index == index {
atts = append(atts, ac.ToAttestations()...)
}
}
return atts, nil
}
// HandleAttestation processes a received attestation message.
func (s *Service) HandleAttestation(ctx context.Context, message proto.Message) error {
ctx, span := trace.StartSpan(ctx, "operations.HandleAttestation")

View File

@@ -32,7 +32,7 @@ type Service struct {
error error
attestationPool map[[32]byte]*dbpb.AttestationContainer
recentAttestationBitlist *recentAttestationMultiMap
attestationPoolLock sync.Mutex
attestationPoolLock sync.RWMutex
attestationLockCache *ccache.Cache
}

View File

@@ -31,3 +31,8 @@ func (op *Operations) AttestationPoolForForkchoice(ctx context.Context) ([]*ethp
func (op *Operations) HandleAttestation(context.Context, proto.Message) error {
return nil
}
// AttestationsBySlotCommittee --
func (op *Operations) AttestationsBySlotCommittee(ctx context.Context, slot uint64, index uint64) ([]*ethpb.Attestation, error) {
return nil, nil
}

View File

@@ -13,6 +13,7 @@ go_library(
"//beacon-chain/operations:go_default_library",
"//beacon-chain/p2p:go_default_library",
"//beacon-chain/powchain:go_default_library",
"//beacon-chain/rpc/aggregator:go_default_library",
"//beacon-chain/rpc/attester:go_default_library",
"//beacon-chain/rpc/beacon:go_default_library",
"//beacon-chain/rpc/node:go_default_library",

View File

@@ -0,0 +1,37 @@
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
go_library(
name = "go_default_library",
srcs = ["server.go"],
importpath = "github.com/prysmaticlabs/prysm/beacon-chain/rpc/aggregator",
visibility = ["//beacon-chain:__subpackages__"],
deps = [
"//beacon-chain/blockchain:go_default_library",
"//beacon-chain/core/helpers:go_default_library",
"//beacon-chain/core/state:go_default_library",
"//beacon-chain/db:go_default_library",
"//beacon-chain/sync:go_default_library",
"//proto/beacon/rpc/v1:go_default_library",
"//shared/bls:go_default_library",
"//shared/bytesutil:go_default_library",
"@com_github_sirupsen_logrus//:go_default_library",
"@io_opencensus_go//trace:go_default_library",
"@org_golang_google_grpc//codes:go_default_library",
"@org_golang_google_grpc//status:go_default_library",
],
)
go_test(
name = "go_default_test",
srcs = ["server_test.go"],
embed = [":go_default_library"],
deps = [
"//beacon-chain/blockchain/testing:go_default_library",
"//beacon-chain/db/testing:go_default_library",
"//beacon-chain/sync/initial-sync/testing:go_default_library",
"//proto/beacon/p2p/v1:go_default_library",
"//proto/beacon/rpc/v1:go_default_library",
"//shared/bls:go_default_library",
"//shared/params:go_default_library",
],
)

View File

@@ -0,0 +1,83 @@
package aggregator
import (
"context"
"github.com/prysmaticlabs/prysm/beacon-chain/blockchain"
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
"github.com/prysmaticlabs/prysm/beacon-chain/core/state"
"github.com/prysmaticlabs/prysm/beacon-chain/db"
"github.com/prysmaticlabs/prysm/beacon-chain/sync"
pb "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1"
"github.com/prysmaticlabs/prysm/shared/bls"
"github.com/prysmaticlabs/prysm/shared/bytesutil"
"github.com/sirupsen/logrus"
"go.opencensus.io/trace"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
var log logrus.FieldLogger
func init() {
log = logrus.WithField("prefix", "rpc/aggregator")
}
// Server defines a server implementation of the gRPC aggregator service.
type Server struct {
BeaconDB db.Database
HeadFetcher blockchain.HeadFetcher
SyncChecker sync.Checker
}
// SubmitAggregateAndProof is called by a validator when its assigned to be an aggregator.
// The beacon node will broadcast aggregated attestation and proof on the aggregator's behavior.
func (as *Server) SubmitAggregateAndProof(ctx context.Context, req *pb.AggregationRequest) (*pb.AggregationResponse, error) {
ctx, span := trace.StartSpan(ctx, "AggregatorServer.SubmitAggregation")
defer span.End()
span.AddAttributes(trace.Int64Attribute("slot", int64(req.Slot)))
if as.SyncChecker.Syncing() {
return nil, status.Errorf(codes.Unavailable, "Syncing to latest head, not ready to respond")
}
headState, err := as.HeadFetcher.HeadState(ctx)
if err != nil {
return nil, status.Errorf(codes.Internal, "Could not retrieve head state: %v", err)
}
headState, err = state.ProcessSlots(ctx, headState, req.Slot)
if err != nil {
return nil, status.Errorf(codes.Internal, "Could not process slots up to %d: %v", req.Slot, err)
}
validatorIndex, exists, err := as.BeaconDB.ValidatorIndex(ctx, bytesutil.ToBytes48(req.PublicKey))
if err != nil {
return nil, status.Errorf(codes.Internal, "Could not get validator index from DB: %v", err)
}
if !exists {
return nil, status.Error(codes.Internal, "Could not locate validator index in DB")
}
// Check if the validator is an aggregator
sig, err := bls.SignatureFromBytes(req.SlotSignature)
if err != nil {
return nil, status.Errorf(codes.Internal, "Could not convert signature to byte: %v", err)
}
isAggregator, err := helpers.IsAggregator(headState, req.Slot, req.CommitteeIndex, sig)
if err != nil {
return nil, status.Errorf(codes.Internal, "Could not get aggregator status: %v", err)
}
if !isAggregator {
return nil, status.Errorf(codes.InvalidArgument, "Validator is not an aggregator")
}
// TODO(3865): Broadcast aggregated attestation & proof via the aggregation topic
log.WithFields(logrus.Fields{
"slot": req.Slot,
"validatorIndex": validatorIndex,
"committeeIndex": req.CommitteeIndex,
}).Info("Broadcasting aggregated attestation and proof")
return &pb.AggregationResponse{}, nil
}

View File

@@ -0,0 +1,99 @@
package aggregator
import (
"context"
"crypto/rand"
"strings"
"testing"
mock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing"
dbutil "github.com/prysmaticlabs/prysm/beacon-chain/db/testing"
mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing"
pbp2p "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
pb "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1"
"github.com/prysmaticlabs/prysm/shared/bls"
"github.com/prysmaticlabs/prysm/shared/params"
)
func init() {
// Use minimal config to reduce test setup time.
params.OverrideBeaconConfig(params.MinimalSpecConfig())
}
func TestSubmitAggregateAndProof_Syncing(t *testing.T) {
db := dbutil.SetupDB(t)
defer dbutil.TeardownDB(t, db)
ctx := context.Background()
s := &pbp2p.BeaconState{}
aggregatorServer := &Server{
HeadFetcher: &mock.ChainService{State: s},
SyncChecker: &mockSync.Sync{IsSyncing: true},
BeaconDB: db,
}
req := &pb.AggregationRequest{CommitteeIndex: 1}
wanted := "Syncing to latest head, not ready to respond"
if _, err := aggregatorServer.SubmitAggregateAndProof(ctx, req); !strings.Contains(err.Error(), wanted) {
t.Error("Did not receive wanted error")
}
}
func TestSubmitAggregateAndProof_CantFindValidatorIndex(t *testing.T) {
db := dbutil.SetupDB(t)
defer dbutil.TeardownDB(t, db)
ctx := context.Background()
s := &pbp2p.BeaconState{
RandaoMixes: make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector),
}
aggregatorServer := &Server{
HeadFetcher: &mock.ChainService{State: s},
SyncChecker: &mockSync.Sync{IsSyncing: false},
BeaconDB: db,
}
priv, err := bls.RandKey(rand.Reader)
if err != nil {
t.Fatal(err)
}
sig := priv.Sign([]byte{'A'}, 0)
req := &pb.AggregationRequest{CommitteeIndex: 1, SlotSignature: sig.Marshal()}
wanted := "Could not locate validator index in DB"
if _, err := aggregatorServer.SubmitAggregateAndProof(ctx, req); !strings.Contains(err.Error(), wanted) {
t.Error("Did not receive wanted error")
}
}
func TestSubmitAggregateAndProof_IsAggregator(t *testing.T) {
db := dbutil.SetupDB(t)
defer dbutil.TeardownDB(t, db)
ctx := context.Background()
s := &pbp2p.BeaconState{
RandaoMixes: make([][]byte, params.BeaconConfig().EpochsPerHistoricalVector),
}
aggregatorServer := &Server{
HeadFetcher: &mock.ChainService{State: s},
SyncChecker: &mockSync.Sync{IsSyncing: false},
BeaconDB: db,
}
priv, err := bls.RandKey(rand.Reader)
if err != nil {
t.Fatal(err)
}
sig := priv.Sign([]byte{'A'}, 0)
pubKey := [48]byte{'A'}
req := &pb.AggregationRequest{CommitteeIndex: 1, SlotSignature: sig.Marshal(), PublicKey: pubKey[:]}
if err := aggregatorServer.BeaconDB.SaveValidatorIndex(ctx, pubKey, 100); err != nil {
t.Fatal(err)
}
if _, err = aggregatorServer.SubmitAggregateAndProof(ctx, req); err != nil {
t.Fatal(err)
}
}

View File

@@ -23,14 +23,13 @@ import (
func (bs *Server) ListValidatorBalances(
ctx context.Context,
req *ethpb.ListValidatorBalancesRequest) (*ethpb.ValidatorBalances, error) {
if int(req.PageSize) > params.BeaconConfig().MaxPageSize {
return nil, status.Errorf(codes.InvalidArgument, "Requested page size %d can not be greater than max size %d",
req.PageSize, params.BeaconConfig().MaxPageSize)
}
res := make([]*ethpb.ValidatorBalances_Balance, 0)
filtered := map[uint64]bool{} // track filtered validators to prevent duplication in the response.
filtered := map[uint64]bool{} // Track filtered validators to prevent duplication in the response.
headState, err := bs.HeadFetcher.HeadState(ctx)
if err != nil {
@@ -75,7 +74,7 @@ func (bs *Server) ListValidatorBalances(
}
for _, pubKey := range req.PublicKeys {
// Skip empty public key
// Skip empty public key.
if len(pubKey) == 0 {
continue
}
@@ -122,8 +121,8 @@ func (bs *Server) ListValidatorBalances(
}
if len(req.Indices) == 0 && len(req.PublicKeys) == 0 {
// return everything.
for i := 0; i < len(headState.Balances); i++ {
// Return everything.
for i := 0; i < len(balances); i++ {
res = append(res, &ethpb.ValidatorBalances_Balance{
PublicKey: headState.Validators[i].PublicKey,
Index: uint64(i),
@@ -187,10 +186,10 @@ func (bs *Server) ListValidators(
requestedEpoch = q.Epoch
}
validators := headState.Validators
vals := headState.Validators
if requestedEpoch < currentEpoch {
stopIdx := len(validators)
for idx, val := range validators {
stopIdx := len(vals)
for idx, val := range vals {
// The first time we see a validator with an activation epoch > the requested epoch,
// we know this validator is from the future relative to what the request wants.
if val.ActivationEpoch > requestedEpoch {
@@ -198,7 +197,7 @@ func (bs *Server) ListValidators(
break
}
}
validators = validators[:stopIdx]
vals = vals[:stopIdx]
} else if requestedEpoch > currentEpoch {
// Otherwise, we are requesting data from the future and we return an error.
return nil, status.Errorf(
@@ -209,8 +208,20 @@ func (bs *Server) ListValidators(
)
}
validatorCount := len(validators)
// If there are no validators, we simply return a response specifying this.
// Filter active validators if the request specifies it.
res := vals
if req.Active {
filteredValidators := make([]*ethpb.Validator, 0)
for _, val := range vals {
if helpers.IsActiveValidator(val, requestedEpoch) {
filteredValidators = append(filteredValidators, val)
}
}
res = filteredValidators
}
validatorCount := len(res)
// If there are no items, we simply return a response specifying this.
// Otherwise, attempting to paginate 0 validators below would result in an error.
if validatorCount == 0 {
return &ethpb.Validators{
@@ -230,7 +241,7 @@ func (bs *Server) ListValidators(
}
return &ethpb.Validators{
Validators: validators[start:end],
Validators: res[start:end],
TotalSize: int32(validatorCount),
NextPageToken: nextPageToken,
}, nil

View File

@@ -83,6 +83,107 @@ func TestServer_ListValidatorBalances_NoResults(t *testing.T) {
}
}
func TestServer_ListValidatorBalances_DefaultResponse_NoArchive(t *testing.T) {
db := dbTest.SetupDB(t)
defer dbTest.TeardownDB(t, db)
ctx := context.Background()
numItems := 100
validators := make([]*ethpb.Validator, numItems)
balances := make([]uint64, numItems)
balancesResponse := make([]*ethpb.ValidatorBalances_Balance, numItems)
for i := 0; i < numItems; i++ {
validators[i] = &ethpb.Validator{
PublicKey: []byte(strconv.Itoa(i)),
}
balances[i] = params.BeaconConfig().MaxEffectiveBalance
balancesResponse[i] = &ethpb.ValidatorBalances_Balance{
PublicKey: []byte(strconv.Itoa(i)),
Index: uint64(i),
Balance: params.BeaconConfig().MaxEffectiveBalance,
}
}
bs := &Server{
BeaconDB: db,
HeadFetcher: &mock.ChainService{
State: &pbp2p.BeaconState{
Slot: 0,
Validators: validators,
Balances: balances,
},
},
}
res, err := bs.ListValidatorBalances(
ctx,
&ethpb.ListValidatorBalancesRequest{
QueryFilter: &ethpb.ListValidatorBalancesRequest_Epoch{
Epoch: 0,
},
},
)
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(balancesResponse, res.Balances) {
t.Errorf("Wanted %v, received %v", balancesResponse, res.Balances)
}
}
func TestServer_ListValidatorBalances_DefaultResponse_FromArchive(t *testing.T) {
db := dbTest.SetupDB(t)
defer dbTest.TeardownDB(t, db)
ctx := context.Background()
currentNumValidators := 100
numOldBalances := 50
validators := make([]*ethpb.Validator, currentNumValidators)
balances := make([]uint64, currentNumValidators)
oldBalances := make([]uint64, numOldBalances)
balancesResponse := make([]*ethpb.ValidatorBalances_Balance, numOldBalances)
for i := 0; i < currentNumValidators; i++ {
validators[i] = &ethpb.Validator{
PublicKey: []byte(strconv.Itoa(i)),
}
balances[i] = params.BeaconConfig().MaxEffectiveBalance
}
for i := 0; i < numOldBalances; i++ {
oldBalances[i] = params.BeaconConfig().MaxEffectiveBalance
balancesResponse[i] = &ethpb.ValidatorBalances_Balance{
PublicKey: []byte(strconv.Itoa(i)),
Index: uint64(i),
Balance: params.BeaconConfig().MaxEffectiveBalance,
}
}
// We archive old balances for epoch 50.
if err := db.SaveArchivedBalances(ctx, 50, oldBalances); err != nil {
t.Fatal(err)
}
bs := &Server{
BeaconDB: db,
HeadFetcher: &mock.ChainService{
State: &pbp2p.BeaconState{
Slot: helpers.StartSlot(100 /* epoch 100 */),
Validators: validators,
Balances: balances,
},
},
}
res, err := bs.ListValidatorBalances(
ctx,
&ethpb.ListValidatorBalancesRequest{
QueryFilter: &ethpb.ListValidatorBalancesRequest_Epoch{
Epoch: 50,
},
},
)
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(balancesResponse, res.Balances) {
t.Errorf("Wanted %v, received %v", balancesResponse, res.Balances)
}
}
func TestServer_ListValidatorBalances_PaginationOutOfRange(t *testing.T) {
db := dbTest.SetupDB(t)
defer dbTest.TeardownDB(t, db)
@@ -430,6 +531,58 @@ func TestServer_ListValidators_NoResults(t *testing.T) {
}
}
func TestServer_ListValidators_OnlyActiveValidators(t *testing.T) {
db := dbTest.SetupDB(t)
defer dbTest.TeardownDB(t, db)
ctx := context.Background()
count := 100
balances := make([]uint64, count)
validators := make([]*ethpb.Validator, count)
activeValidators := make([]*ethpb.Validator, 0)
for i := 0; i < count; i++ {
if err := db.SaveValidatorIndex(ctx, [48]byte{byte(i)}, uint64(i)); err != nil {
t.Fatal(err)
}
balances[i] = params.BeaconConfig().MaxEffectiveBalance
// We mark even validators as active, and odd validators as inactive.
if i%2 == 0 {
val := &ethpb.Validator{
PublicKey: []byte{byte(i)},
ActivationEpoch: 0,
ExitEpoch: params.BeaconConfig().FarFutureEpoch,
}
validators[i] = val
activeValidators = append(activeValidators, val)
} else {
validators[i] = &ethpb.Validator{
PublicKey: []byte{byte(i)},
ActivationEpoch: 0,
ExitEpoch: 0,
}
}
}
headState := &pbp2p.BeaconState{Validators: validators, Balances: balances}
bs := &Server{
HeadFetcher: &mock.ChainService{
State: headState,
},
}
received, err := bs.ListValidators(context.Background(), &ethpb.ListValidatorsRequest{
Active: true,
})
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(activeValidators, received.Validators) {
t.Errorf("Wanted %v, received %v", activeValidators, received.Validators)
}
}
func TestServer_ListValidators_NoPagination(t *testing.T) {
db := dbTest.SetupDB(t)
defer dbTest.TeardownDB(t, db)

View File

@@ -20,6 +20,7 @@ import (
"github.com/prysmaticlabs/prysm/beacon-chain/operations"
"github.com/prysmaticlabs/prysm/beacon-chain/p2p"
"github.com/prysmaticlabs/prysm/beacon-chain/powchain"
"github.com/prysmaticlabs/prysm/beacon-chain/rpc/aggregator"
"github.com/prysmaticlabs/prysm/beacon-chain/rpc/attester"
"github.com/prysmaticlabs/prysm/beacon-chain/rpc/beacon"
"github.com/prysmaticlabs/prysm/beacon-chain/rpc/node"
@@ -223,9 +224,15 @@ func (s *Service) Start() {
ChainStartFetcher: s.chainStartFetcher,
CanonicalStateChan: s.canonicalStateChan,
}
aggregatorServer := &aggregator.Server{
BeaconDB: s.beaconDB,
HeadFetcher: s.headFetcher,
SyncChecker: s.syncService,
}
pb.RegisterProposerServiceServer(s.grpcServer, proposerServer)
pb.RegisterAttesterServiceServer(s.grpcServer, attesterServer)
pb.RegisterValidatorServiceServer(s.grpcServer, validatorServer)
pb.RegisterAggregatorServiceServer(s.grpcServer, aggregatorServer)
ethpb.RegisterNodeServer(s.grpcServer, nodeServer)
ethpb.RegisterBeaconChainServer(s.grpcServer, beaconChainServer)

View File

@@ -13,7 +13,6 @@ import (
proto "github.com/gogo/protobuf/proto"
types "github.com/gogo/protobuf/types"
v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
_ "google.golang.org/genproto/googleapis/api/annotations"
grpc "google.golang.org/grpc"
)
@@ -31,24 +30,24 @@ const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
type ValidatorRole int32
const (
ValidatorRole_UNKNOWN ValidatorRole = 0
ValidatorRole_ATTESTER ValidatorRole = 1
ValidatorRole_PROPOSER ValidatorRole = 2
ValidatorRole_BOTH ValidatorRole = 3
ValidatorRole_UNKNOWN ValidatorRole = 0
ValidatorRole_ATTESTER ValidatorRole = 1
ValidatorRole_PROPOSER ValidatorRole = 2
ValidatorRole_AGGREGATOR ValidatorRole = 3
)
var ValidatorRole_name = map[int32]string{
0: "UNKNOWN",
1: "ATTESTER",
2: "PROPOSER",
3: "BOTH",
3: "AGGREGATOR",
}
var ValidatorRole_value = map[string]int32{
"UNKNOWN": 0,
"ATTESTER": 1,
"PROPOSER": 2,
"BOTH": 3,
"UNKNOWN": 0,
"ATTESTER": 1,
"PROPOSER": 2,
"AGGREGATOR": 3,
}
func (x ValidatorRole) String() string {
@@ -322,6 +321,124 @@ func (m *AttestResponse) GetRoot() []byte {
return nil
}
type AggregationRequest struct {
Slot uint64 `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty"`
CommitteeIndex uint64 `protobuf:"varint,2,opt,name=committee_index,json=committeeIndex,proto3" json:"committee_index,omitempty"`
PublicKey []byte `protobuf:"bytes,3,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"`
SlotSignature []byte `protobuf:"bytes,4,opt,name=slot_signature,json=slotSignature,proto3" json:"slot_signature,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *AggregationRequest) Reset() { *m = AggregationRequest{} }
func (m *AggregationRequest) String() string { return proto.CompactTextString(m) }
func (*AggregationRequest) ProtoMessage() {}
func (*AggregationRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{4}
}
func (m *AggregationRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *AggregationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_AggregationRequest.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalTo(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *AggregationRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_AggregationRequest.Merge(m, src)
}
func (m *AggregationRequest) XXX_Size() int {
return m.Size()
}
func (m *AggregationRequest) XXX_DiscardUnknown() {
xxx_messageInfo_AggregationRequest.DiscardUnknown(m)
}
var xxx_messageInfo_AggregationRequest proto.InternalMessageInfo
func (m *AggregationRequest) GetSlot() uint64 {
if m != nil {
return m.Slot
}
return 0
}
func (m *AggregationRequest) GetCommitteeIndex() uint64 {
if m != nil {
return m.CommitteeIndex
}
return 0
}
func (m *AggregationRequest) GetPublicKey() []byte {
if m != nil {
return m.PublicKey
}
return nil
}
func (m *AggregationRequest) GetSlotSignature() []byte {
if m != nil {
return m.SlotSignature
}
return nil
}
type AggregationResponse struct {
Root []byte `protobuf:"bytes,1,opt,name=root,proto3" json:"root,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *AggregationResponse) Reset() { *m = AggregationResponse{} }
func (m *AggregationResponse) String() string { return proto.CompactTextString(m) }
func (*AggregationResponse) ProtoMessage() {}
func (*AggregationResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{5}
}
func (m *AggregationResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *AggregationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_AggregationResponse.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalTo(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *AggregationResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_AggregationResponse.Merge(m, src)
}
func (m *AggregationResponse) XXX_Size() int {
return m.Size()
}
func (m *AggregationResponse) XXX_DiscardUnknown() {
xxx_messageInfo_AggregationResponse.DiscardUnknown(m)
}
var xxx_messageInfo_AggregationResponse proto.InternalMessageInfo
func (m *AggregationResponse) GetRoot() []byte {
if m != nil {
return m.Root
}
return nil
}
type ValidatorPerformanceRequest struct {
Slot uint64 `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty"`
PublicKeys [][]byte `protobuf:"bytes,2,rep,name=public_keys,json=publicKeys,proto3" json:"public_keys,omitempty"`
@@ -334,7 +451,7 @@ func (m *ValidatorPerformanceRequest) Reset() { *m = ValidatorPerformanc
func (m *ValidatorPerformanceRequest) String() string { return proto.CompactTextString(m) }
func (*ValidatorPerformanceRequest) ProtoMessage() {}
func (*ValidatorPerformanceRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{4}
return fileDescriptor_9eb4e94b85965285, []int{6}
}
func (m *ValidatorPerformanceRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -392,7 +509,7 @@ func (m *ValidatorPerformanceResponse) Reset() { *m = ValidatorPerforman
func (m *ValidatorPerformanceResponse) String() string { return proto.CompactTextString(m) }
func (*ValidatorPerformanceResponse) ProtoMessage() {}
func (*ValidatorPerformanceResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{5}
return fileDescriptor_9eb4e94b85965285, []int{7}
}
func (m *ValidatorPerformanceResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -467,7 +584,7 @@ func (m *ValidatorActivationRequest) Reset() { *m = ValidatorActivationR
func (m *ValidatorActivationRequest) String() string { return proto.CompactTextString(m) }
func (*ValidatorActivationRequest) ProtoMessage() {}
func (*ValidatorActivationRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{6}
return fileDescriptor_9eb4e94b85965285, []int{8}
}
func (m *ValidatorActivationRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -515,7 +632,7 @@ func (m *ValidatorActivationResponse) Reset() { *m = ValidatorActivation
func (m *ValidatorActivationResponse) String() string { return proto.CompactTextString(m) }
func (*ValidatorActivationResponse) ProtoMessage() {}
func (*ValidatorActivationResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{7}
return fileDescriptor_9eb4e94b85965285, []int{9}
}
func (m *ValidatorActivationResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -571,7 +688,7 @@ func (m *ValidatorActivationResponse_Status) Reset() { *m = ValidatorAct
func (m *ValidatorActivationResponse_Status) String() string { return proto.CompactTextString(m) }
func (*ValidatorActivationResponse_Status) ProtoMessage() {}
func (*ValidatorActivationResponse_Status) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{7, 0}
return fileDescriptor_9eb4e94b85965285, []int{9, 0}
}
func (m *ValidatorActivationResponse_Status) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -625,7 +742,7 @@ func (m *ExitedValidatorsRequest) Reset() { *m = ExitedValidatorsRequest
func (m *ExitedValidatorsRequest) String() string { return proto.CompactTextString(m) }
func (*ExitedValidatorsRequest) ProtoMessage() {}
func (*ExitedValidatorsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{8}
return fileDescriptor_9eb4e94b85965285, []int{10}
}
func (m *ExitedValidatorsRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -672,7 +789,7 @@ func (m *ExitedValidatorsResponse) Reset() { *m = ExitedValidatorsRespon
func (m *ExitedValidatorsResponse) String() string { return proto.CompactTextString(m) }
func (*ExitedValidatorsResponse) ProtoMessage() {}
func (*ExitedValidatorsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{9}
return fileDescriptor_9eb4e94b85965285, []int{11}
}
func (m *ExitedValidatorsResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -720,7 +837,7 @@ func (m *ChainStartResponse) Reset() { *m = ChainStartResponse{} }
func (m *ChainStartResponse) String() string { return proto.CompactTextString(m) }
func (*ChainStartResponse) ProtoMessage() {}
func (*ChainStartResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{10}
return fileDescriptor_9eb4e94b85965285, []int{12}
}
func (m *ChainStartResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -774,7 +891,7 @@ func (m *ValidatorIndexRequest) Reset() { *m = ValidatorIndexRequest{} }
func (m *ValidatorIndexRequest) String() string { return proto.CompactTextString(m) }
func (*ValidatorIndexRequest) ProtoMessage() {}
func (*ValidatorIndexRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{11}
return fileDescriptor_9eb4e94b85965285, []int{13}
}
func (m *ValidatorIndexRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -821,7 +938,7 @@ func (m *ValidatorIndexResponse) Reset() { *m = ValidatorIndexResponse{}
func (m *ValidatorIndexResponse) String() string { return proto.CompactTextString(m) }
func (*ValidatorIndexResponse) ProtoMessage() {}
func (*ValidatorIndexResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{12}
return fileDescriptor_9eb4e94b85965285, []int{14}
}
func (m *ValidatorIndexResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -869,7 +986,7 @@ func (m *AssignmentRequest) Reset() { *m = AssignmentRequest{} }
func (m *AssignmentRequest) String() string { return proto.CompactTextString(m) }
func (*AssignmentRequest) ProtoMessage() {}
func (*AssignmentRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{13}
return fileDescriptor_9eb4e94b85965285, []int{15}
}
func (m *AssignmentRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -923,7 +1040,7 @@ func (m *AssignmentResponse) Reset() { *m = AssignmentResponse{} }
func (m *AssignmentResponse) String() string { return proto.CompactTextString(m) }
func (*AssignmentResponse) ProtoMessage() {}
func (*AssignmentResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{14}
return fileDescriptor_9eb4e94b85965285, []int{16}
}
func (m *AssignmentResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -977,7 +1094,7 @@ func (m *AssignmentResponse_ValidatorAssignment) Reset() {
func (m *AssignmentResponse_ValidatorAssignment) String() string { return proto.CompactTextString(m) }
func (*AssignmentResponse_ValidatorAssignment) ProtoMessage() {}
func (*AssignmentResponse_ValidatorAssignment) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{14, 0}
return fileDescriptor_9eb4e94b85965285, []int{16, 0}
}
func (m *AssignmentResponse_ValidatorAssignment) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1063,7 +1180,7 @@ func (m *ValidatorStatusResponse) Reset() { *m = ValidatorStatusResponse
func (m *ValidatorStatusResponse) String() string { return proto.CompactTextString(m) }
func (*ValidatorStatusResponse) ProtoMessage() {}
func (*ValidatorStatusResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{15}
return fileDescriptor_9eb4e94b85965285, []int{17}
}
func (m *ValidatorStatusResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1139,7 +1256,7 @@ func (m *DomainRequest) Reset() { *m = DomainRequest{} }
func (m *DomainRequest) String() string { return proto.CompactTextString(m) }
func (*DomainRequest) ProtoMessage() {}
func (*DomainRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{16}
return fileDescriptor_9eb4e94b85965285, []int{18}
}
func (m *DomainRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1193,7 +1310,7 @@ func (m *DomainResponse) Reset() { *m = DomainResponse{} }
func (m *DomainResponse) String() string { return proto.CompactTextString(m) }
func (*DomainResponse) ProtoMessage() {}
func (*DomainResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{17}
return fileDescriptor_9eb4e94b85965285, []int{19}
}
func (m *DomainResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1240,7 +1357,7 @@ func (m *BlockTreeResponse) Reset() { *m = BlockTreeResponse{} }
func (m *BlockTreeResponse) String() string { return proto.CompactTextString(m) }
func (*BlockTreeResponse) ProtoMessage() {}
func (*BlockTreeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{18}
return fileDescriptor_9eb4e94b85965285, []int{20}
}
func (m *BlockTreeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1290,7 +1407,7 @@ func (m *BlockTreeResponse_TreeNode) Reset() { *m = BlockTreeResponse_Tr
func (m *BlockTreeResponse_TreeNode) String() string { return proto.CompactTextString(m) }
func (*BlockTreeResponse_TreeNode) ProtoMessage() {}
func (*BlockTreeResponse_TreeNode) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{18, 0}
return fileDescriptor_9eb4e94b85965285, []int{20, 0}
}
func (m *BlockTreeResponse_TreeNode) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1359,7 +1476,7 @@ func (m *TreeBlockSlotRequest) Reset() { *m = TreeBlockSlotRequest{} }
func (m *TreeBlockSlotRequest) String() string { return proto.CompactTextString(m) }
func (*TreeBlockSlotRequest) ProtoMessage() {}
func (*TreeBlockSlotRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{19}
return fileDescriptor_9eb4e94b85965285, []int{21}
}
func (m *TreeBlockSlotRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1409,6 +1526,8 @@ func init() {
proto.RegisterType((*ProposeResponse)(nil), "ethereum.beacon.rpc.v1.ProposeResponse")
proto.RegisterType((*AttestationRequest)(nil), "ethereum.beacon.rpc.v1.AttestationRequest")
proto.RegisterType((*AttestResponse)(nil), "ethereum.beacon.rpc.v1.AttestResponse")
proto.RegisterType((*AggregationRequest)(nil), "ethereum.beacon.rpc.v1.AggregationRequest")
proto.RegisterType((*AggregationResponse)(nil), "ethereum.beacon.rpc.v1.AggregationResponse")
proto.RegisterType((*ValidatorPerformanceRequest)(nil), "ethereum.beacon.rpc.v1.ValidatorPerformanceRequest")
proto.RegisterType((*ValidatorPerformanceResponse)(nil), "ethereum.beacon.rpc.v1.ValidatorPerformanceResponse")
proto.RegisterType((*ValidatorActivationRequest)(nil), "ethereum.beacon.rpc.v1.ValidatorActivationRequest")
@@ -1433,106 +1552,111 @@ func init() {
func init() { proto.RegisterFile("proto/beacon/rpc/v1/services.proto", fileDescriptor_9eb4e94b85965285) }
var fileDescriptor_9eb4e94b85965285 = []byte{
// 1581 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0x4f, 0x6f, 0x13, 0x47,
0x14, 0x67, 0x1d, 0xc7, 0x09, 0xcf, 0x4e, 0xb2, 0x99, 0x84, 0xc4, 0x98, 0x40, 0xd3, 0x2d, 0x94,
0x24, 0x12, 0x76, 0x62, 0x10, 0x6a, 0x41, 0x14, 0xd9, 0xf1, 0x92, 0x58, 0x20, 0x27, 0xac, 0x4d,
0x42, 0xc5, 0x61, 0x35, 0xb6, 0x87, 0x78, 0x85, 0xbd, 0xb3, 0xd9, 0x1d, 0x5b, 0xe4, 0x52, 0xa9,
0x97, 0x4a, 0xbd, 0xb5, 0x87, 0x9e, 0xab, 0x7e, 0x86, 0x1e, 0xfa, 0x15, 0x38, 0xf6, 0x03, 0xf4,
0x50, 0xa1, 0x7e, 0x90, 0x6a, 0x67, 0x66, 0xd7, 0x1b, 0xff, 0x21, 0x0e, 0xb7, 0x9d, 0xf7, 0xde,
0xef, 0xbd, 0x37, 0x6f, 0xde, 0x3f, 0x1b, 0x34, 0xc7, 0xa5, 0x8c, 0xe6, 0xea, 0x04, 0x37, 0xa8,
0x9d, 0x73, 0x9d, 0x46, 0xae, 0xb7, 0x93, 0xf3, 0x88, 0xdb, 0xb3, 0x1a, 0xc4, 0xcb, 0x72, 0x26,
0x5a, 0x21, 0xac, 0x45, 0x5c, 0xd2, 0xed, 0x64, 0x85, 0x58, 0xd6, 0x75, 0x1a, 0xd9, 0xde, 0x4e,
0xe6, 0xc6, 0x09, 0xa5, 0x27, 0x6d, 0x92, 0xe3, 0x52, 0xf5, 0xee, 0xdb, 0x1c, 0xe9, 0x38, 0xec,
0x4c, 0x80, 0x32, 0x77, 0x84, 0x62, 0xc2, 0x5a, 0xb9, 0xde, 0x0e, 0x6e, 0x3b, 0x2d, 0xbc, 0x23,
0xad, 0x98, 0xf5, 0x36, 0x6d, 0xbc, 0x93, 0x62, 0xb7, 0x47, 0x88, 0x61, 0xc6, 0x88, 0xc7, 0x30,
0xb3, 0xa8, 0x2d, 0xa5, 0xd6, 0xa4, 0x25, 0xec, 0x58, 0x39, 0x6c, 0xdb, 0x54, 0x30, 0xa5, 0x7f,
0xda, 0x1e, 0xa4, 0x8a, 0xbe, 0x4a, 0x83, 0x9c, 0x76, 0x89, 0xc7, 0x10, 0x82, 0xb8, 0xd7, 0xa6,
0x2c, 0xad, 0xac, 0x2b, 0x1b, 0x71, 0x83, 0x7f, 0xa3, 0xaf, 0x60, 0xce, 0xc5, 0x76, 0x13, 0x53,
0xd3, 0x25, 0x3d, 0x82, 0xdb, 0xe9, 0xd8, 0xba, 0xb2, 0x91, 0x32, 0x52, 0x82, 0x68, 0x70, 0x9a,
0xb6, 0x0d, 0x0b, 0x87, 0x2e, 0x75, 0xa8, 0x47, 0x0c, 0xe2, 0x39, 0xd4, 0xf6, 0x08, 0xba, 0x09,
0xc0, 0xdd, 0x35, 0x5d, 0x2a, 0x35, 0xa6, 0x8c, 0xab, 0x9c, 0x62, 0x50, 0xca, 0xb4, 0x9f, 0x15,
0x40, 0x85, 0xbe, 0xbb, 0x81, 0x07, 0x37, 0x01, 0x9c, 0x6e, 0xbd, 0x6d, 0x35, 0xcc, 0x77, 0xe4,
0x2c, 0x40, 0x09, 0xca, 0x73, 0x72, 0x86, 0x56, 0x61, 0xc6, 0xa1, 0x0d, 0xb3, 0x6e, 0x31, 0xe9,
0x46, 0xc2, 0xa1, 0x8d, 0xa2, 0xd5, 0xf7, 0x7c, 0x2a, 0xe2, 0xf9, 0x5d, 0x58, 0x68, 0xd0, 0x4e,
0xc7, 0x62, 0x8c, 0x10, 0xd3, 0xb2, 0x9b, 0xe4, 0x7d, 0x3a, 0xce, 0xd9, 0xf3, 0x21, 0xb9, 0xec,
0x53, 0xb5, 0xdb, 0x30, 0x2f, 0x5c, 0x09, 0x9d, 0x47, 0x10, 0x8f, 0xb8, 0xcd, 0xbf, 0x35, 0x03,
0x6e, 0x1c, 0xe1, 0xb6, 0xd5, 0xc4, 0x8c, 0xba, 0x87, 0xc4, 0x7d, 0x4b, 0xdd, 0x0e, 0xb6, 0x1b,
0xe4, 0x53, 0xb1, 0xfb, 0x02, 0x92, 0xfd, 0xdb, 0x78, 0xe9, 0xd8, 0xfa, 0xd4, 0x46, 0xca, 0x80,
0xf0, 0x3a, 0x9e, 0xf6, 0x5b, 0x0c, 0xd6, 0x46, 0x2b, 0x95, 0x8e, 0x64, 0x60, 0xb6, 0x8e, 0xdb,
0x3e, 0xc9, 0x4b, 0x2b, 0xeb, 0x53, 0x1b, 0x71, 0x23, 0x3c, 0xa3, 0x4d, 0x50, 0x19, 0x65, 0xb8,
0x6d, 0xf6, 0x02, 0x0d, 0x1e, 0x8f, 0x4a, 0xdc, 0x58, 0xe0, 0xf4, 0x50, 0xb1, 0x87, 0x1e, 0xc2,
0xaa, 0x10, 0xc5, 0x0d, 0x66, 0xf5, 0x48, 0x14, 0x21, 0x22, 0x76, 0x8d, 0xb3, 0x0b, 0x9c, 0x1b,
0xc1, 0xdd, 0x03, 0xd4, 0xb1, 0x3c, 0xcf, 0xb2, 0x4f, 0xa2, 0x90, 0x38, 0xbf, 0xc7, 0xa2, 0xe4,
0x44, 0xc4, 0xf7, 0x60, 0x1d, 0xf7, 0x88, 0x8b, 0x4f, 0xc8, 0x90, 0x21, 0x53, 0xba, 0x9d, 0x9e,
0x5e, 0x57, 0x36, 0x62, 0xc6, 0x4d, 0x29, 0x37, 0x60, 0xb1, 0x28, 0x84, 0xb4, 0x27, 0x90, 0x09,
0x69, 0x5c, 0xe4, 0x5c, 0x92, 0x0c, 0x84, 0x55, 0x19, 0x0a, 0xeb, 0xef, 0xb1, 0xc8, 0x5b, 0x45,
0xf1, 0x32, 0xaa, 0x0f, 0xe1, 0x1a, 0x16, 0x54, 0xd2, 0x34, 0x87, 0x54, 0x15, 0x63, 0x69, 0xc5,
0x58, 0x0a, 0x05, 0x0e, 0x43, 0xbd, 0xe8, 0x08, 0x66, 0xfd, 0x7c, 0xed, 0x7a, 0x44, 0x3c, 0x66,
0x32, 0xff, 0x28, 0x3b, 0xba, 0xc4, 0xb3, 0x9f, 0x30, 0x9f, 0xad, 0x72, 0x1d, 0x46, 0xa8, 0x2b,
0xe3, 0x40, 0x42, 0xd0, 0x2e, 0xca, 0xff, 0x3d, 0x48, 0x08, 0x10, 0x7f, 0xe8, 0x64, 0x3e, 0x77,
0xa1, 0x79, 0x69, 0x4b, 0x9a, 0x36, 0x24, 0x5c, 0x7b, 0x04, 0xab, 0xfa, 0x7b, 0x8b, 0x91, 0x66,
0xff, 0xf5, 0x26, 0x8e, 0xee, 0x63, 0x48, 0x0f, 0x63, 0x65, 0x64, 0x2f, 0x04, 0xbf, 0x04, 0xb4,
0xdb, 0xc2, 0x96, 0x5d, 0x65, 0xd8, 0xed, 0xd7, 0x5b, 0x1a, 0x66, 0x3c, 0x9f, 0x40, 0x9a, 0xfc,
0xce, 0xb3, 0x46, 0x70, 0x44, 0x5f, 0x42, 0xea, 0x84, 0xd8, 0xc4, 0xb3, 0x3c, 0x93, 0x59, 0x1d,
0x22, 0x13, 0x3c, 0x29, 0x69, 0x35, 0xab, 0x43, 0xb4, 0x87, 0x70, 0x2d, 0xf4, 0x84, 0x17, 0xf4,
0x64, 0xcd, 0x44, 0xcb, 0xc2, 0xca, 0x20, 0x4e, 0xba, 0xb3, 0x0c, 0xd3, 0xa2, 0x5f, 0x88, 0x62,
0x16, 0x07, 0xed, 0x15, 0x2c, 0x16, 0x3c, 0xcf, 0x3a, 0xb1, 0x3b, 0xc4, 0x66, 0x91, 0x68, 0x11,
0x87, 0x36, 0x5a, 0x26, 0x77, 0x58, 0x02, 0x80, 0x93, 0xf8, 0x15, 0x2f, 0xee, 0x01, 0xbf, 0x4c,
0x01, 0x8a, 0xea, 0x95, 0x3e, 0x9c, 0xc2, 0x72, 0xbf, 0x78, 0x70, 0xc8, 0xe7, 0x21, 0x4d, 0xe6,
0xbf, 0x1b, 0xf7, 0xf0, 0xc3, 0x9a, 0x22, 0xa9, 0xd8, 0xe7, 0x2d, 0xf5, 0x86, 0x89, 0x99, 0x9f,
0x62, 0xb0, 0x34, 0x42, 0x18, 0xad, 0xc1, 0xd5, 0xb0, 0x63, 0xca, 0x2e, 0xd4, 0x27, 0x8c, 0x6a,
0xb3, 0xb1, 0x51, 0x6d, 0xd6, 0x9f, 0x24, 0x62, 0x40, 0x11, 0xd7, 0x8c, 0x34, 0xeb, 0x54, 0x40,
0xac, 0xca, 0x71, 0xe3, 0x88, 0x49, 0x22, 0x85, 0x44, 0xcb, 0x4e, 0x05, 0x44, 0x2e, 0x74, 0xfe,
0x61, 0xa7, 0x07, 0xab, 0xe4, 0x69, 0x58, 0x25, 0x89, 0x75, 0x65, 0x63, 0x3e, 0x7f, 0x77, 0xd2,
0x2a, 0x09, 0xaa, 0xe3, 0xaf, 0x18, 0xac, 0x8e, 0xa9, 0xa0, 0x88, 0x72, 0xe5, 0xb3, 0x94, 0xa3,
0x6f, 0xe1, 0x3a, 0x61, 0xad, 0x1d, 0xb3, 0x49, 0x1c, 0xea, 0x59, 0x4c, 0x0c, 0x75, 0xd3, 0xee,
0x76, 0xea, 0xc4, 0x95, 0x91, 0xf3, 0xf7, 0x86, 0x9d, 0x92, 0xe0, 0xf3, 0x01, 0x5d, 0xe1, 0x5c,
0xf4, 0x00, 0x56, 0x02, 0x94, 0x65, 0x37, 0xda, 0x5d, 0xcf, 0xa2, 0x76, 0x34, 0x94, 0xcb, 0x92,
0x5b, 0x0e, 0x98, 0x3c, 0x5a, 0x9b, 0xa0, 0xe2, 0xb0, 0x09, 0x99, 0x3c, 0x35, 0x65, 0x54, 0x17,
0xfa, 0x74, 0xdd, 0x27, 0xa3, 0xa7, 0xb0, 0xc6, 0x15, 0xf8, 0x82, 0x96, 0x6d, 0x46, 0x60, 0xa7,
0x5d, 0xd2, 0x15, 0xcd, 0x3b, 0x6e, 0x5c, 0x0f, 0x64, 0xca, 0x76, 0xbf, 0xbb, 0xbd, 0xf4, 0x05,
0xb4, 0x27, 0x30, 0x57, 0xa2, 0x1d, 0x6c, 0x85, 0xbd, 0x7a, 0x19, 0xa6, 0x85, 0x45, 0x59, 0x4a,
0xfc, 0x80, 0x56, 0x20, 0xd1, 0xe4, 0x62, 0xc1, 0x18, 0x17, 0x27, 0xed, 0x31, 0xcc, 0x07, 0x70,
0x19, 0xee, 0x4d, 0x50, 0xfd, 0x3c, 0xc4, 0xac, 0xeb, 0x12, 0x53, 0x62, 0x84, 0xaa, 0x85, 0x90,
0x2e, 0x20, 0xda, 0xaf, 0x31, 0x58, 0xe4, 0xd1, 0xaa, 0xb9, 0xa4, 0x3f, 0x41, 0x9f, 0x41, 0x9c,
0xb9, 0x32, 0x6f, 0x93, 0xf9, 0xfc, 0xb8, 0xd7, 0x1a, 0x02, 0x66, 0xfd, 0x43, 0x85, 0x36, 0x89,
0xc1, 0xf1, 0x99, 0x3f, 0x15, 0x98, 0x0d, 0x48, 0xe8, 0x1b, 0x98, 0xe6, 0xcf, 0xc6, 0x5d, 0x49,
0xe6, 0xb5, 0xbe, 0x56, 0xc2, 0x5a, 0xd9, 0x60, 0x1f, 0xcb, 0x16, 0xb9, 0x09, 0xb1, 0x62, 0x09,
0xc0, 0xc0, 0x5a, 0x14, 0x1b, 0x58, 0x8b, 0xfc, 0x81, 0xeb, 0x60, 0x97, 0x59, 0x0d, 0xcb, 0xe1,
0xc3, 0xa9, 0x47, 0x19, 0x09, 0x66, 0xf4, 0x62, 0x94, 0x73, 0xe4, 0x33, 0xfc, 0xe6, 0x22, 0x57,
0x00, 0x2e, 0x27, 0x5e, 0x15, 0xc4, 0xf4, 0xf7, 0x29, 0xda, 0x0b, 0x58, 0xf6, 0x9d, 0xe6, 0x2e,
0xf8, 0xc9, 0x10, 0x3c, 0xcb, 0x0d, 0xb8, 0xea, 0xe7, 0x8d, 0xf9, 0xd6, 0xa5, 0x1d, 0x19, 0xcf,
0x59, 0x9f, 0xf0, 0xcc, 0xa5, 0x1d, 0x7f, 0xcb, 0xe2, 0x4c, 0x46, 0x65, 0x3e, 0x26, 0xfc, 0x63,
0x8d, 0x6e, 0x15, 0x61, 0x2e, 0xcc, 0x6a, 0x83, 0xb6, 0x09, 0x4a, 0xc2, 0xcc, 0xab, 0xca, 0xf3,
0xca, 0xc1, 0x71, 0x45, 0xbd, 0x82, 0x52, 0x30, 0x5b, 0xa8, 0xd5, 0xf4, 0x6a, 0x4d, 0x37, 0x54,
0xc5, 0x3f, 0x1d, 0x1a, 0x07, 0x87, 0x07, 0x55, 0xdd, 0x50, 0x63, 0x68, 0x16, 0xe2, 0xc5, 0x83,
0xda, 0xbe, 0x3a, 0xb5, 0xf5, 0x87, 0x02, 0x0b, 0x03, 0xa5, 0x81, 0x10, 0xcc, 0x4b, 0x35, 0x66,
0xb5, 0x56, 0xa8, 0xbd, 0xaa, 0xaa, 0x57, 0xd0, 0x32, 0xa8, 0x25, 0xfd, 0xf0, 0xa0, 0x5a, 0xae,
0x99, 0x86, 0xbe, 0xab, 0x97, 0x8f, 0xf4, 0x92, 0xaa, 0xf8, 0x92, 0x87, 0x7a, 0xa5, 0x54, 0xae,
0xec, 0x99, 0x85, 0xdd, 0x5a, 0xf9, 0x48, 0x57, 0x63, 0x08, 0x20, 0x21, 0xbf, 0xa7, 0x7c, 0x7e,
0xb9, 0x52, 0xae, 0x95, 0x0b, 0x35, 0xbd, 0x64, 0xea, 0xaf, 0xcb, 0x35, 0x35, 0x8e, 0x54, 0x48,
0x1d, 0x97, 0x6b, 0xfb, 0x25, 0xa3, 0x70, 0x5c, 0x28, 0xbe, 0xd0, 0xd5, 0x69, 0x1f, 0xe1, 0xf3,
0xf4, 0x92, 0x9a, 0xf0, 0x11, 0xe2, 0xdb, 0xac, 0xbe, 0x28, 0x54, 0xf7, 0xf5, 0x92, 0x3a, 0x93,
0xff, 0x47, 0x81, 0x85, 0x42, 0xd0, 0x95, 0xc4, 0x4a, 0x8f, 0x5a, 0x80, 0x64, 0xf0, 0x22, 0x6b,
0x2b, 0xda, 0x1a, 0xdb, 0x87, 0x87, 0x76, 0xdb, 0xcc, 0xd7, 0x63, 0xb2, 0x24, 0x22, 0x5a, 0xc2,
0x0c, 0x23, 0x13, 0x16, 0xab, 0xdd, 0x7a, 0xc7, 0x3a, 0x67, 0x48, 0xbb, 0x18, 0x1c, 0x35, 0x30,
0xca, 0x99, 0x20, 0xb3, 0xf3, 0x1f, 0x94, 0x70, 0x5d, 0x0f, 0xaf, 0xf7, 0x1a, 0x52, 0xd2, 0x4f,
0x9e, 0x2b, 0xe8, 0xf6, 0x27, 0x0b, 0x25, 0xb8, 0xd2, 0x04, 0x89, 0x8f, 0xde, 0x40, 0x4a, 0x1a,
0x13, 0xe7, 0x09, 0x30, 0x99, 0xb1, 0x4d, 0x75, 0xe0, 0x57, 0x46, 0xfe, 0xbf, 0x19, 0x50, 0xfb,
0xd9, 0x24, 0xef, 0xf2, 0x06, 0x40, 0xb4, 0x04, 0x1e, 0xce, 0x3b, 0xe3, 0x74, 0x9d, 0x6b, 0x54,
0xe3, 0x83, 0x37, 0xd0, 0x90, 0x7e, 0x80, 0xc5, 0x63, 0x6c, 0xb1, 0x67, 0xd1, 0xcd, 0x0e, 0xe5,
0x2f, 0xb5, 0x06, 0x0a, 0x83, 0xf7, 0x3f, 0x63, 0x75, 0xdc, 0x56, 0x10, 0x85, 0xf9, 0xf3, 0x5b,
0x0b, 0xba, 0x77, 0xa1, 0xa2, 0xe8, 0x56, 0x94, 0xc9, 0x4e, 0x2a, 0x2e, 0x2f, 0xdc, 0x86, 0xa5,
0xdd, 0x60, 0x90, 0x47, 0x96, 0x82, 0xcd, 0x49, 0x36, 0x10, 0x61, 0x71, 0x6b, 0xf2, 0x65, 0x05,
0x9d, 0x0e, 0x77, 0x87, 0x4b, 0xde, 0xef, 0xb2, 0x3b, 0x31, 0xfa, 0x51, 0x81, 0xe5, 0x51, 0x3f,
0xc2, 0xd0, 0xc5, 0x2f, 0x34, 0xfc, 0x3b, 0x30, 0xf3, 0xe0, 0x72, 0x20, 0xe9, 0x43, 0x17, 0xd4,
0xc1, 0x9d, 0x1a, 0x8d, 0xbd, 0xc8, 0x98, 0xcd, 0x3d, 0xb3, 0x3d, 0x39, 0x40, 0x9a, 0xfd, 0x3e,
0x4c, 0xe6, 0xfe, 0x52, 0x8e, 0x56, 0xb2, 0xe2, 0x4f, 0x83, 0x6c, 0xf0, 0xf7, 0x44, 0x56, 0xef,
0x38, 0xec, 0x6c, 0xfc, 0x33, 0x0e, 0x2f, 0xf4, 0xdb, 0x0a, 0x7a, 0x0e, 0x73, 0xbb, 0xd8, 0xa6,
0xb6, 0xd5, 0xc0, 0xed, 0x7d, 0x82, 0x9b, 0x63, 0xd5, 0x4e, 0xd0, 0x0f, 0x8a, 0xa9, 0x0f, 0x1f,
0x6f, 0x29, 0x7f, 0x7f, 0xbc, 0xa5, 0xfc, 0xfb, 0xf1, 0x96, 0x52, 0x4f, 0x70, 0x0d, 0xf7, 0xff,
0x0f, 0x00, 0x00, 0xff, 0xff, 0x2e, 0x0b, 0x30, 0xbe, 0x83, 0x11, 0x00, 0x00,
// 1656 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0xcd, 0x6e, 0xdb, 0x48,
0x12, 0x0e, 0x65, 0x59, 0x76, 0x4a, 0xb2, 0x4c, 0xb7, 0x1d, 0x5b, 0x51, 0x7e, 0xd6, 0xcb, 0x24,
0x1b, 0xdb, 0x8b, 0x48, 0xb6, 0x12, 0x04, 0xbb, 0x09, 0xb2, 0x81, 0x6c, 0x31, 0xb6, 0x90, 0x40,
0x56, 0x28, 0xc5, 0xce, 0x22, 0x07, 0x82, 0x92, 0xda, 0x12, 0x11, 0x91, 0x4d, 0x93, 0x2d, 0x21,
0xbe, 0x2c, 0xb0, 0x97, 0x5d, 0xcc, 0x6d, 0xe6, 0x30, 0x98, 0xe3, 0x60, 0x9e, 0x61, 0x0e, 0xf3,
0x0a, 0x39, 0xce, 0x03, 0xcc, 0x61, 0x10, 0xcc, 0x83, 0x0c, 0xd8, 0xdd, 0xa4, 0x68, 0xfd, 0xd8,
0x72, 0x6e, 0xec, 0xfa, 0xfd, 0xba, 0xaa, 0xba, 0xba, 0x9a, 0xa0, 0x38, 0x2e, 0xa1, 0x24, 0xdf,
0xc0, 0x46, 0x93, 0xd8, 0x79, 0xd7, 0x69, 0xe6, 0xfb, 0x3b, 0x79, 0x0f, 0xbb, 0x7d, 0xb3, 0x89,
0xbd, 0x1c, 0x63, 0xa2, 0x55, 0x4c, 0x3b, 0xd8, 0xc5, 0x3d, 0x2b, 0xc7, 0xc5, 0x72, 0xae, 0xd3,
0xcc, 0xf5, 0x77, 0xb2, 0xb7, 0xda, 0x84, 0xb4, 0xbb, 0x38, 0xcf, 0xa4, 0x1a, 0xbd, 0x93, 0x3c,
0xb6, 0x1c, 0x7a, 0xc6, 0x95, 0xb2, 0x0f, 0xb8, 0x61, 0x4c, 0x3b, 0xf9, 0xfe, 0x8e, 0xd1, 0x75,
0x3a, 0xc6, 0x8e, 0xf0, 0xa2, 0x37, 0xba, 0xa4, 0xf9, 0x51, 0x88, 0xdd, 0x1f, 0x23, 0x66, 0x50,
0x8a, 0x3d, 0x6a, 0x50, 0x93, 0xd8, 0x5c, 0x4a, 0xd9, 0x87, 0xd4, 0xae, 0xaf, 0xa4, 0xe1, 0xd3,
0x1e, 0xf6, 0x28, 0x42, 0x10, 0xf7, 0xba, 0x84, 0x66, 0xa4, 0x75, 0x69, 0x23, 0xae, 0xb1, 0x6f,
0x74, 0x0f, 0x16, 0x5c, 0xc3, 0x6e, 0x19, 0x44, 0x77, 0x71, 0x1f, 0x1b, 0xdd, 0x4c, 0x6c, 0x5d,
0xda, 0x48, 0x69, 0x29, 0x4e, 0xd4, 0x18, 0x4d, 0xd9, 0x86, 0xc5, 0xaa, 0x4b, 0x1c, 0xe2, 0x61,
0x0d, 0x7b, 0x0e, 0xb1, 0x3d, 0x8c, 0xee, 0x00, 0x30, 0x40, 0xba, 0x4b, 0x84, 0xc5, 0x94, 0x76,
0x9d, 0x51, 0x34, 0x42, 0xa8, 0xf2, 0x8d, 0x04, 0xa8, 0x38, 0x00, 0x14, 0x20, 0xb8, 0x03, 0xe0,
0xf4, 0x1a, 0x5d, 0xb3, 0xa9, 0x7f, 0xc4, 0x67, 0x81, 0x16, 0xa7, 0xbc, 0xc6, 0x67, 0x68, 0x0d,
0xe6, 0x1c, 0xd2, 0xd4, 0x1b, 0x26, 0x15, 0x30, 0x12, 0x0e, 0x69, 0xee, 0x9a, 0x03, 0xe4, 0x33,
0x11, 0xe4, 0x0f, 0x61, 0xb1, 0x49, 0x2c, 0xcb, 0xa4, 0x14, 0x63, 0xdd, 0xb4, 0x5b, 0xf8, 0x53,
0x26, 0xce, 0xd8, 0xe9, 0x90, 0x5c, 0xf6, 0xa9, 0xca, 0x7d, 0x48, 0x73, 0x28, 0x21, 0x78, 0x04,
0xf1, 0x08, 0x6c, 0xf6, 0xad, 0xfc, 0xe0, 0x23, 0x6e, 0xb7, 0x5d, 0xdc, 0x3e, 0x87, 0x78, 0x5c,
0xcc, 0xc6, 0x78, 0x8e, 0x8d, 0xf3, 0x3c, 0xb4, 0xdd, 0x99, 0xe1, 0xed, 0x3e, 0x80, 0xb4, 0x6f,
0x4f, 0xf7, 0xcc, 0xb6, 0x6d, 0xd0, 0x9e, 0x8b, 0xd9, 0x06, 0x52, 0xda, 0x82, 0x4f, 0xad, 0x05,
0x44, 0x65, 0x13, 0x96, 0xcf, 0x01, 0xbb, 0x60, 0x13, 0x1a, 0xdc, 0x3a, 0x32, 0xba, 0x66, 0xcb,
0xa0, 0xc4, 0xad, 0x62, 0xf7, 0x84, 0xb8, 0x96, 0x61, 0x37, 0xf1, 0x45, 0x9b, 0xf9, 0x0b, 0x24,
0x07, 0x18, 0xbd, 0x4c, 0x6c, 0x7d, 0x66, 0x23, 0xa5, 0x41, 0x08, 0xd2, 0x53, 0xbe, 0x8f, 0xc1,
0xed, 0xf1, 0x46, 0x05, 0x90, 0x2c, 0xcc, 0x37, 0x8c, 0xae, 0x4f, 0xf2, 0x32, 0xd2, 0xfa, 0xcc,
0x46, 0x5c, 0x0b, 0xd7, 0x68, 0x13, 0x64, 0x4a, 0xa8, 0xd1, 0xd5, 0xfb, 0x81, 0x05, 0x4f, 0xc4,
0x6a, 0x91, 0xd1, 0x43, 0xc3, 0x1e, 0x7a, 0x0a, 0x6b, 0x5c, 0xd4, 0x68, 0x52, 0xb3, 0x8f, 0xa3,
0x1a, 0x3c, 0xed, 0x37, 0x18, 0xbb, 0xc8, 0xb8, 0x11, 0xbd, 0x47, 0x80, 0x2c, 0xd3, 0xf3, 0x4c,
0xbb, 0x1d, 0x55, 0x89, 0xb3, 0x7d, 0x2c, 0x09, 0x4e, 0x44, 0x7c, 0x1f, 0xd6, 0x8d, 0x3e, 0x76,
0x8d, 0x36, 0x1e, 0x71, 0xa4, 0x0b, 0xd8, 0x99, 0xd9, 0x75, 0x69, 0x23, 0xa6, 0xdd, 0x11, 0x72,
0x43, 0x1e, 0x77, 0xb9, 0x90, 0xf2, 0x02, 0xb2, 0x21, 0x8d, 0x89, 0x9c, 0xab, 0x9b, 0xa1, 0xb0,
0x4a, 0x23, 0x61, 0xfd, 0x31, 0x16, 0xc9, 0x55, 0x54, 0x5f, 0x44, 0xf5, 0x29, 0xdc, 0x30, 0x38,
0x15, 0xb7, 0xf4, 0x11, 0x53, 0xbb, 0xb1, 0x8c, 0xa4, 0x2d, 0x87, 0x02, 0xd5, 0xd0, 0x2e, 0x3a,
0x82, 0x79, 0xff, 0xd0, 0xf5, 0x3c, 0xcc, 0x93, 0x99, 0x2c, 0x3c, 0xcb, 0x8d, 0xef, 0x44, 0xb9,
0x0b, 0xdc, 0xe7, 0x6a, 0xcc, 0x86, 0x16, 0xda, 0xca, 0x3a, 0x90, 0xe0, 0xb4, 0xcb, 0x0e, 0xf1,
0x3e, 0x24, 0xb8, 0x12, 0x4b, 0x74, 0xb2, 0x90, 0xbf, 0xd4, 0xbd, 0xf0, 0x25, 0x5c, 0x6b, 0x42,
0x5d, 0x79, 0x06, 0x6b, 0xea, 0x27, 0x93, 0xe2, 0xd6, 0x20, 0x7b, 0x53, 0x47, 0xf7, 0x39, 0x64,
0x46, 0x75, 0x45, 0x64, 0x2f, 0x55, 0x7e, 0x0b, 0x68, 0xaf, 0x63, 0x98, 0x76, 0x8d, 0x1a, 0xee,
0xa0, 0x69, 0x64, 0x60, 0xce, 0xf3, 0x09, 0xb8, 0xc5, 0xf6, 0x3c, 0xaf, 0x05, 0x4b, 0xf4, 0x57,
0x48, 0xb5, 0xb1, 0x8d, 0x3d, 0xd3, 0xd3, 0xa9, 0x69, 0x61, 0x51, 0xe0, 0x49, 0x41, 0xab, 0x9b,
0x16, 0x56, 0x9e, 0xc2, 0x8d, 0x10, 0x09, 0xeb, 0x0d, 0xd3, 0x75, 0x44, 0x25, 0x07, 0xab, 0xc3,
0x7a, 0x02, 0xce, 0x0a, 0xcc, 0xf2, 0xd6, 0xc3, 0x0f, 0x33, 0x5f, 0x28, 0xef, 0x60, 0xa9, 0xe8,
0xf9, 0xfd, 0xc4, 0xc2, 0x36, 0x8d, 0x44, 0x0b, 0x3b, 0xa4, 0xd9, 0xd1, 0x19, 0x60, 0xa1, 0x00,
0x8c, 0xc4, 0xb6, 0x78, 0x79, 0x0f, 0xf8, 0x76, 0x06, 0x50, 0xd4, 0xae, 0xc0, 0x70, 0x0a, 0x2b,
0x83, 0xc3, 0x63, 0x84, 0x7c, 0x16, 0xd2, 0x64, 0xe1, 0x5f, 0x93, 0x12, 0x3f, 0x6a, 0x29, 0x52,
0x8a, 0x03, 0xde, 0x72, 0x7f, 0x94, 0x98, 0xfd, 0x5f, 0x0c, 0x96, 0xc7, 0x08, 0xa3, 0xdb, 0x70,
0x3d, 0x6c, 0xbe, 0xa2, 0x0b, 0x0d, 0x08, 0xd3, 0x77, 0xec, 0x7b, 0xb0, 0xc0, 0xef, 0x51, 0xec,
0xea, 0x91, 0x1b, 0x27, 0x15, 0x10, 0x6b, 0xe2, 0xce, 0x74, 0xf8, 0x75, 0x28, 0x84, 0xf8, 0xbd,
0x93, 0x0a, 0x88, 0x4c, 0xe8, 0x7c, 0x62, 0x67, 0x87, 0x4f, 0xc9, 0xcb, 0xf0, 0x94, 0x24, 0xd6,
0xa5, 0x8d, 0x74, 0xe1, 0xe1, 0xb4, 0xa7, 0x24, 0x38, 0x1d, 0xbf, 0xc4, 0x60, 0x6d, 0xc2, 0x09,
0x8a, 0x18, 0x97, 0xbe, 0xca, 0x38, 0xfa, 0x27, 0xdc, 0xc4, 0xb4, 0xb3, 0xa3, 0xb7, 0xb0, 0x43,
0x3c, 0x93, 0xf2, 0xd9, 0x43, 0xb7, 0x7b, 0x56, 0x03, 0xbb, 0x22, 0x72, 0xfe, 0x78, 0xb3, 0x53,
0xe2, 0x7c, 0x36, 0x65, 0x54, 0x18, 0x17, 0x3d, 0x81, 0xd5, 0x40, 0xcb, 0xb4, 0x9b, 0xdd, 0x9e,
0x67, 0x12, 0x3b, 0x1a, 0xca, 0x15, 0xc1, 0x2d, 0x07, 0x4c, 0x16, 0xad, 0x4d, 0x90, 0x8d, 0xb0,
0x09, 0xe9, 0xac, 0x34, 0x45, 0x54, 0x17, 0x07, 0x74, 0xd5, 0x27, 0xa3, 0x97, 0x70, 0x9b, 0x19,
0xf0, 0x05, 0x4d, 0x5b, 0x8f, 0xa8, 0x9d, 0xf6, 0x70, 0x8f, 0x37, 0xef, 0xb8, 0x76, 0x33, 0x90,
0x29, 0xdb, 0x83, 0xee, 0xf6, 0xd6, 0x17, 0x50, 0x5e, 0xc0, 0x42, 0x89, 0x58, 0x86, 0x19, 0xf6,
0xea, 0x15, 0x98, 0xe5, 0x1e, 0xc5, 0x51, 0x62, 0x0b, 0xb4, 0x0a, 0x89, 0x16, 0x13, 0x0b, 0x66,
0x11, 0xbe, 0x52, 0x9e, 0x43, 0x3a, 0x50, 0x17, 0xe1, 0xde, 0x04, 0x39, 0xbc, 0xc2, 0x75, 0xa1,
0xc3, 0x4d, 0x2d, 0x86, 0x74, 0xae, 0xa2, 0x7c, 0x17, 0x83, 0x25, 0x16, 0xad, 0xba, 0x8b, 0x07,
0x37, 0xe8, 0x2b, 0x88, 0x53, 0x57, 0xd4, 0x6d, 0xb2, 0x50, 0x98, 0x94, 0xad, 0x11, 0xc5, 0x9c,
0xbf, 0xa8, 0x90, 0x16, 0xd6, 0x98, 0x7e, 0xf6, 0x67, 0x09, 0xe6, 0x03, 0x12, 0xfa, 0x07, 0xcc,
0xb2, 0xb4, 0x31, 0x28, 0xc9, 0x82, 0x32, 0xb0, 0x8a, 0x69, 0x27, 0x17, 0x8c, 0x8d, 0xb9, 0x5d,
0xe6, 0x82, 0xcf, 0x89, 0x5c, 0x61, 0x68, 0xb6, 0x8b, 0x0d, 0xcd, 0x76, 0xfe, 0x85, 0xeb, 0x18,
0x2e, 0x35, 0x9b, 0xa6, 0xc3, 0x2e, 0xa7, 0x3e, 0xa1, 0x38, 0xb8, 0xa3, 0x97, 0xa2, 0x9c, 0x23,
0x9f, 0xe1, 0x37, 0x17, 0x31, 0x02, 0x30, 0x39, 0x9e, 0x55, 0xe0, 0xb7, 0xbf, 0x4f, 0x51, 0xde,
0xc0, 0x8a, 0x0f, 0x9a, 0x41, 0xf0, 0x8b, 0x21, 0x48, 0xcb, 0x2d, 0xb8, 0xce, 0xc6, 0xa3, 0x13,
0x97, 0x58, 0x22, 0x9e, 0xf3, 0x3e, 0xe1, 0x95, 0x4b, 0x2c, 0x7f, 0x54, 0x64, 0x4c, 0x4a, 0x44,
0x3d, 0x26, 0xfc, 0x65, 0x9d, 0x6c, 0x1d, 0xc0, 0x42, 0x58, 0xd5, 0x1a, 0xe9, 0x62, 0x94, 0x84,
0xb9, 0x77, 0x95, 0xd7, 0x95, 0xc3, 0xe3, 0x8a, 0x7c, 0x0d, 0xa5, 0x60, 0xbe, 0x58, 0xaf, 0xab,
0xb5, 0xba, 0xaa, 0xc9, 0x92, 0xbf, 0xaa, 0x6a, 0x87, 0xd5, 0xc3, 0x9a, 0xaa, 0xc9, 0x31, 0x94,
0x06, 0x28, 0xee, 0xef, 0x6b, 0xea, 0x7e, 0xb1, 0x7e, 0xa8, 0xc9, 0x33, 0x5b, 0x3f, 0x49, 0xb0,
0x38, 0x74, 0x40, 0x10, 0x82, 0xb4, 0x30, 0xa6, 0xd7, 0xea, 0xc5, 0xfa, 0xbb, 0x9a, 0x7c, 0x0d,
0xad, 0x80, 0x5c, 0x52, 0xab, 0x87, 0xb5, 0x72, 0x5d, 0xd7, 0xd4, 0x3d, 0xb5, 0x7c, 0xa4, 0x96,
0x64, 0xc9, 0x97, 0xac, 0xaa, 0x95, 0x52, 0xb9, 0xb2, 0xaf, 0x17, 0xf7, 0xea, 0xe5, 0x23, 0x55,
0x8e, 0x21, 0x80, 0x84, 0xf8, 0x9e, 0xf1, 0xf9, 0xe5, 0x4a, 0xb9, 0x5e, 0x2e, 0xd6, 0xd5, 0x92,
0xae, 0xbe, 0x2f, 0xd7, 0xe5, 0x38, 0x92, 0x21, 0x75, 0x5c, 0xae, 0x1f, 0x94, 0xb4, 0xe2, 0x71,
0x71, 0xf7, 0x8d, 0x2a, 0xcf, 0xfa, 0x1a, 0x3e, 0x4f, 0x2d, 0xc9, 0x09, 0x5f, 0x83, 0x7f, 0xeb,
0xb5, 0x37, 0xc5, 0xda, 0x81, 0x5a, 0x92, 0xe7, 0x0a, 0xbf, 0x49, 0xb0, 0x58, 0x0c, 0x7a, 0x13,
0x7f, 0x7f, 0xa0, 0x0e, 0x20, 0x11, 0xc2, 0xc8, 0x04, 0x8e, 0xb6, 0x26, 0x76, 0xe3, 0x91, 0x31,
0x3d, 0xfb, 0xb7, 0x09, 0xb5, 0x12, 0x11, 0x2d, 0x19, 0xd4, 0x40, 0x3a, 0x2c, 0xd5, 0x7a, 0x0d,
0xcb, 0x3c, 0xe7, 0x48, 0xb9, 0x5c, 0x39, 0xea, 0x60, 0x1c, 0x98, 0xa0, 0xbe, 0x0b, 0x9f, 0xa5,
0xf0, 0xe5, 0x11, 0x6e, 0xef, 0x3d, 0xa4, 0x04, 0x4e, 0x56, 0x31, 0xe8, 0xfe, 0x85, 0xc7, 0x25,
0xd8, 0xd2, 0x14, 0xe5, 0x8f, 0x3e, 0x40, 0x4a, 0x38, 0xe3, 0xeb, 0x29, 0x74, 0xb2, 0x13, 0x5b,
0xeb, 0xd0, 0x83, 0xa9, 0xf0, 0x7f, 0x09, 0x96, 0x82, 0x31, 0x9e, 0x84, 0x9b, 0x71, 0x61, 0x4d,
0x44, 0x50, 0xb0, 0x70, 0xd1, 0x6e, 0x55, 0x5d, 0x42, 0x4e, 0x2e, 0x48, 0xd8, 0xc8, 0x2b, 0x25,
0xfb, 0xf7, 0xa9, 0x64, 0x05, 0x92, 0x3f, 0xe6, 0x40, 0x1e, 0xd4, 0xb5, 0x00, 0xf2, 0x01, 0x80,
0xb7, 0x28, 0x96, 0xd8, 0x07, 0x93, 0xec, 0x9d, 0x6b, 0x9c, 0x93, 0xd3, 0x38, 0xd4, 0x20, 0xff,
0x03, 0x4b, 0xc7, 0x86, 0x49, 0x5f, 0x45, 0x27, 0x4d, 0x54, 0xb8, 0xd2, 0x58, 0xca, 0x1d, 0x3e,
0xfe, 0x8a, 0x51, 0x76, 0x5b, 0x42, 0x04, 0xd2, 0xe7, 0xa7, 0x28, 0xf4, 0xe8, 0x52, 0x43, 0xd1,
0x29, 0x2d, 0x9b, 0x9b, 0x56, 0x5c, 0x6c, 0xb8, 0x0b, 0xcb, 0x7b, 0xc1, 0x60, 0x11, 0x19, 0x52,
0x36, 0xa7, 0x99, 0x88, 0xb8, 0xc7, 0xad, 0xe9, 0x87, 0x27, 0x74, 0x3a, 0xda, 0xa7, 0xae, 0xb8,
0xbf, 0xab, 0xce, 0xe8, 0xe8, 0xbf, 0x12, 0xac, 0x8c, 0x7b, 0x14, 0xa2, 0xcb, 0x33, 0x34, 0xfa,
0x2e, 0xcd, 0x3e, 0xb9, 0x9a, 0x92, 0xc0, 0xd0, 0x03, 0x79, 0x78, 0xc6, 0x47, 0x13, 0x37, 0x32,
0xe1, 0x25, 0x91, 0xdd, 0x9e, 0x5e, 0x41, 0xb8, 0xfd, 0x77, 0x58, 0xcc, 0x83, 0x47, 0x02, 0x5a,
0xcd, 0xf1, 0xbf, 0x3a, 0xb9, 0xe0, 0xaf, 0x4e, 0x4e, 0xb5, 0x1c, 0x7a, 0x36, 0x39, 0x8d, 0xa3,
0x0f, 0x8c, 0x6d, 0x09, 0xbd, 0x86, 0x85, 0x3d, 0xc3, 0x26, 0xb6, 0xd9, 0x34, 0xba, 0x07, 0xd8,
0x68, 0x4d, 0x34, 0x3b, 0x45, 0x67, 0xda, 0x4d, 0x7d, 0xfe, 0x72, 0x57, 0xfa, 0xf5, 0xcb, 0x5d,
0xe9, 0xf7, 0x2f, 0x77, 0xa5, 0x46, 0x82, 0x59, 0x78, 0xfc, 0x67, 0x00, 0x00, 0x00, 0xff, 0xff,
0x8e, 0x5f, 0x85, 0x1b, 0xba, 0x12, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -1737,6 +1861,70 @@ var _ProposerService_serviceDesc = grpc.ServiceDesc{
Metadata: "proto/beacon/rpc/v1/services.proto",
}
// AggregatorServiceClient is the client API for AggregatorService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type AggregatorServiceClient interface {
SubmitAggregateAndProof(ctx context.Context, in *AggregationRequest, opts ...grpc.CallOption) (*AggregationResponse, error)
}
type aggregatorServiceClient struct {
cc *grpc.ClientConn
}
func NewAggregatorServiceClient(cc *grpc.ClientConn) AggregatorServiceClient {
return &aggregatorServiceClient{cc}
}
func (c *aggregatorServiceClient) SubmitAggregateAndProof(ctx context.Context, in *AggregationRequest, opts ...grpc.CallOption) (*AggregationResponse, error) {
out := new(AggregationResponse)
err := c.cc.Invoke(ctx, "/ethereum.beacon.rpc.v1.AggregatorService/SubmitAggregateAndProof", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// AggregatorServiceServer is the server API for AggregatorService service.
type AggregatorServiceServer interface {
SubmitAggregateAndProof(context.Context, *AggregationRequest) (*AggregationResponse, error)
}
func RegisterAggregatorServiceServer(s *grpc.Server, srv AggregatorServiceServer) {
s.RegisterService(&_AggregatorService_serviceDesc, srv)
}
func _AggregatorService_SubmitAggregateAndProof_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(AggregationRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(AggregatorServiceServer).SubmitAggregateAndProof(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/ethereum.beacon.rpc.v1.AggregatorService/SubmitAggregateAndProof",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(AggregatorServiceServer).SubmitAggregateAndProof(ctx, req.(*AggregationRequest))
}
return interceptor(ctx, in, info, handler)
}
var _AggregatorService_serviceDesc = grpc.ServiceDesc{
ServiceName: "ethereum.beacon.rpc.v1.AggregatorService",
HandlerType: (*AggregatorServiceServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "SubmitAggregateAndProof",
Handler: _AggregatorService_SubmitAggregateAndProof_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "proto/beacon/rpc/v1/services.proto",
}
// ValidatorServiceClient is the client API for ValidatorService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
@@ -2249,6 +2437,76 @@ func (m *AttestResponse) MarshalTo(dAtA []byte) (int, error) {
return i, nil
}
func (m *AggregationRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *AggregationRequest) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if m.Slot != 0 {
dAtA[i] = 0x8
i++
i = encodeVarintServices(dAtA, i, uint64(m.Slot))
}
if m.CommitteeIndex != 0 {
dAtA[i] = 0x10
i++
i = encodeVarintServices(dAtA, i, uint64(m.CommitteeIndex))
}
if len(m.PublicKey) > 0 {
dAtA[i] = 0x1a
i++
i = encodeVarintServices(dAtA, i, uint64(len(m.PublicKey)))
i += copy(dAtA[i:], m.PublicKey)
}
if len(m.SlotSignature) > 0 {
dAtA[i] = 0x22
i++
i = encodeVarintServices(dAtA, i, uint64(len(m.SlotSignature)))
i += copy(dAtA[i:], m.SlotSignature)
}
if m.XXX_unrecognized != nil {
i += copy(dAtA[i:], m.XXX_unrecognized)
}
return i, nil
}
func (m *AggregationResponse) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *AggregationResponse) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if len(m.Root) > 0 {
dAtA[i] = 0xa
i++
i = encodeVarintServices(dAtA, i, uint64(len(m.Root)))
i += copy(dAtA[i:], m.Root)
}
if m.XXX_unrecognized != nil {
i += copy(dAtA[i:], m.XXX_unrecognized)
}
return i, nil
}
func (m *ValidatorPerformanceRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -3031,6 +3289,48 @@ func (m *AttestResponse) Size() (n int) {
return n
}
func (m *AggregationRequest) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
if m.Slot != 0 {
n += 1 + sovServices(uint64(m.Slot))
}
if m.CommitteeIndex != 0 {
n += 1 + sovServices(uint64(m.CommitteeIndex))
}
l = len(m.PublicKey)
if l > 0 {
n += 1 + l + sovServices(uint64(l))
}
l = len(m.SlotSignature)
if l > 0 {
n += 1 + l + sovServices(uint64(l))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
return n
}
func (m *AggregationResponse) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = len(m.Root)
if l > 0 {
n += 1 + l + sovServices(uint64(l))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
return n
}
func (m *ValidatorPerformanceRequest) Size() (n int) {
if m == nil {
return 0
@@ -3886,6 +4186,254 @@ func (m *AttestResponse) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *AggregationRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowServices
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: AggregationRequest: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: AggregationRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Slot", wireType)
}
m.Slot = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowServices
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Slot |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
case 2:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field CommitteeIndex", wireType)
}
m.CommitteeIndex = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowServices
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.CommitteeIndex |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType)
}
var byteLen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowServices
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
byteLen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if byteLen < 0 {
return ErrInvalidLengthServices
}
postIndex := iNdEx + byteLen
if postIndex < 0 {
return ErrInvalidLengthServices
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.PublicKey = append(m.PublicKey[:0], dAtA[iNdEx:postIndex]...)
if m.PublicKey == nil {
m.PublicKey = []byte{}
}
iNdEx = postIndex
case 4:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field SlotSignature", wireType)
}
var byteLen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowServices
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
byteLen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if byteLen < 0 {
return ErrInvalidLengthServices
}
postIndex := iNdEx + byteLen
if postIndex < 0 {
return ErrInvalidLengthServices
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.SlotSignature = append(m.SlotSignature[:0], dAtA[iNdEx:postIndex]...)
if m.SlotSignature == nil {
m.SlotSignature = []byte{}
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipServices(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthServices
}
if (iNdEx + skippy) < 0 {
return ErrInvalidLengthServices
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *AggregationResponse) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowServices
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: AggregationResponse: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: AggregationResponse: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Root", wireType)
}
var byteLen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowServices
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
byteLen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if byteLen < 0 {
return ErrInvalidLengthServices
}
postIndex := iNdEx + byteLen
if postIndex < 0 {
return ErrInvalidLengthServices
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Root = append(m.Root[:0], dAtA[iNdEx:postIndex]...)
if m.Root == nil {
m.Root = []byte{}
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipServices(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthServices
}
if (iNdEx + skippy) < 0 {
return ErrInvalidLengthServices
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *ValidatorPerformanceRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0

View File

@@ -16,6 +16,10 @@ service ProposerService {
rpc ProposeBlock(ethereum.eth.v1alpha1.BeaconBlock) returns (ProposeResponse);
}
service AggregatorService {
rpc SubmitAggregateAndProof(AggregationRequest) returns (AggregationResponse);
}
service ValidatorService {
rpc DomainData(DomainRequest) returns (DomainResponse);
rpc WaitForActivation(ValidatorActivationRequest) returns (stream ValidatorActivationResponse);
@@ -48,6 +52,17 @@ message AttestResponse {
bytes root = 1;
}
message AggregationRequest {
uint64 slot = 1;
uint64 committee_index = 2;
bytes public_key = 3;
bytes slot_signature = 4;
}
message AggregationResponse {
bytes root = 1;
}
message ValidatorPerformanceRequest {
uint64 slot = 1;
repeated bytes public_keys = 2;
@@ -88,11 +103,11 @@ message ChainStartResponse {
uint64 genesis_time = 2;
}
enum ValidatorRole {
enum ValidatorRole {
UNKNOWN = 0;
ATTESTER = 1;
PROPOSER = 2;
BOTH = 3;
AGGREGATOR = 3;
}
message ValidatorIndexRequest {

View File

@@ -11,7 +11,6 @@ import (
proto "github.com/golang/protobuf/proto"
empty "github.com/golang/protobuf/ptypes/empty"
v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
_ "google.golang.org/genproto/googleapis/api/annotations"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
@@ -31,24 +30,24 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type ValidatorRole int32
const (
ValidatorRole_UNKNOWN ValidatorRole = 0
ValidatorRole_ATTESTER ValidatorRole = 1
ValidatorRole_PROPOSER ValidatorRole = 2
ValidatorRole_BOTH ValidatorRole = 3
ValidatorRole_UNKNOWN ValidatorRole = 0
ValidatorRole_ATTESTER ValidatorRole = 1
ValidatorRole_PROPOSER ValidatorRole = 2
ValidatorRole_AGGREGATOR ValidatorRole = 3
)
var ValidatorRole_name = map[int32]string{
0: "UNKNOWN",
1: "ATTESTER",
2: "PROPOSER",
3: "BOTH",
3: "AGGREGATOR",
}
var ValidatorRole_value = map[string]int32{
"UNKNOWN": 0,
"ATTESTER": 1,
"PROPOSER": 2,
"BOTH": 3,
"UNKNOWN": 0,
"ATTESTER": 1,
"PROPOSER": 2,
"AGGREGATOR": 3,
}
func (x ValidatorRole) String() string {
@@ -290,6 +289,108 @@ func (m *AttestResponse) GetRoot() []byte {
return nil
}
type AggregationRequest struct {
Slot uint64 `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty"`
CommitteeIndex uint64 `protobuf:"varint,2,opt,name=committee_index,json=committeeIndex,proto3" json:"committee_index,omitempty"`
PublicKey []byte `protobuf:"bytes,3,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"`
SlotSignature []byte `protobuf:"bytes,4,opt,name=slot_signature,json=slotSignature,proto3" json:"slot_signature,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *AggregationRequest) Reset() { *m = AggregationRequest{} }
func (m *AggregationRequest) String() string { return proto.CompactTextString(m) }
func (*AggregationRequest) ProtoMessage() {}
func (*AggregationRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{4}
}
func (m *AggregationRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AggregationRequest.Unmarshal(m, b)
}
func (m *AggregationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_AggregationRequest.Marshal(b, m, deterministic)
}
func (m *AggregationRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_AggregationRequest.Merge(m, src)
}
func (m *AggregationRequest) XXX_Size() int {
return xxx_messageInfo_AggregationRequest.Size(m)
}
func (m *AggregationRequest) XXX_DiscardUnknown() {
xxx_messageInfo_AggregationRequest.DiscardUnknown(m)
}
var xxx_messageInfo_AggregationRequest proto.InternalMessageInfo
func (m *AggregationRequest) GetSlot() uint64 {
if m != nil {
return m.Slot
}
return 0
}
func (m *AggregationRequest) GetCommitteeIndex() uint64 {
if m != nil {
return m.CommitteeIndex
}
return 0
}
func (m *AggregationRequest) GetPublicKey() []byte {
if m != nil {
return m.PublicKey
}
return nil
}
func (m *AggregationRequest) GetSlotSignature() []byte {
if m != nil {
return m.SlotSignature
}
return nil
}
type AggregationResponse struct {
Root []byte `protobuf:"bytes,1,opt,name=root,proto3" json:"root,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *AggregationResponse) Reset() { *m = AggregationResponse{} }
func (m *AggregationResponse) String() string { return proto.CompactTextString(m) }
func (*AggregationResponse) ProtoMessage() {}
func (*AggregationResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{5}
}
func (m *AggregationResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AggregationResponse.Unmarshal(m, b)
}
func (m *AggregationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_AggregationResponse.Marshal(b, m, deterministic)
}
func (m *AggregationResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_AggregationResponse.Merge(m, src)
}
func (m *AggregationResponse) XXX_Size() int {
return xxx_messageInfo_AggregationResponse.Size(m)
}
func (m *AggregationResponse) XXX_DiscardUnknown() {
xxx_messageInfo_AggregationResponse.DiscardUnknown(m)
}
var xxx_messageInfo_AggregationResponse proto.InternalMessageInfo
func (m *AggregationResponse) GetRoot() []byte {
if m != nil {
return m.Root
}
return nil
}
type ValidatorPerformanceRequest struct {
Slot uint64 `protobuf:"varint,1,opt,name=slot,proto3" json:"slot,omitempty"`
PublicKeys [][]byte `protobuf:"bytes,2,rep,name=public_keys,json=publicKeys,proto3" json:"public_keys,omitempty"`
@@ -302,7 +403,7 @@ func (m *ValidatorPerformanceRequest) Reset() { *m = ValidatorPerformanc
func (m *ValidatorPerformanceRequest) String() string { return proto.CompactTextString(m) }
func (*ValidatorPerformanceRequest) ProtoMessage() {}
func (*ValidatorPerformanceRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{4}
return fileDescriptor_9eb4e94b85965285, []int{6}
}
func (m *ValidatorPerformanceRequest) XXX_Unmarshal(b []byte) error {
@@ -352,7 +453,7 @@ func (m *ValidatorPerformanceResponse) Reset() { *m = ValidatorPerforman
func (m *ValidatorPerformanceResponse) String() string { return proto.CompactTextString(m) }
func (*ValidatorPerformanceResponse) ProtoMessage() {}
func (*ValidatorPerformanceResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{5}
return fileDescriptor_9eb4e94b85965285, []int{7}
}
func (m *ValidatorPerformanceResponse) XXX_Unmarshal(b []byte) error {
@@ -419,7 +520,7 @@ func (m *ValidatorActivationRequest) Reset() { *m = ValidatorActivationR
func (m *ValidatorActivationRequest) String() string { return proto.CompactTextString(m) }
func (*ValidatorActivationRequest) ProtoMessage() {}
func (*ValidatorActivationRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{6}
return fileDescriptor_9eb4e94b85965285, []int{8}
}
func (m *ValidatorActivationRequest) XXX_Unmarshal(b []byte) error {
@@ -459,7 +560,7 @@ func (m *ValidatorActivationResponse) Reset() { *m = ValidatorActivation
func (m *ValidatorActivationResponse) String() string { return proto.CompactTextString(m) }
func (*ValidatorActivationResponse) ProtoMessage() {}
func (*ValidatorActivationResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{7}
return fileDescriptor_9eb4e94b85965285, []int{9}
}
func (m *ValidatorActivationResponse) XXX_Unmarshal(b []byte) error {
@@ -507,7 +608,7 @@ func (m *ValidatorActivationResponse_Status) Reset() { *m = ValidatorAct
func (m *ValidatorActivationResponse_Status) String() string { return proto.CompactTextString(m) }
func (*ValidatorActivationResponse_Status) ProtoMessage() {}
func (*ValidatorActivationResponse_Status) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{7, 0}
return fileDescriptor_9eb4e94b85965285, []int{9, 0}
}
func (m *ValidatorActivationResponse_Status) XXX_Unmarshal(b []byte) error {
@@ -553,7 +654,7 @@ func (m *ExitedValidatorsRequest) Reset() { *m = ExitedValidatorsRequest
func (m *ExitedValidatorsRequest) String() string { return proto.CompactTextString(m) }
func (*ExitedValidatorsRequest) ProtoMessage() {}
func (*ExitedValidatorsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{8}
return fileDescriptor_9eb4e94b85965285, []int{10}
}
func (m *ExitedValidatorsRequest) XXX_Unmarshal(b []byte) error {
@@ -592,7 +693,7 @@ func (m *ExitedValidatorsResponse) Reset() { *m = ExitedValidatorsRespon
func (m *ExitedValidatorsResponse) String() string { return proto.CompactTextString(m) }
func (*ExitedValidatorsResponse) ProtoMessage() {}
func (*ExitedValidatorsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{9}
return fileDescriptor_9eb4e94b85965285, []int{11}
}
func (m *ExitedValidatorsResponse) XXX_Unmarshal(b []byte) error {
@@ -632,7 +733,7 @@ func (m *ChainStartResponse) Reset() { *m = ChainStartResponse{} }
func (m *ChainStartResponse) String() string { return proto.CompactTextString(m) }
func (*ChainStartResponse) ProtoMessage() {}
func (*ChainStartResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{10}
return fileDescriptor_9eb4e94b85965285, []int{12}
}
func (m *ChainStartResponse) XXX_Unmarshal(b []byte) error {
@@ -678,7 +779,7 @@ func (m *ValidatorIndexRequest) Reset() { *m = ValidatorIndexRequest{} }
func (m *ValidatorIndexRequest) String() string { return proto.CompactTextString(m) }
func (*ValidatorIndexRequest) ProtoMessage() {}
func (*ValidatorIndexRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{11}
return fileDescriptor_9eb4e94b85965285, []int{13}
}
func (m *ValidatorIndexRequest) XXX_Unmarshal(b []byte) error {
@@ -717,7 +818,7 @@ func (m *ValidatorIndexResponse) Reset() { *m = ValidatorIndexResponse{}
func (m *ValidatorIndexResponse) String() string { return proto.CompactTextString(m) }
func (*ValidatorIndexResponse) ProtoMessage() {}
func (*ValidatorIndexResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{12}
return fileDescriptor_9eb4e94b85965285, []int{14}
}
func (m *ValidatorIndexResponse) XXX_Unmarshal(b []byte) error {
@@ -757,7 +858,7 @@ func (m *AssignmentRequest) Reset() { *m = AssignmentRequest{} }
func (m *AssignmentRequest) String() string { return proto.CompactTextString(m) }
func (*AssignmentRequest) ProtoMessage() {}
func (*AssignmentRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{13}
return fileDescriptor_9eb4e94b85965285, []int{15}
}
func (m *AssignmentRequest) XXX_Unmarshal(b []byte) error {
@@ -803,7 +904,7 @@ func (m *AssignmentResponse) Reset() { *m = AssignmentResponse{} }
func (m *AssignmentResponse) String() string { return proto.CompactTextString(m) }
func (*AssignmentResponse) ProtoMessage() {}
func (*AssignmentResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{14}
return fileDescriptor_9eb4e94b85965285, []int{16}
}
func (m *AssignmentResponse) XXX_Unmarshal(b []byte) error {
@@ -849,7 +950,7 @@ func (m *AssignmentResponse_ValidatorAssignment) Reset() {
func (m *AssignmentResponse_ValidatorAssignment) String() string { return proto.CompactTextString(m) }
func (*AssignmentResponse_ValidatorAssignment) ProtoMessage() {}
func (*AssignmentResponse_ValidatorAssignment) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{14, 0}
return fileDescriptor_9eb4e94b85965285, []int{16, 0}
}
func (m *AssignmentResponse_ValidatorAssignment) XXX_Unmarshal(b []byte) error {
@@ -927,7 +1028,7 @@ func (m *ValidatorStatusResponse) Reset() { *m = ValidatorStatusResponse
func (m *ValidatorStatusResponse) String() string { return proto.CompactTextString(m) }
func (*ValidatorStatusResponse) ProtoMessage() {}
func (*ValidatorStatusResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{15}
return fileDescriptor_9eb4e94b85965285, []int{17}
}
func (m *ValidatorStatusResponse) XXX_Unmarshal(b []byte) error {
@@ -995,7 +1096,7 @@ func (m *DomainRequest) Reset() { *m = DomainRequest{} }
func (m *DomainRequest) String() string { return proto.CompactTextString(m) }
func (*DomainRequest) ProtoMessage() {}
func (*DomainRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{16}
return fileDescriptor_9eb4e94b85965285, []int{18}
}
func (m *DomainRequest) XXX_Unmarshal(b []byte) error {
@@ -1041,7 +1142,7 @@ func (m *DomainResponse) Reset() { *m = DomainResponse{} }
func (m *DomainResponse) String() string { return proto.CompactTextString(m) }
func (*DomainResponse) ProtoMessage() {}
func (*DomainResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{17}
return fileDescriptor_9eb4e94b85965285, []int{19}
}
func (m *DomainResponse) XXX_Unmarshal(b []byte) error {
@@ -1080,7 +1181,7 @@ func (m *BlockTreeResponse) Reset() { *m = BlockTreeResponse{} }
func (m *BlockTreeResponse) String() string { return proto.CompactTextString(m) }
func (*BlockTreeResponse) ProtoMessage() {}
func (*BlockTreeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{18}
return fileDescriptor_9eb4e94b85965285, []int{20}
}
func (m *BlockTreeResponse) XXX_Unmarshal(b []byte) error {
@@ -1122,7 +1223,7 @@ func (m *BlockTreeResponse_TreeNode) Reset() { *m = BlockTreeResponse_Tr
func (m *BlockTreeResponse_TreeNode) String() string { return proto.CompactTextString(m) }
func (*BlockTreeResponse_TreeNode) ProtoMessage() {}
func (*BlockTreeResponse_TreeNode) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{18, 0}
return fileDescriptor_9eb4e94b85965285, []int{20, 0}
}
func (m *BlockTreeResponse_TreeNode) XXX_Unmarshal(b []byte) error {
@@ -1183,7 +1284,7 @@ func (m *TreeBlockSlotRequest) Reset() { *m = TreeBlockSlotRequest{} }
func (m *TreeBlockSlotRequest) String() string { return proto.CompactTextString(m) }
func (*TreeBlockSlotRequest) ProtoMessage() {}
func (*TreeBlockSlotRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_9eb4e94b85965285, []int{19}
return fileDescriptor_9eb4e94b85965285, []int{21}
}
func (m *TreeBlockSlotRequest) XXX_Unmarshal(b []byte) error {
@@ -1225,6 +1326,8 @@ func init() {
proto.RegisterType((*ProposeResponse)(nil), "ethereum.beacon.rpc.v1.ProposeResponse")
proto.RegisterType((*AttestationRequest)(nil), "ethereum.beacon.rpc.v1.AttestationRequest")
proto.RegisterType((*AttestResponse)(nil), "ethereum.beacon.rpc.v1.AttestResponse")
proto.RegisterType((*AggregationRequest)(nil), "ethereum.beacon.rpc.v1.AggregationRequest")
proto.RegisterType((*AggregationResponse)(nil), "ethereum.beacon.rpc.v1.AggregationResponse")
proto.RegisterType((*ValidatorPerformanceRequest)(nil), "ethereum.beacon.rpc.v1.ValidatorPerformanceRequest")
proto.RegisterType((*ValidatorPerformanceResponse)(nil), "ethereum.beacon.rpc.v1.ValidatorPerformanceResponse")
proto.RegisterType((*ValidatorActivationRequest)(nil), "ethereum.beacon.rpc.v1.ValidatorActivationRequest")
@@ -1249,105 +1352,110 @@ func init() {
func init() { proto.RegisterFile("proto/beacon/rpc/v1/services.proto", fileDescriptor_9eb4e94b85965285) }
var fileDescriptor_9eb4e94b85965285 = []byte{
// 1563 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0xcd, 0x6e, 0xdb, 0xc6,
0x13, 0x0f, 0x65, 0x59, 0x76, 0x46, 0xb2, 0x4d, 0xaf, 0x1d, 0x5b, 0x51, 0x1c, 0xfc, 0xfd, 0x67,
0x93, 0xc6, 0x36, 0x10, 0xc9, 0x56, 0x82, 0xa0, 0x4d, 0x90, 0x06, 0x92, 0xc5, 0xd8, 0x42, 0x02,
0xd9, 0xa1, 0x14, 0x3b, 0x45, 0x0e, 0xc4, 0x4a, 0xda, 0x58, 0x44, 0x44, 0x2e, 0x4d, 0xae, 0x84,
0xf8, 0x52, 0xa0, 0x97, 0x02, 0xbd, 0xb5, 0x87, 0x9e, 0x8b, 0x3e, 0x43, 0x0f, 0x7d, 0x85, 0x3e,
0x44, 0x8f, 0x7d, 0x90, 0x82, 0xbb, 0x4b, 0x8a, 0xd6, 0x47, 0x2c, 0xe7, 0xc6, 0x9d, 0x99, 0xdf,
0xcc, 0xec, 0xec, 0x7c, 0x49, 0xa0, 0xb9, 0x1e, 0x65, 0xb4, 0xd0, 0x24, 0xb8, 0x45, 0x9d, 0x82,
0xe7, 0xb6, 0x0a, 0xfd, 0xbd, 0x82, 0x4f, 0xbc, 0xbe, 0xd5, 0x22, 0x7e, 0x9e, 0x33, 0xd1, 0x1a,
0x61, 0x1d, 0xe2, 0x91, 0x9e, 0x9d, 0x17, 0x62, 0x79, 0xcf, 0x6d, 0xe5, 0xfb, 0x7b, 0xb9, 0x3b,
0x67, 0x94, 0x9e, 0x75, 0x49, 0x81, 0x4b, 0x35, 0x7b, 0x1f, 0x0a, 0xc4, 0x76, 0xd9, 0x85, 0x00,
0xe5, 0xee, 0x0b, 0xc5, 0x84, 0x75, 0x0a, 0xfd, 0x3d, 0xdc, 0x75, 0x3b, 0x78, 0x4f, 0x5a, 0x31,
0x9b, 0x5d, 0xda, 0xfa, 0x28, 0xc5, 0xee, 0x8d, 0x11, 0xc3, 0x8c, 0x11, 0x9f, 0x61, 0x66, 0x51,
0x47, 0x4a, 0x6d, 0x48, 0x4b, 0xd8, 0xb5, 0x0a, 0xd8, 0x71, 0xa8, 0x60, 0x4a, 0xff, 0xb4, 0x03,
0xc8, 0x94, 0x03, 0x95, 0x06, 0x39, 0xef, 0x11, 0x9f, 0x21, 0x04, 0x49, 0xbf, 0x4b, 0x59, 0x56,
0xd9, 0x54, 0xb6, 0x92, 0x06, 0xff, 0x46, 0x5f, 0xc1, 0x82, 0x87, 0x9d, 0x36, 0xa6, 0xa6, 0x47,
0xfa, 0x04, 0x77, 0xb3, 0x89, 0x4d, 0x65, 0x2b, 0x63, 0x64, 0x04, 0xd1, 0xe0, 0x34, 0x6d, 0x17,
0x96, 0x8e, 0x3d, 0xea, 0x52, 0x9f, 0x18, 0xc4, 0x77, 0xa9, 0xe3, 0x13, 0x74, 0x17, 0x80, 0xbb,
0x6b, 0x7a, 0x54, 0x6a, 0xcc, 0x18, 0x37, 0x39, 0xc5, 0xa0, 0x94, 0x69, 0x3f, 0x2b, 0x80, 0x4a,
0x03, 0x77, 0x43, 0x0f, 0xee, 0x02, 0xb8, 0xbd, 0x66, 0xd7, 0x6a, 0x99, 0x1f, 0xc9, 0x45, 0x88,
0x12, 0x94, 0x57, 0xe4, 0x02, 0xad, 0xc3, 0x9c, 0x4b, 0x5b, 0x66, 0xd3, 0x62, 0xd2, 0x8d, 0x94,
0x4b, 0x5b, 0x65, 0x6b, 0xe0, 0xf9, 0x4c, 0xcc, 0xf3, 0x07, 0xb0, 0xd4, 0xa2, 0xb6, 0x6d, 0x31,
0x46, 0x88, 0x69, 0x39, 0x6d, 0xf2, 0x29, 0x9b, 0xe4, 0xec, 0xc5, 0x88, 0x5c, 0x0d, 0xa8, 0xda,
0x3d, 0x58, 0x14, 0xae, 0x44, 0xce, 0x23, 0x48, 0xc6, 0xdc, 0xe6, 0xdf, 0x9a, 0x01, 0x77, 0x4e,
0x70, 0xd7, 0x6a, 0x63, 0x46, 0xbd, 0x63, 0xe2, 0x7d, 0xa0, 0x9e, 0x8d, 0x9d, 0x16, 0xf9, 0x5c,
0xec, 0xfe, 0x07, 0xe9, 0xc1, 0x6d, 0xfc, 0x6c, 0x62, 0x73, 0x66, 0x2b, 0x63, 0x40, 0x74, 0x1d,
0x5f, 0xfb, 0x2d, 0x01, 0x1b, 0xe3, 0x95, 0x4a, 0x47, 0x72, 0x30, 0xdf, 0xc4, 0xdd, 0x80, 0xe4,
0x67, 0x95, 0xcd, 0x99, 0xad, 0xa4, 0x11, 0x9d, 0xd1, 0x36, 0xa8, 0x8c, 0x32, 0xdc, 0x35, 0xfb,
0xa1, 0x06, 0x9f, 0x47, 0x25, 0x69, 0x2c, 0x71, 0x7a, 0xa4, 0xd8, 0x47, 0x4f, 0x60, 0x5d, 0x88,
0xe2, 0x16, 0xb3, 0xfa, 0x24, 0x8e, 0x10, 0x11, 0xbb, 0xc5, 0xd9, 0x25, 0xce, 0x8d, 0xe1, 0x1e,
0x02, 0xb2, 0x2d, 0xdf, 0xb7, 0x9c, 0xb3, 0x38, 0x24, 0xc9, 0xef, 0xb1, 0x2c, 0x39, 0x31, 0xf1,
0x03, 0xd8, 0xc4, 0x7d, 0xe2, 0xe1, 0x33, 0x32, 0x62, 0xc8, 0x94, 0x6e, 0x67, 0x67, 0x37, 0x95,
0xad, 0x84, 0x71, 0x57, 0xca, 0x0d, 0x59, 0x2c, 0x0b, 0x21, 0xed, 0x39, 0xe4, 0x22, 0x1a, 0x17,
0xb9, 0x94, 0x24, 0x43, 0x61, 0x55, 0x46, 0xc2, 0xfa, 0x7b, 0x22, 0xf6, 0x56, 0x71, 0xbc, 0x8c,
0xea, 0x13, 0xb8, 0x85, 0x05, 0x95, 0xb4, 0xcd, 0x11, 0x55, 0xe5, 0x44, 0x56, 0x31, 0x56, 0x22,
0x81, 0xe3, 0x48, 0x2f, 0x3a, 0x81, 0xf9, 0x20, 0x5f, 0x7b, 0x3e, 0x11, 0x8f, 0x99, 0x2e, 0x3e,
0xcd, 0x8f, 0x2f, 0xf1, 0xfc, 0x67, 0xcc, 0xe7, 0xeb, 0x5c, 0x87, 0x11, 0xe9, 0xca, 0xb9, 0x90,
0x12, 0xb4, 0xab, 0xf2, 0xff, 0x00, 0x52, 0x02, 0xc4, 0x1f, 0x3a, 0x5d, 0x2c, 0x5c, 0x69, 0x5e,
0xda, 0x92, 0xa6, 0x0d, 0x09, 0xd7, 0x9e, 0xc2, 0xba, 0xfe, 0xc9, 0x62, 0xa4, 0x3d, 0x78, 0xbd,
0xa9, 0xa3, 0xfb, 0x0c, 0xb2, 0xa3, 0x58, 0x19, 0xd9, 0x2b, 0xc1, 0x6f, 0x00, 0xed, 0x77, 0xb0,
0xe5, 0xd4, 0x19, 0xf6, 0x06, 0xf5, 0x96, 0x85, 0x39, 0x3f, 0x20, 0x90, 0x36, 0xbf, 0xf3, 0xbc,
0x11, 0x1e, 0xd1, 0xff, 0x21, 0x73, 0x46, 0x1c, 0xe2, 0x5b, 0xbe, 0xc9, 0x2c, 0x9b, 0xc8, 0x04,
0x4f, 0x4b, 0x5a, 0xc3, 0xb2, 0x89, 0xf6, 0x04, 0x6e, 0x45, 0x9e, 0xf0, 0x82, 0x9e, 0xae, 0x99,
0x68, 0x79, 0x58, 0x1b, 0xc6, 0x49, 0x77, 0x56, 0x61, 0x56, 0xf4, 0x0b, 0x51, 0xcc, 0xe2, 0xa0,
0xbd, 0x85, 0xe5, 0x92, 0xef, 0x5b, 0x67, 0x8e, 0x4d, 0x1c, 0x16, 0x8b, 0x16, 0x71, 0x69, 0xab,
0x63, 0x72, 0x87, 0x25, 0x00, 0x38, 0x89, 0x5f, 0xf1, 0xea, 0x1e, 0xf0, 0xcb, 0x0c, 0xa0, 0xb8,
0x5e, 0xe9, 0xc3, 0x39, 0xac, 0x0e, 0x8a, 0x07, 0x47, 0x7c, 0x1e, 0xd2, 0x74, 0xf1, 0xbb, 0x49,
0x0f, 0x3f, 0xaa, 0x29, 0x96, 0x8a, 0x03, 0xde, 0x4a, 0x7f, 0x94, 0x98, 0xfb, 0x29, 0x01, 0x2b,
0x63, 0x84, 0xd1, 0x06, 0xdc, 0x8c, 0x3a, 0xa6, 0xec, 0x42, 0x03, 0xc2, 0xb8, 0x36, 0x9b, 0x18,
0xd7, 0x66, 0x83, 0x49, 0x22, 0x06, 0x14, 0xf1, 0xcc, 0x58, 0xb3, 0xce, 0x84, 0xc4, 0xba, 0x1c,
0x37, 0xae, 0x98, 0x24, 0x52, 0x48, 0xb4, 0xec, 0x4c, 0x48, 0xe4, 0x42, 0x97, 0x1f, 0x76, 0x76,
0xb8, 0x4a, 0x5e, 0x44, 0x55, 0x92, 0xda, 0x54, 0xb6, 0x16, 0x8b, 0x0f, 0xa6, 0xad, 0x92, 0xb0,
0x3a, 0xfe, 0x4a, 0xc0, 0xfa, 0x84, 0x0a, 0x8a, 0x29, 0x57, 0xbe, 0x48, 0x39, 0xfa, 0x16, 0x6e,
0x13, 0xd6, 0xd9, 0x33, 0xdb, 0xc4, 0xa5, 0xbe, 0xc5, 0xc4, 0x50, 0x37, 0x9d, 0x9e, 0xdd, 0x24,
0x9e, 0x8c, 0x5c, 0xb0, 0x37, 0xec, 0x55, 0x04, 0x9f, 0x0f, 0xe8, 0x1a, 0xe7, 0xa2, 0xc7, 0xb0,
0x16, 0xa2, 0x2c, 0xa7, 0xd5, 0xed, 0xf9, 0x16, 0x75, 0xe2, 0xa1, 0x5c, 0x95, 0xdc, 0x6a, 0xc8,
0xe4, 0xd1, 0xda, 0x06, 0x15, 0x47, 0x4d, 0xc8, 0xe4, 0xa9, 0x29, 0xa3, 0xba, 0x34, 0xa0, 0xeb,
0x01, 0x19, 0xbd, 0x80, 0x0d, 0xae, 0x20, 0x10, 0xb4, 0x1c, 0x33, 0x06, 0x3b, 0xef, 0x91, 0x9e,
0x68, 0xde, 0x49, 0xe3, 0x76, 0x28, 0x53, 0x75, 0x06, 0xdd, 0xed, 0x4d, 0x20, 0xa0, 0x3d, 0x87,
0x85, 0x0a, 0xb5, 0xb1, 0x15, 0xf5, 0xea, 0x55, 0x98, 0x15, 0x16, 0x65, 0x29, 0xf1, 0x03, 0x5a,
0x83, 0x54, 0x9b, 0x8b, 0x85, 0x63, 0x5c, 0x9c, 0xb4, 0x67, 0xb0, 0x18, 0xc2, 0x65, 0xb8, 0xb7,
0x41, 0x0d, 0xf2, 0x10, 0xb3, 0x9e, 0x47, 0x4c, 0x89, 0x11, 0xaa, 0x96, 0x22, 0xba, 0x80, 0x68,
0xbf, 0x26, 0x60, 0x99, 0x47, 0xab, 0xe1, 0x91, 0xc1, 0x04, 0x7d, 0x09, 0x49, 0xe6, 0xc9, 0xbc,
0x4d, 0x17, 0x8b, 0x93, 0x5e, 0x6b, 0x04, 0x98, 0x0f, 0x0e, 0x35, 0xda, 0x26, 0x06, 0xc7, 0xe7,
0xfe, 0x54, 0x60, 0x3e, 0x24, 0xa1, 0x6f, 0x60, 0x96, 0x3f, 0x1b, 0x77, 0x25, 0x5d, 0xd4, 0x06,
0x5a, 0x09, 0xeb, 0xe4, 0xc3, 0x7d, 0x2c, 0x5f, 0xe6, 0x26, 0xc4, 0x8a, 0x25, 0x00, 0x43, 0x6b,
0x51, 0x62, 0x68, 0x2d, 0x0a, 0x06, 0xae, 0x8b, 0x3d, 0x66, 0xb5, 0x2c, 0x97, 0x0f, 0xa7, 0x3e,
0x65, 0x24, 0x9c, 0xd1, 0xcb, 0x71, 0xce, 0x49, 0xc0, 0x08, 0x9a, 0x8b, 0x5c, 0x01, 0xb8, 0x9c,
0x78, 0x55, 0x10, 0xd3, 0x3f, 0xa0, 0x68, 0xaf, 0x61, 0x35, 0x70, 0x9a, 0xbb, 0x10, 0x24, 0x43,
0xf8, 0x2c, 0x77, 0xe0, 0x66, 0x90, 0x37, 0xe6, 0x07, 0x8f, 0xda, 0x32, 0x9e, 0xf3, 0x01, 0xe1,
0xa5, 0x47, 0xed, 0x60, 0xcb, 0xe2, 0x4c, 0x46, 0x65, 0x3e, 0xa6, 0x82, 0x63, 0x83, 0xee, 0x94,
0x61, 0x21, 0xca, 0x6a, 0x83, 0x76, 0x09, 0x4a, 0xc3, 0xdc, 0xdb, 0xda, 0xab, 0xda, 0xd1, 0x69,
0x4d, 0xbd, 0x81, 0x32, 0x30, 0x5f, 0x6a, 0x34, 0xf4, 0x7a, 0x43, 0x37, 0x54, 0x25, 0x38, 0x1d,
0x1b, 0x47, 0xc7, 0x47, 0x75, 0xdd, 0x50, 0x13, 0x68, 0x1e, 0x92, 0xe5, 0xa3, 0xc6, 0xa1, 0x3a,
0xb3, 0xf3, 0x87, 0x02, 0x4b, 0x43, 0xa5, 0x81, 0x10, 0x2c, 0x4a, 0x35, 0x66, 0xbd, 0x51, 0x6a,
0xbc, 0xad, 0xab, 0x37, 0xd0, 0x2a, 0xa8, 0x15, 0xfd, 0xf8, 0xa8, 0x5e, 0x6d, 0x98, 0x86, 0xbe,
0xaf, 0x57, 0x4f, 0xf4, 0x8a, 0xaa, 0x04, 0x92, 0xc7, 0x7a, 0xad, 0x52, 0xad, 0x1d, 0x98, 0xa5,
0xfd, 0x46, 0xf5, 0x44, 0x57, 0x13, 0x08, 0x20, 0x25, 0xbf, 0x67, 0x02, 0x7e, 0xb5, 0x56, 0x6d,
0x54, 0x4b, 0x0d, 0xbd, 0x62, 0xea, 0xef, 0xaa, 0x0d, 0x35, 0x89, 0x54, 0xc8, 0x9c, 0x56, 0x1b,
0x87, 0x15, 0xa3, 0x74, 0x5a, 0x2a, 0xbf, 0xd6, 0xd5, 0xd9, 0x00, 0x11, 0xf0, 0xf4, 0x8a, 0x9a,
0x0a, 0x10, 0xe2, 0xdb, 0xac, 0xbf, 0x2e, 0xd5, 0x0f, 0xf5, 0x8a, 0x3a, 0x57, 0xfc, 0x47, 0x81,
0xa5, 0x52, 0xd8, 0x95, 0xc4, 0x4a, 0x8f, 0x3a, 0x80, 0x64, 0xf0, 0x62, 0x6b, 0x2b, 0xda, 0x99,
0xd8, 0x87, 0x47, 0x76, 0xdb, 0xdc, 0xd7, 0x13, 0xb2, 0x24, 0x26, 0x5a, 0xc1, 0x0c, 0x23, 0x13,
0x96, 0xeb, 0xbd, 0xa6, 0x6d, 0x5d, 0x32, 0xa4, 0x5d, 0x0d, 0x8e, 0x1b, 0x18, 0xe7, 0x4c, 0x98,
0xd9, 0xc5, 0xbf, 0x95, 0x68, 0x5d, 0x8f, 0xae, 0xf7, 0x0e, 0x32, 0xd2, 0x4f, 0x9e, 0x2b, 0xe8,
0xde, 0x67, 0x0b, 0x25, 0xbc, 0xd2, 0x14, 0x89, 0x8f, 0xde, 0x43, 0x46, 0x1a, 0x13, 0xe7, 0x29,
0x30, 0xb9, 0x89, 0x4d, 0x75, 0xe8, 0x57, 0x46, 0xf1, 0xdf, 0x39, 0x50, 0x07, 0xd9, 0x24, 0xef,
0xf2, 0x1e, 0x40, 0xb4, 0x04, 0x1e, 0xce, 0xfb, 0x93, 0x74, 0x5d, 0x6a, 0x54, 0x93, 0x83, 0x37,
0xd4, 0x90, 0x7e, 0x80, 0xe5, 0x53, 0x6c, 0xb1, 0x97, 0xf1, 0xcd, 0x0e, 0x15, 0xaf, 0xb5, 0x06,
0x0a, 0x83, 0x8f, 0xbe, 0x60, 0x75, 0xdc, 0x55, 0x10, 0x85, 0xc5, 0xcb, 0x5b, 0x0b, 0x7a, 0x78,
0xa5, 0xa2, 0xf8, 0x56, 0x94, 0xcb, 0x4f, 0x2b, 0x2e, 0x2f, 0xdc, 0x85, 0x95, 0xfd, 0x70, 0x90,
0xc7, 0x96, 0x82, 0xed, 0x69, 0x36, 0x10, 0x61, 0x71, 0x67, 0xfa, 0x65, 0x05, 0x9d, 0x8f, 0x76,
0x87, 0x6b, 0xde, 0xef, 0xba, 0x3b, 0x31, 0xfa, 0x51, 0x81, 0xd5, 0x71, 0x3f, 0xc2, 0xd0, 0xd5,
0x2f, 0x34, 0xfa, 0x3b, 0x30, 0xf7, 0xf8, 0x7a, 0x20, 0xe9, 0x43, 0x0f, 0xd4, 0xe1, 0x9d, 0x1a,
0x4d, 0xbc, 0xc8, 0x84, 0xcd, 0x3d, 0xb7, 0x3b, 0x3d, 0x40, 0x9a, 0xfd, 0x3e, 0x4a, 0xe6, 0xc1,
0x52, 0x8e, 0xd6, 0xf2, 0xe2, 0x4f, 0x83, 0x7c, 0xf8, 0xf7, 0x44, 0x5e, 0xb7, 0x5d, 0x76, 0x31,
0xf9, 0x19, 0x47, 0x17, 0xfa, 0x5d, 0x05, 0xbd, 0x82, 0x85, 0x7d, 0xec, 0x50, 0xc7, 0x6a, 0xe1,
0xee, 0x21, 0xc1, 0xed, 0x89, 0x6a, 0xa7, 0xe8, 0x07, 0xcd, 0x14, 0xc7, 0x3c, 0xfa, 0x2f, 0x00,
0x00, 0xff, 0xff, 0x9f, 0x74, 0xae, 0xcd, 0x75, 0x11, 0x00, 0x00,
// 1637 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0x4f, 0x4f, 0x1b, 0x49,
0x16, 0x4f, 0x1b, 0x63, 0xc8, 0xb3, 0x31, 0x4d, 0x41, 0xc0, 0x71, 0x12, 0x2d, 0xdb, 0x49, 0x36,
0xc0, 0x2a, 0x36, 0x38, 0x51, 0xb4, 0x9b, 0x28, 0x1b, 0x19, 0xdc, 0x01, 0x2b, 0x91, 0x71, 0xda,
0x0e, 0x64, 0x95, 0x43, 0xab, 0x6c, 0x17, 0x76, 0x2b, 0x76, 0x57, 0xd3, 0x5d, 0xb6, 0xc2, 0x65,
0xa5, 0xbd, 0xec, 0x6a, 0x6f, 0x3b, 0x87, 0xd1, 0x1c, 0x47, 0xf3, 0x19, 0xe6, 0x30, 0x5f, 0x61,
0x3e, 0xc4, 0x1c, 0xe7, 0x83, 0x8c, 0xba, 0xaa, 0xba, 0xdd, 0xf8, 0x0f, 0x98, 0xdc, 0xba, 0xde,
0xdf, 0x5f, 0xbd, 0xf7, 0xea, 0xd5, 0xab, 0x06, 0xcd, 0x71, 0x29, 0xa3, 0xf9, 0x06, 0xc1, 0x4d,
0x6a, 0xe7, 0x5d, 0xa7, 0x99, 0x1f, 0xec, 0xe5, 0x3d, 0xe2, 0x0e, 0xac, 0x26, 0xf1, 0x72, 0x9c,
0x89, 0xd6, 0x09, 0xeb, 0x10, 0x97, 0xf4, 0x7b, 0x39, 0x21, 0x96, 0x73, 0x9d, 0x66, 0x6e, 0xb0,
0x97, 0xbd, 0xd7, 0xa6, 0xb4, 0xdd, 0x25, 0x79, 0x2e, 0xd5, 0xe8, 0x9f, 0xe5, 0x49, 0xcf, 0x61,
0x17, 0x42, 0x29, 0xfb, 0x58, 0x18, 0x26, 0xac, 0x93, 0x1f, 0xec, 0xe1, 0xae, 0xd3, 0xc1, 0x7b,
0xd2, 0x8b, 0xd9, 0xe8, 0xd2, 0xe6, 0x17, 0x29, 0xf6, 0x68, 0x82, 0x18, 0x66, 0x8c, 0x78, 0x0c,
0x33, 0x8b, 0xda, 0x42, 0x4a, 0x3b, 0x84, 0xd4, 0xbe, 0xaf, 0x64, 0x90, 0xf3, 0x3e, 0xf1, 0x18,
0x42, 0x10, 0xf7, 0xba, 0x94, 0x65, 0x94, 0x4d, 0x65, 0x2b, 0x6e, 0xf0, 0x6f, 0xf4, 0x10, 0x96,
0x5c, 0x6c, 0xb7, 0x30, 0x35, 0x5d, 0x32, 0x20, 0xb8, 0x9b, 0x89, 0x6d, 0x2a, 0x5b, 0x29, 0x23,
0x25, 0x88, 0x06, 0xa7, 0x69, 0xbb, 0xb0, 0x5c, 0x75, 0xa9, 0x43, 0x3d, 0x62, 0x10, 0xcf, 0xa1,
0xb6, 0x47, 0xd0, 0x03, 0x00, 0x0e, 0xc8, 0x74, 0xa9, 0xb4, 0x98, 0x32, 0x6e, 0x73, 0x8a, 0x41,
0x29, 0xd3, 0xfe, 0xa7, 0x00, 0x2a, 0x0e, 0x01, 0x05, 0x08, 0x1e, 0x00, 0x38, 0xfd, 0x46, 0xd7,
0x6a, 0x9a, 0x5f, 0xc8, 0x45, 0xa0, 0x25, 0x28, 0xef, 0xc8, 0x05, 0xda, 0x80, 0x05, 0x87, 0x36,
0xcd, 0x86, 0xc5, 0x24, 0x8c, 0x84, 0x43, 0x9b, 0xfb, 0xd6, 0x10, 0xf9, 0x5c, 0x04, 0xf9, 0x13,
0x58, 0x6e, 0xd2, 0x5e, 0xcf, 0x62, 0x8c, 0x10, 0xd3, 0xb2, 0x5b, 0xe4, 0x6b, 0x26, 0xce, 0xd9,
0xe9, 0x90, 0x5c, 0xf6, 0xa9, 0xda, 0x23, 0x48, 0x0b, 0x28, 0x21, 0x78, 0x04, 0xf1, 0x08, 0x6c,
0xfe, 0xad, 0xfd, 0xe0, 0x23, 0x6e, 0xb7, 0x5d, 0xd2, 0xbe, 0x84, 0x78, 0x52, 0xcc, 0x26, 0x78,
0x8e, 0x4d, 0xf2, 0x3c, 0xb2, 0xdd, 0xb9, 0xd1, 0xed, 0x3e, 0x86, 0xb4, 0x6f, 0xcf, 0xf4, 0xac,
0xb6, 0x8d, 0x59, 0xdf, 0x25, 0x7c, 0x03, 0x29, 0x63, 0xc9, 0xa7, 0xd6, 0x02, 0xa2, 0xb6, 0x0d,
0xab, 0x97, 0x80, 0x5d, 0xb1, 0x09, 0x03, 0xee, 0x9d, 0xe0, 0xae, 0xd5, 0xc2, 0x8c, 0xba, 0x55,
0xe2, 0x9e, 0x51, 0xb7, 0x87, 0xed, 0x26, 0xb9, 0x6a, 0x33, 0x7f, 0x82, 0xe4, 0x10, 0xa3, 0x97,
0x89, 0x6d, 0xce, 0x6d, 0xa5, 0x0c, 0x08, 0x41, 0x7a, 0xda, 0xf7, 0x31, 0xb8, 0x3f, 0xd9, 0xa8,
0x04, 0x92, 0x85, 0xc5, 0x06, 0xee, 0xfa, 0x24, 0x2f, 0xa3, 0x6c, 0xce, 0x6d, 0xc5, 0x8d, 0x70,
0x8d, 0xb6, 0x41, 0x65, 0x94, 0xe1, 0xae, 0x39, 0x08, 0x2c, 0x78, 0x32, 0x56, 0xcb, 0x9c, 0x1e,
0x1a, 0xf6, 0xd0, 0x0b, 0xd8, 0x10, 0xa2, 0xb8, 0xc9, 0xac, 0x01, 0x89, 0x6a, 0x88, 0xb4, 0xdf,
0xe1, 0xec, 0x22, 0xe7, 0x46, 0xf4, 0x9e, 0x02, 0xea, 0x59, 0x9e, 0x67, 0xd9, 0xed, 0xa8, 0x4a,
0x9c, 0xef, 0x63, 0x45, 0x72, 0x22, 0xe2, 0x87, 0xb0, 0x89, 0x07, 0xc4, 0xc5, 0x6d, 0x32, 0xe6,
0xc8, 0x94, 0xb0, 0x33, 0xf3, 0x9b, 0xca, 0x56, 0xcc, 0x78, 0x20, 0xe5, 0x46, 0x3c, 0xee, 0x0b,
0x21, 0xed, 0x35, 0x64, 0x43, 0x1a, 0x17, 0xb9, 0x54, 0x37, 0x23, 0x61, 0x55, 0xc6, 0xc2, 0xfa,
0x63, 0x2c, 0x92, 0xab, 0xa8, 0xbe, 0x8c, 0xea, 0x0b, 0xb8, 0x83, 0x05, 0x95, 0xb4, 0xcc, 0x31,
0x53, 0xfb, 0xb1, 0x8c, 0x62, 0xac, 0x86, 0x02, 0xd5, 0xd0, 0x2e, 0x3a, 0x81, 0x45, 0xff, 0xd0,
0xf5, 0x3d, 0x22, 0x92, 0x99, 0x2c, 0xbc, 0xcc, 0x4d, 0xee, 0x44, 0xb9, 0x2b, 0xdc, 0xe7, 0x6a,
0xdc, 0x86, 0x11, 0xda, 0xca, 0x3a, 0x90, 0x10, 0xb4, 0xeb, 0x0e, 0xf1, 0x21, 0x24, 0x84, 0x12,
0x4f, 0x74, 0xb2, 0x90, 0xbf, 0xd6, 0xbd, 0xf4, 0x25, 0x5d, 0x1b, 0x52, 0x5d, 0x7b, 0x09, 0x1b,
0xfa, 0x57, 0x8b, 0x91, 0xd6, 0x30, 0x7b, 0x33, 0x47, 0xf7, 0x15, 0x64, 0xc6, 0x75, 0x65, 0x64,
0xaf, 0x55, 0xfe, 0x00, 0xe8, 0xa0, 0x83, 0x2d, 0xbb, 0xc6, 0xb0, 0x3b, 0x6c, 0x1a, 0x19, 0x58,
0xf0, 0x7c, 0x02, 0x69, 0xf1, 0x3d, 0x2f, 0x1a, 0xc1, 0x12, 0xfd, 0x19, 0x52, 0x6d, 0x62, 0x13,
0xcf, 0xf2, 0x4c, 0x66, 0xf5, 0x88, 0x2c, 0xf0, 0xa4, 0xa4, 0xd5, 0xad, 0x1e, 0xd1, 0x5e, 0xc0,
0x9d, 0x10, 0x09, 0xef, 0x0d, 0xb3, 0x75, 0x44, 0x2d, 0x07, 0xeb, 0xa3, 0x7a, 0x12, 0xce, 0x1a,
0xcc, 0x8b, 0xd6, 0x23, 0x0e, 0xb3, 0x58, 0x68, 0x1f, 0x61, 0xa5, 0xe8, 0xf9, 0xfd, 0xa4, 0x47,
0x6c, 0x16, 0x89, 0x16, 0x71, 0x68, 0xb3, 0x63, 0x72, 0xc0, 0x52, 0x01, 0x38, 0x89, 0x6f, 0xf1,
0xfa, 0x1e, 0xf0, 0xff, 0x39, 0x40, 0x51, 0xbb, 0x12, 0xc3, 0x39, 0xac, 0x0d, 0x0f, 0x0f, 0x0e,
0xf9, 0x3c, 0xa4, 0xc9, 0xc2, 0x3f, 0xa6, 0x25, 0x7e, 0xdc, 0x52, 0xa4, 0x14, 0x87, 0xbc, 0xd5,
0xc1, 0x38, 0x31, 0xfb, 0x9f, 0x18, 0xac, 0x4e, 0x10, 0x46, 0xf7, 0xe1, 0x76, 0xd8, 0x7c, 0x65,
0x17, 0x1a, 0x12, 0x66, 0xef, 0xd8, 0x0f, 0x61, 0x49, 0xdc, 0xa3, 0xc4, 0x35, 0x23, 0x37, 0x4e,
0x2a, 0x20, 0xd6, 0xe4, 0x9d, 0xe9, 0x88, 0xeb, 0x50, 0x0a, 0x89, 0x7b, 0x27, 0x15, 0x10, 0xb9,
0xd0, 0xe5, 0xc4, 0xce, 0x8f, 0x9e, 0x92, 0x37, 0xe1, 0x29, 0x49, 0x6c, 0x2a, 0x5b, 0xe9, 0xc2,
0x93, 0x59, 0x4f, 0x49, 0x70, 0x3a, 0x7e, 0x89, 0xc1, 0xc6, 0x94, 0x13, 0x14, 0x31, 0xae, 0x7c,
0x93, 0x71, 0xf4, 0x77, 0xb8, 0x4b, 0x58, 0x67, 0xcf, 0x6c, 0x11, 0x87, 0x7a, 0x16, 0x13, 0xb3,
0x87, 0x69, 0xf7, 0x7b, 0x0d, 0xe2, 0xca, 0xc8, 0xf9, 0xe3, 0xcd, 0x5e, 0x49, 0xf0, 0xf9, 0x94,
0x51, 0xe1, 0x5c, 0xf4, 0x1c, 0xd6, 0x03, 0x2d, 0xcb, 0x6e, 0x76, 0xfb, 0x9e, 0x45, 0xed, 0x68,
0x28, 0xd7, 0x24, 0xb7, 0x1c, 0x30, 0x79, 0xb4, 0xb6, 0x41, 0xc5, 0x61, 0x13, 0x32, 0x79, 0x69,
0xca, 0xa8, 0x2e, 0x0f, 0xe9, 0xba, 0x4f, 0x46, 0x6f, 0xe0, 0x3e, 0x37, 0xe0, 0x0b, 0x5a, 0xb6,
0x19, 0x51, 0x3b, 0xef, 0x93, 0xbe, 0x68, 0xde, 0x71, 0xe3, 0x6e, 0x20, 0x53, 0xb6, 0x87, 0xdd,
0xed, 0x83, 0x2f, 0xa0, 0xbd, 0x86, 0xa5, 0x12, 0xed, 0x61, 0x2b, 0xec, 0xd5, 0x6b, 0x30, 0x2f,
0x3c, 0xca, 0xa3, 0xc4, 0x17, 0x68, 0x1d, 0x12, 0x2d, 0x2e, 0x16, 0xcc, 0x22, 0x62, 0xa5, 0xbd,
0x82, 0x74, 0xa0, 0x2e, 0xc3, 0xbd, 0x0d, 0x6a, 0x78, 0x85, 0x9b, 0x52, 0x47, 0x98, 0x5a, 0x0e,
0xe9, 0x42, 0x45, 0xfb, 0x2e, 0x06, 0x2b, 0x3c, 0x5a, 0x75, 0x97, 0x0c, 0x6f, 0xd0, 0xb7, 0x10,
0x67, 0xae, 0xac, 0xdb, 0x64, 0xa1, 0x30, 0x2d, 0x5b, 0x63, 0x8a, 0x39, 0x7f, 0x51, 0xa1, 0x2d,
0x62, 0x70, 0xfd, 0xec, 0xcf, 0x0a, 0x2c, 0x06, 0x24, 0xf4, 0x37, 0x98, 0xe7, 0x69, 0xe3, 0x50,
0x92, 0x05, 0x6d, 0x68, 0x95, 0xb0, 0x4e, 0x2e, 0x18, 0x1b, 0x73, 0xfb, 0xdc, 0x85, 0x98, 0x13,
0x85, 0xc2, 0xc8, 0x6c, 0x17, 0x1b, 0x99, 0xed, 0xfc, 0x0b, 0xd7, 0xc1, 0x2e, 0xb3, 0x9a, 0x96,
0xc3, 0x2f, 0xa7, 0x01, 0x65, 0x24, 0xb8, 0xa3, 0x57, 0xa2, 0x9c, 0x13, 0x9f, 0xe1, 0x37, 0x17,
0x39, 0x02, 0x70, 0x39, 0x91, 0x55, 0x10, 0xb7, 0xbf, 0x4f, 0xd1, 0xde, 0xc3, 0x9a, 0x0f, 0x9a,
0x43, 0xf0, 0x8b, 0x21, 0x48, 0xcb, 0x3d, 0xb8, 0xcd, 0xc7, 0xa3, 0x33, 0x97, 0xf6, 0x64, 0x3c,
0x17, 0x7d, 0xc2, 0x5b, 0x97, 0xf6, 0xfc, 0x51, 0x91, 0x33, 0x19, 0x95, 0xf5, 0x98, 0xf0, 0x97,
0x75, 0xba, 0x73, 0x04, 0x4b, 0x61, 0x55, 0x1b, 0xb4, 0x4b, 0x50, 0x12, 0x16, 0x3e, 0x56, 0xde,
0x55, 0x8e, 0x4f, 0x2b, 0xea, 0x2d, 0x94, 0x82, 0xc5, 0x62, 0xbd, 0xae, 0xd7, 0xea, 0xba, 0xa1,
0x2a, 0xfe, 0xaa, 0x6a, 0x1c, 0x57, 0x8f, 0x6b, 0xba, 0xa1, 0xc6, 0x50, 0x1a, 0xa0, 0x78, 0x78,
0x68, 0xe8, 0x87, 0xc5, 0xfa, 0xb1, 0xa1, 0xce, 0xed, 0xfc, 0xa4, 0xc0, 0xf2, 0xc8, 0x01, 0x41,
0x08, 0xd2, 0xd2, 0x98, 0x59, 0xab, 0x17, 0xeb, 0x1f, 0x6b, 0xea, 0x2d, 0xb4, 0x06, 0x6a, 0x49,
0xaf, 0x1e, 0xd7, 0xca, 0x75, 0xd3, 0xd0, 0x0f, 0xf4, 0xf2, 0x89, 0x5e, 0x52, 0x15, 0x5f, 0xb2,
0xaa, 0x57, 0x4a, 0xe5, 0xca, 0xa1, 0x59, 0x3c, 0xa8, 0x97, 0x4f, 0x74, 0x35, 0x86, 0x00, 0x12,
0xf2, 0x7b, 0xce, 0xe7, 0x97, 0x2b, 0xe5, 0x7a, 0xb9, 0x58, 0xd7, 0x4b, 0xa6, 0xfe, 0xa9, 0x5c,
0x57, 0xe3, 0x48, 0x85, 0xd4, 0x69, 0xb9, 0x7e, 0x54, 0x32, 0x8a, 0xa7, 0xc5, 0xfd, 0xf7, 0xba,
0x3a, 0xef, 0x6b, 0xf8, 0x3c, 0xbd, 0xa4, 0x26, 0x7c, 0x0d, 0xf1, 0x6d, 0xd6, 0xde, 0x17, 0x6b,
0x47, 0x7a, 0x49, 0x5d, 0x28, 0xfc, 0xa6, 0xc0, 0x72, 0x31, 0xe8, 0x4d, 0xe2, 0xfd, 0x81, 0x3a,
0x80, 0x64, 0x08, 0x23, 0x13, 0x38, 0xda, 0x99, 0xda, 0x8d, 0xc7, 0xc6, 0xf4, 0xec, 0x5f, 0xa6,
0xd4, 0x4a, 0x44, 0xb4, 0x84, 0x19, 0x46, 0x26, 0xac, 0xd4, 0xfa, 0x8d, 0x9e, 0x75, 0xc9, 0x91,
0x76, 0xbd, 0x72, 0xd4, 0xc1, 0x24, 0x30, 0x41, 0x7d, 0x17, 0x7e, 0x55, 0xc2, 0x97, 0x47, 0xb8,
0xbd, 0x4f, 0x90, 0x92, 0x38, 0x79, 0xc5, 0xa0, 0x47, 0x57, 0x1e, 0x97, 0x60, 0x4b, 0x33, 0x94,
0x3f, 0xfa, 0x0c, 0x29, 0xe9, 0x4c, 0xac, 0x67, 0xd0, 0xc9, 0x4e, 0x6d, 0xad, 0x23, 0x0f, 0xa6,
0xc2, 0x7f, 0x15, 0x58, 0x09, 0xc6, 0x78, 0x1a, 0x6e, 0xc6, 0x85, 0x0d, 0x19, 0x41, 0xc9, 0x22,
0x45, 0xbb, 0x55, 0x75, 0x29, 0x3d, 0xbb, 0x22, 0x61, 0x63, 0xaf, 0x94, 0xec, 0x5f, 0x67, 0x92,
0x95, 0x48, 0x7e, 0x5f, 0x00, 0x75, 0x58, 0xd7, 0x12, 0xc8, 0x67, 0x00, 0xd1, 0xa2, 0x78, 0x62,
0x1f, 0x4f, 0xb3, 0x77, 0xa9, 0x71, 0x4e, 0x4f, 0xe3, 0x48, 0x83, 0xfc, 0x17, 0xac, 0x9c, 0x62,
0x8b, 0xbd, 0x8d, 0x4e, 0x9a, 0xa8, 0x70, 0xa3, 0xb1, 0x54, 0x38, 0x7c, 0xf6, 0x0d, 0xa3, 0xec,
0xae, 0x82, 0x28, 0xa4, 0x2f, 0x4f, 0x51, 0xe8, 0xe9, 0xb5, 0x86, 0xa2, 0x53, 0x5a, 0x36, 0x37,
0xab, 0xb8, 0xdc, 0x70, 0x17, 0x56, 0x0f, 0x82, 0xc1, 0x22, 0x32, 0xa4, 0x6c, 0xcf, 0x32, 0x11,
0x09, 0x8f, 0x3b, 0xb3, 0x0f, 0x4f, 0xe8, 0x7c, 0xbc, 0x4f, 0xdd, 0x70, 0x7f, 0x37, 0x9d, 0xd1,
0xd1, 0xbf, 0x15, 0x58, 0x9b, 0xf4, 0x28, 0x44, 0xd7, 0x67, 0x68, 0xfc, 0x5d, 0x9a, 0x7d, 0x7e,
0x33, 0x25, 0x89, 0xa1, 0x0f, 0xea, 0xe8, 0x8c, 0x8f, 0xa6, 0x6e, 0x64, 0xca, 0x4b, 0x22, 0xbb,
0x3b, 0xbb, 0x82, 0x74, 0xfb, 0xcf, 0xb0, 0x98, 0x87, 0x8f, 0x04, 0xb4, 0x9e, 0x13, 0x7f, 0x75,
0x72, 0xc1, 0x5f, 0x9d, 0x9c, 0xde, 0x73, 0xd8, 0xc5, 0xf4, 0x34, 0x8e, 0x3f, 0x30, 0x76, 0x15,
0xf4, 0x0e, 0x96, 0x0e, 0xb0, 0x4d, 0x6d, 0xab, 0x89, 0xbb, 0x47, 0x04, 0xb7, 0xa6, 0x9a, 0x9d,
0xa1, 0x33, 0x35, 0x12, 0x5c, 0xe7, 0xd9, 0x1f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x24, 0x7e, 0xd8,
0x35, 0xac, 0x12, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -1574,6 +1682,78 @@ var _ProposerService_serviceDesc = grpc.ServiceDesc{
Metadata: "proto/beacon/rpc/v1/services.proto",
}
// AggregatorServiceClient is the client API for AggregatorService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type AggregatorServiceClient interface {
SubmitAggregateAndProof(ctx context.Context, in *AggregationRequest, opts ...grpc.CallOption) (*AggregationResponse, error)
}
type aggregatorServiceClient struct {
cc *grpc.ClientConn
}
func NewAggregatorServiceClient(cc *grpc.ClientConn) AggregatorServiceClient {
return &aggregatorServiceClient{cc}
}
func (c *aggregatorServiceClient) SubmitAggregateAndProof(ctx context.Context, in *AggregationRequest, opts ...grpc.CallOption) (*AggregationResponse, error) {
out := new(AggregationResponse)
err := c.cc.Invoke(ctx, "/ethereum.beacon.rpc.v1.AggregatorService/SubmitAggregateAndProof", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// AggregatorServiceServer is the server API for AggregatorService service.
type AggregatorServiceServer interface {
SubmitAggregateAndProof(context.Context, *AggregationRequest) (*AggregationResponse, error)
}
// UnimplementedAggregatorServiceServer can be embedded to have forward compatible implementations.
type UnimplementedAggregatorServiceServer struct {
}
func (*UnimplementedAggregatorServiceServer) SubmitAggregateAndProof(ctx context.Context, req *AggregationRequest) (*AggregationResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method SubmitAggregateAndProof not implemented")
}
func RegisterAggregatorServiceServer(s *grpc.Server, srv AggregatorServiceServer) {
s.RegisterService(&_AggregatorService_serviceDesc, srv)
}
func _AggregatorService_SubmitAggregateAndProof_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(AggregationRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(AggregatorServiceServer).SubmitAggregateAndProof(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/ethereum.beacon.rpc.v1.AggregatorService/SubmitAggregateAndProof",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(AggregatorServiceServer).SubmitAggregateAndProof(ctx, req.(*AggregationRequest))
}
return interceptor(ctx, in, info, handler)
}
var _AggregatorService_serviceDesc = grpc.ServiceDesc{
ServiceName: "ethereum.beacon.rpc.v1.AggregatorService",
HandlerType: (*AggregatorServiceServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "SubmitAggregateAndProof",
Handler: _AggregatorService_SubmitAggregateAndProof_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "proto/beacon/rpc/v1/services.proto",
}
// ValidatorServiceClient is the client API for ValidatorService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.

View File

@@ -901,7 +901,7 @@ func (m *EpochSpanMap) MarshalTo(dAtA []byte) (int, error) {
var l int
_ = l
if len(m.EpochSpanMap) > 0 {
for k := range m.EpochSpanMap {
for k, _ := range m.EpochSpanMap {
dAtA[i] = 0xa
i++
v := m.EpochSpanMap[k]

View File

@@ -7,6 +7,7 @@ mocks=(
"./beacon-chain/internal/validator_service_mock.go ValidatorServiceServer,ValidatorService_WaitForActivationServer,ValidatorService_WaitForChainStartServer"
"./validator/internal/attester_service_mock.go AttesterServiceClient"
"./validator/internal/proposer_service_mock.go ProposerServiceClient"
"./validator/internal/aggregator_service_mock.go AggregatorServiceClient"
"./validator/internal/validator_service_mock.go ValidatorServiceClient,ValidatorService_WaitForActivationClient,ValidatorService_WaitForChainStartClient")
for ((i = 0; i < ${#mocks[@]}; i++)); do

View File

@@ -31,8 +31,6 @@ type Flags struct {
InitSyncNoVerify bool // InitSyncNoVerify when initial syncing w/o verifying block's contents.
SkipBLSVerify bool // Skips BLS verification across the runtime.
EnableBackupWebhook bool // EnableBackupWebhook to allow database backups to trigger from monitoring port /db/backup.
OptimizeProcessEpoch bool // OptimizeProcessEpoch to process epoch with optimizations by pre computing records.
Scatter bool // Scatter sequential processing by scattering it to multiple cores.
PruneFinalizedStates bool // PruneFinalizedStates from the database.
// Cache toggles.
@@ -107,14 +105,6 @@ func ConfigureBeaconChain(ctx *cli.Context) {
log.Warn("Enabled BLS pubkey cache.")
cfg.EnableBLSPubkeyCache = true
}
if ctx.GlobalBool(OptimizeProcessEpoch.Name) {
log.Warn("Processing epoch with optimizations")
cfg.OptimizeProcessEpoch = true
}
if ctx.GlobalBool(Scatter.Name) {
log.Warn("Scattering sequential proceses to multiple cores")
cfg.Scatter = true
}
if ctx.GlobalBool(pruneFinalizedStatesFlag.Name) {
log.Warn("Enabled pruning old finalized states from database.")
cfg.PruneFinalizedStates = true

View File

@@ -68,16 +68,7 @@ var (
Name: "enable-bls-pubkey-cache",
Usage: "Enable BLS pubkey cache to improve wall time of PubkeyFromBytes",
}
// OptimizeProcessEpoch optimizes process epoch.
OptimizeProcessEpoch = cli.BoolFlag{
Name: "optimize-process-epoch",
Usage: "Process epoch with optimizations",
}
// Scatter scatters sequential processes to multiple cores
Scatter = cli.BoolFlag{
Name: "scatter",
Usage: "Scatter sequential processes to multiple cores",
}
pruneFinalizedStatesFlag = cli.BoolFlag{
Name: "prune-finalized-states",
Usage: "Delete old states from the database after reaching new finalized checkpoint",
@@ -103,11 +94,23 @@ var (
Usage: deprecatedUsage,
Hidden: true,
}
deprecatedOptimizeProcessEpoch = cli.BoolFlag{
Name: "optimize-process-epoch",
Usage: deprecatedUsage,
Hidden: true,
}
deprecatedScatterFlag = cli.BoolFlag{
Name: "scatter",
Usage: deprecatedUsage,
Hidden: true,
}
)
var deprecatedFlags = []cli.Flag{
deprecatedNoGenesisDelayFlag,
deprecatedEnableFinalizedBlockRootIndexFlag,
deprecatedScatterFlag,
deprecatedOptimizeProcessEpoch,
}
// ValidatorFlags contains a list of all the feature flags that apply to the validator client.
@@ -125,8 +128,6 @@ var BeaconChainFlags = append(deprecatedFlags, []cli.Flag{
InitSyncNoVerifyFlag,
NewCacheFlag,
SkipBLSVerifyFlag,
OptimizeProcessEpoch,
Scatter,
enableBackupWebhookFlag,
enableBLSPubkeyCacheFlag,
enableShuffledIndexCache,

View File

@@ -13,7 +13,6 @@ go_library(
"//proto/beacon/p2p/v1:go_default_library",
"//proto/eth/v1alpha1:go_default_library",
"//shared/bls:go_default_library",
"//shared/featureconfig:go_default_library",
"//shared/hashutil:go_default_library",
"//shared/mputil:go_default_library",
"//shared/params:go_default_library",
@@ -27,7 +26,6 @@ go_library(
go_test(
name = "go_default_test",
srcs = [
"generate_deposits_test.go",
"generate_genesis_state_test.go",
"generate_keys_test.go",
],
@@ -38,7 +36,6 @@ go_test(
deps = [
"//beacon-chain/core/state:go_default_library",
"//proto/eth/v1alpha1:go_default_library",
"//shared/featureconfig:go_default_library",
"//shared/params:go_default_library",
"//shared/trieutil:go_default_library",
"@com_github_ethereum_go_ethereum//common/hexutil:go_default_library",

View File

@@ -1,72 +0,0 @@
package interop_test
import (
"bytes"
"testing"
"github.com/prysmaticlabs/prysm/shared/featureconfig"
"github.com/prysmaticlabs/prysm/shared/interop"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/prysmaticlabs/prysm/shared/trieutil"
)
func TestSPMPDeposits(t *testing.T) {
// Confirm that internal single-processor deposits end up with the same results as the multi-processor version
numDeposits := 557
cfg := &featureconfig.Flags{
Scatter: false,
}
featureconfig.Init(cfg)
spPrivKeys, spPubKeys, err := interop.DeterministicallyGenerateKeys(0 /*startIndex*/, uint64(numDeposits))
if err != nil {
t.Fatal(err)
}
spDepositDataItems, spDepositDataRoots, err := interop.DepositDataFromKeys(spPrivKeys, spPubKeys)
if err != nil {
t.Fatal(err)
}
trie, err := trieutil.GenerateTrieFromItems(
spDepositDataRoots,
int(params.BeaconConfig().DepositContractTreeDepth),
)
if err != nil {
t.Fatal(err)
}
spDeposits, err := interop.GenerateDepositsFromData(spDepositDataItems, trie)
if err != nil {
t.Fatal(err)
}
cfg = &featureconfig.Flags{
Scatter: true,
}
featureconfig.Init(cfg)
privKeys, pubKeys, err := interop.DeterministicallyGenerateKeys(0 /*startIndex*/, uint64(numDeposits))
if err != nil {
t.Fatal(err)
}
depositDataItems, _, err := interop.DepositDataFromKeys(privKeys, pubKeys)
if err != nil {
t.Fatal(err)
}
deposits, err := interop.GenerateDepositsFromData(depositDataItems, trie)
if err != nil {
t.Fatal(err)
}
for i := range deposits {
spD, err := spDeposits[i].Marshal()
if err != nil {
t.Fatal(err)
}
d, err := deposits[i].Marshal()
if err != nil {
t.Fatal(err)
}
if bytes.Compare(d, spD) != 0 {
t.Fatalf("Deposit mismatch at index %d: %v vs %v", i, spD, d)
}
}
}

View File

@@ -9,7 +9,6 @@ import (
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
"github.com/prysmaticlabs/prysm/shared/bls"
"github.com/prysmaticlabs/prysm/shared/featureconfig"
"github.com/prysmaticlabs/prysm/shared/hashutil"
"github.com/prysmaticlabs/prysm/shared/mputil"
"github.com/prysmaticlabs/prysm/shared/params"
@@ -62,24 +61,21 @@ func GenerateGenesisState(genesisTime, numValidators uint64) (*pb.BeaconState, [
// GenerateDepositsFromData a list of deposit items by creating proofs for each of them from a sparse Merkle trie.
func GenerateDepositsFromData(depositDataItems []*ethpb.Deposit_Data, trie *trieutil.MerkleTrie) ([]*ethpb.Deposit, error) {
if c := featureconfig.Get(); c.Scatter {
deposits := make([]*ethpb.Deposit, len(depositDataItems))
results, err := mputil.Scatter(len(depositDataItems), func(offset int, entries int, _ *sync.RWMutex) (interface{}, error) {
return generateDepositsFromData(depositDataItems[offset:offset+entries], offset, trie)
})
if err != nil {
return nil, errors.Wrap(err, "failed to generate deposits from data")
}
for _, result := range results {
if depositExtent, ok := result.Extent.([]*ethpb.Deposit); ok {
copy(deposits[result.Offset:], depositExtent)
} else {
return nil, errors.New("extent not of expected type")
}
}
return deposits, nil
deposits := make([]*ethpb.Deposit, len(depositDataItems))
results, err := mputil.Scatter(len(depositDataItems), func(offset int, entries int, _ *sync.RWMutex) (interface{}, error) {
return generateDepositsFromData(depositDataItems[offset:offset+entries], offset, trie)
})
if err != nil {
return nil, errors.Wrap(err, "failed to generate deposits from data")
}
return generateDepositsFromData(depositDataItems, 0, trie)
for _, result := range results {
if depositExtent, ok := result.Extent.([]*ethpb.Deposit); ok {
copy(deposits[result.Offset:], depositExtent)
} else {
return nil, errors.New("extent not of expected type")
}
}
return deposits, nil
}
// generateDepositsFromData a list of deposit items by creating proofs for each of them from a sparse Merkle trie.
@@ -100,31 +96,28 @@ func generateDepositsFromData(depositDataItems []*ethpb.Deposit_Data, offset int
// DepositDataFromKeys generates a list of deposit data items from a set of BLS validator keys.
func DepositDataFromKeys(privKeys []*bls.SecretKey, pubKeys []*bls.PublicKey) ([]*ethpb.Deposit_Data, [][]byte, error) {
if c := featureconfig.Get(); c.Scatter {
type depositData struct {
items []*ethpb.Deposit_Data
roots [][]byte
}
depositDataItems := make([]*ethpb.Deposit_Data, len(privKeys))
depositDataRoots := make([][]byte, len(privKeys))
results, err := mputil.Scatter(len(privKeys), func(offset int, entries int, _ *sync.RWMutex) (interface{}, error) {
items, roots, err := depositDataFromKeys(privKeys[offset:offset+entries], pubKeys[offset:offset+entries])
return &depositData{items: items, roots: roots}, err
})
if err != nil {
return nil, nil, errors.Wrap(err, "failed to generate deposit data from keys")
}
for _, result := range results {
if depositDataExtent, ok := result.Extent.(*depositData); ok {
copy(depositDataItems[result.Offset:], depositDataExtent.items)
copy(depositDataRoots[result.Offset:], depositDataExtent.roots)
} else {
return nil, nil, errors.New("extent not of expected type")
}
}
return depositDataItems, depositDataRoots, nil
type depositData struct {
items []*ethpb.Deposit_Data
roots [][]byte
}
return depositDataFromKeys(privKeys, pubKeys)
depositDataItems := make([]*ethpb.Deposit_Data, len(privKeys))
depositDataRoots := make([][]byte, len(privKeys))
results, err := mputil.Scatter(len(privKeys), func(offset int, entries int, _ *sync.RWMutex) (interface{}, error) {
items, roots, err := depositDataFromKeys(privKeys[offset:offset+entries], pubKeys[offset:offset+entries])
return &depositData{items: items, roots: roots}, err
})
if err != nil {
return nil, nil, errors.Wrap(err, "failed to generate deposit data from keys")
}
for _, result := range results {
if depositDataExtent, ok := result.Extent.(*depositData); ok {
copy(depositDataItems[result.Offset:], depositDataExtent.items)
copy(depositDataRoots[result.Offset:], depositDataExtent.roots)
} else {
return nil, nil, errors.New("extent not of expected type")
}
}
return depositDataItems, depositDataRoots, nil
}
func depositDataFromKeys(privKeys []*bls.SecretKey, pubKeys []*bls.PublicKey) ([]*ethpb.Deposit_Data, [][]byte, error) {

View File

@@ -7,7 +7,6 @@ import (
"github.com/pkg/errors"
"github.com/prysmaticlabs/prysm/shared/bls"
"github.com/prysmaticlabs/prysm/shared/featureconfig"
"github.com/prysmaticlabs/prysm/shared/hashutil"
"github.com/prysmaticlabs/prysm/shared/mputil"
)
@@ -20,31 +19,28 @@ const (
// the algorithm specified in the Eth2.0-Specs interop mock start section found here:
// https://github.com/ethereum/eth2.0-pm/blob/a085c9870f3956d6228ed2a40cd37f0c6580ecd7/interop/mocked_start/README.md
func DeterministicallyGenerateKeys(startIndex, numKeys uint64) ([]*bls.SecretKey, []*bls.PublicKey, error) {
if c := featureconfig.Get(); c.Scatter {
privKeys := make([]*bls.SecretKey, numKeys)
pubKeys := make([]*bls.PublicKey, numKeys)
type keys struct {
secrets []*bls.SecretKey
publics []*bls.PublicKey
}
results, err := mputil.Scatter(int(numKeys), func(offset int, entries int, _ *sync.RWMutex) (interface{}, error) {
secs, pubs, err := deterministicallyGenerateKeys(uint64(offset)+startIndex, uint64(entries))
return &keys{secrets: secs, publics: pubs}, err
})
if err != nil {
return nil, nil, errors.Wrap(err, "failed to generate keys")
}
for _, result := range results {
if keysExtent, ok := result.Extent.(*keys); ok {
copy(privKeys[result.Offset:], keysExtent.secrets)
copy(pubKeys[result.Offset:], keysExtent.publics)
} else {
return nil, nil, errors.New("extent not of expected type")
}
}
return privKeys, pubKeys, nil
privKeys := make([]*bls.SecretKey, numKeys)
pubKeys := make([]*bls.PublicKey, numKeys)
type keys struct {
secrets []*bls.SecretKey
publics []*bls.PublicKey
}
return deterministicallyGenerateKeys(startIndex, numKeys)
results, err := mputil.Scatter(int(numKeys), func(offset int, entries int, _ *sync.RWMutex) (interface{}, error) {
secs, pubs, err := deterministicallyGenerateKeys(uint64(offset)+startIndex, uint64(entries))
return &keys{secrets: secs, publics: pubs}, err
})
if err != nil {
return nil, nil, errors.Wrap(err, "failed to generate keys")
}
for _, result := range results {
if keysExtent, ok := result.Extent.(*keys); ok {
copy(privKeys[result.Offset:], keysExtent.secrets)
copy(pubKeys[result.Offset:], keysExtent.publics)
} else {
return nil, nil, errors.New("extent not of expected type")
}
}
return privKeys, pubKeys, nil
}
func deterministicallyGenerateKeys(startIndex, numKeys uint64) ([]*bls.SecretKey, []*bls.PublicKey, error) {

View File

@@ -246,6 +246,7 @@ func MinimalSpecConfig() *BeaconChainConfig {
minimalConfig.ShuffleRoundCount = 10
minimalConfig.MinGenesisActiveValidatorCount = 64
minimalConfig.MinGenesisTime = 0
minimalConfig.TargetAggregatorsPerCommittee = 2
// Gwei values
minimalConfig.MinDepositAmount = 1e9

View File

@@ -6,6 +6,7 @@ go_library(
"runner.go",
"service.go",
"validator.go",
"validator_aggregate.go",
"validator_attest.go",
"validator_metrics.go",
"validator_propose.go",
@@ -18,6 +19,7 @@ go_library(
"//proto/beacon/rpc/v1:go_default_library",
"//proto/eth/v1alpha1:go_default_library",
"//shared/bytesutil:go_default_library",
"//shared/hashutil:go_default_library",
"//shared/keystore:go_default_library",
"//shared/params:go_default_library",
"//shared/roughtime:go_default_library",
@@ -46,6 +48,7 @@ go_test(
"fake_validator_test.go",
"runner_test.go",
"service_test.go",
"validator_aggregate_test.go",
"validator_attest_test.go",
"validator_propose_test.go",
"validator_test.go",
@@ -56,6 +59,7 @@ go_test(
"//proto/beacon/rpc/v1:go_default_library",
"//proto/eth/v1alpha1:go_default_library",
"//shared:go_default_library",
"//shared/bls:go_default_library",
"//shared/keystore:go_default_library",
"//shared/params:go_default_library",
"//shared/roughtime:go_default_library",

View File

@@ -22,7 +22,7 @@ type fakeValidator struct {
UpdateAssignmentsRet error
RoleAtCalled bool
RoleAtArg1 uint64
RoleAtRet pb.ValidatorRole
RolesAtRet []pb.ValidatorRole
AttestToBlockHeadCalled bool
AttestToBlockHeadArg1 uint64
ProposeBlockCalled bool
@@ -77,12 +77,12 @@ func (fv *fakeValidator) LogValidatorGainsAndLosses(_ context.Context, slot uint
return nil
}
func (fv *fakeValidator) RolesAt(slot uint64) map[[48]byte]pb.ValidatorRole {
func (fv *fakeValidator) RolesAt(_ context.Context, slot uint64) (map[[48]byte][]pb.ValidatorRole, error) {
fv.RoleAtCalled = true
fv.RoleAtArg1 = slot
vr := make(map[[48]byte]pb.ValidatorRole)
vr[[48]byte{1}] = fv.RoleAtRet
return vr
vr := make(map[[48]byte][]pb.ValidatorRole)
vr[[48]byte{1}] = fv.RolesAtRet
return vr, nil
}
func (fv *fakeValidator) SubmitAttestation(_ context.Context, slot uint64, pubKey [48]byte) {
@@ -94,3 +94,5 @@ func (fv *fakeValidator) ProposeBlock(_ context.Context, slot uint64, pubKey [48
fv.ProposeBlockCalled = true
fv.ProposeBlockArg1 = slot
}
func (fv *fakeValidator) SubmitAggregateAndProof(_ context.Context, slot uint64, pubKey [48]byte) {}

View File

@@ -2,14 +2,11 @@ package client
import (
"context"
"fmt"
"sync"
"time"
pb "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1"
"github.com/prysmaticlabs/prysm/shared/bytesutil"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/sirupsen/logrus"
"go.opencensus.io/trace"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
@@ -26,9 +23,10 @@ type Validator interface {
SlotDeadline(slot uint64) time.Time
LogValidatorGainsAndLosses(ctx context.Context, slot uint64) error
UpdateAssignments(ctx context.Context, slot uint64) error
RolesAt(slot uint64) map[[48]byte]pb.ValidatorRole // validator pubKey -> role
RolesAt(ctx context.Context, slot uint64) (map[[48]byte][]pb.ValidatorRole, error) // validator pubKey -> roles
SubmitAttestation(ctx context.Context, slot uint64, pubKey [48]byte)
ProposeBlock(ctx context.Context, slot uint64, pubKey [48]byte)
SubmitAggregateAndProof(ctx context.Context, slot uint64, pubKey [48]byte)
}
// Run the main validator routine. This routine exits if the context is
@@ -85,28 +83,32 @@ func run(ctx context.Context, v Validator) {
}
var wg sync.WaitGroup
for id, role := range v.RolesAt(slot) {
allRoles, err := v.RolesAt(ctx, slot)
if err != nil {
log.WithError(err).Error("Could not get validator roles")
continue
}
for id, roles := range allRoles {
wg.Add(1)
go func(role pb.ValidatorRole, id [48]byte) {
log := log.WithFields(logrus.Fields{
"pubKey": fmt.Sprintf("%#x", bytesutil.Trunc(id[:])),
"role": role,
})
switch role {
case pb.ValidatorRole_BOTH:
go v.SubmitAttestation(slotCtx, slot, id)
v.ProposeBlock(slotCtx, slot, id)
case pb.ValidatorRole_ATTESTER:
v.SubmitAttestation(slotCtx, slot, id)
case pb.ValidatorRole_PROPOSER:
v.ProposeBlock(slotCtx, slot, id)
case pb.ValidatorRole_UNKNOWN:
log.Debug("No active role, doing nothing")
default:
log.Warn("Unhandled role")
go func(roles []pb.ValidatorRole, id [48]byte) {
for _, role := range roles {
switch role {
case pb.ValidatorRole_ATTESTER:
go v.SubmitAttestation(slotCtx, slot, id)
case pb.ValidatorRole_PROPOSER:
go v.ProposeBlock(slotCtx, slot, id)
case pb.ValidatorRole_AGGREGATOR:
go v.SubmitAggregateAndProof(slotCtx, slot, id)
case pb.ValidatorRole_UNKNOWN:
log.Debug("No active roles, doing nothing")
default:
log.Warnf("Unhandled role %v", role)
}
}
}(role, id)
}(roles, id)
}
// Wait for all processes to complete, then report span complete.
go func() {

View File

@@ -114,7 +114,7 @@ func TestAttests_NextSlot(t *testing.T) {
slot := uint64(55)
ticker := make(chan uint64)
v.NextSlotRet = ticker
v.RoleAtRet = pb.ValidatorRole_ATTESTER
v.RolesAtRet = []pb.ValidatorRole{pb.ValidatorRole_ATTESTER}
go func() {
ticker <- slot
@@ -138,7 +138,7 @@ func TestProposes_NextSlot(t *testing.T) {
slot := uint64(55)
ticker := make(chan uint64)
v.NextSlotRet = ticker
v.RoleAtRet = pb.ValidatorRole_PROPOSER
v.RolesAtRet = []pb.ValidatorRole{pb.ValidatorRole_PROPOSER}
go func() {
ticker <- slot
@@ -162,7 +162,7 @@ func TestBothProposesAndAttests_NextSlot(t *testing.T) {
slot := uint64(55)
ticker := make(chan uint64)
v.NextSlotRet = ticker
v.RoleAtRet = pb.ValidatorRole_BOTH
v.RolesAtRet = []pb.ValidatorRole{pb.ValidatorRole_ATTESTER, pb.ValidatorRole_PROPOSER}
go func() {
ticker <- slot

View File

@@ -101,6 +101,7 @@ func (v *ValidatorService) Start() {
validatorClient: pb.NewValidatorServiceClient(v.conn),
attesterClient: pb.NewAttesterServiceClient(v.conn),
proposerClient: pb.NewProposerServiceClient(v.conn),
aggregatorClient: pb.NewAggregatorServiceClient(v.conn),
node: ethpb.NewNodeClient(v.conn),
keys: v.keys,
pubkeys: pubKeys,

View File

@@ -3,6 +3,7 @@ package client
import (
"context"
"encoding/binary"
"fmt"
"io"
"time"
@@ -13,6 +14,7 @@ import (
pb "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1"
ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
"github.com/prysmaticlabs/prysm/shared/bytesutil"
"github.com/prysmaticlabs/prysm/shared/hashutil"
"github.com/prysmaticlabs/prysm/shared/keystore"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/prysmaticlabs/prysm/shared/slotutil"
@@ -27,6 +29,7 @@ type validator struct {
proposerClient pb.ProposerServiceClient
validatorClient pb.ValidatorServiceClient
attesterClient pb.AttesterServiceClient
aggregatorClient pb.AggregatorServiceClient
node ethpb.NodeClient
keys map[[48]byte]*keystore.Key
pubkeys [][]byte
@@ -259,25 +262,54 @@ func (v *validator) UpdateAssignments(ctx context.Context, slot uint64) error {
// RolesAt slot returns the validator roles at the given slot. Returns nil if the
// validator is known to not have a roles at the at slot. Returns UNKNOWN if the
// validator assignments are unknown. Otherwise returns a valid ValidatorRole map.
func (v *validator) RolesAt(slot uint64) map[[48]byte]pb.ValidatorRole {
rolesAt := make(map[[48]byte]pb.ValidatorRole)
func (v *validator) RolesAt(ctx context.Context, slot uint64) (map[[48]byte][]pb.ValidatorRole, error) {
rolesAt := make(map[[48]byte][]pb.ValidatorRole)
for _, assignment := range v.assignments.ValidatorAssignment {
var role pb.ValidatorRole
switch {
case assignment == nil:
role = pb.ValidatorRole_UNKNOWN
case assignment.ProposerSlot == slot && assignment.AttesterSlot == slot:
role = pb.ValidatorRole_BOTH
case assignment.AttesterSlot == slot:
role = pb.ValidatorRole_ATTESTER
case assignment.ProposerSlot == slot:
role = pb.ValidatorRole_PROPOSER
default:
role = pb.ValidatorRole_UNKNOWN
var roles []pb.ValidatorRole
if assignment == nil {
continue
}
if assignment.ProposerSlot == slot {
roles = append(roles, pb.ValidatorRole_PROPOSER)
}
if assignment.AttesterSlot == slot {
roles = append(roles, pb.ValidatorRole_ATTESTER)
aggregator, err := v.isAggregator(ctx, assignment.Committee, slot, bytesutil.ToBytes48(assignment.PublicKey))
if err != nil {
return nil, errors.Wrap(err, "could not check if a validator is an aggregator")
}
if aggregator {
roles = append(roles, pb.ValidatorRole_AGGREGATOR)
}
}
if len(roles) == 0 {
roles = append(roles, pb.ValidatorRole_UNKNOWN)
}
var pubKey [48]byte
copy(pubKey[:], assignment.PublicKey)
rolesAt[pubKey] = role
rolesAt[pubKey] = roles
}
return rolesAt
return rolesAt, nil
}
// isAggregator checks if a validator is an aggregator of a given slot, it uses the selection algorithm outlined in:
// https://github.com/ethereum/eth2.0-specs/blob/v0.9.0/specs/validator/0_beacon-chain-validator.md#aggregation-selection
func (v *validator) isAggregator(ctx context.Context, committee []uint64, slot uint64, pubKey [48]byte) (bool, error) {
modulo := uint64(1)
if len(committee)/int(params.BeaconConfig().TargetAggregatorsPerCommittee) > 1 {
modulo = uint64(len(committee)) / params.BeaconConfig().TargetAggregatorsPerCommittee
}
slotSig, err := v.signSlot(ctx, pubKey, slot)
if err != nil {
return false, err
}
b := hashutil.Hash(slotSig)
return binary.LittleEndian.Uint64(b[:8])%modulo == 0, nil
}

View File

@@ -0,0 +1,72 @@
package client
import (
"context"
"fmt"
"github.com/prysmaticlabs/go-ssz"
"github.com/prysmaticlabs/prysm/beacon-chain/core/helpers"
pb "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1"
"github.com/prysmaticlabs/prysm/shared/bytesutil"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/sirupsen/logrus"
"go.opencensus.io/trace"
)
// SubmitAggregateAndProof submits the validator's signed slot signature to the beacon node
// via gRPC. Beacon node will verify the slot signature and determine if the validator is also
// an aggregator. If yes, then beacon node will broadcast aggregated signature and
// proof on the validator's behave.
func (v *validator) SubmitAggregateAndProof(ctx context.Context, slot uint64, pubKey [48]byte) {
ctx, span := trace.StartSpan(ctx, "validator.SubmitAggregateAndProof")
defer span.End()
span.AddAttributes(trace.StringAttribute("validator", fmt.Sprintf("%#x", pubKey)))
assignment, err := v.assignment(pubKey)
if err != nil {
log.Errorf("Could not fetch validator assignment: %v", err)
return
}
slotSig, err := v.signSlot(ctx, pubKey, slot)
if err != nil {
log.Errorf("Could not sign slot: %v", err)
return
}
res, err := v.aggregatorClient.SubmitAggregateAndProof(ctx, &pb.AggregationRequest{
Slot: slot,
CommitteeIndex: assignment.CommitteeIndex,
PublicKey: pubKey[:],
SlotSignature: slotSig,
})
if err != nil {
log.Errorf("Could not submit slot signature to beacon node: %v", err)
return
}
log.WithFields(logrus.Fields{
"slot": slot,
"committeeIndex": assignment.CommitteeIndex,
"pubKey": fmt.Sprintf("%#x", bytesutil.Trunc(pubKey[:])),
"aggregationRoot": fmt.Sprintf("%#x", bytesutil.Trunc(res.Root[:])),
}).Debug("Assigned and submitted aggregation and proof request")
}
// This implements selection logic outlined in:
// https://github.com/ethereum/eth2.0-specs/blob/v0.9.0/specs/validator/0_beacon-chain-validator.md#aggregation-selection
func (v *validator) signSlot(ctx context.Context, pubKey [48]byte, slot uint64) ([]byte, error) {
domain, err := v.validatorClient.DomainData(ctx, &pb.DomainRequest{Epoch: helpers.SlotToEpoch(slot), Domain: params.BeaconConfig().DomainBeaconAttester})
if err != nil {
return nil, err
}
slotRoot, err := ssz.HashTreeRoot(slot)
if err != nil {
return nil, err
}
sig := v.keys[pubKey].SecretKey.Sign(slotRoot[:], domain.SignatureDomain)
return sig.Marshal(), nil
}

View File

@@ -0,0 +1,46 @@
package client
import (
"context"
"testing"
"github.com/golang/mock/gomock"
pb "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1"
"github.com/prysmaticlabs/prysm/shared/testutil"
logTest "github.com/sirupsen/logrus/hooks/test"
)
func TestSubmitAggregateAndProof_AssignmentRequestFailure(t *testing.T) {
hook := logTest.NewGlobal()
validator, _, finish := setup(t)
validator.assignments = &pb.AssignmentResponse{ValidatorAssignment: []*pb.AssignmentResponse_ValidatorAssignment{}}
defer finish()
validator.SubmitAggregateAndProof(context.Background(), 0, validatorPubKey)
testutil.AssertLogsContain(t, hook, "Could not fetch validator assignment")
}
func TestSubmitAggregateAndProof_Ok(t *testing.T) {
hook := logTest.NewGlobal()
validator, m, finish := setup(t)
defer finish()
validator.assignments = &pb.AssignmentResponse{ValidatorAssignment: []*pb.AssignmentResponse_ValidatorAssignment{
{
PublicKey: validatorKey.PublicKey.Marshal(),
},
}}
m.validatorClient.EXPECT().DomainData(
gomock.Any(), // ctx
gomock.Any(), // epoch
).Return(&pb.DomainResponse{}, nil /*err*/)
m.aggregatorClient.EXPECT().SubmitAggregateAndProof(
gomock.Any(), // ctx
gomock.AssignableToTypeOf(&pb.AggregationRequest{}),
).Return(&pb.AggregationResponse{}, nil)
validator.SubmitAggregateAndProof(context.Background(), 0, validatorPubKey)
testutil.AssertLogsContain(t, hook, "Assigned and submitted aggregation and proof request")
}

View File

@@ -14,23 +14,26 @@ import (
)
type mocks struct {
proposerClient *internal.MockProposerServiceClient
validatorClient *internal.MockValidatorServiceClient
attesterClient *internal.MockAttesterServiceClient
proposerClient *internal.MockProposerServiceClient
validatorClient *internal.MockValidatorServiceClient
attesterClient *internal.MockAttesterServiceClient
aggregatorClient *internal.MockAggregatorServiceClient
}
func setup(t *testing.T) (*validator, *mocks, func()) {
ctrl := gomock.NewController(t)
m := &mocks{
proposerClient: internal.NewMockProposerServiceClient(ctrl),
validatorClient: internal.NewMockValidatorServiceClient(ctrl),
attesterClient: internal.NewMockAttesterServiceClient(ctrl),
proposerClient: internal.NewMockProposerServiceClient(ctrl),
validatorClient: internal.NewMockValidatorServiceClient(ctrl),
attesterClient: internal.NewMockAttesterServiceClient(ctrl),
aggregatorClient: internal.NewMockAggregatorServiceClient(ctrl),
}
validator := &validator{
proposerClient: m.proposerClient,
attesterClient: m.attesterClient,
validatorClient: m.validatorClient,
keys: keyMap,
proposerClient: m.proposerClient,
attesterClient: m.attesterClient,
validatorClient: m.validatorClient,
aggregatorClient: m.aggregatorClient,
keys: keyMap,
}
return validator, m, ctrl.Finish

View File

@@ -2,6 +2,7 @@ package client
import (
"context"
"crypto/rand"
"errors"
"io/ioutil"
"strings"
@@ -12,6 +13,7 @@ import (
"github.com/golang/mock/gomock"
pb "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1"
ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
"github.com/prysmaticlabs/prysm/shared/bls"
"github.com/prysmaticlabs/prysm/shared/keystore"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/prysmaticlabs/prysm/shared/testutil"
@@ -550,45 +552,70 @@ func TestUpdateAssignments_OK(t *testing.T) {
}
func TestRolesAt_OK(t *testing.T) {
v, m, finish := setup(t)
defer finish()
v := validator{
assignments: &pb.AssignmentResponse{
ValidatorAssignment: []*pb.AssignmentResponse_ValidatorAssignment{
{
CommitteeIndex: 1,
AttesterSlot: 1,
PublicKey: []byte{0x01},
},
{
CommitteeIndex: 2,
ProposerSlot: 1,
PublicKey: []byte{0x02},
},
{
CommitteeIndex: 1,
AttesterSlot: 2,
PublicKey: []byte{0x03},
},
{
CommitteeIndex: 2,
AttesterSlot: 1,
ProposerSlot: 1,
PublicKey: []byte{0x04},
},
v.assignments = &pb.AssignmentResponse{
ValidatorAssignment: []*pb.AssignmentResponse_ValidatorAssignment{
{
CommitteeIndex: 1,
AttesterSlot: 1,
PublicKey: []byte{0x01},
},
{
CommitteeIndex: 2,
ProposerSlot: 1,
PublicKey: []byte{0x02},
},
{
CommitteeIndex: 1,
AttesterSlot: 2,
PublicKey: []byte{0x03},
},
{
CommitteeIndex: 2,
AttesterSlot: 1,
ProposerSlot: 1,
PublicKey: []byte{0x04},
},
},
}
roleMap := v.RolesAt(1)
if roleMap[[48]byte{0x01}] != pb.ValidatorRole_ATTESTER {
priv, _ := bls.RandKey(rand.Reader)
keyStore, _ := keystore.NewKeyFromBLS(priv)
v.keys[[48]byte{0x01}] = keyStore
v.keys[[48]byte{0x04}] = keyStore
m.validatorClient.EXPECT().DomainData(
gomock.Any(), // ctx
gomock.Any(), // epoch
).Return(&pb.DomainResponse{}, nil /*err*/)
m.validatorClient.EXPECT().DomainData(
gomock.Any(), // ctx
gomock.Any(), // epoch
).Return(&pb.DomainResponse{}, nil /*err*/)
roleMap, err := v.RolesAt(context.Background(), 1)
if err != nil {
t.Fatal(err)
}
if roleMap[[48]byte{0x01}][0] != pb.ValidatorRole_ATTESTER {
t.Errorf("Unexpected validator role. want: ValidatorRole_PROPOSER")
}
if roleMap[[48]byte{0x02}] != pb.ValidatorRole_PROPOSER {
if roleMap[[48]byte{0x02}][0] != pb.ValidatorRole_PROPOSER {
t.Errorf("Unexpected validator role. want: ValidatorRole_ATTESTER")
}
if roleMap[[48]byte{0x03}] != pb.ValidatorRole_UNKNOWN {
if roleMap[[48]byte{0x03}][0] != pb.ValidatorRole_UNKNOWN {
t.Errorf("Unexpected validator role. want: UNKNOWN")
}
if roleMap[[48]byte{0x04}] != pb.ValidatorRole_BOTH {
t.Errorf("Unexpected validator role. want: BOTH")
if roleMap[[48]byte{0x04}][0] != pb.ValidatorRole_PROPOSER {
t.Errorf("Unexpected validator role. want: ValidatorRole_PROPOSER")
}
if roleMap[[48]byte{0x04}][1] != pb.ValidatorRole_ATTESTER {
t.Errorf("Unexpected validator role. want: ValidatorRole_ATTESTER")
}
if roleMap[[48]byte{0x04}][2] != pb.ValidatorRole_AGGREGATOR {
t.Errorf("Unexpected validator role. want: ValidatorRole_AGGREGATOR")
}
}

View File

@@ -4,6 +4,7 @@ go_library(
name = "go_default_library",
testonly = True,
srcs = [
"aggregator_service_mock.go",
"attester_service_mock.go",
"node_mock.go",
"proposer_service_mock.go",

View File

@@ -0,0 +1,56 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1 (interfaces: AggregatorServiceClient)
// Package internal is a generated GoMock package.
package internal
import (
context "context"
gomock "github.com/golang/mock/gomock"
v1 "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1"
grpc "google.golang.org/grpc"
reflect "reflect"
)
// MockAggregatorServiceClient is a mock of AggregatorServiceClient interface
type MockAggregatorServiceClient struct {
ctrl *gomock.Controller
recorder *MockAggregatorServiceClientMockRecorder
}
// MockAggregatorServiceClientMockRecorder is the mock recorder for MockAggregatorServiceClient
type MockAggregatorServiceClientMockRecorder struct {
mock *MockAggregatorServiceClient
}
// NewMockAggregatorServiceClient creates a new mock instance
func NewMockAggregatorServiceClient(ctrl *gomock.Controller) *MockAggregatorServiceClient {
mock := &MockAggregatorServiceClient{ctrl: ctrl}
mock.recorder = &MockAggregatorServiceClientMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use
func (m *MockAggregatorServiceClient) EXPECT() *MockAggregatorServiceClientMockRecorder {
return m.recorder
}
// SubmitAggregateAndProof mocks base method
func (m *MockAggregatorServiceClient) SubmitAggregateAndProof(arg0 context.Context, arg1 *v1.AggregationRequest, arg2 ...grpc.CallOption) (*v1.AggregationResponse, error) {
m.ctrl.T.Helper()
varargs := []interface{}{arg0, arg1}
for _, a := range arg2 {
varargs = append(varargs, a)
}
ret := m.ctrl.Call(m, "SubmitAggregateAndProof", varargs...)
ret0, _ := ret[0].(*v1.AggregationResponse)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// SubmitAggregateAndProof indicates an expected call of SubmitAggregateAndProof
func (mr *MockAggregatorServiceClientMockRecorder) SubmitAggregateAndProof(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0, arg1}, arg2...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubmitAggregateAndProof", reflect.TypeOf((*MockAggregatorServiceClient)(nil).SubmitAggregateAndProof), varargs...)
}

View File

@@ -6,12 +6,11 @@ package internal
import (
context "context"
reflect "reflect"
gomock "github.com/golang/mock/gomock"
v1 "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1"
v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
grpc "google.golang.org/grpc"
reflect "reflect"
)
// MockAttesterServiceClient is a mock of AttesterServiceClient interface

View File

@@ -6,12 +6,11 @@ package internal
import (
context "context"
reflect "reflect"
gomock "github.com/golang/mock/gomock"
v1 "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1"
v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
grpc "google.golang.org/grpc"
reflect "reflect"
)
// MockProposerServiceClient is a mock of ProposerServiceClient interface

View File

@@ -6,14 +6,13 @@ package internal
import (
context "context"
reflect "reflect"
types "github.com/gogo/protobuf/types"
gomock "github.com/golang/mock/gomock"
v1 "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1"
v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
grpc "google.golang.org/grpc"
metadata "google.golang.org/grpc/metadata"
reflect "reflect"
)
// MockValidatorServiceClient is a mock of ValidatorServiceClient interface