diff --git a/ethcore/machine/src/executive.rs b/ethcore/machine/src/executive.rs index b134eec08..07aea9336 100644 --- a/ethcore/machine/src/executive.rs +++ b/ethcore/machine/src/executive.rs @@ -851,7 +851,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { return Err(ExecutionError::NotEnoughBaseGas { required: base_gas_required, got: t.gas }); } - if !t.is_unsigned() && check_nonce && schedule.kill_dust != CleanDustMode::Off && !self.state.exists(&sender)? { + if check_nonce && schedule.kill_dust != CleanDustMode::Off && !self.state.exists(&sender)? { return Err(ExecutionError::SenderMustExist); } @@ -884,10 +884,8 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { let mut substate = Substate::new(); - // NOTE: there can be no invalid transactions from this point. - if !schedule.keep_unsigned_nonce || !t.is_unsigned() { - self.state.inc_nonce(&sender)?; - } + self.state.inc_nonce(&sender)?; + self.state.sub_balance( &sender, &U256::try_from(gas_cost).expect("Total cost (value + gas_cost) is lower than max allowed balance (U256); gas_cost has to fit U256; qed"), diff --git a/ethcore/machine/src/externalities.rs b/ethcore/machine/src/externalities.rs index 0808ebed2..9a102ceed 100644 --- a/ethcore/machine/src/externalities.rs +++ b/ethcore/machine/src/externalities.rs @@ -24,7 +24,6 @@ use log::{debug, trace, warn}; use account_state::{Backend as StateBackend, State, CleanupMode}; use common_types::{ - transaction::UNSIGNED_SENDER, log_entry::LogEntry, }; use trace::{Tracer, VMTracer}; @@ -265,11 +264,9 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for Externalities<'a, T, V, B> }; if !self.static_flag { - if !self.schedule.keep_unsigned_nonce || params.sender != UNSIGNED_SENDER { - if let Err(e) = self.state.inc_nonce(&self.origin_info.address) { - debug!(target: "ext", "Database corruption encountered: {:?}", e); - return Ok(ContractCreateResult::Failed) - } + if let Err(e) = self.state.inc_nonce(&self.origin_info.address) { + warn!(target: "ext", "Database corruption encountered: {:?}", e); + return Ok(ContractCreateResult::Failed) } } diff --git a/ethcore/machine/src/machine.rs b/ethcore/machine/src/machine.rs index 43151d0a0..3f786f3b7 100644 --- a/ethcore/machine/src/machine.rs +++ b/ethcore/machine/src/machine.rs @@ -423,19 +423,10 @@ mod tests { fn should_disallow_unsigned_transactions() { let rlp = "ea80843b9aca0083015f90948921ebb5f79e9e3920abe571004d0b1d5119c154865af3107a400080038080"; let transaction: UnverifiedTransaction = ::rlp::decode(&::rustc_hex::FromHex::from_hex(rlp).unwrap()).unwrap(); - let spec = spec::new_ropsten_test(); - let ethparams = get_default_ethash_extensions(); - - let machine = Machine::with_ethash_extensions( - spec.params().clone(), - Default::default(), - ethparams, + assert_eq!( + transaction::Error::from(transaction.verify_unordered().unwrap_err()), + transaction::Error::InvalidSignature("invalid EC signature".into()), ); - let mut header = Header::new(); - header.set_number(15); - - let res = machine.verify_transaction_basic(&transaction, &header); - assert_eq!(res, Err(transaction::Error::InvalidSignature("invalid EC signature".into()))); } #[test] diff --git a/ethcore/types/src/transaction/transaction.rs b/ethcore/types/src/transaction/transaction.rs index c0fc4c8f8..4e6de5754 100644 --- a/ethcore/types/src/transaction/transaction.rs +++ b/ethcore/types/src/transaction/transaction.rs @@ -316,11 +316,6 @@ impl UnverifiedTransaction { self } - /// Checks if the signature is empty. - pub fn is_unsigned(&self) -> bool { - self.r.is_zero() && self.s.is_zero() - } - /// Returns transaction receiver, if any pub fn receiver(&self) -> Option
{ match self.unsigned.action { @@ -357,7 +352,6 @@ impl UnverifiedTransaction { /// The chain ID, or `None` if this is a global transaction. pub fn chain_id(&self) -> Option