Skip to content

Commit 79ba85f

Browse files
committed
svm: collect transaction balances
1 parent e7d3003 commit 79ba85f

25 files changed

+461
-626
lines changed

Cargo.lock

+11-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,7 @@ solana-zk-sdk = { path = "zk-sdk", version = "=2.3.0" }
577577
solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=2.3.0" }
578578
solana-zk-token-sdk = { path = "zk-token-sdk", version = "=2.3.0" }
579579
spl-associated-token-account = "=6.0.0"
580+
spl-generic-token = "1.0.1"
580581
spl-instruction-padding = "0.3"
581582
spl-memo = "=6.0.0"
582583
spl-pod = "=0.5.1"

core/src/banking_stage/committer.rs

+12-30
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,25 @@ use {
33
itertools::Itertools,
44
solana_cost_model::cost_model::CostModel,
55
solana_ledger::{
6-
blockstore_processor::TransactionStatusSender, token_balances::collect_token_balances,
6+
blockstore_processor::TransactionStatusSender,
7+
transaction_balances::compile_collected_balances,
78
},
89
solana_measure::measure_us,
910
solana_runtime::{
10-
bank::{Bank, ProcessedTransactionCounts, TransactionBalancesSet},
11+
bank::{Bank, ProcessedTransactionCounts},
1112
bank_utils,
1213
prioritization_fee_cache::PrioritizationFeeCache,
1314
transaction_batch::TransactionBatch,
1415
vote_sender_types::ReplayVoteSender,
1516
},
1617
solana_runtime_transaction::transaction_with_meta::TransactionWithMeta,
17-
solana_sdk::{pubkey::Pubkey, saturating_add_assign},
18+
solana_sdk::saturating_add_assign,
1819
solana_svm::{
20+
transaction_balances::BalanceCollector,
1921
transaction_commit_result::{TransactionCommitResult, TransactionCommitResultExtensions},
2022
transaction_processing_result::TransactionProcessingResult,
2123
},
22-
solana_transaction_status::{
23-
token_balances::TransactionTokenBalancesSet, TransactionTokenBalance,
24-
},
25-
std::{collections::HashMap, sync::Arc},
24+
std::sync::Arc,
2625
};
2726

2827
#[derive(Clone, Debug, PartialEq, Eq)]
@@ -34,13 +33,6 @@ pub enum CommitTransactionDetails {
3433
NotCommitted,
3534
}
3635

