diff --git a/core/transaction_pool.go b/core/transaction_pool.go index 92a2462c6..bc6e70c7a 100644 --- a/core/transaction_pool.go +++ b/core/transaction_pool.go @@ -125,11 +125,6 @@ func (pool *TxPool) ValidateTransaction(tx *types.Transaction) error { return nil } -func (self *TxPool) addTx(tx *types.Transaction) { - from, _ := tx.From() - self.queue[from] = append(self.queue[from], tx) -} - func (self *TxPool) add(tx *types.Transaction) error { hash := tx.Hash() @@ -147,7 +142,7 @@ func (self *TxPool) add(tx *types.Transaction) error { return err } - self.addTx(tx) + self.queueTx(tx) var toname string if to := tx.To(); to != nil { @@ -226,6 +221,19 @@ func (pool *TxPool) Stop() { glog.V(logger.Info).Infoln("TX Pool stopped") } +func (self *TxPool) queueTx(tx *types.Transaction) { + from, _ := tx.From() + self.queue[from] = append(self.queue[from], tx) +} + +func (pool *TxPool) addTx(tx *types.Transaction) { + if _, ok := pool.txs[tx.Hash()]; !ok { + pool.txs[tx.Hash()] = tx + // Notify the subscribers + pool.eventMux.Post(TxPreEvent{tx}) + } +} + // check queue will attempt to insert func (pool *TxPool) checkQueue() { pool.mu.Lock() @@ -257,9 +265,7 @@ func (pool *TxPool) checkQueue() { } enonce++ - pool.txs[tx.Hash()] = tx - // Notify the subscribers - go pool.eventMux.Post(TxPreEvent{tx}) + pool.addTx(tx) } //pool.queue[address] = txs[i:] // delete the entire queue entry if it's empty. There's no need to keep it diff --git a/core/transaction_pool_test.go b/core/transaction_pool_test.go index 5a5cd866f..0e049139e 100644 --- a/core/transaction_pool_test.go +++ b/core/transaction_pool_test.go @@ -67,7 +67,7 @@ func TestTransactionQueue(t *testing.T) { tx.SignECDSA(key) from, _ := tx.From() pool.currentState().AddBalance(from, big.NewInt(1)) - pool.addTx(tx) + pool.queueTx(tx) pool.checkQueue() if len(pool.txs) != 1 { @@ -79,7 +79,7 @@ func TestTransactionQueue(t *testing.T) { from, _ = tx.From() pool.currentState().SetNonce(from, 10) tx.SetNonce(1) - pool.addTx(tx) + pool.queueTx(tx) pool.checkQueue() if _, ok := pool.txs[tx.Hash()]; ok { t.Error("expected transaction to be in tx pool") @@ -96,9 +96,9 @@ func TestTransactionQueue(t *testing.T) { tx1.SignECDSA(key) tx2.SignECDSA(key) tx3.SignECDSA(key) - pool.addTx(tx1) - pool.addTx(tx2) - pool.addTx(tx3) + pool.queueTx(tx1) + pool.queueTx(tx2) + pool.queueTx(tx3) from, _ = tx1.From() pool.checkQueue() @@ -106,7 +106,7 @@ func TestTransactionQueue(t *testing.T) { t.Error("expected tx pool to be 1 =") } - if len(pool.queue[from]) != 2 { + if len(pool.queue[from]) != 3 { t.Error("expected transaction queue to be empty. is", len(pool.queue[from])) } }