You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

142 lines
3.3 KiB

package main
import (
"fmt"
"net"
"time"
"github.com/fatih/color"
)
type PeersList struct {
PeerID string
Peers []Peer `json:"peerslist"`
Date time.Time `json:"date"`
}
var outcomingPeersList PeersList
var incomingPeersList PeersList
var networkPeersList PeersList //the peers that have been received in the lists from other peers
/*
a future option is to put:
type PeersList struct {
Incoming PeersList
Outcoming PeersList
}
*/
func peerIsInPeersList(p Peer, pl []Peer) int {
r := -1
for i, peer := range pl {
if peer.IP+":"+peer.Port == p.IP+":"+p.Port {
r = i
}
}
return r
}
func deletePeerFromPeersList(p Peer, pl *PeersList) {
i := peerIsInPeersList(p, pl.Peers)
if i != -1 {
//delete peer from pl.Peers
pl.Peers = append(pl.Peers[:i], pl.Peers[i+1:]...)
}
}
func appendPeerIfNoExist(pl PeersList, p Peer) PeersList {
i := peerIsInPeersList(p, pl.Peers)
if i == -1 {
pl.Peers = append(pl.Peers, p)
}
return pl
}
func updateNetworkPeersList(conn net.Conn, newPeersList PeersList) {
for _, peer := range newPeersList.Peers {
if getIPPortFromConn(conn) == peer.IP+":"+peer.Port {
peer.ID = newPeersList.PeerID
color.Yellow(peer.ID)
}
i := peerIsInPeersList(peer, networkPeersList.Peers)
if i == -1 {
networkPeersList.Peers = append(networkPeersList.Peers, peer)
} else {
fmt.Println(networkPeersList.Peers[i])
networkPeersList.Peers[i].ID = peer.ID
}
}
}
func searchPeerAndUpdate(p Peer) {
for _, peer := range outcomingPeersList.Peers {
color.Red(p.IP + ":" + p.Port)
color.Yellow(peer.IP + ":" + peer.Port)
if p.IP+":"+p.Port == peer.IP+":"+peer.Port {
peer.ID = p.ID
}
}
}
//send the outcomingPeersList to all the peers except the peer that has send the outcomingPeersList
func propagatePeersList(p Peer) {
for _, peer := range networkPeersList.Peers {
if peer.Conn != nil {
if peer.ID != p.ID && p.ID != "" {
color.Yellow(peer.ID + " - " + p.ID)
var msg Msg
msg.construct("PeersList", "here my outcomingPeersList")
msg.PeersList = outcomingPeersList
msgB := msg.toBytes()
_, err := peer.Conn.Write(msgB)
check(err)
} else {
//to the peer that has sent the peerList, we send our PeersList
var msg Msg
msg.construct("PeersList_Response", "here my outcomingPeersList")
msg.PeersList = outcomingPeersList
msgB := msg.toBytes()
_, err := peer.Conn.Write(msgB)
check(err)
}
} else {
//connect to peer
if peer.ID != p.ID && peer.ID != runningPeer.ID {
if peerIsInPeersList(peer, outcomingPeersList.Peers) == -1 {
connectToPeer(peer)
}
}
}
}
}
func printPeersList() {
fmt.Println("")
color.Blue("runningPeer.ID: " + runningPeer.ID)
color.Green("OUTCOMING PEERSLIST:")
for _, peer := range outcomingPeersList.Peers {
fmt.Println(peer)
}
color.Green("INCOMING PEERSLIST:")
for _, peer := range incomingPeersList.Peers {
fmt.Println(peer)
}
color.Green("NETWORK PEERSLIST:")
for _, peer := range networkPeersList.Peers {
fmt.Println(peer)
}
fmt.Println("")
}
//send the block to all the peers of the outcomingPeersList
func propagateBlock(b Block) {
//prepare the msg to send to all connected peers
var msg Msg
msg.construct("Block", "new block")
msg.Block = b
msgB := msg.toBytes()
for _, peer := range outcomingPeersList.Peers {
if peer.Conn != nil {
_, err := peer.Conn.Write(msgB)
check(err)
}
}
}