arnaucube
arnaucube/blockchainIDsystemPublic Self-hosted repository
blockchainIDsystem/peer/peersList.go
peer/peersList.goRaw
  1package main
  2
  3import (
  4	"fmt"
  5	"net"
  6	"time"
  7
  8	"github.com/fatih/color"
  9)
 10
 11type PeersList struct {
 12	PeerID string
 13	Peers  []Peer    `json:"peerslist"`
 14	Date   time.Time `json:"date"`
 15}
 16
 17var outcomingPeersList PeersList
 18var incomingPeersList PeersList
 19var networkPeersList PeersList //the peers that have been received in the lists from other peers
 20
 21/*
 22a future option is to put:
 23	type PeersList struct {
 24		Incoming	PeersList
 25		Outcoming	PeersList
 26	}
 27*/
 28
 29func peerIsInPeersList(p Peer, pl []Peer) int {
 30	r := -1
 31	for i, peer := range pl {
 32		if peer.IP+":"+peer.Port == p.IP+":"+p.Port {
 33			r = i
 34		}
 35	}
 36	return r
 37}
 38func appendPeerIfNoExist(pl PeersList, p Peer) PeersList {
 39	i := peerIsInPeersList(p, pl.Peers)
 40	if i == -1 {
 41		pl.Peers = append(pl.Peers, p)
 42	}
 43	return pl
 44}
 45func updateNetworkPeersList(conn net.Conn, newPeersList PeersList) {
 46	for _, peer := range newPeersList.Peers {
 47		if getIPPortFromConn(conn) == peer.IP+":"+peer.Port {
 48			peer.ID = newPeersList.PeerID
 49			color.Yellow(peer.ID)
 50		}
 51		i := peerIsInPeersList(peer, networkPeersList.Peers)
 52		if i == -1 {
 53			networkPeersList.Peers = append(networkPeersList.Peers, peer)
 54		} else {
 55			fmt.Println(networkPeersList.Peers[i])
 56			networkPeersList.Peers[i].ID = peer.ID
 57		}
 58	}
 59}
 60func searchPeerAndUpdate(p Peer) {
 61	for _, peer := range outcomingPeersList.Peers {
 62		color.Red(p.IP + ":" + p.Port)
 63		color.Yellow(peer.IP + ":" + peer.Port)
 64		if p.IP+":"+p.Port == peer.IP+":"+peer.Port {
 65			peer.ID = p.ID
 66		}
 67	}
 68}
 69
 70//send the outcomingPeersList to all the peers except the peer that has send the outcomingPeersList
 71func propagatePeersList(p Peer) {
 72	for _, peer := range networkPeersList.Peers {
 73		if peer.Conn != nil {
 74			if peer.ID != p.ID && p.ID != "" {
 75				color.Yellow(peer.ID + " - " + p.ID)
 76				var msg Msg
 77				msg = msg.construct("PeersList", "here my outcomingPeersList", outcomingPeersList)
 78				msgB := msg.toBytes()
 79				_, err := peer.Conn.Write(msgB)
 80				check(err)
 81			} else {
 82				//to the peer that has sent the peerList, we send our ID
 83				/*
 84					var msg Msg
 85					var pl PeersList
 86					msg = msg.construct("MyID", runningPeer.ID, pl)
 87					msgB := msg.toBytes()
 88					_, err := p.Conn.Write(msgB)
 89					check(err)
 90				*/
 91				var msg Msg
 92				msg = msg.construct("PeersList_Response", "here my outcomingPeersList", outcomingPeersList)
 93				msgB := msg.toBytes()
 94				_, err := peer.Conn.Write(msgB)
 95				check(err)
 96			}
 97		} else {
 98			//connect to peer
 99			if peer.ID != p.ID && peer.ID != runningPeer.ID {
100				if peerIsInPeersList(peer, outcomingPeersList.Peers) == -1 {
101					connectToPeer(peer)
102				}
103			}
104
105		}
106	}
107}
108func printPeersList() {
109	fmt.Println("")
110	color.Blue("runningPeer.ID: " + runningPeer.ID)
111	color.Green("OUTCOMING PEERSLIST:")
112	for _, peer := range outcomingPeersList.Peers {
113		fmt.Println(peer)
114	}
115	color.Green("INCOMING PEERSLIST:")
116	for _, peer := range incomingPeersList.Peers {
117		fmt.Println(peer)
118	}
119
120	color.Green("NETWORK PEERSLIST:")
121	for _, peer := range networkPeersList.Peers {
122		fmt.Println(peer)
123	}
124	fmt.Println("")
125}