Skip to content
This repository was archived by the owner on Nov 6, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions ethcore/src/miner/miner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1695,6 +1695,30 @@ mod tests {
assert_eq!(miner.prepare_pending_block(&client), BlockPreparationStatus::NotPrepared);
}

#[test]
fn should_reject_local_transaction_with_invalid_chain_id() {
let spec = spec::new_test();
let miner = Miner::new_for_tests(&spec, None);
let client = TestBlockChainClient::default();
let chain_id = spec.chain_id();

// chain_id + 100500 is invalid
let import = miner.import_claimed_local_transaction(
&client,
PendingTransaction::new(transaction_with_chain_id(chain_id + 10500), None),
false,
);
assert_eq!(import, Err(transaction::Error::InvalidChainId));

// chain_id is valid
let import = miner.import_claimed_local_transaction(
&client,
PendingTransaction::new(transaction_with_chain_id(chain_id), None),
false,
);
assert_eq!(import, Ok(()));
}

#[test]
fn should_prioritize_locals() {
let client = TestBlockChainClient::default();
Expand Down
7 changes: 6 additions & 1 deletion ethcore/src/miner/pool_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,12 @@ impl<'a, C: 'a> pool::client::Client for PoolClient<'a, C> where
self.chain.transaction_block(TransactionId::Hash(*hash)).is_some()
}

fn verify_transaction(&self, tx: UnverifiedTransaction)-> Result<SignedTransaction, transaction::Error> {
fn verify_transaction_basic(&self, tx: &UnverifiedTransaction) -> Result<(), transaction::Error> {
self.engine.verify_transaction_basic(tx, &self.best_block_header)?;
Ok(())
}

fn verify_transaction(&self, tx: UnverifiedTransaction) -> Result<SignedTransaction, transaction::Error> {
self.engine.verify_transaction_basic(&tx, &self.best_block_header)?;
let tx = tx.verify_unordered()?;

Expand Down
9 changes: 9 additions & 0 deletions miner/src/pool/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,15 @@ pub trait Client: fmt::Debug + Sync {
/// Is transaction with given hash already in the blockchain?
fn transaction_already_included(&self, hash: &H256) -> bool;

/// Perform basic/cheap transaction verification.
///
/// This should include all cheap checks that can be done before
/// actually checking the signature, like chain-replay protection.
///
/// This method is currently used only for verifying local transactions.
fn verify_transaction_basic(&self, t: &transaction::UnverifiedTransaction)
Comment thread
dvdplm marked this conversation as resolved.
-> Result<(), transaction::Error>;

/// Structurarily verify given transaction.
fn verify_transaction(&self, tx: transaction::UnverifiedTransaction)
-> Result<transaction::SignedTransaction, transaction::Error>;
Expand Down
6 changes: 6 additions & 0 deletions miner/src/pool/tests/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,12 @@ impl pool::client::Client for TestClient {
false
}

fn verify_transaction_basic(&self, _tx: &UnverifiedTransaction)
-> Result<(), transaction::Error>
{
Ok(())
}

fn verify_transaction(&self, tx: UnverifiedTransaction)
-> Result<SignedTransaction, transaction::Error>
{
Expand Down
8 changes: 7 additions & 1 deletion miner/src/pool/verifier.rs
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,13 @@ impl<C: Client> txpool::Verifier<Transaction> for Verifier<C, ::pool::scoring::N
return Err(err)
},
},
Transaction::Local(tx) => tx,
Transaction::Local(tx) => match self.client.verify_transaction_basic(&**tx) {
Ok(()) => tx,
Err(err) => {
warn!(target: "txqueue", "[{:?}] Rejected local tx {:?}", hash, err);
return Err(err)
}
},
};

// Verify RLP payload
Expand Down