Merge pull request #22995 from karalabe/enforce-miner-tip
core, eth, miner: enforce configured mining reward post 1559 too
This commit is contained in:
commit
92b8f28df3
@ -26,6 +26,7 @@ import (
|
|||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/common/prque"
|
"github.com/ethereum/go-ethereum/common/prque"
|
||||||
|
"github.com/ethereum/go-ethereum/consensus/misc"
|
||||||
"github.com/ethereum/go-ethereum/core/state"
|
"github.com/ethereum/go-ethereum/core/state"
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/event"
|
"github.com/ethereum/go-ethereum/event"
|
||||||
@ -496,13 +497,30 @@ func (pool *TxPool) Content() (map[common.Address]types.Transactions, map[common
|
|||||||
// Pending retrieves all currently processable transactions, grouped by origin
|
// Pending retrieves all currently processable transactions, grouped by origin
|
||||||
// account and sorted by nonce. The returned transaction set is a copy and can be
|
// account and sorted by nonce. The returned transaction set is a copy and can be
|
||||||
// freely modified by calling code.
|
// freely modified by calling code.
|
||||||
func (pool *TxPool) Pending() (map[common.Address]types.Transactions, error) {
|
//
|
||||||
|
// The enforceTips parameter can be used to do an extra filtering on the pending
|
||||||
|
// transactions and only return those whose **effective** tip is large enough in
|
||||||
|
// the next pending execution environment.
|
||||||
|
func (pool *TxPool) Pending(enforceTips bool) (map[common.Address]types.Transactions, error) {
|
||||||
pool.mu.Lock()
|
pool.mu.Lock()
|
||||||
defer pool.mu.Unlock()
|
defer pool.mu.Unlock()
|
||||||
|
|
||||||
pending := make(map[common.Address]types.Transactions)
|
pending := make(map[common.Address]types.Transactions)
|
||||||
for addr, list := range pool.pending {
|
for addr, list := range pool.pending {
|
||||||
pending[addr] = list.Flatten()
|
txs := list.Flatten()
|
||||||
|
|
||||||
|
// If the miner requests tip enforcement, cap the lists now
|
||||||
|
if enforceTips && !pool.locals.contains(addr) {
|
||||||
|
for i, tx := range txs {
|
||||||
|
if tx.EffectiveTipIntCmp(pool.gasPrice, pool.priced.urgent.baseFee) < 0 {
|
||||||
|
txs = txs[:i]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(txs) > 0 {
|
||||||
|
pending[addr] = txs
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return pending, nil
|
return pending, nil
|
||||||
}
|
}
|
||||||
@ -562,7 +580,7 @@ func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error {
|
|||||||
if tx.Tip().BitLen() > 256 {
|
if tx.Tip().BitLen() > 256 {
|
||||||
return ErrTipVeryHigh
|
return ErrTipVeryHigh
|
||||||
}
|
}
|
||||||
// Ensure feeCap is less than or equal to tip.
|
// Ensure feeCap is greater than or equal to tip.
|
||||||
if tx.FeeCapIntCmp(tx.Tip()) < 0 {
|
if tx.FeeCapIntCmp(tx.Tip()) < 0 {
|
||||||
return ErrTipAboveFeeCap
|
return ErrTipAboveFeeCap
|
||||||
}
|
}
|
||||||
@ -1114,8 +1132,9 @@ func (pool *TxPool) runReorg(done chan struct{}, reset *txpoolResetRequest, dirt
|
|||||||
// because of another transaction (e.g. higher gas price).
|
// because of another transaction (e.g. higher gas price).
|
||||||
if reset != nil {
|
if reset != nil {
|
||||||
pool.demoteUnexecutables()
|
pool.demoteUnexecutables()
|
||||||
if reset.newHead != nil {
|
if reset.newHead != nil && pool.chainconfig.IsLondon(new(big.Int).Add(reset.newHead.Number, big.NewInt(1))) {
|
||||||
pool.priced.SetBaseFee(reset.newHead.BaseFee)
|
pendingBaseFee := misc.CalcBaseFee(pool.chainconfig, reset.newHead)
|
||||||
|
pool.priced.SetBaseFee(pendingBaseFee)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Ensure pool.queue and pool.pending sizes stay within the configured limits.
|
// Ensure pool.queue and pool.pending sizes stay within the configured limits.
|
||||||
|
@ -252,7 +252,7 @@ func TestStateChangeDuringTransactionPoolReset(t *testing.T) {
|
|||||||
trigger = true
|
trigger = true
|
||||||
<-pool.requestReset(nil, nil)
|
<-pool.requestReset(nil, nil)
|
||||||
|
|
||||||
_, err := pool.Pending()
|
_, err := pool.Pending(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Could not fetch pending transactions: %v", err)
|
t.Fatalf("Could not fetch pending transactions: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -356,6 +356,14 @@ func (tx *Transaction) EffectiveTipCmp(other *Transaction, baseFee *big.Int) int
|
|||||||
return tx.EffectiveTipValue(baseFee).Cmp(other.EffectiveTipValue(baseFee))
|
return tx.EffectiveTipValue(baseFee).Cmp(other.EffectiveTipValue(baseFee))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EffectiveTipIntCmp compares the effective tip of a transaction to the given tip.
|
||||||
|
func (tx *Transaction) EffectiveTipIntCmp(other *big.Int, baseFee *big.Int) int {
|
||||||
|
if baseFee == nil {
|
||||||
|
return tx.TipIntCmp(other)
|
||||||
|
}
|
||||||
|
return tx.EffectiveTipValue(baseFee).Cmp(other)
|
||||||
|
}
|
||||||
|
|
||||||
// Hash returns the transaction hash.
|
// Hash returns the transaction hash.
|
||||||
func (tx *Transaction) Hash() common.Hash {
|
func (tx *Transaction) Hash() common.Hash {
|
||||||
if hash := tx.hash.Load(); hash != nil {
|
if hash := tx.hash.Load(); hash != nil {
|
||||||
|
@ -231,7 +231,7 @@ func (b *EthAPIBackend) SendTx(ctx context.Context, signedTx *types.Transaction)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *EthAPIBackend) GetPoolTransactions() (types.Transactions, error) {
|
func (b *EthAPIBackend) GetPoolTransactions() (types.Transactions, error) {
|
||||||
pending, err := b.eth.txPool.Pending()
|
pending, err := b.eth.txPool.Pending(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -127,7 +127,7 @@ func (api *consensusAPI) AssembleBlock(params assembleBlockParams) (*executableD
|
|||||||
time.Sleep(wait)
|
time.Sleep(wait)
|
||||||
}
|
}
|
||||||
|
|
||||||
pending, err := pool.Pending()
|
pending, err := pool.Pending(true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ type txPool interface {
|
|||||||
|
|
||||||
// Pending should return pending transactions.
|
// Pending should return pending transactions.
|
||||||
// The slice should be modifiable by the caller.
|
// The slice should be modifiable by the caller.
|
||||||
Pending() (map[common.Address]types.Transactions, error)
|
Pending(enforceTips bool) (map[common.Address]types.Transactions, error)
|
||||||
|
|
||||||
// SubscribeNewTxsEvent should return an event subscription of
|
// SubscribeNewTxsEvent should return an event subscription of
|
||||||
// NewTxsEvent and send events to the given channel.
|
// NewTxsEvent and send events to the given channel.
|
||||||
|
@ -91,7 +91,7 @@ func (p *testTxPool) AddRemotes(txs []*types.Transaction) []error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Pending returns all the transactions known to the pool
|
// Pending returns all the transactions known to the pool
|
||||||
func (p *testTxPool) Pending() (map[common.Address]types.Transactions, error) {
|
func (p *testTxPool) Pending(enforceTips bool) (map[common.Address]types.Transactions, error) {
|
||||||
p.lock.RLock()
|
p.lock.RLock()
|
||||||
defer p.lock.RUnlock()
|
defer p.lock.RUnlock()
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ func (h *handler) syncTransactions(p *eth.Peer) {
|
|||||||
//
|
//
|
||||||
// TODO(karalabe): Figure out if we could get away with random order somehow
|
// TODO(karalabe): Figure out if we could get away with random order somehow
|
||||||
var txs types.Transactions
|
var txs types.Transactions
|
||||||
pending, _ := h.txpool.Pending()
|
pending, _ := h.txpool.Pending(false)
|
||||||
for _, batch := range pending {
|
for _, batch := range pending {
|
||||||
txs = append(txs, batch...)
|
txs = append(txs, batch...)
|
||||||
}
|
}
|
||||||
|
@ -963,7 +963,7 @@ func (w *worker) commitNewWork(interrupt *int32, noempty bool, timestamp int64)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Fill the block with all available pending transactions.
|
// Fill the block with all available pending transactions.
|
||||||
pending, err := w.eth.TxPool().Pending()
|
pending, err := w.eth.TxPool().Pending(true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Failed to fetch pending transactions", "err", err)
|
log.Error("Failed to fetch pending transactions", "err", err)
|
||||||
return
|
return
|
||||||
|
Loading…
Reference in New Issue
Block a user