arnaucube
arnaucube/blockchainIDsystemPublic Self-hosted repository
blockchainIDsystem/peer/peers.go
peer/peers.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}
 38
 39func deletePeerFromPeersList(p Peer, pl *PeersList) {
 40	i := peerIsInPeersList(p, pl.Peers)
 41	if i != -1 {
 42		//delete peer from pl.Peers
 43		pl.Peers = append(pl.Peers[:i], pl.Peers[i+1:]...)
 44	}
 45}
 46func appendPeerIfNoExist(pl PeersList, p Peer) PeersList {
 47	i := peerIsInPeersList(p, pl.Peers)
 48	if i == -1 {
 49		pl.Peers = append(pl.Peers, p)
 50	}
 51	return pl
 52}
 53func updateNetworkPeersList(conn net.Conn, newPeersList PeersList) {
 54	for _, peer := range newPeersList.Peers {
 55		if getIPPortFromConn(conn) == peer.IP+":"+peer.Port {
 56			peer.ID = newPeersList.PeerID
 57			color.Yellow(peer.ID)
 58		}
 59		i := peerIsInPeersList(peer, networkPeersList.Peers)
 60		if i == -1 {
 61			networkPeersList.Peers = append(networkPeersList.Peers, peer)
 62		} else {
 63			fmt.Println(networkPeersList.Peers[i])
 64			networkPeersList.Peers[i].ID = peer.ID
 65		}
 66	}
 67}
 68func searchPeerAndUpdate(p Peer) {
 69	for _, peer := range outcomingPeersList.Peers {
 70		color.Red(p.IP + ":" + p.Port)
 71		color.Yellow(peer.IP + ":" + peer.Port)
 72		if p.IP+":"+p.Port == peer.IP+":"+peer.Port {
 73			peer.ID = p.ID
 74		}
 75	}
 76}
 77
 78//send the outcomingPeersList to all the peers except the peer that has send the outcomingPeersList
 79func propagatePeersList(p Peer) {
 80	for _, peer := range networkPeersList.Peers {
 81		if peer.Conn != nil {
 82			if peer.ID != p.ID && p.ID != "" {
 83				color.Yellow(peer.ID + " - " + p.ID)
 84				var msg Msg
 85				msg.construct("PeersList", "here my outcomingPeersList")
 86				msg.PeersList = outcomingPeersList
 87				msgB := msg.toBytes()
 88				_, err := peer.Conn.Write(msgB)
 89				check(err)
 90			} else {
 91				//to the peer that has sent the peerList, we send our PeersList
 92				var msg Msg
 93				msg.construct("PeersList_Response", "here my outcomingPeersList")
 94				msg.PeersList = outcomingPeersList
 95				msgB := msg.toBytes()
 96				_, err := peer.Conn.Write(msgB)
 97				check(err)
 98			}
 99		} else {
100			//connect to peer
101			if peer.ID != p.ID && peer.ID != runningPeer.ID {
102				if peerIsInPeersList(peer, outcomingPeersList.Peers) == -1 {
103					connectToPeer(peer)
104				}
105			}
106
107		}
108	}
109}
110func printPeersList() {
111	fmt.Println("")
112	color.Blue("runningPeer.ID: " + runningPeer.ID)
113	color.Green("OUTCOMING PEERSLIST:")
114	for _, peer := range outcomingPeersList.Peers {
115		fmt.Println(peer)
116	}
117	color.Green("INCOMING PEERSLIST:")
118	for _, peer := range incomingPeersList.Peers {
119		fmt.Println(peer)
120	}
121
122	color.Green("NETWORK PEERSLIST:")
123	for _, peer := range networkPeersList.Peers {
124		fmt.Println(peer)
125	}
126	fmt.Println("")
127}
128
129//send the block to all the peers of the outcomingPeersList
130func propagateBlock(b Block) {
131	//prepare the msg to send to all connected peers
132	var msg Msg
133	msg.construct("Block", "new block")
134	msg.Block = b
135	msgB := msg.toBytes()
136	for _, peer := range outcomingPeersList.Peers {
137		if peer.Conn != nil {
138			_, err := peer.Conn.Write(msgB)
139			check(err)
140		}
141	}
142}