Line data Source code
1 : #ifndef HEADER_fd_src_choreo_votor_fd_votor_pool_h
2 : #define HEADER_fd_src_choreo_votor_fd_votor_pool_h
3 :
4 : #include "fd_votor_base.h"
5 : #include "fd_cert.h"
6 : #include "fd_epoch_info.h"
7 : #include "fd_parent_ready_tracker.h" /* fd_parent_ready_t */
8 : #include "fd_vote.h"
9 :
10 0 : #define FD_VOTOR_POOL_SUCCESS ( 0)
11 0 : #define FD_VOTOR_POOL_ERR_SLOT_TOO_OLD (-1)
12 0 : #define FD_VOTOR_POOL_ERR_SLOT_TOO_NEW (-2)
13 0 : #define FD_VOTOR_POOL_ERR_DUPLICATE (-3)
14 0 : #define FD_VOTOR_POOL_ERR_SLASHABLE (-4)
15 0 : #define FD_VOTOR_POOL_ERR_CERT_VERIFY (-5)
16 0 : #define FD_VOTOR_POOL_ERR_VOTE_VERIFY (-6)
17 :
18 0 : #define FD_VOTOR_POOL_QUORUM_REACHED_FINAL (FD_CERT_KIND_FINAL)
19 0 : #define FD_VOTOR_POOL_QUORUM_REACHED_FAST_FINAL (FD_CERT_KIND_FAST_FINAL)
20 0 : #define FD_VOTOR_POOL_QUORUM_REACHED_NOTAR (FD_CERT_KIND_NOTAR)
21 0 : #define FD_VOTOR_POOL_QUORUM_REACHED_NOTAR_FALLBACK (FD_CERT_KIND_NOTAR_FALLBACK)
22 0 : #define FD_VOTOR_POOL_QUORUM_REACHED_SKIP (FD_CERT_KIND_SKIP)
23 0 : #define FD_VOTOR_POOL_QUORUM_REACHED_SAFE_TO_NOTAR (5)
24 0 : #define FD_VOTOR_POOL_QUORUM_REACHED_SAFE_TO_SKIP (6)
25 :
26 0 : #define FD_VOTOR_POOL_EVENT_PARENT_READY (0) /* Definition 15, ParentReady. PoolEvent::ParentReady */
27 0 : #define FD_VOTOR_POOL_EVENT_SAFE_TO_NOTAR (1) /* Definition 16, SafeToNotar. PoolEvent::SafeToNotar */
28 0 : #define FD_VOTOR_POOL_EVENT_SAFE_TO_SKIP (2) /* Definition 16, SafeToSkip. PoolEvent::SafeToSkip */
29 0 : #define FD_VOTOR_POOL_EVENT_CERT_CREATED (3) /* Definition 13. PoolEvent::CertCreated */
30 : #define FD_VOTOR_POOL_EVENT_STANDSTILL (4) /* Section 4.1. PoolEvent::Standstill */
31 :
32 0 : #define FD_VOTOR_POOL_EVENT_IMPLICITLY_SKIPPED (5) /* Firedancer only: for other tiles, never routed to fd_votor_loop */
33 0 : #define FD_VOTOR_POOL_EVENT_IMPLICITLY_FINALIZED (6) /* Firedancer only: for other tiles, never routed to fd_votor_loop */
34 :
35 : typedef struct fd_votor_pool fd_votor_pool_t;
36 :
37 : struct fd_votor_pool_event {
38 : int kind;
39 : union {
40 : fd_parent_ready_t parent_ready;
41 : fd_block_id_t safe_to_notar;
42 : ulong safe_to_skip;
43 : fd_cert_t cert_created;
44 : fd_standstill_t standstill;
45 : ulong implicitly_skipped;
46 : fd_block_id_t implicitly_finalized;
47 : };
48 : };
49 : typedef struct fd_votor_pool_event fd_votor_pool_event_t;
50 :
51 : struct fd_votor_pool_standstill_iter {
52 : ulong finalized;
53 : ulong slot; /* ULONG_MAX when done */
54 : ulong idx;
55 : int is_vote;
56 : union {
57 : fd_cert_t cert;
58 : fd_vote_t vote;
59 : };
60 : };
61 : typedef struct fd_votor_pool_standstill_iter fd_votor_pool_standstill_iter_t;
62 :
63 : struct fd_votor_pool_metrics {
64 : ulong slot_state_pool_used;
65 : ulong slot_state_pool_free;
66 : ulong finalized_slot;
67 : ulong pool_events_cnt;
68 : ulong bls_verify_cnt;
69 : };
70 : typedef struct fd_votor_pool_metrics fd_votor_pool_metrics_t;
71 :
72 : FD_PROTOTYPES_BEGIN
73 :
74 : FD_FN_CONST ulong
75 : fd_votor_pool_align( void );
76 :
77 : FD_FN_CONST ulong
78 : fd_votor_pool_footprint( ulong slot_max,
79 : ulong burst );
80 :
81 : void *
82 : fd_votor_pool_new( void * mem,
83 : ulong slot_max,
84 : ulong burst,
85 : ulong seed );
86 :
87 : fd_votor_pool_t *
88 : fd_votor_pool_join( void * mem );
89 :
90 : void *
91 : fd_votor_pool_leave( fd_votor_pool_t const * self );
92 :
93 : void *
94 : fd_votor_pool_delete( void * mem );
95 :
96 : FD_FN_PURE fd_votor_pool_metrics_t
97 : fd_votor_pool_metrics( fd_votor_pool_t const * self );
98 :
99 : void
100 : fd_votor_pool_from_snapshot( fd_votor_pool_t * self,
101 : fd_block_id_t const * root );
102 :
103 : void
104 : fd_votor_pool_from_genesis( fd_votor_pool_t * self,
105 : fd_block_id_t const * genesis );
106 :
107 : void
108 : fd_votor_pool_advance_epoch( fd_votor_pool_t * self,
109 : fd_epoch_info_t const * epoch_info,
110 : ulong epoch_rank,
111 : ulong epoch_slot );
112 :
113 : void
114 : fd_votor_pool_update_own_rank( fd_votor_pool_t * self,
115 : ulong epoch_slot,
116 : ulong epoch_rank );
117 :
118 : /* Definition 16, SafeToNotar. Pool::add_block */
119 :
120 : int
121 : fd_votor_pool_add_block( fd_votor_pool_t * self,
122 : fd_block_id_t const * block_id,
123 : fd_block_id_t const * parent_id,
124 : fd_bls_set_t * bad );
125 :
126 : /* Definition 13. Pool::add_cert */
127 :
128 : int
129 : fd_votor_pool_add_cert( fd_votor_pool_t * self,
130 : fd_cert_t const * cert,
131 : int verified,
132 : fd_bls_set_t * bad );
133 :
134 : /* Definition 12. Pool::add_vote */
135 :
136 : int
137 : fd_votor_pool_add_vote( fd_votor_pool_t * self,
138 : fd_vote_t const * vote,
139 : int verified,
140 : fd_bls_set_t * bad,
141 : uchar * quorum_reached );
142 :
143 : fd_block_hash_t const *
144 : fd_votor_pool_agg_rewards( fd_votor_pool_t * self,
145 : ulong slot,
146 : fd_bls_agg_t * notar,
147 : fd_bls_agg_t * skip,
148 : fd_bls_set_t * bad );
149 :
150 : fd_cert_final_t *
151 : fd_votor_pool_final_cert( fd_votor_pool_t const * self,
152 : ulong slot,
153 : fd_cert_final_t * out );
154 :
155 : fd_cert_notar_t *
156 : fd_votor_pool_notar_cert( fd_votor_pool_t const * self,
157 : ulong slot,
158 : fd_cert_notar_t * out );
159 :
160 : /* Section 4.1. Pool::recover_from_standstill */
161 :
162 : fd_votor_pool_standstill_iter_t *
163 : fd_votor_pool_standstill_iter_init( fd_votor_pool_standstill_iter_t * iter,
164 : fd_votor_pool_t const * self );
165 :
166 : fd_votor_pool_standstill_iter_t *
167 : fd_votor_pool_standstill_iter_next( fd_votor_pool_standstill_iter_t * iter,
168 : fd_votor_pool_t const * self );
169 :
170 : FD_FN_PURE int
171 : fd_votor_pool_standstill_iter_done( fd_votor_pool_standstill_iter_t const * iter );
172 :
173 : /* Definition 14. Pool::finalized_slot */
174 :
175 : FD_FN_PURE ulong
176 : fd_votor_pool_finalized_slot( fd_votor_pool_t const * self );
177 :
178 : FD_FN_PURE fd_block_hash_t const *
179 : fd_votor_pool_finalized_block_hash( fd_votor_pool_t const * self );
180 :
181 : FD_FN_PURE ulong
182 : fd_votor_pool_highest_parent_ready( fd_votor_pool_t const * self );
183 :
184 : /* Definition 15, ParentReady. Pool::parents_ready. */
185 :
186 : ulong
187 : fd_votor_pool_parents_ready( fd_votor_pool_t const * self,
188 : ulong slot,
189 : fd_block_id_t * out,
190 : ulong out_max );
191 :
192 : /* Definition 15, ParentReady. Pool::wait_for_parent_ready. */
193 :
194 : FD_FN_PURE fd_block_id_t
195 : fd_votor_pool_wait_for_parent_ready( fd_votor_pool_t const * self,
196 : ulong slot );
197 :
198 : int
199 : fd_votor_pool_poll_pool_event( fd_votor_pool_t * self,
200 : fd_votor_pool_event_t * event );
201 :
202 : int
203 : fd_votor_pool_poll_repair_event( fd_votor_pool_t * self,
204 : fd_block_id_t * block );
205 :
206 : FD_PROTOTYPES_END
207 :
208 : #endif
|