99#include "fd_runtime_stack.h"
1010
1111#include "fd_executor.h"
12+ #include "fd_txn_account.h"
1213#include "sysvar/fd_sysvar_cache.h"
1314#include "sysvar/fd_sysvar_clock.h"
1415#include "sysvar/fd_sysvar_epoch_schedule.h"
3738
3839#include "../../disco/pack/fd_pack.h"
3940#include "../../disco/pack/fd_pack_tip_prog_blacklist.h"
40- #include "../../disco/genesis/fd_genesis_cluster.h"
4141
4242#include <unistd.h>
4343#include <sys/stat.h>
@@ -1010,56 +1010,31 @@ fd_runtime_pre_execute_check( fd_runtime_t * runtime,
10101010 a writable transaction account back into the accountsdb. */
10111011
10121012static void
1013- fd_runtime_finalize_account ( fd_funk_t * funk ,
1013+ fd_runtime_finalize_account ( fd_accdb_user_t * accdb ,
10141014 fd_funk_txn_xid_t const * xid ,
10151015 fd_pubkey_t const * pubkey ,
1016- fd_account_meta_t * meta ,
1017- fd_funk_rec_t * prev_rec ) {
1018-
1019- uchar const * record_data = (uchar * )meta ;
1020- ulong record_sz = fd_account_meta_get_record_sz ( meta );
1021-
1022- int err = FD_FUNK_SUCCESS ;
1023-
1024- if ( !prev_rec || !fd_funk_txn_xid_eq ( prev_rec -> pair .xid , xid ) ) {
1025-
1026- fd_funk_rec_key_t funk_key = fd_funk_acc_key ( pubkey );
1027- fd_funk_rec_prepare_t prepare [1 ];
1028- fd_funk_rec_t * rec = fd_funk_rec_prepare ( funk , xid , & funk_key , prepare , & err );
1029- if ( FD_UNLIKELY ( !rec || err != FD_FUNK_SUCCESS ) ) {
1030- FD_LOG_ERR (( "fd_runtime_finalize_account: failed to prepare record (%i-%s)" , err , fd_funk_strerror ( err ) ));
1031- }
1032-
1033- if ( FD_UNLIKELY ( !fd_funk_val_truncate (
1034- rec ,
1035- fd_funk_alloc ( funk ),
1036- fd_funk_wksp ( funk ),
1037- 0UL ,
1038- record_sz ,
1039- & err ) ) ) {
1040- FD_LOG_ERR (( "fd_funk_val_truncate(sz=%lu) for account failed (%i-%s)" , record_sz , err , fd_funk_strerror ( err ) ));
1041- }
1042-
1043- fd_memcpy ( fd_funk_val ( rec , fd_funk_wksp ( funk ) ), record_data , record_sz );
1044-
1045- fd_funk_rec_publish ( funk , prepare );
1046-
1047- } else {
1048-
1049- if ( FD_UNLIKELY ( !fd_funk_val_truncate (
1050- prev_rec ,
1051- fd_funk_alloc ( funk ),
1052- fd_funk_wksp ( funk ),
1053- 0UL ,
1054- record_sz ,
1055- & err ) ) ) {
1056- FD_LOG_ERR (( "fd_funk_val_truncate(sz=%lu) for account failed (%i-%s)" , record_sz , err , fd_funk_strerror ( err ) ));
1057- }
1058-
1059- fd_memcpy ( fd_funk_val ( prev_rec , fd_funk_wksp ( funk ) ), record_data , record_sz );
1060-
1061- }
1016+ fd_account_meta_t * meta ) {
1017+ /* FIXME if account doesn't change according to LtHash, don't update
1018+ database record */
10621019
1020+ fd_accdb_rw_t rw [1 ];
1021+ int rw_ok = !!fd_accdb_open_rw (
1022+ accdb ,
1023+ rw ,
1024+ xid ,
1025+ pubkey ,
1026+ meta -> dlen ,
1027+ FD_ACCDB_FLAG_CREATE |FD_ACCDB_FLAG_TRUNCATE );
1028+ if ( FD_UNLIKELY ( !rw_ok ) ) FD_LOG_CRIT (( "fd_accdb_open_rw failed" ));
1029+
1030+ void const * data = fd_account_data ( meta );
1031+ fd_accdb_ref_lamports_set ( rw , meta -> lamports );
1032+ fd_accdb_ref_owner_set ( rw , meta -> owner );
1033+ fd_accdb_ref_exec_bit_set ( rw , meta -> executable );
1034+ fd_accdb_ref_data_set ( rw , data , meta -> dlen );
1035+ fd_accdb_ref_slot_set ( rw , xid -> ul [0 ] );
1036+
1037+ fd_accdb_close_rw ( accdb , rw );
10631038}
10641039
10651040/* fd_runtime_save_account is a convenience wrapper that looks
@@ -1088,40 +1063,34 @@ fd_runtime_finalize_account( fd_funk_t * funk,
10881063 All non-optional pointers must be valid. */
10891064
10901065static void
1091- fd_runtime_save_account ( fd_funk_t * funk ,
1066+ fd_runtime_save_account ( fd_accdb_user_t * accdb ,
10921067 fd_funk_txn_xid_t const * xid ,
10931068 fd_pubkey_t const * pubkey ,
10941069 fd_account_meta_t * meta ,
10951070 fd_bank_t * bank ,
10961071 fd_capture_ctx_t * capture_ctx ) {
1097- /* Look up the previous version of the account from Funk */
1098- int err = FD_ACC_MGR_SUCCESS ;
1099- fd_funk_rec_t * funk_prev_rec = NULL ;
1100- fd_account_meta_t const * prev_meta = fd_funk_get_acc_meta_readonly (
1101- funk ,
1102- xid ,
1103- pubkey ,
1104- fd_type_pun ( & funk_prev_rec ),
1105- & err ,
1106- NULL );
1107- uchar const * prev_data = (void const * )( prev_meta + 1 );
11081072
1109- /* Hash the old version of the account */
1073+ /* Update LtHash
1074+ - Query old version of account and hash it
1075+ - Hash new version of account */
11101076 fd_lthash_value_t prev_hash [1 ];
1111- fd_lthash_zero ( prev_hash ) ;
1112- if ( err != FD_ACC_MGR_ERR_UNKNOWN_ACCOUNT ) {
1077+ fd_accdb_ro_t ro [ 1 ] ;
1078+ if ( fd_accdb_open_ro ( accdb , ro , xid , pubkey ) ) {
11131079 fd_hashes_account_lthash (
11141080 pubkey ,
1115- prev_meta ,
1116- prev_data ,
1081+ ro -> meta ,
1082+ fd_accdb_ref_data_const ( ro ) ,
11171083 prev_hash );
1084+ fd_accdb_close_ro ( accdb , ro );
1085+ } else {
1086+ fd_lthash_zero ( prev_hash );
11181087 }
11191088
11201089 /* Mix in the account hash into the bank hash */
11211090 fd_hashes_update_lthash ( pubkey , meta , prev_hash , bank , capture_ctx );
11221091
11231092 /* Save the new version of the account to Funk */
1124- fd_runtime_finalize_account ( funk , xid , pubkey , meta , funk_prev_rec );
1093+ fd_runtime_finalize_account ( accdb , xid , pubkey , meta );
11251094}
11261095
11271096/* fd_runtime_commit_txn is a helper used by the non-tpool transaction
@@ -1155,7 +1124,7 @@ fd_runtime_commit_txn( fd_runtime_t * runtime,
11551124
11561125 We should always rollback the nonce account first. Note that the nonce account may be the fee payer (case 2). */
11571126 if ( txn_out -> accounts .nonce_idx_in_txn != ULONG_MAX ) {
1158- fd_runtime_save_account ( runtime -> funk ,
1127+ fd_runtime_save_account ( runtime -> accdb ,
11591128 & xid ,
11601129 & txn_out -> accounts .keys [txn_out -> accounts .nonce_idx_in_txn ],
11611130 txn_out -> accounts .rollback_nonce ,
@@ -1165,7 +1134,7 @@ fd_runtime_commit_txn( fd_runtime_t * runtime,
11651134
11661135 /* Now, we must only save the fee payer if the nonce account was not the fee payer (because that was already saved above) */
11671136 if ( FD_LIKELY ( txn_out -> accounts .nonce_idx_in_txn != FD_FEE_PAYER_TXN_IDX ) ) {
1168- fd_runtime_save_account ( runtime -> funk ,
1137+ fd_runtime_save_account ( runtime -> accdb ,
11691138 & xid ,
11701139 & txn_out -> accounts .keys [FD_FEE_PAYER_TXN_IDX ],
11711140 txn_out -> accounts .rollback_fee_payer ,
@@ -1204,7 +1173,7 @@ fd_runtime_commit_txn( fd_runtime_t * runtime,
12041173 cache updates have been applied. */
12051174 fd_executor_reclaim_account ( txn_out -> accounts .metas [i ], fd_bank_slot_get ( bank ) );
12061175
1207- fd_runtime_save_account ( runtime -> funk , & xid , pubkey , meta , bank , runtime -> log .capture_ctx );
1176+ fd_runtime_save_account ( runtime -> accdb , & xid , pubkey , meta , bank , runtime -> log .capture_ctx );
12081177 }
12091178
12101179 /* We need to queue any existing program accounts that may have
0 commit comments