Adjust RPC simulateTransaction endpoint to match v1.2 (#10443)

automerge
This commit is contained in:
mergify[bot]
2020-06-06 21:08:27 -07:00
committed by GitHub
parent 52c20a5c38
commit 09f0624887
4 changed files with 33 additions and 18 deletions

View File

@@ -752,14 +752,17 @@ fn verify_signature(input: &str) -> Result<Signature> {
}
/// Run transactions against a frozen bank without committing the results
fn run_transaction_simulation(bank: &Bank, transaction: Transaction) -> transaction::Result<()> {
fn run_transaction_simulation(
bank: &Bank,
transaction: Transaction,
) -> (transaction::Result<()>, Vec<String>) {
assert!(bank.is_frozen(), "simulation bank must be frozen");
let txs = &[transaction];
let batch = bank.prepare_simulation_batch(txs);
let (_loaded_accounts, executed, _retryable_transactions, _transaction_count, _signature_count) =
bank.load_and_execute_transactions(&batch, solana_sdk::clock::MAX_PROCESSING_AGE);
executed[0].0.clone().map(|_| ())
(executed[0].0.clone().map(|_| ()), vec![])
}
#[derive(Clone)]
@@ -966,7 +969,7 @@ pub trait RpcSol {
meta: Self::Metadata,
data: String,
config: Option<RpcSimulateTransactionConfig>,
) -> RpcResponse<TransactionStatus>;
) -> RpcResponse<RpcSimulateTransactionResult>;
#[rpc(meta, name = "getSlotLeader")]
fn get_slot_leader(
@@ -1511,7 +1514,7 @@ impl RpcSol for RpcSolImpl {
}
let bank = &*meta.request_processor.read().unwrap().bank(None)?;
if let Err(err) = run_transaction_simulation(&bank, transaction) {
if let (Err(err), _log_output) = run_transaction_simulation(&bank, transaction) {
// Note: it's possible that the transaction simulation failed but the actual
// transaction would succeed, such as when a transaction depends on an earlier
// transaction that has yet to reach max confirmations. In these cases the user
@@ -1546,7 +1549,7 @@ impl RpcSol for RpcSolImpl {
meta: Self::Metadata,
data: String,
config: Option<RpcSimulateTransactionConfig>,
) -> RpcResponse<TransactionStatus> {
) -> RpcResponse<RpcSimulateTransactionResult> {
let (_, transaction) = deserialize_bs58_transaction(data)?;
let config = config.unwrap_or_default();
@@ -1557,18 +1560,19 @@ impl RpcSol for RpcSolImpl {
};
let bank = &*meta.request_processor.read().unwrap().bank(None)?;
if result.is_ok() {
result = run_transaction_simulation(&bank, transaction);
}
let logs = if result.is_ok() {
let sim_result = run_transaction_simulation(&bank, transaction);
result = sim_result.0;
Some(sim_result.1)
} else {
None
};
new_response(
&bank,
TransactionStatus {
slot: bank.slot(),
confirmations: Some(0),
status: result.clone(),
RpcSimulateTransactionResult {
err: result.err(),
logs,
},
)
}
@@ -2504,7 +2508,7 @@ pub mod tests {
"jsonrpc": "2.0",
"result": {
"context":{"slot":0},
"value":{"confirmations":0,"slot": 0,"status":{"Ok":null},"err":null}
"value":{"err":null, "logs":[]}
},
"id": 1,
});
@@ -2524,7 +2528,7 @@ pub mod tests {
"jsonrpc": "2.0",
"result": {
"context":{"slot":0},
"value":{"confirmations":0,"slot":0,"status":{"Err":"SignatureFailure"},"err":"SignatureFailure"}
"value":{"err":"SignatureFailure", "logs":null}
},
"id": 1,
});
@@ -2544,7 +2548,7 @@ pub mod tests {
"jsonrpc": "2.0",
"result": {
"context":{"slot":0},
"value":{"confirmations":0,"slot": 0,"status":{"Ok":null},"err":null}
"value":{"err":null, "logs":[]}
},
"id": 1,
});
@@ -2564,7 +2568,7 @@ pub mod tests {
"jsonrpc": "2.0",
"result": {
"context":{"slot":0},
"value":{"confirmations":0,"slot": 0,"status":{"Ok":null},"err":null}
"value":{"err":null, "logs":[]}
},
"id": 1,
});