Line data Source code
1 : #ifndef HEADER_fd_src_choreo_votor_ag_slot_state_h 2 : #define HEADER_fd_src_choreo_votor_ag_slot_state_h 3 : 4 : #include "ag_votor_base.h" 5 : #include "ag_cert.h" 6 : #include "ag_epoch_info.h" 7 : #include "ag_vote.h" 8 : 9 0 : #define AG_PARENT_STATUS_KNOWN (1) 10 0 : #define AG_PARENT_STATUS_CERTIFIED (2) 11 : 12 0 : #define AG_SLASHABLE_NONE (0) 13 0 : #define AG_SLASHABLE_NOTAR_DIFFERENT_HASH (1) 14 0 : #define AG_SLASHABLE_SKIP_AND_NOTARIZE (2) 15 0 : #define AG_SLASHABLE_SKIP_AND_FINALIZE (3) 16 0 : #define AG_SLASHABLE_NOTAR_FALLBACK_AND_FINALIZE (4) 17 0 : #define AG_SLASHABLE_NOTAR_FALLBACK_OVER_THREE (5) 18 : 19 : #define AG_SLOT_STATE_OUT_CERT_MAX (3UL) 20 : #define AG_SLOT_STATE_OUT_EVENT_MAX (3UL) 21 : #define AG_SLOT_STATE_OUT_REPAIR_MAX (3UL) 22 : 23 0 : #define AG_NOTAR_FALLBACK_HASH_MAX (AG_VAT_MAX*AG_NOTAR_FALLBACK_VOTE_MAX) 24 : 25 : struct ag_vote_stake_ele { 26 : ag_block_id_t block_id; 27 : ulong stake; 28 : ulong next; 29 : ulong prev; 30 : }; 31 : typedef struct ag_vote_stake_ele ag_vote_stake_ele_t; 32 : FD_STATIC_ASSERT( sizeof(ag_vote_stake_ele_t)==64UL, ag_vote_stake_ele ); 33 : 34 : #define POOL_NAME ag_vote_stake_pool 35 0 : #define POOL_T ag_vote_stake_ele_t 36 0 : #define POOL_NEXT next 37 : #define POOL_LAZY 1 38 : #include "../../util/tmpl/fd_pool.c" 39 : 40 : #define MAP_NAME ag_vote_stake_map 41 : #define MAP_ELE_T ag_vote_stake_ele_t 42 0 : #define MAP_KEY block_id 43 : #define MAP_KEY_T ag_block_id_t 44 0 : #define MAP_NEXT next 45 0 : #define MAP_KEY_EQ(k0,k1) (ag_block_id_eq( (k0), (k1) )) 46 0 : #define MAP_KEY_HASH(key,seed) (fd_hash( (seed), (key), sizeof(ag_block_id_t) )) 47 : #include "../../util/tmpl/fd_map_chain.c" 48 : 49 : struct ag_parent_status { 50 : ag_block_hash_t hash; 51 : int kind; 52 : }; 53 : typedef struct ag_parent_status ag_parent_status_t; 54 : 55 : struct ag_block_hash_set { 56 : ag_block_hash_t hash[ AG_EQVOC_BLOCK_HASH_MAX ]; 57 : ulong cnt; 58 : }; 59 : typedef struct ag_block_hash_set ag_block_hash_set_t; 60 : 61 : struct fd_bls_sig_ele { 62 : fd_bls_sig_t sig; 63 : ulong next; 64 : }; 65 : typedef struct fd_bls_sig_ele fd_bls_sig_ele_t; 66 : 67 : #define POOL_NAME fd_bls_sig_pool 68 0 : #define POOL_T fd_bls_sig_ele_t 69 : #include "../../util/tmpl/fd_pool.c" 70 : 71 : struct ag_slot_votes { 72 : fd_bls_set_t notar_set [ fd_bls_set_word_cnt ]; 73 : uint notar_sig_idx [ AG_VAT_MAX ]; 74 : uint notar_hash_stake_idx [ AG_VAT_MAX ]; 75 : ulong notar_hash_stake_head; 76 : ulong notar_hash_stake_cnt; 77 : uint notar_fallback_sig_idx [ AG_VAT_MAX ][ AG_NOTAR_FALLBACK_VOTE_MAX ]; 78 : uint notar_fallback_hash_stake_idx[ AG_VAT_MAX ][ AG_NOTAR_FALLBACK_VOTE_MAX ]; 79 : ulong notar_fallback_hash_stake_head; 80 : ulong notar_fallback_hash_stake_cnt; 81 : uchar notar_fallback_sig_cnt [ AG_VAT_MAX ]; 82 : ulong skip_stake; 83 : uint skip_sig_idx [ AG_VAT_MAX ]; 84 : fd_bls_agg_t skip_agg; 85 : ulong skip_fallback_stake; 86 : uint skip_fallback_sig_idx [ AG_VAT_MAX ]; 87 : fd_bls_agg_t skip_fallback_agg; 88 : ulong finalize_stake; 89 : uint finalize_sig_idx [ AG_VAT_MAX ]; 90 : fd_bls_agg_t finalize_agg; 91 : ulong notar_or_skip_stake; 92 : ulong top_notar_stake; 93 : ag_block_hash_t top_notar_hash; 94 : }; 95 : typedef struct ag_slot_votes ag_slot_votes_t; 96 : 97 : struct ag_slot_certs { 98 : ag_cert_notar_t notar; 99 : ag_cert_notar_fallback_t notar_fallback[ AG_NOTAR_FALLBACK_CERT_MAX ]; 100 : ulong notar_fallback_cnt; 101 : ag_cert_skip_t skip; 102 : ag_cert_fast_final_t fast_finalize; 103 : ag_cert_final_t finalize; 104 : }; 105 : typedef struct ag_slot_certs ag_slot_certs_t; 106 : 107 : struct ag_slot_state { 108 : ag_slot_votes_t votes; 109 : ag_slot_certs_t certs; 110 : 111 : ag_parent_status_t parents[ AG_EQVOC_BLOCK_HASH_MAX ]; 112 : ulong parents_cnt; 113 : 114 : ag_block_hash_set_t pending_safe_to_notar; 115 : ag_block_hash_set_t sent_safe_to_notar; 116 : int sent_safe_to_skip; 117 : 118 : ulong slot; 119 : ulong own_rank; 120 : ushort shred_version; 121 : }; 122 : typedef struct ag_slot_state ag_slot_state_t; 123 : 124 : struct ag_slot_states { 125 : fd_bls_sig_ele_t * bls_sig_pool; 126 : ag_vote_stake_ele_t * notar_hash_stake_pool; 127 : ag_vote_stake_map_t * notar_hash_stake_map; 128 : ag_vote_stake_ele_t * notar_fallback_hash_stake_pool; 129 : ag_vote_stake_map_t * notar_fallback_hash_stake_map; 130 : ag_epoch_info_t const * prev_epoch_info; 131 : ulong prev_epoch_rank; 132 : ulong prev_epoch_slot; 133 : ag_epoch_info_t const * curr_epoch_info; 134 : ulong curr_epoch_rank; 135 : ulong curr_epoch_slot; 136 : ag_epoch_info_t const * next_epoch_info; 137 : ulong next_epoch_rank; 138 : ulong next_epoch_slot; 139 : ulong bls_verify_cnt; 140 : }; 141 : typedef struct ag_slot_states ag_slot_states_t; 142 : 143 : FD_PROTOTYPES_BEGIN 144 : 145 : /* Resets self to an empty slot state. self must be zeroed memory or a 146 : slot state. */ 147 : 148 : void 149 : ag_slot_state_null( ag_slot_state_t * self, 150 : ag_slot_states_t * states ); 151 : 152 : /* Replaces our rank own_rank (USHORT_MAX if unstaked). */ 153 : 154 : void 155 : ag_slot_state_set_own_rank( ag_slot_state_t * self, 156 : ulong own_rank ); 157 : 158 : /* Definition 13. SlotState::add_cert */ 159 : 160 : void 161 : ag_slot_state_add_cert( ag_slot_state_t * self, 162 : ag_cert_t const * cert ); 163 : 164 : /* Definition 12. SlotState::add_vote */ 165 : 166 : int 167 : ag_slot_state_add_vote( ag_slot_state_t * self, 168 : ag_slot_states_t * states, 169 : ag_vote_t const * vote, 170 : ulong stake, 171 : ag_cert_t * out_cert_events, 172 : ulong * out_cert_event_cnt, 173 : ag_block_id_t * out_safe_to_notar, 174 : ulong * out_safe_to_notar_cnt, 175 : ulong * out_safe_to_skip, 176 : ulong * out_safe_to_skip_cnt, 177 : ag_block_id_t * out_repair_events, 178 : ulong * out_repair_event_cnt, 179 : fd_bls_set_t * bad ); 180 : 181 : /* Definition 16. SlotState::notify_parent_known */ 182 : 183 : void 184 : ag_slot_state_notify_parent_known( ag_slot_state_t * self, 185 : ag_block_hash_t const block_hash ); 186 : 187 : /* Definition 16. SlotState::notify_parent_certified */ 188 : 189 : int 190 : ag_slot_state_notify_parent_certified( ag_slot_state_t * self, 191 : ag_slot_states_t * states, 192 : ag_block_hash_t const block_hash, 193 : fd_bls_set_t * bad ); 194 : 195 : /* SlotState::check_slashable_offence */ 196 : 197 : FD_FN_PURE int 198 : ag_slot_state_check_slashable_offence( ag_slot_state_t const * self, 199 : ag_slot_states_t const * states, 200 : ag_vote_t const * vote ); 201 : 202 : /* Definition 12. SlotState::should_ignore_vote */ 203 : 204 : FD_FN_PURE int 205 : ag_slot_state_should_ignore_vote( ag_slot_state_t const * self, 206 : ag_slot_states_t const * states, 207 : ag_vote_t const * vote ); 208 : 209 : /* Definition 13. SlotState::is_notar_fallback */ 210 : 211 : FD_FN_PURE int 212 : ag_slot_state_is_notar_fallback( ag_slot_state_t const * self, 213 : ag_block_hash_t const block_hash ); 214 : 215 : /* Definition 13. SlotState::is_notar_fallback_or_stronger */ 216 : 217 : FD_FN_PURE int 218 : ag_slot_state_is_notar_fallback_or_stronger( ag_slot_state_t const * self, 219 : ag_block_hash_t const block_hash ); 220 : 221 : /* Accessors for reward certs */ 222 : 223 : fd_bls_agg_t * 224 : ag_slot_state_notar_reward_agg( ag_slot_state_t const * self, 225 : ag_slot_states_t const * states, 226 : fd_bls_agg_t * out ); 227 : 228 : FD_FN_PURE fd_bls_agg_t const * 229 : ag_slot_state_skip_reward_agg( ag_slot_state_t const * self ); 230 : 231 : /* Copies the kind vote sigs of the ranks in set into out[ rank ]. 232 : block_hash selects the sig for notar fallback; for notar the caller 233 : filters set by hash. */ 234 : 235 : fd_bls_sig_t * 236 : ag_slot_state_sigs( ag_slot_state_t const * self, 237 : ag_slot_states_t const * states, 238 : uint kind, 239 : ag_block_hash_t const block_hash, 240 : fd_bls_set_t const * set, 241 : fd_bls_sig_t * out ); 242 : 243 : FD_PROTOTYPES_END 244 : 245 : #endif