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_event.h" 8 : #include "ag_vote.h" 9 : #include "../../util/fd_hash32.h" 10 : 11 33 : #define AG_PARENT_STATUS_KNOWN (1) 12 21 : #define AG_PARENT_STATUS_CERTIFIED (2) 13 : 14 4194 : #define AG_SLASHABLE_NONE (0) 15 3 : #define AG_SLASHABLE_NOTAR_DIFFERENT_HASH (1) 16 6 : #define AG_SLASHABLE_SKIP_AND_NOTARIZE (2) 17 12 : #define AG_SLASHABLE_SKIP_AND_FINALIZE (3) 18 6 : #define AG_SLASHABLE_NOTAR_FALLBACK_AND_FINALIZE (4) 19 6 : #define AG_SLASHABLE_NOTAR_FALLBACK_OVER_THREE (5) 20 : 21 : #define AG_SLOT_STATE_OUT_CERT_MAX (3UL) 22 : #define AG_SLOT_STATE_OUT_EVENT_MAX (3UL) 23 : #define AG_SLOT_STATE_OUT_REPAIR_MAX (3UL) 24 : 25 16844223 : #define AG_NOTAR_MAP_LG_SLOT_CNT (11) 26 5206344 : #define AG_NOTAR_FALLBACK_MAP_LG_SLOT_CNT (13) 27 : FD_STATIC_ASSERT( AG_VAT_MAX <(1UL<<AG_NOTAR_MAP_LG_SLOT_CNT ), notar_map ); 28 : FD_STATIC_ASSERT( AG_VAT_MAX*AG_NOTAR_FALLBACK_VOTE_MAX<(1UL<<AG_NOTAR_FALLBACK_MAP_LG_SLOT_CNT), notar_fallback_map ); 29 : 30 : struct ag_slot_voted_stake_hash { 31 : ag_block_hash_key_t hash; 32 : ulong stake; 33 : fd_bls_agg_t agg; 34 : }; 35 : typedef struct ag_slot_voted_stake_hash ag_slot_voted_stake_hash_t; 36 : 37 : #define MAP_NAME notar_map 38 20841 : #define MAP_T ag_slot_voted_stake_hash_t 39 16844223 : #define MAP_LG_SLOT_CNT AG_NOTAR_MAP_LG_SLOT_CNT 40 1428846 : #define MAP_KEY hash 41 150882 : #define MAP_KEY_T ag_block_hash_key_t 42 1277964 : #define MAP_KEY_NULL ((ag_block_hash_key_t){ .ul = { ULONG_MAX, ULONG_MAX, ULONG_MAX, ULONG_MAX } }) 43 15601923 : #define MAP_KEY_INVAL(k) (((k).ul[0]&(k).ul[1]&(k).ul[2]&(k).ul[3])==ULONG_MAX) 44 144480 : #define MAP_KEY_EQUAL(k0,k1) (!memcmp( &(k0), &(k1), sizeof(ag_block_hash_key_t) )) 45 : #define MAP_KEY_EQUAL_IS_SLOW 1 46 35148 : #define MAP_KEY_HASH(key) ((uint)fd_hash32( (key).uc, 42UL )) 47 : #define MAP_MEMOIZE 0 48 : #include "../../util/tmpl/fd_map.c" 49 : 50 : #define MAP_NAME notar_fallback_map 51 40413 : #define MAP_T ag_slot_voted_stake_hash_t 52 5206344 : #define MAP_LG_SLOT_CNT AG_NOTAR_FALLBACK_MAP_LG_SLOT_CNT 53 5205717 : #define MAP_KEY hash 54 93909 : #define MAP_KEY_T ag_block_hash_key_t 55 5111808 : #define MAP_KEY_NULL ((ag_block_hash_key_t){ .ul = { ULONG_MAX, ULONG_MAX, ULONG_MAX, ULONG_MAX } }) 56 93969 : #define MAP_KEY_INVAL(k) (((k).ul[0]&(k).ul[1]&(k).ul[2]&(k).ul[3])==ULONG_MAX) 57 75864 : #define MAP_KEY_EQUAL(k0,k1) (!memcmp( &(k0), &(k1), sizeof(ag_block_hash_key_t) )) 58 : #define MAP_KEY_EQUAL_IS_SLOW 1 59 39789 : #define MAP_KEY_HASH(key) ((uint)fd_hash32( (key).uc, 42UL )) 60 : #define MAP_MEMOIZE 0 61 : #include "../../util/tmpl/fd_map.c" 62 : 63 : 64 : struct ag_parent_status { 65 : ag_block_hash_t hash; 66 : int kind; 67 : }; 68 : typedef struct ag_parent_status ag_parent_status_t; 69 : 70 : struct ag_block_hash_set { 71 : ulong cnt; 72 : ag_block_hash_t hash[ AG_EQVOC_BLOCK_HASH_MAX ]; 73 : }; 74 : typedef struct ag_block_hash_set ag_block_hash_set_t; 75 : 76 : struct ag_slot_voted_stake { 77 : ag_slot_voted_stake_hash_t notar[ 1UL<<AG_NOTAR_MAP_LG_SLOT_CNT ]; 78 : fd_bls_sig_t notar_sig[ AG_VAT_MAX ]; 79 : ag_slot_voted_stake_hash_t notar_fallback[ 1UL<<AG_NOTAR_FALLBACK_MAP_LG_SLOT_CNT ]; 80 : fd_bls_sig_t notar_fallback_sig[ AG_VAT_MAX ][ AG_NOTAR_FALLBACK_VOTE_MAX ]; 81 : ag_block_hash_t notar_fallback_sig_hash[ AG_VAT_MAX ][ AG_NOTAR_FALLBACK_VOTE_MAX ]; 82 : uchar notar_fallback_sig_cnt[ AG_VAT_MAX ]; 83 : ulong skip; 84 : fd_bls_sig_t skip_sig[ AG_VAT_MAX ]; 85 : fd_bls_agg_t skip_agg; 86 : ulong skip_fallback; 87 : fd_bls_sig_t skip_fallback_sig[ AG_VAT_MAX ]; 88 : fd_bls_agg_t skip_fallback_agg; 89 : ulong finalize; 90 : fd_bls_sig_t finalize_sig[ AG_VAT_MAX ]; 91 : fd_bls_agg_t finalize_agg; 92 : ulong notar_or_skip; 93 : ulong top_notar; 94 : ag_block_hash_t top_notar_hash; 95 : }; 96 : typedef struct ag_slot_voted_stake ag_slot_voted_stake_t; 97 : 98 : struct ag_slot_certs { 99 : ag_cert_notar_t notar; 100 : ag_cert_notar_fallback_t notar_fallback[ AG_NOTAR_FALLBACK_CERT_MAX ]; 101 : ulong notar_fallback_cnt; 102 : ag_cert_skip_t skip; 103 : ag_cert_fast_final_t fast_finalize; 104 : ag_cert_final_t finalize; 105 : }; 106 : typedef struct ag_slot_certs ag_slot_certs_t; 107 : 108 : struct __attribute__((aligned(128UL))) ag_slot_state { 109 : ag_slot_voted_stake_t votes; /* the reference's votes and voted_stakes combined */ 110 : ag_slot_certs_t certs; 111 : 112 : ag_parent_status_t parents[ AG_EQVOC_BLOCK_HASH_MAX ]; 113 : ulong parents_cnt; 114 : 115 : ag_block_hash_set_t pending_safe_to_notar; 116 : ag_block_hash_set_t sent_safe_to_notar; 117 : int sent_safe_to_skip; 118 : 119 : ulong slot; 120 : ulong own_rank; 121 : ushort shred_version; 122 : 123 : ag_epoch_info_t const * epoch_info; 124 : }; 125 : typedef struct ag_slot_state ag_slot_state_t; 126 : 127 : FD_PROTOTYPES_BEGIN 128 : 129 : void 130 : ag_slot_state_zero( ag_slot_state_t * self, 131 : ulong slot, 132 : ag_epoch_info_t const * epoch_info, 133 : ulong own_rank ); 134 : 135 : void 136 : ag_slot_state_add_cert( ag_slot_state_t * self, 137 : ag_cert_t const * cert ); 138 : 139 : int 140 : ag_slot_state_add_vote( ag_slot_state_t * self, 141 : ag_vote_t const * vote, 142 : ulong stake, 143 : ag_event_cert_t * out_cert_events, 144 : ulong * out_cert_event_cnt, 145 : ag_event_pool_t * out_pool_events, 146 : ulong * out_pool_event_cnt, 147 : ag_event_repair_t * out_repair_events, 148 : ulong * out_repair_event_cnt, 149 : fd_bls_set_t * bad ); 150 : 151 : void 152 : ag_slot_state_notify_parent_known( ag_slot_state_t * self, 153 : ag_block_hash_t const block_hash ); 154 : 155 : int 156 : ag_slot_state_notify_parent_certified( ag_slot_state_t * self, 157 : ag_block_hash_t const block_hash, 158 : fd_bls_set_t * bad ); 159 : 160 : FD_FN_PURE int 161 : ag_slot_state_check_slashable_offence( ag_slot_state_t const * self, 162 : ag_vote_t const * vote ); 163 : 164 : FD_FN_PURE int 165 : ag_slot_state_should_ignore_vote( ag_slot_state_t const * self, 166 : ag_vote_t const * vote ); 167 : 168 : FD_FN_PURE int 169 : ag_slot_state_is_notar_fallback( ag_slot_state_t const * self, 170 : ag_block_hash_t const block_hash ); 171 : 172 : FD_FN_PURE int 173 : ag_slot_state_is_notar_fallback_or_stronger( ag_slot_state_t const * self, 174 : ag_block_hash_t const block_hash ); 175 : 176 : FD_PROTOTYPES_END 177 : 178 : #endif