mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
core/txpool/localpool: add basic tx validation, txSubscriptions
This commit is contained in:
parent
5a5e3a65b6
commit
6bbe856697
1 changed files with 38 additions and 11 deletions
|
|
@ -20,6 +20,7 @@ package localpool
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/core"
|
"github.com/ethereum/go-ethereum/core"
|
||||||
|
|
@ -32,6 +33,8 @@ import (
|
||||||
|
|
||||||
var (
|
var (
|
||||||
errNotLocal = errors.New("non-local transaction added to local txpool")
|
errNotLocal = errors.New("non-local transaction added to local txpool")
|
||||||
|
|
||||||
|
txMaxSize uint64 = 128 * 1024 // 128KB
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ txpool.SubPool = new(LocalPool)
|
var _ txpool.SubPool = new(LocalPool)
|
||||||
|
|
@ -41,9 +44,12 @@ type LocalPool struct {
|
||||||
allAccounts map[common.Address]nonceOrderedList
|
allAccounts map[common.Address]nonceOrderedList
|
||||||
|
|
||||||
signer types.Signer
|
signer types.Signer
|
||||||
currentState *state.StateDB // Current state in the blockchain head
|
|
||||||
reserver txpool.AddressReserver
|
|
||||||
chain BlockChain
|
chain BlockChain
|
||||||
|
currentState *state.StateDB // Current state in the blockchain head
|
||||||
|
currentHead atomic.Pointer[types.Header]
|
||||||
|
|
||||||
|
txFeed event.Feed
|
||||||
|
reserver txpool.AddressReserver
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewLocalPool(chain BlockChain, signer types.Signer) (*LocalPool, error) {
|
func NewLocalPool(chain BlockChain, signer types.Signer) (*LocalPool, error) {
|
||||||
|
|
@ -52,14 +58,18 @@ func NewLocalPool(chain BlockChain, signer types.Signer) (*LocalPool, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &LocalPool{
|
pool := LocalPool{
|
||||||
chain: chain,
|
chain: chain,
|
||||||
currentState: currentState,
|
currentState: currentState,
|
||||||
signer: signer,
|
signer: signer,
|
||||||
}, nil
|
allTxs: make(map[common.Hash]*types.Transaction),
|
||||||
|
allAccounts: make(map[common.Address]nonceOrderedList),
|
||||||
|
}
|
||||||
|
pool.currentHead.Store(head)
|
||||||
|
return &pool, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filter is a selector used to decide whether a transaction whould be added
|
// Filter is a selector used to decide whether a transaction would be added
|
||||||
// to this particular subpool.
|
// to this particular subpool.
|
||||||
func (l *LocalPool) Filter(tx *types.Transaction) bool {
|
func (l *LocalPool) Filter(tx *types.Transaction) bool {
|
||||||
// Only disallow blob txs, all other txs should be allowed
|
// Only disallow blob txs, all other txs should be allowed
|
||||||
|
|
@ -76,7 +86,6 @@ func (l *LocalPool) Filter(tx *types.Transaction) bool {
|
||||||
func (l *LocalPool) Init(gasTip *big.Int, head *types.Header, reserve txpool.AddressReserver) error {
|
func (l *LocalPool) Init(gasTip *big.Int, head *types.Header, reserve txpool.AddressReserver) error {
|
||||||
l.reserver = reserve
|
l.reserver = reserve
|
||||||
// TODO load transactions.rlp
|
// TODO load transactions.rlp
|
||||||
// todo run reorg procedure
|
|
||||||
l.Reset(nil, head)
|
l.Reset(nil, head)
|
||||||
return errors.New("not implemented")
|
return errors.New("not implemented")
|
||||||
}
|
}
|
||||||
|
|
@ -93,6 +102,7 @@ func (l *LocalPool) Reset(oldHead, newHead *types.Header) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Could not get new state in LocalPool", "head", newHead.Hash())
|
log.Error("Could not get new state in LocalPool", "head", newHead.Hash())
|
||||||
}
|
}
|
||||||
|
l.currentHead.Store(newHead)
|
||||||
l.currentState = newState
|
l.currentState = newState
|
||||||
l.runReorg()
|
l.runReorg()
|
||||||
// todo should I reinsert local transactions that have been mined?
|
// todo should I reinsert local transactions that have been mined?
|
||||||
|
|
@ -129,9 +139,16 @@ func (l *LocalPool) Add(txs []*types.Transaction, local bool, sync bool) []error
|
||||||
}
|
}
|
||||||
return errs
|
return errs
|
||||||
}
|
}
|
||||||
|
var successfulTxs = make([]*types.Transaction, 0, len(txs))
|
||||||
for i, tx := range txs {
|
for i, tx := range txs {
|
||||||
errs[i] = l.add(tx)
|
err := l.add(tx)
|
||||||
|
errs[i] = err
|
||||||
|
if err == nil {
|
||||||
|
successfulTxs = append(successfulTxs, tx)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// notify all listeners about successfully added txs
|
||||||
|
l.txFeed.Send(core.NewTxsEvent{Txs: successfulTxs})
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -141,10 +158,21 @@ func (l *LocalPool) add(tx *types.Transaction) error {
|
||||||
log.Info("Ignoring already known transaction", "hash", tx.Hash())
|
log.Info("Ignoring already known transaction", "hash", tx.Hash())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
sender, err := l.signer.Sender(tx)
|
// Validate tx basics
|
||||||
if err != nil {
|
opts := &txpool.ValidationOptions{
|
||||||
|
Config: l.chain.Config(),
|
||||||
|
Accept: 0 |
|
||||||
|
1<<types.LegacyTxType |
|
||||||
|
1<<types.AccessListTxType |
|
||||||
|
1<<types.DynamicFeeTxType,
|
||||||
|
MaxSize: txMaxSize,
|
||||||
|
MinTip: new(big.Int),
|
||||||
|
}
|
||||||
|
if err := txpool.ValidateTransaction(tx, l.currentHead.Load(), l.signer, opts); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
// sender is already verified at this point
|
||||||
|
sender, _ := l.signer.Sender(tx)
|
||||||
if _, ok := l.allAccounts[sender]; !ok {
|
if _, ok := l.allAccounts[sender]; !ok {
|
||||||
if err := l.reserver(sender, true); err != nil {
|
if err := l.reserver(sender, true); err != nil {
|
||||||
log.Warn("Could not reserve account", "account", sender)
|
log.Warn("Could not reserve account", "account", sender)
|
||||||
|
|
@ -184,8 +212,7 @@ func (l *LocalPool) Pending(enforceTips bool) map[common.Address][]*txpool.LazyT
|
||||||
// can decide whether to receive notifications only for newly seen transactions
|
// can decide whether to receive notifications only for newly seen transactions
|
||||||
// or also for reorged out ones.
|
// or also for reorged out ones.
|
||||||
func (l *LocalPool) SubscribeTransactions(ch chan<- core.NewTxsEvent, reorgs bool) event.Subscription {
|
func (l *LocalPool) SubscribeTransactions(ch chan<- core.NewTxsEvent, reorgs bool) event.Subscription {
|
||||||
// todo impl
|
return l.txFeed.Subscribe(ch)
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Nonce returns the next nonce of an account, with all transactions executable
|
// Nonce returns the next nonce of an account, with all transactions executable
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue