internal: get pending and queued transaction by address (#22992)
* core, eth, internal, les, light: get pending and queued transaction by address * core: tiny nitpick fixes * light: tiny nitpick Co-authored-by: mark <mark@amis.com> Co-authored-by: Péter Szilágyi <peterke@gmail.com>
This commit is contained in:
		
							parent
							
								
									846badc480
								
							
						
					
					
						commit
						c49e065fea
					
				| @ -494,6 +494,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.
 | ||||||
|  | |||||||
| @ -267,6 +267,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) TxPool() *core.TxPool { | func (b *EthAPIBackend) TxPool() *core.TxPool { | ||||||
| 	return b.eth.TxPool() | 	return b.eth.TxPool() | ||||||
| } | } | ||||||
|  | |||||||
| @ -175,6 +175,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() | ||||||
|  | |||||||
| @ -77,6 +77,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 | ||||||
| 
 | 
 | ||||||
| 	// Filter API
 | 	// Filter API
 | ||||||
|  | |||||||
| @ -810,6 +810,11 @@ web3._extend({ | |||||||
| 				return status; | 				return status; | ||||||
| 			} | 			} | ||||||
| 		}), | 		}), | ||||||
|  | 		new web3._extend.Method({ | ||||||
|  | 			name: 'contentFrom', | ||||||
|  | 			call: 'txpool_contentFrom', | ||||||
|  | 			params: 1, | ||||||
|  | 		}), | ||||||
| 	] | 	] | ||||||
| }); | }); | ||||||
| ` | ` | ||||||
|  | |||||||
| @ -219,6 +219,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) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription { | func (b *LesApiBackend) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription { | ||||||
| 	return b.eth.txPool.SubscribeNewTxsEvent(ch) | 	return b.eth.txPool.SubscribeNewTxsEvent(ch) | ||||||
| } | } | ||||||
|  | |||||||
| @ -505,6 +505,25 @@ 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() | ||||||
|  | 
 | ||||||
|  | 	// 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 (pool *TxPool) RemoveTransactions(txs types.Transactions) { | func (pool *TxPool) RemoveTransactions(txs types.Transactions) { | ||||||
| 	pool.mu.Lock() | 	pool.mu.Lock() | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user