Skip to content

Commit 239e46d

Browse files
riptlripatel-fd
authored andcommitted
runtime: flatten BPF loader v3 state
1 parent 3302e43 commit 239e46d

File tree

9 files changed

+114
-146
lines changed

9 files changed

+114
-146
lines changed

src/flamenco/runtime/fd_runtime.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1732,8 +1732,8 @@ fd_new_target_program_data_account( fd_exec_slot_ctx_t * slot_ctx,
17321732

17331733
/* https://github.com/anza-xyz/agave/blob/v2.1.0/runtime/src/bank/builtins/core_bpf_migration/mod.rs#L118-L125 */
17341734
if( config_upgrade_authority_address!=NULL ) {
1735-
if( FD_UNLIKELY( state->inner.buffer.authority_address==NULL ||
1736-
memcmp( config_upgrade_authority_address, state->inner.buffer.authority_address, sizeof(fd_pubkey_t) ) ) ) {
1735+
if( FD_UNLIKELY( !state->inner.buffer.has_authority_address ||
1736+
!fd_pubkey_eq( config_upgrade_authority_address, &state->inner.buffer.authority_address ) ) ) {
17371737
return -1;
17381738
}
17391739
}
@@ -1754,7 +1754,8 @@ fd_new_target_program_data_account( fd_exec_slot_ctx_t * slot_ctx,
17541754
.inner = {
17551755
.program_data = {
17561756
.slot = fd_bank_slot_get( slot_ctx->bank ),
1757-
.upgrade_authority_address = config_upgrade_authority_address
1757+
.has_upgrade_authority_address = !!config_upgrade_authority_address,
1758+
.upgrade_authority_address = config_upgrade_authority_address ? *config_upgrade_authority_address : (fd_pubkey_t){{0}}
17581759
}
17591760
}
17601761
};

src/flamenco/runtime/program/fd_bpf_loader_program.c

Lines changed: 63 additions & 59 deletions
Large diffs are not rendered by default.

src/flamenco/runtime/program/fd_program_cache.c

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -148,25 +148,22 @@ static uchar const *
148148
fd_get_executable_program_content_for_upgradeable_loader( fd_funk_t const * funk,
149149
fd_funk_txn_t const * funk_txn,
150150
fd_txn_account_t const * program_acc,
151-
ulong * program_data_len,
152-
fd_spad_t * runtime_spad ) {
153-
FD_TXN_ACCOUNT_DECL( programdata_acc );
154-
155-
fd_bpf_upgradeable_loader_state_t * program_account_state =
156-
fd_bincode_decode_spad(
157-
bpf_upgradeable_loader_state, runtime_spad,
151+
ulong * program_data_len ) {
152+
fd_bpf_upgradeable_loader_state_t program_account_state[1];
153+
if( FD_UNLIKELY( !fd_bincode_decode_static(
154+
bpf_upgradeable_loader_state,
155+
program_account_state,
158156
fd_txn_account_get_data( program_acc ),
159157
fd_txn_account_get_data_len( program_acc ),
160-
NULL );
161-
if( FD_UNLIKELY( !program_account_state ) ) {
158+
NULL ) ) ) {
162159
return NULL;
163160
}
164161
if( !fd_bpf_upgradeable_loader_state_is_program( program_account_state ) ) {
165162
return NULL;
166163
}
167164

168165
fd_pubkey_t * programdata_address = &program_account_state->inner.program.programdata_address;
169-
166+
FD_TXN_ACCOUNT_DECL( programdata_acc );
170167
if( fd_txn_account_init_from_funk_readonly( programdata_acc, programdata_address, funk, funk_txn )!=FD_ACC_MGR_SUCCESS ) {
171168
return NULL;
172169
}
@@ -208,16 +205,15 @@ uchar const *
208205
fd_program_cache_get_account_programdata( fd_funk_t const * funk,
209206
fd_funk_txn_t const * funk_txn,
210207
fd_txn_account_t const * program_acc,
211-
ulong * out_program_data_len,
212-
fd_spad_t * runtime_spad ) {
208+
ulong * out_program_data_len ) {
213209
/* v1/v2 loaders: Programdata is just the account data.
214210
v3 loader: Programdata lives in a separate account. Deserialize the
215211
program account and lookup the programdata account.
216212
Deserialize the programdata account.
217213
v4 loader: Programdata lives in the program account, offset by
218214
LOADER_V4_PROGRAM_DATA_OFFSET. */
219215
if( !memcmp( fd_txn_account_get_owner( program_acc ), fd_solana_bpf_loader_upgradeable_program_id.key, sizeof(fd_pubkey_t) ) ) {
220-
return fd_get_executable_program_content_for_upgradeable_loader( funk, funk_txn, program_acc, out_program_data_len, runtime_spad );
216+
return fd_get_executable_program_content_for_upgradeable_loader( funk, funk_txn, program_acc, out_program_data_len );
221217
} else if( !memcmp( fd_txn_account_get_owner( program_acc ), fd_solana_bpf_loader_v4_program_id.key, sizeof(fd_pubkey_t) ) ) {
222218
return fd_get_executable_program_content_for_v4_loader( program_acc, out_program_data_len );
223219
} else if( !memcmp( fd_txn_account_get_owner( program_acc ), fd_solana_bpf_loader_program_id.key, sizeof(fd_pubkey_t) ) ||
@@ -386,11 +382,7 @@ fd_program_cache_create_cache_entry( fd_exec_slot_ctx_t * slot_ctx,
386382
simply return without publishing anything. The program could have
387383
been closed, but we do not want to touch the cache in this case. */
388384
ulong program_data_len = 0UL;
389-
uchar const * program_data = fd_program_cache_get_account_programdata( funk,
390-
funk_txn,
391-
program_acc,
392-
&program_data_len,
393-
runtime_spad );
385+
uchar const * program_data = fd_program_cache_get_account_programdata( funk, funk_txn, program_acc, &program_data_len );
394386

395387
/* This prepare should never fail. */
396388
int funk_err = FD_FUNK_SUCCESS;
@@ -554,8 +546,7 @@ FD_SPAD_FRAME_BEGIN( runtime_spad ) {
554546
uchar const * program_data = fd_program_cache_get_account_programdata( slot_ctx->funk,
555547
slot_ctx->funk_txn,
556548
exec_rec,
557-
&program_data_len,
558-
runtime_spad );
549+
&program_data_len );
559550
if( FD_UNLIKELY( program_data==NULL ) ) {
560551
/* Unlike in fd_program_cache_create_cache_entry(), where we need to
561552
insert an entry into the cache when we cannot obtain valid

src/flamenco/runtime/program/fd_program_cache.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,7 @@ uchar const *
238238
fd_program_cache_get_account_programdata( fd_funk_t const * funk,
239239
fd_funk_txn_t const * funk_txn,
240240
fd_txn_account_t const * program_acc,
241-
ulong * out_program_data_len,
242-
fd_spad_t * runtime_spad );
241+
ulong * out_program_data_len );
243242

244243
/* Updates the program cache for a single program. This function is
245244
called for every program that is referenced in a transaction, plus

src/flamenco/runtime/tests/fd_dump_pb.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,8 +1200,7 @@ FD_SPAD_FRAME_BEGIN( txn_ctx->spad ) {
12001200
uchar const * program_data = fd_program_cache_get_account_programdata( txn_ctx->funk,
12011201
txn_ctx->funk_txn,
12021202
program_acc,
1203-
&program_data_len,
1204-
txn_ctx->spad );
1203+
&program_data_len );
12051204
if( program_data==NULL ) {
12061205
return;
12071206
}

src/flamenco/types/fd_fuzz_types.h

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2615,15 +2615,9 @@ void *fd_bpf_upgradeable_loader_state_buffer_generate( void *mem, void **alloc_m
26152615
*alloc_mem = (uchar *) *alloc_mem + sizeof(fd_bpf_upgradeable_loader_state_buffer_t);
26162616
fd_bpf_upgradeable_loader_state_buffer_new(mem);
26172617
{
2618-
uchar is_null = fd_rng_uchar( rng ) % 2;
2619-
if( !is_null ) {
2620-
self->authority_address = (fd_pubkey_t *) *alloc_mem;
2621-
*alloc_mem = (uchar *) *alloc_mem + sizeof(fd_pubkey_t);
2622-
fd_pubkey_new( self->authority_address );
2623-
fd_pubkey_generate( self->authority_address, alloc_mem, rng );
2624-
}
2625-
else {
2626-
self->authority_address = NULL;
2618+
self->has_authority_address = fd_rng_uchar( rng ) % 2;
2619+
if( self->has_authority_address ) {
2620+
fd_pubkey_generate( &self->authority_address, alloc_mem, rng );
26272621
}
26282622
}
26292623
return mem;
@@ -2643,15 +2637,9 @@ void *fd_bpf_upgradeable_loader_state_program_data_generate( void *mem, void **a
26432637
fd_bpf_upgradeable_loader_state_program_data_new(mem);
26442638
self->slot = fd_rng_ulong( rng );
26452639
{
2646-
uchar is_null = fd_rng_uchar( rng ) % 2;
2647-
if( !is_null ) {
2648-
self->upgrade_authority_address = (fd_pubkey_t *) *alloc_mem;
2649-
*alloc_mem = (uchar *) *alloc_mem + sizeof(fd_pubkey_t);
2650-
fd_pubkey_new( self->upgrade_authority_address );
2651-
fd_pubkey_generate( self->upgrade_authority_address, alloc_mem, rng );
2652-
}
2653-
else {
2654-
self->upgrade_authority_address = NULL;
2640+
self->has_upgrade_authority_address = fd_rng_uchar( rng ) % 2;
2641+
if( self->has_upgrade_authority_address ) {
2642+
fd_pubkey_generate( &self->upgrade_authority_address, alloc_mem, rng );
26552643
}
26562644
}
26572645
return mem;

src/flamenco/types/fd_types.c

Lines changed: 22 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -16175,13 +16175,10 @@ int fd_bpf_upgradeable_loader_program_instruction_encode( fd_bpf_upgradeable_loa
1617516175

1617616176
int fd_bpf_upgradeable_loader_state_buffer_encode( fd_bpf_upgradeable_loader_state_buffer_t const * self, fd_bincode_encode_ctx_t * ctx ) {
1617716177
int err;
16178-
if( self->authority_address != NULL ) {
16179-
err = fd_bincode_bool_encode( 1, ctx );
16180-
if( FD_UNLIKELY( err ) ) return err;
16181-
err = fd_pubkey_encode( self->authority_address, ctx );
16182-
if( FD_UNLIKELY( err ) ) return err;
16183-
} else {
16184-
err = fd_bincode_bool_encode( 0, ctx );
16178+
err = fd_bincode_bool_encode( self->has_authority_address, ctx );
16179+
if( FD_UNLIKELY( err ) ) return err;
16180+
if( self->has_authority_address ) {
16181+
err = fd_pubkey_encode( &self->authority_address, ctx );
1618516182
if( FD_UNLIKELY( err ) ) return err;
1618616183
}
1618716184
return FD_BINCODE_SUCCESS;
@@ -16194,7 +16191,6 @@ static int fd_bpf_upgradeable_loader_state_buffer_decode_footprint_inner( fd_bin
1619416191
err = fd_bincode_bool_decode( &o, ctx );
1619516192
if( FD_UNLIKELY( err!=FD_BINCODE_SUCCESS ) ) return err;
1619616193
if( o ) {
16197-
*total_sz += FD_PUBKEY_ALIGN + sizeof(fd_pubkey_t);
1619816194
err = fd_pubkey_decode_footprint_inner( ctx, total_sz );
1619916195
if( FD_UNLIKELY( err!=FD_BINCODE_SUCCESS ) ) return err;
1620016196
}
@@ -16214,14 +16210,10 @@ static void fd_bpf_upgradeable_loader_state_buffer_decode_inner( void * struct_m
1621416210
{
1621516211
uchar o;
1621616212
fd_bincode_bool_decode_unsafe( &o, ctx );
16213+
self->has_authority_address = !!o;
1621716214
if( o ) {
16218-
*alloc_mem = (void*)fd_ulong_align_up( (ulong)*alloc_mem, FD_PUBKEY_ALIGN );
16219-
self->authority_address = *alloc_mem;
16220-
*alloc_mem = (uchar *)*alloc_mem + sizeof(fd_pubkey_t);
16221-
fd_pubkey_new( self->authority_address );
16222-
fd_pubkey_decode_inner( self->authority_address, alloc_mem, ctx );
16223-
} else {
16224-
self->authority_address = NULL;
16215+
fd_pubkey_new( &self->authority_address );
16216+
fd_pubkey_decode_inner( &self->authority_address, alloc_mem, ctx );
1622516217
}
1622616218
}
1622716219
}
@@ -16239,18 +16231,18 @@ void fd_bpf_upgradeable_loader_state_buffer_new(fd_bpf_upgradeable_loader_state_
1623916231
void fd_bpf_upgradeable_loader_state_buffer_walk( void * w, fd_bpf_upgradeable_loader_state_buffer_t const * self, fd_types_walk_fn_t fun, const char *name, uint level, uint varint ) {
1624016232
(void) varint;
1624116233
fun( w, self, name, FD_FLAMENCO_TYPE_MAP, "fd_bpf_upgradeable_loader_state_buffer", level++, 0 );
16242-
if( !self->authority_address ) {
16234+
if( !self->has_authority_address ) {
1624316235
fun( w, NULL, "authority_address", FD_FLAMENCO_TYPE_NULL, "pubkey", level, 0 );
1624416236
} else {
16245-
fd_pubkey_walk( w, self->authority_address, fun, "authority_address", level, 0 );
16237+
fd_pubkey_walk( w, &self->authority_address, fun, "authority_address", level, 0 );
1624616238
}
1624716239
fun( w, self, name, FD_FLAMENCO_TYPE_MAP_END, "fd_bpf_upgradeable_loader_state_buffer", level--, 0 );
1624816240
}
1624916241
ulong fd_bpf_upgradeable_loader_state_buffer_size( fd_bpf_upgradeable_loader_state_buffer_t const * self ) {
1625016242
ulong size = 0;
1625116243
size += sizeof(char);
16252-
if( NULL != self->authority_address ) {
16253-
size += fd_pubkey_size( self->authority_address );
16244+
if( self->has_authority_address ) {
16245+
size += fd_pubkey_size( &self->authority_address );
1625416246
}
1625516247
return size;
1625616248
}
@@ -16288,13 +16280,10 @@ int fd_bpf_upgradeable_loader_state_program_data_encode( fd_bpf_upgradeable_load
1628816280
int err;
1628916281
err = fd_bincode_uint64_encode( self->slot, ctx );
1629016282
if( FD_UNLIKELY( err ) ) return err;
16291-
if( self->upgrade_authority_address != NULL ) {
16292-
err = fd_bincode_bool_encode( 1, ctx );
16293-
if( FD_UNLIKELY( err ) ) return err;
16294-
err = fd_pubkey_encode( self->upgrade_authority_address, ctx );
16295-
if( FD_UNLIKELY( err ) ) return err;
16296-
} else {
16297-
err = fd_bincode_bool_encode( 0, ctx );
16283+
err = fd_bincode_bool_encode( self->has_upgrade_authority_address, ctx );
16284+
if( FD_UNLIKELY( err ) ) return err;
16285+
if( self->has_upgrade_authority_address ) {
16286+
err = fd_pubkey_encode( &self->upgrade_authority_address, ctx );
1629816287
if( FD_UNLIKELY( err ) ) return err;
1629916288
}
1630016289
return FD_BINCODE_SUCCESS;
@@ -16309,7 +16298,6 @@ static int fd_bpf_upgradeable_loader_state_program_data_decode_footprint_inner(
1630916298
err = fd_bincode_bool_decode( &o, ctx );
1631016299
if( FD_UNLIKELY( err!=FD_BINCODE_SUCCESS ) ) return err;
1631116300
if( o ) {
16312-
*total_sz += FD_PUBKEY_ALIGN + sizeof(fd_pubkey_t);
1631316301
err = fd_pubkey_decode_footprint_inner( ctx, total_sz );
1631416302
if( FD_UNLIKELY( err!=FD_BINCODE_SUCCESS ) ) return err;
1631516303
}
@@ -16330,14 +16318,10 @@ static void fd_bpf_upgradeable_loader_state_program_data_decode_inner( void * st
1633016318
{
1633116319
uchar o;
1633216320
fd_bincode_bool_decode_unsafe( &o, ctx );
16321+
self->has_upgrade_authority_address = !!o;
1633316322
if( o ) {
16334-
*alloc_mem = (void*)fd_ulong_align_up( (ulong)*alloc_mem, FD_PUBKEY_ALIGN );
16335-
self->upgrade_authority_address = *alloc_mem;
16336-
*alloc_mem = (uchar *)*alloc_mem + sizeof(fd_pubkey_t);
16337-
fd_pubkey_new( self->upgrade_authority_address );
16338-
fd_pubkey_decode_inner( self->upgrade_authority_address, alloc_mem, ctx );
16339-
} else {
16340-
self->upgrade_authority_address = NULL;
16323+
fd_pubkey_new( &self->upgrade_authority_address );
16324+
fd_pubkey_decode_inner( &self->upgrade_authority_address, alloc_mem, ctx );
1634116325
}
1634216326
}
1634316327
}
@@ -16356,19 +16340,19 @@ void fd_bpf_upgradeable_loader_state_program_data_walk( void * w, fd_bpf_upgrade
1635616340
(void) varint;
1635716341
fun( w, self, name, FD_FLAMENCO_TYPE_MAP, "fd_bpf_upgradeable_loader_state_program_data", level++, 0 );
1635816342
fun( w, &self->slot, "slot", FD_FLAMENCO_TYPE_ULONG, "ulong", level, 0 );
16359-
if( !self->upgrade_authority_address ) {
16343+
if( !self->has_upgrade_authority_address ) {
1636016344
fun( w, NULL, "upgrade_authority_address", FD_FLAMENCO_TYPE_NULL, "pubkey", level, 0 );
1636116345
} else {
16362-
fd_pubkey_walk( w, self->upgrade_authority_address, fun, "upgrade_authority_address", level, 0 );
16346+
fd_pubkey_walk( w, &self->upgrade_authority_address, fun, "upgrade_authority_address", level, 0 );
1636316347
}
1636416348
fun( w, self, name, FD_FLAMENCO_TYPE_MAP_END, "fd_bpf_upgradeable_loader_state_program_data", level--, 0 );
1636516349
}
1636616350
ulong fd_bpf_upgradeable_loader_state_program_data_size( fd_bpf_upgradeable_loader_state_program_data_t const * self ) {
1636716351
ulong size = 0;
1636816352
size += sizeof(ulong);
1636916353
size += sizeof(char);
16370-
if( NULL != self->upgrade_authority_address ) {
16371-
size += fd_pubkey_size( self->upgrade_authority_address );
16354+
if( self->has_upgrade_authority_address ) {
16355+
size += fd_pubkey_size( &self->upgrade_authority_address );
1637216356
}
1637316357
return size;
1637416358
}

src/flamenco/types/fd_types.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2588,7 +2588,8 @@ typedef struct fd_bpf_upgradeable_loader_program_instruction fd_bpf_upgradeable_
25882588

25892589
/* Encoded Size: Dynamic */
25902590
struct fd_bpf_upgradeable_loader_state_buffer {
2591-
fd_pubkey_t * authority_address;
2591+
fd_pubkey_t authority_address;
2592+
uchar has_authority_address;
25922593
};
25932594
typedef struct fd_bpf_upgradeable_loader_state_buffer fd_bpf_upgradeable_loader_state_buffer_t;
25942595
#define FD_BPF_UPGRADEABLE_LOADER_STATE_BUFFER_ALIGN alignof(fd_bpf_upgradeable_loader_state_buffer_t)
@@ -2603,7 +2604,8 @@ typedef struct fd_bpf_upgradeable_loader_state_program fd_bpf_upgradeable_loader
26032604
/* Encoded Size: Dynamic */
26042605
struct fd_bpf_upgradeable_loader_state_program_data {
26052606
ulong slot;
2606-
fd_pubkey_t * upgrade_authority_address;
2607+
fd_pubkey_t upgrade_authority_address;
2608+
uchar has_upgrade_authority_address;
26072609
};
26082610
typedef struct fd_bpf_upgradeable_loader_state_program_data fd_bpf_upgradeable_loader_state_program_data_t;
26092611
#define FD_BPF_UPGRADEABLE_LOADER_STATE_PROGRAM_DATA_ALIGN alignof(fd_bpf_upgradeable_loader_state_program_data_t)

src/flamenco/types/fd_types.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1684,7 +1684,7 @@
16841684
"name": "bpf_upgradeable_loader_state_buffer",
16851685
"type": "struct",
16861686
"fields": [
1687-
{ "name": "authority_address", "type": "option", "element": "pubkey" }
1687+
{ "name": "authority_address", "type": "option", "element": "pubkey", "flat": true }
16881688
]
16891689
},
16901690
{
@@ -1699,7 +1699,7 @@
16991699
"type": "struct",
17001700
"fields": [
17011701
{ "name": "slot", "type": "ulong" },
1702-
{ "name": "upgrade_authority_address", "type": "option", "element": "pubkey" }
1702+
{ "name": "upgrade_authority_address", "type": "option", "element": "pubkey", "flat": true }
17031703
]
17041704
},
17051705
{

0 commit comments

Comments
 (0)