github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/rpc/prysm/v1alpha1/beacon/slashings.go (about) 1 package beacon 2 3 import ( 4 "context" 5 6 types "github.com/prysmaticlabs/eth2-types" 7 ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" 8 "github.com/prysmaticlabs/prysm/shared/featureconfig" 9 "github.com/prysmaticlabs/prysm/shared/sliceutil" 10 "google.golang.org/grpc/codes" 11 "google.golang.org/grpc/status" 12 ) 13 14 // SubmitProposerSlashing receives a proposer slashing object via 15 // RPC and injects it into the beacon node's operations pool. 16 // Submission into this pool does not guarantee inclusion into a beacon block. 17 func (bs *Server) SubmitProposerSlashing( 18 ctx context.Context, 19 req *ethpb.ProposerSlashing, 20 ) (*ethpb.SubmitSlashingResponse, error) { 21 beaconState, err := bs.HeadFetcher.HeadState(ctx) 22 if err != nil { 23 return nil, status.Errorf(codes.Internal, "Could not retrieve head state: %v", err) 24 } 25 if err := bs.SlashingsPool.InsertProposerSlashing(ctx, beaconState, req); err != nil { 26 return nil, status.Errorf(codes.Internal, "Could not insert proposer slashing into pool: %v", err) 27 } 28 if !featureconfig.Get().DisableBroadcastSlashings { 29 if err := bs.Broadcaster.Broadcast(ctx, req); err != nil { 30 return nil, status.Errorf(codes.Internal, "Could not broadcast slashing object: %v", err) 31 } 32 } 33 34 return ðpb.SubmitSlashingResponse{ 35 SlashedIndices: []types.ValidatorIndex{req.Header_1.Header.ProposerIndex}, 36 }, nil 37 } 38 39 // SubmitAttesterSlashing receives an attester slashing object via 40 // RPC and injects it into the beacon node's operations pool. 41 // Submission into this pool does not guarantee inclusion into a beacon block. 42 func (bs *Server) SubmitAttesterSlashing( 43 ctx context.Context, 44 req *ethpb.AttesterSlashing, 45 ) (*ethpb.SubmitSlashingResponse, error) { 46 beaconState, err := bs.HeadFetcher.HeadState(ctx) 47 if err != nil { 48 return nil, status.Errorf(codes.Internal, "Could not retrieve head state: %v", err) 49 } 50 if err := bs.SlashingsPool.InsertAttesterSlashing(ctx, beaconState, req); err != nil { 51 return nil, status.Errorf(codes.Internal, "Could not insert attester slashing into pool: %v", err) 52 } 53 if !featureconfig.Get().DisableBroadcastSlashings { 54 if err := bs.Broadcaster.Broadcast(ctx, req); err != nil { 55 return nil, status.Errorf(codes.Internal, "Could not broadcast slashing object: %v", err) 56 } 57 } 58 indices := sliceutil.IntersectionUint64(req.Attestation_1.AttestingIndices, req.Attestation_2.AttestingIndices) 59 slashedIndices := make([]types.ValidatorIndex, len(indices)) 60 for i, index := range indices { 61 slashedIndices[i] = types.ValidatorIndex(index) 62 } 63 return ðpb.SubmitSlashingResponse{ 64 SlashedIndices: slashedIndices, 65 }, nil 66 }