|
|
@@ -14,7 +14,6 @@ import (
|
|
|
"github.com/ethereum/go-ethereum/event"
|
|
|
"github.com/ethereum/go-ethereum/logger"
|
|
|
"github.com/ethereum/go-ethereum/logger/glog"
|
|
|
- "gopkg.in/fatih/set.v0"
|
|
|
)
|
|
|
|
|
|
var (
|
|
|
@@ -28,58 +27,31 @@ var (
|
|
|
ErrNegativeValue = errors.New("Negative value")
|
|
|
)
|
|
|
|
|
|
-const txPoolQueueSize = 50
|
|
|
-
|
|
|
-type TxPoolHook chan *types.Transaction
|
|
|
-type TxMsg struct{ Tx *types.Transaction }
|
|
|
-
|
|
|
type stateFn func() *state.StateDB
|
|
|
|
|
|
-const (
|
|
|
- minGasPrice = 1000000
|
|
|
-)
|
|
|
-
|
|
|
-type TxProcessor interface {
|
|
|
- ProcessTransaction(tx *types.Transaction)
|
|
|
-}
|
|
|
-
|
|
|
// The tx pool a thread safe transaction pool handler. In order to
|
|
|
// guarantee a non blocking pool we use a queue channel which can be
|
|
|
// independently read without needing access to the actual pool.
|
|
|
type TxPool struct {
|
|
|
- mu sync.RWMutex
|
|
|
- // Queueing channel for reading and writing incoming
|
|
|
- // transactions to
|
|
|
- queueChan chan *types.Transaction
|
|
|
- // Quiting channel
|
|
|
- quit chan bool
|
|
|
- // The state function which will allow us to do some pre checkes
|
|
|
- currentState stateFn
|
|
|
- // The current gas limit function callback
|
|
|
- gasLimit func() *big.Int
|
|
|
- // The actual pool
|
|
|
- txs map[common.Hash]*types.Transaction
|
|
|
- invalidHashes *set.Set
|
|
|
+ quit chan bool // Quiting channel
|
|
|
+ currentState stateFn // The state function which will allow us to do some pre checkes
|
|
|
+ gasLimit func() *big.Int // The current gas limit function callback
|
|
|
+ eventMux *event.TypeMux
|
|
|
|
|
|
+ mu sync.RWMutex
|
|
|
+ txs map[common.Hash]*types.Transaction // The actual pool
|
|
|
queue map[common.Address]map[common.Hash]*types.Transaction
|
|
|
-
|
|
|
- subscribers []chan TxMsg
|
|
|
-
|
|
|
- eventMux *event.TypeMux
|
|
|
}
|
|
|
|
|
|
func NewTxPool(eventMux *event.TypeMux, currentStateFn stateFn, gasLimitFn func() *big.Int) *TxPool {
|
|
|
- txPool := &TxPool{
|
|
|
- txs: make(map[common.Hash]*types.Transaction),
|
|
|
- queue: make(map[common.Address]map[common.Hash]*types.Transaction),
|
|
|
- queueChan: make(chan *types.Transaction, txPoolQueueSize),
|
|
|
- quit: make(chan bool),
|
|
|
- eventMux: eventMux,
|
|
|
- invalidHashes: set.New(),
|
|
|
- currentState: currentStateFn,
|
|
|
- gasLimit: gasLimitFn,
|
|
|
+ return &TxPool{
|
|
|
+ txs: make(map[common.Hash]*types.Transaction),
|
|
|
+ queue: make(map[common.Address]map[common.Hash]*types.Transaction),
|
|
|
+ quit: make(chan bool),
|
|
|
+ eventMux: eventMux,
|
|
|
+ currentState: currentStateFn,
|
|
|
+ gasLimit: gasLimitFn,
|
|
|
}
|
|
|
- return txPool
|
|
|
}
|
|
|
|
|
|
func (pool *TxPool) Start() {
|