Store address table lookups in blockstore and bigtable (#22402)
This commit is contained in:
@ -790,10 +790,13 @@ mod tests {
|
||||
super::*,
|
||||
crate::StoredConfirmedBlock,
|
||||
prost::Message,
|
||||
solana_sdk::{hash::Hash, signature::Keypair, system_transaction},
|
||||
solana_sdk::{
|
||||
hash::Hash, message::v0::LoadedAddresses, signature::Keypair, system_transaction,
|
||||
},
|
||||
solana_storage_proto::convert::generated,
|
||||
solana_transaction_status::{
|
||||
ConfirmedBlock, TransactionStatusMeta, TransactionWithStatusMeta,
|
||||
VersionedConfirmedBlock,
|
||||
},
|
||||
std::convert::TryInto,
|
||||
};
|
||||
@ -815,6 +818,7 @@ mod tests {
|
||||
pre_token_balances: Some(vec![]),
|
||||
post_token_balances: Some(vec![]),
|
||||
rewards: Some(vec![]),
|
||||
loaded_addresses: LoadedAddresses::default(),
|
||||
}),
|
||||
};
|
||||
let block = ConfirmedBlock {
|
||||
@ -845,8 +849,9 @@ mod tests {
|
||||
"".to_string(),
|
||||
)
|
||||
.unwrap();
|
||||
let expected_block: VersionedConfirmedBlock = block.into();
|
||||
if let CellData::Protobuf(protobuf_block) = deserialized {
|
||||
assert_eq!(block, protobuf_block.try_into().unwrap());
|
||||
assert_eq!(expected_block, protobuf_block.try_into().unwrap());
|
||||
} else {
|
||||
panic!("deserialization should produce CellData::Protobuf");
|
||||
}
|
||||
@ -861,7 +866,7 @@ mod tests {
|
||||
)
|
||||
.unwrap();
|
||||
if let CellData::Bincode(bincode_block) = deserialized {
|
||||
let mut block = block;
|
||||
let mut block = expected_block;
|
||||
if let Some(meta) = &mut block.transactions[0].meta {
|
||||
meta.inner_instructions = None; // Legacy bincode implementation does not support inner_instructions
|
||||
meta.log_messages = None; // Legacy bincode implementation does not support log_messages
|
||||
|
@ -6,17 +6,18 @@ use {
|
||||
solana_sdk::{
|
||||
clock::{Slot, UnixTimestamp},
|
||||
deserialize_utils::default_on_eof,
|
||||
message::v0::LoadedAddresses,
|
||||
pubkey::Pubkey,
|
||||
signature::Signature,
|
||||
sysvar::is_sysvar_id,
|
||||
transaction::{Transaction, TransactionError},
|
||||
transaction::{TransactionError, VersionedTransaction},
|
||||
},
|
||||
solana_storage_proto::convert::{generated, tx_by_addr},
|
||||
solana_transaction_status::{
|
||||
extract_and_fmt_memos, ConfirmedBlock, ConfirmedTransactionStatusWithSignature,
|
||||
ConfirmedTransactionWithStatusMeta, Reward, TransactionByAddrInfo,
|
||||
TransactionConfirmationStatus, TransactionStatus, TransactionStatusMeta,
|
||||
TransactionWithStatusMeta,
|
||||
extract_and_fmt_memos, ConfirmedBlock, ConfirmedTransactionStatusWithSignature, Reward,
|
||||
TransactionByAddrInfo, TransactionConfirmationStatus, TransactionStatus,
|
||||
TransactionStatusMeta, TransactionWithStatusMeta, VersionedConfirmedBlock,
|
||||
VersionedConfirmedTransactionWithStatusMeta, VersionedTransactionWithStatusMeta,
|
||||
},
|
||||
std::{
|
||||
collections::{HashMap, HashSet},
|
||||
@ -138,7 +139,7 @@ impl From<ConfirmedBlock> for StoredConfirmedBlock {
|
||||
}
|
||||
}
|
||||
|
||||
impl From<StoredConfirmedBlock> for ConfirmedBlock {
|
||||
impl From<StoredConfirmedBlock> for VersionedConfirmedBlock {
|
||||
fn from(confirmed_block: StoredConfirmedBlock) -> Self {
|
||||
let StoredConfirmedBlock {
|
||||
previous_blockhash,
|
||||
@ -164,20 +165,20 @@ impl From<StoredConfirmedBlock> for ConfirmedBlock {
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
struct StoredConfirmedBlockTransaction {
|
||||
transaction: Transaction,
|
||||
transaction: VersionedTransaction,
|
||||
meta: Option<StoredConfirmedBlockTransactionStatusMeta>,
|
||||
}
|
||||
|
||||
impl From<TransactionWithStatusMeta> for StoredConfirmedBlockTransaction {
|
||||
fn from(value: TransactionWithStatusMeta) -> Self {
|
||||
Self {
|
||||
transaction: value.transaction,
|
||||
transaction: value.transaction.into(),
|
||||
meta: value.meta.map(|meta| meta.into()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<StoredConfirmedBlockTransaction> for TransactionWithStatusMeta {
|
||||
impl From<StoredConfirmedBlockTransaction> for VersionedTransactionWithStatusMeta {
|
||||
fn from(value: StoredConfirmedBlockTransaction) -> Self {
|
||||
Self {
|
||||
transaction: value.transaction,
|
||||
@ -216,6 +217,7 @@ impl From<StoredConfirmedBlockTransactionStatusMeta> for TransactionStatusMeta {
|
||||
pre_token_balances: None,
|
||||
post_token_balances: None,
|
||||
rewards: None,
|
||||
loaded_addresses: LoadedAddresses::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -392,7 +394,7 @@ impl LedgerStorage {
|
||||
}
|
||||
|
||||
/// Fetch the confirmed block from the desired slot
|
||||
pub async fn get_confirmed_block(&self, slot: Slot) -> Result<ConfirmedBlock> {
|
||||
pub async fn get_confirmed_block(&self, slot: Slot) -> Result<VersionedConfirmedBlock> {
|
||||
debug!(
|
||||
"LedgerStorage::get_confirmed_block request received: {:?}",
|
||||
slot
|
||||
@ -438,7 +440,7 @@ impl LedgerStorage {
|
||||
pub async fn get_confirmed_transaction(
|
||||
&self,
|
||||
signature: &Signature,
|
||||
) -> Result<Option<ConfirmedTransactionWithStatusMeta>> {
|
||||
) -> Result<Option<VersionedConfirmedTransactionWithStatusMeta>> {
|
||||
debug!(
|
||||
"LedgerStorage::get_confirmed_transaction request received: {:?}",
|
||||
signature
|
||||
@ -471,9 +473,9 @@ impl LedgerStorage {
|
||||
);
|
||||
Ok(None)
|
||||
} else {
|
||||
Ok(Some(ConfirmedTransactionWithStatusMeta {
|
||||
Ok(Some(VersionedConfirmedTransactionWithStatusMeta {
|
||||
slot,
|
||||
transaction: bucket_block_transaction,
|
||||
tx_with_meta: bucket_block_transaction,
|
||||
block_time: block.block_time,
|
||||
}))
|
||||
}
|
||||
@ -627,7 +629,7 @@ impl LedgerStorage {
|
||||
pub async fn upload_confirmed_block(
|
||||
&self,
|
||||
slot: Slot,
|
||||
confirmed_block: ConfirmedBlock,
|
||||
confirmed_block: VersionedConfirmedBlock,
|
||||
) -> Result<()> {
|
||||
let mut bytes_written = 0;
|
||||
|
||||
@ -635,13 +637,13 @@ impl LedgerStorage {
|
||||
|
||||
let mut tx_cells = vec![];
|
||||
for (index, transaction_with_meta) in confirmed_block.transactions.iter().enumerate() {
|
||||
let TransactionWithStatusMeta { meta, transaction } = transaction_with_meta;
|
||||
let VersionedTransactionWithStatusMeta { meta, transaction } = transaction_with_meta;
|
||||
let err = meta.as_ref().and_then(|meta| meta.status.clone().err());
|
||||
let index = index as u32;
|
||||
let signature = transaction.signatures[0];
|
||||
let memo = extract_and_fmt_memos(&transaction.message);
|
||||
let memo = extract_and_fmt_memos(transaction_with_meta);
|
||||
|
||||
for address in &transaction.message.account_keys {
|
||||
for address in transaction_with_meta.account_keys_iter() {
|
||||
if !is_sysvar_id(address) {
|
||||
by_addr
|
||||
.entry(address)
|
||||
@ -723,12 +725,12 @@ impl LedgerStorage {
|
||||
let mut expected_tx_infos: HashMap<String, UploadedTransaction> = HashMap::new();
|
||||
let confirmed_block = self.get_confirmed_block(slot).await?;
|
||||
for (index, transaction_with_meta) in confirmed_block.transactions.iter().enumerate() {
|
||||
let TransactionWithStatusMeta { meta, transaction } = transaction_with_meta;
|
||||
let VersionedTransactionWithStatusMeta { transaction, meta } = transaction_with_meta;
|
||||
let signature = transaction.signatures[0];
|
||||
let index = index as u32;
|
||||
let err = meta.as_ref().and_then(|meta| meta.status.clone().err());
|
||||
|
||||
for address in &transaction.message.account_keys {
|
||||
for address in transaction_with_meta.account_keys_iter() {
|
||||
if !is_sysvar_id(address) {
|
||||
addresses.insert(address);
|
||||
}
|
||||
|
Reference in New Issue
Block a user