Skip to content
Snippets Groups Projects
gossip.go 1.97 KiB
Newer Older
capossele's avatar
capossele committed
package gossip

import (
	"net"
	"strconv"
	"github.com/iotaledger/goshimmer/packages/autopeering/peer/service"
	"github.com/iotaledger/goshimmer/packages/errors"
capossele's avatar
capossele committed
	gp "github.com/iotaledger/goshimmer/packages/gossip"
	"github.com/iotaledger/goshimmer/packages/gossip/server"
Luca Moser's avatar
Luca Moser committed
	"github.com/iotaledger/goshimmer/packages/parameter"
capossele's avatar
capossele committed
	"github.com/iotaledger/goshimmer/plugins/autopeering/local"
	"github.com/iotaledger/goshimmer/plugins/tangle"
	"github.com/iotaledger/hive.go/logger"
	"github.com/iotaledger/hive.go/typeutils"
	"github.com/iotaledger/iota.go/trinary"
	mgr *gp.Manager
capossele's avatar
capossele committed
)

func configureGossip() {
	lPeer := local.GetInstance()

	port := strconv.Itoa(parameter.NodeConfig.GetInt(GOSSIP_PORT))

	host, _, err := net.SplitHostPort(lPeer.Address())
	if err != nil {
		log.Fatalf("invalid peering address: %v", err)
	}
	err = lPeer.UpdateService(service.GossipKey, "tcp", net.JoinHostPort(host, port))
	if err != nil {
		log.Fatalf("could not update services: %v", err)
	}

	mgr = gp.NewManager(lPeer, loadTransaction, log)
capossele's avatar
capossele committed
}

Luca Moser's avatar
Luca Moser committed
func start(shutdownSignal <-chan struct{}) {
	defer log.Info("Stopping Gossip ... done")
capossele's avatar
capossele committed

	srv, err := server.ListenTCP(local.GetInstance(), log)
capossele's avatar
capossele committed
	if err != nil {
		log.Fatalf("ListenTCP: %v", err)
capossele's avatar
capossele committed
	}
	defer srv.Close()
capossele's avatar
capossele committed

	mgr.Start(srv)
	defer mgr.Close()
capossele's avatar
capossele committed

	log.Infof("Gossip started: address=%v", mgr.LocalAddr())
Luca Moser's avatar
Luca Moser committed
	<-shutdownSignal
	log.Info("Stopping Gossip ...")
}
capossele's avatar
capossele committed

func loadTransaction(hash []byte) ([]byte, error) {
	log.Infof("Retrieving tx: hash=%s", hash)
capossele's avatar
capossele committed

	tx, err := tangle.GetTransaction(typeutils.BytesToString(hash))
	if err != nil {
		return nil, errors.Wrap(err, "could not get transaction")
	}
	if tx == nil {
		return nil, fmt.Errorf("transaction not found: hash=%s", hash)
	}
	return tx.GetBytes(), nil
capossele's avatar
capossele committed
}

func requestTransaction(hash trinary.Hash) {
	if contains, _ := tangle.ContainsTransaction(hash); contains {
		// Do not request tx that we already know
		return
	}
	mgr.RequestTransaction(typeutils.StringToBytes(hash))
}