Line data Source code
1 : #ifndef HEADER_fd_src_choreo_votor_ag_epoch_info_h 2 : #define HEADER_fd_src_choreo_votor_ag_epoch_info_h 3 : 4 : #include "ag_votor_base.h" 5 : #include "../../ballet/bls/fd_bls.h" 6 : 7 : FD_STATIC_ASSERT( FD_BLS_SET_MAX==AG_VAT_MAX, fd_bls_set_max ); 8 : FD_STATIC_ASSERT( sizeof(ag_bls_key_t)==FD_BLS_PUB_COMPRESSED_SZ, ag_bls_key_sz ); 9 : 10 : struct ag_validator_info { 11 : ulong id; 12 : ulong stake; 13 : ag_id_key_t id_key; 14 : ag_vote_key_t vote_key; 15 : ag_bls_key_t bls_key; 16 : }; 17 : typedef struct ag_validator_info ag_validator_info_t; 18 : 19 : struct ag_epoch_info { 20 : ulong validator_cnt; 21 : ulong total_stake; 22 : ag_validator_info_t validators[ AG_VAT_MAX ]; /* indexed by rank; validator_cnt live */ 23 : fd_bls_pub_t pubkeys [ AG_VAT_MAX ]; /* validated keys, indexed by rank */ 24 : }; 25 : typedef struct ag_epoch_info ag_epoch_info_t; 26 : 27 : FD_PROTOTYPES_BEGIN 28 : 29 : /* EpochInfo::validators */ 30 : 31 : FD_FN_CONST static inline ag_validator_info_t const * 32 0 : ag_epoch_info_validators( ag_epoch_info_t const * self ) { 33 0 : return self->validators; 34 0 : } 35 : 36 : /* EpochInfo::validator */ 37 : 38 : FD_FN_PURE static inline ag_validator_info_t const * 39 : ag_epoch_info_validator( ag_epoch_info_t const * self, 40 0 : ulong rank ) { 41 0 : FD_TEST( rank<self->validator_cnt ); 42 0 : return ag_epoch_info_validators( self ) + rank; 43 0 : } 44 : 45 : /* Deserialized ag_epoch_info_validator( self, rank )->bls_key */ 46 : 47 : FD_FN_PURE static inline fd_bls_pub_t const * 48 : ag_epoch_info_pubkey( ag_epoch_info_t const * self, 49 0 : ulong rank ) { 50 0 : FD_TEST( rank<self->validator_cnt ); 51 0 : return self->pubkeys + rank; 52 0 : } 53 : 54 : /* EpochInfo::leader */ 55 : 56 : FD_FN_PURE static inline ag_validator_info_t const * 57 : ag_epoch_info_leader( ag_epoch_info_t const * self, 58 0 : ulong slot ) { 59 0 : ulong window = slot / AG_SLOTS_PER_WINDOW; 60 0 : ulong leader_id = window % self->validator_cnt; 61 0 : return ag_epoch_info_validator( self, leader_id ); 62 0 : } 63 : 64 : /* EpochInfo::total_stake */ 65 : 66 : FD_FN_PURE static inline ulong 67 0 : ag_epoch_info_total_stake( ag_epoch_info_t const * self ) { return self->total_stake; } 68 : 69 : /* Definition 13. EpochInfo::is_weakest_quorum, is_weak_quorum, is_quorum, is_strong_quorum */ 70 : 71 : FD_FN_PURE int ag_epoch_info_is_weakest_quorum( ag_epoch_info_t const * self, ulong stake ); 72 : FD_FN_PURE int ag_epoch_info_is_weak_quorum ( ag_epoch_info_t const * self, ulong stake ); 73 : FD_FN_PURE int ag_epoch_info_is_quorum ( ag_epoch_info_t const * self, ulong stake ); 74 : FD_FN_PURE int ag_epoch_info_is_strong_quorum ( ag_epoch_info_t const * self, ulong stake ); 75 : 76 : FD_PROTOTYPES_END 77 : 78 : #endif