Line data Source code
1 : #ifndef HEADER_fd_src_choreo_votor_fd_epoch_info_h 2 : #define HEADER_fd_src_choreo_votor_fd_epoch_info_h 3 : 4 : #include "fd_votor_base.h" 5 : #include "../../ballet/bls/fd_bls.h" 6 : 7 : FD_STATIC_ASSERT( FD_BLS_SET_MAX==FD_VOTOR_VAT_MAX, fd_bls_set_max ); 8 : 9 : struct fd_validator_info { 10 : ulong id; 11 : ulong stake; 12 : uchar id_key [ 32 ]; /* identity public key */ 13 : uchar vote_key[ 32 ]; /* vote account address */ 14 : uchar bls_key [ FD_BLS_PUB_COMPRESSED_SZ ]; /* compressed BLS public key */ 15 : }; 16 : typedef struct fd_validator_info fd_validator_info_t; 17 : 18 : struct fd_epoch_info { 19 : ulong validator_cnt; 20 : ulong total_stake; 21 : fd_validator_info_t validators[ FD_VOTOR_VAT_MAX ]; /* indexed by rank; validator_cnt live */ 22 : fd_bls_pub_t pubkeys [ FD_VOTOR_VAT_MAX ]; /* validated keys, indexed by rank */ 23 : }; 24 : typedef struct fd_epoch_info fd_epoch_info_t; 25 : 26 : FD_PROTOTYPES_BEGIN 27 : 28 : /* EpochInfo::validators */ 29 : 30 : FD_FN_CONST static inline fd_validator_info_t const * 31 0 : fd_epoch_info_validators( fd_epoch_info_t const * self ) { 32 0 : return self->validators; 33 0 : } 34 : 35 : /* EpochInfo::validator */ 36 : 37 : FD_FN_PURE static inline fd_validator_info_t const * 38 : fd_epoch_info_validator( fd_epoch_info_t const * self, 39 0 : ulong rank ) { 40 0 : FD_TEST( rank<self->validator_cnt ); 41 0 : return fd_epoch_info_validators( self ) + rank; 42 0 : } 43 : 44 : /* Deserialized fd_epoch_info_validator( self, rank )->bls_key */ 45 : 46 : FD_FN_PURE static inline fd_bls_pub_t const * 47 : fd_epoch_info_pubkey( fd_epoch_info_t const * self, 48 0 : ulong rank ) { 49 0 : FD_TEST( rank<self->validator_cnt ); 50 0 : return self->pubkeys + rank; 51 0 : } 52 : 53 : /* EpochInfo::leader */ 54 : 55 : FD_FN_PURE static inline fd_validator_info_t const * 56 : fd_epoch_info_leader( fd_epoch_info_t const * self, 57 0 : ulong slot ) { 58 0 : ulong window = slot / FD_VOTOR_SLOTS_PER_WINDOW; 59 0 : ulong leader_id = window % self->validator_cnt; 60 0 : return fd_epoch_info_validator( self, leader_id ); 61 0 : } 62 : 63 : /* EpochInfo::total_stake */ 64 : 65 : FD_FN_PURE static inline ulong 66 0 : fd_epoch_info_total_stake( fd_epoch_info_t const * self ) { return self->total_stake; } 67 : 68 : /* Definition 13. EpochInfo::is_weakest_quorum, is_weak_quorum, is_quorum, is_strong_quorum */ 69 : 70 : FD_FN_PURE int fd_epoch_info_is_weakest_quorum( fd_epoch_info_t const * self, ulong stake ); 71 : FD_FN_PURE int fd_epoch_info_is_weak_quorum ( fd_epoch_info_t const * self, ulong stake ); 72 : FD_FN_PURE int fd_epoch_info_is_quorum ( fd_epoch_info_t const * self, ulong stake ); 73 : FD_FN_PURE int fd_epoch_info_is_strong_quorum ( fd_epoch_info_t const * self, ulong stake ); 74 : 75 : FD_PROTOTYPES_END 76 : 77 : #endif