github.com/prysmaticlabs/prysm@v1.4.4/proto/eth/v1alpha1/validator.proto (about)

     1  // Copyright 2020 Prysmatic Labs.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  syntax = "proto3";
    15  
    16  package ethereum.eth.v1alpha1;
    17  
    18  import "google/api/annotations.proto";
    19  import "google/protobuf/empty.proto";
    20  
    21  import "proto/eth/ext/options.proto";
    22  import "proto/eth/v1alpha1/beacon_block.proto";
    23  import "proto/eth/v1alpha1/attestation.proto";
    24  
    25  option csharp_namespace = "Ethereum.Eth.v1alpha1";
    26  option go_package = "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1;eth";
    27  option java_multiple_files = true;
    28  option java_outer_classname = "ValidatorProto";
    29  option java_package = "org.ethereum.eth.v1alpha1";
    30  option php_namespace = "Ethereum\\Eth\\v1alpha1";
    31  
    32  // Beacon node validator API
    33  //
    34  // The beacon node validator API enables a validator to connect
    35  // and perform its obligations on the Ethereum Beacon Chain.
    36  service BeaconNodeValidator {
    37      // Retrieves validator duties for the requested validators.
    38      //
    39      // The duties consist of:
    40      //   Proposer - the validator that creates a beacon chain block.
    41      //   Attester — a validator that is part of a committee that needs to sign off on a beacon chain
    42      //    block while simultaneously creating a cross link to a recent shard block on a particular shard chain.
    43      // The server returns a list of duties which are the actions should be performed by validators for a given epoch.
    44      // Validator duties should be polled every epoch, but due to chain reorg of >MIN_SEED_LOOKAHEAD could occur,
    45      // the validator duties could chain. For complete safety, it is recommended to poll at every slot to ensure
    46      // validator is fully aware of any sudden chain reorg.
    47      rpc GetDuties(DutiesRequest) returns (DutiesResponse) {
    48          option (google.api.http) = {
    49              get: "/eth/v1alpha1/validator/duties"
    50          };
    51      }
    52  
    53      // Stream validator duties for the requested validators.
    54      //
    55      // The duties consist of:
    56      //   Proposer - the validator that creates a beacon chain block.
    57      //   Attester — a validator that is part of a committee that needs to sign off on a beacon chain
    58      rpc StreamDuties(DutiesRequest) returns (stream DutiesResponse) {
    59          option (google.api.http) = {
    60              get: "/eth/v1alpha1/validator/duties/stream"
    61          };
    62      }
    63  
    64      // DomainData fetches the current BLS signature domain version information from the
    65      // running beacon node's state. This information is used when validators sign
    66      // blocks and attestations appropriately based on their duty.
    67      rpc DomainData(DomainRequest) returns (DomainResponse) {
    68          option (google.api.http) = {
    69              get: "/eth/v1alpha1/validator/domain"
    70          };
    71      }
    72  
    73      // WaitForChainStart queries the logs of the Validator Deposit Contract on the Ethereum
    74      // proof-of-work chain to verify the beacon chain has started its runtime and
    75      // validators are ready to begin their responsibilities.
    76      //
    77      // If the chain has not yet started, this endpoint starts a server-side stream which updates
    78      // the client when the beacon chain is ready.
    79      rpc WaitForChainStart(google.protobuf.Empty) returns (stream ChainStartResponse) {
    80          option deprecated = true;
    81          option (google.api.http) = {
    82              get: "/eth/v1alpha1/validator/chainstart/stream"
    83          };
    84      }
    85  
    86      // WaitForActivation checks if a validator public key exists in the active validator
    87      // registry of the current beacon state. If the validator is NOT yet active, it starts a
    88      // server-side stream which updates the client whenever the validator becomes active in
    89      // the beacon node's state.
    90      //
    91      // The input to this endpoint is a list of validator public keys, and the corresponding
    92      // stream will respond until at least a single corresponding validator to those
    93      // keys is activated.
    94      rpc WaitForActivation(ValidatorActivationRequest) returns (stream ValidatorActivationResponse) {
    95          option (google.api.http) = {
    96              get: "/eth/v1alpha1/validator/activation/stream"
    97          };
    98      }
    99  
   100      // ValidatorIndex retrieves a validator's index location in the beacon state's
   101      // validator registry looking up whether the validator exists based on its
   102      // public key. This method returns NOT_FOUND if no index is found for the public key
   103      // specified in the request.
   104      rpc ValidatorIndex(ValidatorIndexRequest) returns (ValidatorIndexResponse) {
   105          option (google.api.http) = {
   106              get: "/eth/v1alpha1/validator/index"
   107          };
   108      }
   109  
   110      // ValidatorStatus returns a validator's status based on the current epoch.
   111      // The request can specify either a validator's public key or validator index.
   112      //
   113      // The status response can be one of the following:
   114      //	DEPOSITED - validator's deposit has been recognized by Ethereum 1, not yet recognized by Ethereum.
   115      //	PENDING - validator is in Ethereum's activation queue.
   116      //	ACTIVE - validator is active.
   117      //	EXITING - validator has initiated an an exit request, or has dropped below the ejection balance and is being kicked out.
   118      //	EXITED - validator is no longer validating.
   119      //	SLASHING - validator has been kicked out due to meeting a slashing condition.
   120      //	UNKNOWN_STATUS - validator does not have a known status in the network.
   121      rpc ValidatorStatus(ValidatorStatusRequest) returns (ValidatorStatusResponse) {
   122          option (google.api.http) = {
   123              get: "/eth/v1alpha1/validator/status"
   124          };
   125      }
   126  
   127      // MultipleValidatorStatus returns a list of validator statuses on the current epoch.
   128      // The request can specify a list of validator public keys.
   129      //
   130      // Returns a list of ValidatorStatusResponses.
   131      rpc MultipleValidatorStatus(MultipleValidatorStatusRequest) returns (MultipleValidatorStatusResponse) {
   132          option (google.api.http) = {
   133              get: "/eth/v1alpha1/validator/statuses"
   134          };
   135      }
   136  
   137      // Retrieves the latest valid beacon block to be proposed on the beacon chain.
   138      //
   139      // The server returns a new beacon block, without proposer signature, that can be
   140      // proposed on the beacon chain. The block should be filled with all the necessary
   141      // data for proposer to sign.
   142      rpc GetBlock(BlockRequest) returns (BeaconBlock) {
   143          option (google.api.http) = {
   144              get: "/eth/v1alpha1/validator/block"
   145          };
   146      }
   147  
   148      // Sends the newly signed beacon block to beacon node.
   149      //
   150      // The validator sends the newly signed beacon block to the beacon node so the beacon block can
   151      // be included in the beacon chain. The beacon node is expected to validate and process the
   152      // beacon block into its state.
   153      rpc ProposeBlock(SignedBeaconBlock) returns (ProposeResponse) {
   154          option (google.api.http) = {
   155              post: "/eth/v1alpha1/validator/block"
   156              body: "*"
   157          };
   158      }
   159  
   160      // Retrieves the latest valid attestation data to be attested on the beacon chain.
   161      //
   162      // The server returns the latest valid data which represents the correct vote
   163      // for the head of the beacon chain.
   164      rpc GetAttestationData(AttestationDataRequest) returns (AttestationData) {
   165          option (google.api.http) = {
   166              get: "/eth/v1alpha1/validator/attestation"
   167          };
   168      }
   169  
   170      // Sends the newly signed attestation to beacon node.
   171      //
   172      // The validator sends the newly signed attestation to the beacon node for the attestation to
   173      // be included in the beacon chain. The beacon node is expected to validate and publish attestation on
   174      // appropriate committee subnet.
   175      rpc ProposeAttestation(Attestation) returns (AttestResponse) {
   176          option (google.api.http) = {
   177              post: "/eth/v1alpha1/validator/attestation"
   178              body: "*"
   179          };
   180      }
   181  
   182  
   183      // Submit selection proof to the beacon node to aggregate all matching wire attestations with the same data root.
   184      // the beacon node responses with an aggregate and proof object back to validator to sign over.
   185      rpc SubmitAggregateSelectionProof(AggregateSelectionRequest) returns (AggregateSelectionResponse) {
   186          option (google.api.http) = {
   187              post: "/eth/v1alpha1/validator/aggregate"
   188              body: "*"
   189          };
   190      }
   191  
   192      // Submit a signed aggregate and proof object, the beacon node will broadcast the
   193      // signed aggregated attestation and proof object.
   194      rpc SubmitSignedAggregateSelectionProof(SignedAggregateSubmitRequest) returns (SignedAggregateSubmitResponse) {
   195          option (google.api.http) = {
   196              post: "/eth/v1alpha1/validator/aggregate"
   197              body: "*"
   198          };
   199      }
   200  
   201      // Propose to leave the list of active validators.
   202      //
   203      // The beacon node is expected to validate the request and make it available for inclusion in
   204      // the next proposed block.
   205      rpc ProposeExit(SignedVoluntaryExit) returns (ProposeExitResponse) {
   206          option (google.api.http) = {
   207              post: "/eth/v1alpha1/validator/exit"
   208              body: "*"
   209          };
   210      }
   211  
   212      // Subscribe to particular committee ID subnets given validator's duty.
   213      //
   214      // The beacon node is expected to subscribe to the committee ID subnet given by the request. With this,
   215      // beacon node serving attesters can find persistent peers on the subnet to publish attestation,
   216      // and beacon node serving aggregator can join the subnet.
   217      rpc SubscribeCommitteeSubnets(CommitteeSubnetsSubscribeRequest) returns (google.protobuf.Empty) {
   218          option (google.api.http) = {
   219              post: "/eth/v1alpha1/validator/subnet/subscribe"
   220              body: "*"  
   221          };
   222      }
   223  
   224      // Checks the beacon node if another instance of the provided validator keys have been
   225      // attesting/proposing for you.
   226      rpc CheckDoppelGanger(DoppelGangerRequest) returns (DoppelGangerResponse) {
   227          option (google.api.http) = {
   228              get: "/eth/v1alpha1/validator/doppelganger"
   229          };
   230      }
   231  
   232  }
   233  
   234  message DomainRequest {
   235      // The epoch for which the domain is being requested.
   236      uint64 epoch = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Epoch"];
   237  
   238      // The bytes domain specified by the validator.
   239      bytes domain = 2;
   240  }
   241  
   242  message DomainResponse {
   243      // The signature domain is a byte array used by validators when
   244      // signing data related to block proposals and attestations.
   245      bytes signature_domain = 1;
   246  }
   247  
   248  message ValidatorActivationRequest {
   249      // A list of 48 byte validator public keys.
   250      repeated bytes public_keys = 1 [(ethereum.eth.ext.ssz_size) = "?,48"];
   251  }
   252  
   253  message ValidatorActivationResponse {
   254      message Status {
   255          // A 48 byte validator public key.
   256          bytes public_key = 1;
   257  
   258          // A wrapper representing a validator's status object.
   259          ValidatorStatusResponse status = 2;
   260  
   261          // The validators index in the beacon state.
   262          uint64 index = 3 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.ValidatorIndex"];
   263      }
   264      // A list of validator statuses mapped 1-to-1 with the public keys
   265      // in the request.
   266      repeated Status statuses = 1;
   267  }
   268  
   269  message ChainStartResponse {
   270      // A boolean specifying whether or not the chain has started.
   271      bool started = 1;
   272  
   273      // The genesis time of the beacon chain.
   274      uint64 genesis_time = 2;
   275  
   276      // 32 byte hash tree root of the genesis validator set.
   277      bytes genesis_validators_root = 3 [(ethereum.eth.ext.ssz_size) = "32"];
   278  }
   279  
   280  message SyncedResponse {
   281      // A boolean specifying whether or not the beacon node is synced and ready for the validator.
   282      bool synced = 1;
   283  
   284      // The genesis time of the beacon chain.
   285      uint64 genesis_time = 2;
   286  }
   287  
   288  message ValidatorIndexRequest {
   289      // A 48 byte validator public key.
   290      bytes public_key = 1 [(ethereum.eth.ext.ssz_size) = "48"];
   291  }
   292  
   293  message ValidatorIndexResponse {
   294      // The validator's index in the beacon chain state's validator registry.
   295      uint64 index = 1  [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.ValidatorIndex"];
   296  }
   297  
   298  message ValidatorStatusRequest {
   299      // A 48 byte validator public key.
   300      bytes public_key = 1 [(ethereum.eth.ext.ssz_size) = "48"];
   301  }
   302  
   303  enum ValidatorStatus {
   304      UNKNOWN_STATUS = 0;
   305      DEPOSITED = 1;
   306      PENDING = 2;
   307      ACTIVE = 3;
   308      EXITING = 4;
   309      SLASHING = 5;
   310      EXITED = 6;
   311      INVALID = 7;
   312      PARTIALLY_DEPOSITED = 8;
   313  }
   314  
   315  message ValidatorStatusResponse {
   316      // The corresponding validator status.
   317      ValidatorStatus status = 1;
   318  
   319      // The block number of the Ethereum proof-of-work chain
   320      // where the deposit for the validator was included.
   321      uint64 eth1_deposit_block_number = 2;
   322  
   323      // The slot in the beacon chain in which the validator's
   324      // deposit was included in a block.
   325      uint64 deposit_inclusion_slot = 3 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Slot"];
   326  
   327      // The epoch in the beacon chain in which the validator
   328      // is determined as active.
   329      uint64 activation_epoch = 4 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Epoch"];
   330  
   331      // The position in the activation queue of pending validators.
   332      uint64 position_in_activation_queue = 5;
   333  }
   334  
   335  message MultipleValidatorStatusRequest {
   336      // A list of 48 byte validator public keys.
   337      repeated bytes public_keys = 1 [(ethereum.eth.ext.ssz_size) = "?,48"];
   338      // A list of validator indices.
   339      repeated int64 indices = 2;
   340  }
   341  
   342  message MultipleValidatorStatusResponse {
   343      // A list of 48 byte validator public keys.
   344      repeated bytes public_keys = 1 [(ethereum.eth.ext.ssz_size) = "?,48"];
   345      // A list of ValidatorStatusResponses mapped 1-to-1 with the public keys.
   346      repeated ValidatorStatusResponse statuses = 2;
   347      // A list of validator indices.
   348      repeated uint64 indices = 3  [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.ValidatorIndex"];
   349  }
   350  
   351  message DutiesRequest {
   352      // Epoch at which validators should perform their duties.
   353      uint64 epoch = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Epoch"];
   354  
   355      // Array of byte encoded BLS public keys.
   356      repeated bytes public_keys = 2 [(ethereum.eth.ext.ssz_size) = "?,48"];
   357  }
   358  
   359  message DutiesResponse {
   360      repeated Duty duties = 1 [deprecated = true];
   361  
   362      repeated Duty current_epoch_duties = 2;
   363  
   364      repeated Duty next_epoch_duties = 3;
   365  
   366      message Duty {
   367          // The committee a validator is assigned to.
   368          repeated uint64 committee = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.ValidatorIndex"];
   369  
   370          // The index into the committee where the validator belongs in.
   371          uint64 committee_index = 2  [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.CommitteeIndex"];
   372  
   373          // Slot at which a validator must attest.
   374          uint64 attester_slot = 3 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Slot"];
   375  
   376          // Slots at which a validator must propose a beacon chain block.
   377          repeated uint64 proposer_slots = 4 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Slot"];
   378  
   379          // 48 byte BLS public key for the validator who's assigned to perform a duty.
   380          bytes public_key = 5 [(ethereum.eth.ext.ssz_size) = "48"];
   381  
   382          // The current status of the validator assigned to perform the duty.
   383          ValidatorStatus status = 6;
   384  
   385          // The index of the validator in the beacon state.
   386          uint64 validator_index = 7  [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.ValidatorIndex"];
   387  
   388          // Whether the validator belongs in the sync committee and has to perform sync committee duty.
   389          bool is_sync_committee = 8;
   390      }
   391  }
   392  
   393  message BlockRequest {
   394      // Slot for which the block should be proposed.
   395      uint64 slot = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Slot"];
   396  
   397      // Validator's 32 byte randao reveal secret of the current epoch.
   398      bytes randao_reveal = 2 [(ethereum.eth.ext.ssz_size) = "48"];
   399  
   400      // Validator's 32 byte graffiti message for the new block.
   401      bytes graffiti = 3 [(ethereum.eth.ext.ssz_size) = "32"];
   402  
   403  }
   404  
   405  message ProposeResponse {
   406      // The block root of the successfully proposed beacon block.
   407      bytes block_root = 1 [(ethereum.eth.ext.ssz_size) = "32"];
   408  }
   409  
   410  message ProposeExitResponse {
   411      // The root of the successfully proposed voluntary exit.
   412      bytes exit_root = 1 [(ethereum.eth.ext.ssz_size) = "32"];
   413  }
   414  
   415  message AttestationDataRequest {
   416      // Slot for which the attestation should be created.
   417      uint64 slot = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Slot"];
   418  
   419      // Committee index the attestation should be created for.
   420      uint64 committee_index = 2  [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.CommitteeIndex"];
   421  }
   422  
   423  message AttestResponse {
   424      // The root of the attestation data successfully submitted to the beacon node.
   425      bytes attestation_data_root = 1 [(ethereum.eth.ext.ssz_size) = "32"];
   426  }
   427  
   428  message AggregateSelectionRequest {
   429      // Slot for which the aggregation request applies.
   430      uint64 slot = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Slot"];
   431      // Committee index of the validator at the given slot.
   432      uint64 committee_index = 2  [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.CommitteeIndex"];
   433      // 48 byte public key of the validator.
   434      bytes public_key = 3 [(ethereum.eth.ext.ssz_size) = "48", (ethereum.eth.ext.spec_name) = "pubkey"];
   435      // 96 byte signature of the validator on the slot. This is used as proof that the validator is
   436      // an aggregator for the given slot.
   437      bytes slot_signature = 4 [(ethereum.eth.ext.ssz_size) = "96"];
   438  }
   439  
   440  message AggregateSelectionResponse {
   441    // The aggregate and proof message without the signature.
   442    AggregateAttestationAndProof aggregate_and_proof = 1;
   443  }
   444  
   445  message SignedAggregateSubmitRequest {
   446      // The signed aggregate and proof message with the signature.
   447      SignedAggregateAttestationAndProof signed_aggregate_and_proof = 1;
   448  }
   449  
   450  message SignedAggregateSubmitResponse {
   451      // The 32 byte hash tree root of the aggregated attestation data.
   452      bytes attestation_data_root = 1  [(ethereum.eth.ext.ssz_size) = "32"];
   453  }
   454  
   455  message CommitteeSubnetsSubscribeRequest {
   456      // A list of intended slots to subscribe.
   457      repeated uint64 slots = 1 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Slot"];
   458      // A list of intended committee ids to subscribe. It is mapped 1-to-1 with the slots
   459      repeated uint64 committee_ids = 2 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.CommitteeIndex"];
   460      // Whether to subscribe as an aggregator or by default attester.
   461      // It is mapped 1-to-1 with the slots and committee ids.
   462      // Subscribe as an aggregator means to join the subnet.
   463      // Subscribe as an attester means finding persistent peers on the subnet to be able to publish attestations.
   464      repeated bool is_aggregator = 3;
   465  }
   466  
   467  // An Ethereum validator.
   468  message Validator {
   469      // 48 byte BLS public key used for the validator's activities.
   470      bytes public_key = 1 [(ethereum.eth.ext.ssz_size) = "48", (ethereum.eth.ext.spec_name) = "pubkey"];
   471  
   472      // 32 byte hash of the withdrawal destination public key.
   473      bytes withdrawal_credentials = 2 [(ethereum.eth.ext.ssz_size) = "32"];
   474  
   475      // The validators current effective balance in gwei.
   476      uint64 effective_balance = 3;
   477  
   478      // Whether or not the validator has been slashed.
   479      bool slashed = 4;
   480  
   481      // Epoch when the validator became eligible for activation. This field may
   482      // be zero if the validator was present in the Ethereum proof of stake genesis. This
   483      // field is FAR_FUTURE_EPOCH if the validator has not been activated.
   484      uint64 activation_eligibility_epoch = 5 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Epoch"];
   485  
   486      // Epoch when the validator was activated. This field may be zero if the
   487      // validator was present in the Ethereum proof of stake genesis. This field is
   488      // FAR_FUTURE_EPOCH if the validator has not been activated.
   489      uint64 activation_epoch = 6 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Epoch"];
   490  
   491      // Epoch when the validator was exited. This field is FAR_FUTURE_EPOCH if
   492      // the validator has not exited.
   493      // FAR_FUTURE_EPOCH is a constant defined by the official Ethereum Beacon Chain specification:
   494      // https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/specs/core/0_beacon-chain.md#constants
   495      uint64 exit_epoch = 7 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Epoch"];
   496  
   497      // Epoch when the validator is eligible to withdraw their funds. This field
   498      // is FAR_FUTURE_EPOCH if the validator has not exited.
   499      // FAR_FUTURE_EPOCH is a constant defined by the official Ethereum Beacon Chain specification:
   500      // https://github.com/ethereum/eth2.0-specs/blob/v0.9.2/specs/core/0_beacon-chain.md#constants
   501      uint64 withdrawable_epoch = 8 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Epoch"];
   502  }
   503  
   504  // ValidatorParticipation stores participation metrics during a given epoch.
   505  message ValidatorParticipation {
   506      // Percentage of validator participation in the given epoch. This field
   507      // contains a value between 0 and 1.
   508      float global_participation_rate = 1  [deprecated = true];
   509  
   510      // The total amount of ether, in gwei, that has been used in voting.
   511      uint64 voted_ether = 2 [deprecated = true];
   512  
   513      // The total amount of ether, in gwei, that is eligible for voting.
   514      uint64 eligible_ether = 3 [deprecated = true];
   515  
   516      // Total staked gwei that was active (i.e. eligible to vote) during the current epoch.
   517      uint64 current_epoch_active_gwei = 4;
   518      // Total staked gwei that had attestations included in a block during the current epoch,
   519      // attestations by the same validator do not increase this figure.
   520      uint64 current_epoch_attesting_gwei = 5;
   521      // Total staked gwei that attested to the majority-elected Casper FFG target epoch during the current epoch.
   522      uint64 current_epoch_target_attesting_gwei = 6;
   523      // Same as current_epoch_active_gwei but for previous epoch.
   524      uint64 previous_epoch_active_gwei = 7;
   525      // Same as current_epoch_attesting_gwei but for previous epoch.
   526      uint64 previous_epoch_attesting_gwei = 8;
   527      // Same as current_epoch_target_attesting_gwei but for previous epoch.
   528      uint64 previous_epoch_target_attesting_gwei = 9;
   529      // Total staked gwei that attested to a head beacon block that is in the canonical chain.
   530      uint64 previous_epoch_head_attesting_gwei = 10;
   531  }
   532  
   533  // ValidatorInfo gives information about the state of a validator at a certain epoch.
   534  message ValidatorInfo {
   535      // The validator's 48 byte BLS public key.
   536      bytes public_key = 1;
   537  
   538      // The validator's index in the beacon state.
   539      uint64 index = 2 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.ValidatorIndex"];
   540  
   541      // The epoch for which the information pertains.
   542      uint64 epoch = 3 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Epoch"];
   543  
   544      // The validator's current status.
   545      ValidatorStatus status = 4;
   546  
   547      // The unix timestamp when the validator enters the next state.
   548      // This could be in the past.  Some values depend on chain operation and so will vary from epoch to epoch.
   549      // Specific times for each state are as follows:
   550      // - state == DEPOSITED: time at which Ethereum 1 deposit will be stored on-chain by Ethereum (variable, can be 0).
   551      // - state == PENDING: time at which validator will be activated (variable).
   552      // - state == ACTIVE: no value (next transition depends on user and network actions).
   553      // - state == EXITING: time at which validator will exit.
   554      // - state == SLASHING: time at which validator will exit.
   555      // - state == EXITED: time at which validator funds will be withdrawable.
   556      uint64 transition_timestamp = 5;
   557  
   558      // The validator's current balance in GWei.
   559      uint64 balance = 6;
   560  
   561      // The validator's current effective balance in GWei.
   562      // Only valid for states ACTIVE, EXITING, SLASHING.
   563      uint64 effective_balance = 7;
   564  }
   565  
   566  // DoppelGangerRequest represents the request sent by the validator in order to determine
   567  // if there is any duplicate instance of it running in the network.
   568  message DoppelGangerRequest {
   569      repeated ValidatorRequest validator_requests = 1;
   570  
   571      // ValidatorRequest data type which represents a request for each validator.
   572      message ValidatorRequest {
   573          // The validator's 48 byte BLS public key.
   574          bytes public_key = 1 [(ethereum.eth.ext.ssz_size) = "48", (ethereum.eth.ext.spec_name) = "pubkey"];
   575          // The validator's last recorded epoch to attest.
   576          uint64 epoch = 3 [(ethereum.eth.ext.cast_type) = "github.com/prysmaticlabs/eth2-types.Epoch"];
   577          // The validator's last recorded signed root.
   578          bytes signed_root = 2 [(ethereum.eth.ext.ssz_size) = "32"];
   579      }
   580  }
   581  
   582  // DoppelGangerResponse is the response payload sent by the beacon node
   583  // after it has checked for all duplicate keys in the network.
   584  message DoppelGangerResponse {
   585      message ValidatorResponse {
   586          // The validator's 48 byte BLS public key.
   587          bytes public_key = 1 [(ethereum.eth.ext.ssz_size) = "48", (ethereum.eth.ext.spec_name) = "pubkey"];
   588          // Whether a duplicate of the validator exists.
   589          bool duplicate_exists = 2;
   590      }
   591      repeated ValidatorResponse responses = 1;
   592  }