commit inicial do projeto
This commit is contained in:
74
internal/transactions/mempool.go
Normal file
74
internal/transactions/mempool.go
Normal file
@ -0,0 +1,74 @@
|
||||
package transactions
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type Mempool struct {
|
||||
txs []*Transaction
|
||||
mu sync.RWMutex
|
||||
}
|
||||
|
||||
func NewMempool() *Mempool {
|
||||
return &Mempool{}
|
||||
}
|
||||
|
||||
func (m *Mempool) Add(tx *Transaction) error {
|
||||
m.mu.Lock()
|
||||
defer m.mu.Unlock()
|
||||
if m.Has(tx.Hash()) {
|
||||
return errors.New("transação já existente na mempool")
|
||||
}
|
||||
m.txs = append(m.txs, tx)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Mempool) Remove(hash string) {
|
||||
m.mu.Lock()
|
||||
defer m.mu.Unlock()
|
||||
for i, tx := range m.txs {
|
||||
if tx.Hash() == hash {
|
||||
m.txs = append(m.txs[:i], m.txs[i+1:]...)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Mempool) All() []*Transaction {
|
||||
m.mu.RLock()
|
||||
defer m.mu.RUnlock()
|
||||
return append([]*Transaction(nil), m.txs...)
|
||||
}
|
||||
|
||||
func (m *Mempool) GetByHash(hash string) *Transaction {
|
||||
m.mu.RLock()
|
||||
defer m.mu.RUnlock()
|
||||
for _, tx := range m.txs {
|
||||
if tx.Hash() == hash {
|
||||
return tx
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Mempool) Pending() []*Transaction {
|
||||
return m.All()
|
||||
}
|
||||
|
||||
func (m *Mempool) Clear() {
|
||||
m.mu.Lock()
|
||||
defer m.mu.Unlock()
|
||||
m.txs = []*Transaction{}
|
||||
}
|
||||
|
||||
func (m *Mempool) Has(hash string) bool {
|
||||
m.mu.RLock()
|
||||
defer m.mu.RUnlock()
|
||||
for _, tx := range m.txs {
|
||||
if tx.Hash() == hash {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
Reference in New Issue
Block a user