diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-08-02 07:18:54 +0800 |
---|---|---|
committer | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-08-02 07:18:54 +0800 |
commit | 33efb3381c8b862f8086a4b5c5d3b7d6b2b1f47b (patch) | |
tree | a32d0565fb5b4a38ce91453ba93b80a2bcd21e46 | |
parent | a8b39b5cc0dff46e5834826fac6f37e39ee4c3b3 (diff) | |
parent | 7e31df39877d95446b48c8064e55ebef48d4e5c6 (diff) | |
download | dexon-33efb3381c8b862f8086a4b5c5d3b7d6b2b1f47b.tar dexon-33efb3381c8b862f8086a4b5c5d3b7d6b2b1f47b.tar.gz dexon-33efb3381c8b862f8086a4b5c5d3b7d6b2b1f47b.tar.bz2 dexon-33efb3381c8b862f8086a4b5c5d3b7d6b2b1f47b.tar.lz dexon-33efb3381c8b862f8086a4b5c5d3b7d6b2b1f47b.tar.xz dexon-33efb3381c8b862f8086a4b5c5d3b7d6b2b1f47b.tar.zst dexon-33efb3381c8b862f8086a4b5c5d3b7d6b2b1f47b.zip |
Merge pull request #1461 from bas-vk/eth_resend
Old transaction after resend was not removed from pool
-rw-r--r-- | core/transaction_pool.go | 5 | ||||
-rw-r--r-- | core/transaction_pool_test.go | 2 | ||||
-rw-r--r-- | rpc/api/eth.go | 18 | ||||
-rw-r--r-- | rpc/api/eth_args.go | 8 |
4 files changed, 23 insertions, 10 deletions
diff --git a/core/transaction_pool.go b/core/transaction_pool.go index 2a6666ea1..42bf2fc51 100644 --- a/core/transaction_pool.go +++ b/core/transaction_pool.go @@ -356,11 +356,12 @@ func (self *TxPool) RemoveTransactions(txs types.Transactions) { self.mu.Lock() defer self.mu.Unlock() for _, tx := range txs { - self.removeTx(tx.Hash()) + self.RemoveTx(tx.Hash()) } } -func (pool *TxPool) removeTx(hash common.Hash) { +// RemoveTx removes the transaction with the given hash from the pool. +func (pool *TxPool) RemoveTx(hash common.Hash) { // delete from pending pool delete(pool.pending, hash) // delete from queue diff --git a/core/transaction_pool_test.go b/core/transaction_pool_test.go index 26af4fc16..7d0984740 100644 --- a/core/transaction_pool_test.go +++ b/core/transaction_pool_test.go @@ -130,7 +130,7 @@ func TestRemoveTx(t *testing.T) { t.Error("expected txs to be 1, got", len(pool.pending)) } - pool.removeTx(tx.Hash()) + pool.RemoveTx(tx.Hash()) if len(pool.queue) > 0 { t.Error("expected queue to be 0, got", len(pool.queue)) diff --git a/rpc/api/eth.go b/rpc/api/eth.go index 328cd4f19..4041811f0 100644 --- a/rpc/api/eth.go +++ b/rpc/api/eth.go @@ -21,8 +21,9 @@ import ( "encoding/json" "math/big" + "fmt" + "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/rpc/codec" "github.com/ethereum/go-ethereum/rpc/shared" @@ -578,14 +579,17 @@ func (self *ethApi) Resend(req *shared.Request) (interface{}, error) { return nil, shared.NewDecodeParamError(err.Error()) } - ret, err := self.xeth.Transact(args.Tx.From, args.Tx.To, args.Tx.Nonce, args.Tx.Value, args.GasLimit, args.GasPrice, args.Tx.Data) - if err != nil { - return nil, err - } + from := common.HexToAddress(args.Tx.From) - self.ethereum.TxPool().RemoveTransactions(types.Transactions{args.Tx.tx}) + pending := self.ethereum.TxPool().GetTransactions() + for _, p := range pending { + if pFrom, err := p.From(); err == nil && pFrom == from && p.SigHash() == args.Tx.tx.SigHash() { + self.ethereum.TxPool().RemoveTx(common.HexToHash(args.Tx.Hash)) + return self.xeth.Transact(args.Tx.From, args.Tx.To, args.Tx.Nonce, args.Tx.Value, args.GasLimit, args.GasPrice, args.Tx.Data) + } + } - return ret, nil + return nil, fmt.Errorf("Transaction %s not found", args.Tx.Hash) } func (self *ethApi) PendingTransactions(req *shared.Request) (interface{}, error) { diff --git a/rpc/api/eth_args.go b/rpc/api/eth_args.go index 2f864b5c1..1218bd625 100644 --- a/rpc/api/eth_args.go +++ b/rpc/api/eth_args.go @@ -884,6 +884,7 @@ type tx struct { Data string GasLimit string GasPrice string + Hash string } func newTx(t *types.Transaction) *tx { @@ -902,6 +903,7 @@ func newTx(t *types.Transaction) *tx { Data: "0x" + common.Bytes2Hex(t.Data()), GasLimit: t.Gas().String(), GasPrice: t.GasPrice().String(), + Hash: t.Hash().Hex(), } } @@ -927,6 +929,12 @@ func (tx *tx) UnmarshalJSON(b []byte) (err error) { contractCreation = true ) + if val, found := fields["Hash"]; found { + if hashVal, ok := val.(string); ok { + tx.Hash = hashVal + } + } + if val, found := fields["To"]; found { if strVal, ok := val.(string); ok && len(strVal) > 0 { tx.To = strVal |