tu-wien
/
kerma
Archived
2
0
Fork 0
This repository has been archived on 2023-03-02. You can view files and clone it, but cannot push or open issues or pull requests.
kerma/main.go

89 lines
1.8 KiB
Go

// Package main is the main package of the Kerma node
package main
import (
"kerma/helpers"
"kerma/models"
"kerma/utils"
"net"
"time"
)
var logger helpers.Logger
func main() {
var config helpers.Config
config.Construct()
logger.Debug("!!!!! NODE RUNNING IN DEBUG MODE !!!!!")
// Bind port
logger.Info("Listening on " + config.ListenAddr)
listener, err := net.Listen("tcp", config.ListenAddr)
if err != nil {
logger.Fatal("Failed binding port: " + err.Error())
}
// Define our in-memory state
var state models.State
state.Construct()
// Close listener on exit
defer listener.Close()
// Accept connections and handle requests
logger.Info("Performing handshake with known peers")
for {
go initNode(&state)
startServer(&state, listener)
}
}
func initNode(state *models.State) {
for _, peer := range state.PeerList {
if !state.CheckForHandshake(peer.Name) {
timeout := state.Config.ConnTimeout * int(time.Second)
d := net.Dialer{Timeout: time.Duration(timeout)}
conn, err := d.Dial("tcp", peer.Name)
if err != nil {
logger.Error("Failed connecting to peer: " + err.Error())
state.RemovePeerByName(peer.Name)
continue
}
var handler utils.TCPHandler
var client utils.Client
handler.Construct(conn)
client.Construct(state, handler)
client.InitHandshake(peer.Name)
client.DiscoverPeers(peer.Name)
client.DiscoverChainTip(peer.Name)
client.DiscoverMempool(peer.Name)
var server utils.Server
server.Construct(state, handler)
go server.Handle()
go client.GossipTransactions(peer.Name)
}
}
}
func startServer(state *models.State, l net.Listener) {
conn, err := l.Accept()
if err != nil {
logger.Fatal("Failed listening on port: " + err.Error())
}
var handler utils.TCPHandler
var server utils.Server
handler.Construct(conn)
server.Construct(state, handler)
go server.Handle()
}