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 : #include "../../accdb/fd_accdb_sync.h" 6 : #include "fd_sysvar_base.h" 7 : 8 : void 9 : fd_sysvar_last_restart_slot_write( 10 : fd_bank_t * bank, 11 : fd_accdb_user_t * accdb, 12 : fd_funk_txn_xid_t const * xid, 13 : fd_capture_ctx_t * capture_ctx, 14 : ulong slot 15 12 : ) { 16 12 : uchar enc[ 8 ]; 17 12 : FD_STORE( ulong, enc, slot ); 18 12 : fd_sysvar_account_update( bank, accdb, xid, capture_ctx, &fd_sysvar_last_restart_slot_id, enc, sizeof(enc) ); 19 12 : } 20 : 21 : void 22 : fd_sysvar_last_restart_slot_init( fd_bank_t * bank, 23 : fd_accdb_user_t * accdb, 24 : fd_funk_txn_xid_t const * xid, 25 0 : fd_capture_ctx_t * capture_ctx ) { 26 : 27 0 : if( !FD_FEATURE_ACTIVE_BANK( bank, last_restart_slot_sysvar ) ) return; 28 : 29 0 : fd_sysvar_last_restart_slot_write( bank, accdb, xid, capture_ctx, 0UL ); 30 0 : } 31 : 32 : ulong 33 : fd_sysvar_last_restart_slot_read( fd_accdb_user_t * accdb, 34 : fd_funk_txn_xid_t const * xid, 35 12 : ulong sentinel ) { 36 : 37 12 : fd_accdb_ro_t ro[1]; 38 12 : if( FD_UNLIKELY( !fd_accdb_open_ro( accdb, ro, xid, &fd_sysvar_last_restart_slot_id ) ) ) { 39 12 : return sentinel; 40 12 : } 41 : 42 0 : if( FD_UNLIKELY( fd_accdb_ref_data_sz( ro )!=FD_SYSVAR_LAST_RESTART_SLOT_BINCODE_SZ ) ) { 43 0 : fd_accdb_close_ro( accdb, ro ); 44 0 : return sentinel; 45 0 : } 46 : 47 0 : ulong result = FD_LOAD( ulong, fd_accdb_ref_data_const( ro ) ); 48 0 : fd_accdb_close_ro( accdb, ro ); 49 0 : return result; 50 0 : } 51 : 52 : /* fd_sysvar_last_restart_slot_update is equivalent to 53 : Agave's solana_runtime::bank::Bank::update_last_restart_slot */ 54 : 55 : ulong 56 27 : fd_sysvar_last_restart_slot_derive( fd_bank_t const * bank ) { 57 27 : ulong slot = bank->f.slot; 58 27 : ulong last_restart_slot = 0UL; 59 : 60 63 : for( ulong i=0UL; i<bank->f.hard_fork_cnt; i++ ) { 61 36 : ulong hard_fork_slot = bank->f.hard_forks[ i ].slot; 62 36 : if( hard_fork_slot<=slot && hard_fork_slot>last_restart_slot ) { 63 24 : last_restart_slot = hard_fork_slot; 64 24 : } 65 36 : } 66 : 67 27 : return last_restart_slot; 68 27 : } 69 : 70 : void 71 : fd_sysvar_last_restart_slot_update( fd_bank_t * bank, 72 : fd_accdb_user_t * accdb, 73 : fd_funk_txn_xid_t const * xid, 74 3549 : fd_capture_ctx_t * capture_ctx ) { 75 : 76 : /* https://github.com/solana-labs/solana/blob/v1.18.18/runtime/src/bank.rs#L2093-L2095 */ 77 3549 : if( !FD_FEATURE_ACTIVE_BANK( bank, last_restart_slot_sysvar ) ) return; 78 : 79 12 : ulong last_restart_slot_want = fd_sysvar_last_restart_slot_derive( bank ); 80 12 : bank->f.last_restart_slot = last_restart_slot_want; 81 : 82 : /* https://github.com/solana-labs/solana/blob/v1.18.18/runtime/src/bank.rs#L2098-L2106 */ 83 12 : ulong last_restart_slot_have = fd_sysvar_last_restart_slot_read( accdb, xid, ULONG_MAX ); 84 : 85 : /* https://github.com/solana-labs/solana/blob/v1.18.18/runtime/src/bank.rs#L2122-L2130 */ 86 12 : if( last_restart_slot_have!=last_restart_slot_want ) { 87 12 : fd_sysvar_last_restart_slot_write( bank, accdb, xid, capture_ctx, last_restart_slot_want ); 88 12 : } 89 12 : }