From 5d65ace970c53f593181d702f5b73c27028d1143 Mon Sep 17 00:00:00 2001 From: Nishant Das Date: Fri, 2 Jul 2021 12:11:09 +0800 Subject: [PATCH] Implement Doppelganger Check (#9120) * checkpoint changes * Update beacon-chain/rpc/validator/status.go Co-authored-by: Potuz * Update beacon-chain/rpc/validator/status.go Co-authored-by: Potuz * add in client side tests * add ordering * add all new test cases * gate feature * handle edge case * add one more test case * fatal error * zahoor's review * Update validator/client/validator.go Co-authored-by: Preston Van Loon * Update validator/client/validator.go Co-authored-by: Preston Van Loon * doppelganger not doppleganger * preston's review * add in comment * change comment * Fix e2e to only run new flags on the current version * Fix bug where zero byte public keys were always sent in the request when attestation history existed. Still some tests to fix due to another bug in attester protection AttestationHistoryForPubKey. * go mod tidy, gazelle * Increase test size * fix timeout, change size back to small Co-authored-by: Potuz Co-authored-by: Preston Van Loon --- beacon-chain/rpc/validator/server.go | 2 +- beacon-chain/rpc/validator/status.go | 99 +++ beacon-chain/rpc/validator/status_test.go | 353 +++++++- deps.bzl | 26 +- endtoend/components/validator.go | 5 +- go.mod | 2 +- go.sum | 3 +- proto/eth/v1alpha1/validator.pb.go | 854 ++++++++++++++------ proto/eth/v1alpha1/validator.pb.gw.go | 83 ++ proto/eth/v1alpha1/validator.proto | 37 + shared/featureconfig/config.go | 6 +- shared/featureconfig/flags.go | 11 +- shared/mock/beacon_chain_service_mock.go | 16 +- shared/mock/beacon_service_mock.go | 120 +-- shared/mock/beacon_validator_client_mock.go | 96 ++- shared/mock/beacon_validator_server_mock.go | 91 ++- shared/mock/keymanager_mock.go | 10 +- shared/mock/node_service_mock.go | 30 +- validator/client/BUILD.bazel | 1 + validator/client/attest_test.go | 7 +- validator/client/iface/validator.go | 1 + validator/client/propose_test.go | 3 +- validator/client/runner.go | 8 + validator/client/testutil/mock_validator.go | 5 + validator/client/validator.go | 92 +++ validator/client/validator_test.go | 275 ++++++- 26 files changed, 1773 insertions(+), 463 deletions(-) diff --git a/beacon-chain/rpc/validator/server.go b/beacon-chain/rpc/validator/server.go index 98b820a9340b..942fb49823c3 100644 --- a/beacon-chain/rpc/validator/server.go +++ b/beacon-chain/rpc/validator/server.go @@ -62,7 +62,7 @@ type Server struct { Eth1BlockFetcher powchain.POWBlockFetcher PendingDepositsFetcher depositcache.PendingDepositsFetcher OperationNotifier opfeed.Notifier - StateGen *stategen.State + StateGen stategen.StateManager } // WaitForActivation checks if a validator public key exists in the active validator registry of the current diff --git a/beacon-chain/rpc/validator/status.go b/beacon-chain/rpc/validator/status.go index fac0dbe5ef16..da6d6f298f70 100644 --- a/beacon-chain/rpc/validator/status.go +++ b/beacon-chain/rpc/validator/status.go @@ -88,6 +88,105 @@ func (vs *Server) MultipleValidatorStatus( }, nil } +// CheckDoppelGanger checks if the provided keys are currently active in the network. +func (vs *Server) CheckDoppelGanger(ctx context.Context, req *ethpb.DoppelGangerRequest) (*ethpb.DoppelGangerResponse, error) { + if vs.SyncChecker.Syncing() { + return nil, status.Errorf(codes.Unavailable, "Syncing to latest head, not ready to respond") + } + if req == nil || req.ValidatorRequests == nil || len(req.ValidatorRequests) == 0 { + return ðpb.DoppelGangerResponse{ + Responses: []*ethpb.DoppelGangerResponse_ValidatorResponse{}, + }, nil + } + headState, err := vs.HeadFetcher.HeadState(ctx) + if err != nil { + return nil, status.Error(codes.Internal, "Could not get head state") + } + // We walk back from the current head state to the state at the beginning of the previous 2 epochs. + // Where S_i , i := 0,1,2. i = 0 would signify the current head state in this epoch. + currEpoch := helpers.SlotToEpoch(headState.Slot()) + previousEpoch, err := currEpoch.SafeSub(1) + if err != nil { + previousEpoch = currEpoch + } + olderEpoch, err := previousEpoch.SafeSub(1) + if err != nil { + olderEpoch = previousEpoch + } + prevState, err := vs.StateGen.StateBySlot(ctx, params.BeaconConfig().SlotsPerEpoch.Mul(uint64(previousEpoch))) + if err != nil { + return nil, status.Error(codes.Internal, "Could not get previous state") + } + olderState, err := vs.StateGen.StateBySlot(ctx, params.BeaconConfig().SlotsPerEpoch.Mul(uint64(olderEpoch))) + if err != nil { + return nil, status.Error(codes.Internal, "Could not get older state") + } + resp := ðpb.DoppelGangerResponse{ + Responses: []*ethpb.DoppelGangerResponse_ValidatorResponse{}, + } + for _, v := range req.ValidatorRequests { + // If the validator's last recorded epoch was + // less than or equal to 2 epochs ago, this method will not + // be able to catch duplicates. This is due to how attestation + // inclusion works, where an attestation for the current epoch + // is able to included in the current or next epoch. Depending + // on which epoch it is included the balance change will be + // reflected in the following epoch. + if v.Epoch+2 >= currEpoch { + resp.Responses = append(resp.Responses, + ðpb.DoppelGangerResponse_ValidatorResponse{ + PublicKey: v.PublicKey, + DuplicateExists: false, + }) + continue + } + valIndex, ok := olderState.ValidatorIndexByPubkey(bytesutil.ToBytes48(v.PublicKey)) + if !ok { + // Ignore if validator pubkey doesn't exist. + continue + } + baseBal, err := olderState.BalanceAtIndex(valIndex) + if err != nil { + return nil, status.Error(codes.Internal, "Could not get validator's balance") + } + nextBal, err := prevState.BalanceAtIndex(valIndex) + if err != nil { + return nil, status.Error(codes.Internal, "Could not get validator's balance") + } + // If the next epoch's balance is higher, we mark it as an existing + // duplicate. + if nextBal > baseBal { + resp.Responses = append(resp.Responses, + ðpb.DoppelGangerResponse_ValidatorResponse{ + PublicKey: v.PublicKey, + DuplicateExists: true, + }) + continue + } + currBal, err := headState.BalanceAtIndex(valIndex) + if err != nil { + return nil, status.Error(codes.Internal, "Could not get validator's balance") + } + // If the current epoch's balance is higher, we mark it as an existing + // duplicate. + if currBal > nextBal { + resp.Responses = append(resp.Responses, + ðpb.DoppelGangerResponse_ValidatorResponse{ + PublicKey: v.PublicKey, + DuplicateExists: true, + }) + continue + } + // Mark the public key as valid. + resp.Responses = append(resp.Responses, + ðpb.DoppelGangerResponse_ValidatorResponse{ + PublicKey: v.PublicKey, + DuplicateExists: false, + }) + } + return resp, nil +} + // activationStatus returns the validator status response for the set of validators // requested by their pub keys. func (vs *Server) activationStatus( diff --git a/beacon-chain/rpc/validator/status_test.go b/beacon-chain/rpc/validator/status_test.go index fdb2a7516ad0..6972726987c4 100644 --- a/beacon-chain/rpc/validator/status_test.go +++ b/beacon-chain/rpc/validator/status_test.go @@ -2,6 +2,7 @@ package validator import ( "context" + "reflect" "testing" "time" @@ -11,10 +12,13 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" dbutil "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" mockPOW "github.com/prysmaticlabs/prysm/beacon-chain/powchain/testing" - "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" + iface "github.com/prysmaticlabs/prysm/beacon-chain/state/interface" + "github.com/prysmaticlabs/prysm/beacon-chain/state/stategen" + v1 "github.com/prysmaticlabs/prysm/beacon-chain/state/v1" mockSync "github.com/prysmaticlabs/prysm/beacon-chain/sync/initial-sync/testing" pbp2p "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/bytesutil" "github.com/prysmaticlabs/prysm/shared/interfaces" "github.com/prysmaticlabs/prysm/shared/params" @@ -966,3 +970,350 @@ func Test_DepositStatus(t *testing.T) { assert.Equal(t, depositStatus(params.BeaconConfig().MinDepositAmount), ethpb.ValidatorStatus_PARTIALLY_DEPOSITED) assert.Equal(t, depositStatus(params.BeaconConfig().MaxEffectiveBalance), ethpb.ValidatorStatus_DEPOSITED) } + +func TestServer_CheckDoppelGanger(t *testing.T) { + tests := []struct { + name string + wantErr bool + svSetup func(t *testing.T) (*Server, *ethpb.DoppelGangerRequest, *ethpb.DoppelGangerResponse) + }{ + { + name: "normal doppelganger request", + wantErr: false, + svSetup: func(t *testing.T) (*Server, *ethpb.DoppelGangerRequest, *ethpb.DoppelGangerResponse) { + db := dbutil.SetupDB(t) + mockGen := stategen.NewMockService() + hs, ps, os, keys := createStateSetup(t, 4, mockGen) + // Previous Epoch State + for i := 0; i < 3; i++ { + bal, err := ps.BalanceAtIndex(types.ValidatorIndex(i)) + assert.NoError(t, err) + // Add 100 gwei, to mock an inactivity leak + assert.NoError(t, ps.UpdateBalancesAtIndex(types.ValidatorIndex(i), bal+100)) + } + // Older Epoch State + for i := 0; i < 3; i++ { + bal, err := os.BalanceAtIndex(types.ValidatorIndex(i)) + assert.NoError(t, err) + // Add 200 gwei, to mock an inactivity leak + assert.NoError(t, os.UpdateBalancesAtIndex(types.ValidatorIndex(i), bal+200)) + } + vs := &Server{ + BeaconDB: db, + StateGen: mockGen, + HeadFetcher: &mockChain.ChainService{ + State: hs, + }, + SyncChecker: &mockSync.Sync{IsSyncing: false}, + } + request := ðpb.DoppelGangerRequest{ + ValidatorRequests: make([]*ethpb.DoppelGangerRequest_ValidatorRequest, 0), + } + response := ðpb.DoppelGangerResponse{Responses: make([]*ethpb.DoppelGangerResponse_ValidatorResponse, 0)} + for i := 0; i < 3; i++ { + request.ValidatorRequests = append(request.ValidatorRequests, ðpb.DoppelGangerRequest_ValidatorRequest{ + PublicKey: keys[i].PublicKey().Marshal(), + Epoch: 1, + SignedRoot: []byte{'A'}, + }) + response.Responses = append(response.Responses, ðpb.DoppelGangerResponse_ValidatorResponse{ + PublicKey: keys[i].PublicKey().Marshal(), + DuplicateExists: false, + }) + } + return vs, request, response + }, + }, + { + name: "doppelganger exists current epoch", + wantErr: false, + svSetup: func(t *testing.T) (*Server, *ethpb.DoppelGangerRequest, *ethpb.DoppelGangerResponse) { + db := dbutil.SetupDB(t) + mockGen := stategen.NewMockService() + + hs, ps, os, keys := createStateSetup(t, 4, mockGen) + // Previous Epoch State + for i := 0; i < 2; i++ { + bal, err := ps.BalanceAtIndex(types.ValidatorIndex(i)) + assert.NoError(t, err) + // Add 100 gwei, to mock an inactivity leak + assert.NoError(t, ps.UpdateBalancesAtIndex(types.ValidatorIndex(i), bal+100)) + } + bal, err := ps.BalanceAtIndex(types.ValidatorIndex(2)) + assert.NoError(t, err) + // Sub 100 gwei, to mock an active validator. + assert.NoError(t, ps.UpdateBalancesAtIndex(types.ValidatorIndex(2), bal-100)) + + // Older Epoch State + for i := 0; i < 2; i++ { + bal, err := os.BalanceAtIndex(types.ValidatorIndex(i)) + assert.NoError(t, err) + // Add 200 gwei, to mock an inactivity leak + assert.NoError(t, os.UpdateBalancesAtIndex(types.ValidatorIndex(i), bal+200)) + } + bal, err = os.BalanceAtIndex(types.ValidatorIndex(2)) + assert.NoError(t, err) + // Sub 100 gwei, to mock an active validator. + assert.NoError(t, os.UpdateBalancesAtIndex(types.ValidatorIndex(2), bal-100)) + + vs := &Server{ + BeaconDB: db, + StateGen: mockGen, + HeadFetcher: &mockChain.ChainService{ + State: hs, + }, + SyncChecker: &mockSync.Sync{IsSyncing: false}, + } + request := ðpb.DoppelGangerRequest{ + ValidatorRequests: make([]*ethpb.DoppelGangerRequest_ValidatorRequest, 0), + } + response := ðpb.DoppelGangerResponse{Responses: make([]*ethpb.DoppelGangerResponse_ValidatorResponse, 0)} + for i := 0; i < 2; i++ { + request.ValidatorRequests = append(request.ValidatorRequests, ðpb.DoppelGangerRequest_ValidatorRequest{ + PublicKey: keys[i].PublicKey().Marshal(), + Epoch: 1, + SignedRoot: []byte{'A'}, + }) + response.Responses = append(response.Responses, ðpb.DoppelGangerResponse_ValidatorResponse{ + PublicKey: keys[i].PublicKey().Marshal(), + DuplicateExists: false, + }) + } + + // Add in for duplicate validator + request.ValidatorRequests = append(request.ValidatorRequests, ðpb.DoppelGangerRequest_ValidatorRequest{ + PublicKey: keys[2].PublicKey().Marshal(), + Epoch: 1, + SignedRoot: []byte{'A'}, + }) + response.Responses = append(response.Responses, ðpb.DoppelGangerResponse_ValidatorResponse{ + PublicKey: keys[2].PublicKey().Marshal(), + DuplicateExists: true, + }) + return vs, request, response + }, + }, + { + name: "doppelganger exists previous epoch", + wantErr: false, + svSetup: func(t *testing.T) (*Server, *ethpb.DoppelGangerRequest, *ethpb.DoppelGangerResponse) { + db := dbutil.SetupDB(t) + mockGen := stategen.NewMockService() + + hs, ps, os, keys := createStateSetup(t, 4, mockGen) + // Previous Epoch State + for i := 0; i < 2; i++ { + bal, err := ps.BalanceAtIndex(types.ValidatorIndex(i)) + assert.NoError(t, err) + // Add 100 gwei, to mock an inactivity leak + assert.NoError(t, ps.UpdateBalancesAtIndex(types.ValidatorIndex(i), bal+100)) + } + bal, err := ps.BalanceAtIndex(types.ValidatorIndex(2)) + assert.NoError(t, err) + // Sub 100 gwei, to mock an active validator. + assert.NoError(t, ps.UpdateBalancesAtIndex(types.ValidatorIndex(2), bal-100)) + + // Older Epoch State + for i := 0; i < 2; i++ { + bal, err := os.BalanceAtIndex(types.ValidatorIndex(i)) + assert.NoError(t, err) + // Add 200 gwei, to mock an inactivity leak + assert.NoError(t, os.UpdateBalancesAtIndex(types.ValidatorIndex(i), bal+200)) + } + bal, err = os.BalanceAtIndex(types.ValidatorIndex(2)) + assert.NoError(t, err) + // Sub 200 gwei, to mock an active validator. + assert.NoError(t, os.UpdateBalancesAtIndex(types.ValidatorIndex(2), bal-200)) + + vs := &Server{ + BeaconDB: db, + StateGen: mockGen, + HeadFetcher: &mockChain.ChainService{ + State: hs, + }, + SyncChecker: &mockSync.Sync{IsSyncing: false}, + } + request := ðpb.DoppelGangerRequest{ + ValidatorRequests: make([]*ethpb.DoppelGangerRequest_ValidatorRequest, 0), + } + response := ðpb.DoppelGangerResponse{Responses: make([]*ethpb.DoppelGangerResponse_ValidatorResponse, 0)} + for i := 0; i < 2; i++ { + request.ValidatorRequests = append(request.ValidatorRequests, ðpb.DoppelGangerRequest_ValidatorRequest{ + PublicKey: keys[i].PublicKey().Marshal(), + Epoch: 1, + SignedRoot: []byte{'A'}, + }) + response.Responses = append(response.Responses, ðpb.DoppelGangerResponse_ValidatorResponse{ + PublicKey: keys[i].PublicKey().Marshal(), + DuplicateExists: false, + }) + } + + // Add in for duplicate validator + request.ValidatorRequests = append(request.ValidatorRequests, ðpb.DoppelGangerRequest_ValidatorRequest{ + PublicKey: keys[2].PublicKey().Marshal(), + Epoch: 1, + SignedRoot: []byte{'A'}, + }) + response.Responses = append(response.Responses, ðpb.DoppelGangerResponse_ValidatorResponse{ + PublicKey: keys[2].PublicKey().Marshal(), + DuplicateExists: true, + }) + return vs, request, response + }, + }, + { + name: "multiple doppelganger exists", + wantErr: false, + svSetup: func(t *testing.T) (*Server, *ethpb.DoppelGangerRequest, *ethpb.DoppelGangerResponse) { + db := dbutil.SetupDB(t) + mockGen := stategen.NewMockService() + + hs, ps, os, keys := createStateSetup(t, 4, mockGen) + // Previous Epoch State + for i := 10; i < 15; i++ { + bal, err := ps.BalanceAtIndex(types.ValidatorIndex(i)) + assert.NoError(t, err) + // Add 100 gwei, to mock an inactivity leak + assert.NoError(t, ps.UpdateBalancesAtIndex(types.ValidatorIndex(i), bal-100)) + } + + // Older Epoch State + for i := 10; i < 15; i++ { + bal, err := os.BalanceAtIndex(types.ValidatorIndex(i)) + assert.NoError(t, err) + // Add 200 gwei, to mock an inactivity leak + assert.NoError(t, os.UpdateBalancesAtIndex(types.ValidatorIndex(i), bal-200)) + } + + vs := &Server{ + BeaconDB: db, + StateGen: mockGen, + HeadFetcher: &mockChain.ChainService{ + State: hs, + }, + SyncChecker: &mockSync.Sync{IsSyncing: false}, + } + request := ðpb.DoppelGangerRequest{ + ValidatorRequests: make([]*ethpb.DoppelGangerRequest_ValidatorRequest, 0), + } + response := ðpb.DoppelGangerResponse{Responses: make([]*ethpb.DoppelGangerResponse_ValidatorResponse, 0)} + for i := 0; i < 10; i++ { + request.ValidatorRequests = append(request.ValidatorRequests, ðpb.DoppelGangerRequest_ValidatorRequest{ + PublicKey: keys[i].PublicKey().Marshal(), + Epoch: 1, + SignedRoot: []byte{'A'}, + }) + response.Responses = append(response.Responses, ðpb.DoppelGangerResponse_ValidatorResponse{ + PublicKey: keys[i].PublicKey().Marshal(), + DuplicateExists: false, + }) + } + for i := 10; i < 15; i++ { + // Add in for duplicate validator + request.ValidatorRequests = append(request.ValidatorRequests, ðpb.DoppelGangerRequest_ValidatorRequest{ + PublicKey: keys[i].PublicKey().Marshal(), + Epoch: 1, + SignedRoot: []byte{'A'}, + }) + response.Responses = append(response.Responses, ðpb.DoppelGangerResponse_ValidatorResponse{ + PublicKey: keys[i].PublicKey().Marshal(), + DuplicateExists: true, + }) + } + + return vs, request, response + }, + }, + { + name: "attesters are too recent", + wantErr: false, + svSetup: func(t *testing.T) (*Server, *ethpb.DoppelGangerRequest, *ethpb.DoppelGangerResponse) { + db := dbutil.SetupDB(t) + mockGen := stategen.NewMockService() + + hs, ps, os, keys := createStateSetup(t, 4, mockGen) + // Previous Epoch State + for i := 10; i < 15; i++ { + bal, err := ps.BalanceAtIndex(types.ValidatorIndex(i)) + assert.NoError(t, err) + // Add 100 gwei, to mock an active validator + assert.NoError(t, ps.UpdateBalancesAtIndex(types.ValidatorIndex(i), bal-100)) + } + + // Older Epoch State + for i := 10; i < 15; i++ { + bal, err := os.BalanceAtIndex(types.ValidatorIndex(i)) + assert.NoError(t, err) + // Add 200 gwei, to mock an active validator + assert.NoError(t, os.UpdateBalancesAtIndex(types.ValidatorIndex(i), bal-200)) + } + + vs := &Server{ + BeaconDB: db, + StateGen: mockGen, + HeadFetcher: &mockChain.ChainService{ + State: hs, + }, + SyncChecker: &mockSync.Sync{IsSyncing: false}, + } + request := ðpb.DoppelGangerRequest{ + ValidatorRequests: make([]*ethpb.DoppelGangerRequest_ValidatorRequest, 0), + } + response := ðpb.DoppelGangerResponse{Responses: make([]*ethpb.DoppelGangerResponse_ValidatorResponse, 0)} + for i := 0; i < 15; i++ { + request.ValidatorRequests = append(request.ValidatorRequests, ðpb.DoppelGangerRequest_ValidatorRequest{ + PublicKey: keys[i].PublicKey().Marshal(), + Epoch: 2, + SignedRoot: []byte{'A'}, + }) + response.Responses = append(response.Responses, ðpb.DoppelGangerResponse_ValidatorResponse{ + PublicKey: keys[i].PublicKey().Marshal(), + DuplicateExists: false, + }) + } + + return vs, request, response + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + vs, req, resp := tt.svSetup(t) + got, err := vs.CheckDoppelGanger(context.Background(), req) + if (err != nil) != tt.wantErr { + t.Errorf("CheckDoppelGanger() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, resp) { + t.Errorf("CheckDoppelGanger() got = %v, want %v", got.String(), resp.String()) + } + }) + } +} + +func createStateSetup(t *testing.T, head types.Epoch, mockgen *stategen.MockStateManager) (iface.BeaconState, + iface.BeaconState, iface.BeaconState, []bls.SecretKey) { + gs, keys := testutil.DeterministicGenesisState(t, 64) + hs := gs.Copy() + // Head State + headEpoch := head + headSlot := types.Slot(headEpoch) * params.BeaconConfig().SlotsPerEpoch + assert.NoError(t, hs.SetSlot(headSlot)) + mockgen.StatesBySlot[headSlot] = hs + + // Previous Epoch State + prevEpoch := headEpoch - 1 + ps := gs.Copy() + prevSlot := types.Slot(prevEpoch) * params.BeaconConfig().SlotsPerEpoch + assert.NoError(t, ps.SetSlot(prevSlot)) + mockgen.StatesBySlot[prevSlot] = ps + + // Older Epoch State + olderEpoch := prevEpoch - 1 + os := gs.Copy() + olderSlot := types.Slot(olderEpoch) * params.BeaconConfig().SlotsPerEpoch + assert.NoError(t, os.SetSlot(olderSlot)) + mockgen.StatesBySlot[olderSlot] = os + return hs, ps, os, keys +} diff --git a/deps.bzl b/deps.bzl index de0f55755c8e..651087d07e67 100644 --- a/deps.bzl +++ b/deps.bzl @@ -894,9 +894,9 @@ def prysm_deps(): go_repository( name = "com_github_ghodss_yaml", importpath = "github.com/ghodss/yaml", + nofuzz = True, sum = "h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=", version = "v1.0.0", - nofuzz = True, ) go_repository( @@ -1066,8 +1066,8 @@ def prysm_deps(): go_repository( name = "com_github_golang_mock", importpath = "github.com/golang/mock", - sum = "h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc=", - version = "v1.4.4", + sum = "h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=", + version = "v1.6.0", ) go_repository( name = "com_github_golang_protobuf", @@ -1375,12 +1375,6 @@ def prysm_deps(): sum = "h1:YZ7UKsJv+hKjqGVUUbtE3HNj79Eln2oQ75tniF6iPt0=", version = "v0.8.2", ) - go_repository( - name = "com_github_hashicorp_vault_sdk", - importpath = "github.com/hashicorp/vault/sdk", - sum = "h1:hvVswvMA9LvXwLBFDJLIoDBXi8hj90Q+gSS7vRYmLvQ=", - version = "v0.2.0", - ) go_repository( name = "com_github_herumi_bls_eth_go_binary", @@ -2312,12 +2306,6 @@ def prysm_deps(): version = "v0.0.0-20190213212951-d06e56a500db", ) - go_repository( - name = "com_github_mitchellh_copystructure", - importpath = "github.com/mitchellh/copystructure", - sum = "h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=", - version = "v1.2.0", - ) go_repository( name = "com_github_mitchellh_go_homedir", importpath = "github.com/mitchellh/go-homedir", @@ -2350,12 +2338,6 @@ def prysm_deps(): version = "v1.4.1", ) - go_repository( - name = "com_github_mitchellh_reflectwalk", - importpath = "github.com/mitchellh/reflectwalk", - sum = "h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=", - version = "v1.0.2", - ) go_repository( name = "com_github_modern_go_concurrent", importpath = "github.com/modern-go/concurrent", @@ -3577,9 +3559,9 @@ def prysm_deps(): go_repository( name = "in_gopkg_yaml_v2", importpath = "gopkg.in/yaml.v2", + nofuzz = True, sum = "h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=", version = "v2.4.0", - nofuzz = True, ) go_repository( diff --git a/endtoend/components/validator.go b/endtoend/components/validator.go index 533be21860fd..1cdd20af9869 100644 --- a/endtoend/components/validator.go +++ b/endtoend/components/validator.go @@ -144,7 +144,10 @@ func (v *ValidatorNode) Start(ctx context.Context) error { "--" + cmdshared.E2EConfigFlag.Name, "--" + cmdshared.AcceptTosFlag.Name, } - args = append(args, featureconfig.E2EValidatorFlags...) + // Only apply e2e flags to the current branch. New flags may not exist in previous release. + if !v.config.UsePrysmShValidator { + args = append(args, featureconfig.E2EValidatorFlags...) + } args = append(args, config.ValidatorFlags...) if v.config.UsePrysmShValidator { diff --git a/go.mod b/go.mod index a09608425667..8f68ba37667d 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/go-yaml/yaml v2.1.0+incompatible github.com/gogo/protobuf v1.3.2 github.com/golang/gddo v0.0.0-20200528160355-8d077c1d8f4c - github.com/golang/mock v1.4.4 + github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.2 github.com/golang/snappy v0.0.3 github.com/google/gofuzz v1.2.0 diff --git a/go.sum b/go.sum index 02510421af4a..3d940763717d 100644 --- a/go.sum +++ b/go.sum @@ -336,8 +336,9 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= diff --git a/proto/eth/v1alpha1/validator.pb.go b/proto/eth/v1alpha1/validator.pb.go index f8212eb1467d..1a5bba69e024 100755 --- a/proto/eth/v1alpha1/validator.pb.go +++ b/proto/eth/v1alpha1/validator.pb.go @@ -1730,6 +1730,100 @@ func (x *ValidatorInfo) GetEffectiveBalance() uint64 { return 0 } +type DoppelGangerRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ValidatorRequests []*DoppelGangerRequest_ValidatorRequest `protobuf:"bytes,1,rep,name=validator_requests,json=validatorRequests,proto3" json:"validator_requests,omitempty"` +} + +func (x *DoppelGangerRequest) Reset() { + *x = DoppelGangerRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_eth_v1alpha1_validator_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DoppelGangerRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DoppelGangerRequest) ProtoMessage() {} + +func (x *DoppelGangerRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_eth_v1alpha1_validator_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DoppelGangerRequest.ProtoReflect.Descriptor instead. +func (*DoppelGangerRequest) Descriptor() ([]byte, []int) { + return file_proto_eth_v1alpha1_validator_proto_rawDescGZIP(), []int{27} +} + +func (x *DoppelGangerRequest) GetValidatorRequests() []*DoppelGangerRequest_ValidatorRequest { + if x != nil { + return x.ValidatorRequests + } + return nil +} + +type DoppelGangerResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Responses []*DoppelGangerResponse_ValidatorResponse `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"` +} + +func (x *DoppelGangerResponse) Reset() { + *x = DoppelGangerResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_eth_v1alpha1_validator_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DoppelGangerResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DoppelGangerResponse) ProtoMessage() {} + +func (x *DoppelGangerResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_eth_v1alpha1_validator_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DoppelGangerResponse.ProtoReflect.Descriptor instead. +func (*DoppelGangerResponse) Descriptor() ([]byte, []int) { + return file_proto_eth_v1alpha1_validator_proto_rawDescGZIP(), []int{28} +} + +func (x *DoppelGangerResponse) GetResponses() []*DoppelGangerResponse_ValidatorResponse { + if x != nil { + return x.Responses + } + return nil +} + type ValidatorActivationResponse_Status struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1743,7 +1837,7 @@ type ValidatorActivationResponse_Status struct { func (x *ValidatorActivationResponse_Status) Reset() { *x = ValidatorActivationResponse_Status{} if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v1alpha1_validator_proto_msgTypes[27] + mi := &file_proto_eth_v1alpha1_validator_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1756,7 +1850,7 @@ func (x *ValidatorActivationResponse_Status) String() string { func (*ValidatorActivationResponse_Status) ProtoMessage() {} func (x *ValidatorActivationResponse_Status) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v1alpha1_validator_proto_msgTypes[27] + mi := &file_proto_eth_v1alpha1_validator_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1811,7 +1905,7 @@ type DutiesResponse_Duty struct { func (x *DutiesResponse_Duty) Reset() { *x = DutiesResponse_Duty{} if protoimpl.UnsafeEnabled { - mi := &file_proto_eth_v1alpha1_validator_proto_msgTypes[28] + mi := &file_proto_eth_v1alpha1_validator_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1824,7 +1918,7 @@ func (x *DutiesResponse_Duty) String() string { func (*DutiesResponse_Duty) ProtoMessage() {} func (x *DutiesResponse_Duty) ProtoReflect() protoreflect.Message { - mi := &file_proto_eth_v1alpha1_validator_proto_msgTypes[28] + mi := &file_proto_eth_v1alpha1_validator_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1896,6 +1990,124 @@ func (x *DutiesResponse_Duty) GetIsSyncCommittee() bool { return false } +type DoppelGangerRequest_ValidatorRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty" spec-name:"pubkey" ssz-size:"48"` + Epoch github_com_prysmaticlabs_eth2_types.Epoch `protobuf:"varint,3,opt,name=epoch,proto3" json:"epoch,omitempty" cast-type:"github.com/prysmaticlabs/eth2-types.Epoch"` + SignedRoot []byte `protobuf:"bytes,2,opt,name=signed_root,json=signedRoot,proto3" json:"signed_root,omitempty" ssz-size:"32"` +} + +func (x *DoppelGangerRequest_ValidatorRequest) Reset() { + *x = DoppelGangerRequest_ValidatorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_eth_v1alpha1_validator_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DoppelGangerRequest_ValidatorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DoppelGangerRequest_ValidatorRequest) ProtoMessage() {} + +func (x *DoppelGangerRequest_ValidatorRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_eth_v1alpha1_validator_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DoppelGangerRequest_ValidatorRequest.ProtoReflect.Descriptor instead. +func (*DoppelGangerRequest_ValidatorRequest) Descriptor() ([]byte, []int) { + return file_proto_eth_v1alpha1_validator_proto_rawDescGZIP(), []int{27, 0} +} + +func (x *DoppelGangerRequest_ValidatorRequest) GetPublicKey() []byte { + if x != nil { + return x.PublicKey + } + return nil +} + +func (x *DoppelGangerRequest_ValidatorRequest) GetEpoch() github_com_prysmaticlabs_eth2_types.Epoch { + if x != nil { + return x.Epoch + } + return github_com_prysmaticlabs_eth2_types.Epoch(0) +} + +func (x *DoppelGangerRequest_ValidatorRequest) GetSignedRoot() []byte { + if x != nil { + return x.SignedRoot + } + return nil +} + +type DoppelGangerResponse_ValidatorResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty" spec-name:"pubkey" ssz-size:"48"` + DuplicateExists bool `protobuf:"varint,2,opt,name=duplicate_exists,json=duplicateExists,proto3" json:"duplicate_exists,omitempty"` +} + +func (x *DoppelGangerResponse_ValidatorResponse) Reset() { + *x = DoppelGangerResponse_ValidatorResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_eth_v1alpha1_validator_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DoppelGangerResponse_ValidatorResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DoppelGangerResponse_ValidatorResponse) ProtoMessage() {} + +func (x *DoppelGangerResponse_ValidatorResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_eth_v1alpha1_validator_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DoppelGangerResponse_ValidatorResponse.ProtoReflect.Descriptor instead. +func (*DoppelGangerResponse_ValidatorResponse) Descriptor() ([]byte, []int) { + return file_proto_eth_v1alpha1_validator_proto_rawDescGZIP(), []int{28, 0} +} + +func (x *DoppelGangerResponse_ValidatorResponse) GetPublicKey() []byte { + if x != nil { + return x.PublicKey + } + return nil +} + +func (x *DoppelGangerResponse_ValidatorResponse) GetDuplicateExists() bool { + if x != nil { + return x.DuplicateExists + } + return false +} + var File_proto_eth_v1alpha1_validator_proto protoreflect.FileDescriptor var file_proto_eth_v1alpha1_validator_proto_rawDesc = []byte{ @@ -2277,182 +2489,226 @@ var file_proto_eth_v1alpha1_validator_proto_rawDesc = []byte{ 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x42, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x2a, 0x9a, 0x01, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, - 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, - 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x43, 0x54, 0x49, - 0x56, 0x45, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x10, - 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, - 0x0a, 0x0a, 0x06, 0x45, 0x58, 0x49, 0x54, 0x45, 0x44, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, 0x52, 0x54, - 0x49, 0x41, 0x4c, 0x4c, 0x59, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x44, 0x10, - 0x08, 0x32, 0xb6, 0x13, 0x0a, 0x13, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x80, 0x01, 0x0a, 0x09, 0x47, 0x65, - 0x74, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x65, - 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x64, 0x75, 0x74, 0x69, 0x65, 0x73, 0x12, 0x8c, 0x01, 0x0a, - 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x75, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x27, 0x12, 0x25, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x64, 0x75, 0x74, 0x69, - 0x65, 0x73, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x30, 0x01, 0x12, 0x81, 0x01, 0x0a, 0x0a, - 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x24, 0x2e, 0x65, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x25, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, - 0x1e, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, - 0x8e, 0x01, 0x0a, 0x11, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x29, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x30, 0x01, - 0x12, 0xaf, 0x01, 0x0a, 0x11, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x61, 0x6e, 0x63, 0x65, 0x22, 0xb5, 0x02, 0x0a, 0x13, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, + 0x61, 0x6e, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6a, 0x0a, 0x12, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x1a, 0xb1, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, + 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, 0x02, 0x34, 0x38, 0x9a, 0xb5, 0x18, 0x06, 0x70, 0x75, 0x62, + 0x6b, 0x65, 0x79, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x43, + 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x2d, 0x82, + 0xb5, 0x18, 0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, + 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x65, 0x74, 0x68, 0x32, + 0x2d, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x12, 0x27, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x72, 0x6f, + 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x06, 0x8a, 0xb5, 0x18, 0x02, 0x33, 0x32, + 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0xe4, 0x01, 0x0a, + 0x14, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x1a, 0x6f, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x10, 0x8a, 0xb5, 0x18, + 0x02, 0x34, 0x38, 0x9a, 0xb5, 0x18, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x52, 0x09, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x75, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0f, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x45, 0x78, 0x69, + 0x73, 0x74, 0x73, 0x2a, 0x9a, 0x01, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, + 0x57, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x44, + 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x45, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, + 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x0a, + 0x0a, 0x06, 0x45, 0x58, 0x49, 0x54, 0x45, 0x44, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x41, 0x52, 0x54, 0x49, + 0x41, 0x4c, 0x4c, 0x59, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x44, 0x10, 0x08, + 0x32, 0xd3, 0x14, 0x0a, 0x13, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x80, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, + 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, + 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x65, 0x74, + 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x64, 0x75, 0x74, 0x69, 0x65, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x0c, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x75, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, + 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x75, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x27, 0x12, 0x25, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x64, 0x75, 0x74, 0x69, 0x65, + 0x73, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x30, 0x01, 0x12, 0x81, 0x01, 0x0a, 0x0a, 0x44, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x24, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x30, 0x01, 0x12, 0x94, 0x01, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x31, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, + 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x8e, + 0x01, 0x0a, 0x11, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x29, 0x2e, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x88, 0x02, 0x01, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x30, 0x01, 0x12, + 0xaf, 0x01, 0x0a, 0x11, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x65, 0x74, 0x68, - 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x98, 0x01, 0x0a, 0x0f, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x2e, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x65, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x30, + 0x01, 0x12, 0x94, 0x01, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2c, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, + 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, + 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x65, 0x74, 0x68, 0x2f, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x98, 0x01, 0x0a, 0x0f, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x17, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, - 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x35, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, - 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x08, 0x47, 0x65, 0x74, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x23, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x65, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x25, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x17, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x35, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x8a, 0x01, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x28, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x1a, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, - 0x22, 0x1d, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, - 0x01, 0x2a, 0x12, 0x98, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2d, 0x2e, 0x65, 0x74, 0x68, 0x65, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x23, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, + 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x31, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x25, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x8a, 0x01, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x28, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x1a, + 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x22, + 0x1d, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x01, + 0x2a, 0x12, 0x98, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, - 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x2f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x8f, 0x01, - 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x74, 0x74, - 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x25, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x22, 0x23, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x22, + 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x2f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, - 0xb2, 0x01, 0x0a, 0x1d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x12, 0x30, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, - 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x2f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x8f, 0x01, 0x0a, + 0x12, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, + 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x25, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x22, 0x23, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, + 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x01, 0x2a, 0x12, 0xb2, + 0x01, 0x0a, 0x1d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x30, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, + 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x22, 0x21, 0x2f, + 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, + 0x3a, 0x01, 0x2a, 0x12, 0xbe, 0x01, 0x0a, 0x23, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x53, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x33, 0x2e, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x34, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x22, 0x21, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, - 0x65, 0x3a, 0x01, 0x2a, 0x12, 0xbe, 0x01, 0x0a, 0x23, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x53, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x33, 0x2e, 0x65, + 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x8e, 0x01, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, + 0x45, 0x78, 0x69, 0x74, 0x12, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, + 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, 0x74, + 0x1a, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, + 0x45, 0x78, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x65, 0x78, + 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0xa1, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x53, 0x75, 0x62, 0x6e, + 0x65, 0x74, 0x73, 0x12, 0x37, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, + 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x65, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x22, 0x28, 0x2f, 0x65, + 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x2f, 0x73, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x9a, 0x01, 0x0a, 0x11, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x12, + 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, + 0x6e, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x70, 0x70, 0x65, 0x6c, 0x47, 0x61, 0x6e, 0x67, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, + 0x12, 0x24, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x64, 0x6f, 0x70, 0x70, 0x65, 0x6c, + 0x67, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x42, 0x94, 0x01, 0x0a, 0x19, 0x6f, 0x72, 0x67, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x67, 0x67, 0x72, 0x65, - 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x34, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x22, - 0x21, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x8e, 0x01, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x65, 0x45, 0x78, 0x69, 0x74, 0x12, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x2e, 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x69, - 0x67, 0x6e, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x45, 0x78, 0x69, - 0x74, 0x1a, 0x2a, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x65, 0x45, 0x78, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x65, - 0x78, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0xa1, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x53, 0x75, 0x62, - 0x6e, 0x65, 0x74, 0x73, 0x12, 0x37, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, - 0x65, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x74, 0x65, 0x65, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x22, 0x28, 0x2f, - 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x2f, 0x73, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x94, 0x01, 0x0a, 0x19, 0x6f, - 0x72, 0x67, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, - 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2f, 0x65, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x65, 0x74, - 0x68, 0xaa, 0x02, 0x15, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x45, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x15, 0x45, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x75, 0x6d, 0x5c, 0x45, 0x74, 0x68, 0x5c, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x68, 0x61, 0x31, 0x42, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, + 0x2f, 0x70, 0x72, 0x79, 0x73, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x74, 0x68, + 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x65, 0x74, 0x68, 0xaa, 0x02, 0x15, + 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x2e, 0x45, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x15, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x5c, 0x45, 0x74, 0x68, 0x5c, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2468,96 +2724,104 @@ func file_proto_eth_v1alpha1_validator_proto_rawDescGZIP() []byte { } var file_proto_eth_v1alpha1_validator_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_proto_eth_v1alpha1_validator_proto_msgTypes = make([]protoimpl.MessageInfo, 29) +var file_proto_eth_v1alpha1_validator_proto_msgTypes = make([]protoimpl.MessageInfo, 33) var file_proto_eth_v1alpha1_validator_proto_goTypes = []interface{}{ - (ValidatorStatus)(0), // 0: ethereum.eth.v1alpha1.ValidatorStatus - (*DomainRequest)(nil), // 1: ethereum.eth.v1alpha1.DomainRequest - (*DomainResponse)(nil), // 2: ethereum.eth.v1alpha1.DomainResponse - (*ValidatorActivationRequest)(nil), // 3: ethereum.eth.v1alpha1.ValidatorActivationRequest - (*ValidatorActivationResponse)(nil), // 4: ethereum.eth.v1alpha1.ValidatorActivationResponse - (*ChainStartResponse)(nil), // 5: ethereum.eth.v1alpha1.ChainStartResponse - (*SyncedResponse)(nil), // 6: ethereum.eth.v1alpha1.SyncedResponse - (*ValidatorIndexRequest)(nil), // 7: ethereum.eth.v1alpha1.ValidatorIndexRequest - (*ValidatorIndexResponse)(nil), // 8: ethereum.eth.v1alpha1.ValidatorIndexResponse - (*ValidatorStatusRequest)(nil), // 9: ethereum.eth.v1alpha1.ValidatorStatusRequest - (*ValidatorStatusResponse)(nil), // 10: ethereum.eth.v1alpha1.ValidatorStatusResponse - (*MultipleValidatorStatusRequest)(nil), // 11: ethereum.eth.v1alpha1.MultipleValidatorStatusRequest - (*MultipleValidatorStatusResponse)(nil), // 12: ethereum.eth.v1alpha1.MultipleValidatorStatusResponse - (*DutiesRequest)(nil), // 13: ethereum.eth.v1alpha1.DutiesRequest - (*DutiesResponse)(nil), // 14: ethereum.eth.v1alpha1.DutiesResponse - (*BlockRequest)(nil), // 15: ethereum.eth.v1alpha1.BlockRequest - (*ProposeResponse)(nil), // 16: ethereum.eth.v1alpha1.ProposeResponse - (*ProposeExitResponse)(nil), // 17: ethereum.eth.v1alpha1.ProposeExitResponse - (*AttestationDataRequest)(nil), // 18: ethereum.eth.v1alpha1.AttestationDataRequest - (*AttestResponse)(nil), // 19: ethereum.eth.v1alpha1.AttestResponse - (*AggregateSelectionRequest)(nil), // 20: ethereum.eth.v1alpha1.AggregateSelectionRequest - (*AggregateSelectionResponse)(nil), // 21: ethereum.eth.v1alpha1.AggregateSelectionResponse - (*SignedAggregateSubmitRequest)(nil), // 22: ethereum.eth.v1alpha1.SignedAggregateSubmitRequest - (*SignedAggregateSubmitResponse)(nil), // 23: ethereum.eth.v1alpha1.SignedAggregateSubmitResponse - (*CommitteeSubnetsSubscribeRequest)(nil), // 24: ethereum.eth.v1alpha1.CommitteeSubnetsSubscribeRequest - (*Validator)(nil), // 25: ethereum.eth.v1alpha1.Validator - (*ValidatorParticipation)(nil), // 26: ethereum.eth.v1alpha1.ValidatorParticipation - (*ValidatorInfo)(nil), // 27: ethereum.eth.v1alpha1.ValidatorInfo - (*ValidatorActivationResponse_Status)(nil), // 28: ethereum.eth.v1alpha1.ValidatorActivationResponse.Status - (*DutiesResponse_Duty)(nil), // 29: ethereum.eth.v1alpha1.DutiesResponse.Duty - (*AggregateAttestationAndProof)(nil), // 30: ethereum.eth.v1alpha1.AggregateAttestationAndProof - (*SignedAggregateAttestationAndProof)(nil), // 31: ethereum.eth.v1alpha1.SignedAggregateAttestationAndProof - (*empty.Empty)(nil), // 32: google.protobuf.Empty - (*SignedBeaconBlock)(nil), // 33: ethereum.eth.v1alpha1.SignedBeaconBlock - (*Attestation)(nil), // 34: ethereum.eth.v1alpha1.Attestation - (*SignedVoluntaryExit)(nil), // 35: ethereum.eth.v1alpha1.SignedVoluntaryExit - (*BeaconBlock)(nil), // 36: ethereum.eth.v1alpha1.BeaconBlock - (*AttestationData)(nil), // 37: ethereum.eth.v1alpha1.AttestationData + (ValidatorStatus)(0), // 0: ethereum.eth.v1alpha1.ValidatorStatus + (*DomainRequest)(nil), // 1: ethereum.eth.v1alpha1.DomainRequest + (*DomainResponse)(nil), // 2: ethereum.eth.v1alpha1.DomainResponse + (*ValidatorActivationRequest)(nil), // 3: ethereum.eth.v1alpha1.ValidatorActivationRequest + (*ValidatorActivationResponse)(nil), // 4: ethereum.eth.v1alpha1.ValidatorActivationResponse + (*ChainStartResponse)(nil), // 5: ethereum.eth.v1alpha1.ChainStartResponse + (*SyncedResponse)(nil), // 6: ethereum.eth.v1alpha1.SyncedResponse + (*ValidatorIndexRequest)(nil), // 7: ethereum.eth.v1alpha1.ValidatorIndexRequest + (*ValidatorIndexResponse)(nil), // 8: ethereum.eth.v1alpha1.ValidatorIndexResponse + (*ValidatorStatusRequest)(nil), // 9: ethereum.eth.v1alpha1.ValidatorStatusRequest + (*ValidatorStatusResponse)(nil), // 10: ethereum.eth.v1alpha1.ValidatorStatusResponse + (*MultipleValidatorStatusRequest)(nil), // 11: ethereum.eth.v1alpha1.MultipleValidatorStatusRequest + (*MultipleValidatorStatusResponse)(nil), // 12: ethereum.eth.v1alpha1.MultipleValidatorStatusResponse + (*DutiesRequest)(nil), // 13: ethereum.eth.v1alpha1.DutiesRequest + (*DutiesResponse)(nil), // 14: ethereum.eth.v1alpha1.DutiesResponse + (*BlockRequest)(nil), // 15: ethereum.eth.v1alpha1.BlockRequest + (*ProposeResponse)(nil), // 16: ethereum.eth.v1alpha1.ProposeResponse + (*ProposeExitResponse)(nil), // 17: ethereum.eth.v1alpha1.ProposeExitResponse + (*AttestationDataRequest)(nil), // 18: ethereum.eth.v1alpha1.AttestationDataRequest + (*AttestResponse)(nil), // 19: ethereum.eth.v1alpha1.AttestResponse + (*AggregateSelectionRequest)(nil), // 20: ethereum.eth.v1alpha1.AggregateSelectionRequest + (*AggregateSelectionResponse)(nil), // 21: ethereum.eth.v1alpha1.AggregateSelectionResponse + (*SignedAggregateSubmitRequest)(nil), // 22: ethereum.eth.v1alpha1.SignedAggregateSubmitRequest + (*SignedAggregateSubmitResponse)(nil), // 23: ethereum.eth.v1alpha1.SignedAggregateSubmitResponse + (*CommitteeSubnetsSubscribeRequest)(nil), // 24: ethereum.eth.v1alpha1.CommitteeSubnetsSubscribeRequest + (*Validator)(nil), // 25: ethereum.eth.v1alpha1.Validator + (*ValidatorParticipation)(nil), // 26: ethereum.eth.v1alpha1.ValidatorParticipation + (*ValidatorInfo)(nil), // 27: ethereum.eth.v1alpha1.ValidatorInfo + (*DoppelGangerRequest)(nil), // 28: ethereum.eth.v1alpha1.DoppelGangerRequest + (*DoppelGangerResponse)(nil), // 29: ethereum.eth.v1alpha1.DoppelGangerResponse + (*ValidatorActivationResponse_Status)(nil), // 30: ethereum.eth.v1alpha1.ValidatorActivationResponse.Status + (*DutiesResponse_Duty)(nil), // 31: ethereum.eth.v1alpha1.DutiesResponse.Duty + (*DoppelGangerRequest_ValidatorRequest)(nil), // 32: ethereum.eth.v1alpha1.DoppelGangerRequest.ValidatorRequest + (*DoppelGangerResponse_ValidatorResponse)(nil), // 33: ethereum.eth.v1alpha1.DoppelGangerResponse.ValidatorResponse + (*AggregateAttestationAndProof)(nil), // 34: ethereum.eth.v1alpha1.AggregateAttestationAndProof + (*SignedAggregateAttestationAndProof)(nil), // 35: ethereum.eth.v1alpha1.SignedAggregateAttestationAndProof + (*empty.Empty)(nil), // 36: google.protobuf.Empty + (*SignedBeaconBlock)(nil), // 37: ethereum.eth.v1alpha1.SignedBeaconBlock + (*Attestation)(nil), // 38: ethereum.eth.v1alpha1.Attestation + (*SignedVoluntaryExit)(nil), // 39: ethereum.eth.v1alpha1.SignedVoluntaryExit + (*BeaconBlock)(nil), // 40: ethereum.eth.v1alpha1.BeaconBlock + (*AttestationData)(nil), // 41: ethereum.eth.v1alpha1.AttestationData } var file_proto_eth_v1alpha1_validator_proto_depIdxs = []int32{ - 28, // 0: ethereum.eth.v1alpha1.ValidatorActivationResponse.statuses:type_name -> ethereum.eth.v1alpha1.ValidatorActivationResponse.Status + 30, // 0: ethereum.eth.v1alpha1.ValidatorActivationResponse.statuses:type_name -> ethereum.eth.v1alpha1.ValidatorActivationResponse.Status 0, // 1: ethereum.eth.v1alpha1.ValidatorStatusResponse.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus 10, // 2: ethereum.eth.v1alpha1.MultipleValidatorStatusResponse.statuses:type_name -> ethereum.eth.v1alpha1.ValidatorStatusResponse - 29, // 3: ethereum.eth.v1alpha1.DutiesResponse.duties:type_name -> ethereum.eth.v1alpha1.DutiesResponse.Duty - 29, // 4: ethereum.eth.v1alpha1.DutiesResponse.current_epoch_duties:type_name -> ethereum.eth.v1alpha1.DutiesResponse.Duty - 29, // 5: ethereum.eth.v1alpha1.DutiesResponse.next_epoch_duties:type_name -> ethereum.eth.v1alpha1.DutiesResponse.Duty - 30, // 6: ethereum.eth.v1alpha1.AggregateSelectionResponse.aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.AggregateAttestationAndProof - 31, // 7: ethereum.eth.v1alpha1.SignedAggregateSubmitRequest.signed_aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.SignedAggregateAttestationAndProof + 31, // 3: ethereum.eth.v1alpha1.DutiesResponse.duties:type_name -> ethereum.eth.v1alpha1.DutiesResponse.Duty + 31, // 4: ethereum.eth.v1alpha1.DutiesResponse.current_epoch_duties:type_name -> ethereum.eth.v1alpha1.DutiesResponse.Duty + 31, // 5: ethereum.eth.v1alpha1.DutiesResponse.next_epoch_duties:type_name -> ethereum.eth.v1alpha1.DutiesResponse.Duty + 34, // 6: ethereum.eth.v1alpha1.AggregateSelectionResponse.aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.AggregateAttestationAndProof + 35, // 7: ethereum.eth.v1alpha1.SignedAggregateSubmitRequest.signed_aggregate_and_proof:type_name -> ethereum.eth.v1alpha1.SignedAggregateAttestationAndProof 0, // 8: ethereum.eth.v1alpha1.ValidatorInfo.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus - 10, // 9: ethereum.eth.v1alpha1.ValidatorActivationResponse.Status.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatusResponse - 0, // 10: ethereum.eth.v1alpha1.DutiesResponse.Duty.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus - 13, // 11: ethereum.eth.v1alpha1.BeaconNodeValidator.GetDuties:input_type -> ethereum.eth.v1alpha1.DutiesRequest - 13, // 12: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamDuties:input_type -> ethereum.eth.v1alpha1.DutiesRequest - 1, // 13: ethereum.eth.v1alpha1.BeaconNodeValidator.DomainData:input_type -> ethereum.eth.v1alpha1.DomainRequest - 32, // 14: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForChainStart:input_type -> google.protobuf.Empty - 3, // 15: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForActivation:input_type -> ethereum.eth.v1alpha1.ValidatorActivationRequest - 7, // 16: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorIndex:input_type -> ethereum.eth.v1alpha1.ValidatorIndexRequest - 9, // 17: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorStatus:input_type -> ethereum.eth.v1alpha1.ValidatorStatusRequest - 11, // 18: ethereum.eth.v1alpha1.BeaconNodeValidator.MultipleValidatorStatus:input_type -> ethereum.eth.v1alpha1.MultipleValidatorStatusRequest - 15, // 19: ethereum.eth.v1alpha1.BeaconNodeValidator.GetBlock:input_type -> ethereum.eth.v1alpha1.BlockRequest - 33, // 20: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeBlock:input_type -> ethereum.eth.v1alpha1.SignedBeaconBlock - 18, // 21: ethereum.eth.v1alpha1.BeaconNodeValidator.GetAttestationData:input_type -> ethereum.eth.v1alpha1.AttestationDataRequest - 34, // 22: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestation:input_type -> ethereum.eth.v1alpha1.Attestation - 20, // 23: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProof:input_type -> ethereum.eth.v1alpha1.AggregateSelectionRequest - 22, // 24: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProof:input_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitRequest - 35, // 25: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeExit:input_type -> ethereum.eth.v1alpha1.SignedVoluntaryExit - 24, // 26: ethereum.eth.v1alpha1.BeaconNodeValidator.SubscribeCommitteeSubnets:input_type -> ethereum.eth.v1alpha1.CommitteeSubnetsSubscribeRequest - 14, // 27: ethereum.eth.v1alpha1.BeaconNodeValidator.GetDuties:output_type -> ethereum.eth.v1alpha1.DutiesResponse - 14, // 28: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamDuties:output_type -> ethereum.eth.v1alpha1.DutiesResponse - 2, // 29: ethereum.eth.v1alpha1.BeaconNodeValidator.DomainData:output_type -> ethereum.eth.v1alpha1.DomainResponse - 5, // 30: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForChainStart:output_type -> ethereum.eth.v1alpha1.ChainStartResponse - 4, // 31: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForActivation:output_type -> ethereum.eth.v1alpha1.ValidatorActivationResponse - 8, // 32: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorIndex:output_type -> ethereum.eth.v1alpha1.ValidatorIndexResponse - 10, // 33: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorStatus:output_type -> ethereum.eth.v1alpha1.ValidatorStatusResponse - 12, // 34: ethereum.eth.v1alpha1.BeaconNodeValidator.MultipleValidatorStatus:output_type -> ethereum.eth.v1alpha1.MultipleValidatorStatusResponse - 36, // 35: ethereum.eth.v1alpha1.BeaconNodeValidator.GetBlock:output_type -> ethereum.eth.v1alpha1.BeaconBlock - 16, // 36: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeBlock:output_type -> ethereum.eth.v1alpha1.ProposeResponse - 37, // 37: ethereum.eth.v1alpha1.BeaconNodeValidator.GetAttestationData:output_type -> ethereum.eth.v1alpha1.AttestationData - 19, // 38: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestation:output_type -> ethereum.eth.v1alpha1.AttestResponse - 21, // 39: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProof:output_type -> ethereum.eth.v1alpha1.AggregateSelectionResponse - 23, // 40: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProof:output_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitResponse - 17, // 41: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeExit:output_type -> ethereum.eth.v1alpha1.ProposeExitResponse - 32, // 42: ethereum.eth.v1alpha1.BeaconNodeValidator.SubscribeCommitteeSubnets:output_type -> google.protobuf.Empty - 27, // [27:43] is the sub-list for method output_type - 11, // [11:27] is the sub-list for method input_type - 11, // [11:11] is the sub-list for extension type_name - 11, // [11:11] is the sub-list for extension extendee - 0, // [0:11] is the sub-list for field type_name + 32, // 9: ethereum.eth.v1alpha1.DoppelGangerRequest.validator_requests:type_name -> ethereum.eth.v1alpha1.DoppelGangerRequest.ValidatorRequest + 33, // 10: ethereum.eth.v1alpha1.DoppelGangerResponse.responses:type_name -> ethereum.eth.v1alpha1.DoppelGangerResponse.ValidatorResponse + 10, // 11: ethereum.eth.v1alpha1.ValidatorActivationResponse.Status.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatusResponse + 0, // 12: ethereum.eth.v1alpha1.DutiesResponse.Duty.status:type_name -> ethereum.eth.v1alpha1.ValidatorStatus + 13, // 13: ethereum.eth.v1alpha1.BeaconNodeValidator.GetDuties:input_type -> ethereum.eth.v1alpha1.DutiesRequest + 13, // 14: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamDuties:input_type -> ethereum.eth.v1alpha1.DutiesRequest + 1, // 15: ethereum.eth.v1alpha1.BeaconNodeValidator.DomainData:input_type -> ethereum.eth.v1alpha1.DomainRequest + 36, // 16: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForChainStart:input_type -> google.protobuf.Empty + 3, // 17: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForActivation:input_type -> ethereum.eth.v1alpha1.ValidatorActivationRequest + 7, // 18: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorIndex:input_type -> ethereum.eth.v1alpha1.ValidatorIndexRequest + 9, // 19: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorStatus:input_type -> ethereum.eth.v1alpha1.ValidatorStatusRequest + 11, // 20: ethereum.eth.v1alpha1.BeaconNodeValidator.MultipleValidatorStatus:input_type -> ethereum.eth.v1alpha1.MultipleValidatorStatusRequest + 15, // 21: ethereum.eth.v1alpha1.BeaconNodeValidator.GetBlock:input_type -> ethereum.eth.v1alpha1.BlockRequest + 37, // 22: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeBlock:input_type -> ethereum.eth.v1alpha1.SignedBeaconBlock + 18, // 23: ethereum.eth.v1alpha1.BeaconNodeValidator.GetAttestationData:input_type -> ethereum.eth.v1alpha1.AttestationDataRequest + 38, // 24: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestation:input_type -> ethereum.eth.v1alpha1.Attestation + 20, // 25: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProof:input_type -> ethereum.eth.v1alpha1.AggregateSelectionRequest + 22, // 26: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProof:input_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitRequest + 39, // 27: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeExit:input_type -> ethereum.eth.v1alpha1.SignedVoluntaryExit + 24, // 28: ethereum.eth.v1alpha1.BeaconNodeValidator.SubscribeCommitteeSubnets:input_type -> ethereum.eth.v1alpha1.CommitteeSubnetsSubscribeRequest + 28, // 29: ethereum.eth.v1alpha1.BeaconNodeValidator.CheckDoppelGanger:input_type -> ethereum.eth.v1alpha1.DoppelGangerRequest + 14, // 30: ethereum.eth.v1alpha1.BeaconNodeValidator.GetDuties:output_type -> ethereum.eth.v1alpha1.DutiesResponse + 14, // 31: ethereum.eth.v1alpha1.BeaconNodeValidator.StreamDuties:output_type -> ethereum.eth.v1alpha1.DutiesResponse + 2, // 32: ethereum.eth.v1alpha1.BeaconNodeValidator.DomainData:output_type -> ethereum.eth.v1alpha1.DomainResponse + 5, // 33: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForChainStart:output_type -> ethereum.eth.v1alpha1.ChainStartResponse + 4, // 34: ethereum.eth.v1alpha1.BeaconNodeValidator.WaitForActivation:output_type -> ethereum.eth.v1alpha1.ValidatorActivationResponse + 8, // 35: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorIndex:output_type -> ethereum.eth.v1alpha1.ValidatorIndexResponse + 10, // 36: ethereum.eth.v1alpha1.BeaconNodeValidator.ValidatorStatus:output_type -> ethereum.eth.v1alpha1.ValidatorStatusResponse + 12, // 37: ethereum.eth.v1alpha1.BeaconNodeValidator.MultipleValidatorStatus:output_type -> ethereum.eth.v1alpha1.MultipleValidatorStatusResponse + 40, // 38: ethereum.eth.v1alpha1.BeaconNodeValidator.GetBlock:output_type -> ethereum.eth.v1alpha1.BeaconBlock + 16, // 39: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeBlock:output_type -> ethereum.eth.v1alpha1.ProposeResponse + 41, // 40: ethereum.eth.v1alpha1.BeaconNodeValidator.GetAttestationData:output_type -> ethereum.eth.v1alpha1.AttestationData + 19, // 41: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeAttestation:output_type -> ethereum.eth.v1alpha1.AttestResponse + 21, // 42: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitAggregateSelectionProof:output_type -> ethereum.eth.v1alpha1.AggregateSelectionResponse + 23, // 43: ethereum.eth.v1alpha1.BeaconNodeValidator.SubmitSignedAggregateSelectionProof:output_type -> ethereum.eth.v1alpha1.SignedAggregateSubmitResponse + 17, // 44: ethereum.eth.v1alpha1.BeaconNodeValidator.ProposeExit:output_type -> ethereum.eth.v1alpha1.ProposeExitResponse + 36, // 45: ethereum.eth.v1alpha1.BeaconNodeValidator.SubscribeCommitteeSubnets:output_type -> google.protobuf.Empty + 29, // 46: ethereum.eth.v1alpha1.BeaconNodeValidator.CheckDoppelGanger:output_type -> ethereum.eth.v1alpha1.DoppelGangerResponse + 30, // [30:47] is the sub-list for method output_type + 13, // [13:30] is the sub-list for method input_type + 13, // [13:13] is the sub-list for extension type_name + 13, // [13:13] is the sub-list for extension extendee + 0, // [0:13] is the sub-list for field type_name } func init() { file_proto_eth_v1alpha1_validator_proto_init() } @@ -2893,7 +3157,7 @@ func file_proto_eth_v1alpha1_validator_proto_init() { } } file_proto_eth_v1alpha1_validator_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatorActivationResponse_Status); i { + switch v := v.(*DoppelGangerRequest); i { case 0: return &v.state case 1: @@ -2905,6 +3169,30 @@ func file_proto_eth_v1alpha1_validator_proto_init() { } } file_proto_eth_v1alpha1_validator_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DoppelGangerResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_eth_v1alpha1_validator_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidatorActivationResponse_Status); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_eth_v1alpha1_validator_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DutiesResponse_Duty); i { case 0: return &v.state @@ -2916,6 +3204,30 @@ func file_proto_eth_v1alpha1_validator_proto_init() { return nil } } + file_proto_eth_v1alpha1_validator_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DoppelGangerRequest_ValidatorRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_eth_v1alpha1_validator_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DoppelGangerResponse_ValidatorResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -2923,7 +3235,7 @@ func file_proto_eth_v1alpha1_validator_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proto_eth_v1alpha1_validator_proto_rawDesc, NumEnums: 1, - NumMessages: 29, + NumMessages: 33, NumExtensions: 0, NumServices: 1, }, @@ -2967,6 +3279,7 @@ type BeaconNodeValidatorClient interface { SubmitSignedAggregateSelectionProof(ctx context.Context, in *SignedAggregateSubmitRequest, opts ...grpc.CallOption) (*SignedAggregateSubmitResponse, error) ProposeExit(ctx context.Context, in *SignedVoluntaryExit, opts ...grpc.CallOption) (*ProposeExitResponse, error) SubscribeCommitteeSubnets(ctx context.Context, in *CommitteeSubnetsSubscribeRequest, opts ...grpc.CallOption) (*empty.Empty, error) + CheckDoppelGanger(ctx context.Context, in *DoppelGangerRequest, opts ...grpc.CallOption) (*DoppelGangerResponse, error) } type beaconNodeValidatorClient struct { @@ -3191,6 +3504,15 @@ func (c *beaconNodeValidatorClient) SubscribeCommitteeSubnets(ctx context.Contex return out, nil } +func (c *beaconNodeValidatorClient) CheckDoppelGanger(ctx context.Context, in *DoppelGangerRequest, opts ...grpc.CallOption) (*DoppelGangerResponse, error) { + out := new(DoppelGangerResponse) + err := c.cc.Invoke(ctx, "/ethereum.eth.v1alpha1.BeaconNodeValidator/CheckDoppelGanger", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // BeaconNodeValidatorServer is the server API for BeaconNodeValidator service. type BeaconNodeValidatorServer interface { GetDuties(context.Context, *DutiesRequest) (*DutiesResponse, error) @@ -3210,6 +3532,7 @@ type BeaconNodeValidatorServer interface { SubmitSignedAggregateSelectionProof(context.Context, *SignedAggregateSubmitRequest) (*SignedAggregateSubmitResponse, error) ProposeExit(context.Context, *SignedVoluntaryExit) (*ProposeExitResponse, error) SubscribeCommitteeSubnets(context.Context, *CommitteeSubnetsSubscribeRequest) (*empty.Empty, error) + CheckDoppelGanger(context.Context, *DoppelGangerRequest) (*DoppelGangerResponse, error) } // UnimplementedBeaconNodeValidatorServer can be embedded to have forward compatible implementations. @@ -3264,6 +3587,9 @@ func (*UnimplementedBeaconNodeValidatorServer) ProposeExit(context.Context, *Sig func (*UnimplementedBeaconNodeValidatorServer) SubscribeCommitteeSubnets(context.Context, *CommitteeSubnetsSubscribeRequest) (*empty.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method SubscribeCommitteeSubnets not implemented") } +func (*UnimplementedBeaconNodeValidatorServer) CheckDoppelGanger(context.Context, *DoppelGangerRequest) (*DoppelGangerResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CheckDoppelGanger not implemented") +} func RegisterBeaconNodeValidatorServer(s *grpc.Server, srv BeaconNodeValidatorServer) { s.RegisterService(&_BeaconNodeValidator_serviceDesc, srv) @@ -3566,6 +3892,24 @@ func _BeaconNodeValidator_SubscribeCommitteeSubnets_Handler(srv interface{}, ctx return interceptor(ctx, in, info, handler) } +func _BeaconNodeValidator_CheckDoppelGanger_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DoppelGangerRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BeaconNodeValidatorServer).CheckDoppelGanger(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ethereum.eth.v1alpha1.BeaconNodeValidator/CheckDoppelGanger", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BeaconNodeValidatorServer).CheckDoppelGanger(ctx, req.(*DoppelGangerRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _BeaconNodeValidator_serviceDesc = grpc.ServiceDesc{ ServiceName: "ethereum.eth.v1alpha1.BeaconNodeValidator", HandlerType: (*BeaconNodeValidatorServer)(nil), @@ -3622,6 +3966,10 @@ var _BeaconNodeValidator_serviceDesc = grpc.ServiceDesc{ MethodName: "SubscribeCommitteeSubnets", Handler: _BeaconNodeValidator_SubscribeCommitteeSubnets_Handler, }, + { + MethodName: "CheckDoppelGanger", + Handler: _BeaconNodeValidator_CheckDoppelGanger_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/proto/eth/v1alpha1/validator.pb.gw.go b/proto/eth/v1alpha1/validator.pb.gw.go index 8dd3a33c9561..b8052a4f172d 100755 --- a/proto/eth/v1alpha1/validator.pb.gw.go +++ b/proto/eth/v1alpha1/validator.pb.gw.go @@ -566,6 +566,42 @@ func local_request_BeaconNodeValidator_SubscribeCommitteeSubnets_0(ctx context.C } +var ( + filter_BeaconNodeValidator_CheckDoppelGanger_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_BeaconNodeValidator_CheckDoppelGanger_0(ctx context.Context, marshaler runtime.Marshaler, client BeaconNodeValidatorClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DoppelGangerRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_BeaconNodeValidator_CheckDoppelGanger_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CheckDoppelGanger(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_BeaconNodeValidator_CheckDoppelGanger_0(ctx context.Context, marshaler runtime.Marshaler, server BeaconNodeValidatorServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DoppelGangerRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_BeaconNodeValidator_CheckDoppelGanger_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CheckDoppelGanger(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterBeaconNodeValidatorHandlerServer registers the http handlers for service BeaconNodeValidator to "mux". // UnaryRPC :call BeaconNodeValidatorServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -892,6 +928,29 @@ func RegisterBeaconNodeValidatorHandlerServer(ctx context.Context, mux *runtime. }) + mux.Handle("GET", pattern_BeaconNodeValidator_CheckDoppelGanger_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/ethereum.eth.v1alpha1.BeaconNodeValidator/CheckDoppelGanger") + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_BeaconNodeValidator_CheckDoppelGanger_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_BeaconNodeValidator_CheckDoppelGanger_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1253,6 +1312,26 @@ func RegisterBeaconNodeValidatorHandlerClient(ctx context.Context, mux *runtime. }) + mux.Handle("GET", pattern_BeaconNodeValidator_CheckDoppelGanger_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/ethereum.eth.v1alpha1.BeaconNodeValidator/CheckDoppelGanger") + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_BeaconNodeValidator_CheckDoppelGanger_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_BeaconNodeValidator_CheckDoppelGanger_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1288,6 +1367,8 @@ var ( pattern_BeaconNodeValidator_ProposeExit_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"eth", "v1alpha1", "validator", "exit"}, "")) pattern_BeaconNodeValidator_SubscribeCommitteeSubnets_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"eth", "v1alpha1", "validator", "subnet", "subscribe"}, "")) + + pattern_BeaconNodeValidator_CheckDoppelGanger_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"eth", "v1alpha1", "validator", "doppelganger"}, "")) ) var ( @@ -1322,4 +1403,6 @@ var ( forward_BeaconNodeValidator_ProposeExit_0 = runtime.ForwardResponseMessage forward_BeaconNodeValidator_SubscribeCommitteeSubnets_0 = runtime.ForwardResponseMessage + + forward_BeaconNodeValidator_CheckDoppelGanger_0 = runtime.ForwardResponseMessage ) diff --git a/proto/eth/v1alpha1/validator.proto b/proto/eth/v1alpha1/validator.proto index 635e390918c6..457b578ff634 100644 --- a/proto/eth/v1alpha1/validator.proto +++ b/proto/eth/v1alpha1/validator.proto @@ -220,6 +220,15 @@ service BeaconNodeValidator { body: "*" }; } + + // Checks the beacon node if another instance of the provided validator keys have been + // attesting/proposing for you. + rpc CheckDoppelGanger(DoppelGangerRequest) returns (DoppelGangerResponse) { + option (google.api.http) = { + get: "/eth/v1alpha1/validator/doppelganger" + }; + } + } message DomainRequest { @@ -553,3 +562,31 @@ message ValidatorInfo { // Only valid for states ACTIVE, EXITING, SLASHING. uint64 effective_balance = 7; } + +// DoppelGangerRequest represents the request sent by the validator in order to determine +// if there is any duplicate instance of it running in the network. +message DoppelGangerRequest { + repeated ValidatorRequest validator_requests = 1; + + // ValidatorRequest data type which represents a request for each validator. + message ValidatorRequest { + // The validator's 48 byte BLS public key. + bytes public_key = 1 [(ethereum.eth.ext.ssz_size) = "48", (ethereum.eth.ext.spec_name) = "pubkey"]; + // The validator's last recorded epoch to attest. + uint64 epoch = 3 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Epoch"]; + // The validator's last recorded signed root. + bytes signed_root = 2 [(ethereum.eth.ext.ssz_size) = "32"]; + } +} + +// DoppelGangerResponse is the response payload sent by the beacon node +// after it has checked for all duplicate keys in the network. +message DoppelGangerResponse { + message ValidatorResponse { + // The validator's 48 byte BLS public key. + bytes public_key = 1 [(ethereum.eth.ext.ssz_size) = "48", (ethereum.eth.ext.spec_name) = "pubkey"]; + // Whether a duplicate of the validator exists. + bool duplicate_exists = 2; + } + repeated ValidatorResponse responses = 1; +} diff --git a/shared/featureconfig/config.go b/shared/featureconfig/config.go index f8a1dbb9a4bf..fb127475cd26 100644 --- a/shared/featureconfig/config.go +++ b/shared/featureconfig/config.go @@ -49,7 +49,7 @@ type Flags struct { UpdateHeadTimely bool // UpdateHeadTimely updates head right after state transition. ProposerAttsSelectionUsingMaxCover bool // ProposerAttsSelectionUsingMaxCover enables max-cover algorithm when selecting attestations for proposing. EnableOptimizedBalanceUpdate bool // EnableOptimizedBalanceUpdate uses an updated method of performing balance updates. - + EnableDoppelGanger bool // EnableDoppelGanger enables doppelganger protection on startup for the validator. // Logging related toggles. DisableGRPCConnectionLogs bool // Disables logging when a new grpc client has connected. @@ -239,6 +239,10 @@ func ConfigureValidator(ctx *cli.Context) { log.WithField(enableSlashingProtectionPruning.Name, enableSlashingProtectionPruning.Usage).Warn(enabledFeatureFlag) cfg.EnableSlashingProtectionPruning = true } + if ctx.Bool(enableDoppelGangerProtection.Name) { + log.WithField(enableDoppelGangerProtection.Name, enableDoppelGangerProtection.Usage).Warn(enabledFeatureFlag) + cfg.EnableDoppelGanger = true + } cfg.KeystoreImportDebounceInterval = ctx.Duration(dynamicKeyReloadDebounceInterval.Name) Init(cfg) } diff --git a/shared/featureconfig/flags.go b/shared/featureconfig/flags.go index d09250b70c18..7c2c8424967f 100644 --- a/shared/featureconfig/flags.go +++ b/shared/featureconfig/flags.go @@ -122,6 +122,12 @@ var ( Name: "enable-optimized-balance-update", Usage: "Enables the optimized method of updating validator balances.", } + enableDoppelGangerProtection = &cli.BoolFlag{ + Name: "enable-doppelganger", + Usage: "Enables the validator to perform a doppelganger check. (Warning): This is not " + + "a foolproof method to find duplicate instances in the network. Your validator will still be" + + " vulnerable if it is being run in unsafe configurations.", + } ) // devModeFlags holds list of flags that are set when development mode is on. @@ -146,6 +152,7 @@ var ValidatorFlags = append(deprecatedFlags, []cli.Flag{ dynamicKeyReloadDebounceInterval, attestTimely, enableSlashingProtectionPruning, + enableDoppelGangerProtection, }...) // SlasherFlags contains a list of all the feature flags that apply to the slasher client. @@ -158,7 +165,9 @@ var SlasherFlags = append(deprecatedFlags, []cli.Flag{ }...) // E2EValidatorFlags contains a list of the validator feature flags to be tested in E2E. -var E2EValidatorFlags = make([]string, 0) +var E2EValidatorFlags = []string{ + "--enable-doppelganger", +} // BeaconChainFlags contains a list of all the feature flags that apply to the beacon-chain client. var BeaconChainFlags = append(deprecatedFlags, []cli.Flag{ diff --git a/shared/mock/beacon_chain_service_mock.go b/shared/mock/beacon_chain_service_mock.go index 532d0d5599ae..17723b462104 100644 --- a/shared/mock/beacon_chain_service_mock.go +++ b/shared/mock/beacon_chain_service_mock.go @@ -9,7 +9,7 @@ import ( reflect "reflect" gomock "github.com/golang/mock/gomock" - eth "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" + v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" metadata "google.golang.org/grpc/metadata" ) @@ -65,7 +65,7 @@ func (mr *MockBeaconChain_StreamChainHeadServerMockRecorder) RecvMsg(arg0 interf } // Send mocks base method -func (m *MockBeaconChain_StreamChainHeadServer) Send(arg0 *eth.ChainHead) error { +func (m *MockBeaconChain_StreamChainHeadServer) Send(arg0 *v1alpha1.ChainHead) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Send", arg0) ret0, _ := ret[0].(error) @@ -184,7 +184,7 @@ func (mr *MockBeaconChain_StreamAttestationsServerMockRecorder) RecvMsg(arg0 int } // Send mocks base method -func (m *MockBeaconChain_StreamAttestationsServer) Send(arg0 *eth.Attestation) error { +func (m *MockBeaconChain_StreamAttestationsServer) Send(arg0 *v1alpha1.Attestation) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Send", arg0) ret0, _ := ret[0].(error) @@ -303,7 +303,7 @@ func (mr *MockBeaconChain_StreamBlocksServerMockRecorder) RecvMsg(arg0 interface } // Send mocks base method -func (m *MockBeaconChain_StreamBlocksServer) Send(arg0 *eth.SignedBeaconBlock) error { +func (m *MockBeaconChain_StreamBlocksServer) Send(arg0 *v1alpha1.SignedBeaconBlock) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Send", arg0) ret0, _ := ret[0].(error) @@ -408,10 +408,10 @@ func (mr *MockBeaconChain_StreamValidatorsInfoServerMockRecorder) Context() *gom } // Recv mocks base method -func (m *MockBeaconChain_StreamValidatorsInfoServer) Recv() (*eth.ValidatorChangeSet, error) { +func (m *MockBeaconChain_StreamValidatorsInfoServer) Recv() (*v1alpha1.ValidatorChangeSet, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Recv") - ret0, _ := ret[0].(*eth.ValidatorChangeSet) + ret0, _ := ret[0].(*v1alpha1.ValidatorChangeSet) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -437,7 +437,7 @@ func (mr *MockBeaconChain_StreamValidatorsInfoServerMockRecorder) RecvMsg(arg0 i } // Send mocks base method -func (m *MockBeaconChain_StreamValidatorsInfoServer) Send(arg0 *eth.ValidatorInfo) error { +func (m *MockBeaconChain_StreamValidatorsInfoServer) Send(arg0 *v1alpha1.ValidatorInfo) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Send", arg0) ret0, _ := ret[0].(error) @@ -556,7 +556,7 @@ func (mr *MockBeaconChain_StreamIndexedAttestationsServerMockRecorder) RecvMsg(a } // Send mocks base method -func (m *MockBeaconChain_StreamIndexedAttestationsServer) Send(arg0 *eth.IndexedAttestation) error { +func (m *MockBeaconChain_StreamIndexedAttestationsServer) Send(arg0 *v1alpha1.IndexedAttestation) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Send", arg0) ret0, _ := ret[0].(error) diff --git a/shared/mock/beacon_service_mock.go b/shared/mock/beacon_service_mock.go index db6992dc4026..20a58c681c2d 100644 --- a/shared/mock/beacon_service_mock.go +++ b/shared/mock/beacon_service_mock.go @@ -9,7 +9,7 @@ import ( reflect "reflect" gomock "github.com/golang/mock/gomock" - eth "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" + v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" grpc "google.golang.org/grpc" metadata "google.golang.org/grpc/metadata" emptypb "google.golang.org/protobuf/types/known/emptypb" @@ -39,14 +39,14 @@ func (m *MockBeaconChainClient) EXPECT() *MockBeaconChainClientMockRecorder { } // AttestationPool mocks base method -func (m *MockBeaconChainClient) AttestationPool(arg0 context.Context, arg1 *eth.AttestationPoolRequest, arg2 ...grpc.CallOption) (*eth.AttestationPoolResponse, error) { +func (m *MockBeaconChainClient) AttestationPool(arg0 context.Context, arg1 *v1alpha1.AttestationPoolRequest, arg2 ...grpc.CallOption) (*v1alpha1.AttestationPoolResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "AttestationPool", varargs...) - ret0, _ := ret[0].(*eth.AttestationPoolResponse) + ret0, _ := ret[0].(*v1alpha1.AttestationPoolResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -59,14 +59,14 @@ func (mr *MockBeaconChainClientMockRecorder) AttestationPool(arg0, arg1 interfac } // GetBeaconConfig mocks base method -func (m *MockBeaconChainClient) GetBeaconConfig(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*eth.BeaconConfig, error) { +func (m *MockBeaconChainClient) GetBeaconConfig(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*v1alpha1.BeaconConfig, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetBeaconConfig", varargs...) - ret0, _ := ret[0].(*eth.BeaconConfig) + ret0, _ := ret[0].(*v1alpha1.BeaconConfig) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -79,14 +79,14 @@ func (mr *MockBeaconChainClientMockRecorder) GetBeaconConfig(arg0, arg1 interfac } // GetChainHead mocks base method -func (m *MockBeaconChainClient) GetChainHead(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*eth.ChainHead, error) { +func (m *MockBeaconChainClient) GetChainHead(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*v1alpha1.ChainHead, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetChainHead", varargs...) - ret0, _ := ret[0].(*eth.ChainHead) + ret0, _ := ret[0].(*v1alpha1.ChainHead) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -99,14 +99,14 @@ func (mr *MockBeaconChainClientMockRecorder) GetChainHead(arg0, arg1 interface{} } // GetIndividualVotes mocks base method -func (m *MockBeaconChainClient) GetIndividualVotes(arg0 context.Context, arg1 *eth.IndividualVotesRequest, arg2 ...grpc.CallOption) (*eth.IndividualVotesRespond, error) { +func (m *MockBeaconChainClient) GetIndividualVotes(arg0 context.Context, arg1 *v1alpha1.IndividualVotesRequest, arg2 ...grpc.CallOption) (*v1alpha1.IndividualVotesRespond, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetIndividualVotes", varargs...) - ret0, _ := ret[0].(*eth.IndividualVotesRespond) + ret0, _ := ret[0].(*v1alpha1.IndividualVotesRespond) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -119,14 +119,14 @@ func (mr *MockBeaconChainClientMockRecorder) GetIndividualVotes(arg0, arg1 inter } // GetValidator mocks base method -func (m *MockBeaconChainClient) GetValidator(arg0 context.Context, arg1 *eth.GetValidatorRequest, arg2 ...grpc.CallOption) (*eth.Validator, error) { +func (m *MockBeaconChainClient) GetValidator(arg0 context.Context, arg1 *v1alpha1.GetValidatorRequest, arg2 ...grpc.CallOption) (*v1alpha1.Validator, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetValidator", varargs...) - ret0, _ := ret[0].(*eth.Validator) + ret0, _ := ret[0].(*v1alpha1.Validator) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -139,14 +139,14 @@ func (mr *MockBeaconChainClientMockRecorder) GetValidator(arg0, arg1 interface{} } // GetValidatorActiveSetChanges mocks base method -func (m *MockBeaconChainClient) GetValidatorActiveSetChanges(arg0 context.Context, arg1 *eth.GetValidatorActiveSetChangesRequest, arg2 ...grpc.CallOption) (*eth.ActiveSetChanges, error) { +func (m *MockBeaconChainClient) GetValidatorActiveSetChanges(arg0 context.Context, arg1 *v1alpha1.GetValidatorActiveSetChangesRequest, arg2 ...grpc.CallOption) (*v1alpha1.ActiveSetChanges, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetValidatorActiveSetChanges", varargs...) - ret0, _ := ret[0].(*eth.ActiveSetChanges) + ret0, _ := ret[0].(*v1alpha1.ActiveSetChanges) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -159,14 +159,14 @@ func (mr *MockBeaconChainClientMockRecorder) GetValidatorActiveSetChanges(arg0, } // GetValidatorParticipation mocks base method -func (m *MockBeaconChainClient) GetValidatorParticipation(arg0 context.Context, arg1 *eth.GetValidatorParticipationRequest, arg2 ...grpc.CallOption) (*eth.ValidatorParticipationResponse, error) { +func (m *MockBeaconChainClient) GetValidatorParticipation(arg0 context.Context, arg1 *v1alpha1.GetValidatorParticipationRequest, arg2 ...grpc.CallOption) (*v1alpha1.ValidatorParticipationResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetValidatorParticipation", varargs...) - ret0, _ := ret[0].(*eth.ValidatorParticipationResponse) + ret0, _ := ret[0].(*v1alpha1.ValidatorParticipationResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -179,14 +179,14 @@ func (mr *MockBeaconChainClientMockRecorder) GetValidatorParticipation(arg0, arg } // GetValidatorPerformance mocks base method -func (m *MockBeaconChainClient) GetValidatorPerformance(arg0 context.Context, arg1 *eth.ValidatorPerformanceRequest, arg2 ...grpc.CallOption) (*eth.ValidatorPerformanceResponse, error) { +func (m *MockBeaconChainClient) GetValidatorPerformance(arg0 context.Context, arg1 *v1alpha1.ValidatorPerformanceRequest, arg2 ...grpc.CallOption) (*v1alpha1.ValidatorPerformanceResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetValidatorPerformance", varargs...) - ret0, _ := ret[0].(*eth.ValidatorPerformanceResponse) + ret0, _ := ret[0].(*v1alpha1.ValidatorPerformanceResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -199,14 +199,14 @@ func (mr *MockBeaconChainClientMockRecorder) GetValidatorPerformance(arg0, arg1 } // GetValidatorQueue mocks base method -func (m *MockBeaconChainClient) GetValidatorQueue(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*eth.ValidatorQueue, error) { +func (m *MockBeaconChainClient) GetValidatorQueue(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*v1alpha1.ValidatorQueue, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetValidatorQueue", varargs...) - ret0, _ := ret[0].(*eth.ValidatorQueue) + ret0, _ := ret[0].(*v1alpha1.ValidatorQueue) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -219,14 +219,14 @@ func (mr *MockBeaconChainClientMockRecorder) GetValidatorQueue(arg0, arg1 interf } // GetWeakSubjectivityCheckpoint mocks base method -func (m *MockBeaconChainClient) GetWeakSubjectivityCheckpoint(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*eth.WeakSubjectivityCheckpoint, error) { +func (m *MockBeaconChainClient) GetWeakSubjectivityCheckpoint(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*v1alpha1.WeakSubjectivityCheckpoint, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetWeakSubjectivityCheckpoint", varargs...) - ret0, _ := ret[0].(*eth.WeakSubjectivityCheckpoint) + ret0, _ := ret[0].(*v1alpha1.WeakSubjectivityCheckpoint) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -239,14 +239,14 @@ func (mr *MockBeaconChainClientMockRecorder) GetWeakSubjectivityCheckpoint(arg0, } // ListAttestations mocks base method -func (m *MockBeaconChainClient) ListAttestations(arg0 context.Context, arg1 *eth.ListAttestationsRequest, arg2 ...grpc.CallOption) (*eth.ListAttestationsResponse, error) { +func (m *MockBeaconChainClient) ListAttestations(arg0 context.Context, arg1 *v1alpha1.ListAttestationsRequest, arg2 ...grpc.CallOption) (*v1alpha1.ListAttestationsResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "ListAttestations", varargs...) - ret0, _ := ret[0].(*eth.ListAttestationsResponse) + ret0, _ := ret[0].(*v1alpha1.ListAttestationsResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -259,14 +259,14 @@ func (mr *MockBeaconChainClientMockRecorder) ListAttestations(arg0, arg1 interfa } // ListBeaconCommittees mocks base method -func (m *MockBeaconChainClient) ListBeaconCommittees(arg0 context.Context, arg1 *eth.ListCommitteesRequest, arg2 ...grpc.CallOption) (*eth.BeaconCommittees, error) { +func (m *MockBeaconChainClient) ListBeaconCommittees(arg0 context.Context, arg1 *v1alpha1.ListCommitteesRequest, arg2 ...grpc.CallOption) (*v1alpha1.BeaconCommittees, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "ListBeaconCommittees", varargs...) - ret0, _ := ret[0].(*eth.BeaconCommittees) + ret0, _ := ret[0].(*v1alpha1.BeaconCommittees) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -279,14 +279,14 @@ func (mr *MockBeaconChainClientMockRecorder) ListBeaconCommittees(arg0, arg1 int } // ListBlocks mocks base method -func (m *MockBeaconChainClient) ListBlocks(arg0 context.Context, arg1 *eth.ListBlocksRequest, arg2 ...grpc.CallOption) (*eth.ListBlocksResponse, error) { +func (m *MockBeaconChainClient) ListBlocks(arg0 context.Context, arg1 *v1alpha1.ListBlocksRequest, arg2 ...grpc.CallOption) (*v1alpha1.ListBlocksResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "ListBlocks", varargs...) - ret0, _ := ret[0].(*eth.ListBlocksResponse) + ret0, _ := ret[0].(*v1alpha1.ListBlocksResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -299,14 +299,14 @@ func (mr *MockBeaconChainClientMockRecorder) ListBlocks(arg0, arg1 interface{}, } // ListIndexedAttestations mocks base method -func (m *MockBeaconChainClient) ListIndexedAttestations(arg0 context.Context, arg1 *eth.ListIndexedAttestationsRequest, arg2 ...grpc.CallOption) (*eth.ListIndexedAttestationsResponse, error) { +func (m *MockBeaconChainClient) ListIndexedAttestations(arg0 context.Context, arg1 *v1alpha1.ListIndexedAttestationsRequest, arg2 ...grpc.CallOption) (*v1alpha1.ListIndexedAttestationsResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "ListIndexedAttestations", varargs...) - ret0, _ := ret[0].(*eth.ListIndexedAttestationsResponse) + ret0, _ := ret[0].(*v1alpha1.ListIndexedAttestationsResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -319,14 +319,14 @@ func (mr *MockBeaconChainClientMockRecorder) ListIndexedAttestations(arg0, arg1 } // ListValidatorAssignments mocks base method -func (m *MockBeaconChainClient) ListValidatorAssignments(arg0 context.Context, arg1 *eth.ListValidatorAssignmentsRequest, arg2 ...grpc.CallOption) (*eth.ValidatorAssignments, error) { +func (m *MockBeaconChainClient) ListValidatorAssignments(arg0 context.Context, arg1 *v1alpha1.ListValidatorAssignmentsRequest, arg2 ...grpc.CallOption) (*v1alpha1.ValidatorAssignments, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "ListValidatorAssignments", varargs...) - ret0, _ := ret[0].(*eth.ValidatorAssignments) + ret0, _ := ret[0].(*v1alpha1.ValidatorAssignments) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -339,14 +339,14 @@ func (mr *MockBeaconChainClientMockRecorder) ListValidatorAssignments(arg0, arg1 } // ListValidatorBalances mocks base method -func (m *MockBeaconChainClient) ListValidatorBalances(arg0 context.Context, arg1 *eth.ListValidatorBalancesRequest, arg2 ...grpc.CallOption) (*eth.ValidatorBalances, error) { +func (m *MockBeaconChainClient) ListValidatorBalances(arg0 context.Context, arg1 *v1alpha1.ListValidatorBalancesRequest, arg2 ...grpc.CallOption) (*v1alpha1.ValidatorBalances, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "ListValidatorBalances", varargs...) - ret0, _ := ret[0].(*eth.ValidatorBalances) + ret0, _ := ret[0].(*v1alpha1.ValidatorBalances) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -359,14 +359,14 @@ func (mr *MockBeaconChainClientMockRecorder) ListValidatorBalances(arg0, arg1 in } // ListValidators mocks base method -func (m *MockBeaconChainClient) ListValidators(arg0 context.Context, arg1 *eth.ListValidatorsRequest, arg2 ...grpc.CallOption) (*eth.Validators, error) { +func (m *MockBeaconChainClient) ListValidators(arg0 context.Context, arg1 *v1alpha1.ListValidatorsRequest, arg2 ...grpc.CallOption) (*v1alpha1.Validators, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "ListValidators", varargs...) - ret0, _ := ret[0].(*eth.Validators) + ret0, _ := ret[0].(*v1alpha1.Validators) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -379,14 +379,14 @@ func (mr *MockBeaconChainClientMockRecorder) ListValidators(arg0, arg1 interface } // StreamAttestations mocks base method -func (m *MockBeaconChainClient) StreamAttestations(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (eth.BeaconChain_StreamAttestationsClient, error) { +func (m *MockBeaconChainClient) StreamAttestations(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (v1alpha1.BeaconChain_StreamAttestationsClient, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "StreamAttestations", varargs...) - ret0, _ := ret[0].(eth.BeaconChain_StreamAttestationsClient) + ret0, _ := ret[0].(v1alpha1.BeaconChain_StreamAttestationsClient) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -399,14 +399,14 @@ func (mr *MockBeaconChainClientMockRecorder) StreamAttestations(arg0, arg1 inter } // StreamBlocks mocks base method -func (m *MockBeaconChainClient) StreamBlocks(arg0 context.Context, arg1 *eth.StreamBlocksRequest, arg2 ...grpc.CallOption) (eth.BeaconChain_StreamBlocksClient, error) { +func (m *MockBeaconChainClient) StreamBlocks(arg0 context.Context, arg1 *v1alpha1.StreamBlocksRequest, arg2 ...grpc.CallOption) (v1alpha1.BeaconChain_StreamBlocksClient, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "StreamBlocks", varargs...) - ret0, _ := ret[0].(eth.BeaconChain_StreamBlocksClient) + ret0, _ := ret[0].(v1alpha1.BeaconChain_StreamBlocksClient) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -419,14 +419,14 @@ func (mr *MockBeaconChainClientMockRecorder) StreamBlocks(arg0, arg1 interface{} } // StreamChainHead mocks base method -func (m *MockBeaconChainClient) StreamChainHead(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (eth.BeaconChain_StreamChainHeadClient, error) { +func (m *MockBeaconChainClient) StreamChainHead(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (v1alpha1.BeaconChain_StreamChainHeadClient, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "StreamChainHead", varargs...) - ret0, _ := ret[0].(eth.BeaconChain_StreamChainHeadClient) + ret0, _ := ret[0].(v1alpha1.BeaconChain_StreamChainHeadClient) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -439,14 +439,14 @@ func (mr *MockBeaconChainClientMockRecorder) StreamChainHead(arg0, arg1 interfac } // StreamIndexedAttestations mocks base method -func (m *MockBeaconChainClient) StreamIndexedAttestations(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (eth.BeaconChain_StreamIndexedAttestationsClient, error) { +func (m *MockBeaconChainClient) StreamIndexedAttestations(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (v1alpha1.BeaconChain_StreamIndexedAttestationsClient, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "StreamIndexedAttestations", varargs...) - ret0, _ := ret[0].(eth.BeaconChain_StreamIndexedAttestationsClient) + ret0, _ := ret[0].(v1alpha1.BeaconChain_StreamIndexedAttestationsClient) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -459,14 +459,14 @@ func (mr *MockBeaconChainClientMockRecorder) StreamIndexedAttestations(arg0, arg } // StreamValidatorsInfo mocks base method -func (m *MockBeaconChainClient) StreamValidatorsInfo(arg0 context.Context, arg1 ...grpc.CallOption) (eth.BeaconChain_StreamValidatorsInfoClient, error) { +func (m *MockBeaconChainClient) StreamValidatorsInfo(arg0 context.Context, arg1 ...grpc.CallOption) (v1alpha1.BeaconChain_StreamValidatorsInfoClient, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0} for _, a := range arg1 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "StreamValidatorsInfo", varargs...) - ret0, _ := ret[0].(eth.BeaconChain_StreamValidatorsInfoClient) + ret0, _ := ret[0].(v1alpha1.BeaconChain_StreamValidatorsInfoClient) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -479,14 +479,14 @@ func (mr *MockBeaconChainClientMockRecorder) StreamValidatorsInfo(arg0 interface } // SubmitAttesterSlashing mocks base method -func (m *MockBeaconChainClient) SubmitAttesterSlashing(arg0 context.Context, arg1 *eth.AttesterSlashing, arg2 ...grpc.CallOption) (*eth.SubmitSlashingResponse, error) { +func (m *MockBeaconChainClient) SubmitAttesterSlashing(arg0 context.Context, arg1 *v1alpha1.AttesterSlashing, arg2 ...grpc.CallOption) (*v1alpha1.SubmitSlashingResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "SubmitAttesterSlashing", varargs...) - ret0, _ := ret[0].(*eth.SubmitSlashingResponse) + ret0, _ := ret[0].(*v1alpha1.SubmitSlashingResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -499,14 +499,14 @@ func (mr *MockBeaconChainClientMockRecorder) SubmitAttesterSlashing(arg0, arg1 i } // SubmitProposerSlashing mocks base method -func (m *MockBeaconChainClient) SubmitProposerSlashing(arg0 context.Context, arg1 *eth.ProposerSlashing, arg2 ...grpc.CallOption) (*eth.SubmitSlashingResponse, error) { +func (m *MockBeaconChainClient) SubmitProposerSlashing(arg0 context.Context, arg1 *v1alpha1.ProposerSlashing, arg2 ...grpc.CallOption) (*v1alpha1.SubmitSlashingResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "SubmitProposerSlashing", varargs...) - ret0, _ := ret[0].(*eth.SubmitSlashingResponse) + ret0, _ := ret[0].(*v1alpha1.SubmitSlashingResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -585,10 +585,10 @@ func (mr *MockBeaconChain_StreamChainHeadClientMockRecorder) Header() *gomock.Ca } // Recv mocks base method -func (m *MockBeaconChain_StreamChainHeadClient) Recv() (*eth.ChainHead, error) { +func (m *MockBeaconChain_StreamChainHeadClient) Recv() (*v1alpha1.ChainHead, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Recv") - ret0, _ := ret[0].(*eth.ChainHead) + ret0, _ := ret[0].(*v1alpha1.ChainHead) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -708,10 +708,10 @@ func (mr *MockBeaconChain_StreamAttestationsClientMockRecorder) Header() *gomock } // Recv mocks base method -func (m *MockBeaconChain_StreamAttestationsClient) Recv() (*eth.Attestation, error) { +func (m *MockBeaconChain_StreamAttestationsClient) Recv() (*v1alpha1.Attestation, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Recv") - ret0, _ := ret[0].(*eth.Attestation) + ret0, _ := ret[0].(*v1alpha1.Attestation) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -831,10 +831,10 @@ func (mr *MockBeaconChain_StreamBlocksClientMockRecorder) Header() *gomock.Call } // Recv mocks base method -func (m *MockBeaconChain_StreamBlocksClient) Recv() (*eth.SignedBeaconBlock, error) { +func (m *MockBeaconChain_StreamBlocksClient) Recv() (*v1alpha1.SignedBeaconBlock, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Recv") - ret0, _ := ret[0].(*eth.SignedBeaconBlock) + ret0, _ := ret[0].(*v1alpha1.SignedBeaconBlock) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -954,10 +954,10 @@ func (mr *MockBeaconChain_StreamValidatorsInfoClientMockRecorder) Header() *gomo } // Recv mocks base method -func (m *MockBeaconChain_StreamValidatorsInfoClient) Recv() (*eth.ValidatorInfo, error) { +func (m *MockBeaconChain_StreamValidatorsInfoClient) Recv() (*v1alpha1.ValidatorInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Recv") - ret0, _ := ret[0].(*eth.ValidatorInfo) + ret0, _ := ret[0].(*v1alpha1.ValidatorInfo) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -983,7 +983,7 @@ func (mr *MockBeaconChain_StreamValidatorsInfoClientMockRecorder) RecvMsg(arg0 i } // Send mocks base method -func (m *MockBeaconChain_StreamValidatorsInfoClient) Send(arg0 *eth.ValidatorChangeSet) error { +func (m *MockBeaconChain_StreamValidatorsInfoClient) Send(arg0 *v1alpha1.ValidatorChangeSet) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Send", arg0) ret0, _ := ret[0].(error) @@ -1091,10 +1091,10 @@ func (mr *MockBeaconChain_StreamIndexedAttestationsClientMockRecorder) Header() } // Recv mocks base method -func (m *MockBeaconChain_StreamIndexedAttestationsClient) Recv() (*eth.IndexedAttestation, error) { +func (m *MockBeaconChain_StreamIndexedAttestationsClient) Recv() (*v1alpha1.IndexedAttestation, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Recv") - ret0, _ := ret[0].(*eth.IndexedAttestation) + ret0, _ := ret[0].(*v1alpha1.IndexedAttestation) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/shared/mock/beacon_validator_client_mock.go b/shared/mock/beacon_validator_client_mock.go index 780ff407bc81..7c8cfbecee77 100644 --- a/shared/mock/beacon_validator_client_mock.go +++ b/shared/mock/beacon_validator_client_mock.go @@ -9,7 +9,7 @@ import ( reflect "reflect" gomock "github.com/golang/mock/gomock" - eth "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" + v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" grpc "google.golang.org/grpc" metadata "google.golang.org/grpc/metadata" emptypb "google.golang.org/protobuf/types/known/emptypb" @@ -38,15 +38,35 @@ func (m *MockBeaconNodeValidatorClient) EXPECT() *MockBeaconNodeValidatorClientM return m.recorder } +// CheckDoppelGanger mocks base method +func (m *MockBeaconNodeValidatorClient) CheckDoppelGanger(arg0 context.Context, arg1 *v1alpha1.DoppelGangerRequest, arg2 ...grpc.CallOption) (*v1alpha1.DoppelGangerResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "CheckDoppelGanger", varargs...) + ret0, _ := ret[0].(*v1alpha1.DoppelGangerResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CheckDoppelGanger indicates an expected call of CheckDoppelGanger +func (mr *MockBeaconNodeValidatorClientMockRecorder) CheckDoppelGanger(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, "CheckDoppelGanger", reflect.TypeOf((*MockBeaconNodeValidatorClient)(nil).CheckDoppelGanger), varargs...) +} + // DomainData mocks base method -func (m *MockBeaconNodeValidatorClient) DomainData(arg0 context.Context, arg1 *eth.DomainRequest, arg2 ...grpc.CallOption) (*eth.DomainResponse, error) { +func (m *MockBeaconNodeValidatorClient) DomainData(arg0 context.Context, arg1 *v1alpha1.DomainRequest, arg2 ...grpc.CallOption) (*v1alpha1.DomainResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "DomainData", varargs...) - ret0, _ := ret[0].(*eth.DomainResponse) + ret0, _ := ret[0].(*v1alpha1.DomainResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -59,14 +79,14 @@ func (mr *MockBeaconNodeValidatorClientMockRecorder) DomainData(arg0, arg1 inter } // GetAttestationData mocks base method -func (m *MockBeaconNodeValidatorClient) GetAttestationData(arg0 context.Context, arg1 *eth.AttestationDataRequest, arg2 ...grpc.CallOption) (*eth.AttestationData, error) { +func (m *MockBeaconNodeValidatorClient) GetAttestationData(arg0 context.Context, arg1 *v1alpha1.AttestationDataRequest, arg2 ...grpc.CallOption) (*v1alpha1.AttestationData, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetAttestationData", varargs...) - ret0, _ := ret[0].(*eth.AttestationData) + ret0, _ := ret[0].(*v1alpha1.AttestationData) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -79,14 +99,14 @@ func (mr *MockBeaconNodeValidatorClientMockRecorder) GetAttestationData(arg0, ar } // GetBlock mocks base method -func (m *MockBeaconNodeValidatorClient) GetBlock(arg0 context.Context, arg1 *eth.BlockRequest, arg2 ...grpc.CallOption) (*eth.BeaconBlock, error) { +func (m *MockBeaconNodeValidatorClient) GetBlock(arg0 context.Context, arg1 *v1alpha1.BlockRequest, arg2 ...grpc.CallOption) (*v1alpha1.BeaconBlock, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetBlock", varargs...) - ret0, _ := ret[0].(*eth.BeaconBlock) + ret0, _ := ret[0].(*v1alpha1.BeaconBlock) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -99,14 +119,14 @@ func (mr *MockBeaconNodeValidatorClientMockRecorder) GetBlock(arg0, arg1 interfa } // GetDuties mocks base method -func (m *MockBeaconNodeValidatorClient) GetDuties(arg0 context.Context, arg1 *eth.DutiesRequest, arg2 ...grpc.CallOption) (*eth.DutiesResponse, error) { +func (m *MockBeaconNodeValidatorClient) GetDuties(arg0 context.Context, arg1 *v1alpha1.DutiesRequest, arg2 ...grpc.CallOption) (*v1alpha1.DutiesResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetDuties", varargs...) - ret0, _ := ret[0].(*eth.DutiesResponse) + ret0, _ := ret[0].(*v1alpha1.DutiesResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -119,14 +139,14 @@ func (mr *MockBeaconNodeValidatorClientMockRecorder) GetDuties(arg0, arg1 interf } // MultipleValidatorStatus mocks base method -func (m *MockBeaconNodeValidatorClient) MultipleValidatorStatus(arg0 context.Context, arg1 *eth.MultipleValidatorStatusRequest, arg2 ...grpc.CallOption) (*eth.MultipleValidatorStatusResponse, error) { +func (m *MockBeaconNodeValidatorClient) MultipleValidatorStatus(arg0 context.Context, arg1 *v1alpha1.MultipleValidatorStatusRequest, arg2 ...grpc.CallOption) (*v1alpha1.MultipleValidatorStatusResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "MultipleValidatorStatus", varargs...) - ret0, _ := ret[0].(*eth.MultipleValidatorStatusResponse) + ret0, _ := ret[0].(*v1alpha1.MultipleValidatorStatusResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -139,14 +159,14 @@ func (mr *MockBeaconNodeValidatorClientMockRecorder) MultipleValidatorStatus(arg } // ProposeAttestation mocks base method -func (m *MockBeaconNodeValidatorClient) ProposeAttestation(arg0 context.Context, arg1 *eth.Attestation, arg2 ...grpc.CallOption) (*eth.AttestResponse, error) { +func (m *MockBeaconNodeValidatorClient) ProposeAttestation(arg0 context.Context, arg1 *v1alpha1.Attestation, arg2 ...grpc.CallOption) (*v1alpha1.AttestResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "ProposeAttestation", varargs...) - ret0, _ := ret[0].(*eth.AttestResponse) + ret0, _ := ret[0].(*v1alpha1.AttestResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -159,14 +179,14 @@ func (mr *MockBeaconNodeValidatorClientMockRecorder) ProposeAttestation(arg0, ar } // ProposeBlock mocks base method -func (m *MockBeaconNodeValidatorClient) ProposeBlock(arg0 context.Context, arg1 *eth.SignedBeaconBlock, arg2 ...grpc.CallOption) (*eth.ProposeResponse, error) { +func (m *MockBeaconNodeValidatorClient) ProposeBlock(arg0 context.Context, arg1 *v1alpha1.SignedBeaconBlock, arg2 ...grpc.CallOption) (*v1alpha1.ProposeResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "ProposeBlock", varargs...) - ret0, _ := ret[0].(*eth.ProposeResponse) + ret0, _ := ret[0].(*v1alpha1.ProposeResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -179,14 +199,14 @@ func (mr *MockBeaconNodeValidatorClientMockRecorder) ProposeBlock(arg0, arg1 int } // ProposeExit mocks base method -func (m *MockBeaconNodeValidatorClient) ProposeExit(arg0 context.Context, arg1 *eth.SignedVoluntaryExit, arg2 ...grpc.CallOption) (*eth.ProposeExitResponse, error) { +func (m *MockBeaconNodeValidatorClient) ProposeExit(arg0 context.Context, arg1 *v1alpha1.SignedVoluntaryExit, arg2 ...grpc.CallOption) (*v1alpha1.ProposeExitResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "ProposeExit", varargs...) - ret0, _ := ret[0].(*eth.ProposeExitResponse) + ret0, _ := ret[0].(*v1alpha1.ProposeExitResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -199,14 +219,14 @@ func (mr *MockBeaconNodeValidatorClientMockRecorder) ProposeExit(arg0, arg1 inte } // StreamDuties mocks base method -func (m *MockBeaconNodeValidatorClient) StreamDuties(arg0 context.Context, arg1 *eth.DutiesRequest, arg2 ...grpc.CallOption) (eth.BeaconNodeValidator_StreamDutiesClient, error) { +func (m *MockBeaconNodeValidatorClient) StreamDuties(arg0 context.Context, arg1 *v1alpha1.DutiesRequest, arg2 ...grpc.CallOption) (v1alpha1.BeaconNodeValidator_StreamDutiesClient, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "StreamDuties", varargs...) - ret0, _ := ret[0].(eth.BeaconNodeValidator_StreamDutiesClient) + ret0, _ := ret[0].(v1alpha1.BeaconNodeValidator_StreamDutiesClient) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -219,14 +239,14 @@ func (mr *MockBeaconNodeValidatorClientMockRecorder) StreamDuties(arg0, arg1 int } // SubmitAggregateSelectionProof mocks base method -func (m *MockBeaconNodeValidatorClient) SubmitAggregateSelectionProof(arg0 context.Context, arg1 *eth.AggregateSelectionRequest, arg2 ...grpc.CallOption) (*eth.AggregateSelectionResponse, error) { +func (m *MockBeaconNodeValidatorClient) SubmitAggregateSelectionProof(arg0 context.Context, arg1 *v1alpha1.AggregateSelectionRequest, arg2 ...grpc.CallOption) (*v1alpha1.AggregateSelectionResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "SubmitAggregateSelectionProof", varargs...) - ret0, _ := ret[0].(*eth.AggregateSelectionResponse) + ret0, _ := ret[0].(*v1alpha1.AggregateSelectionResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -239,14 +259,14 @@ func (mr *MockBeaconNodeValidatorClientMockRecorder) SubmitAggregateSelectionPro } // SubmitSignedAggregateSelectionProof mocks base method -func (m *MockBeaconNodeValidatorClient) SubmitSignedAggregateSelectionProof(arg0 context.Context, arg1 *eth.SignedAggregateSubmitRequest, arg2 ...grpc.CallOption) (*eth.SignedAggregateSubmitResponse, error) { +func (m *MockBeaconNodeValidatorClient) SubmitSignedAggregateSelectionProof(arg0 context.Context, arg1 *v1alpha1.SignedAggregateSubmitRequest, arg2 ...grpc.CallOption) (*v1alpha1.SignedAggregateSubmitResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "SubmitSignedAggregateSelectionProof", varargs...) - ret0, _ := ret[0].(*eth.SignedAggregateSubmitResponse) + ret0, _ := ret[0].(*v1alpha1.SignedAggregateSubmitResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -259,7 +279,7 @@ func (mr *MockBeaconNodeValidatorClientMockRecorder) SubmitSignedAggregateSelect } // SubscribeCommitteeSubnets mocks base method -func (m *MockBeaconNodeValidatorClient) SubscribeCommitteeSubnets(arg0 context.Context, arg1 *eth.CommitteeSubnetsSubscribeRequest, arg2 ...grpc.CallOption) (*emptypb.Empty, error) { +func (m *MockBeaconNodeValidatorClient) SubscribeCommitteeSubnets(arg0 context.Context, arg1 *v1alpha1.CommitteeSubnetsSubscribeRequest, arg2 ...grpc.CallOption) (*emptypb.Empty, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { @@ -279,14 +299,14 @@ func (mr *MockBeaconNodeValidatorClientMockRecorder) SubscribeCommitteeSubnets(a } // ValidatorIndex mocks base method -func (m *MockBeaconNodeValidatorClient) ValidatorIndex(arg0 context.Context, arg1 *eth.ValidatorIndexRequest, arg2 ...grpc.CallOption) (*eth.ValidatorIndexResponse, error) { +func (m *MockBeaconNodeValidatorClient) ValidatorIndex(arg0 context.Context, arg1 *v1alpha1.ValidatorIndexRequest, arg2 ...grpc.CallOption) (*v1alpha1.ValidatorIndexResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "ValidatorIndex", varargs...) - ret0, _ := ret[0].(*eth.ValidatorIndexResponse) + ret0, _ := ret[0].(*v1alpha1.ValidatorIndexResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -299,14 +319,14 @@ func (mr *MockBeaconNodeValidatorClientMockRecorder) ValidatorIndex(arg0, arg1 i } // ValidatorStatus mocks base method -func (m *MockBeaconNodeValidatorClient) ValidatorStatus(arg0 context.Context, arg1 *eth.ValidatorStatusRequest, arg2 ...grpc.CallOption) (*eth.ValidatorStatusResponse, error) { +func (m *MockBeaconNodeValidatorClient) ValidatorStatus(arg0 context.Context, arg1 *v1alpha1.ValidatorStatusRequest, arg2 ...grpc.CallOption) (*v1alpha1.ValidatorStatusResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "ValidatorStatus", varargs...) - ret0, _ := ret[0].(*eth.ValidatorStatusResponse) + ret0, _ := ret[0].(*v1alpha1.ValidatorStatusResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -319,14 +339,14 @@ func (mr *MockBeaconNodeValidatorClientMockRecorder) ValidatorStatus(arg0, arg1 } // WaitForActivation mocks base method -func (m *MockBeaconNodeValidatorClient) WaitForActivation(arg0 context.Context, arg1 *eth.ValidatorActivationRequest, arg2 ...grpc.CallOption) (eth.BeaconNodeValidator_WaitForActivationClient, error) { +func (m *MockBeaconNodeValidatorClient) WaitForActivation(arg0 context.Context, arg1 *v1alpha1.ValidatorActivationRequest, arg2 ...grpc.CallOption) (v1alpha1.BeaconNodeValidator_WaitForActivationClient, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "WaitForActivation", varargs...) - ret0, _ := ret[0].(eth.BeaconNodeValidator_WaitForActivationClient) + ret0, _ := ret[0].(v1alpha1.BeaconNodeValidator_WaitForActivationClient) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -339,14 +359,14 @@ func (mr *MockBeaconNodeValidatorClientMockRecorder) WaitForActivation(arg0, arg } // WaitForChainStart mocks base method -func (m *MockBeaconNodeValidatorClient) WaitForChainStart(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (eth.BeaconNodeValidator_WaitForChainStartClient, error) { +func (m *MockBeaconNodeValidatorClient) WaitForChainStart(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (v1alpha1.BeaconNodeValidator_WaitForChainStartClient, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "WaitForChainStart", varargs...) - ret0, _ := ret[0].(eth.BeaconNodeValidator_WaitForChainStartClient) + ret0, _ := ret[0].(v1alpha1.BeaconNodeValidator_WaitForChainStartClient) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -425,10 +445,10 @@ func (mr *MockBeaconNodeValidator_WaitForChainStartClientMockRecorder) Header() } // Recv mocks base method -func (m *MockBeaconNodeValidator_WaitForChainStartClient) Recv() (*eth.ChainStartResponse, error) { +func (m *MockBeaconNodeValidator_WaitForChainStartClient) Recv() (*v1alpha1.ChainStartResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Recv") - ret0, _ := ret[0].(*eth.ChainStartResponse) + ret0, _ := ret[0].(*v1alpha1.ChainStartResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -548,10 +568,10 @@ func (mr *MockBeaconNodeValidator_WaitForActivationClientMockRecorder) Header() } // Recv mocks base method -func (m *MockBeaconNodeValidator_WaitForActivationClient) Recv() (*eth.ValidatorActivationResponse, error) { +func (m *MockBeaconNodeValidator_WaitForActivationClient) Recv() (*v1alpha1.ValidatorActivationResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Recv") - ret0, _ := ret[0].(*eth.ValidatorActivationResponse) + ret0, _ := ret[0].(*v1alpha1.ValidatorActivationResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -671,10 +691,10 @@ func (mr *MockBeaconNodeValidator_StreamDutiesClientMockRecorder) Header() *gomo } // Recv mocks base method -func (m *MockBeaconNodeValidator_StreamDutiesClient) Recv() (*eth.DutiesResponse, error) { +func (m *MockBeaconNodeValidator_StreamDutiesClient) Recv() (*v1alpha1.DutiesResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Recv") - ret0, _ := ret[0].(*eth.DutiesResponse) + ret0, _ := ret[0].(*v1alpha1.DutiesResponse) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/shared/mock/beacon_validator_server_mock.go b/shared/mock/beacon_validator_server_mock.go index 297378cc21ff..0822b7af2989 100644 --- a/shared/mock/beacon_validator_server_mock.go +++ b/shared/mock/beacon_validator_server_mock.go @@ -9,7 +9,7 @@ import ( reflect "reflect" gomock "github.com/golang/mock/gomock" - eth "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" + v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" metadata "google.golang.org/grpc/metadata" emptypb "google.golang.org/protobuf/types/known/emptypb" ) @@ -37,11 +37,26 @@ func (m *MockBeaconNodeValidatorServer) EXPECT() *MockBeaconNodeValidatorServerM return m.recorder } +// CheckDoppelGanger mocks base method +func (m *MockBeaconNodeValidatorServer) CheckDoppelGanger(arg0 context.Context, arg1 *v1alpha1.DoppelGangerRequest) (*v1alpha1.DoppelGangerResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckDoppelGanger", arg0, arg1) + ret0, _ := ret[0].(*v1alpha1.DoppelGangerResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CheckDoppelGanger indicates an expected call of CheckDoppelGanger +func (mr *MockBeaconNodeValidatorServerMockRecorder) CheckDoppelGanger(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckDoppelGanger", reflect.TypeOf((*MockBeaconNodeValidatorServer)(nil).CheckDoppelGanger), arg0, arg1) +} + // DomainData mocks base method -func (m *MockBeaconNodeValidatorServer) DomainData(arg0 context.Context, arg1 *eth.DomainRequest) (*eth.DomainResponse, error) { +func (m *MockBeaconNodeValidatorServer) DomainData(arg0 context.Context, arg1 *v1alpha1.DomainRequest) (*v1alpha1.DomainResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DomainData", arg0, arg1) - ret0, _ := ret[0].(*eth.DomainResponse) + ret0, _ := ret[0].(*v1alpha1.DomainResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -53,10 +68,10 @@ func (mr *MockBeaconNodeValidatorServerMockRecorder) DomainData(arg0, arg1 inter } // GetAttestationData mocks base method -func (m *MockBeaconNodeValidatorServer) GetAttestationData(arg0 context.Context, arg1 *eth.AttestationDataRequest) (*eth.AttestationData, error) { +func (m *MockBeaconNodeValidatorServer) GetAttestationData(arg0 context.Context, arg1 *v1alpha1.AttestationDataRequest) (*v1alpha1.AttestationData, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetAttestationData", arg0, arg1) - ret0, _ := ret[0].(*eth.AttestationData) + ret0, _ := ret[0].(*v1alpha1.AttestationData) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -68,10 +83,10 @@ func (mr *MockBeaconNodeValidatorServerMockRecorder) GetAttestationData(arg0, ar } // GetBlock mocks base method -func (m *MockBeaconNodeValidatorServer) GetBlock(arg0 context.Context, arg1 *eth.BlockRequest) (*eth.BeaconBlock, error) { +func (m *MockBeaconNodeValidatorServer) GetBlock(arg0 context.Context, arg1 *v1alpha1.BlockRequest) (*v1alpha1.BeaconBlock, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBlock", arg0, arg1) - ret0, _ := ret[0].(*eth.BeaconBlock) + ret0, _ := ret[0].(*v1alpha1.BeaconBlock) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -83,10 +98,10 @@ func (mr *MockBeaconNodeValidatorServerMockRecorder) GetBlock(arg0, arg1 interfa } // GetDuties mocks base method -func (m *MockBeaconNodeValidatorServer) GetDuties(arg0 context.Context, arg1 *eth.DutiesRequest) (*eth.DutiesResponse, error) { +func (m *MockBeaconNodeValidatorServer) GetDuties(arg0 context.Context, arg1 *v1alpha1.DutiesRequest) (*v1alpha1.DutiesResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetDuties", arg0, arg1) - ret0, _ := ret[0].(*eth.DutiesResponse) + ret0, _ := ret[0].(*v1alpha1.DutiesResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -98,10 +113,10 @@ func (mr *MockBeaconNodeValidatorServerMockRecorder) GetDuties(arg0, arg1 interf } // MultipleValidatorStatus mocks base method -func (m *MockBeaconNodeValidatorServer) MultipleValidatorStatus(arg0 context.Context, arg1 *eth.MultipleValidatorStatusRequest) (*eth.MultipleValidatorStatusResponse, error) { +func (m *MockBeaconNodeValidatorServer) MultipleValidatorStatus(arg0 context.Context, arg1 *v1alpha1.MultipleValidatorStatusRequest) (*v1alpha1.MultipleValidatorStatusResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MultipleValidatorStatus", arg0, arg1) - ret0, _ := ret[0].(*eth.MultipleValidatorStatusResponse) + ret0, _ := ret[0].(*v1alpha1.MultipleValidatorStatusResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -113,10 +128,10 @@ func (mr *MockBeaconNodeValidatorServerMockRecorder) MultipleValidatorStatus(arg } // ProposeAttestation mocks base method -func (m *MockBeaconNodeValidatorServer) ProposeAttestation(arg0 context.Context, arg1 *eth.Attestation) (*eth.AttestResponse, error) { +func (m *MockBeaconNodeValidatorServer) ProposeAttestation(arg0 context.Context, arg1 *v1alpha1.Attestation) (*v1alpha1.AttestResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ProposeAttestation", arg0, arg1) - ret0, _ := ret[0].(*eth.AttestResponse) + ret0, _ := ret[0].(*v1alpha1.AttestResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -128,10 +143,10 @@ func (mr *MockBeaconNodeValidatorServerMockRecorder) ProposeAttestation(arg0, ar } // ProposeBlock mocks base method -func (m *MockBeaconNodeValidatorServer) ProposeBlock(arg0 context.Context, arg1 *eth.SignedBeaconBlock) (*eth.ProposeResponse, error) { +func (m *MockBeaconNodeValidatorServer) ProposeBlock(arg0 context.Context, arg1 *v1alpha1.SignedBeaconBlock) (*v1alpha1.ProposeResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ProposeBlock", arg0, arg1) - ret0, _ := ret[0].(*eth.ProposeResponse) + ret0, _ := ret[0].(*v1alpha1.ProposeResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -143,10 +158,10 @@ func (mr *MockBeaconNodeValidatorServerMockRecorder) ProposeBlock(arg0, arg1 int } // ProposeExit mocks base method -func (m *MockBeaconNodeValidatorServer) ProposeExit(arg0 context.Context, arg1 *eth.SignedVoluntaryExit) (*eth.ProposeExitResponse, error) { +func (m *MockBeaconNodeValidatorServer) ProposeExit(arg0 context.Context, arg1 *v1alpha1.SignedVoluntaryExit) (*v1alpha1.ProposeExitResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ProposeExit", arg0, arg1) - ret0, _ := ret[0].(*eth.ProposeExitResponse) + ret0, _ := ret[0].(*v1alpha1.ProposeExitResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -158,7 +173,7 @@ func (mr *MockBeaconNodeValidatorServerMockRecorder) ProposeExit(arg0, arg1 inte } // StreamDuties mocks base method -func (m *MockBeaconNodeValidatorServer) StreamDuties(arg0 *eth.DutiesRequest, arg1 eth.BeaconNodeValidator_StreamDutiesServer) error { +func (m *MockBeaconNodeValidatorServer) StreamDuties(arg0 *v1alpha1.DutiesRequest, arg1 v1alpha1.BeaconNodeValidator_StreamDutiesServer) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "StreamDuties", arg0, arg1) ret0, _ := ret[0].(error) @@ -172,10 +187,10 @@ func (mr *MockBeaconNodeValidatorServerMockRecorder) StreamDuties(arg0, arg1 int } // SubmitAggregateSelectionProof mocks base method -func (m *MockBeaconNodeValidatorServer) SubmitAggregateSelectionProof(arg0 context.Context, arg1 *eth.AggregateSelectionRequest) (*eth.AggregateSelectionResponse, error) { +func (m *MockBeaconNodeValidatorServer) SubmitAggregateSelectionProof(arg0 context.Context, arg1 *v1alpha1.AggregateSelectionRequest) (*v1alpha1.AggregateSelectionResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SubmitAggregateSelectionProof", arg0, arg1) - ret0, _ := ret[0].(*eth.AggregateSelectionResponse) + ret0, _ := ret[0].(*v1alpha1.AggregateSelectionResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -187,10 +202,10 @@ func (mr *MockBeaconNodeValidatorServerMockRecorder) SubmitAggregateSelectionPro } // SubmitSignedAggregateSelectionProof mocks base method -func (m *MockBeaconNodeValidatorServer) SubmitSignedAggregateSelectionProof(arg0 context.Context, arg1 *eth.SignedAggregateSubmitRequest) (*eth.SignedAggregateSubmitResponse, error) { +func (m *MockBeaconNodeValidatorServer) SubmitSignedAggregateSelectionProof(arg0 context.Context, arg1 *v1alpha1.SignedAggregateSubmitRequest) (*v1alpha1.SignedAggregateSubmitResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SubmitSignedAggregateSelectionProof", arg0, arg1) - ret0, _ := ret[0].(*eth.SignedAggregateSubmitResponse) + ret0, _ := ret[0].(*v1alpha1.SignedAggregateSubmitResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -202,7 +217,7 @@ func (mr *MockBeaconNodeValidatorServerMockRecorder) SubmitSignedAggregateSelect } // SubscribeCommitteeSubnets mocks base method -func (m *MockBeaconNodeValidatorServer) SubscribeCommitteeSubnets(arg0 context.Context, arg1 *eth.CommitteeSubnetsSubscribeRequest) (*emptypb.Empty, error) { +func (m *MockBeaconNodeValidatorServer) SubscribeCommitteeSubnets(arg0 context.Context, arg1 *v1alpha1.CommitteeSubnetsSubscribeRequest) (*emptypb.Empty, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SubscribeCommitteeSubnets", arg0, arg1) ret0, _ := ret[0].(*emptypb.Empty) @@ -217,10 +232,10 @@ func (mr *MockBeaconNodeValidatorServerMockRecorder) SubscribeCommitteeSubnets(a } // ValidatorIndex mocks base method -func (m *MockBeaconNodeValidatorServer) ValidatorIndex(arg0 context.Context, arg1 *eth.ValidatorIndexRequest) (*eth.ValidatorIndexResponse, error) { +func (m *MockBeaconNodeValidatorServer) ValidatorIndex(arg0 context.Context, arg1 *v1alpha1.ValidatorIndexRequest) (*v1alpha1.ValidatorIndexResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ValidatorIndex", arg0, arg1) - ret0, _ := ret[0].(*eth.ValidatorIndexResponse) + ret0, _ := ret[0].(*v1alpha1.ValidatorIndexResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -232,10 +247,10 @@ func (mr *MockBeaconNodeValidatorServerMockRecorder) ValidatorIndex(arg0, arg1 i } // ValidatorStatus mocks base method -func (m *MockBeaconNodeValidatorServer) ValidatorStatus(arg0 context.Context, arg1 *eth.ValidatorStatusRequest) (*eth.ValidatorStatusResponse, error) { +func (m *MockBeaconNodeValidatorServer) ValidatorStatus(arg0 context.Context, arg1 *v1alpha1.ValidatorStatusRequest) (*v1alpha1.ValidatorStatusResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ValidatorStatus", arg0, arg1) - ret0, _ := ret[0].(*eth.ValidatorStatusResponse) + ret0, _ := ret[0].(*v1alpha1.ValidatorStatusResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -247,7 +262,7 @@ func (mr *MockBeaconNodeValidatorServerMockRecorder) ValidatorStatus(arg0, arg1 } // WaitForActivation mocks base method -func (m *MockBeaconNodeValidatorServer) WaitForActivation(arg0 *eth.ValidatorActivationRequest, arg1 eth.BeaconNodeValidator_WaitForActivationServer) error { +func (m *MockBeaconNodeValidatorServer) WaitForActivation(arg0 *v1alpha1.ValidatorActivationRequest, arg1 v1alpha1.BeaconNodeValidator_WaitForActivationServer) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WaitForActivation", arg0, arg1) ret0, _ := ret[0].(error) @@ -261,7 +276,7 @@ func (mr *MockBeaconNodeValidatorServerMockRecorder) WaitForActivation(arg0, arg } // WaitForChainStart mocks base method -func (m *MockBeaconNodeValidatorServer) WaitForChainStart(arg0 *emptypb.Empty, arg1 eth.BeaconNodeValidator_WaitForChainStartServer) error { +func (m *MockBeaconNodeValidatorServer) WaitForChainStart(arg0 *emptypb.Empty, arg1 v1alpha1.BeaconNodeValidator_WaitForChainStartServer) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WaitForChainStart", arg0, arg1) ret0, _ := ret[0].(error) @@ -274,18 +289,6 @@ func (mr *MockBeaconNodeValidatorServerMockRecorder) WaitForChainStart(arg0, arg return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WaitForChainStart", reflect.TypeOf((*MockBeaconNodeValidatorServer)(nil).WaitForChainStart), arg0, arg1) } -// mustEmbedUnimplementedBeaconNodeValidatorServer mocks base method -func (m *MockBeaconNodeValidatorServer) mustEmbedUnimplementedBeaconNodeValidatorServer() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "mustEmbedUnimplementedBeaconNodeValidatorServer") -} - -// mustEmbedUnimplementedBeaconNodeValidatorServer indicates an expected call of mustEmbedUnimplementedBeaconNodeValidatorServer -func (mr *MockBeaconNodeValidatorServerMockRecorder) mustEmbedUnimplementedBeaconNodeValidatorServer() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "mustEmbedUnimplementedBeaconNodeValidatorServer", reflect.TypeOf((*MockBeaconNodeValidatorServer)(nil).mustEmbedUnimplementedBeaconNodeValidatorServer)) -} - // MockBeaconNodeValidator_WaitForActivationServer is a mock of BeaconNodeValidator_WaitForActivationServer interface type MockBeaconNodeValidator_WaitForActivationServer struct { ctrl *gomock.Controller @@ -338,7 +341,7 @@ func (mr *MockBeaconNodeValidator_WaitForActivationServerMockRecorder) RecvMsg(a } // Send mocks base method -func (m *MockBeaconNodeValidator_WaitForActivationServer) Send(arg0 *eth.ValidatorActivationResponse) error { +func (m *MockBeaconNodeValidator_WaitForActivationServer) Send(arg0 *v1alpha1.ValidatorActivationResponse) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Send", arg0) ret0, _ := ret[0].(error) @@ -457,7 +460,7 @@ func (mr *MockBeaconNodeValidator_WaitForChainStartServerMockRecorder) RecvMsg(a } // Send mocks base method -func (m *MockBeaconNodeValidator_WaitForChainStartServer) Send(arg0 *eth.ChainStartResponse) error { +func (m *MockBeaconNodeValidator_WaitForChainStartServer) Send(arg0 *v1alpha1.ChainStartResponse) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Send", arg0) ret0, _ := ret[0].(error) @@ -576,7 +579,7 @@ func (mr *MockBeaconNodeValidator_StreamDutiesServerMockRecorder) RecvMsg(arg0 i } // Send mocks base method -func (m *MockBeaconNodeValidator_StreamDutiesServer) Send(arg0 *eth.DutiesResponse) error { +func (m *MockBeaconNodeValidator_StreamDutiesServer) Send(arg0 *v1alpha1.DutiesResponse) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Send", arg0) ret0, _ := ret[0].(error) diff --git a/shared/mock/keymanager_mock.go b/shared/mock/keymanager_mock.go index 3f8d33d5c165..01c108e11042 100644 --- a/shared/mock/keymanager_mock.go +++ b/shared/mock/keymanager_mock.go @@ -9,7 +9,7 @@ import ( reflect "reflect" gomock "github.com/golang/mock/gomock" - ethereum_validator_accounts_v2 "github.com/prysmaticlabs/prysm/proto/validator/accounts/v2" + v2 "github.com/prysmaticlabs/prysm/proto/validator/accounts/v2" grpc "google.golang.org/grpc" emptypb "google.golang.org/protobuf/types/known/emptypb" ) @@ -38,14 +38,14 @@ func (m *MockRemoteSignerClient) EXPECT() *MockRemoteSignerClientMockRecorder { } // ListValidatingPublicKeys mocks base method -func (m *MockRemoteSignerClient) ListValidatingPublicKeys(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*ethereum_validator_accounts_v2.ListPublicKeysResponse, error) { +func (m *MockRemoteSignerClient) ListValidatingPublicKeys(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*v2.ListPublicKeysResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "ListValidatingPublicKeys", varargs...) - ret0, _ := ret[0].(*ethereum_validator_accounts_v2.ListPublicKeysResponse) + ret0, _ := ret[0].(*v2.ListPublicKeysResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -58,14 +58,14 @@ func (mr *MockRemoteSignerClientMockRecorder) ListValidatingPublicKeys(arg0, arg } // Sign mocks base method -func (m *MockRemoteSignerClient) Sign(arg0 context.Context, arg1 *ethereum_validator_accounts_v2.SignRequest, arg2 ...grpc.CallOption) (*ethereum_validator_accounts_v2.SignResponse, error) { +func (m *MockRemoteSignerClient) Sign(arg0 context.Context, arg1 *v2.SignRequest, arg2 ...grpc.CallOption) (*v2.SignResponse, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "Sign", varargs...) - ret0, _ := ret[0].(*ethereum_validator_accounts_v2.SignResponse) + ret0, _ := ret[0].(*v2.SignResponse) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/shared/mock/node_service_mock.go b/shared/mock/node_service_mock.go index e563f2a38b43..b46751f469c2 100644 --- a/shared/mock/node_service_mock.go +++ b/shared/mock/node_service_mock.go @@ -9,7 +9,7 @@ import ( reflect "reflect" gomock "github.com/golang/mock/gomock" - eth "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" + v1alpha1 "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" grpc "google.golang.org/grpc" emptypb "google.golang.org/protobuf/types/known/emptypb" ) @@ -38,14 +38,14 @@ func (m *MockNodeClient) EXPECT() *MockNodeClientMockRecorder { } // GetGenesis mocks base method -func (m *MockNodeClient) GetGenesis(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*eth.Genesis, error) { +func (m *MockNodeClient) GetGenesis(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*v1alpha1.Genesis, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetGenesis", varargs...) - ret0, _ := ret[0].(*eth.Genesis) + ret0, _ := ret[0].(*v1alpha1.Genesis) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -58,14 +58,14 @@ func (mr *MockNodeClientMockRecorder) GetGenesis(arg0, arg1 interface{}, arg2 .. } // GetHost mocks base method -func (m *MockNodeClient) GetHost(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*eth.HostData, error) { +func (m *MockNodeClient) GetHost(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*v1alpha1.HostData, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetHost", varargs...) - ret0, _ := ret[0].(*eth.HostData) + ret0, _ := ret[0].(*v1alpha1.HostData) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -78,14 +78,14 @@ func (mr *MockNodeClientMockRecorder) GetHost(arg0, arg1 interface{}, arg2 ...in } // GetPeer mocks base method -func (m *MockNodeClient) GetPeer(arg0 context.Context, arg1 *eth.PeerRequest, arg2 ...grpc.CallOption) (*eth.Peer, error) { +func (m *MockNodeClient) GetPeer(arg0 context.Context, arg1 *v1alpha1.PeerRequest, arg2 ...grpc.CallOption) (*v1alpha1.Peer, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetPeer", varargs...) - ret0, _ := ret[0].(*eth.Peer) + ret0, _ := ret[0].(*v1alpha1.Peer) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -98,14 +98,14 @@ func (mr *MockNodeClientMockRecorder) GetPeer(arg0, arg1 interface{}, arg2 ...in } // GetSyncStatus mocks base method -func (m *MockNodeClient) GetSyncStatus(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*eth.SyncStatus, error) { +func (m *MockNodeClient) GetSyncStatus(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*v1alpha1.SyncStatus, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetSyncStatus", varargs...) - ret0, _ := ret[0].(*eth.SyncStatus) + ret0, _ := ret[0].(*v1alpha1.SyncStatus) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -118,14 +118,14 @@ func (mr *MockNodeClientMockRecorder) GetSyncStatus(arg0, arg1 interface{}, arg2 } // GetVersion mocks base method -func (m *MockNodeClient) GetVersion(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*eth.Version, error) { +func (m *MockNodeClient) GetVersion(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*v1alpha1.Version, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "GetVersion", varargs...) - ret0, _ := ret[0].(*eth.Version) + ret0, _ := ret[0].(*v1alpha1.Version) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -138,14 +138,14 @@ func (mr *MockNodeClientMockRecorder) GetVersion(arg0, arg1 interface{}, arg2 .. } // ListImplementedServices mocks base method -func (m *MockNodeClient) ListImplementedServices(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*eth.ImplementedServices, error) { +func (m *MockNodeClient) ListImplementedServices(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*v1alpha1.ImplementedServices, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "ListImplementedServices", varargs...) - ret0, _ := ret[0].(*eth.ImplementedServices) + ret0, _ := ret[0].(*v1alpha1.ImplementedServices) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -158,14 +158,14 @@ func (mr *MockNodeClientMockRecorder) ListImplementedServices(arg0, arg1 interfa } // ListPeers mocks base method -func (m *MockNodeClient) ListPeers(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*eth.Peers, error) { +func (m *MockNodeClient) ListPeers(arg0 context.Context, arg1 *emptypb.Empty, arg2 ...grpc.CallOption) (*v1alpha1.Peers, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} for _, a := range arg2 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "ListPeers", varargs...) - ret0, _ := ret[0].(*eth.Peers) + ret0, _ := ret[0].(*v1alpha1.Peers) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/validator/client/BUILD.bazel b/validator/client/BUILD.bazel index 046c3f07b8f6..cfc81ceaf515 100644 --- a/validator/client/BUILD.bazel +++ b/validator/client/BUILD.bazel @@ -133,6 +133,7 @@ go_test( "@com_github_wealdtech_go_eth2_util//:go_default_library", "@in_gopkg_d4l3k_messagediff_v1//:go_default_library", "@io_bazel_rules_go//go/tools/bazel:go_default_library", + "@org_golang_google_grpc//:go_default_library", "@org_golang_google_grpc//metadata:go_default_library", "@org_golang_google_protobuf//types/known/emptypb:go_default_library", "@org_golang_google_protobuf//types/known/timestamppb:go_default_library", diff --git a/validator/client/attest_test.go b/validator/client/attest_test.go index c92eedbad870..6fe77d5ba84c 100644 --- a/validator/client/attest_test.go +++ b/validator/client/attest_test.go @@ -26,6 +26,7 @@ import ( "github.com/prysmaticlabs/prysm/shared/testutil/require" "github.com/prysmaticlabs/prysm/shared/timeutils" logTest "github.com/sirupsen/logrus/hooks/test" + grpc "google.golang.org/grpc" "gopkg.in/d4l3k/messagediff.v1" ) @@ -132,7 +133,7 @@ func TestAttestToBlockHead_AttestsCorrectly(t *testing.T) { m.validatorClient.EXPECT().ProposeAttestation( gomock.Any(), // ctx gomock.AssignableToTypeOf(ðpb.Attestation{}), - ).Do(func(_ context.Context, att *ethpb.Attestation) { + ).Do(func(_ context.Context, att *ethpb.Attestation, opts ...grpc.CallOption) { generatedAttestation = att }).Return(ðpb.AttestResponse{}, nil /* error */) @@ -382,7 +383,7 @@ func TestAttestToBlockHead_DoesAttestAfterDelay(t *testing.T) { BeaconBlockRoot: bytesutil.PadTo([]byte("A"), 32), Target: ðpb.Checkpoint{Root: bytesutil.PadTo([]byte("B"), 32)}, Source: ðpb.Checkpoint{Root: bytesutil.PadTo([]byte("C"), 32), Epoch: 3}, - }, nil).Do(func(arg0, arg1 interface{}) { + }, nil).Do(func(arg0, arg1 interface{}, arg2 ...grpc.CallOption) { wg.Done() }) @@ -431,7 +432,7 @@ func TestAttestToBlockHead_CorrectBitfieldLength(t *testing.T) { m.validatorClient.EXPECT().ProposeAttestation( gomock.Any(), // ctx gomock.AssignableToTypeOf(ðpb.Attestation{}), - ).Do(func(_ context.Context, att *ethpb.Attestation) { + ).Do(func(_ context.Context, att *ethpb.Attestation, arg2 ...grpc.CallOption) { generatedAttestation = att }).Return(ðpb.AttestResponse{}, nil /* error */) diff --git a/validator/client/iface/validator.go b/validator/client/iface/validator.go index f078a7ef006d..0eb7a7e3012c 100644 --- a/validator/client/iface/validator.go +++ b/validator/client/iface/validator.go @@ -50,4 +50,5 @@ type Validator interface { GetKeymanager() keymanager.IKeymanager ReceiveBlocks(ctx context.Context, connectionErrorChannel chan<- error) HandleKeyReload(ctx context.Context, newKeys [][48]byte) (bool, error) + CheckDoppelGanger(ctx context.Context) error } diff --git a/validator/client/propose_test.go b/validator/client/propose_test.go index 16c99b58a2a4..040a61ce0aa4 100644 --- a/validator/client/propose_test.go +++ b/validator/client/propose_test.go @@ -23,6 +23,7 @@ import ( testing2 "github.com/prysmaticlabs/prysm/validator/db/testing" "github.com/prysmaticlabs/prysm/validator/graffiti" logTest "github.com/sirupsen/logrus/hooks/test" + grpc "google.golang.org/grpc" "google.golang.org/protobuf/types/known/timestamppb" ) @@ -439,7 +440,7 @@ func TestProposeBlock_BroadcastsBlock_WithGraffiti(t *testing.T) { m.validatorClient.EXPECT().ProposeBlock( gomock.Any(), // ctx gomock.AssignableToTypeOf(ðpb.SignedBeaconBlock{}), - ).DoAndReturn(func(ctx context.Context, block *ethpb.SignedBeaconBlock) (*ethpb.ProposeResponse, error) { + ).DoAndReturn(func(ctx context.Context, block *ethpb.SignedBeaconBlock, arg2 ...grpc.CallOption) (*ethpb.ProposeResponse, error) { sentBlock = block return ðpb.ProposeResponse{BlockRoot: make([]byte, 32)}, nil }) diff --git a/validator/client/runner.go b/validator/client/runner.go index a8024aac299d..a7f97d152f60 100644 --- a/validator/client/runner.go +++ b/validator/client/runner.go @@ -84,6 +84,14 @@ func run(ctx context.Context, v iface.Validator) { if err != nil { log.Fatalf("Could not wait for validator activation: %v", err) } + err = v.CheckDoppelGanger(ctx) + if isConnectionError(err) { + log.Warnf("Could not wait for checking doppelganger: %v", err) + continue + } + if err != nil { + log.Fatalf("Could not succeed with doppelganger check: %v", err) + } headSlot, err = v.CanonicalHeadSlot(ctx) if isConnectionError(err) { log.Warnf("Could not get current canonical head slot: %v", err) diff --git a/validator/client/testutil/mock_validator.go b/validator/client/testutil/mock_validator.go index 7c0ec9d9e1b6..7dc9ccad15c4 100644 --- a/validator/client/testutil/mock_validator.go +++ b/validator/client/testutil/mock_validator.go @@ -213,6 +213,11 @@ func (fv *FakeValidator) GetKeymanager() keymanager.IKeymanager { return fv.Keymanager } +// CheckDoppelGanger for mocking +func (fv *FakeValidator) CheckDoppelGanger(ctx context.Context) error { + return nil +} + // ReceiveBlocks for mocking func (fv *FakeValidator) ReceiveBlocks(ctx context.Context, connectionErrorChannel chan<- error) { fv.ReceiveBlocksCalled++ diff --git a/validator/client/validator.go b/validator/client/validator.go index 6742da74e79f..aebaa69b2dc1 100644 --- a/validator/client/validator.go +++ b/validator/client/validator.go @@ -30,6 +30,7 @@ import ( "github.com/prysmaticlabs/prysm/validator/accounts/wallet" "github.com/prysmaticlabs/prysm/validator/client/iface" vdb "github.com/prysmaticlabs/prysm/validator/db" + "github.com/prysmaticlabs/prysm/validator/db/kv" "github.com/prysmaticlabs/prysm/validator/graffiti" "github.com/prysmaticlabs/prysm/validator/keymanager" slashingiface "github.com/prysmaticlabs/prysm/validator/slashing-protection/iface" @@ -369,6 +370,97 @@ func (v *validator) SlotDeadline(slot types.Slot) time.Time { return time.Unix(int64(v.genesisTime), 0 /*ns*/).Add(secs * time.Second) } +// CheckDoppelGanger checks if the current actively provided keys have +// any duplicates active in the network. +func (v *validator) CheckDoppelGanger(ctx context.Context) error { + if !featureconfig.Get().EnableDoppelGanger { + return nil + } + pubkeys, err := v.keyManager.FetchValidatingPublicKeys(ctx) + if err != nil { + return err + } + log.WithField("keys", len(pubkeys)).Info("Running doppelganger check") + // Exit early if no validating pub keys are found. + if len(pubkeys) == 0 { + return nil + } + req := ðpb.DoppelGangerRequest{ValidatorRequests: []*ethpb.DoppelGangerRequest_ValidatorRequest{}} + for _, pkey := range pubkeys { + attRec, err := v.db.AttestationHistoryForPubKey(ctx, pkey) + if err != nil { + return err + } + if len(attRec) == 0 { + // If no history exists we simply send in a zero + // value for the request epoch and root. + req.ValidatorRequests = append(req.ValidatorRequests, + ðpb.DoppelGangerRequest_ValidatorRequest{ + PublicKey: pkey[:], + Epoch: 0, + SignedRoot: make([]byte, 32), + }) + continue + } + r := retrieveLatestRecord(attRec) + if pkey != r.PubKey { + return errors.New("attestation record mismatched public key") + } + req.ValidatorRequests = append(req.ValidatorRequests, + ðpb.DoppelGangerRequest_ValidatorRequest{ + PublicKey: r.PubKey[:], + Epoch: r.Target, + SignedRoot: r.SigningRoot[:], + }) + } + resp, err := v.validatorClient.CheckDoppelGanger(ctx, req) + if err != nil { + return err + } + // If nothing is returned by the beacon node, we return an + // error as it is unsafe for us to proceed. + if resp == nil || resp.Responses == nil || len(resp.Responses) == 0 { + return errors.New("beacon node returned 0 responses for doppelganger check") + } + return buildDuplicateError(resp.Responses) +} + +func buildDuplicateError(respones []*ethpb.DoppelGangerResponse_ValidatorResponse) error { + duplicates := make([][]byte, 0) + for _, valRes := range respones { + if valRes.DuplicateExists { + duplicates = append(duplicates, valRes.PublicKey) + } + } + if len(duplicates) == 0 { + return nil + } + return errors.Errorf("Duplicate instances exists in the network for validator keys: %#x", duplicates) +} + +// Ensures that the latest attestion history is retrieved. +func retrieveLatestRecord(recs []*kv.AttestationRecord) *kv.AttestationRecord { + if len(recs) == 0 { + return nil + } + lastSource := recs[len(recs)-1].Source + chosenRec := recs[len(recs)-1] + for i := len(recs) - 1; i >= 0; i-- { + // Exit if we are now on a different source + // as it is assumed that all source records are + // byte sorted. + if recs[i].Source != lastSource { + break + } + // If we have a smaller target, we do + // change our chosen record. + if chosenRec.Target < recs[i].Target { + chosenRec = recs[i] + } + } + return chosenRec +} + // UpdateDuties checks the slot number to determine if the validator's // list of upcoming assignments needs to be updated. For example, at the // beginning of a new epoch. diff --git a/validator/client/validator_test.go b/validator/client/validator_test.go index bd00c23b9e64..0f7648825043 100644 --- a/validator/client/validator_test.go +++ b/validator/client/validator_test.go @@ -3,6 +3,7 @@ package client import ( "context" "errors" + "fmt" "io/ioutil" "sync" "testing" @@ -15,6 +16,7 @@ import ( "github.com/prysmaticlabs/prysm/shared/bls" "github.com/prysmaticlabs/prysm/shared/bytesutil" "github.com/prysmaticlabs/prysm/shared/event" + "github.com/prysmaticlabs/prysm/shared/featureconfig" "github.com/prysmaticlabs/prysm/shared/mock" "github.com/prysmaticlabs/prysm/shared/params" "github.com/prysmaticlabs/prysm/shared/testutil" @@ -24,6 +26,7 @@ import ( dbTest "github.com/prysmaticlabs/prysm/validator/db/testing" "github.com/sirupsen/logrus" logTest "github.com/sirupsen/logrus/hooks/test" + grpc "google.golang.org/grpc" "google.golang.org/protobuf/types/known/emptypb" ) @@ -36,7 +39,7 @@ var _ iface.Validator = (*validator)(nil) const cancelledCtx = "context has been canceled" -func genMockKeymanger(numKeys int) *mockKeymanager { +func genMockKeymanager(numKeys int) *mockKeymanager { km := make(map[[48]byte]bls.SecretKey, numKeys) for i := 0; i < numKeys; i++ { k, err := bls.RandKey() @@ -559,7 +562,7 @@ func TestUpdateDuties_OK(t *testing.T) { client.EXPECT().SubscribeCommitteeSubnets( gomock.Any(), gomock.Any(), - ).DoAndReturn(func(_ context.Context, _ *ethpb.CommitteeSubnetsSubscribeRequest) (*emptypb.Empty, error) { + ).DoAndReturn(func(_ context.Context, _ *ethpb.CommitteeSubnetsSubscribeRequest, arg2 ...grpc.CallOption) (*emptypb.Empty, error) { wg.Done() return nil, nil }) @@ -614,7 +617,7 @@ func TestUpdateDuties_OK_FilterBlacklistedPublicKeys(t *testing.T) { client.EXPECT().SubscribeCommitteeSubnets( gomock.Any(), gomock.Any(), - ).DoAndReturn(func(_ context.Context, _ *ethpb.CommitteeSubnetsSubscribeRequest) (*emptypb.Empty, error) { + ).DoAndReturn(func(_ context.Context, _ *ethpb.CommitteeSubnetsSubscribeRequest, arg2 ...grpc.CallOption) (*emptypb.Empty, error) { wg.Done() return nil, nil }) @@ -817,7 +820,7 @@ func TestAllValidatorsAreExited_AllExited(t *testing.T) { gomock.Any(), // request ).Return(ðpb.MultipleValidatorStatusResponse{Statuses: statuses}, nil /*err*/) - v := validator{keyManager: genMockKeymanger(2), validatorClient: client} + v := validator{keyManager: genMockKeymanager(2), validatorClient: client} exited, err := v.AllValidatorsAreExited(context.Background()) require.NoError(t, err) assert.Equal(t, true, exited) @@ -838,7 +841,7 @@ func TestAllValidatorsAreExited_NotAllExited(t *testing.T) { gomock.Any(), // request ).Return(ðpb.MultipleValidatorStatusResponse{Statuses: statuses}, nil /*err*/) - v := validator{keyManager: genMockKeymanger(2), validatorClient: client} + v := validator{keyManager: genMockKeymanager(2), validatorClient: client} exited, err := v.AllValidatorsAreExited(context.Background()) require.NoError(t, err) assert.Equal(t, false, exited) @@ -858,7 +861,7 @@ func TestAllValidatorsAreExited_PartialResult(t *testing.T) { gomock.Any(), // request ).Return(ðpb.MultipleValidatorStatusResponse{Statuses: statuses}, nil /*err*/) - v := validator{keyManager: genMockKeymanger(2), validatorClient: client} + v := validator{keyManager: genMockKeymanager(2), validatorClient: client} exited, err := v.AllValidatorsAreExited(context.Background()) require.ErrorContains(t, "number of status responses did not match number of requested keys", err) assert.Equal(t, false, exited) @@ -868,7 +871,7 @@ func TestAllValidatorsAreExited_NoKeys(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() client := mock.NewMockBeaconNodeValidatorClient(ctrl) - v := validator{keyManager: genMockKeymanger(0), validatorClient: client} + v := validator{keyManager: genMockKeymanager(0), validatorClient: client} exited, err := v.AllValidatorsAreExited(context.Background()) require.NoError(t, err) assert.Equal(t, false, exited) @@ -969,3 +972,261 @@ func TestService_ReceiveBlocks_SetHighest(t *testing.T) { v.ReceiveBlocks(ctx, connectionErrorChannel) require.Equal(t, slot, v.highestValidSlot) } + +type doppelGangerRequestMatcher struct { + req *ethpb.DoppelGangerRequest +} + +var _ gomock.Matcher = (*doppelGangerRequestMatcher)(nil) + +func (m *doppelGangerRequestMatcher) Matches(x interface{}) bool { + r, ok := x.(*ethpb.DoppelGangerRequest) + if !ok { + panic("Invalid match type") + } + return gomock.InAnyOrder(m.req.ValidatorRequests).Matches(r.ValidatorRequests) +} + +func (m *doppelGangerRequestMatcher) String() string { + return fmt.Sprintf("%#v", m.req.ValidatorRequests) +} + +func TestValidator_CheckDoppelGanger(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + flgs := featureconfig.Get() + flgs.EnableDoppelGanger = true + reset := featureconfig.InitWithReset(flgs) + defer reset() + tests := []struct { + name string + validatorSetter func(t *testing.T) *validator + err string + }{ + { + name: "no doppelganger", + validatorSetter: func(t *testing.T) *validator { + client := mock.NewMockBeaconNodeValidatorClient(ctrl) + km := genMockKeymanager(10) + keys, err := km.FetchValidatingPublicKeys(context.Background()) + assert.NoError(t, err) + db := dbTest.SetupDB(t, keys) + req := ðpb.DoppelGangerRequest{ValidatorRequests: []*ethpb.DoppelGangerRequest_ValidatorRequest{}} + resp := ðpb.DoppelGangerRequest{ValidatorRequests: []*ethpb.DoppelGangerRequest_ValidatorRequest{}} + for _, k := range keys { + pkey := k + att := createAttestation(10, 12) + rt, err := att.Data.HashTreeRoot() + assert.NoError(t, err) + assert.NoError(t, db.SaveAttestationForPubKey(context.Background(), pkey, rt, att)) + resp.ValidatorRequests = append(resp.ValidatorRequests, ðpb.DoppelGangerRequest_ValidatorRequest{PublicKey: pkey[:], Epoch: att.Data.Target.Epoch, SignedRoot: rt[:]}) + req.ValidatorRequests = append(req.ValidatorRequests, ðpb.DoppelGangerRequest_ValidatorRequest{PublicKey: pkey[:], Epoch: att.Data.Target.Epoch, SignedRoot: rt[:]}) + } + v := &validator{ + validatorClient: client, + keyManager: km, + db: db, + } + client.EXPECT().CheckDoppelGanger( + gomock.Any(), // ctx + &doppelGangerRequestMatcher{req}, // request + ).Return(nil, nil /*err*/) + + return v + }, + }, + { + name: "multiple doppelganger exists", + validatorSetter: func(t *testing.T) *validator { + client := mock.NewMockBeaconNodeValidatorClient(ctrl) + km := genMockKeymanager(10) + keys, err := km.FetchValidatingPublicKeys(context.Background()) + assert.NoError(t, err) + db := dbTest.SetupDB(t, keys) + req := ðpb.DoppelGangerRequest{ValidatorRequests: []*ethpb.DoppelGangerRequest_ValidatorRequest{}} + resp := ðpb.DoppelGangerResponse{Responses: []*ethpb.DoppelGangerResponse_ValidatorResponse{}} + for i, k := range keys { + pkey := k + att := createAttestation(10, 12) + rt, err := att.Data.HashTreeRoot() + assert.NoError(t, err) + assert.NoError(t, db.SaveAttestationForPubKey(context.Background(), pkey, rt, att)) + if i%3 == 0 { + resp.Responses = append(resp.Responses, ðpb.DoppelGangerResponse_ValidatorResponse{PublicKey: pkey[:], DuplicateExists: true}) + } + req.ValidatorRequests = append(req.ValidatorRequests, ðpb.DoppelGangerRequest_ValidatorRequest{PublicKey: pkey[:], Epoch: att.Data.Target.Epoch, SignedRoot: rt[:]}) + } + v := &validator{ + validatorClient: client, + keyManager: km, + db: db, + } + client.EXPECT().CheckDoppelGanger( + gomock.Any(), // ctx + &doppelGangerRequestMatcher{req}, // request + ).Return(resp, nil /*err*/) + return v + }, + err: "Duplicate instances exists in the network for validator keys", + }, + { + name: "single doppelganger exists", + validatorSetter: func(t *testing.T) *validator { + client := mock.NewMockBeaconNodeValidatorClient(ctrl) + km := genMockKeymanager(10) + keys, err := km.FetchValidatingPublicKeys(context.Background()) + assert.NoError(t, err) + db := dbTest.SetupDB(t, keys) + req := ðpb.DoppelGangerRequest{ValidatorRequests: []*ethpb.DoppelGangerRequest_ValidatorRequest{}} + resp := ðpb.DoppelGangerResponse{Responses: []*ethpb.DoppelGangerResponse_ValidatorResponse{}} + for i, k := range keys { + pkey := k + att := createAttestation(10, 12) + rt, err := att.Data.HashTreeRoot() + assert.NoError(t, err) + assert.NoError(t, db.SaveAttestationForPubKey(context.Background(), pkey, rt, att)) + if i%9 == 0 { + resp.Responses = append(resp.Responses, ðpb.DoppelGangerResponse_ValidatorResponse{PublicKey: pkey[:], DuplicateExists: true}) + } + req.ValidatorRequests = append(req.ValidatorRequests, ðpb.DoppelGangerRequest_ValidatorRequest{PublicKey: pkey[:], Epoch: att.Data.Target.Epoch, SignedRoot: rt[:]}) + } + v := &validator{ + validatorClient: client, + keyManager: km, + db: db, + } + client.EXPECT().CheckDoppelGanger( + gomock.Any(), // ctx + &doppelGangerRequestMatcher{req}, // request + ).Return(resp, nil /*err*/) + return v + }, + err: "Duplicate instances exists in the network for validator keys", + }, + { + name: "multiple attestations saved", + validatorSetter: func(t *testing.T) *validator { + client := mock.NewMockBeaconNodeValidatorClient(ctrl) + km := genMockKeymanager(10) + keys, err := km.FetchValidatingPublicKeys(context.Background()) + assert.NoError(t, err) + db := dbTest.SetupDB(t, keys) + req := ðpb.DoppelGangerRequest{ValidatorRequests: []*ethpb.DoppelGangerRequest_ValidatorRequest{}} + resp := ðpb.DoppelGangerResponse{Responses: []*ethpb.DoppelGangerResponse_ValidatorResponse{}} + attLimit := 5 + for i, k := range keys { + pkey := k + for j := 0; j < attLimit; j++ { + att := createAttestation(10+types.Epoch(j), 12+types.Epoch(j)) + rt, err := att.Data.HashTreeRoot() + assert.NoError(t, err) + assert.NoError(t, db.SaveAttestationForPubKey(context.Background(), pkey, rt, att)) + if j == attLimit-1 { + req.ValidatorRequests = append(req.ValidatorRequests, ðpb.DoppelGangerRequest_ValidatorRequest{PublicKey: pkey[:], Epoch: att.Data.Target.Epoch, SignedRoot: rt[:]}) + } + } + if i%3 == 0 { + resp.Responses = append(resp.Responses, ðpb.DoppelGangerResponse_ValidatorResponse{PublicKey: pkey[:], DuplicateExists: true}) + } + } + v := &validator{ + validatorClient: client, + keyManager: km, + db: db, + } + client.EXPECT().CheckDoppelGanger( + gomock.Any(), // ctx + &doppelGangerRequestMatcher{req}, // request + ).Return(resp, nil /*err*/) + return v + }, + err: "Duplicate instances exists in the network for validator keys", + }, + { + name: "no history exists", + validatorSetter: func(t *testing.T) *validator { + client := mock.NewMockBeaconNodeValidatorClient(ctrl) + // Use only 1 key for deterministic order. + km := genMockKeymanager(1) + keys, err := km.FetchValidatingPublicKeys(context.Background()) + assert.NoError(t, err) + db := dbTest.SetupDB(t, keys) + resp := ðpb.DoppelGangerResponse{Responses: []*ethpb.DoppelGangerResponse_ValidatorResponse{}} + req := ðpb.DoppelGangerRequest{ValidatorRequests: []*ethpb.DoppelGangerRequest_ValidatorRequest{}} + for _, k := range keys { + resp.Responses = append(resp.Responses, ðpb.DoppelGangerResponse_ValidatorResponse{PublicKey: k[:], DuplicateExists: false}) + req.ValidatorRequests = append(req.ValidatorRequests, ðpb.DoppelGangerRequest_ValidatorRequest{PublicKey: k[:], SignedRoot: make([]byte, 32), Epoch: 0}) + } + v := &validator{ + validatorClient: client, + keyManager: km, + db: db, + } + client.EXPECT().CheckDoppelGanger( + gomock.Any(), // ctx + req, // request + ).Return(resp, nil /*err*/) + return v + }, + err: "", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + v := tt.validatorSetter(t) + if err := v.CheckDoppelGanger(context.Background()); tt.err != "" { + assert.ErrorContains(t, tt.err, err) + } + }) + } +} + +func TestValidatorAttestationsAreOrdered(t *testing.T) { + km := genMockKeymanager(10) + keys, err := km.FetchValidatingPublicKeys(context.Background()) + assert.NoError(t, err) + db := dbTest.SetupDB(t, keys) + + k := keys[0] + att := createAttestation(10, 14) + rt, err := att.Data.HashTreeRoot() + assert.NoError(t, err) + assert.NoError(t, db.SaveAttestationForPubKey(context.Background(), k, rt, att)) + + att = createAttestation(6, 8) + rt, err = att.Data.HashTreeRoot() + assert.NoError(t, err) + assert.NoError(t, db.SaveAttestationForPubKey(context.Background(), k, rt, att)) + + att = createAttestation(10, 12) + rt, err = att.Data.HashTreeRoot() + assert.NoError(t, err) + assert.NoError(t, db.SaveAttestationForPubKey(context.Background(), k, rt, att)) + + att = createAttestation(2, 3) + rt, err = att.Data.HashTreeRoot() + assert.NoError(t, err) + assert.NoError(t, db.SaveAttestationForPubKey(context.Background(), k, rt, att)) + + histories, err := db.AttestationHistoryForPubKey(context.Background(), k) + assert.NoError(t, err) + r := retrieveLatestRecord(histories) + assert.Equal(t, r.Target, types.Epoch(14)) +} + +func createAttestation(source, target types.Epoch) *ethpb.IndexedAttestation { + return ðpb.IndexedAttestation{ + Data: ðpb.AttestationData{ + Source: ðpb.Checkpoint{ + Epoch: source, + Root: make([]byte, 32), + }, + Target: ðpb.Checkpoint{ + Epoch: target, + Root: make([]byte, 32), + }, + BeaconBlockRoot: make([]byte, 32), + }, + Signature: make([]byte, 96), + } +}