Line data Source code
1 : /* fd_sysvar_cache_db.c contains database interactions between the
2 : sysvar cache and the account database. */
3 :
4 : #include "../fd_bank.h"
5 : #include "fd_sysvar_cache_private.h"
6 :
7 : static int
8 : sysvar_data_fill( fd_sysvar_cache_t * cache,
9 : fd_accdb_t * accdb,
10 : fd_accdb_fork_id_t fork,
11 : ulong idx,
12 69767 : int log_fails ) {
13 69767 : fd_sysvar_pos_t const * pos = &fd_sysvar_pos_tbl[ idx ];
14 69767 : fd_pubkey_t const * key = &fd_sysvar_key_tbl[ idx ];
15 69767 : fd_sysvar_desc_t * desc = &cache->desc [ idx ];
16 :
17 : /* Read account from database */
18 69767 : fd_acc_t acc = fd_accdb_read_one( accdb, fork, key->uc );
19 69767 : if( FD_UNLIKELY( !acc.lamports ) ) {
20 7454 : if( log_fails ) FD_LOG_DEBUG(( "Sysvar %s not found", pos->name ));
21 7454 : fd_accdb_unread_one( accdb, &acc );
22 7454 : return 0;
23 7454 : }
24 :
25 : /* Fill data cache acc */
26 62313 : ulong data_sz = fd_ulong_min( acc.data_len, pos->data_max );
27 62313 : uchar * data = (uchar *)cache+pos->data_off;
28 62313 : fd_memcpy( data, acc.data, data_sz );
29 62313 : desc->data_sz = (uint)data_sz;
30 62313 : fd_accdb_unread_one( accdb, &acc );
31 :
32 : /* Recover object cache acc from data cache acc */
33 62313 : return fd_sysvar_obj_restore( cache, desc, pos );
34 69767 : }
35 :
36 : static int
37 : fd_sysvar_cache_restore1( fd_sysvar_cache_t * cache_mem,
38 : fd_accdb_t * accdb,
39 : fd_accdb_fork_id_t fork_id,
40 8737 : int log_fails ) {
41 8737 : fd_sysvar_cache_t * cache = fd_sysvar_cache_join( fd_sysvar_cache_new( cache_mem ) );
42 :
43 8737 : int saw_err = 0;
44 78503 : for( ulong i=0UL; i<FD_SYSVAR_CACHE_ENTRY_CNT; i++ ) {
45 69766 : int err = sysvar_data_fill( cache, accdb, fork_id, i, log_fails );
46 69766 : if( err ) saw_err = 1;
47 69766 : }
48 :
49 8737 : fd_sysvar_cache_leave( cache );
50 :
51 8737 : return !saw_err;
52 8737 : }
53 :
54 : int
55 : fd_sysvar_cache_restore( fd_sysvar_cache_t * cache,
56 : fd_accdb_t * accdb,
57 392 : fd_accdb_fork_id_t fork_id ) {
58 392 : return fd_sysvar_cache_restore1( cache, accdb, fork_id, 1 );
59 392 : }
60 :
61 : void
62 : fd_sysvar_cache_restore_fuzz( fd_sysvar_cache_t * cache,
63 : fd_accdb_t * accdb,
64 8346 : fd_accdb_fork_id_t fork_id ) {
65 8346 : (void)fd_sysvar_cache_restore1( cache, accdb, fork_id, 0 );
66 8346 : }
67 :
68 : int
69 : fd_sysvar_cache_validate( fd_bank_t const * bank,
70 611 : fd_accdb_t * accdb ) {
71 611 : int saw_err = 0;
72 5497 : for( ulong i=0UL; i<FD_SYSVAR_CACHE_ENTRY_CNT; i++ ) {
73 4886 : fd_sysvar_pos_t const * pos = &fd_sysvar_pos_tbl[ i ];
74 4886 : fd_pubkey_t const * key = &fd_sysvar_key_tbl[ i ];
75 4886 : fd_acc_t acc = fd_accdb_read_one( accdb, bank->accdb_fork_id, key->uc );
76 4886 : if( FD_UNLIKELY( !acc.lamports ) ) {
77 46 : FD_LOG_DEBUG(( "Sysvar %s not found", pos->name ));
78 4840 : } else {
79 4840 : ulong data_sz = fd_ulong_min( acc.data_len, pos->data_max );
80 4840 : if( FD_UNLIKELY( !pos->validate( acc.data, data_sz ) ) ) {
81 0 : FD_LOG_DEBUG(( "Failed to validate sysvar %s with data_sz=%lu", pos->name, data_sz ));
82 0 : saw_err = 1;
83 0 : }
84 4840 : }
85 4886 : fd_accdb_unread_one( accdb, &acc );
86 4886 : }
87 611 : return !saw_err;
88 611 : }
89 :
90 : void
91 : fd_sysvar_cache_restore_one( fd_sysvar_cache_t * cache,
92 : fd_pubkey_t const * pubkey,
93 : ulong lamports,
94 : uchar const * acc_data,
95 553648 : ulong acc_data_len ) {
96 553648 : ulong idx;
97 3681017 : for( idx=0UL; idx<FD_SYSVAR_CACHE_ENTRY_CNT; idx++ ) {
98 3389467 : if( 0==memcmp( pubkey, fd_sysvar_key_tbl[ idx ].uc, sizeof(fd_pubkey_t) ) ) break;
99 3389467 : }
100 553648 : if( FD_UNLIKELY( idx==FD_SYSVAR_CACHE_ENTRY_CNT ) ) return;
101 260059 : if( FD_UNLIKELY( !lamports ) ) return;
102 :
103 260024 : fd_sysvar_pos_t const * pos = &fd_sysvar_pos_tbl[ idx ];
104 260024 : fd_sysvar_desc_t * desc = &cache->desc [ idx ];
105 :
106 260024 : ulong data_sz = fd_ulong_min( acc_data_len, pos->data_max );
107 260024 : uchar * data = (uchar *)cache+pos->data_off;
108 260024 : fd_memcpy( data, acc_data, data_sz );
109 260024 : desc->data_sz = (uint)data_sz;
110 :
111 : /* Recover object cache acc from data cache acc */
112 260024 : fd_sysvar_obj_restore( cache, desc, pos );
113 260024 : }
|