Fixing local transactions prioritization

This commit is contained in:
Tomasz Drwięga 2016-06-20 11:32:29 +02:00
parent d0b2df07db
commit edd43cd5c3

View File

@ -172,6 +172,12 @@ impl Ord for TransactionOrder {
return self.nonce_height.cmp(&b.nonce_height); return self.nonce_height.cmp(&b.nonce_height);
} }
// Local transactions should always have priority
// NOTE nonce has to be checked first, cause otherwise the order might be wrong.
if self.origin != b.origin {
return self.origin.cmp(&b.origin);
}
// Then compare gas_prices // Then compare gas_prices
let a_gas = self.gas_price; let a_gas = self.gas_price;
let b_gas = b.gas_price; let b_gas = b.gas_price;
@ -1082,7 +1088,28 @@ mod test {
} }
#[test] #[test]
fn should_not_prioritize_local_transactions() { fn should_prioritize_local_transactions_within_same_nonce_height() {
// given
let mut txq = TransactionQueue::new();
let tx = new_tx();
// the second one has same nonce but higher `gas_price`
let (_, tx2) = new_similar_txs();
// when
// first insert the one with higher gas price
txq.add(tx2.clone(), &default_nonce, TransactionOrigin::External).unwrap();
// then the one with lower gas price, but local
txq.add(tx.clone(), &default_nonce, TransactionOrigin::Local).unwrap();
// then
let top = txq.top_transactions();
assert_eq!(top[0], tx); // local should be first
assert_eq!(top[1], tx2);
assert_eq!(top.len(), 2);
}
#[test]
fn should_not_prioritize_local_transactions_with_different_nonce_height() {
// given // given
let mut txq = TransactionQueue::new(); let mut txq = TransactionQueue::new();
let (tx, tx2) = new_txs(U256::from(1)); let (tx, tx2) = new_txs(U256::from(1));