37-
#[derive(Default)]
38-
pub(super) struct PreBalanceInfo {
39-
pub native: Vec<Vec<u64>>,
40-
pub token: Vec<Vec<TransactionTokenBalance>>,
41-
pub mint_decimals: HashMap<Pubkey, u8>,
42-
}
43-
4436
#[derive(Clone)]
4537
pub struct Committer {
4638
transaction_status_sender: Option<TransactionStatusSender>,
@@ -71,7 +63,7 @@ impl Committer {
7163
processing_results: Vec<TransactionProcessingResult>,
7264
starting_transaction_index: Option<usize>,
7365
bank: &Arc<Bank>,
74-
pre_balance_info: &mut PreBalanceInfo,
66+
balance_collector: Option<BalanceCollector>,
7567
execute_and_commit_timings: &mut LeaderExecuteAndCommitTimings,
7668
processed_counts: &ProcessedTransactionCounts,
7769
) -> (u64, Vec<CommitTransactionDetails>) {
@@ -117,7 +109,7 @@ impl Committer {
117109
commit_results,
118110
bank,
119111
batch,
120-
pre_balance_info,
112+
balance_collector,
121113
starting_transaction_index,
122114
);
123115
});
@@ -130,7 +122,7 @@ impl Committer {
130122
commit_results: Vec<TransactionCommitResult>,
131123
bank: &Arc<Bank>,
132124
batch: &TransactionBatch<impl TransactionWithMeta>,
133-
pre_balance_info: &mut PreBalanceInfo,
125+
balance_collector: Option<BalanceCollector>,
134126
starting_transaction_index: Option<usize>,
135127
) {
136128
if let Some(transaction_status_sender) = &self.transaction_status_sender {
@@ -142,11 +134,7 @@ impl Committer {
142134
.iter()
143135
.map(|tx| tx.as_sanitized_transaction().into_owned())
144136
.collect_vec();
145-
146-
let post_balances = bank.collect_balances(batch);
147-
let post_token_balances =
148-
collect_token_balances(bank, batch, &mut pre_balance_info.mint_decimals);
149-
137+
let (balances, token_balances) = compile_collected_balances(balance_collector);
150138
let mut transaction_index = starting_transaction_index.unwrap_or_default();
151139
let (batch_transaction_indexes, tx_costs): (Vec<_>, Vec<_>) = commit_results
152140
.iter()
@@ -177,14 +165,8 @@ impl Committer {
177165
bank.slot(),
178166
txs,
179167
commit_results,
180-
TransactionBalancesSet::new(
181-
std::mem::take(&mut pre_balance_info.native),
182-
post_balances,
183-
),
184-
TransactionTokenBalancesSet::new(
185-
std::mem::take(&mut pre_balance_info.token),
186-
post_token_balances,
187-
),
168+
balances,
169+
token_balances,
188170
tx_costs,
189171
batch_transaction_indexes,
190172
);

core/src/banking_stage/consume_worker.rs

-10
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,6 @@ impl ConsumeWorkerMetrics {
285285
fn update_on_execute_and_commit_timings(
286286
&self,
287287
LeaderExecuteAndCommitTimings {
288-
collect_balances_us,
289288
load_execute_us,
290289
freeze_lock_us,
291290
record_us,
@@ -294,9 +293,6 @@ impl ConsumeWorkerMetrics {
294293
..
295294
}: &LeaderExecuteAndCommitTimings,
296295
) {
297-
self.timing_metrics
298-
.collect_balances_us
299-
.fetch_add(*collect_balances_us, Ordering::Relaxed);
300296
self.timing_metrics
301297
.load_execute_us_min
302298
.fetch_min(*load_execute_us, Ordering::Relaxed);
@@ -512,7 +508,6 @@ impl ConsumeWorkerCountMetrics {
512508
#[derive(Default)]
513509
struct ConsumeWorkerTimingMetrics {
514510
cost_model_us: AtomicU64,
515-
collect_balances_us: AtomicU64,
516511
load_execute_us: AtomicU64,
517512
load_execute_us_min: AtomicU64,
518513
load_execute_us_max: AtomicU64,
@@ -535,11 +530,6 @@ impl ConsumeWorkerTimingMetrics {
535530
self.cost_model_us.swap(0, Ordering::Relaxed),
536531
i64
537532
),
538-
(
539-
"collect_balances_us",
540-
self.collect_balances_us.swap(0, Ordering::Relaxed),
541-
i64
542-
),
543533
(
544534
"load_execute_us",
545535
self.load_execute_us.swap(0, Ordering::Relaxed),

core/src/banking_stage/consumer.rs

+3-15
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
use {
22
super::{
3-
committer::{CommitTransactionDetails, Committer, PreBalanceInfo},
3+
committer::{CommitTransactionDetails, Committer},
44
leader_slot_timing_metrics::LeaderExecuteAndCommitTimings,
55
qos_service::QosService,
66
scheduler_messages::MaxAge,
77
},
88
itertools::Itertools,
99
solana_fee::FeeFeatures,
10-
solana_ledger::token_balances::collect_token_balances,
1110
solana_measure::measure_us,
1211
solana_poh::{
1312
poh_recorder::PohRecorderError,
@@ -239,18 +238,6 @@ impl Consumer {
239238
let transaction_status_sender_enabled = self.committer.transaction_status_sender_enabled();
240239
let mut execute_and_commit_timings = LeaderExecuteAndCommitTimings::default();
241240

242-
let mut pre_balance_info = PreBalanceInfo::default();
243-
let (_, collect_balances_us) = measure_us!({
244-
// If the extra meta-data services are enabled for RPC, collect the
245-
// pre-balances for native and token programs.
246-
if transaction_status_sender_enabled {
247-
pre_balance_info.native = bank.collect_balances(batch);
248-
pre_balance_info.token =
249-
collect_token_balances(bank, batch, &mut pre_balance_info.mint_decimals)
250-
}
251-
});
252-
execute_and_commit_timings.collect_balances_us = collect_balances_us;
253-
254241
let min_max = batch
255242
.sanitized_transactions()
256243
.iter()
@@ -323,6 +310,7 @@ impl Consumer {
323310
let LoadAndExecuteTransactionsOutput {
324311
processing_results,
325312
processed_counts,
313+
balance_collector,
326314
} = load_and_execute_transactions_output;
327315

328316
let transaction_counts = LeaderProcessedTransactionCounts {
@@ -388,7 +376,7 @@ impl Consumer {
388376
processing_results,
389377
starting_transaction_index,
390378
bank,
391-
&mut pre_balance_info,
379+
balance_collector,
392380
&mut execute_and_commit_timings,
393381
&processed_counts,
394382
)

core/src/banking_stage/leader_slot_timing_metrics.rs

-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use {
55

66
#[derive(Default, Debug)]
77
pub struct LeaderExecuteAndCommitTimings {
8-
pub collect_balances_us: u64,
98
pub load_execute_us: u64,
109
pub freeze_lock_us: u64,
1110
pub record_us: u64,
@@ -17,7 +16,6 @@ pub struct LeaderExecuteAndCommitTimings {
1716

1817
impl LeaderExecuteAndCommitTimings {
1918
pub fn accumulate(&mut self, other: &LeaderExecuteAndCommitTimings) {
20-
self.collect_balances_us += other.collect_balances_us;
2119
self.load_execute_us += other.load_execute_us;
2220
self.freeze_lock_us += other.freeze_lock_us;
2321
self.record_us += other.record_us;
@@ -33,7 +31,6 @@ impl LeaderExecuteAndCommitTimings {
3331
"banking_stage-leader_slot_execute_and_commit_timings",
3432
"id" => id,
3533
("slot", slot as i64, i64),
36-
("collect_balances_us", self.collect_balances_us as i64, i64),
3734
("load_execute_us", self.load_execute_us as i64, i64),
3835
("freeze_lock_us", self.freeze_lock_us as i64, i64),
3936
("record_us", self.record_us as i64, i64),

core/tests/scheduler_cost_adjustment.rs

-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ impl TestSetup {
109109
.load_execute_and_commit_transactions(
110110
&batch,
111111
MAX_PROCESSING_AGE,
112-
false,
113112
ExecutionRecordingConfig::new_single_setting(false),
114113
&mut ExecuteTimings::default(),
115114
None,

ledger/Cargo.toml

-2
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,6 @@ solana-transaction-context = { workspace = true }
7474
solana-transaction-status = { workspace = true }
7575
solana-vote = { workspace = true }
7676
solana-vote-program = { workspace = true }
77-
spl-token = { workspace = true, features = ["no-entrypoint"] }
78-
spl-token-2022 = { workspace = true, features = ["no-entrypoint"] }
7977
static_assertions = { workspace = true }
8078
strum = { workspace = true, features = ["derive"] }
8179
strum_macros = { workspace = true }

ledger/src/blockstore_processor.rs

+3-21
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use {
55
blockstore_meta::SlotMeta,
66
entry_notifier_service::{EntryNotification, EntryNotifierSender},
77
leader_schedule_cache::LeaderScheduleCache,
8-
token_balances::collect_token_balances,
8+
transaction_balances::compile_collected_balances,
99
use_snapshot_archives_at_startup::UseSnapshotArchivesAtStartup,
1010
},
1111
chrono_humanize::{Accuracy, HumanTime, Tense},
@@ -177,15 +177,7 @@ pub fn execute_batch<'a>(
177177
// None => block verification path(s)
178178
let block_verification = extra_pre_commit_callback.is_none();
179179
let record_transaction_meta = transaction_status_sender.is_some();
180-
181180
let mut transaction_indexes = Cow::from(transaction_indexes);
182-
let mut mint_decimals: HashMap<Pubkey, u8> = HashMap::new();
183-
184-
let pre_token_balances = if record_transaction_meta {
185-
collect_token_balances(bank, batch, &mut mint_decimals)
186-
} else {
187-
vec![]
188-
};
189181

190182
let pre_commit_callback = |_timings: &mut _, processing_results: &_| -> PreCommitResult {
191183
match extra_pre_commit_callback {
@@ -222,12 +214,11 @@ pub fn execute_batch<'a>(
222214
}
223215
};
224216

225-
let (commit_results, balances) = batch
217+
let (commit_results, balance_collector) = batch
226218
.bank()
227219
.load_execute_and_commit_transactions_with_pre_commit_callback(
228220
batch,
229221
MAX_PROCESSING_AGE,
230-
transaction_status_sender.is_some(),
231222
ExecutionRecordingConfig::new_single_setting(transaction_status_sender.is_some()),
232223
timings,
233224
log_messages_bytes_limit,
@@ -259,6 +250,7 @@ pub fn execute_batch<'a>(
259250
check_block_costs_elapsed.as_us(),
260251
);
261252
let tx_costs = tx_costs?;
253+
let (balances, token_balances) = compile_collected_balances(balance_collector);
262254

263255
bank_utils::find_and_send_votes(
264256
batch.sanitized_transactions(),
@@ -278,15 +270,6 @@ pub fn execute_batch<'a>(
278270
.iter()
279271
.map(|tx| tx.as_sanitized_transaction().into_owned())
280272
.collect();
281-
let post_token_balances = if record_transaction_meta {
282-
collect_token_balances(bank, batch, &mut mint_decimals)
283-
} else {
284-
vec![]
285-
};
286-
287-
let token_balances =
288-
TransactionTokenBalancesSet::new(pre_token_balances, post_token_balances);
289-
290273
// The length of costs vector needs to be consistent with all other
291274
// vectors that are sent over (such as `transactions`). So, replace the
292275
// None elements with Some(0)
@@ -4416,7 +4399,6 @@ pub mod tests {
44164399
let (commit_results, _) = batch.bank().load_execute_and_commit_transactions(
44174400
&batch,
44184401
MAX_PROCESSING_AGE,
4419-
false,
44204402
ExecutionRecordingConfig::new_single_setting(false),
44214403
&mut ExecuteTimings::default(),
44224404
None,

ledger/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ mod shredder;
3030
pub mod sigverify_shreds;
3131
pub mod slot_stats;
3232
mod staking_utils;
33-
pub mod token_balances;
3433
mod transaction_address_lookup_table_scanner;
34+
pub mod transaction_balances;
3535
pub mod use_snapshot_archives_at_startup;
3636

3737
#[macro_use]

0 commit comments

Comments
 (0)