Skip to content
Snippets Groups Projects
transactionspammer.go 1.50 KiB
package transactionspammer

import (
	"sync"
	"time"

	"github.com/iotaledger/goshimmer/packages/daemon"
	"github.com/iotaledger/goshimmer/packages/model/value_transaction"
	"github.com/iotaledger/goshimmer/plugins/gossip"
	"github.com/iotaledger/goshimmer/plugins/tipselection"
)

var spamming = false

var startMutex sync.Mutex

var shutdownSignal chan int

func Start(tps int64) {
	startMutex.Lock()

	if !spamming {
		shutdownSignal = make(chan int, 1)

		func(shutdownSignal chan int) {
			daemon.BackgroundWorker("Transaction Spammer", func() {
				for {
					start := time.Now()
					sentCounter := int64(0)
					totalSentCounter := int64(0)

					for {
						select {
						case <-daemon.ShutdownSignal:
							return

						case <-shutdownSignal:
							return

						default:
							sentCounter++
							totalSentCounter++

							tx := value_transaction.New()
							tx.SetValue(totalSentCounter)
							tx.SetBranchTransactionHash(tipselection.GetRandomTip())
							tx.SetTrunkTransactionHash(tipselection.GetRandomTip())

							gossip.Events.ReceiveTransaction.Trigger(tx.MetaTransaction)

							if sentCounter >= tps {
								duration := time.Since(start)
								if duration < time.Second {
									time.Sleep(time.Second - duration)

									start = time.Now()
								}

								sentCounter = 0
							}
						}
					}
				}
			})
		}(shutdownSignal)

		spamming = true
	}

	startMutex.Unlock()
}

func Stop() {
	startMutex.Lock()

	if spamming {
		close(shutdownSignal)

		spamming = false
	}

	startMutex.Unlock()
}