mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-18 02:40:45 +00:00
internal: get pending and queued transaction by address (#22992)
This commit is contained in:
parent
93dd33b607
commit
5b01b23af6
7 changed files with 73 additions and 0 deletions
|
|
@ -535,6 +535,23 @@ func (pool *TxPool) Content() (map[common.Address]types.Transactions, map[common
|
||||||
return pending, queued
|
return pending, queued
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ContentFrom retrieves the data content of the transaction pool, returning the
|
||||||
|
// pending as well as queued transactions of this address, grouped by nonce.
|
||||||
|
func (pool *TxPool) ContentFrom(addr common.Address) (types.Transactions, types.Transactions) {
|
||||||
|
pool.mu.RLock()
|
||||||
|
defer pool.mu.RUnlock()
|
||||||
|
|
||||||
|
var pending types.Transactions
|
||||||
|
if list, ok := pool.pending[addr]; ok {
|
||||||
|
pending = list.Flatten()
|
||||||
|
}
|
||||||
|
var queued types.Transactions
|
||||||
|
if list, ok := pool.queue[addr]; ok {
|
||||||
|
queued = list.Flatten()
|
||||||
|
}
|
||||||
|
return pending, queued
|
||||||
|
}
|
||||||
|
|
||||||
// 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.
|
||||||
|
|
|
||||||
|
|
@ -325,6 +325,10 @@ func (b *EthApiBackend) TxPoolContent() (map[common.Address]types.Transactions,
|
||||||
return b.eth.TxPool().Content()
|
return b.eth.TxPool().Content()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *EthApiBackend) TxPoolContentFrom(addr common.Address) (types.Transactions, types.Transactions) {
|
||||||
|
return b.eth.TxPool().ContentFrom(addr)
|
||||||
|
}
|
||||||
|
|
||||||
func (b *EthApiBackend) OrderTxPoolContent() (map[common.Address]types.OrderTransactions, map[common.Address]types.OrderTransactions) {
|
func (b *EthApiBackend) OrderTxPoolContent() (map[common.Address]types.OrderTransactions, map[common.Address]types.OrderTransactions) {
|
||||||
return b.eth.OrderPool().Content()
|
return b.eth.OrderPool().Content()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -202,6 +202,29 @@ func (s *PublicTxPoolAPI) Content() map[string]map[string]map[string]*RPCTransac
|
||||||
return content
|
return content
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ContentFrom returns the transactions contained within the transaction pool.
|
||||||
|
func (s *PublicTxPoolAPI) ContentFrom(addr common.Address) map[string]map[string]*RPCTransaction {
|
||||||
|
content := make(map[string]map[string]*RPCTransaction, 2)
|
||||||
|
pending, queue := s.b.TxPoolContentFrom(addr)
|
||||||
|
curHeader := s.b.CurrentHeader()
|
||||||
|
|
||||||
|
// Build the pending transactions
|
||||||
|
dump := make(map[string]*RPCTransaction, len(pending))
|
||||||
|
for _, tx := range pending {
|
||||||
|
dump[fmt.Sprintf("%d", tx.Nonce())] = newRPCPendingTransaction(tx, curHeader, s.b.ChainConfig())
|
||||||
|
}
|
||||||
|
content["pending"] = dump
|
||||||
|
|
||||||
|
// Build the queued transactions
|
||||||
|
dump = make(map[string]*RPCTransaction, len(queue))
|
||||||
|
for _, tx := range queue {
|
||||||
|
dump[fmt.Sprintf("%d", tx.Nonce())] = newRPCPendingTransaction(tx, curHeader, s.b.ChainConfig())
|
||||||
|
}
|
||||||
|
content["queued"] = dump
|
||||||
|
|
||||||
|
return content
|
||||||
|
}
|
||||||
|
|
||||||
// Status returns the number of pending and queued transaction in the pool.
|
// Status returns the number of pending and queued transaction in the pool.
|
||||||
func (s *PublicTxPoolAPI) Status() map[string]hexutil.Uint {
|
func (s *PublicTxPoolAPI) Status() map[string]hexutil.Uint {
|
||||||
pending, queue := s.b.Stats()
|
pending, queue := s.b.Stats()
|
||||||
|
|
|
||||||
|
|
@ -84,6 +84,7 @@ type Backend interface {
|
||||||
GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error)
|
GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error)
|
||||||
Stats() (pending int, queued int)
|
Stats() (pending int, queued int)
|
||||||
TxPoolContent() (map[common.Address]types.Transactions, map[common.Address]types.Transactions)
|
TxPoolContent() (map[common.Address]types.Transactions, map[common.Address]types.Transactions)
|
||||||
|
TxPoolContentFrom(addr common.Address) (types.Transactions, types.Transactions)
|
||||||
SubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription
|
SubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription
|
||||||
|
|
||||||
// Order Pool Transaction
|
// Order Pool Transaction
|
||||||
|
|
|
||||||
|
|
@ -1071,6 +1071,11 @@ web3._extend({
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
new web3._extend.Method({
|
||||||
|
name: 'contentFrom',
|
||||||
|
call: 'txpool_contentFrom',
|
||||||
|
params: 1,
|
||||||
|
}),
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
`
|
`
|
||||||
|
|
|
||||||
|
|
@ -226,6 +226,10 @@ func (b *LesApiBackend) TxPoolContent() (map[common.Address]types.Transactions,
|
||||||
return b.eth.txPool.Content()
|
return b.eth.txPool.Content()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *LesApiBackend) TxPoolContentFrom(addr common.Address) (types.Transactions, types.Transactions) {
|
||||||
|
return b.eth.txPool.ContentFrom(addr)
|
||||||
|
}
|
||||||
|
|
||||||
func (b *LesApiBackend) OrderTxPoolContent() (map[common.Address]types.OrderTransactions, map[common.Address]types.OrderTransactions) {
|
func (b *LesApiBackend) OrderTxPoolContent() (map[common.Address]types.OrderTransactions, map[common.Address]types.OrderTransactions) {
|
||||||
return make(map[common.Address]types.OrderTransactions), make(map[common.Address]types.OrderTransactions)
|
return make(map[common.Address]types.OrderTransactions), make(map[common.Address]types.OrderTransactions)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -530,6 +530,25 @@ func (p *TxPool) Content() (map[common.Address]types.Transactions, map[common.Ad
|
||||||
return pending, queued
|
return pending, queued
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ContentFrom retrieves the data content of the transaction pool, returning the
|
||||||
|
// pending as well as queued transactions of this address, grouped by nonce.
|
||||||
|
func (pool *TxPool) ContentFrom(addr common.Address) (types.Transactions, types.Transactions) {
|
||||||
|
pool.mu.RLock()
|
||||||
|
defer pool.mu.RUnlock()
|
||||||
|
|
||||||
|
// Retrieve the pending transactions and sort by nonce
|
||||||
|
var pending types.Transactions
|
||||||
|
for _, tx := range pool.pending {
|
||||||
|
account, _ := types.Sender(pool.signer, tx)
|
||||||
|
if account != addr {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
pending = append(pending, tx)
|
||||||
|
}
|
||||||
|
// There are no queued transactions in a light pool, just return an empty map
|
||||||
|
return pending, types.Transactions{}
|
||||||
|
}
|
||||||
|
|
||||||
// RemoveTransactions removes all given transactions from the pool.
|
// RemoveTransactions removes all given transactions from the pool.
|
||||||
func (p *TxPool) RemoveTransactions(txs types.Transactions) {
|
func (p *TxPool) RemoveTransactions(txs types.Transactions) {
|
||||||
p.mu.Lock()
|
p.mu.Lock()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue