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 6 : ulong slot ) { 11 6 : uchar enc[ 8 ]; 12 6 : FD_STORE( ulong, enc, slot ); 13 6 : fd_sysvar_account_update( bank, accdb, capture_ctx, &fd_sysvar_last_restart_slot_id, enc, sizeof(enc) ); 14 6 : } 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 4542 : ulong sentinel ) { 27 4542 : fd_acc_t acc = fd_accdb_read_one( accdb, fork_id, fd_sysvar_last_restart_slot_id.uc ); 28 4542 : if( FD_UNLIKELY( !acc.lamports || acc.data_len!=FD_SYSVAR_LAST_RESTART_SLOT_BINCODE_SZ ) ) { 29 6 : fd_accdb_unread_one( accdb, &acc ); 30 6 : return sentinel; 31 6 : } 32 : 33 4536 : ulong result = FD_LOAD( ulong, acc.data ); 34 4536 : fd_accdb_unread_one( accdb, &acc ); 35 4536 : return result; 36 4542 : } 37 : 38 : /* fd_sysvar_last_restart_slot_update is equivalent to 39 : Agave's solana_runtime::bank::Bank::update_last_restart_slot */ 40 : 41 : ulong 42 4557 : fd_sysvar_last_restart_slot_derive( fd_bank_t const * bank ) { 43 4557 : ulong slot = bank->f.slot; 44 4557 : ulong last_restart_slot = 0UL; 45 : 46 4593 : for( ulong i=0UL; i<bank->f.hard_fork_cnt; i++ ) { 47 36 : ulong hard_fork_slot = bank->f.hard_forks[ i ].slot; 48 36 : if( hard_fork_slot<=slot && hard_fork_slot>last_restart_slot ) { 49 24 : last_restart_slot = hard_fork_slot; 50 24 : } 51 36 : } 52 : 53 4557 : return last_restart_slot; 54 4557 : } 55 : 56 : void 57 : fd_sysvar_last_restart_slot_update( fd_bank_t * bank, 58 : fd_accdb_t * accdb, 59 4542 : fd_capture_ctx_t * capture_ctx ) { 60 : 61 4542 : 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 4542 : 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 4542 : if( last_restart_slot_have!=last_restart_slot_want ) { 68 6 : fd_sysvar_last_restart_slot_write( bank, accdb, capture_ctx, last_restart_slot_want ); 69 6 : } 70 4542 : }