core/txpool/blobpool: return ErrAlreadyKnown for duplicate txs (#29210)
Signed-off-by: Lee Bousfield <ljbousfield@gmail.com>
This commit is contained in:
parent
c1496e7ced
commit
3c81d559e7
@ -1133,8 +1133,12 @@ func (p *BlobPool) validateTx(tx *types.Transaction) error {
|
|||||||
next = p.state.GetNonce(from)
|
next = p.state.GetNonce(from)
|
||||||
)
|
)
|
||||||
if uint64(len(p.index[from])) > tx.Nonce()-next {
|
if uint64(len(p.index[from])) > tx.Nonce()-next {
|
||||||
// Account can support the replacement, but the price bump must also be met
|
|
||||||
prev := p.index[from][int(tx.Nonce()-next)]
|
prev := p.index[from][int(tx.Nonce()-next)]
|
||||||
|
// Ensure the transaction is different than the one tracked locally
|
||||||
|
if prev.hash == tx.Hash() {
|
||||||
|
return txpool.ErrAlreadyKnown
|
||||||
|
}
|
||||||
|
// Account can support the replacement, but the price bump must also be met
|
||||||
switch {
|
switch {
|
||||||
case tx.GasFeeCapIntCmp(prev.execFeeCap.ToBig()) <= 0:
|
case tx.GasFeeCapIntCmp(prev.execFeeCap.ToBig()) <= 0:
|
||||||
return fmt.Errorf("%w: new tx gas fee cap %v <= %v queued", txpool.ErrReplaceUnderpriced, tx.GasFeeCap(), prev.execFeeCap)
|
return fmt.Errorf("%w: new tx gas fee cap %v <= %v queued", txpool.ErrReplaceUnderpriced, tx.GasFeeCap(), prev.execFeeCap)
|
||||||
|
@ -992,9 +992,14 @@ func TestAdd(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
adds: []addtx{
|
adds: []addtx{
|
||||||
{ // New account, 1 tx pending: reject replacement nonce 0 (ignore price for now)
|
{ // New account, 1 tx pending: reject duplicate nonce 0
|
||||||
from: "alice",
|
from: "alice",
|
||||||
tx: makeUnsignedTx(0, 1, 1, 1),
|
tx: makeUnsignedTx(0, 1, 1, 1),
|
||||||
|
err: txpool.ErrAlreadyKnown,
|
||||||
|
},
|
||||||
|
{ // New account, 1 tx pending: reject replacement nonce 0 (ignore price for now)
|
||||||
|
from: "alice",
|
||||||
|
tx: makeUnsignedTx(0, 1, 1, 2),
|
||||||
err: txpool.ErrReplaceUnderpriced,
|
err: txpool.ErrReplaceUnderpriced,
|
||||||
},
|
},
|
||||||
{ // New account, 1 tx pending: accept nonce 1
|
{ // New account, 1 tx pending: accept nonce 1
|
||||||
@ -1017,10 +1022,10 @@ func TestAdd(t *testing.T) {
|
|||||||
tx: makeUnsignedTx(3, 1, 1, 1),
|
tx: makeUnsignedTx(3, 1, 1, 1),
|
||||||
err: nil,
|
err: nil,
|
||||||
},
|
},
|
||||||
{ // Old account, 1 tx in chain, 1 tx pending: reject replacement nonce 1 (ignore price for now)
|
{ // Old account, 1 tx in chain, 1 tx pending: reject duplicate nonce 1
|
||||||
from: "bob",
|
from: "bob",
|
||||||
tx: makeUnsignedTx(1, 1, 1, 1),
|
tx: makeUnsignedTx(1, 1, 1, 1),
|
||||||
err: txpool.ErrReplaceUnderpriced,
|
err: txpool.ErrAlreadyKnown,
|
||||||
},
|
},
|
||||||
{ // Old account, 1 tx in chain, 1 tx pending: accept nonce 2 (ignore price for now)
|
{ // Old account, 1 tx in chain, 1 tx pending: accept nonce 2 (ignore price for now)
|
||||||
from: "bob",
|
from: "bob",
|
||||||
|
Loading…
Reference in New Issue
Block a user