Line data Source code
1 : #ifndef HEADER_fd_src_disco_gui_fd_gui_h
2 : #define HEADER_fd_src_disco_gui_fd_gui_h
3 :
4 : #include "../fd_disco_base.h"
5 :
6 : #include "../pack/fd_microblock.h"
7 : #include "../../waltz/http/fd_http_server.h"
8 : #include "../../flamenco/leaders/fd_leaders.h"
9 : #include "../../util/hist/fd_histf.h"
10 :
11 : #include "../topo/fd_topo.h"
12 :
13 0 : #define FD_GUI_SLOTS_CNT (864000UL)
14 0 : #define FD_GUI_TPS_HISTORY_WINDOW_DURATION_SECONDS (10L) /* 10 second moving average */
15 0 : #define FD_GUI_TPS_HISTORY_SAMPLE_CNT (150UL)
16 0 : #define FD_GUI_TILE_TIMER_SNAP_CNT (512UL)
17 0 : #define FD_GUI_TILE_TIMER_LEADER_CNT (4096UL)
18 0 : #define FD_GUI_TILE_TIMER_LEADER_DOWNSAMPLE_CNT (50UL)
19 : #define FD_GUI_TILE_TIMER_TILE_CNT (128UL)
20 : #define FD_GUI_MAX_PEER_CNT (40200UL)
21 :
22 0 : #define FD_GUI_SLOT_LEVEL_INCOMPLETE (0)
23 0 : #define FD_GUI_SLOT_LEVEL_COMPLETED (1)
24 0 : #define FD_GUI_SLOT_LEVEL_OPTIMISTICALLY_CONFIRMED (2)
25 0 : #define FD_GUI_SLOT_LEVEL_ROOTED (3)
26 0 : #define FD_GUI_SLOT_LEVEL_FINALIZED (4)
27 :
28 0 : #define FD_GUI_VOTE_STATE_NON_VOTING (0)
29 0 : #define FD_GUI_VOTE_STATE_VOTING (1)
30 0 : #define FD_GUI_VOTE_STATE_DELINQUENT (2)
31 :
32 0 : #define FD_GUI_START_PROGRESS_TYPE_INITIALIZING ( 0)
33 0 : #define FD_GUI_START_PROGRESS_TYPE_SEARCHING_FOR_FULL_SNAPSHOT ( 1)
34 0 : #define FD_GUI_START_PROGRESS_TYPE_DOWNLOADING_FULL_SNAPSHOT ( 2)
35 0 : #define FD_GUI_START_PROGRESS_TYPE_SEARCHING_FOR_INCREMENTAL_SNAPSHOT ( 3)
36 0 : #define FD_GUI_START_PROGRESS_TYPE_DOWNLOADING_INCREMENTAL_SNAPSHOT ( 4)
37 0 : #define FD_GUI_START_PROGRESS_TYPE_CLEANING_BLOCK_STORE ( 5)
38 0 : #define FD_GUI_START_PROGRESS_TYPE_CLEANING_ACCOUNTS ( 6)
39 0 : #define FD_GUI_START_PROGRESS_TYPE_LOADING_LEDGER ( 7)
40 0 : #define FD_GUI_START_PROGRESS_TYPE_PROCESSING_LEDGER ( 8)
41 0 : #define FD_GUI_START_PROGRESS_TYPE_STARTING_SERVICES ( 9)
42 0 : #define FD_GUI_START_PROGRESS_TYPE_HALTED (10)
43 0 : #define FD_GUI_START_PROGRESS_TYPE_WAITING_FOR_SUPERMAJORITY (11)
44 0 : #define FD_GUI_START_PROGRESS_TYPE_RUNNING (12)
45 :
46 : /* Ideally, we would store an entire epoch's worth of transactions. If
47 : we assume any given validator will have at most 5% stake, and average
48 : transactions per slot is around 10_000, then an epoch will have about
49 : 432_000*10_000*0.05 transactions (~2^28).
50 :
51 : Unfortunately, the transaction struct is 100+ bytes. If we sized the
52 : array to 2^28 entries then the memory required would be ~26GB. In
53 : order to keep memory usage to a more reasonable level, we'll
54 : arbitrarily use a fourth of that size. */
55 0 : #define FD_GUI_TXN_HISTORY_SZ (1UL<<26UL)
56 :
57 0 : #define FD_GUI_TXN_FLAGS_STARTED ( 1U)
58 0 : #define FD_GUI_TXN_FLAGS_ENDED ( 2U)
59 0 : #define FD_GUI_TXN_FLAGS_IS_SIMPLE_VOTE ( 4U)
60 0 : #define FD_GUI_TXN_FLAGS_FROM_BUNDLE ( 8U)
61 0 : #define FD_GUI_TXN_FLAGS_LANDED_IN_BLOCK (16U)
62 :
63 : struct fd_gui_gossip_peer {
64 : fd_pubkey_t pubkey[ 1 ];
65 : ulong wallclock;
66 : ushort shred_version;
67 :
68 : int has_version;
69 : struct {
70 : ushort major;
71 : ushort minor;
72 : ushort patch;
73 :
74 : int has_commit;
75 : uint commit;
76 :
77 : uint feature_set;
78 : } version;
79 :
80 : struct {
81 : uint ipv4;
82 : ushort port;
83 : } sockets[ 12 ];
84 : };
85 :
86 : struct fd_gui_vote_account {
87 : fd_pubkey_t pubkey[ 1 ];
88 : fd_pubkey_t vote_account[ 1 ];
89 :
90 : ulong activated_stake;
91 : ulong last_vote;
92 : ulong root_slot;
93 : ulong epoch_credits;
94 : uchar commission;
95 : int delinquent;
96 : };
97 :
98 : struct fd_gui_validator_info {
99 : fd_pubkey_t pubkey[ 1 ];
100 :
101 : char name[ 64 ];
102 : char website[ 128 ];
103 : char details[ 256 ];
104 : char icon_uri[ 128 ];
105 : };
106 :
107 : struct fd_gui_txn_waterfall {
108 : struct {
109 : ulong quic;
110 : ulong udp;
111 : ulong gossip;
112 : ulong block_engine;
113 : ulong pack_cranked;
114 : } in;
115 :
116 : struct {
117 : ulong net_overrun;
118 : ulong quic_overrun;
119 : ulong quic_frag_drop;
120 : ulong quic_abandoned;
121 : ulong tpu_quic_invalid;
122 : ulong tpu_udp_invalid;
123 : ulong verify_overrun;
124 : ulong verify_parse;
125 : ulong verify_failed;
126 : ulong verify_duplicate;
127 : ulong dedup_duplicate;
128 : ulong resolv_lut_failed;
129 : ulong resolv_expired;
130 : ulong resolv_ancient;
131 : ulong resolv_no_ledger;
132 : ulong resolv_retained;
133 : ulong pack_invalid;
134 : ulong pack_invalid_bundle;
135 : ulong pack_expired;
136 : ulong pack_retained;
137 : ulong pack_wait_full;
138 : ulong pack_leader_slow;
139 : ulong bank_invalid;
140 : ulong block_success;
141 : ulong block_fail;
142 : } out;
143 : };
144 :
145 : typedef struct fd_gui_txn_waterfall fd_gui_txn_waterfall_t;
146 :
147 : struct fd_gui_tile_timers {
148 : ulong caughtup_housekeeping_ticks;
149 : ulong processing_housekeeping_ticks;
150 : ulong backpressure_housekeeping_ticks;
151 :
152 : ulong caughtup_prefrag_ticks;
153 : ulong processing_prefrag_ticks;
154 : ulong backpressure_prefrag_ticks;
155 :
156 : ulong caughtup_postfrag_ticks;
157 : ulong processing_postfrag_ticks;
158 : };
159 :
160 : typedef struct fd_gui_tile_timers fd_gui_tile_timers_t;
161 :
162 : struct fd_gui_tile_stats {
163 : long sample_time_nanos;
164 :
165 : ulong net_in_rx_bytes; /* Number of bytes received by the net or sock tile*/
166 : ulong quic_conn_cnt; /* Number of active QUIC connections */
167 : fd_histf_t bundle_rx_delay_hist; /* Histogram of bundle rx delay */
168 : ulong bundle_rtt_smoothed_nanos; /* RTT (nanoseconds) moving average */
169 : ulong verify_drop_cnt; /* Number of transactions dropped by verify tiles */
170 : ulong verify_total_cnt; /* Number of transactions received by verify tiles */
171 : ulong dedup_drop_cnt; /* Number of transactions dropped by dedup tile */
172 : ulong dedup_total_cnt; /* Number of transactions received by dedup tile */
173 : ulong pack_buffer_cnt; /* Number of buffered transactions in the pack tile */
174 : ulong pack_buffer_capacity; /* Total size of the pack transaction buffer */
175 : ulong bank_txn_exec_cnt; /* Number of transactions processed by the bank tile */
176 : ulong net_out_tx_bytes; /* Number of bytes sent by the net or sock tile */
177 : };
178 :
179 : typedef struct fd_gui_tile_stats fd_gui_tile_stats_t;
180 :
181 0 : #define FD_GUI_SLOT_LEADER_UNSTARTED (0UL)
182 0 : #define FD_GUI_SLOT_LEADER_STARTED (1UL)
183 0 : #define FD_GUI_SLOT_LEADER_ENDED (2UL)
184 :
185 : struct fd_gui_slot {
186 : ulong slot;
187 : ulong parent_slot;
188 : uint max_compute_units;
189 : long completed_time;
190 : int mine;
191 : int skipped;
192 : int must_republish;
193 : int level;
194 : uint total_txn_cnt;
195 : uint vote_txn_cnt;
196 : uint failed_txn_cnt;
197 : uint nonvote_failed_txn_cnt;
198 : uint compute_units;
199 : ulong transaction_fee;
200 : ulong priority_fee;
201 : ulong tips;
202 :
203 : uchar leader_state;
204 :
205 : struct {
206 : long leader_start_time; /* UNIX timestamp of when we first became leader in this slot */
207 : long leader_end_time; /* UNIX timestamp of when we stopped being leader in this slot */
208 :
209 : long reference_ticks; /* A somewhat arbitrary reference tickcount, that we use for compressing the tickcounts
210 : of transaction start and end times in this slot. It is, roughly (not exactly), the
211 : minimum of the first transaction start or end tickcount, and the time of the message
212 : from poh to pack telling it to become leader. */
213 : long reference_nanos; /* The UNIX timestamp in nanoseconds of the reference tick value above. */
214 :
215 : uint microblocks_upper_bound; /* An upper bound on the number of microblocks in the slot. If the number of
216 : microblocks observed is equal to this, the slot can be considered over.
217 : Generally, the bound is set to a "final" state by a done packing message,
218 : which sets it to the exact number of microblocks, but sometimes this message
219 : is not sent, if the max upper bound published by poh was already correct. */
220 : uint begin_microblocks; /* The number of microblocks we have seen be started (sent) from pack to banks. */
221 : uint end_microblocks; /* The number of microblocks we have seen be ended (sent) from banks to poh. The
222 : slot is only considered over if the begin and end microblocks seen are both equal
223 : to the microblock upper bound. */
224 :
225 : ulong start_offset; /* The smallest pack transaction index for this slot. The first transaction for this slot will
226 : be written to gui->txs[ start_offset%FD_GUI_TXN_HISTORY_SZ ]. */
227 : ulong end_offset; /* The largest pack transaction index for this slot, plus 1. The last transaction for this
228 : slot will be written to gui->txs[ (start_offset-1)%FD_GUI_TXN_HISTORY_SZ ]. */
229 : } txs;
230 :
231 : fd_gui_txn_waterfall_t waterfall_begin[ 1 ];
232 : fd_gui_txn_waterfall_t waterfall_end[ 1 ];
233 :
234 : fd_gui_tile_stats_t tile_stats_begin[ 1 ];
235 : fd_gui_tile_stats_t tile_stats_end[ 1 ];
236 :
237 : ulong tile_timers_history_idx;
238 : };
239 :
240 : typedef struct fd_gui_slot fd_gui_slot_t;
241 :
242 0 : #define FD_GUI_SLOT_RANKINGS_SZ (100UL)
243 0 : #define FD_GUI_SLOT_RANKING_TYPE_ASC (0)
244 0 : #define FD_GUI_SLOT_RANKING_TYPE_DESC (1)
245 :
246 : struct fd_gui_slot_ranking {
247 : ulong slot;
248 : ulong value;
249 : int type;
250 : };
251 : typedef struct fd_gui_slot_ranking fd_gui_slot_ranking_t;
252 :
253 : /* All rankings are initialized / reset to ULONG_MAX. These sentinels
254 : sort AFTER non-sentinel ranking entries. Equal slots are sorted by
255 : oldest slot AFTER. Otherwise sort by value according to ranking
256 : type. */
257 : #define SORT_NAME fd_gui_slot_ranking_sort
258 0 : #define SORT_KEY_T fd_gui_slot_ranking_t
259 0 : #define SORT_BEFORE(a,b) fd_int_if( (a).slot==ULONG_MAX, 0, fd_int_if( (b).slot==ULONG_MAX, 1, fd_int_if( (a).value==(b).value, (a).slot>(b).slot, fd_int_if( (a).type==FD_GUI_SLOT_RANKING_TYPE_DESC, (a).value>(b).value, (a).value<(b).value ) ) ) )
260 : #include "../../util/tmpl/fd_sort.c"
261 :
262 : struct fd_gui_slot_rankings {
263 : fd_gui_slot_ranking_t largest_tips [ FD_GUI_SLOT_RANKINGS_SZ+1UL ];
264 : fd_gui_slot_ranking_t largest_fees [ FD_GUI_SLOT_RANKINGS_SZ+1UL ];
265 : fd_gui_slot_ranking_t largest_rewards [ FD_GUI_SLOT_RANKINGS_SZ+1UL ];
266 : fd_gui_slot_ranking_t largest_duration [ FD_GUI_SLOT_RANKINGS_SZ+1UL ];
267 : fd_gui_slot_ranking_t largest_compute_units [ FD_GUI_SLOT_RANKINGS_SZ+1UL ];
268 : fd_gui_slot_ranking_t largest_skipped [ FD_GUI_SLOT_RANKINGS_SZ+1UL ];
269 : fd_gui_slot_ranking_t smallest_tips [ FD_GUI_SLOT_RANKINGS_SZ+1UL ];
270 : fd_gui_slot_ranking_t smallest_fees [ FD_GUI_SLOT_RANKINGS_SZ+1UL ];
271 : fd_gui_slot_ranking_t smallest_rewards [ FD_GUI_SLOT_RANKINGS_SZ+1UL ];
272 : fd_gui_slot_ranking_t smallest_duration [ FD_GUI_SLOT_RANKINGS_SZ+1UL ];
273 : fd_gui_slot_ranking_t smallest_compute_units[ FD_GUI_SLOT_RANKINGS_SZ+1UL ];
274 : fd_gui_slot_ranking_t smallest_skipped [ FD_GUI_SLOT_RANKINGS_SZ+1UL ];
275 : };
276 :
277 : typedef struct fd_gui_slot_rankings fd_gui_slot_rankings_t;
278 :
279 : struct __attribute__((packed)) fd_gui_txn {
280 : uchar signature[ FD_SHA512_HASH_SZ ];
281 : ulong transaction_fee;
282 : ulong priority_fee;
283 : ulong tips;
284 : long timestamp_arrival_nanos;
285 :
286 : /* compute_units_requested has both execution and non-execution cus */
287 : uint compute_units_requested : 21; /* <= 1.4M */
288 : uint compute_units_consumed : 21; /* <= 1.4M */
289 : uint bank_idx : 6; /* in [0, 64) */
290 : uint error_code : 6; /* in [0, 64) */
291 : int timestamp_delta_start_nanos;
292 : int timestamp_delta_end_nanos;
293 :
294 : /* txn_{}_pct is used as a fraction of the total microblock
295 : duration. For example, txn_load_end_pct can be used to find the
296 : time when this transaction started executing:
297 :
298 : timestamp_delta_start_exec_nanos = (
299 : (timestamp_delta_end_nanos-timestamp_delta_start_nanos) *
300 : ((double)txn_{}_pct/USHORT_MAX)
301 : ) */
302 : uchar txn_start_pct;
303 : uchar txn_load_end_pct;
304 : uchar txn_end_pct;
305 : uchar txn_preload_end_pct;
306 : uchar flags; /* assigned with the FD_GUI_TXN_FLAGS_* macros */
307 : uchar source_tpu; /* FD_TXN_M_TPU_SOURCE_* */
308 : uint source_ipv4;
309 : uint microblock_idx;
310 : };
311 :
312 :
313 : typedef struct fd_gui_txn fd_gui_txn_t;
314 :
315 : struct fd_gui {
316 : fd_http_server_t * http;
317 : fd_topo_t * topo;
318 :
319 : long next_sample_400millis;
320 : long next_sample_100millis;
321 : long next_sample_10millis;
322 :
323 : ulong debug_in_leader_slot;
324 :
325 : struct {
326 : fd_pubkey_t identity_key[ 1 ];
327 : int has_vote_key;
328 : fd_pubkey_t vote_key[ 1 ];
329 : char vote_key_base58[ FD_BASE58_ENCODED_32_SZ ];
330 : char identity_key_base58[ FD_BASE58_ENCODED_32_SZ ];
331 :
332 : char const * version;
333 : char const * cluster;
334 :
335 : ulong vote_distance;
336 : int vote_state;
337 :
338 : long startup_time_nanos;
339 :
340 : struct { /* used in frankendancer */
341 : uchar phase;
342 : int startup_got_full_snapshot;
343 :
344 : ulong startup_incremental_snapshot_slot;
345 : uint startup_incremental_snapshot_peer_ip_addr;
346 : ushort startup_incremental_snapshot_peer_port;
347 : double startup_incremental_snapshot_elapsed_secs;
348 : double startup_incremental_snapshot_remaining_secs;
349 : double startup_incremental_snapshot_throughput;
350 : ulong startup_incremental_snapshot_total_bytes;
351 : ulong startup_incremental_snapshot_current_bytes;
352 :
353 : ulong startup_full_snapshot_slot;
354 : uint startup_full_snapshot_peer_ip_addr;
355 : ushort startup_full_snapshot_peer_port;
356 : double startup_full_snapshot_elapsed_secs;
357 : double startup_full_snapshot_remaining_secs;
358 : double startup_full_snapshot_throughput;
359 : ulong startup_full_snapshot_total_bytes;
360 : ulong startup_full_snapshot_current_bytes;
361 :
362 : ulong startup_ledger_slot;
363 : ulong startup_ledger_max_slot;
364 :
365 : ulong startup_waiting_for_supermajority_slot;
366 : ulong startup_waiting_for_supermajority_stake_pct;
367 : } startup_progress;
368 :
369 : int schedule_strategy;
370 :
371 : ulong identity_account_balance;
372 : ulong vote_account_balance;
373 : ulong estimated_slot_duration_nanos;
374 :
375 : ulong sock_tile_cnt;
376 : ulong net_tile_cnt;
377 : ulong quic_tile_cnt;
378 : ulong verify_tile_cnt;
379 : ulong resolv_tile_cnt;
380 : ulong bank_tile_cnt;
381 : ulong shred_tile_cnt;
382 :
383 : ulong slot_rooted;
384 : ulong slot_optimistically_confirmed;
385 : ulong slot_completed;
386 : ulong slot_estimated;
387 :
388 : ulong estimated_tps_history_idx;
389 : ulong estimated_tps_history[ FD_GUI_TPS_HISTORY_SAMPLE_CNT ][ 3UL ];
390 :
391 : fd_gui_txn_waterfall_t txn_waterfall_reference[ 1 ];
392 : fd_gui_txn_waterfall_t txn_waterfall_current[ 1 ];
393 :
394 : fd_gui_tile_stats_t tile_stats_reference[ 1 ];
395 : fd_gui_tile_stats_t tile_stats_current[ 1 ];
396 :
397 : ulong tile_timers_snap_idx;
398 : ulong tile_timers_snap_idx_slot_start;
399 : /* Temporary storage for samples. Will be downsampled into leader history on slot end. */
400 : fd_gui_tile_timers_t tile_timers_snap[ FD_GUI_TILE_TIMER_SNAP_CNT ][ FD_GUI_TILE_TIMER_TILE_CNT ];
401 : ulong tile_timers_history_idx;
402 : fd_gui_tile_timers_t tile_timers_leader_history[ FD_GUI_TILE_TIMER_LEADER_CNT ][ FD_GUI_TILE_TIMER_LEADER_DOWNSAMPLE_CNT ][ FD_GUI_TILE_TIMER_TILE_CNT ];
403 : ulong tile_timers_leader_history_slot_sample_cnt[ FD_GUI_TILE_TIMER_LEADER_CNT ];
404 : ulong tile_timers_leader_history_slot[ FD_GUI_TILE_TIMER_LEADER_CNT ];
405 : } summary;
406 :
407 : fd_gui_slot_t slots[ FD_GUI_SLOTS_CNT ][ 1 ];
408 :
409 : ulong pack_txn_idx; /* The pack index of the most recently received transaction */
410 : fd_gui_txn_t txs[ FD_GUI_TXN_HISTORY_SZ ][ 1 ];
411 : struct {
412 : int has_block_engine;
413 : char name[ 16 ];
414 : char url[ 256 ];
415 : char ip_cstr[ 40 ]; /* IPv4 or IPv6 cstr */
416 : int status;
417 : } block_engine;
418 :
419 : struct {
420 : int has_epoch[ 2 ];
421 :
422 : struct {
423 : ulong epoch;
424 : long start_time;
425 : long end_time;
426 :
427 : ulong my_total_slots;
428 : ulong my_skipped_slots;
429 :
430 : ulong start_slot;
431 : ulong end_slot;
432 : ulong excluded_stake;
433 : fd_epoch_leaders_t * lsched;
434 : uchar __attribute__((aligned(FD_EPOCH_LEADERS_ALIGN))) _lsched[ FD_EPOCH_LEADERS_FOOTPRINT(MAX_STAKED_LEADERS, MAX_SLOTS_PER_EPOCH) ];
435 : fd_vote_stake_weight_t stakes[ MAX_STAKED_LEADERS ];
436 :
437 : ulong rankings_slot; /* One more than the largest slot we've processed into our rankings */
438 : fd_gui_slot_rankings_t rankings[ 1 ]; /* global slot rankings */
439 : fd_gui_slot_rankings_t my_rankings[ 1 ]; /* my slots only */
440 : } epochs[ 2 ];
441 : } epoch;
442 :
443 : struct {
444 : ulong peer_cnt;
445 : struct fd_gui_gossip_peer peers[ FD_GUI_MAX_PEER_CNT ];
446 : } gossip;
447 :
448 : struct {
449 : ulong vote_account_cnt;
450 : struct fd_gui_vote_account vote_accounts[ FD_GUI_MAX_PEER_CNT ];
451 : } vote_account;
452 :
453 : struct {
454 : ulong info_cnt;
455 : struct fd_gui_validator_info info[ FD_GUI_MAX_PEER_CNT ];
456 : } validator_info;
457 : };
458 :
459 : typedef struct fd_gui fd_gui_t;
460 :
461 : FD_PROTOTYPES_BEGIN
462 :
463 : FD_FN_CONST ulong
464 : fd_gui_align( void );
465 :
466 : FD_FN_CONST ulong
467 : fd_gui_footprint( void );
468 :
469 : void *
470 : fd_gui_new( void * shmem,
471 : fd_http_server_t * http,
472 : char const * version,
473 : char const * cluster,
474 : uchar const * identity_key,
475 : int has_vote_key,
476 : uchar const * vote_key,
477 : int is_voting,
478 : int schedule_strategy,
479 : fd_topo_t * topo );
480 :
481 : fd_gui_t *
482 : fd_gui_join( void * shmem );
483 :
484 : void
485 : fd_gui_set_identity( fd_gui_t * gui,
486 : uchar const * identity_pubkey );
487 :
488 : void
489 : fd_gui_ws_open( fd_gui_t * gui,
490 : ulong conn_id );
491 :
492 : int
493 : fd_gui_ws_message( fd_gui_t * gui,
494 : ulong ws_conn_id,
495 : uchar const * data,
496 : ulong data_len );
497 :
498 : void
499 : fd_gui_plugin_message( fd_gui_t * gui,
500 : ulong plugin_msg,
501 : uchar const * msg );
502 :
503 : void
504 : fd_gui_became_leader( fd_gui_t * gui,
505 : long tickcount,
506 : ulong slot,
507 : long start_time_nanos,
508 : long end_time_nanos,
509 : ulong max_compute_units,
510 : ulong max_microblocks );
511 :
512 : void
513 : fd_gui_unbecame_leader( fd_gui_t * gui,
514 : long tickcount,
515 : ulong slot,
516 : ulong microblocks_in_slot );
517 :
518 : void
519 : fd_gui_microblock_execution_begin( fd_gui_t * gui,
520 : long tickcount,
521 : ulong _slot,
522 : fd_txn_p_t * txns,
523 : ulong txn_cnt,
524 : uint microblock_idx,
525 : ulong pack_txn_idx );
526 :
527 : void
528 : fd_gui_microblock_execution_end( fd_gui_t * gui,
529 : long tickcount,
530 : ulong bank_idx,
531 : ulong _slot,
532 : ulong txn_cnt,
533 : fd_txn_p_t * txns,
534 : ulong pack_txn_idx,
535 : uchar txn_start_pct,
536 : uchar txn_load_end_pct,
537 : uchar txn_end_pct,
538 : uchar txn_preload_end_pct,
539 : ulong tips );
540 :
541 : int
542 : fd_gui_poll( fd_gui_t * gui );
543 :
544 : FD_PROTOTYPES_END
545 :
546 : #endif /* HEADER_fd_src_disco_gui_fd_gui_h */
|