Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
perso-distributed-systems
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
xavier.perret
perso-distributed-systems
Commits
4fce1365
Verified
Commit
4fce1365
authored
2 years ago
by
xavier.perret
Browse files
Options
Downloads
Patches
Plain Diff
added fake transaction
parent
bc083c99
No related branches found
No related tags found
1 merge request
!2
added file to separate client function from the server
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
app/main.go
+124
-12
124 additions, 12 deletions
app/main.go
with
124 additions
and
12 deletions
app/main.go
+
124
−
12
View file @
4fce1365
...
...
@@ -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
)
}
}
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
parentI
p
!=
i
p
{
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
(
)
listAllTransactions
ToClient
(
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
(
"
\n
Please 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
:
ack
ToSend
,
}
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
()
{
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment