Line data Source code
1 : #ifndef HEADER_fd_src_choreo_votor_ag_votor_h
2 : #define HEADER_fd_src_choreo_votor_ag_votor_h
3 :
4 : #include "ag_votor_base.h"
5 : #include "../../ballet/bls/fd_bls.h"
6 : #include "ag_pool.h"
7 :
8 0 : #define AG_VOTOR_REASON_BLOCK_REPLAYED (0)
9 0 : #define AG_VOTOR_REASON_PARENT_READY (1)
10 0 : #define AG_VOTOR_REASON_BLOCK_NOTARIZED (2)
11 0 : #define AG_VOTOR_REASON_TIMEOUT (3)
12 0 : #define AG_VOTOR_REASON_SAFE_TO_NOTAR (4)
13 0 : #define AG_VOTOR_REASON_SAFE_TO_SKIP (5)
14 :
15 : typedef struct ag_votor ag_votor_t;
16 :
17 : struct ag_votor_metrics {
18 : ulong slot_state_pool_used;
19 : ulong slot_state_pool_free;
20 : ulong highest_final_cert_slot;
21 : ulong vote_events_cnt;
22 : };
23 : typedef struct ag_votor_metrics ag_votor_metrics_t;
24 :
25 : FD_PROTOTYPES_BEGIN
26 :
27 : FD_FN_CONST ulong
28 : ag_votor_align( void );
29 :
30 : FD_FN_CONST ulong
31 : ag_votor_footprint( ulong slot_max );
32 :
33 : void *
34 : ag_votor_new( void * mem,
35 : ulong slot_max,
36 : ulong seed );
37 :
38 : ag_votor_t *
39 : ag_votor_join( void * mem );
40 :
41 : void *
42 : ag_votor_leave( ag_votor_t const * votor );
43 :
44 : void *
45 : ag_votor_delete( void * mem );
46 :
47 : /* ag_votor_init starts votor at root, a finalized block that is
48 : treated as notarized (Section 2.9). It does not arm the root
49 : window's skip timeouts; call ag_votor_arm_skip_timeouts for that. */
50 :
51 : void
52 : ag_votor_init( ag_votor_t * self,
53 : ag_block_id_t const * root,
54 : long now,
55 : long ns_per_slot,
56 : ushort shred_version,
57 : fd_bls_sign_fn sign_fn,
58 : void * sign_ctx );
59 :
60 : /* ag_votor_arm_skip_timeouts arms the root window's skip timeouts at
61 : now. Split from init so a wait-for-supermajority can arm them at
62 : the restart instant: set_timeout only lowers a live deadline, so
63 : timeouts armed at boot cannot be moved out afterwards. Call once. */
64 :
65 : void
66 : ag_votor_arm_skip_timeouts( ag_votor_t * self,
67 : long now );
68 :
69 : void
70 : ag_votor_fini( ag_votor_t * self );
71 :
72 : FD_FN_PURE ag_votor_metrics_t
73 : ag_votor_metrics( ag_votor_t const * self );
74 :
75 : void
76 : ag_votor_advance_epoch( ag_votor_t * self,
77 : long ns_per_slot,
78 : ulong epoch_rank,
79 : ulong epoch_slot,
80 : ag_bls_key_t const bls_key );
81 :
82 : void
83 : ag_votor_set_bls_key( ag_votor_t * self,
84 : ulong epoch_slot,
85 : ag_bls_key_t const bls_key );
86 :
87 : void
88 : ag_votor_set_rank( ag_votor_t * self,
89 : ulong epoch_slot,
90 : ulong epoch_rank );
91 :
92 : /* Algorithm 1, lines 9-25. Votor::handle_pool_event */
93 :
94 : ag_cert_t const *
95 : ag_votor_handle_pool_event( ag_votor_t * self,
96 : ag_pool_event_t const * event,
97 : long now );
98 :
99 : /* Algorithm 1, lines 1-5. Votor::handle_blockstore_event, Block */
100 :
101 : void
102 : ag_votor_process_replay( ag_votor_t * self,
103 : ulong slot,
104 : ag_block_info_t const * block_info );
105 :
106 : /* ag_votor_set_catchup_vote_slot raises the first slot worth a vote
107 : while catching up, from verified certs past the pool window. Below
108 : it, state still advances, but votes are not signed and certs not
109 : broadcast. */
110 :
111 : void
112 : ag_votor_set_catchup_vote_slot( ag_votor_t * self,
113 : ulong slot );
114 :
115 : /* Algorithm 1, lines 6-8. Votor::handle_timeout_event */
116 :
117 : void
118 : ag_votor_handle_skip_timeout( ag_votor_t * self,
119 : ulong slot );
120 :
121 : int
122 : ag_votor_poll_skip_timeout( ag_votor_t * self,
123 : long now,
124 : ulong * slot );
125 :
126 : FD_FN_PURE long
127 : ag_votor_next_skip_timeout( ag_votor_t const * self );
128 :
129 : int
130 : ag_votor_poll_vote( ag_votor_t * self,
131 : ag_vote_t * vote,
132 : uchar * reason );
133 :
134 : FD_PROTOTYPES_END
135 :
136 : #endif
|