Skip to content

Commit cf5b725

Browse files
Roberto Bayardokaralabe
authored andcommitted
core/txpool: reject blob txs with blob fee cap below the minimum (ethereum#29081)
* make blobpool reject blob transactions with fee below the minimum * core/txpool: some minot nitpick polishes and unified error formats * core/txpool: do less big.Int constructions with the min blob cap --------- Co-authored-by: Péter Szilágyi <[email protected]>
1 parent a4ccc2b commit cf5b725

File tree

3 files changed

+33
-6
lines changed

3 files changed

+33
-6
lines changed

core/txpool/blobpool/blobpool.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ func (p *BlobPool) Init(gasTip uint64, head *types.Header, reserve txpool.Addres
402402
}
403403
var (
404404
basefee = uint256.MustFromBig(eip1559.CalcBaseFee(p.chain.Config(), p.head))
405-
blobfee = uint256.MustFromBig(big.NewInt(params.BlobTxMinBlobGasprice))
405+
blobfee = uint256.NewInt(params.BlobTxMinBlobGasprice)
406406
)
407407
if p.head.ExcessBlobGas != nil {
408408
blobfee = uint256.MustFromBig(eip4844.CalcBlobFee(*p.head.ExcessBlobGas))

core/txpool/blobpool/blobpool_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1228,6 +1228,24 @@ func TestAdd(t *testing.T) {
12281228
},
12291229
},
12301230
},
1231+
// Blob transactions that don't meet the min blob gas price should be rejected
1232+
{
1233+
seeds: map[string]seed{
1234+
"alice": {balance: 10000000},
1235+
},
1236+
adds: []addtx{
1237+
{ // New account, no previous txs, nonce 0, but blob fee cap too low
1238+
from: "alice",
1239+
tx: makeUnsignedTx(0, 1, 1, 0),
1240+
err: txpool.ErrUnderpriced,
1241+
},
1242+
{ // Same as above but blob fee cap equals minimum, should be accepted
1243+
from: "alice",
1244+
tx: makeUnsignedTx(0, 1, 1, params.BlobTxMinBlobGasprice),
1245+
err: nil,
1246+
},
1247+
},
1248+
},
12311249
}
12321250
for i, tt := range tests {
12331251
// Create a temporary folder for the persistent backend

core/txpool/validation.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ import (
3030
"github.com/ethereum/go-ethereum/params"
3131
)
3232

33+
var (
34+
// blobTxMinBlobGasPrice is the big.Int version of the configured protocol
35+
// parameter to avoid constucting a new big integer for every transaction.
36+
blobTxMinBlobGasPrice = big.NewInt(params.BlobTxMinBlobGasprice)
37+
)
38+
3339
// ValidationOptions define certain differences between transaction validation
3440
// across the different pools without having to duplicate those checks.
3541
type ValidationOptions struct {
@@ -101,15 +107,17 @@ func ValidateTransaction(tx *types.Transaction, head *types.Header, signer types
101107
return err
102108
}
103109
if tx.Gas() < intrGas {
104-
return fmt.Errorf("%w: needed %v, allowed %v", core.ErrIntrinsicGas, intrGas, tx.Gas())
110+
return fmt.Errorf("%w: gas %v, minimum needed %v", core.ErrIntrinsicGas, tx.Gas(), intrGas)
105111
}
106-
// Ensure the gasprice is high enough to cover the requirement of the calling
107-
// pool and/or block producer
112+
// Ensure the gasprice is high enough to cover the requirement of the calling pool
108113
if tx.GasTipCapIntCmp(opts.MinTip) < 0 {
109-
return fmt.Errorf("%w: tip needed %v, tip permitted %v", ErrUnderpriced, opts.MinTip, tx.GasTipCap())
114+
return fmt.Errorf("%w: gas tip cap %v, minimum needed %v", ErrUnderpriced, tx.GasTipCap(), opts.MinTip)
110115
}
111-
// Ensure blob transactions have valid commitments
112116
if tx.Type() == types.BlobTxType {
117+
// Ensure the blob fee cap satisfies the minimum blob gas price
118+
if tx.BlobGasFeeCapIntCmp(blobTxMinBlobGasPrice) < 0 {
119+
return fmt.Errorf("%w: blob fee cap %v, minimum needed %v", ErrUnderpriced, tx.BlobGasFeeCap(), blobTxMinBlobGasPrice)
120+
}
113121
sidecar := tx.BlobTxSidecar()
114122
if sidecar == nil {
115123
return fmt.Errorf("missing sidecar in blob transaction")
@@ -123,6 +131,7 @@ func ValidateTransaction(tx *types.Transaction, head *types.Header, signer types
123131
if len(hashes) > params.MaxBlobGasPerBlock/params.BlobTxBlobGasPerBlob {
124132
return fmt.Errorf("too many blobs in transaction: have %d, permitted %d", len(hashes), params.MaxBlobGasPerBlock/params.BlobTxBlobGasPerBlob)
125133
}
134+
// Ensure commitments, proofs and hashes are valid
126135
if err := validateBlobSidecar(hashes, sidecar); err != nil {
127136
return err
128137
}

0 commit comments

Comments
 (0)