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 }