package blockchain
|
|
|
|
|
|
import "sync"
|
|
import "time"
|
|
import "sync/atomic"
|
|
|
|
import log "github.com/sirupsen/logrus"
|
|
|
|
import "github.com/deroproject/derosuite/globals"
|
|
import "github.com/deroproject/derosuite/crypto"
|
|
|
|
|
|
|
|
// at this point in time, this is an ultrafast written mempool,
|
|
// it will not scale for more than 10000 transactions but is good enough for now
|
|
// we can always come back and rewrite it
|
|
type Mempool struct {
|
|
txs map[crypto.Hash]mempool_object
|
|
|
|
// global variable , but don't see it utilisation here except fot tx verification
|
|
chain *Blockchain
|
|
|
|
sync.Mutex
|
|
}
|
|
|
|
type mempool_object struct {
|
|
Tx *Transaction
|
|
Added uint64
|
|
Reason int // why is the tx in the mempool
|
|
}
|
|
|
|
var loggerpool *log.Entry
|
|
|
|
func Init_Mempool(params map[string]interface{}) (*Mempool, error) {
|
|
var mempool Mempool
|
|
//mempool.chain = params["chain"].(*Blockchain)
|
|
|
|
loggerpool = globals.Logger.WithFields(log.Fields{"com": "POOL"}) // all components must use this logger
|
|
loggerpool.Infof("Mempool started")
|
|
atomic.AddUint32(&globals.Subsystem_Active, 1) // increment subsystem
|
|
|
|
//TODO load any trasactions saved at previous exit
|
|
|
|
return &mempool, nil
|
|
}
|
|
|
|
func (pool *Mempool) Shutdown() {
|
|
//TODO save mempool tx somewhere
|
|
loggerpool.Infof("Mempool stopped")
|
|
atomic.AddUint32(&globals.Subsystem_Active, ^uint32(0)) // this decrement 1 fom subsystem
|
|
|
|
}
|
|
|
|
func (pool *Mempool) Mempool_Add_TX(tx *Transaction, Reason int) {
|
|
pool.Lock()
|
|
defer pool.Unlock()
|
|
|
|
var object mempool_object
|
|
|
|
hash := crypto.Hash(tx.GetHash())
|
|
|
|
// check if tx already exists, skip it
|
|
if _, ok := pool.txs[hash]; ok {
|
|
loggerpool.Infof("Pool already contains %x, skipping \n", hash)
|
|
return
|
|
}
|
|
object.Tx = tx
|
|
object.Reason = Reason
|
|
object.Added = uint64(time.Now().Unix())
|
|
|
|
pool.txs[hash] = object
|
|
|
|
}
|
|
|
|
// delete specific tx from pool
|
|
func (pool *Mempool) Mempool_Delete_TX(crypto.Hash) {
|
|
|
|
}
|
|
|
|
// get specific tx from mem pool
|
|
func (pool *Mempool) Mempool_Get_TX(txid crypto.Hash) ([]byte, error) {
|
|
return nil, nil
|
|
}
|
|
|
|
// return list of all txs in pool
|
|
func (pool *Mempool) Mempool_List_TX() []crypto.Hash {
|
|
pool.Lock()
|
|
defer pool.Unlock()
|
|
|
|
var list []crypto.Hash
|
|
for k, _ := range pool.txs {
|
|
list = append(list, k)
|
|
}
|
|
|
|
return list
|
|
}
|