fix error handling

This commit is contained in:
NikVolf 2017-03-27 18:17:49 +03:00
parent 34fb39da5b
commit c313857485

View File

@ -276,25 +276,31 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> {
let cost = builtin.cost(data); let cost = builtin.cost(data);
if cost <= params.gas { if cost <= params.gas {
builtin.execute(data, &mut output)?; if let Err(e) = builtin.execute(data, &mut output) {
self.state.discard_checkpoint(); self.state.revert_to_checkpoint();
let evm_err: evm::evm::Error = e.into();
tracer.trace_failed_call(trace_info, vec![], evm_err.clone().into());
Err(evm_err)
} else {
self.state.discard_checkpoint();
// trace only top level calls to builtins to avoid DDoS attacks // trace only top level calls to builtins to avoid DDoS attacks
if self.depth == 0 { if self.depth == 0 {
let mut trace_output = tracer.prepare_trace_output(); let mut trace_output = tracer.prepare_trace_output();
if let Some(mut out) = trace_output.as_mut() { if let Some(mut out) = trace_output.as_mut() {
*out = output.to_owned(); *out = output.to_owned();
}
tracer.trace_call(
trace_info,
cost,
trace_output,
vec![]
);
} }
tracer.trace_call( Ok(params.gas - cost)
trace_info,
cost,
trace_output,
vec![]
);
} }
Ok(params.gas - cost)
} else { } else {
// just drain the whole gas // just drain the whole gas
self.state.revert_to_checkpoint(); self.state.revert_to_checkpoint();