syntax = "proto3"; package ethereum.slashing; import "proto/eth/ext/options.proto"; import "proto/eth/v1alpha1/beacon_block.proto"; // Slasher service API // // Slasher service provides an interface for validators and beacon chain server to query // and subscribe for slashable events on the network as well as to make sure that the // attestation or proposal they are going to submit to the network are not going to // produce a slashable event. service Slasher { // Returns any found attester slashings if the passed in attestation conflicts with a validators history. rpc IsSlashableAttestation(ethereum.eth.v1alpha1.IndexedAttestation) returns (AttesterSlashingResponse) { option deprecated = true; }; // Returns any found proposer slashings if the passed in proposal conflicts with a validators history. rpc IsSlashableBlock(ethereum.eth.v1alpha1.SignedBeaconBlockHeader) returns (ProposerSlashingResponse) { option deprecated = true; }; // Returns if a given indexed attestation could be slashable when compared to the slashers history for the attesters. // This function is read-only, and does not need the indexed attestation to be signed. rpc IsSlashableAttestationNoUpdate(ethereum.eth.v1alpha1.IndexedAttestation) returns (Slashable) { option deprecated = true; }; // Returns if a given beacon block header could be slashable when compared to the slashers history for the proposer. // This function is read-only, and does not need the beacon block header to be signed. rpc IsSlashableBlockNoUpdate(ethereum.eth.v1alpha1.BeaconBlockHeader) returns (Slashable) { option deprecated = true; }; // Returns the highest source and target attestation for validator indexes that have been observed by the slasher. rpc HighestAttestations(HighestAttestationRequest) returns (HighestAttestationResponse) { option deprecated = true; }; } message HighestAttestationRequest { repeated uint64 validator_ids = 1 [deprecated = true]; } message HighestAttestationResponse { repeated HighestAttestation attestations = 1 [deprecated = true]; } message HighestAttestation { uint64 validator_id = 1 [deprecated = true]; uint64 highest_source_epoch = 2 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Epoch", deprecated = true]; uint64 highest_target_epoch = 3 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Epoch"]; } message ProposerSlashingResponse { repeated ethereum.eth.v1alpha1.ProposerSlashing proposer_slashing = 1 [deprecated = true]; } message Slashable { bool slashable = 1 [deprecated = true]; } message AttesterSlashingResponse { repeated ethereum.eth.v1alpha1.AttesterSlashing attester_slashing = 1 [deprecated = true]; } // ProposalHistory defines the structure for recording a validator's historical proposals. // Using a bitlist to represent the epochs and an uint64 to mark the latest marked // epoch of the bitlist, we can easily store which epochs a validator has proposed // a block for while pruning the older data. message ProposalHistory { bytes epoch_bits = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/go-bitfield.Bitlist", deprecated = true]; uint64 latest_epoch_written = 2 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Epoch", deprecated = true]; } // AttestationHistory defines the structure for recording a validator's historical attestation. // Using a map[uint64]uint64 to map its target epoch to its source epoch, in order to detect if a // vote being created is not a double vote and surrounded by, or surrounding any other votes. // Using an uint64 to mark the latest written epoch, we can safely perform a rolling prune whenever // the history is updated. message AttestationHistory { map target_to_source = 1 [deprecated = true]; uint64 latest_epoch_written = 2 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Epoch", deprecated = true]; }