From 62e0e1996197c8bfeb3c8889c2f9492b63a0c0fc Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 24 Oct 2020 05:02:41 +0000 Subject: [PATCH] add precompile verification to simulate_transaction (#13080) (#13126) (cherry picked from commit 766406fd23bdb0a75c42e92b79b9027db2e064d9) Co-authored-by: Josh --- core/src/rpc.rs | 51 ++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/core/src/rpc.rs b/core/src/rpc.rs index c333545439..771133b573 100644 --- a/core/src/rpc.rs +++ b/core/src/rpc.rs @@ -1267,6 +1267,18 @@ impl JsonRpcRequestProcessor { } } +fn verify_transaction(transaction: &Transaction) -> Result<()> { + if transaction.verify().is_err() { + return Err(RpcCustomError::TransactionSignatureVerificationFailure.into()); + } + + if let Err(e) = transaction.verify_precompiles() { + return Err(RpcCustomError::TransactionPrecompileVerificationFailure(e).into()); + } + + Ok(()) +} + fn verify_filter(input: &RpcFilterType) -> Result<()> { input .verify() @@ -2274,12 +2286,8 @@ impl RpcSol for RpcSolImpl { .unwrap_or(0); if !config.skip_preflight { - if transaction.verify().is_err() { - return Err(RpcCustomError::TransactionSignatureVerificationFailure.into()); - } - - if let Err(e) = transaction.verify_precompiles() { - return Err(RpcCustomError::TransactionPrecompileVerificationFailure(e).into()); + if let Err(e) = verify_transaction(&transaction) { + return Err(e); } if meta.health.check() != RpcHealthStatus::Ok { @@ -2316,26 +2324,20 @@ impl RpcSol for RpcSolImpl { let encoding = config.encoding.unwrap_or(UiTransactionEncoding::Base58); let (_, transaction) = deserialize_transaction(data, encoding)?; - let mut result = if config.sig_verify { - transaction.verify() - } else { - Ok(()) - }; + if config.sig_verify { + if let Err(e) = verify_transaction(&transaction) { + return Err(e); + } + } let bank = &*meta.bank(config.commitment); - let logs = if result.is_ok() { - let (transaction_result, log_messages) = bank.simulate_transaction(transaction); - result = transaction_result; - Some(log_messages) - } else { - None - }; + let (result, logs) = bank.simulate_transaction(transaction); Ok(new_response( &bank, RpcSimulateTransactionResult { err: result.err(), - logs, + logs: Some(logs), }, )) } @@ -3820,13 +3822,14 @@ pub mod tests { ); let res = io.handle_request_sync(&req, meta.clone()); let expected = json!({ - "jsonrpc": "2.0", - "result": { - "context":{"slot":0}, - "value":{"err":"SignatureFailure", "logs":null} + "jsonrpc":"2.0", + "error": { + "code": -32003, + "message": "Transaction signature verification failure" }, - "id": 1, + "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"))