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 }