From b584174d67f8aa7ebaebbf5324b31c0e12d1db0d Mon Sep 17 00:00:00 2001 From: Justin Starry Date: Sun, 5 Apr 2020 14:31:24 +0800 Subject: [PATCH] Deprecate `confirmTransaction`, `getSignatureStatus`, and `getSignatureConfirmation` (#9298) * Deprecate `confirmTransaction`, `getSignatureStatus`, etc * Rename get_signature_statuses to get_signature_statuses_with_commitment Co-authored-by: Michael Vines --- client/src/mock_rpc_client_request.rs | 28 +------------- client/src/rpc_client.rs | 53 +++++++++++++++----------- client/src/rpc_request.rs | 4 -- core/src/rpc.rs | 45 ++++++++++++---------- docs/src/apps/jsonrpc-api.md | 55 +-------------------------- 5 files changed, 57 insertions(+), 128 deletions(-) diff --git a/client/src/mock_rpc_client_request.rs b/client/src/mock_rpc_client_request.rs index 141aa678a..f8a0e28ca 100644 --- a/client/src/mock_rpc_client_request.rs +++ b/client/src/mock_rpc_client_request.rs @@ -40,7 +40,7 @@ impl GenericRpcClientRequest for MockRpcClientRequest { fn send( &self, request: &RpcRequest, - params: serde_json::Value, + _params: serde_json::Value, _retries: usize, ) -> Result { if let Some(value) = self.mocks.write().unwrap().remove(request) { @@ -50,17 +50,6 @@ impl GenericRpcClientRequest for MockRpcClientRequest { return Ok(Value::Null); } let val = match request { - RpcRequest::ConfirmTransaction => { - if let Some(params_array) = params.as_array() { - if let Value::String(param_string) = ¶ms_array[0] { - Value::Bool(param_string == SIGNATURE) - } else { - Value::Null - } - } else { - Value::Null - } - } RpcRequest::GetBalance => serde_json::to_value(Response { context: RpcResponseContext { slot: 1 }, value: Value::Number(Number::from(50)), @@ -87,21 +76,6 @@ impl GenericRpcClientRequest for MockRpcClientRequest { context: RpcResponseContext { slot: 1 }, value: serde_json::to_value(FeeRateGovernor::default()).unwrap(), })?, - RpcRequest::GetSignatureStatus => { - let response: Option> = if self.url == "account_in_use" { - Some(Err(TransactionError::AccountInUse)) - } else if self.url == "instruction_error" { - Some(Err(TransactionError::InstructionError( - 0, - InstructionError::UninitializedAccount, - ))) - } else if self.url == "sig_not_found" { - None - } else { - Some(Ok(())) - }; - serde_json::to_value(response).unwrap() - } RpcRequest::GetSignatureStatuses => { let status: transaction::Result<()> = if self.url == "account_in_use" { Err(TransactionError::AccountInUse) diff --git a/client/src/rpc_client.rs b/client/src/rpc_client.rs index f3999c0c7..c083dd9a8 100644 --- a/client/src/rpc_client.rs +++ b/client/src/rpc_client.rs @@ -77,17 +77,16 @@ impl RpcClient { signature: &Signature, commitment_config: CommitmentConfig, ) -> RpcResult { - let response = self - .client - .send( - &RpcRequest::ConfirmTransaction, - json!([signature.to_string(), commitment_config]), - 0, - ) - .map_err(|err| err.into_with_command("ConfirmTransaction"))?; + let Response { context, value } = + self.get_signature_statuses_with_commitment(&[*signature], commitment_config)?; - serde_json::from_value::>(response) - .map_err(|err| ClientError::new_with_command(err.into(), "ConfirmTransaction")) + Ok(Response { + context, + value: value[0] + .as_ref() + .map(|result| result.status.is_ok()) + .unwrap_or_default(), + }) } pub fn send_transaction(&self, transaction: &Transaction) -> ClientResult { @@ -113,6 +112,21 @@ impl RpcClient { self.get_signature_status_with_commitment(signature, CommitmentConfig::default()) } + pub fn get_signature_statuses_with_commitment( + &self, + signatures: &[Signature], + commitment_config: CommitmentConfig, + ) -> RpcResult>> { + let signatures: Vec<_> = signatures.iter().map(|s| s.to_string()).collect(); + let signature_status = self.client.send( + &RpcRequest::GetSignatureStatuses, + json!([&signatures, commitment_config]), + 5, + )?; + Ok(serde_json::from_value(signature_status) + .map_err(|err| ClientError::new_with_command(err.into(), "GetSignatureStatuses"))?) + } + pub fn get_signature_status_with_commitment( &self, signature: &Signature, @@ -856,14 +870,13 @@ impl RpcClient { trace!("check_signature: {:?}", signature); for _ in 0..30 { - let response = self.client.send( - &RpcRequest::ConfirmTransaction, - json!([signature.to_string(), CommitmentConfig::recent()]), - 0, - ); - + let response = + self.confirm_transaction_with_commitment(signature, CommitmentConfig::recent()); match response { - Ok(Value::Bool(signature_status)) => { + Ok(Response { + value: signature_status, + .. + }) => { if signature_status { trace!("Response found signature"); } else { @@ -872,12 +885,6 @@ impl RpcClient { return signature_status; } - Ok(other) => { - debug!( - "check_signature request failed, expected bool, got: {:?}", - other - ); - } Err(err) => { debug!("check_signature request failed: {:?}", err); } diff --git a/client/src/rpc_request.rs b/client/src/rpc_request.rs index c6414866b..bb1e578b1 100644 --- a/client/src/rpc_request.rs +++ b/client/src/rpc_request.rs @@ -3,7 +3,6 @@ use thiserror::Error; #[derive(Debug, PartialEq, Eq, Hash)] pub enum RpcRequest { - ConfirmTransaction, DeregisterNode, ValidatorExit, GetAccountInfo, @@ -22,7 +21,6 @@ pub enum RpcRequest { GetRecentBlockhash, GetFeeCalculatorForBlockhash, GetFeeRateGovernor, - GetSignatureStatus, GetSignatureStatuses, GetSlot, GetSlotLeader, @@ -46,7 +44,6 @@ impl RpcRequest { pub(crate) fn build_request_json(&self, id: u64, params: Value) -> Value { let jsonrpc = "2.0"; let method = match self { - RpcRequest::ConfirmTransaction => "confirmTransaction", RpcRequest::DeregisterNode => "deregisterNode", RpcRequest::ValidatorExit => "validatorExit", RpcRequest::GetAccountInfo => "getAccountInfo", @@ -65,7 +62,6 @@ impl RpcRequest { RpcRequest::GetRecentBlockhash => "getRecentBlockhash", RpcRequest::GetFeeCalculatorForBlockhash => "getFeeCalculatorForBlockhash", RpcRequest::GetFeeRateGovernor => "getFeeRateGovernor", - RpcRequest::GetSignatureStatus => "getSignatureStatus", RpcRequest::GetSignatureStatuses => "getSignatureStatuses", RpcRequest::GetSlot => "getSlot", RpcRequest::GetSlotLeader => "getSlotLeader", diff --git a/core/src/rpc.rs b/core/src/rpc.rs index ca052d297..806fd5d18 100644 --- a/core/src/rpc.rs +++ b/core/src/rpc.rs @@ -425,7 +425,7 @@ impl JsonRpcRequestProcessor { .map(|(_, status)| status) } - pub fn get_signature_statuses( + pub fn get_signature_statuses_with_commitment( &self, signatures: Vec, commitment: Option, @@ -496,6 +496,7 @@ impl Metadata for Meta {} pub trait RpcSol { type Metadata; + // DEPRECATED #[rpc(meta, name = "confirmTransaction")] fn confirm_transaction( &self, @@ -504,6 +505,24 @@ pub trait RpcSol { commitment: Option, ) -> RpcResponse; + // DEPRECATED + #[rpc(meta, name = "getSignatureStatus")] + fn get_signature_status( + &self, + meta: Self::Metadata, + signature_str: String, + commitment: Option, + ) -> Result>>; + + // DEPRECATED (used by Trust Wallet) + #[rpc(meta, name = "getSignatureConfirmation")] + fn get_signature_confirmation( + &self, + meta: Self::Metadata, + signature_str: String, + commitment: Option, + ) -> Result>; + #[rpc(meta, name = "getAccountInfo")] fn get_account_info( &self, @@ -591,24 +610,8 @@ pub trait RpcSol { #[rpc(meta, name = "getFeeRateGovernor")] fn get_fee_rate_governor(&self, meta: Self::Metadata) -> RpcResponse; - #[rpc(meta, name = "getSignatureConfirmation")] - fn get_signature_confirmation( - &self, - meta: Self::Metadata, - signature_str: String, - commitment: Option, - ) -> Result>; - - #[rpc(meta, name = "getSignatureStatus")] - fn get_signature_status( - &self, - meta: Self::Metadata, - signature_str: String, - commitment: Option, - ) -> Result>>; - #[rpc(meta, name = "getSignatureStatuses")] - fn get_signature_statuses( + fn get_signature_statuses_with_commitment( &self, meta: Self::Metadata, signature_strs: Vec, @@ -970,7 +973,7 @@ impl RpcSol for RpcSolImpl { .get_signature_status(signature, commitment)) } - fn get_signature_statuses( + fn get_signature_statuses_with_commitment( &self, meta: Self::Metadata, signature_strs: Vec, @@ -983,7 +986,7 @@ impl RpcSol for RpcSolImpl { meta.request_processor .read() .unwrap() - .get_signature_statuses(signatures, commitment) + .get_signature_statuses_with_commitment(signatures, commitment) } fn get_slot(&self, meta: Self::Metadata, commitment: Option) -> Result { @@ -1076,7 +1079,7 @@ impl RpcSol for RpcSolImpl { .request_processor .read() .unwrap() - .get_signature_statuses(vec![signature], commitment.clone())? + .get_signature_statuses_with_commitment(vec![signature], commitment.clone())? .value[0] .clone() .map(|x| x.status); diff --git a/docs/src/apps/jsonrpc-api.md b/docs/src/apps/jsonrpc-api.md index 99bbd3cc5..2b5e7b322 100644 --- a/docs/src/apps/jsonrpc-api.md +++ b/docs/src/apps/jsonrpc-api.md @@ -14,7 +14,6 @@ To interact with a Solana node inside a JavaScript application, use the [solana- ## Methods -* [confirmTransaction](jsonrpc-api.md#confirmtransaction) * [getAccountInfo](jsonrpc-api.md#getaccountinfo) * [getBalance](jsonrpc-api.md#getbalance) * [getBlockCommitment](jsonrpc-api.md#getblockcommitment) @@ -33,7 +32,6 @@ To interact with a Solana node inside a JavaScript application, use the [solana- * [getMinimumBalanceForRentExemption](jsonrpc-api.md#getminimumbalanceforrentexemption) * [getProgramAccounts](jsonrpc-api.md#getprogramaccounts) * [getRecentBlockhash](jsonrpc-api.md#getrecentblockhash) -* [getSignatureStatus](jsonrpc-api.md#getsignaturestatus) * [getSignatureStatuses](jsonrpc-api.md#getsignaturestatuses) * [getSlot](jsonrpc-api.md#getslot) * [getSlotLeader](jsonrpc-api.md#getslotleader) @@ -117,29 +115,6 @@ Many methods that take a commitment parameter return an RpcResponse JSON object ## JSON RPC API Reference -### confirmTransaction - -Returns a transaction receipt. This method only searches the recent status cache of signatures, which retains all active slots plus `MAX_RECENT_BLOCKHASHES` rooted slots. - -#### Parameters: - -* `` - Signature of Transaction to confirm, as base-58 encoded string -* `` - (optional) [Commitment](jsonrpc-api.md#configuring-state-commitment) - -#### Results: - -* `RpcResponse` - RpcResponse JSON object with `value` field set to Transaction status, boolean true if Transaction is confirmed - -#### Example: - -```bash -// Request -curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"confirmTransaction", "params":["5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW"]}' http://localhost:8899 - -// Result -{"jsonrpc":"2.0","result":{"context":{"slot":1},"value":true},"id":1} -``` - ### getAccountInfo Returns all information associated with the account of provided Pubkey @@ -656,35 +631,9 @@ curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1, "m {"jsonrpc":"2.0","result":{"context":{"slot":1},"value":{"blockhash":"CSymwgTNX1j3E4qhKfJAUE41nBWEwXufoYryPbkde5RR","feeCalculator":{"burnPercent":50,"lamportsPerSignature":5000,"maxLamportsPerSignature":100000,"minLamportsPerSignature":5000,"targetLamportsPerSignature":10000,"targetSignaturesPerSlot":20000}}},"id":1} ``` -### getSignatureStatus - -Returns the status of a given signature. This method is similar to [confirmTransaction](jsonrpc-api.md#confirmtransaction) but provides more resolution for error events. This method only searches the recent status cache of signatures, which retains all active slots plus `MAX_RECENT_BLOCKHASHES` rooted slots. - -#### Parameters: - -* `` - Signature of Transaction to confirm, as base-58 encoded string -* `` - (optional) [Commitment](jsonrpc-api.md#configuring-state-commitment) - -#### Results: - -* `` - 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) - -#### Example: - -```bash -// Request -curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getSignatureStatus", "params":["5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW"]}' http://localhost:8899 - -// Result -{"jsonrpc":"2.0","result":{"Ok": null},"id":1} -``` - ### getSignatureStatuses -Returns the statuses of a list of signatures. This method is similar to [confirmTransaction](jsonrpc-api.md#confirmtransaction) but provides more resolution for error events. This method only searches the recent status cache of signatures, which retains all active slots plus `MAX_RECENT_BLOCKHASHES` rooted slots. +Returns the statuses of a list of signatures. This method only searches the recent status cache of signatures, which retains statuses for all active slots plus `MAX_RECENT_BLOCKHASHES` rooted slots. #### Parameters: @@ -713,7 +662,7 @@ An array of: ```bash // Request -curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getSignatureStatus", "params":[["5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW", "5j7s6NiJS3JAkvgkoc18WVAsiSaci2pxB2A6ueCJP4tprA2TFg9wSyTLeYouxPBJEMzJinENTkpA52YStRW5Dia7"]]]}' http://localhost:8899 +curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getSignatureStatuses", "params":[["5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW", "5j7s6NiJS3JAkvgkoc18WVAsiSaci2pxB2A6ueCJP4tprA2TFg9wSyTLeYouxPBJEMzJinENTkpA52YStRW5Dia7"]]]}' http://localhost:8899 // Result {"jsonrpc":"2.0","result":{"context":{"slot":82},"value":[{"slot": 72, "confirmations": 10, "err": null, "status": {"Ok": null}}, null]},"id":1}