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}
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.construct("PeersList", "here my outcomingPeersList")
78 msg.PeersList = outcomingPeersList
79 msgB := msg.toBytes()
80 _, err := peer.Conn.Write(msgB)
81 check(err)
82 } else {
83 //to the peer that has sent the peerList, we send our PeersList
84 var msg Msg
85 msg.construct("PeersList_Response", "here my outcomingPeersList")
86 msg.PeersList = outcomingPeersList
87 msgB := msg.toBytes()
88 _, err := peer.Conn.Write(msgB)
89 check(err)
90 }
91 } else {
92 //connect to peer
93 if peer.ID != p.ID && peer.ID != runningPeer.ID {
94 if peerIsInPeersList(peer, outcomingPeersList.Peers) == -1 {
95 connectToPeer(peer)
96 }
97 }
98
99 }
100 }
101}
102func printPeersList() {
103 fmt.Println("")
104 color.Blue("runningPeer.ID: " + runningPeer.ID)
105 color.Green("OUTCOMING PEERSLIST:")
106 for _, peer := range outcomingPeersList.Peers {
107 fmt.Println(peer)
108 }
109 color.Green("INCOMING PEERSLIST:")
110 for _, peer := range incomingPeersList.Peers {
111 fmt.Println(peer)
112 }
113
114 color.Green("NETWORK PEERSLIST:")
115 for _, peer := range networkPeersList.Peers {
116 fmt.Println(peer)
117 }
118 fmt.Println("")
119}
120
121//send the block to all the peers of the outcomingPeersList
122func propagateBlock(b Block) {
123 //prepare the msg to send to all connected peers
124 var msg Msg
125 msg.construct("Block", "new block")
126 msg.Block = b
127 msgB := msg.toBytes()
128 for _, peer := range outcomingPeersList.Peers {
129 if peer.Conn != nil {
130 _, err := peer.Conn.Write(msgB)
131 check(err)
132 }
133 }
134}