fix error handling
This commit is contained in:
parent
34fb39da5b
commit
c313857485
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user