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}