-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathsimulation.py
114 lines (103 loc) · 4.19 KB
/
simulation.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
from committee import Committee
from analyse import Analyse
import json
import time
dataset = {}
msgSizes = {}
nodeSizes = {}
def runPBFT(protocol, committeeSize):
start = time.process_time()
committee = Committee(protocol, committeeSize)
committee.initializeNodes()
difference = time.process_time()-start
print(protocol, ' finished, time taken : ', difference)
return difference, committee
def saveResult(protocol, committeeSize, timeTaken, committee):
title = protocol+str(committeeSize)
dataset[title] = {
"protocol":protocol,
"committeeSize":str(committeeSize),
"timeTaken":str(timeTaken)
}
msgSizes[title] = {
"protocol":protocol,
"committeeSize":str(committeeSize),
"nodeToLeader" : committee.nodeToLeaderMsgSize,
"leaderToNode" : committee.leaderToNodeMsgSize
}
nodeSizes[title] = {
"protocol":protocol,
"committeeSize":str(committeeSize),
"nodeSize" : committee.nodeSize,
}
def writeResult(filename, dict):
with open(filename,'w') as file:
json.dump(dict, file)
def checkValidRound(committee):
if committee.validated == False:
return False
# creates a simulation for hardcoded sizes
def simulationV2():
committeeSizes = [10,12,14,16,18]
for size in committeeSizes:
validPKI = False
validBasic = False
validPop = False
validLe = False
# re-run any failed consensus round. Round can fail for weird reasons
while validPKI is False or validBasic is False or validPop is False or validLe is False :
if validPKI is False :
pkiTimeTaken, pkiCommittee = runPBFT('pki',size)
validPKI = checkValidRound(pkiCommittee)
if validBasic is False :
basicTimeTaken, basicCommittee = runPBFT('basic',size)
validBasic = checkValidRound(basicCommittee)
if validPop is False :
popTimeTaken, popCommittee = runPBFT('pop', size)
validPop = checkValidRound(popCommittee)
if validLe is False :
leTimeTaken, leCommittee = runPBFT('le', size)
validLe = checkValidRound(leCommittee)
saveResult('pki', size, pkiTimeTaken, pkiCommittee)
saveResult('pop', size, popTimeTaken, popCommittee)
saveResult('basic', size, basicTimeTaken, basicCommittee)
saveResult('le', size, leTimeTaken, leCommittee)
writeResult("data/timeTaken.json", dataset)
writeResult("data/msgSizes.json", msgSizes)
writeResult("data/nodeSizes.json", nodeSizes)
# creates a simulation for range of sizes
def simulation():
maxCommitteeSize = 30
minCommitteeSize = 3
committeeSizes = range(maxCommitteeSize)[minCommitteeSize:]
for size in committeeSizes:
validPKI = False
validBasic = False
validPop = False
validLe = False
# re run any failed consensus round. Round can fail for weird reasons
while validPKI is False or validBasic is False or validPop is False or validLe is False :
if validPKI is False :
pkiTimeTaken, pkiCommittee = runPBFT('pki',size)
validPKI = checkValidRound(pkiCommittee)
if validBasic is False :
basicTimeTaken, basicCommittee = runPBFT('basic',size)
validBasic = checkValidRound(basicCommittee)
if validPop is False :
popTimeTaken, popCommittee = runPBFT('pop', size)
validPop = checkValidRound(popCommittee)
if validLe is False :
leTimeTaken, leCommittee = runPBFT('le', size)
validLe = checkValidRound(leCommittee)
saveResult('pki', size, pkiTimeTaken, pkiCommittee)
saveResult('pop', size, popTimeTaken, popCommittee)
saveResult('basic', size, basicTimeTaken, basicCommittee)
saveResult('le', size, leTimeTaken, leCommittee)
writeResult("data/timeTaken.json", dataset)
writeResult("data/msgSizes.json", msgSizes)
writeResult("data/nodeSizes.json", nodeSizes)
simulationV2()
analysis = Analyse()
analysis.displaySpeed()
analysis.displayMsgSize()
analysis.displayNodeSize()