SPL token balance in transaction metadata (bp #13673) (#14752)

* SPL token balance in transaction metadata  (#13673)

* feat: store pre / post token balances

* move helper functions into separate include

* move token balance functionality to transaction-status crate

* fix blockstore processor test

* fix bigtable legacy test

* add caching to decimals

(cherry picked from commit 13db3eca9f)

# Conflicts:
#	core/src/banking_stage.rs
#	storage-proto/Cargo.toml
#	storage-proto/src/convert.rs

* resolve merges storage-proto banking_stage

* fix bpf tests with token deltas

Co-authored-by: Josh <josh.hundley@gmail.com>
This commit is contained in:
mergify[bot]
2021-01-22 02:58:51 +00:00
committed by GitHub
parent 6c0d867d87
commit e4068cb1bc
14 changed files with 360 additions and 6 deletions

View File

@@ -41,8 +41,13 @@ use solana_sdk::{
timing::{duration_as_ms, timestamp},
transaction::{self, Transaction, TransactionError},
};
use solana_transaction_status::token_balances::{
collect_token_balances, TransactionTokenBalancesSet,
};
use std::{
cmp, env,
cmp,
collections::HashMap,
env,
net::UdpSocket,
sync::atomic::AtomicBool,
sync::mpsc::Receiver,
@@ -535,6 +540,14 @@ impl BankingStage {
};
let mut execute_timings = ExecuteTimings::default();
let mut mint_decimals: HashMap<Pubkey, u8> = HashMap::new();
let pre_token_balances = if transaction_status_sender.is_some() {
collect_token_balances(&bank, &batch, &mut mint_decimals)
} else {
vec![]
};
let (
mut loaded_accounts,
results,
@@ -581,12 +594,14 @@ impl BankingStage {
bank_utils::find_and_send_votes(txs, &tx_results, Some(gossip_vote_sender));
if let Some(sender) = transaction_status_sender {
let post_balances = bank.collect_balances(batch);
let post_token_balances = collect_token_balances(&bank, &batch, &mut mint_decimals);
send_transaction_status_batch(
bank.clone(),
batch.transactions(),
batch.iteration_order_vec(),
tx_results.execution_results,
TransactionBalancesSet::new(pre_balances, post_balances),
TransactionTokenBalancesSet::new(pre_token_balances, post_token_balances),
inner_instructions,
transaction_logs,
sender,

View File

@@ -54,6 +54,7 @@ impl TransactionStatusService {
iteration_order,
statuses,
balances,
token_balances,
inner_instructions,
transaction_logs,
} = write_transaction_status_receiver.recv_timeout(Duration::from_secs(1))?;
@@ -64,6 +65,8 @@ impl TransactionStatusService {
(status, nonce_rollback),
pre_balances,
post_balances,
pre_token_balances,
post_token_balances,
inner_instructions,
log_messages,
) in izip!(
@@ -71,6 +74,8 @@ impl TransactionStatusService {
statuses,
balances.pre_balances,
balances.post_balances,
token_balances.pre_token_balances,
token_balances.post_token_balances,
inner_instructions,
transaction_logs
) {
@@ -98,6 +103,8 @@ impl TransactionStatusService {
});
let log_messages = Some(log_messages);
let pre_token_balances = Some(pre_token_balances);
let post_token_balances = Some(post_token_balances);
blockstore
.write_transaction_status(
@@ -112,6 +119,8 @@ impl TransactionStatusService {
post_balances,
inner_instructions,
log_messages,
pre_token_balances,
post_token_balances,
},
)
.expect("Expect database write to succeed");