Line data Source code
1 : #include "fd_sysvar_last_restart_slot.h" 2 : #include "fd_sysvar.h" 3 : #include "../fd_bank.h" 4 : #include "../fd_system_ids.h" 5 : 6 : static void 7 : fd_sysvar_last_restart_slot_write( fd_bank_t * bank, 8 : fd_accdb_t * accdb, 9 : fd_capture_ctx_t * capture_ctx, 10 312 : ulong slot ) { 11 312 : uchar enc[ 8 ]; 12 312 : FD_STORE( ulong, enc, slot ); 13 312 : fd_sysvar_account_update( bank, accdb, capture_ctx, &fd_sysvar_last_restart_slot_id, enc, sizeof(enc) ); 14 312 : } 15 : 16 : void 17 : fd_sysvar_last_restart_slot_init( fd_bank_t * bank, 18 : fd_accdb_t * accdb, 19 0 : fd_capture_ctx_t * capture_ctx ) { 20 0 : fd_sysvar_last_restart_slot_write( bank, accdb, capture_ctx, 0UL ); 21 0 : } 22 : 23 : ulong 24 : fd_sysvar_last_restart_slot_read( fd_accdb_t * accdb, 25 : fd_accdb_fork_id_t fork_id, 26 611 : ulong sentinel ) { 27 611 : fd_acc_t acc = fd_accdb_read_one( accdb, fork_id, fd_sysvar_last_restart_slot_id.uc ); 28 611 : if( FD_UNLIKELY( !acc.lamports || acc.data_len!=FD_SYSVAR_LAST_RESTART_SLOT_BINCODE_SZ ) ) { 29 0 : fd_accdb_unread_one( accdb, &acc ); 30 0 : return sentinel; 31 0 : } 32 : 33 611 : ulong result = FD_LOAD( ulong, acc.data ); 34 611 : fd_accdb_unread_one( accdb, &acc ); 35 611 : return result; 36 611 : } 37 : 38 : ulong 39 611 : fd_sysvar_last_restart_slot_derive( fd_bank_t const * bank ) { 40 611 : ulong slot = bank->f.slot; 41 611 : ulong last_restart_slot = 0UL; 42 : 43 611 : for( ulong i=0UL; i<bank->f.hard_fork_cnt; i++ ) { 44 0 : ulong hard_fork_slot = bank->f.hard_forks[ i ].slot; 45 0 : if( hard_fork_slot<=slot && hard_fork_slot>last_restart_slot ) { 46 0 : last_restart_slot = hard_fork_slot; 47 0 : } 48 0 : } 49 : 50 611 : return last_restart_slot; 51 611 : } 52 : 53 : /* fd_sysvar_last_restart_slot_update is equivalent to 54 : Agave's solana_runtime::bank::Bank::update_last_restart_slot */ 55 : 56 : void 57 : fd_sysvar_last_restart_slot_update( fd_bank_t * bank, 58 : fd_accdb_t * accdb, 59 611 : fd_capture_ctx_t * capture_ctx ) { 60 : 61 611 : ulong last_restart_slot_want = fd_sysvar_last_restart_slot_derive( bank ); 62 : 63 : /* https://github.com/solana-labs/solana/blob/v1.18.18/runtime/src/bank.rs#L2098-L2106 */ 64 611 : ulong last_restart_slot_have = fd_sysvar_last_restart_slot_read( accdb, bank->accdb_fork_id, ULONG_MAX ); 65 : 66 : /* https://github.com/solana-labs/solana/blob/v1.18.18/runtime/src/bank.rs#L2122-L2130 */ 67 611 : if( last_restart_slot_have!=last_restart_slot_want ) { 68 312 : fd_sysvar_last_restart_slot_write( bank, accdb, capture_ctx, last_restart_slot_want ); 69 312 : } 70 611 : }