From 65aa8e7df3be0e1f80f189e8604a0f4644013a2c Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Mon, 23 Mar 2020 11:25:39 -0600 Subject: [PATCH] Update getSignatureStatus: support multiple signatures, include slot in each response item (#9022) * Rename enable-rpc-get-confirmed-block * Rename RpcTransactionStatus -> RpcTransactionStatusMeta * Return simplified RpcTransactionStatus; Add support for multiple transactions * Update docs * typo --- client/src/mock_rpc_client_request.rs | 19 ++-- client/src/rpc_client.rs | 8 +- client/src/rpc_request.rs | 2 +- client/src/rpc_response.rs | 11 ++- core/src/rpc.rs | 125 +++++++++++++------------ core/src/transaction_status_service.rs | 4 +- core/src/validator.rs | 4 +- docs/src/apps/jsonrpc-api.md | 20 ++-- ledger/src/blockstore.rs | 22 ++--- ledger/src/blockstore_db.rs | 4 +- multinode-demo/bootstrap-validator.sh | 2 +- multinode-demo/validator.sh | 2 +- net/remote/remote-node.sh | 2 +- run.sh | 2 +- runtime/src/status_cache.rs | 21 ++--- validator/src/main.rs | 8 +- 16 files changed, 136 insertions(+), 120 deletions(-) diff --git a/client/src/mock_rpc_client_request.rs b/client/src/mock_rpc_client_request.rs index db464b6175cade..f442ae6319da1f 100644 --- a/client/src/mock_rpc_client_request.rs +++ b/client/src/mock_rpc_client_request.rs @@ -2,7 +2,7 @@ use crate::{ client_error::Result, generic_rpc_client_request::GenericRpcClientRequest, rpc_request::RpcRequest, - rpc_response::{Response, RpcResponseContext}, + rpc_response::{Response, RpcResponseContext, RpcTransactionStatus}, }; use serde_json::{Number, Value}; use solana_sdk::{ @@ -87,19 +87,22 @@ impl GenericRpcClientRequest for MockRpcClientRequest { value: serde_json::to_value(FeeRateGovernor::default()).unwrap(), })?, RpcRequest::GetSignatureStatus => { - let response: Option> = if self.url == "account_in_use" { - Some(Err(TransactionError::AccountInUse)) + let status: transaction::Result<()> = if self.url == "account_in_use" { + Err(TransactionError::AccountInUse) } else if self.url == "instruction_error" { - Some(Err(TransactionError::InstructionError( + Err(TransactionError::InstructionError( 0, InstructionError::UninitializedAccount, - ))) - } else if self.url == "sig_not_found" { + )) + } else { + Ok(()) + }; + let status = if self.url == "sig_not_found" { None } else { - Some(Ok(())) + Some(RpcTransactionStatus { status, slot: 1 }) }; - serde_json::to_value(response).unwrap() + serde_json::to_value(vec![status])? } RpcRequest::GetTransactionCount => Value::Number(Number::from(1234)), RpcRequest::GetSlot => Value::Number(Number::from(0)), diff --git a/client/src/rpc_client.rs b/client/src/rpc_client.rs index 9f633fa5bc9839..d8505c937c9c93 100644 --- a/client/src/rpc_client.rs +++ b/client/src/rpc_client.rs @@ -7,7 +7,7 @@ use crate::{ rpc_response::{ Response, RpcAccount, RpcBlockhashFeeCalculator, RpcConfirmedBlock, RpcContactInfo, RpcEpochInfo, RpcFeeCalculator, RpcFeeRateGovernor, RpcIdentity, RpcKeyedAccount, - RpcLeaderSchedule, RpcResult, RpcVersionInfo, RpcVoteAccountStatus, + RpcLeaderSchedule, RpcResult, RpcTransactionStatus, RpcVersionInfo, RpcVoteAccountStatus, }, }; use bincode::serialize; @@ -120,12 +120,12 @@ impl RpcClient { ) -> ClientResult>> { let signature_status = self.client.send( &RpcRequest::GetSignatureStatus, - json!([signature.to_string(), commitment_config]), + json!([[signature.to_string()], commitment_config]), 5, )?; - let result: Option> = + let result: Vec> = serde_json::from_value(signature_status).unwrap(); - Ok(result) + Ok(result[0].clone().map(|status_meta| status_meta.status)) } pub fn get_slot(&self) -> ClientResult { diff --git a/client/src/rpc_request.rs b/client/src/rpc_request.rs index 6e9e1008635f35..312b3014d5eb76 100644 --- a/client/src/rpc_request.rs +++ b/client/src/rpc_request.rs @@ -95,7 +95,7 @@ impl RpcRequest { #[derive(Debug, Error)] pub enum RpcError { - #[error("rpc reques error: {0}")] + #[error("rpc request error: {0}")] RpcRequestError(String), #[error("parse error: expected {0}")] ParseError(String), /* "expected" */ diff --git a/client/src/rpc_response.rs b/client/src/rpc_response.rs index 212eb3a9f1ff2d..65de9459a54d1f 100644 --- a/client/src/rpc_response.rs +++ b/client/src/rpc_response.rs @@ -52,7 +52,7 @@ pub struct RpcConfirmedBlock { #[serde(rename_all = "camelCase")] pub struct RpcTransactionWithStatusMeta { pub transaction: RpcEncodedTransaction, - pub meta: Option, + pub meta: Option, } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] @@ -136,13 +136,20 @@ pub struct RpcCompiledInstruction { #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] -pub struct RpcTransactionStatus { +pub struct RpcTransactionStatusMeta { pub status: Result<()>, pub fee: u64, pub pre_balances: Vec, pub post_balances: Vec, } +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct RpcTransactionStatus { + pub slot: Slot, + pub status: Result<()>, +} + #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(rename_all = "camelCase")] pub struct RpcBlockhashFeeCalculator { diff --git a/core/src/rpc.rs b/core/src/rpc.rs index d8206f56032489..494e0059a59510 100644 --- a/core/src/rpc.rs +++ b/core/src/rpc.rs @@ -7,13 +7,7 @@ use crate::{ use bincode::serialize; use jsonrpc_core::{Error, Metadata, Result}; use jsonrpc_derive::rpc; -use solana_client::rpc_response::{ - Response, RpcAccount, RpcBlockCommitment, RpcBlockhashFeeCalculator, RpcConfirmedBlock, - RpcContactInfo, RpcEpochInfo, RpcFeeCalculator, RpcFeeRateGovernor, RpcIdentity, - RpcKeyedAccount, RpcLeaderSchedule, RpcResponseContext, RpcSignatureConfirmation, - RpcStorageTurn, RpcTransactionEncoding, RpcVersionInfo, RpcVoteAccountInfo, - RpcVoteAccountStatus, -}; +use solana_client::rpc_response::*; use solana_faucet::faucet::request_airdrop_transaction; use solana_ledger::{ bank_forks::BankForks, blockstore::Blockstore, rooted_slot_iterator::RootedSlotIterator, @@ -29,7 +23,7 @@ use solana_sdk::{ pubkey::Pubkey, signature::Signature, timing::slot_duration_from_slots_per_year, - transaction::{self, Transaction}, + transaction::Transaction, }; use solana_vote_program::vote_state::{VoteState, MAX_LOCKOUT_HISTORY}; use std::{ @@ -52,7 +46,7 @@ fn new_response(bank: &Bank, value: T) -> RpcResponse { pub struct JsonRpcConfig { pub enable_validator_exit: bool, pub enable_set_log_filter: bool, - pub enable_get_confirmed_block: bool, + pub enable_rpc_transaction_history: bool, pub identity_pubkey: Pubkey, pub faucet_addr: Option, } @@ -374,7 +368,7 @@ impl JsonRpcRequestProcessor { slot: Slot, encoding: Option, ) -> Result> { - if self.config.enable_get_confirmed_block { + if self.config.enable_rpc_transaction_history { Ok(self.blockstore.get_confirmed_block(slot, encoding).ok()) } else { Ok(None) @@ -422,6 +416,27 @@ impl JsonRpcRequestProcessor { .ok() .unwrap_or(None)) } + + pub fn get_signature_status( + &self, + signatures: Vec, + commitment: Option, + ) -> Result>> { + let mut statuses: Vec> = vec![]; + + let bank = self.bank(commitment); + + for signature in signatures { + let status = bank.get_signature_confirmation_status(&signature).map( + |SignatureConfirmationStatus { slot, status, .. }| RpcTransactionStatus { + slot, + status, + }, + ); + statuses.push(status); + } + Ok(statuses) + } } fn get_tpu_addr(cluster_info: &Arc>) -> Result { @@ -548,9 +563,9 @@ pub trait RpcSol { fn get_signature_status( &self, meta: Self::Metadata, - signature_str: String, + signature_strs: Vec, commitment: Option, - ) -> Result>>; + ) -> Result>>; #[rpc(meta, name = "getSlot")] fn get_slot(&self, meta: Self::Metadata, commitment: Option) -> Result; @@ -894,11 +909,17 @@ impl RpcSol for RpcSolImpl { fn get_signature_status( &self, meta: Self::Metadata, - signature_str: String, + signature_strs: Vec, commitment: Option, - ) -> Result>> { - self.get_signature_confirmation(meta, signature_str, commitment) - .map(|res| res.map(|x| x.status)) + ) -> Result>> { + let mut signatures: Vec = vec![]; + for signature_str in signature_strs { + signatures.push(verify_signature(&signature_str)?); + } + meta.request_processor + .read() + .unwrap() + .get_signature_status(signatures, commitment) } fn get_slot(&self, meta: Self::Metadata, commitment: Option) -> Result { @@ -1209,7 +1230,7 @@ pub mod tests { rpc_port, signature::{Keypair, Signer}, system_transaction, - transaction::TransactionError, + transaction::{self, TransactionError}, }; use solana_vote_program::{ vote_instruction, @@ -1338,7 +1359,7 @@ pub mod tests { let request_processor = Arc::new(RwLock::new(JsonRpcRequestProcessor::new( JsonRpcConfig { - enable_get_confirmed_block: true, + enable_rpc_transaction_history: true, identity_pubkey: *pubkey, ..JsonRpcConfig::default() }, @@ -1782,66 +1803,50 @@ pub mod tests { meta, blockhash, alice, + confirmed_block_signatures, .. } = start_rpc_handler_with_tx(&bob_pubkey); - let tx = system_transaction::transfer(&alice, &bob_pubkey, 20, blockhash); let req = format!( - r#"{{"jsonrpc":"2.0","id":1,"method":"getSignatureStatus","params":["{}"]}}"#, - tx.signatures[0] + r#"{{"jsonrpc":"2.0","id":1,"method":"getSignatureStatus","params":[["{}"]]}}"#, + confirmed_block_signatures[0] ); let res = io.handle_request_sync(&req, meta.clone()); - let expected_res: Option> = Some(Ok(())); - let expected = json!({ - "jsonrpc": "2.0", - "result": expected_res, - "id": 1 - }); - let expected: Response = - serde_json::from_value(expected).expect("expected response deserialization"); - let result: Response = serde_json::from_str(&res.expect("actual response")) - .expect("actual response deserialization"); - assert_eq!(expected, result); + let expected_res: transaction::Result<()> = Ok(()); + let json: Value = serde_json::from_str(&res.unwrap()).unwrap(); + let result: Vec> = + serde_json::from_value(json["result"].clone()) + .expect("actual response deserialization"); + assert_eq!(expected_res, result[0].as_ref().unwrap().status); // Test getSignatureStatus request on unprocessed tx let tx = system_transaction::transfer(&alice, &bob_pubkey, 10, blockhash); let req = format!( - r#"{{"jsonrpc":"2.0","id":1,"method":"getSignatureStatus","params":["{}"]}}"#, + r#"{{"jsonrpc":"2.0","id":1,"method":"getSignatureStatus","params":[["{}"]]}}"#, tx.signatures[0] ); let res = io.handle_request_sync(&req, meta.clone()); - let expected_res: Option = None; - let expected = json!({ - "jsonrpc": "2.0", - "result": expected_res, - "id": 1 - }); - let expected: Response = - serde_json::from_value(expected).expect("expected response deserialization"); - let result: Response = serde_json::from_str(&res.expect("actual response")) - .expect("actual response deserialization"); - assert_eq!(expected, result); + let json: Value = serde_json::from_str(&res.unwrap()).unwrap(); + let result: Vec> = + serde_json::from_value(json["result"].clone()) + .expect("actual response deserialization"); + assert!(result[0].is_none()); // Test getSignatureStatus request on a TransactionError - let tx = system_transaction::transfer(&alice, &bob_pubkey, std::u64::MAX, blockhash); let req = format!( - r#"{{"jsonrpc":"2.0","id":1,"method":"getSignatureStatus","params":["{}"]}}"#, - tx.signatures[0] + r#"{{"jsonrpc":"2.0","id":1,"method":"getSignatureStatus","params":[["{}"]]}}"#, + confirmed_block_signatures[1] ); - let res = io.handle_request_sync(&req, meta); - let expected_res: Option> = Some(Err( - TransactionError::InstructionError(0, InstructionError::CustomError(1)), + let res = io.handle_request_sync(&req, meta.clone()); + let expected_res: transaction::Result<()> = Err(TransactionError::InstructionError( + 0, + InstructionError::CustomError(1), )); - let expected = json!({ - "jsonrpc": "2.0", - "result": expected_res, - "id": 1 - }); - let expected: Response = - serde_json::from_value(expected).expect("expected response deserialization"); - let result: Response = serde_json::from_str(&res.expect("actual response")) - .expect("actual response deserialization"); - assert_eq!(expected, result); + let json: Value = serde_json::from_str(&res.unwrap()).unwrap(); + let result: Vec> = + serde_json::from_value(json["result"].clone()) + .expect("actual response deserialization"); + assert_eq!(expected_res, result[0].as_ref().unwrap().status); } #[test] diff --git a/core/src/transaction_status_service.rs b/core/src/transaction_status_service.rs index 2b6f4749e9c65a..b541be2e12ddbc 100644 --- a/core/src/transaction_status_service.rs +++ b/core/src/transaction_status_service.rs @@ -1,5 +1,5 @@ use crossbeam_channel::{Receiver, RecvTimeoutError}; -use solana_client::rpc_response::RpcTransactionStatus; +use solana_client::rpc_response::RpcTransactionStatusMeta; use solana_ledger::{blockstore::Blockstore, blockstore_processor::TransactionStatusBatch}; use solana_runtime::{ bank::{Bank, HashAgeKind}, @@ -73,7 +73,7 @@ impl TransactionStatusService { blockstore .write_transaction_status( (slot, transaction.signatures[0]), - &RpcTransactionStatus { + &RpcTransactionStatusMeta { status, fee, pre_balances, diff --git a/core/src/validator.rs b/core/src/validator.rs index 98c0a1b20cf76f..8138dc738d017f 100644 --- a/core/src/validator.rs +++ b/core/src/validator.rs @@ -272,7 +272,7 @@ impl Validator { }); let (transaction_status_sender, transaction_status_service) = - if rpc_service.is_some() && config.rpc_config.enable_get_confirmed_block { + if rpc_service.is_some() && config.rpc_config.enable_rpc_transaction_history { let (transaction_status_sender, transaction_status_receiver) = unbounded(); ( Some(transaction_status_sender), @@ -287,7 +287,7 @@ impl Validator { }; let (rewards_recorder_sender, rewards_recorder_service) = - if rpc_service.is_some() && config.rpc_config.enable_get_confirmed_block { + if rpc_service.is_some() && config.rpc_config.enable_rpc_transaction_history { let (rewards_recorder_sender, rewards_receiver) = unbounded(); ( Some(rewards_recorder_sender), diff --git a/docs/src/apps/jsonrpc-api.md b/docs/src/apps/jsonrpc-api.md index 5a55cbbcbcae9d..62b7d22320ad65 100644 --- a/docs/src/apps/jsonrpc-api.md +++ b/docs/src/apps/jsonrpc-api.md @@ -693,24 +693,30 @@ Returns the status of a given signature. This method is similar to [confirmTrans #### Parameters: -* `` - Signature of Transaction to confirm, as base-58 encoded string -* `` - (optional) [Commitment](jsonrpc-api.md#configuring-state-commitment) +* `` - An array of transaction signatures to confirm, as base-58 encoded strings +* `` - (optional) Extended Rpc configuration, containing the following optional fields: + * `commitment: ` - [Commitment](jsonrpc-api.md#configuring-state-commitment) + * `searchTransactionHistory: ` - whether to search the ledger transaction status cache, which may be expensive #### Results: +An array of: + * `` - Unknown transaction -* `` - Transaction status: - * `"Ok": ` - Transaction was successful - * `"Err": ` - Transaction failed with TransactionError [TransactionError definitions](https://github.com/solana-labs/solana/blob/master/sdk/src/transaction.rs#L14) +* `` + * `slot: ` - The slot the transaction was processed + * `status: ` - Transaction status + * `"Ok": ` - Transaction was successful + * `"Err": ` - Transaction failed with TransactionError [TransactionError definitions](https://github.com/solana-labs/solana/blob/master/sdk/src/transaction.rs#L14) #### Example: ```bash // Request -curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getSignatureStatus", "params":["5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW"]}' http://localhost:8899 +curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getSignatureStatus", "params":[["5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW", "5j7s6NiJS3JAkvgkoc18WVAsiSaci2pxB2A6ueCJP4tprA2TFg9wSyTLeYouxPBJEMzJinENTkpA52YStRW5Dia7"]]]}' http://localhost:8899 // Result -{"jsonrpc":"2.0","result":{"Ok": null},"id":1} +{"jsonrpc":"2.0","result":[{"slot": 72, "status": {"Ok": null}}, null],"id":1} ``` ### getSlot diff --git a/ledger/src/blockstore.rs b/ledger/src/blockstore.rs index 99aa4f195647d5..d731eeb0a39e83 100644 --- a/ledger/src/blockstore.rs +++ b/ledger/src/blockstore.rs @@ -24,7 +24,7 @@ use rayon::{ use rocksdb::DBRawIterator; use solana_client::rpc_response::{ RpcConfirmedBlock, RpcEncodedTransaction, RpcRewards, RpcTransactionEncoding, - RpcTransactionStatus, RpcTransactionWithStatusMeta, + RpcTransactionStatusMeta, RpcTransactionWithStatusMeta, }; use solana_measure::measure::Measure; use solana_metrics::{datapoint_debug, datapoint_error}; @@ -1475,7 +1475,7 @@ impl Blockstore { pub fn write_transaction_status( &self, index: (Slot, Signature), - status: &RpcTransactionStatus, + status: &RpcTransactionStatusMeta, ) -> Result<()> { self.transaction_status_cf.put(index, status) } @@ -4803,7 +4803,7 @@ pub mod tests { .put_meta_bytes(slot - 1, &serialize(&parent_meta).unwrap()) .unwrap(); - let expected_transactions: Vec<(Transaction, Option)> = entries + let expected_transactions: Vec<(Transaction, Option)> = entries .iter() .cloned() .filter(|entry| !entry.is_tick()) @@ -4820,7 +4820,7 @@ pub mod tests { .transaction_status_cf .put( (slot, signature), - &RpcTransactionStatus { + &RpcTransactionStatusMeta { status: Ok(()), fee: 42, pre_balances: pre_balances.clone(), @@ -4832,7 +4832,7 @@ pub mod tests { .transaction_status_cf .put( (slot + 1, signature), - &RpcTransactionStatus { + &RpcTransactionStatusMeta { status: Ok(()), fee: 42, pre_balances: pre_balances.clone(), @@ -4842,7 +4842,7 @@ pub mod tests { .unwrap(); ( transaction, - Some(RpcTransactionStatus { + Some(RpcTransactionStatusMeta { status: Ok(()), fee: 42, pre_balances, @@ -5105,7 +5105,7 @@ pub mod tests { assert!(transaction_status_cf .put( (0, Signature::default()), - &RpcTransactionStatus { + &RpcTransactionStatusMeta { status: solana_sdk::transaction::Result::<()>::Err( TransactionError::AccountNotFound ), @@ -5117,7 +5117,7 @@ pub mod tests { .is_ok()); // result found - let RpcTransactionStatus { + let RpcTransactionStatusMeta { status, fee, pre_balances, @@ -5135,7 +5135,7 @@ pub mod tests { assert!(transaction_status_cf .put( (9, Signature::default()), - &RpcTransactionStatus { + &RpcTransactionStatusMeta { status: solana_sdk::transaction::Result::<()>::Ok(()), fee: 9u64, pre_balances: pre_balances_vec.clone(), @@ -5145,7 +5145,7 @@ pub mod tests { .is_ok()); // result found - let RpcTransactionStatus { + let RpcTransactionStatusMeta { status, fee, pre_balances, @@ -5200,7 +5200,7 @@ pub mod tests { transaction_status_cf .put( (slot, transaction.signatures[0]), - &RpcTransactionStatus { + &RpcTransactionStatusMeta { status: solana_sdk::transaction::Result::<()>::Err( TransactionError::AccountNotFound, ), diff --git a/ledger/src/blockstore_db.rs b/ledger/src/blockstore_db.rs index 9ad31f196c918d..9ac9266940f0d6 100644 --- a/ledger/src/blockstore_db.rs +++ b/ledger/src/blockstore_db.rs @@ -10,7 +10,7 @@ use rocksdb::{ }; use serde::de::DeserializeOwned; use serde::Serialize; -use solana_client::rpc_response::{RpcRewards, RpcTransactionStatus}; +use solana_client::rpc_response::{RpcRewards, RpcTransactionStatusMeta}; use solana_sdk::{clock::Slot, signature::Signature}; use std::{collections::HashMap, fs, marker::PhantomData, path::Path, sync::Arc}; use thiserror::Error; @@ -269,7 +269,7 @@ pub trait TypedColumn: Column { } impl TypedColumn for columns::TransactionStatus { - type Type = RpcTransactionStatus; + type Type = RpcTransactionStatusMeta; } pub trait SlotColumn {} diff --git a/multinode-demo/bootstrap-validator.sh b/multinode-demo/bootstrap-validator.sh index 0334928b98d967..d5a2480d85c248 100755 --- a/multinode-demo/bootstrap-validator.sh +++ b/multinode-demo/bootstrap-validator.sh @@ -42,7 +42,7 @@ while [[ -n $1 ]]; do elif [[ $1 = --no-rocksdb-compaction ]]; then args+=("$1") shift - elif [[ $1 = --enable-rpc-get-confirmed-block ]]; then + elif [[ $1 = --enable-rpc-transaction-history ]]; then args+=("$1") shift elif [[ $1 = --skip-poh-verify ]]; then diff --git a/multinode-demo/validator.sh b/multinode-demo/validator.sh index 4fdebedba80830..1c29b74c775462 100755 --- a/multinode-demo/validator.sh +++ b/multinode-demo/validator.sh @@ -136,7 +136,7 @@ while [[ -n $1 ]]; do elif [[ $1 = --no-rocksdb-compaction ]]; then args+=("$1") shift - elif [[ $1 = --enable-rpc-get-confirmed-block ]]; then + elif [[ $1 = --enable-rpc-transaction-history ]]; then args+=("$1") shift elif [[ $1 = --skip-poh-verify ]]; then diff --git a/net/remote/remote-node.sh b/net/remote/remote-node.sh index 8b95bde87769fe..897a0ec2307c9d 100755 --- a/net/remote/remote-node.sh +++ b/net/remote/remote-node.sh @@ -290,7 +290,7 @@ EOF --blockstream /tmp/solana-blockstream.sock --no-voting --dev-no-sigverify - --enable-rpc-get-confirmed-block + --enable-rpc-transaction-history ) else if [[ -n $internalNodesLamports ]]; then diff --git a/run.sh b/run.sh index da09d96401ed39..aac83ef65dbe94 100755 --- a/run.sh +++ b/run.sh @@ -105,7 +105,7 @@ args=( --rpc-faucet-address 127.0.0.1:9900 --log - --enable-rpc-exit - --enable-rpc-get-confirmed-block + --enable-rpc-transaction-history --init-complete-file "$dataDir"/init-completed ) if [[ -n $blockstreamSocket ]]; then diff --git a/runtime/src/status_cache.rs b/runtime/src/status_cache.rs index d1746f2420c5a0..d7c0961209bcf8 100644 --- a/runtime/src/status_cache.rs +++ b/runtime/src/status_cache.rs @@ -117,20 +117,15 @@ impl StatusCache { trace!("get_signature_status_slow: trying {}", blockhash); if let Some((forkid, res)) = self.get_signature_status(sig, blockhash, ancestors) { trace!("get_signature_status_slow: got {}", forkid); - return ancestors + let confirmations = ancestors .get(&forkid) - .map(|id| SignatureConfirmationStatus { - slot: forkid, - confirmations: *id, - status: res.clone(), - }) - .or_else(|| { - Some(SignatureConfirmationStatus { - slot: forkid, - confirmations: ancestors.len(), - status: res, - }) - }); + .copied() + .unwrap_or_else(|| ancestors.len()); + return Some(SignatureConfirmationStatus { + slot: forkid, + confirmations, + status: res, + }); } } None diff --git a/validator/src/main.rs b/validator/src/main.rs index 16a871002e9b8c..ccf26074b4b1c5 100644 --- a/validator/src/main.rs +++ b/validator/src/main.rs @@ -696,10 +696,10 @@ pub fn main() { .help("Enable the JSON RPC 'setLogFilter' API. Only enable in a debug environment"), ) .arg( - Arg::with_name("enable_rpc_get_confirmed_block") - .long("enable-rpc-get-confirmed-block") + Arg::with_name("enable_rpc_transaction_history") + .long("enable-rpc-transaction-history") .takes_value(false) - .help("Enable the JSON RPC 'getConfirmedBlock' API. This will cause an increase in disk usage and IOPS"), + .help("Enable historical transaction info over JSON RPC, including the 'getConfirmedBlock' API. This will cause an increase in disk usage and IOPS"), ) .arg( Arg::with_name("rpc_faucet_addr") @@ -939,7 +939,7 @@ pub fn main() { rpc_config: JsonRpcConfig { enable_validator_exit: matches.is_present("enable_rpc_exit"), enable_set_log_filter: matches.is_present("enable_rpc_set_log_filter"), - enable_get_confirmed_block: matches.is_present("enable_rpc_get_confirmed_block"), + enable_rpc_transaction_history: matches.is_present("enable_rpc_transaction_history"), identity_pubkey: identity_keypair.pubkey(), faucet_addr: matches.value_of("rpc_faucet_addr").map(|address| { solana_net_utils::parse_host_port(address).expect("failed to parse faucet address")