Skip to content

Commit 53b8308

Browse files
wip
1 parent e8f1a7d commit 53b8308

File tree

9 files changed

+111
-310
lines changed

9 files changed

+111
-310
lines changed

src/discof/replay/fd_exec.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,26 @@ generate_stake_weight_msg( fd_exec_slot_ctx_t * slot_ctx,
3535
return fd_stake_weight_msg_sz( staked_cnt );
3636
}
3737

38+
static inline ulong
39+
generate_stake_weight_msg_2( fd_exec_slot_ctx_t * slot_ctx,
40+
ulong epoch,
41+
fd_vote_states_t const * vote_states,
42+
ulong * stake_weight_msg_out ) {
43+
fd_stake_weight_msg_t * stake_weight_msg = (fd_stake_weight_msg_t *)fd_type_pun( stake_weight_msg_out );
44+
fd_vote_stake_weight_t * stake_weights = stake_weight_msg->weights;
45+
ulong staked_cnt = fd_stake_weights_by_node_2( vote_states, stake_weights );
46+
fd_epoch_schedule_t const * epoch_schedule = fd_bank_epoch_schedule_query( slot_ctx->bank );
47+
48+
stake_weight_msg->epoch = epoch;
49+
stake_weight_msg->staked_cnt = staked_cnt;
50+
stake_weight_msg->start_slot = fd_epoch_slot0( epoch_schedule, stake_weight_msg_out[0] );
51+
stake_weight_msg->slot_cnt = epoch_schedule->slots_per_epoch;
52+
stake_weight_msg->excluded_stake = 0UL;
53+
stake_weight_msg->vote_keyed_lsched = (ulong)fd_runtime_should_use_vote_keyed_leader_schedule( slot_ctx->bank );
54+
55+
return fd_stake_weight_msg_sz( staked_cnt );
56+
}
57+
3858
static inline ulong
3959
generate_stake_weight_msg_manifest( ulong epoch,
4060
fd_epoch_schedule_t const * epoch_schedule,

src/discof/replay/fd_replay_tile.c

Lines changed: 27 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -359,20 +359,17 @@ publish_stake_weights( fd_replay_tile_ctx_t * ctx,
359359
fd_exec_slot_ctx_t * slot_ctx ) {
360360
fd_epoch_schedule_t const * epoch_schedule = fd_bank_epoch_schedule_query( slot_ctx->bank );
361361

362-
fd_vote_accounts_global_t const * epoch_stakes = fd_bank_epoch_stakes_locking_query( slot_ctx->bank );
363-
fd_vote_accounts_pair_global_t_mapnode_t * epoch_stakes_root = fd_vote_accounts_vote_accounts_root_join( epoch_stakes );
362+
fd_vote_states_t const * vote_states_prev_prev = fd_bank_vote_states_prev_prev_locking_query( slot_ctx->bank );
363+
ulong * stake_weights_msg = fd_chunk_to_laddr( ctx->stake_out->mem, ctx->stake_out->chunk );
364+
ulong epoch = fd_slot_to_leader_schedule_epoch( epoch_schedule, fd_bank_slot_get( slot_ctx->bank ) );
365+
ulong stake_weights_sz = generate_stake_weight_msg_2( slot_ctx, epoch - 1, vote_states_prev_prev, stake_weights_msg );
366+
ulong stake_weights_sig = 4UL;
367+
fd_stem_publish( stem, 0UL, stake_weights_sig, ctx->stake_out->chunk, stake_weights_sz, 0UL, 0UL, fd_frag_meta_ts_comp( fd_tickcount() ) );
368+
ctx->stake_out->chunk = fd_dcache_compact_next( ctx->stake_out->chunk, stake_weights_sz, ctx->stake_out->chunk0, ctx->stake_out->wmark );
369+
FD_LOG_NOTICE(("sending current epoch stake weights - epoch: %lu, stake_weight_cnt: %lu, start_slot: %lu, slot_cnt: %lu", stake_weights_msg[0], stake_weights_msg[1], stake_weights_msg[2], stake_weights_msg[3]));
370+
fd_bank_vote_states_prev_prev_end_locking_query( slot_ctx->bank );
364371

365-
if( epoch_stakes_root!=NULL ) {
366-
ulong * stake_weights_msg = fd_chunk_to_laddr( ctx->stake_out->mem, ctx->stake_out->chunk );
367-
ulong epoch = fd_slot_to_leader_schedule_epoch( epoch_schedule, fd_bank_slot_get( slot_ctx->bank ) );
368-
ulong stake_weights_sz = generate_stake_weight_msg( slot_ctx, epoch - 1, epoch_stakes, stake_weights_msg );
369-
ulong stake_weights_sig = 4UL;
370-
fd_stem_publish( stem, 0UL, stake_weights_sig, ctx->stake_out->chunk, stake_weights_sz, 0UL, 0UL, fd_frag_meta_ts_comp( fd_tickcount() ) );
371-
ctx->stake_out->chunk = fd_dcache_compact_next( ctx->stake_out->chunk, stake_weights_sz, ctx->stake_out->chunk0, ctx->stake_out->wmark );
372-
FD_LOG_NOTICE(("sending current epoch stake weights - epoch: %lu, stake_weight_cnt: %lu, start_slot: %lu, slot_cnt: %lu", stake_weights_msg[0], stake_weights_msg[1], stake_weights_msg[2], stake_weights_msg[3]));
373-
}
374372

375-
fd_bank_epoch_stakes_end_locking_query( slot_ctx->bank );
376373
fd_vote_accounts_global_t const * next_epoch_stakes = fd_bank_next_epoch_stakes_locking_query( slot_ctx->bank );
377374
fd_vote_accounts_pair_global_t_mapnode_t * next_epoch_stakes_root = fd_vote_accounts_vote_accounts_root_join( next_epoch_stakes );
378375

@@ -1063,86 +1060,35 @@ publish_votes_to_plugin( fd_replay_tile_ctx_t * ctx,
10631060
fd_fork_t * fork = fd_fork_frontier_ele_query( ctx->forks->frontier, &bank_slot, NULL, ctx->forks->pool );
10641061
if( FD_UNLIKELY ( !fork ) ) return;
10651062

1066-
fd_vote_accounts_global_t const * epoch_stakes = fd_bank_epoch_stakes_locking_query( ctx->slot_ctx->bank );
1067-
fd_vote_accounts_pair_global_t_mapnode_t * epoch_stakes_pool = fd_vote_accounts_vote_accounts_pool_join( epoch_stakes );
1068-
fd_vote_accounts_pair_global_t_mapnode_t * epoch_stakes_root = fd_vote_accounts_vote_accounts_root_join( epoch_stakes );
1063+
fd_vote_states_t const * vote_states = fd_bank_vote_states_locking_query( ctx->slot_ctx->bank );
1064+
1065+
fd_vote_state_map_t * vote_state_map = fd_vote_states_get_map( vote_states );
1066+
fd_vote_state_ele_t * vote_state_pool = fd_vote_states_get_pool( vote_states );
10691067

10701068
ulong i = 0;
10711069
FD_SPAD_FRAME_BEGIN( ctx->runtime_spad ) {
1072-
for( fd_vote_accounts_pair_global_t_mapnode_t const * n = fd_vote_accounts_pair_global_t_map_minimum_const( epoch_stakes_pool, epoch_stakes_root );
1073-
n && i < FD_CLUSTER_NODE_CNT;
1074-
n = fd_vote_accounts_pair_global_t_map_successor_const( epoch_stakes_pool, n ) ) {
1075-
if( n->elem.stake == 0 ) continue;
1076-
1077-
uchar * data = (uchar *)&n->elem.value + n->elem.value.data_offset;
1078-
ulong data_len = n->elem.value.data_len;
1079-
1080-
int err;
1081-
fd_vote_state_versioned_t * vsv = fd_bincode_decode_spad(
1082-
vote_state_versioned, ctx->runtime_spad,
1083-
data,
1084-
data_len,
1085-
&err );
1086-
if( FD_UNLIKELY( err ) ) {
1087-
FD_LOG_ERR(( "Unexpected failure in decoding vote state %d", err ));
1088-
}
1089-
1090-
fd_pubkey_t node_pubkey;
1091-
ulong commission;
1092-
ulong epoch_credits;
1093-
fd_vote_epoch_credits_t const * _epoch_credits;
1094-
ulong root_slot;
1095-
1096-
switch( vsv->discriminant ) {
1097-
case fd_vote_state_versioned_enum_v0_23_5:
1098-
node_pubkey = vsv->inner.v0_23_5.node_pubkey;
1099-
commission = vsv->inner.v0_23_5.commission;
1100-
_epoch_credits = deq_fd_vote_epoch_credits_t_cnt( vsv->inner.v0_23_5.epoch_credits ) == 0 ? NULL : deq_fd_vote_epoch_credits_t_peek_tail_const( vsv->inner.v0_23_5.epoch_credits );
1101-
epoch_credits = _epoch_credits==NULL ? 0UL : _epoch_credits->credits - _epoch_credits->prev_credits;
1102-
root_slot = vsv->inner.v0_23_5.root_slot;
1103-
break;
1104-
case fd_vote_state_versioned_enum_v1_14_11:
1105-
node_pubkey = vsv->inner.v1_14_11.node_pubkey;
1106-
commission = vsv->inner.v1_14_11.commission;
1107-
_epoch_credits = deq_fd_vote_epoch_credits_t_cnt( vsv->inner.v1_14_11.epoch_credits ) == 0 ? NULL : deq_fd_vote_epoch_credits_t_peek_tail_const( vsv->inner.v1_14_11.epoch_credits );
1108-
epoch_credits = _epoch_credits==NULL ? 0UL : _epoch_credits->credits - _epoch_credits->prev_credits;
1109-
root_slot = vsv->inner.v1_14_11.root_slot;
1110-
break;
1111-
case fd_vote_state_versioned_enum_current:
1112-
node_pubkey = vsv->inner.current.node_pubkey;
1113-
commission = vsv->inner.current.commission;
1114-
_epoch_credits = deq_fd_vote_epoch_credits_t_cnt( vsv->inner.current.epoch_credits ) == 0 ? NULL : deq_fd_vote_epoch_credits_t_peek_tail_const( vsv->inner.current.epoch_credits );
1115-
epoch_credits = _epoch_credits==NULL ? 0UL : _epoch_credits->credits - _epoch_credits->prev_credits;
1116-
root_slot = vsv->inner.v0_23_5.root_slot;
1117-
break;
1118-
default:
1119-
__builtin_unreachable();
1120-
}
1121-
1122-
fd_clock_timestamp_vote_t_mapnode_t query;
1123-
memcpy( query.elem.pubkey.uc, n->elem.key.uc, 32UL );
1124-
fd_clock_timestamp_votes_global_t const * clock_timestamp_votes = fd_bank_clock_timestamp_votes_locking_query( ctx->slot_ctx->bank );
1125-
fd_clock_timestamp_vote_t_mapnode_t * timestamp_votes_root = fd_clock_timestamp_votes_votes_root_join( clock_timestamp_votes );
1126-
fd_clock_timestamp_vote_t_mapnode_t * timestamp_votes_pool = fd_clock_timestamp_votes_votes_pool_join( clock_timestamp_votes );
1127-
1128-
fd_clock_timestamp_vote_t_mapnode_t * res = fd_clock_timestamp_vote_t_map_find( timestamp_votes_pool, timestamp_votes_root, &query );
1070+
for( fd_vote_state_map_iter_t iter = fd_vote_state_map_iter_init( vote_state_map, vote_state_pool );
1071+
!fd_vote_state_map_iter_done( iter, vote_state_map, vote_state_pool );
1072+
iter = fd_vote_state_map_iter_next( iter, vote_state_map, vote_state_pool ) ) {
1073+
fd_vote_state_ele_t const * vote_state = fd_vote_state_map_iter_ele_const( iter, vote_state_map, vote_state_pool );
11291074

11301075
fd_vote_update_msg_t * msg = (fd_vote_update_msg_t *)(dst + sizeof(ulong) + i*112U);
11311076
memset( msg, 0, 112U );
1132-
memcpy( msg->vote_pubkey, n->elem.key.uc, sizeof(fd_pubkey_t) );
1133-
memcpy( msg->node_pubkey, node_pubkey.uc, sizeof(fd_pubkey_t) );
1134-
msg->activated_stake = n->elem.stake;
1135-
msg->last_vote = res == NULL ? 0UL : res->elem.slot;
1136-
msg->root_slot = root_slot;
1137-
msg->epoch_credits = epoch_credits;
1138-
msg->commission = (uchar)commission;
1077+
memcpy( msg->vote_pubkey, &vote_state->vote_account, sizeof(fd_pubkey_t) );
1078+
memcpy( msg->node_pubkey, &vote_state->node_account, sizeof(fd_pubkey_t) );
1079+
msg->activated_stake = vote_state->stake;
1080+
msg->last_vote = vote_state->last_vote_slot;
1081+
msg->root_slot = 0UL; /* TODO: needs to be populated in vote_state */
1082+
msg->epoch_credits = 0UL; /* TODO: needs to be populated in vote_state */
1083+
msg->commission = (uchar)vote_state->commission;
11391084
msg->is_delinquent = (uchar)fd_int_if(fd_bank_slot_get( ctx->slot_ctx->bank ) >= 128UL, msg->last_vote <= fd_bank_slot_get( ctx->slot_ctx->bank ) - 128UL, msg->last_vote == 0);
1085+
1086+
11401087
++i;
1141-
fd_bank_clock_timestamp_votes_end_locking_query( ctx->slot_ctx->bank );
11421088
}
11431089
} FD_SPAD_FRAME_END;
11441090

1145-
fd_bank_epoch_stakes_end_locking_query( ctx->slot_ctx->bank );
1091+
fd_bank_vote_states_end_locking_query( ctx->slot_ctx->bank );
11461092

11471093
*(ulong *)dst = i;
11481094

src/flamenco/runtime/context/fd_exec_slot_ctx.c

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -207,52 +207,6 @@ fd_exec_slot_ctx_recover( fd_exec_slot_ctx_t * slot_ctx,
207207
return 0;
208208
}
209209

210-
/* Move current EpochStakes */
211-
212-
fd_vote_accounts_global_t * epoch_stakes = fd_bank_epoch_stakes_locking_modify( slot_ctx->bank );
213-
uchar * epoch_stakes_pool_mem = (uchar *)fd_ulong_align_up( (ulong)epoch_stakes + sizeof(fd_vote_accounts_global_t), fd_vote_accounts_pair_global_t_map_align() );
214-
fd_vote_accounts_pair_global_t_mapnode_t * epoch_stakes_pool = fd_vote_accounts_pair_global_t_map_join( fd_vote_accounts_pair_global_t_map_new( epoch_stakes_pool_mem, 50000UL ) );
215-
fd_vote_accounts_pair_global_t_mapnode_t * epoch_stakes_root = NULL;
216-
217-
acc_region_curr = (uchar *)fd_ulong_align_up( (ulong)epoch_stakes_pool + fd_vote_accounts_pair_global_t_map_footprint( 50000UL ), 8UL );
218-
219-
for( fd_vote_accounts_pair_global_t_mapnode_t * n = fd_vote_accounts_pair_global_t_map_minimum(
220-
vote_accounts_curr_stakes_pool,
221-
vote_accounts_curr_stakes_root );
222-
n;
223-
n = fd_vote_accounts_pair_global_t_map_successor( vote_accounts_curr_stakes_pool, n ) ) {
224-
225-
fd_vote_accounts_pair_global_t_mapnode_t * elem = fd_vote_accounts_pair_global_t_map_acquire(
226-
epoch_stakes_pool );
227-
FD_TEST( elem );
228-
229-
elem->elem.stake = n->elem.stake;
230-
elem->elem.key = n->elem.key;
231-
232-
elem->elem.value.lamports = n->elem.value.lamports;
233-
elem->elem.value.data_len = 0UL;
234-
elem->elem.value.data_offset = 0UL;
235-
elem->elem.value.owner = n->elem.value.owner;
236-
elem->elem.value.executable = n->elem.value.executable;
237-
elem->elem.value.rent_epoch = n->elem.value.rent_epoch;
238-
239-
elem->elem.value.data_offset = (ulong)(acc_region_curr - (uchar *)&elem->elem.value);
240-
elem->elem.value.data_len = n->elem.value.data_len;
241-
242-
uchar * manifest_data = fd_solana_account_data_join( &n->elem.value );
243-
memcpy( acc_region_curr, manifest_data, n->elem.value.data_len );
244-
acc_region_curr += n->elem.value.data_len;
245-
246-
fd_vote_accounts_pair_global_t_map_insert(
247-
epoch_stakes_pool,
248-
&epoch_stakes_root,
249-
elem );
250-
}
251-
252-
fd_vote_accounts_vote_accounts_pool_update( epoch_stakes, epoch_stakes_pool );
253-
fd_vote_accounts_vote_accounts_root_update( epoch_stakes, epoch_stakes_root );
254-
fd_bank_epoch_stakes_end_locking_modify( slot_ctx->bank );
255-
256210
/* Move next EpochStakes */
257211

258212
fd_vote_accounts_global_t * next_epoch_stakes = fd_bank_next_epoch_stakes_locking_modify( slot_ctx->bank );

src/flamenco/runtime/fd_bank.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ FD_PROTOTYPES_BEGIN
143143

144144
#define FD_BANKS_ITER(X) \
145145
/* type, name, footprint, align, CoW, limit fork width, has lock */ \
146-
X(fd_clock_timestamp_votes_global_t, clock_timestamp_votes, 5000000UL, 128UL, 1, 0, 1 ) /* TODO: This needs to get sized out */ \
147146
X(fd_blockhashes_t, block_hash_queue, sizeof(fd_blockhashes_t), alignof(fd_blockhashes_t), 0, 0, 0 ) /* Block hash queue */ \
148147
X(fd_fee_rate_governor_t, fee_rate_governor, sizeof(fd_fee_rate_governor_t), alignof(fd_fee_rate_governor_t), 0, 0, 0 ) /* Fee rate governor */ \
149148
X(ulong, capitalization, sizeof(ulong), alignof(ulong), 0, 0, 0 ) /* Capitalization */ \
@@ -186,7 +185,6 @@ FD_PROTOTYPES_BEGIN
186185
/* in epoch E, these are the stakes at the end of epoch */ \
187186
/* E-1 and they determined the leader schedule for epoch */ \
188187
/* E+1. */ \
189-
X(fd_vote_accounts_global_t, epoch_stakes, 200000000UL, 128UL, 1, 0, 1 ) /* Epoch stakes ~4K per account * 50k vote accounts */ \
190188
X(fd_vote_accounts_global_t, curr_epoch_stakes, 200000000UL, 128UL, 1, 0, 1 ) /* Stakes being accumulated in current epoch */ \
191189
X(fd_epoch_rewards_t, epoch_rewards, FD_EPOCH_REWARDS_FOOTPRINT, FD_EPOCH_REWARDS_ALIGN, 1, 1, 1 ) /* Epoch rewards */ \
192190
X(fd_epoch_leaders_t, epoch_leaders, FD_RUNTIME_MAX_EPOCH_LEADERS, FD_EPOCH_LEADERS_ALIGN, 1, 1, 1 ) /* Epoch leaders. If our system supports 100k vote accs, */ \
@@ -244,18 +242,10 @@ FD_PROTOTYPES_BEGIN
244242
#undef HAS_COW_0
245243
#undef HAS_COW_1
246244

247-
#define POOL_NAME fd_bank_clock_timestamp_votes_pool
248-
#define POOL_T fd_bank_clock_timestamp_votes_t
249-
#include "../../util/tmpl/fd_pool.c"
250-
251245
#define POOL_NAME fd_bank_next_epoch_stakes_pool
252246
#define POOL_T fd_bank_next_epoch_stakes_t
253247
#include "../../util/tmpl/fd_pool.c"
254248

255-
#define POOL_NAME fd_bank_epoch_stakes_pool
256-
#define POOL_T fd_bank_epoch_stakes_t
257-
#include "../../util/tmpl/fd_pool.c"
258-
259249
#define POOL_NAME fd_bank_epoch_leaders_pool
260250
#define POOL_T fd_bank_epoch_leaders_t
261251
#include "../../util/tmpl/fd_pool.c"

0 commit comments

Comments
 (0)