mirror of
https://github.com/arnaucube/blockchainIDsystem.git
synced 2026-02-07 11:06:41 +01:00
peers connection working
This commit is contained in:
@@ -1,2 +1,8 @@
|
|||||||
# blockchainIDsystem
|
# blockchainIDsystem
|
||||||
A blockchain based anonymous login system
|
A blockchain based anonymous login system
|
||||||
|
|
||||||
|
|
||||||
|
- p2p
|
||||||
|
- blockchain
|
||||||
|
- rsa
|
||||||
|
- blind signature
|
||||||
|
|||||||
21
peer/README.md
Normal file
21
peer/README.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Peer
|
||||||
|
|
||||||
|
To run as a normal peer:
|
||||||
|
```
|
||||||
|
./peer
|
||||||
|
```
|
||||||
|
|
||||||
|
To run as a p2p server:
|
||||||
|
```
|
||||||
|
./peer server
|
||||||
|
```
|
||||||
|
|
||||||
|
Needs the config.json file:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"ip": "127.0.0.1",
|
||||||
|
"port": "3001",
|
||||||
|
"serverip": "127.0.0.1",
|
||||||
|
"serverport": "3000"
|
||||||
|
}
|
||||||
|
```
|
||||||
6
peer/config.json
Executable file
6
peer/config.json
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"ip": "127.0.0.1",
|
||||||
|
"port": "3001",
|
||||||
|
"serverip": "127.0.0.1",
|
||||||
|
"serverport": "3000"
|
||||||
|
}
|
||||||
71
peer/connections.go
Normal file
71
peer/connections.go
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"net"
|
||||||
|
|
||||||
|
"github.com/fatih/color"
|
||||||
|
)
|
||||||
|
|
||||||
|
func acceptPeers(peer Peer) {
|
||||||
|
fmt.Println("accepting peers at: " + peer.Port)
|
||||||
|
l, err := net.Listen("tcp", peer.IP+":"+peer.Port)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error accepting peers. Listening port: " + peer.Port)
|
||||||
|
running = false
|
||||||
|
}
|
||||||
|
for running {
|
||||||
|
conn, err := l.Accept()
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error accepting peers. Error accepting connection")
|
||||||
|
running = false
|
||||||
|
}
|
||||||
|
var newPeer Peer
|
||||||
|
newPeer.IP = getIPFromConn(conn)
|
||||||
|
newPeer.Port = getPortFromConn(conn)
|
||||||
|
newPeer.Conn = conn
|
||||||
|
listPeers = append(listPeers, newPeer)
|
||||||
|
go handleConn(conn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func connectToPeer(peer Peer) {
|
||||||
|
conn, err := net.Dial("tcp", peer.IP+":"+peer.Port)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error connecting to: " + peer.IP + ":" + peer.Port)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
peer.Conn = conn
|
||||||
|
listPeers = append(listPeers, peer)
|
||||||
|
go handleConn(conn)
|
||||||
|
}
|
||||||
|
func handleConn(conn net.Conn) {
|
||||||
|
connRunning := true
|
||||||
|
log.Println("handling conn: " + conn.RemoteAddr().String())
|
||||||
|
//reply to the conn
|
||||||
|
msgB := newMsgBytes("Hi", "New Peer connected")
|
||||||
|
_, err := conn.Write(msgB)
|
||||||
|
if err != nil {
|
||||||
|
check(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer := make([]byte, 1024)
|
||||||
|
for connRunning {
|
||||||
|
bytesRead, err := conn.Read(buffer)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
connRunning = false
|
||||||
|
} else {
|
||||||
|
s := string(buffer[0:bytesRead])
|
||||||
|
var msg Msg
|
||||||
|
err := json.Unmarshal([]byte(s), &msg)
|
||||||
|
check(err)
|
||||||
|
log.Println("[New msg] [Title]: " + msg.Type + " [Content]: " + msg.Content)
|
||||||
|
color.Green(msg.Content)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//TODO add that if the peer closed is the p2p server, show a warning message at the peer
|
||||||
|
log.Println("Peer: " + conn.RemoteAddr().String() + " connection closed")
|
||||||
|
conn.Close()
|
||||||
|
}
|
||||||
9
peer/errors.go
Executable file
9
peer/errors.go
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "log"
|
||||||
|
|
||||||
|
func check(err error) {
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
24
peer/log.go
Executable file
24
peer/log.go
Executable file
@@ -0,0 +1,24 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func savelog() {
|
||||||
|
timeS := time.Now().String()
|
||||||
|
_ = os.Mkdir("logs", os.ModePerm)
|
||||||
|
//next 3 lines are to avoid windows filesystem errors
|
||||||
|
timeS = strings.Replace(timeS, " ", "_", -1)
|
||||||
|
timeS = strings.Replace(timeS, ".", "-", -1)
|
||||||
|
timeS = strings.Replace(timeS, ":", "-", -1)
|
||||||
|
logFile, err := os.OpenFile("logs/log-"+timeS+".log", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
mw := io.MultiWriter(os.Stdout, logFile)
|
||||||
|
log.SetOutput(mw)
|
||||||
|
}
|
||||||
59
peer/main.go
Normal file
59
peer/main.go
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/fatih/color"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Peer struct {
|
||||||
|
IP string
|
||||||
|
Port string
|
||||||
|
Role string //client or server
|
||||||
|
Conn net.Conn
|
||||||
|
}
|
||||||
|
type Msg struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Content string `json:"content"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var listPeers []Peer
|
||||||
|
var running bool
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
//initialize some vars
|
||||||
|
running = true
|
||||||
|
var peer Peer
|
||||||
|
|
||||||
|
color.Blue("Starting Peer")
|
||||||
|
readConfig("config.json")
|
||||||
|
|
||||||
|
peer.IP = config.IP
|
||||||
|
peer.Port = config.Port
|
||||||
|
peer.Role = "client"
|
||||||
|
|
||||||
|
//read flags, to know if is runned as p2p server
|
||||||
|
if len(os.Args) > 1 {
|
||||||
|
if os.Args[1] == "server" {
|
||||||
|
color.Yellow("Running as p2p server")
|
||||||
|
peer.Role = "server"
|
||||||
|
peer.Port = config.ServerPort
|
||||||
|
go acceptPeers(peer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(peer)
|
||||||
|
if peer.Role == "client" {
|
||||||
|
var newPeer Peer
|
||||||
|
newPeer.IP = config.ServerIP
|
||||||
|
newPeer.Port = config.ServerPort
|
||||||
|
newPeer.Role = "server"
|
||||||
|
connectToPeer(newPeer)
|
||||||
|
}
|
||||||
|
|
||||||
|
for running {
|
||||||
|
time.Sleep(1000 * time.Millisecond)
|
||||||
|
}
|
||||||
|
}
|
||||||
23
peer/readConfig.go
Executable file
23
peer/readConfig.go
Executable file
@@ -0,0 +1,23 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"io/ioutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
//Config reads the config
|
||||||
|
type Config struct {
|
||||||
|
IP string `json:"ip"`
|
||||||
|
Port string `json:"port"`
|
||||||
|
ServerIP string `json:"serverip"`
|
||||||
|
ServerPort string `json:"serverport"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var config Config
|
||||||
|
|
||||||
|
func readConfig(path string) {
|
||||||
|
file, err := ioutil.ReadFile(path)
|
||||||
|
check(err)
|
||||||
|
content := string(file)
|
||||||
|
json.Unmarshal([]byte(content), &config)
|
||||||
|
}
|
||||||
28
peer/utils.go
Normal file
28
peer/utils.go
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"net"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func newMsgBytes(msgtype string, msgcontent string) []byte {
|
||||||
|
var msg Msg
|
||||||
|
msg.Type = msgtype
|
||||||
|
msg.Content = msgcontent
|
||||||
|
msgS, err := json.Marshal(msg)
|
||||||
|
check(err)
|
||||||
|
return msgS
|
||||||
|
}
|
||||||
|
func getIPFromConn(conn net.Conn) string {
|
||||||
|
s := conn.RemoteAddr().String()
|
||||||
|
s = strings.Split(s, ":")[0]
|
||||||
|
s = strings.Trim(s, ":")
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
func getPortFromConn(conn net.Conn) string {
|
||||||
|
s := conn.RemoteAddr().String()
|
||||||
|
s = strings.Split(s, ":")[1]
|
||||||
|
s = strings.Trim(s, ":")
|
||||||
|
return s
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user