|
|
|
@ -123,9 +123,10 @@ type blockChain interface { |
|
|
|
|
|
|
|
|
|
// TxPoolConfig are the configuration parameters of the transaction pool.
|
|
|
|
|
type TxPoolConfig struct { |
|
|
|
|
NoLocals bool // Whether local transaction handling should be disabled
|
|
|
|
|
Journal string // Journal of local transactions to survive node restarts
|
|
|
|
|
Rejournal time.Duration // Time interval to regenerate the local transaction journal
|
|
|
|
|
Locals []common.Address // Addresses that should be treated by default as local
|
|
|
|
|
NoLocals bool // Whether local transaction handling should be disabled
|
|
|
|
|
Journal string // Journal of local transactions to survive node restarts
|
|
|
|
|
Rejournal time.Duration // Time interval to regenerate the local transaction journal
|
|
|
|
|
|
|
|
|
|
PriceLimit uint64 // Minimum gas price to enforce for acceptance into the pool
|
|
|
|
|
PriceBump uint64 // Minimum price bump percentage to replace an already existing transaction (nonce)
|
|
|
|
@ -231,6 +232,10 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain block |
|
|
|
|
gasPrice: new(big.Int).SetUint64(config.PriceLimit), |
|
|
|
|
} |
|
|
|
|
pool.locals = newAccountSet(pool.signer) |
|
|
|
|
for _, addr := range config.Locals { |
|
|
|
|
log.Info("Setting new local account", "address", addr) |
|
|
|
|
pool.locals.add(addr) |
|
|
|
|
} |
|
|
|
|
pool.priced = newTxPricedList(pool.all) |
|
|
|
|
pool.reset(nil, chain.CurrentBlock().Header()) |
|
|
|
|
|
|
|
|
@ -534,6 +539,14 @@ func (pool *TxPool) Pending() (map[common.Address]types.Transactions, error) { |
|
|
|
|
return pending, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Locals retrieves the accounts currently considered local by the pool.
|
|
|
|
|
func (pool *TxPool) Locals() []common.Address { |
|
|
|
|
pool.mu.Lock() |
|
|
|
|
defer pool.mu.Unlock() |
|
|
|
|
|
|
|
|
|
return pool.locals.flatten() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// local retrieves all currently known local transactions, groupped by origin
|
|
|
|
|
// account and sorted by nonce. The returned transaction set is a copy and can be
|
|
|
|
|
// freely modified by calling code.
|
|
|
|
@ -665,7 +678,10 @@ func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { |
|
|
|
|
} |
|
|
|
|
// Mark local addresses and journal local transactions
|
|
|
|
|
if local { |
|
|
|
|
pool.locals.add(from) |
|
|
|
|
if !pool.locals.contains(from) { |
|
|
|
|
log.Info("Setting new local account", "address", from) |
|
|
|
|
pool.locals.add(from) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
pool.journalTx(from, tx) |
|
|
|
|
|
|
|
|
@ -1138,6 +1154,7 @@ func (a addressesByHeartbeat) Swap(i, j int) { a[i], a[j] = a[j], a[i] } |
|
|
|
|
type accountSet struct { |
|
|
|
|
accounts map[common.Address]struct{} |
|
|
|
|
signer types.Signer |
|
|
|
|
cache *[]common.Address |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// newAccountSet creates a new address set with an associated signer for sender
|
|
|
|
@ -1167,6 +1184,20 @@ func (as *accountSet) containsTx(tx *types.Transaction) bool { |
|
|
|
|
// add inserts a new address into the set to track.
|
|
|
|
|
func (as *accountSet) add(addr common.Address) { |
|
|
|
|
as.accounts[addr] = struct{}{} |
|
|
|
|
as.cache = nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// flatten returns the list of addresses within this set, also caching it for later
|
|
|
|
|
// reuse. The returned slice should not be changed!
|
|
|
|
|
func (as *accountSet) flatten() []common.Address { |
|
|
|
|
if as.cache == nil { |
|
|
|
|
accounts := make([]common.Address, 0, len(as.accounts)) |
|
|
|
|
for account := range as.accounts { |
|
|
|
|
accounts = append(accounts, account) |
|
|
|
|
} |
|
|
|
|
as.cache = &accounts |
|
|
|
|
} |
|
|
|
|
return *as.cache |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// txLookup is used internally by TxPool to track transactions while allowing lookup without
|
|
|
|
|