Return error in case eth_call returns VM errors (#8448)

* Add VMError generator

* Return executed exceptions in eth_call
This commit is contained in:
Wei Tang 2018-04-21 17:41:09 +08:00 committed by Afri Schoedon
parent 650948feed
commit c983efe895
2 changed files with 23 additions and 1 deletions

View File

@ -24,6 +24,7 @@ use jsonrpc_core::{futures, Error, ErrorCode, Value};
use rlp::DecoderError;
use transaction::Error as TransactionError;
use ethcore_private_tx::Error as PrivateTransactionError;
use vm::Error as VMError;
mod codes {
// NOTE [ToDr] Codes from [-32099, -32000]
@ -375,6 +376,21 @@ pub fn call(error: CallError) -> Error {
}
}
pub fn vm(error: &VMError, output: &[u8]) -> Error {
use rustc_hex::ToHex;
let data = match error {
&VMError::Reverted => format!("{} 0x{}", VMError::Reverted, output.to_hex()),
error => format!("{}", error),
};
Error {
code: ErrorCode::ServerError(codes::EXECUTION_ERROR),
message: "VM execution error.".into(),
data: Some(Value::String(data)),
}
}
pub fn unknown_block() -> Error {
Error {
code: ErrorCode::InvalidParams,

View File

@ -859,8 +859,14 @@ impl<C, SN: ?Sized, S: ?Sized, M, EM, T: StateInfo + 'static> Eth for EthClient<
let result = self.client.call(&signed, Default::default(), &mut state, &header);
Box::new(future::done(result
.map(|b| b.output.into())
.map_err(errors::call)
.and_then(|executed| {
match executed.exception {
Some(ref exception) => Err(errors::vm(exception, &executed.output)),
None => Ok(executed)
}
})
.map(|b| b.output.into())
))
}