diff --git a/app/main.go b/app/main.go index 667ea612d1edd3306c1a909891233caebed920f4..eb09e4a3e0fa84f2d270f217a3d11ea461c53bef 100644 --- a/app/main.go +++ b/app/main.go @@ -9,6 +9,7 @@ import ( "net" "os" "strconv" + "strings" "time" ) @@ -168,13 +169,23 @@ func vote(server net.Listener, trans Transaction, config Config, parentAddress s go sendVoteToAllNeighbours(config, trans, parentAddress) } } + fmt.Println("***********************************") + fmt.Println("Transaction has been rated") + fmt.Println("Node correct : ", ack.AmountOfCorrectNode, "out of ", ack.TotalNodes) + fmt.Println("***********************************") - if stimulatedByClient { - fmt.Println("***********************************") - fmt.Println("Transaction has been rated") - fmt.Println("Node correct : ", ack.AmountOfCorrectNode, "out of ", ack.TotalNodes) - fmt.Println("***********************************") - go sendAckToNeighbour(config, ack, parentAddress) + if !stimulatedByClient { + address := parentAddress + for _, neighbour := range config.Neighbours { + fmt.Println("Comparing ", neighbour.Address, " with ", parentAddress) + + if neighbour.Address == parentAddress { + address = address + ":" + strconv.Itoa(neighbour.Port) + fmt.Println("Calculated address is ", address) + } + } + fmt.Println("Sending to ", address) + go sendAckToNeighbour(config, ack, address) } return ack } @@ -184,7 +195,7 @@ func sendVoteToAllNeighbours(config Config, trans Transaction, parentIp string) ip := config.Neighbours[neighbour].Address port := strconv.Itoa(config.Neighbours[neighbour].Port) address := ip + ":" + port - if address != parentIp { + if parentIp != ip { go sendVoteToNeighbour(config, trans, address) } } @@ -345,18 +356,48 @@ func processClient(connection net.Conn, server net.Listener, config Config, stim trans.Amount = body["amount"].(string) printTransaction(trans) // todo change this for cloud - vote(server, trans, config, connection.LocalAddr().String(), stimulatedByClient) + address := strings.Split(connection.RemoteAddr().String(), ":")[0] + vote(server, trans, config, address, stimulatedByClient) } else if mess.MessageType == "fake" { fmt.Println("Received a fake") - fmt.Println("Not yet implemented") + var fakeTransaction Transaction + var body map[string]interface{} = mess.MessageBody.(map[string]interface{}) + fakeTransaction.Id = body["id"].(string) + fakeTransaction.Receiver = body["receiver"].(string) + fakeTransaction.Sender = body["sender"].(string) + fakeTransaction.Amount = body["amount"].(string) + for transactionIndex := range DB { + if DB[transactionIndex].Id == fakeTransaction.Id { + DB[transactionIndex].Sender = fakeTransaction.Sender + DB[transactionIndex].Receiver = fakeTransaction.Receiver + DB[transactionIndex].Amount = fakeTransaction.Amount + fmt.Println("Successfully replaced the legitimate transaction with a fake one!") + } + } } else if mess.MessageType == "list" { fmt.Println("Received a list all transactions order") - listAllTransactions() + listAllTransactionsToClient(connection) } else { fmt.Println("Unknown message type") } } +func listAllTransactionsToClient(conn net.Conn) { + mess := Message{ + MessageType: "list", + MessageBody: DB, + } + + fmt.Println("Sending message to neighbour", mess) + encoder := json.NewEncoder(conn) + err := encoder.Encode(mess) + if err != nil { + fmt.Println("Error while encoding the transaction", err) + os.Exit(1) + } + conn.Close() +} + func processTransaction(server net.Listener, config Config, trans Transaction, stimulatedByClient bool) { fmt.Println("Processing transaction") printTransaction(trans) @@ -527,12 +568,52 @@ func userInputLoop(config Config, isAlsoServer bool) { break case "3": fmt.Println("You chose to fabricate a fake transaction") + fmt.Println("You chose to fake a transaction") + listAllTransactions() + fmt.Print("\nPlease enter the index of the transaction you want to overwrite by faking:") + var transID string + _, err := fmt.Scanln(&transID) + if err != nil { + fmt.Println("error :", err.Error()) + os.Exit(1) + } + transIDInt, err := strconv.ParseInt(transID, 10, 64) + if err != nil { + fmt.Println("error :", err.Error()) + os.Exit(1) + } + printAllNeighbours(config) + fmt.Println("Please enter the ID of the neighbour you to ask to fake the given transaction") + var neighbourID string + _, err = fmt.Scanln(&neighbourID) + if err != nil { + fmt.Println("error :", err.Error()) + os.Exit(1) + } + neighbourIDInt, err := strconv.ParseInt(neighbourID, 10, 64) + if err != nil { + fmt.Println("error :", err.Error()) + os.Exit(1) + } + tmpFakeTrans := userCreatedTransaction(config) + transToFake := DB[transIDInt] + fakeTrans := Transaction{ + Id: transToFake.Id, + Sender: tmpFakeTrans.Sender, + Receiver: tmpFakeTrans.Receiver, + Amount: tmpFakeTrans.Amount, + } + ip := config.Neighbours[neighbourIDInt].Address + port := strconv.Itoa(config.Neighbours[neighbourIDInt].Port) + address := ip + ":" + port + sendFakeTransactionToNeighbour(fakeTrans, address) break case "4": fmt.Println("You chose to print all transactions") listAllTransactions() break case "5": + fmt.Println("You chose to ask for all transactions of a given node") break case "6": break @@ -548,6 +629,32 @@ func userInputLoop(config Config, isAlsoServer bool) { } } +func sendFakeTransactionToNeighbour(trans Transaction, address string) { + fmt.Println() + fmt.Println("Trying to connect to ", address) + + conn, err := net.Dial(ConnectionType, address) + if err != nil { + fmt.Println("Error while connecting to the neighbour", err) + os.Exit(1) + } + + mess := Message{ + MessageType: "fake", + MessageBody: trans, + } + fmt.Println("Sending message to neighbour", mess) + encoder := json.NewEncoder(conn) + err = encoder.Encode(mess) + if err != nil { + fmt.Println("Error while encoding the transaction", err) + os.Exit(1) + } + conn.Close() + + fmt.Println("MessageBody successfully sent to neighbour") +} + func sendVoteToNeighbour(config Config, trans Transaction, address string) { fmt.Println() fmt.Println("Trying to connect to ", address) @@ -575,8 +682,12 @@ func sendVoteToNeighbour(config Config, trans Transaction, address string) { } func sendAckToNeighbour(config Config, ack AckTransaction, address string) { - fmt.Println() + fmt.Println("*******************STARTING TO SEND ACK*******************") fmt.Println("Trying to connect to ", address) + var ackToSend AckTransaction + ackToSend.Id = ack.Id + ackToSend.AmountOfCorrectNode = ack.AmountOfCorrectNode + ackToSend.TotalNodes = ack.TotalNodes conn, err := net.Dial(ConnectionType, address) if err != nil { @@ -586,7 +697,7 @@ func sendAckToNeighbour(config Config, ack AckTransaction, address string) { mess := Message{ MessageType: "AckResponse", - MessageBody: ack, + MessageBody: ackToSend, } fmt.Println("Sending message to neighbour", mess) encoder := json.NewEncoder(conn) @@ -598,6 +709,7 @@ func sendAckToNeighbour(config Config, ack AckTransaction, address string) { conn.Close() fmt.Println("MessageBody successfully sent to neighbour") + fmt.Println("*******************FINISHED ACK*******************") } func main() {