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}