executive error on not enoguh base gas

This commit is contained in:
debris 2016-01-15 13:07:44 +01:00
parent 87539234e3
commit 80f2bfd8a5
2 changed files with 19 additions and 12 deletions

View File

@ -19,16 +19,19 @@ pub struct OutOfBounds<T: fmt::Debug> {
/// Result of executing the transaction. /// Result of executing the transaction.
#[derive(PartialEq, Debug)] #[derive(PartialEq, Debug)]
pub enum ExecutionError { pub enum ExecutionError {
/// Returned when there gas paid for transaction execution is
/// lower than base gas required.
NotEnoughBaseGas { required: U256, got: U256 },
/// Returned when block (gas_used + gas) > gas_limit. /// Returned when block (gas_used + gas) > gas_limit.
/// ///
/// If gas =< gas_limit, upstream may try to execute the transaction /// If gas =< gas_limit, upstream may try to execute the transaction
/// in next block. /// in next block.
BlockGasLimitReached { gas_limit: U256, gas_used: U256, gas: U256 }, BlockGasLimitReached { gas_limit: U256, gas_used: U256, gas: U256 },
/// Returned when transaction nonce does not match state nonce. /// Returned when transaction nonce does not match state nonce.
InvalidNonce { expected: U256, is: U256 }, InvalidNonce { expected: U256, got: U256 },
/// Returned when cost of transaction (value + gas_price * gas) exceeds /// Returned when cost of transaction (value + gas_price * gas) exceeds
/// current sender balance. /// current sender balance.
NotEnoughCash { required: U512, is: U512 }, NotEnoughCash { required: U512, got: U512 },
/// Returned when internal evm error occurs. /// Returned when internal evm error occurs.
Internal Internal
} }

View File

@ -117,11 +117,18 @@ impl<'a> Executive<'a> {
let sender = try!(t.sender()); let sender = try!(t.sender());
let nonce = self.state.nonce(&sender); let nonce = self.state.nonce(&sender);
// TODO: error on base gas required let schedule = self.engine.schedule(self.info);
let base_gas_required = U256::from(t.gas_required(&schedule));
if t.gas < base_gas_required {
return Err(From::from(ExecutionError::NotEnoughBaseGas { required: base_gas_required, got: t.gas }));
}
let init_gas = t.gas - base_gas_required;
// validate transaction nonce // validate transaction nonce
if t.nonce != nonce { if t.nonce != nonce {
return Err(From::from(ExecutionError::InvalidNonce { expected: nonce, is: t.nonce })); return Err(From::from(ExecutionError::InvalidNonce { expected: nonce, got: t.nonce }));
} }
// validate if transaction fits into given block // validate if transaction fits into given block
@ -140,7 +147,7 @@ impl<'a> Executive<'a> {
// avoid unaffordable transactions // avoid unaffordable transactions
if U512::from(balance) < total_cost { if U512::from(balance) < total_cost {
return Err(From::from(ExecutionError::NotEnoughCash { required: total_cost, is: U512::from(balance) })); return Err(From::from(ExecutionError::NotEnoughCash { required: total_cost, got: U512::from(balance) }));
} }
// NOTE: there can be no invalid transactions from this point. // NOTE: there can be no invalid transactions from this point.
@ -149,9 +156,6 @@ impl<'a> Executive<'a> {
let mut substate = Substate::new(); let mut substate = Substate::new();
let schedule = self.engine.schedule(self.info);
let init_gas = t.gas - U256::from(t.gas_required(&schedule));
let res = match t.action() { let res = match t.action() {
&Action::Create => { &Action::Create => {
let params = ActionParams { let params = ActionParams {
@ -949,8 +953,8 @@ mod tests {
}; };
match res { match res {
Err(Error::Execution(ExecutionError::InvalidNonce { expected, is })) Err(Error::Execution(ExecutionError::InvalidNonce { expected, got }))
if expected == U256::zero() && is == U256::one() => (), if expected == U256::zero() && got == U256::one() => (),
_ => assert!(false, "Expected invalid nonce error.") _ => assert!(false, "Expected invalid nonce error.")
} }
} }
@ -1000,8 +1004,8 @@ mod tests {
}; };
match res { match res {
Err(Error::Execution(ExecutionError::NotEnoughCash { required , is })) Err(Error::Execution(ExecutionError::NotEnoughCash { required , got }))
if required == U512::from(100_018) && is == U512::from(100_017) => (), if required == U512::from(100_018) && got == U512::from(100_017) => (),
_ => assert!(false, "Expected not enough cash error. {:?}", res) _ => assert!(false, "Expected not enough cash error. {:?}", res)
} }
} }