arnaucube
arnaucube/bcPublic Self-hosted repository
fixed p2p layer
arnaucode arnaucode@gmail.com
Sat, 27 Jan 2018 10:03:44 +0100
commit

b38582ad68758bc7bdf27761d776b11486ebee10

parent

51e2d00603d5c9795681c309529d078545f4c12b

M README.md → README.md

@@ -1,3 +1,5 @@

# bc Own p2p network and own blockchain libraries written in Go, to develop own decentralized apps. + +The purpose of this code is to learn to develop a p2p network and a blockchain system.
M peer/main.go → peer/main.go

@@ -30,8 +30,10 @@ err := blockchain.ReadFromDisk()

check(err) blockchain.Print() + //initialize p2plib + configuredMsgCases := createMsgHandlerCases() tp = p2plib.InitializePeer(os.Args[1], "127.0.0.1", - os.Args[2], os.Args[3], config.ServerIP, config.ServerPort) + os.Args[2], os.Args[3], config.ServerIP, config.ServerPort, configuredMsgCases) if tp.RunningPeer.Role == "client" { color.Red("http://" + config.IP + ":" + config.ServerRESTPort)
A peer/messageHandler.go

@@ -0,0 +1,25 @@

+package main + +import ( + "fmt" + + p2plib "./p2plib" + + blockchainlib "./blockchainlib" +) + +func createMsgHandlerCases() map[string]func(p2plib.Peer, p2plib.Msg) { + configuredMsgCases := make(map[string]func(p2plib.Peer, p2plib.Msg)) + configuredMsgCases["Block"] = func(peer p2plib.Peer, msg p2plib.Msg) { + //TODO check if the block is signed by an autorized emitter + //block = msg.Data converted to Block + var block blockchainlib.Block + if !blockchain.BlockExists(block) { + blockchain.AddBlock(block) + p2plib.PropagateData(peer, "block in string format") + } + } + + fmt.Println(configuredMsgCases) + return configuredMsgCases +}
M peer/p2plib/init.go → peer/p2plib/init.go

@@ -4,11 +4,16 @@ import (

"fmt" "math/rand" "time" + + "github.com/fatih/color" ) -func InitializePeer(role, ip, port, restport, serverip, serverport string) ThisPeer { +func InitializePeer(role, ip, port, restport, serverip, serverport string, + configuredMsgCases map[string]func(Peer, Msg)) ThisPeer { //initialize some vars rand.Seed(time.Now().Unix()) + + InitializeDefaultMsgCases(configuredMsgCases) var tp ThisPeer tp.Running = true

@@ -41,3 +46,35 @@

return tp } + +func InitializeDefaultMsgCases(configuredMsgCases map[string]func(Peer, Msg)) { + //msgCases := make(map[string]func(Peer, Msg)) --> no, it's used the global + msgCases = make(map[string]func(Peer, Msg)) + + //get the user configured msgCases + for k, v := range configuredMsgCases { + msgCases[k] = v + } + + msgCases["Hi"] = func(peer Peer, msg Msg) { + color.Yellow(msg.Type) + color.Green(msg.Content) + } + + msgCases["PeersList"] = func(peer Peer, msg Msg) { + color.Blue("newPeerslist") + fmt.Println(msg.PeersList) + color.Red("PeersList") + + UpdateNetworkPeersList(peer.Conn, msg.PeersList) + PropagatePeersList(peer) + PrintPeersList() + } + + msgCases["Data"] = func(peer Peer, msg Msg) { + color.Yellow(msg.Type) + color.Green(msg.Content) + PropagateData(peer, "data") + } + fmt.Println(msgCases) +}
M peer/p2plib/messages.go → peer/p2plib/messages.go

@@ -2,11 +2,8 @@ package p2plib

import ( "encoding/json" - "fmt" "log" "time" - - "github.com/fatih/color" ) type Msg struct {

@@ -17,46 +14,24 @@ PeersList PeersList `json:"peerslist"`

Data []byte `json:"data"` } +type Case struct { + Case string + Function func(Peer, Msg) +} + +var msgCases map[string]func(Peer, Msg) + func MessageHandler(peer Peer, msg Msg) { log.Println("[New msg]") log.Println(msg) - switch msg.Type { - case "Hi": - color.Yellow(msg.Type) - color.Green(msg.Content) - break - case "PeersList": - color.Blue("newPeerslist") - fmt.Println(msg.PeersList) - color.Red("PeersList") - - UpdateNetworkPeersList(peer.Conn, msg.PeersList) - PropagatePeersList(peer) - PrintPeersList() - break - case "PeersList_Response": - //for the moment is not beeing used - color.Blue("newPeerslist, from PeersList_Response") - fmt.Println(msg.PeersList) - color.Red("PeersList_Response") - - UpdateNetworkPeersList(peer.Conn, msg.PeersList) - PropagatePeersList(peer) - PrintPeersList() - break - case "Block": - /*//TODO check if the block is signed by an autorized emitter - if !blockchain.blockExists(msg.Block) { - blockchain.addBlock(msg.Block) - propagateBlock(msg.Block) - }*/ - break - default: - log.Println("Msg.Type not supported") - break - } + /*for c, caseFunction := range msgCases { + if msg.Type == c { + caseFunction(peer, msg) + } + }*/ + msgCases[msg.Type](peer, msg) } func (msg *Msg) Construct(msgtype string, msgcontent string) {
M peer/p2plib/peers.go → peer/p2plib/peers.go

@@ -147,6 +147,21 @@ fmt.Println(peer)

} fmt.Println("") } +func PropagateData(p Peer, s string) { + //prepare the msg to send to all connected peers + var msg Msg + msg.Construct("Data", "new Data") + msg.Data = []byte(s) + msgB := msg.ToBytes() + for _, peer := range globalTP.PeersConnections.Outcoming.Peers { + if peer.Conn != nil { + if peer.ID != p.ID && p.ID != "" { + _, err := peer.Conn.Write(msgB) + check(err) + } + } + } +} //send the block to all the peers of the outcomingPeersList /*func PropagateBlock(b Block) {
A peer/p2plib/petitions.go

@@ -0,0 +1,6 @@

+package p2plib + +func SendPetition(peer Peer, petition string) { + _, err := peer.Conn.Write([]byte(petition)) + check(err) +}