mirror of
https://github.com/arnaucube/bc.git
synced 2026-02-06 18:46:42 +01:00
fixed p2p layer
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -30,8 +30,10 @@ func main() {
|
||||
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)
|
||||
|
||||
25
peer/messageHandler.go
Normal file
25
peer/messageHandler.go
Normal file
@@ -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
|
||||
}
|
||||
@@ -4,12 +4,17 @@ 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
|
||||
tp.RunningPeer.Role = role
|
||||
@@ -41,3 +46,35 @@ func InitializePeer(role, ip, port, restport, serverip, serverport string) ThisP
|
||||
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)
|
||||
}
|
||||
|
||||
@@ -2,11 +2,8 @@ package p2plib
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/fatih/color"
|
||||
)
|
||||
|
||||
type Msg struct {
|
||||
@@ -17,46 +14,24 @@ type Msg struct {
|
||||
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) {
|
||||
|
||||
@@ -147,6 +147,21 @@ func PrintPeersList() {
|
||||
}
|
||||
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) {
|
||||
|
||||
6
peer/p2plib/petitions.go
Normal file
6
peer/p2plib/petitions.go
Normal file
@@ -0,0 +1,6 @@
|
||||
package p2plib
|
||||
|
||||
func SendPetition(peer Peer, petition string) {
|
||||
_, err := peer.Conn.Write([]byte(petition))
|
||||
check(err)
|
||||
}
|
||||
Reference in New Issue
Block a user