From 6ecf7a81b288c5239932e79432123301b195a255 Mon Sep 17 00:00:00 2001 From: Mona <56074102+Mona566@users.noreply.github.com> Date: Thu, 11 Aug 2022 14:22:08 +0100 Subject: [PATCH 1/4] Add files via upload --- README.md | 4 +- core/__pycache__/global_params.cpython-39.pyc | Bin 1793 -> 1817 bytes core/__pycache__/message.cpython-39.pyc | Bin 3975 -> 6520 bytes core/__pycache__/node.cpython-39.pyc | Bin 14229 -> 14258 bytes core/global_params.py | 11 +- core/message.py | 114 +++++++++++++++++- core/node.py | 114 ++++++++++++++---- main.py | 65 +++++++--- 8 files changed, 259 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 06445f1..73c5149 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -Forked from Andrew and tested different tip pool explosion methods - # IOTA Access Control Simulator Python simulator for the IOTA Access/Congestion Control Algorithm (ICCA). @@ -24,4 +22,4 @@ On Windows machines, it seems that you will need to create the environment from # Running Dash app Go to the `global_params.py` file and ensure that `DASH=True`. -Run `main.py` and a browser window should open showing the live plots from the simulation. +Run `main.py` and a browser window should open showing the live plots from the simulation. \ No newline at end of file diff --git a/core/__pycache__/global_params.cpython-39.pyc b/core/__pycache__/global_params.cpython-39.pyc index 947dcbb2ff18f44d689b05af35cb32c53bd19e00..012e950be95aea497a200e3d62a7ca163e24453e 100644 GIT binary patch delta 204 zcmZqVo5{zW$ji&c00brnzHH={V)U1dQc01DQcVHTa#3n2@=@w33Q-y`^)?3{kp3S`R3$55xvQY?#6r%%G|C5@ed+OGY4>xq)SJ3FBn%1pUzB)S_bj zoXo_$yu_-E#C(01)Z*-t`~v-uU}uHWf|SIPR4~)2C^a#qBts!Bv#7X4p*S_MC^e3V9tOq6DdaFkYx zLX>t2dz4NJLzFI1ogPqJABYWr*f51Lm_bwVCCD_tmyAF%Q-^VK3FBl7U;WVH)S_bj zoXo_$yu_-E#C(01)Z*-t`~rO!pAhH#y!6!KlFa-(AgiP(KSwt=vA86)NY`X@5K}4> SN61Szpjj^iHXmULWdZ;;5i@N7 diff --git a/core/__pycache__/message.cpython-39.pyc b/core/__pycache__/message.cpython-39.pyc index c726e1b2b4ff2990a5d2328dfd8e30b58ab60a75..e9b4da8424d6ecfff51ec1e87e57bcebd62b1ccf 100644 GIT binary patch literal 6520 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 Jhnka3{u_3;b&mi5 delta 1697 zcmZux%WoS+7@yhq`V~K7=g~);h=*L7q@oE_sa1u>aT=7kmEx+BRb<@E#F$ODyHgb@S_!A3y-pAbF;ufNwsL!GRYHmWPVZqsqSR<8?^ z$9tXG-G=Kqe0E`eyT_gRUB`7BO=qsZA6WHztK0JGbzIUd0uXAP`HN>pZbSovbz)2^ zhS1E#!=E5hvPFEPg8H-#@3z{8dA0Qk@`$)Eyh%P9+Km%Cb&JxDu_v~HiP^`L5)bA( zw0}%J`yGXUC2crwWrDP$1Dx=oj^Q|12>;g=2Td=cEio85CMELLcD8S=lsgUMzIxZ6SuZORo%MNEf z3UUx#xm_vO@2#${-Kxq&o&~c!930n>JqOlapEW#ZeC0QX}WmoE+~OAcjfsUObH^zPRsSSd%OJ`w?O}s zh#%4mC3%F64Tm)yE)R8JZ}mDi_jYz19%!Y8*9e)NfE0cXK~7){q=Ip>5pgLqGkV%W zNT3D*<)?3FzNRx+LK0C+Znj*v)otEsaHs37m)vmen8;_(9nN4FuFDq?77_541(w_E zv{-9rA6P$SE-srU`EXiQ1$C(M5UEeKQH diff --git a/core/__pycache__/node.cpython-39.pyc b/core/__pycache__/node.cpython-39.pyc index eda71b970553408babbc1d44a3da77eb02062531..e3ef3f840bf0ee62b2efa7ee4c29f5e2a2ae27e5 100644 GIT binary patch delta 2875 zcmai0ZA@F&8NTnm*Vo_1ID8mm91}=_GccqDvQ0@B8px7%L4ci(&?JuG8n6vE9AB!0 zUJtEFyG%_qk|WeMl`5#xHHp%#i?wOpGWE}Xw9(W*(I(AWr%C&e%6?RxRB4kYb?tStNYw@-t(U4ob!GiujKFLJxRCQA>r><*FVPZ#(v`Y2*50T3=`m=l1wS_6@l#n zI|N4gVPy!u&95neu6XQ7cwtUY8mUfdKFLx^-Ixwfrdh!V7g9+!F&)m&8R^;NV$w+G zbNmD4H_%yHQ6Iv=vadfile{pI&!PHkN=L0!*>z;I8&A)beSI@C@zMX*P>-dOb9`Dm z3ZwkTTI?|m#G@>_2lIL=nn(lX2ka89*pP1Ks!Ob{)! z1N%*zV|TC&H*D8_ii6XFMfjQf8OYQh!RyT1cc@ zaR05Qqzdr?NtP13kVMMtM&&&Rk#cpfDah7jkc=v#YmjsW3DH(K+P1Z*B5bnG6ZR2^ z@O$>Rca$w@BQ;wn+m1}9XLOdzu>t<9W3tJ?`q2DkHI9B}1JtyT%L`>N*h&6JM}363 zND6a|d{qHANgU}yVIh^6Eld>-VZRXP4bHZJ>;tc20~>f{725IZfFRVMw1y8me*}Hk zU13<@&8}N8#UHpru*5%c?c=Ze-AnHxi4H~Clna-1xhNat54Z?;K$RV)c2Ut)-Ev9D z`=yJ3Zk7$jRCGk{AqrJANV}44~ulUbuqi!0B02{+k zg-VP);P$$4-y#Vqjw3R2QaiO}qB38p>xUD(T-OGRT&W*$j*x<&8RW700XWBBt3Mp1 z*=#>iJYpT@Bk3vrdHoacQ{L^LsCF=`ljNSa1O9V%wQW;CXjNDFWUxItc-$r4p|Gkfia~}KP$5vhP`kj z*Nzg$s#8?P@HCc26$=|KopC)Uv71QaHZ4Rsf0G`=Ln9Z#sLHBXG_*&^Wwvg3g{+!% zDw(Ehm{*!$(TGJ?FyyVtf0vdUZo*`E+ixqf@s$d00AKWRW1#K_oPwc&D#D)js``4qP$Nj1Q~*Vw5Q zN$%tK8}}~R;-do-)2WFpqpHLL1Zf1kw&G7G;>U*)BPS9=eIo;d@fbTvqaqtbnq;ZF zK+2YHB~J8>mc5&Eu#<=#9~)ql1`%r|YjjcRxWL0V9?*tn`FMSyNvx3R{PPoBK%QHX0iv;uhci~Xo8Elq4 zvq_dsY~8zTg*%#?yi~r~WrE6fglW!UzaIEdb1P`2h2|xIqx|z-E!r{CJI+Hb{XN^~ z(MTR)Ov|OxQ`6(yYrq>gHe7n8<@d5Ca_lUBZcoH177o$e1%78wKzoy#8UA2TAeg{r z#8R=;DH4;VSc*WuzPAC+l>&Q*WN(Fxq%?tD=8KWwH>j4D)$x2jyP1PuGKga`R2Wm{ zvc~pp63O$W-$p)_{S-ojkp?DKcpE#+LU5MX!aE^ciirpd*jwjPHv0pL=qfM}1^Y?rARqeNZ)#k8SZJqc$?)f_ZXYbR# UQ5-H?atpI_7uZHnpFD8*KRrOacmMzZ delta 3090 zcmb7GYit}>6`p(NvEzOD{fgbhj@#Jl##x8han(E&$Lm&cVteb|QfJ#{v-XUgeXs9~ z(>lz?(1fNm6dYeFp%x-rt<;zwps?i+2q{8{htvWRzZi-@qG~1hQ-OpKNQiUp#&H^f z1Us50$v!HY?@^@+r$U*}xG0 ztNb2$v~oxJHQ~S1o*+@);)(GkPiL?O?4t28c&#D+rsvCKkoW1~nsrCY_|^zp=jZhf zvd$g-&>ksM?|72UjwiFrk&=zT(XruoJe!0_OE(L1{1bh+et%hUq>VO*Y?88y9Q&awK>>ptN~YDeL%k^yF^fqV}FF1sDDzXi}!j?rxQ` zDpCv;9NFtgilB~2R7!S%4k^e?kk77Af+8~g4Vm5BuI zt@C}}8PdyFyzfvp$`AP#W^33nh>EMk(|MDP;!w3=Xt~5@Pr)=1n9dmx@JVYCSzH+g zE-5jLXB7e{Ee(1zfF$ukNsU_f$M== zJl5S9aJ|gT7cZJgJ6+22Uj_PCF<%P2GHUuefI-UCq1Jl_EmIrzogr5UY*S%#hGM8! z1tlU~A!YfRv_K3EXu2Z{iURx!aC@?ZMNzV>78FM*t2T91!(-^L(XzIr7&UkG$Q#P) zrX)l?hF1_h_o?>%7uB~MPgxg=bug&kb?+x&MBg#u=x7SoHQ^Ao{^V$ezg^0xhCd6l z3F#$b1dKoscBG+EI2g73hrz2yFd8w8#x8(G*zfZVW#W*GWJp<=DGs?omz0>aMW(ih z8-SCskY;()z>M*WwYy1~2kIYL&801SzL+l^pC_PZ`$u7b`WxZ3b^{3gEoJhGgcjN) zn?UUD*$_$JqU-{2x^g@=#?mm_BJ5fC>{J8`!t^qdY7v?M_|IxB@q2AnF%OS2+3#|3=-DWR`ze*GD+SD!i(>a?UKU z7Ua+oIsjZXZJT+E&B8cTJvn0Au3{7mX2O48;7bX0IvY=yTxwg1nwXh0=do!ef@Utg zn4Zg-XG~+!WQqEM`NF43!nMb%UJ3`JV9kct>IaY%h2RsUb)i-^;{}HXQYn5!E;T|`9y?YfMvFV5mqn3@J;^b zrtp7U`6fTsd?0`_A;RLHmiiW7Yo2R(5sBDGLX`P%oV=H~@AJ-<2sy=5Eq&xg{%Xs( zZweWNnhEZLZn zgDy+#DD*rHyE2gqZ4QO<^+5TmSunD*VngrF$j~QAR%JHu$T-hZX4|@D7xn|CX2Xj; z;Q6lSXjz6{j}pF%61xmq{0=mAxC<`hV+U~M_!VLYp&Na0pK8kP*tI~ZLk2@Ol&g}V zLa%}A0#vA|!k}=zwbW*1wEbm6b3 zb4ah}?|1aB`X)zblkrp0OQ~AdCXOrs zS3Q#iEpFYm462NsN{q9su)3XwbI2}ExgSSKfJ9A^uXOf?ehg#LJ0zc%?uKUXCqd$s zcM~c%K;!pQMec$Ez0}AzI~o<((7DP-oqv?i;X!hPvH1(8v79rFsUlo8411h#i?!kC z3PKS<9Ko8g>8U4@@w3r!S6?m}Dcc--hCKtzZZMx>+2s6o^J6!7Z}&rWc)hWg5vu-+ zNG4$ZvBdM;4--;Z?_MS3ByZ^Hfu;+5@33$#`YlGL@*GV0q`zO7c4tfm^Yb< z)UyB~wR#rt7N{lxi>Bgj~wn4{jDcIs})9RR;sf7o-}&b`&HPt^c?5h$!VyI}^^l z1sv6V%;E@>$R0-!Ct3vHYdEc@op%m|G|>Sj`RRd?@HJctBMc(!18_ZNVQJZ1HbcsT zF@bPE54#0S6P2G2$b@`}zki^ot(sO8RamNExN%6L{-dKIX4<)gs^a*y!28@cKc-bL7{4!jND;UhzlMiCSI zXOqz2uhglC#ftnZL%a3}`Olz~h|BkIv=`whLWKWxsE>S}e=^kV6ZWf_;+?~NwZfFR zDZT@&*LiICI{dx*{cvjlYihf2Ugq-QgXA_JKK$9IPN2&32%=wzJ`ly}b%YxTqVVvT zFf45LHUegyVQ`u74mZ!xB)h{uINV?Rs21: - # ts = self.TipsSet - ConfirmedTip = [i for i in self.TipsSet if i.ConfirmedTime!=None] - OkTip= [i for i in ConfirmedTip if Time-i.ConfirmedTime<=TSC] - if len(OkTip)<=2: - ts= self.TipsSet - else: - ts= OkTip + ts = self.TipsSet + # if Msg.ConfirmedTime!=None: + # if Time-Msg.ConfirmedTime<=TSC: + self.ConfirmedTip = [i for i in self.TipsSet if i.Confirmed] + + # # # ParentContip = [i.Parents for i in ConfirmedTip] + # # # kkk= [[] for i in range(len(ParentContip))] + # # # for j in range(len(ParentContip)): + # # # for value in ParentContip[j].values(): + # # # kkk[j].append(value.ConfirmedTime) + + # # # for i in range(len(ConfirmedTip)): + # # # for j in range(len(kkk[i])): + # # # if ConfirmedTip[i].ConfirmedTime - j<=TSC: + # # # OkTip.append(ConfirmedTip[i]) + + # OkTip= [i for i in ConfirmedTip if Time-i.ConfirmedTime<=TSC] + # if len(OkTip)<=2: + # ts= self.TipsSet + # else: + # ts= OkTip Selection = sample(ts, k=2) else: eligibleLedger = [msg for _,msg in self.Ledger.items() if msg.Eligible] - - ConfirmedTip = [i for i in eligibleLedger if i.ConfirmedTime!=None] - OkTip= [i for i in ConfirmedTip if Time-i.ConfirmedTime<=TSC] - if len(OkTip)<=2: - neweligibleLedger= eligibleLedger - else: - neweligibleLedger= OkTip + self.ConfirmedTip = [i for i in eligibleLedger if i.Confirmed] + # ConfirmedTip = [i for i in eligibleLedger if i.ConfirmedTime!=None] + # OkTip= [i for i in ConfirmedTip if Time-i.ConfirmedTime<=TSC] + # if len(OkTip)<=2: + # neweligibleLedger= eligibleLedger + # else: + # neweligibleLedger= OkTip - if len(neweligibleLedger)>1: - Selection = sample(neweligibleLedger, k=2) + if len(eligibleLedger)>1: + Selection = sample(eligibleLedger, k=2) else: - Selection = neweligibleLedger # genesis + Selection = eligibleLedger # genesis assert len(Selection)==2 or Selection[0].Index==0 return {s.Index: s for s in Selection} @@ -202,16 +234,32 @@ def update_tipsset(self, Msg, Time): If the oldest unconfirmed message in the past cone of the tip (time since confirmation) is too far in the past, the message is discarded from the selection but temporarily kept in the tip set. + ConfirmedTip = [i for i in self.TipsSet if i.ConfirmedTime!=None] """ self.Inbox.update_ready() + + #self.add_tip(Msg) # Normal tip update if OWN_TXS or Msg.NodeID!=self.NodeID or MODE[self.NodeID]>=3: - if MAX_TIP_AGE is None: - self.add_tip(Msg) - elif Time-Msg.IssueTime < MAX_TIP_AGE: + + # tt=Msg.contime(self, Time) + # if tt is not None: + # self.Delayconfirmedtime.append(tt) + # # self.add_tip(Msg) + # # if MAX_TIP_AGE is None: + if Time>TSC_Th: + tt = Msg.TXEcheck(self, Time) + if tt is not None: + self.Delayconfirmedtime.append(tt) + if tt is not None and Time-tt<=TSC_Th: + self.add_tip(Msg) + else: self.add_tip(Msg) + + + # if this is a malicious nodes own message and ATK_TIP_RM_PARENTS is False, then don't remove the tips it selected as parents if MODE[self.NodeID]>=3 and Msg.NodeID==self.NodeID and not ATK_TIP_RM_PARENTS: pass @@ -258,10 +306,34 @@ def schedule(self, TxNode, Msg: Message, Time): Msg.mark_confirmed(self) Msg.Eligible = True self.update_tipsset(Msg, Time) + + # if len(self.UnconfMsgs)!=0: + # self.Unconsgcheck(Time) + + Msg.EligibleTime = Time # broadcast the packet self.forward(TxNode, Msg, Time) + + # def Unconsgcheck(self,Time): + + # Msg = self.UnconfMsgs.copy() + + # sorted(Msg, key=lambda x: self.UnconfMsgs[x].IssueTime) + + # for _,i in list(Msg.items()): + # if Time-i.IssueTime>=150: + # self.UnconfMsgs.pop(_) + # else: + # break + + + # for _,p in list(self.UnconfMsgs.items()): + # if p.Orphan: + # self.UnconfMsgs.pop(_) + + def forward(self, TxNode, Msg, Time): """ By default, nodes forward to all neighbours except the one they received the TX from. diff --git a/main.py b/main.py index edf7e71..cfe4bdf 100644 --- a/main.py +++ b/main.py @@ -138,7 +138,9 @@ def main(): 'Solidification Buffer Length', 'Maxtime of delayed message', 'Maxtime delayed tx NodeID', - 'Maxtime of malicious delayed message'] + 'Maxtime of malicious delayed message', + 'Number of confirmed tips in tip pool', + 'Maximum updated confirmed time'] # self.Updateconfirmedtime dirstr = os.path.dirname(os.path.realpath(__file__)) + '/results/'+ strftime("%Y-%m-%d_%H%M%S", gmtime()) os.makedirs(dirstr, exist_ok=True) os.makedirs(dirstr+'/raw', exist_ok=True) @@ -176,6 +178,8 @@ def simulate(per_node_result_keys, dirstr): ServTimes = [[] for NodeID in range(NUM_NODES)] ArrTimes = [[] for NodeID in range(NUM_NODES)] interArrTimes = [[] for NodeID in range(NUM_NODES)] + Delayconfirmedtime= [[] for NodeID in range(NUM_NODES)] + AllTXconfirmedtime = [[] for NodeID in range(NUM_NODES)] for mc in range(MONTE_CARLOS): """ Generate network topology: @@ -232,6 +236,10 @@ def simulate(per_node_result_keys, dirstr): per_node_results['Number of Unconfirmed Messages'][mc][i,NodeID] = len(Node.UnconfMsgs) per_node_results['Solidification Buffer Length'][mc][i,NodeID] = len(Node.SolBuffer) + + per_node_results['Number of confirmed tips in tip pool'][mc][i,NodeID] = len(Node.ConfirmedTip) + + if len(Node.Inbox.DelayedMessTime)!=0: per_node_results['Maxtime of delayed message'][mc][i,NodeID] = max(Node.Inbox.DelayedMessTime) else: @@ -242,25 +250,25 @@ def simulate(per_node_result_keys, dirstr): else: per_node_results['Maxtime of malicious delayed message'][mc][i,NodeID] = 0 + + if MODE[NodeID]<3: + if Node.UnconfMsgs: + # Msg = Node.UnconfMsgs.copy() + # sorted(Msg, key=lambda x: Msg[x].IssueTime) + # Msg = {p for _,p in Msg.items() if p.Orphan== False} + OldestMsgIdx = min(Node.UnconfMsgs, key=lambda x: Node.UnconfMsgs[x].IssueTime) + age = T+STEP-Node.UnconfMsgs[OldestMsgIdx].IssueTime + while age>=150: + Node.UnconfMsgs.pop(OldestMsgIdx) + OldestMsgIdx = min(Node.UnconfMsgs, key=lambda x: Node.UnconfMsgs[x].IssueTime) + age = T+STEP-Node.UnconfMsgs[OldestMsgIdx].IssueTime - # length = [] - # for i in Node.Inbox.DelayedTxNodeID: - # if i!=[]: - # length.append(len(i)) - # else: - # length.append(0) - - # a= length.index(max(length)) - # per_node_results['Maxtime delayed tx NodeID'][mc][i,NodeID]= a - - #if len(Node.SolBuffer)>100: - #print("Solidification issue") - if Node.UnconfMsgs: - OldestMsgIdx = min(Node.UnconfMsgs, key=lambda x: Node.UnconfMsgs[x].IssueTime) - age = T+STEP-Node.UnconfMsgs[OldestMsgIdx].IssueTime - else: - age = 0 + else: + age = 0 + per_node_results['Max Unconfirmed Message Age'][mc][i,NodeID] = age + + print("Simulation: "+str(mc) +"\t 100% Complete") OldestTxAge.append(np.mean(OldestTxAges, axis=1)) for i in range(SIM_TIME): @@ -285,7 +293,12 @@ def simulate(per_node_result_keys, dirstr): ArrWorks = [x for _,x in sorted(zip(Net.Nodes[NodeID].ArrivalTimes,Net.Nodes[NodeID].ArrivalWorks))] interArrTimes[NodeID].extend(np.diff(ArrTimes[NodeID])/ArrWorks[1:]) inboxLatencies[NodeID].extend(Net.Nodes[NodeID].InboxLatencies) - + + Delayconfirmedtime[NodeID]= sorted(Net.Nodes[NodeID].Delayconfirmedtime) + AllTXconfirmedtime[NodeID]= sorted(Net.Nodes[NodeID].AllTXconfirmedtime) + + + latencies, latTimes = Net.msg_latency(latencies, latTimes) del Net @@ -316,6 +329,7 @@ def simulate(per_node_result_keys, dirstr): np.savetxt(dirstr+'/raw/avgOldestTxAge.csv', avgOTA, delimiter=',') np.savetxt(dirstr+'/raw/avgUnsolid.csv', avgUnsolid, delimiter=',') np.savetxt(dirstr+'/raw/avgEligibleDelays.csv', avgEligibleDelays, delimiter=',') + for NodeID in range(NUM_NODES): np.savetxt(dirstr+'/raw/inboxLatencies'+str(NodeID)+'.csv', np.asarray(inboxLatencies[NodeID]), delimiter=',') @@ -325,6 +339,11 @@ def simulate(per_node_result_keys, dirstr): np.asarray(ServTimes[NodeID]), delimiter=',') np.savetxt(dirstr+'/raw/ArrTimes'+str(NodeID)+'.csv', np.asarray(ArrTimes[NodeID]), delimiter=',') + np.savetxt(dirstr+'/raw/Delayconfirmedtime'+str(NodeID)+'.csv', + np.asarray(Delayconfirmedtime[NodeID]), delimiter=',') + np.savetxt(dirstr+'/raw/AllTXconfirmedtime'+str(NodeID)+'.csv', + np.asarray(AllTXconfirmedtime[NodeID]), delimiter=',') + nx.write_adjlist(G, dirstr+'/raw/result_adjlist.txt', delimiter=' ') return per_node_results.keys() @@ -349,10 +368,13 @@ def plot_results(dirstr, per_node_result_keys): avgMeanDelay = np.loadtxt(dirstr+'/raw/avgMeanDelay.csv', delimiter=',') #avgMeanDelay = np.loadtxt(dirstr+'/avgMeanVisDelay.csv', delimiter=',') avgOTA = np.loadtxt(dirstr+'/raw/avgOldestTxAge.csv', delimiter=',') + latencies = [] #inboxLatencies = [] ServTimes = [] ArrTimes = [] + Delayconfirmedtime =[] + AllTXconfirmedtime = [] for NodeID in range(NUM_NODES): if os.stat(dirstr+'/raw/latencies'+str(NodeID)+'.csv').st_size != 0: @@ -369,6 +391,8 @@ def plot_results(dirstr, per_node_result_keys): ''' ServTimes.append([np.loadtxt(dirstr+'/raw/ServTimes'+str(NodeID)+'.csv', delimiter=',')]) ArrTimes.append([np.loadtxt(dirstr+'/raw/ArrTimes'+str(NodeID)+'.csv', delimiter=',')]) + Delayconfirmedtime.append([np.loadtxt(dirstr+'/raw/Delayconfirmedtime'+str(NodeID)+'.csv', delimiter=',')]) + AllTXconfirmedtime.append([np.loadtxt(dirstr+'/raw/AllTXconfirmedtime'+str(NodeID)+'.csv', delimiter=',')]) """ Plot results """ @@ -411,6 +435,8 @@ def plot_results(dirstr, per_node_result_keys): per_node_plot(avgEligibleDelays, 'Time (sec)', 'Age of Messages Becoming Eligible', '', dirstr, avg_window=20, step=1) per_node_plot(avgUnsolid, 'Time (sec)', 'Unsolid', '', dirstr) + + per_node_barplot(REP, 'Node ID', 'Reputation', 'Reputation Distribution', dirstr+'/plots/RepDist.png') per_node_barplot(QUANTUM, 'Node ID', 'Quantum', 'Quantum Distribution', dirstr+'/plots/QDist.png') @@ -418,6 +444,7 @@ def plot_results(dirstr, per_node_result_keys): all_node_plot(per_node_results['Number of Unconfirmed Messages'].sum(axis=1), 'Time (sec)', 'Number of Unconfirmed Messages', '', dirstr+'/plots/AllUnconfirmed.png') all_node_plot(avgPIT, 'Time (sec)', 'Number of packets in transit', '', dirstr+'/plots/PIT.png') all_node_plot(avgOTA, 'Time (sec)', 'Max time in transit (sec)', '', dirstr+'/plots/MaxAge.png') + # all_node_plot(per_node_results['Number of confirmed Messages'].sum(axis=1), 'Time (sec)', 'Number of confirmed Messages', '', dirstr+'/plots/Allconfirmed.png') per_node_delayedTX_plot(per_node_results['Maxtime of delayed message'], 'Time (sec)', 'DelayedTXTime', '', dirstr) # per_node_delayedTX_plot(per_node_results['Maxtime delayed tx NodeID'], 'Time (sec)', 'DelayedTXNodeID', '', dirstr) From c6961439eb01a86bdfaea6379d90837e16ba4ab4 Mon Sep 17 00:00:00 2001 From: Mona <56074102+Mona566@users.noreply.github.com> Date: Thu, 11 Aug 2022 14:24:21 +0100 Subject: [PATCH 2/4] Add files via upload --- message.py | 246 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 246 insertions(+) create mode 100644 message.py diff --git a/message.py b/message.py new file mode 100644 index 0000000..7bd1355 --- /dev/null +++ b/message.py @@ -0,0 +1,246 @@ +from .global_params import * +from copy import copy + +class Message: + """ + Object to simulate a transaction and its edges in the DAG + """ + def __init__(self, IssueTime, Parents, Node, Network, Work=0, Index=None, VisibleTime=None, Milestone=False, EnterScheduletime= 0, InScheduletime= 0, MessageInFlag = True): + self.IssueTime = IssueTime + self.VisibleTime = VisibleTime + self.EnterScheduletime = EnterScheduletime + self.InScheduletime = InScheduletime + self.MessageInFlag = MessageInFlag + self.Parents = Parents + self.Children = [] + + self.Network = Network + self.Index = Network.MsgIndex + self.Milestone = Milestone + Network.InformedNodes[self.Index] = [] + Network.ScheduledNodes[self.Index] = [] + Network.ConfirmedNodes[self.Index] = [] + self.Work = Work + self.CWeight = Work + self.LastCWUpdate = self + self.Dropped = False + self.ConfirmedTime = None + self.LastConfirm = self + self.Time1 = [] + self.q = [] + self.k = {} + self.Pastcone = [[] for i in range(100)] + self.TXConfirmedtime = [[] for i in range(100)] + self.layer= 0 + self.Parentcone = [[] for i in range(1000)] + + + self.Orphan = False + self.Maxconcone = 0 + + + + if Node: + self.Solid = False + self.NodeID = Node.NodeID # signature of issuing node + self.Eligible = False + self.Confirmed = False + self.EligibleTime = None + self.Pastcone[0].append(self) + self.TXConfirmedtime[0].append(self.ConfirmedTime) + Network.MsgIssuer[Network.MsgIndex] = Node.NodeID + else: # genesis + self.Solid = True + self.NodeID = 0 # Genesis is issued by Node 0 + self.Pastcone[0].append(self) + self.TXConfirmedtime[0].append(self.ConfirmedTime) + self.Eligible = True + self.Confirmed = True + self.EligibleTime = 0 + self.ConfirmedTime = IssueTime + Network.MsgIndex += 1 + + + def mark_confirmed(self, Node = None, Confirtime=None): + self.Confirmed = True + self.ConfirmedTime = Confirtime + self.Network.Nodes[self.NodeID].AllTXconfirmedtime.append(self.ConfirmedTime-self.IssueTime) + # self.ConChilup() + # self.TXConupdate(Node) + + + assert Node.NodeID in self.Network.ScheduledNodes[self.Index] + assert not Node.NodeID in self.Network.ConfirmedNodes[self.Index] + self.Network.ConfirmedNodes[self.Index].append(Node.NodeID) + if len(self.Network.ConfirmedNodes[self.Index])==NUM_NODES: + if self.Index in self.Network.Nodes[self.NodeID].UnconfMsgs: + self.Network.Nodes[self.NodeID].UnconfMsgs.pop(self.Index) + self.Network.Nodes[self.NodeID].ConfMsgs[self.Index] = self + for _,p in self.Parents.items(): + if not p.Confirmed: + p.mark_confirmed(Node, Confirtime) + + def updateCW(self, Node, updateMsg=None, Work=None, UPdateCWtime=None): + if updateMsg is None: + assert Work is None + updateMsg = self + Work = self.Work + else: + assert Work is not None + self.CWeight += Work + if self.CWeight >= CONF_WEIGHT: + self.mark_confirmed(Node,Confirtime=UPdateCWtime) + + self.LastCWUpdate = updateMsg + for _,p in self.Parents.items(): + if not p.Confirmed and p.LastCWUpdate != updateMsg: + p.updateCW(Node, updateMsg, Work, UPdateCWtime) + + + def TXEcheck(self, Node, Time): + + ''' + Object to do BFS for new incoming tip + ''' + layer= 0 + Elenumber =[] + historycone = [] + CheckedTime = [] + Break_flag = False + + while [True for kk in self.Pastcone[layer] if kk not in Elenumber] and self.Pastcone[layer]!=[] and not Break_flag: + if Elenumber!=[]: + for j in self.Pastcone[layer-1]: + if j in Elenumber: + Elenumber.remove(j) + + for i in self.Pastcone[layer]: + if not Break_flag: + if i not in Elenumber: + Elenumber.append(i) + + if i in self.Pastcone[layer]: + if self.Pastcone[layer].index(i)==0: + layer+=1 + + if Time-i.IssueTime Date: Thu, 11 Aug 2022 14:27:52 +0100 Subject: [PATCH 3/4] Delete message.py --- message.py | 246 ----------------------------------------------------- 1 file changed, 246 deletions(-) delete mode 100644 message.py diff --git a/message.py b/message.py deleted file mode 100644 index 7bd1355..0000000 --- a/message.py +++ /dev/null @@ -1,246 +0,0 @@ -from .global_params import * -from copy import copy - -class Message: - """ - Object to simulate a transaction and its edges in the DAG - """ - def __init__(self, IssueTime, Parents, Node, Network, Work=0, Index=None, VisibleTime=None, Milestone=False, EnterScheduletime= 0, InScheduletime= 0, MessageInFlag = True): - self.IssueTime = IssueTime - self.VisibleTime = VisibleTime - self.EnterScheduletime = EnterScheduletime - self.InScheduletime = InScheduletime - self.MessageInFlag = MessageInFlag - self.Parents = Parents - self.Children = [] - - self.Network = Network - self.Index = Network.MsgIndex - self.Milestone = Milestone - Network.InformedNodes[self.Index] = [] - Network.ScheduledNodes[self.Index] = [] - Network.ConfirmedNodes[self.Index] = [] - self.Work = Work - self.CWeight = Work - self.LastCWUpdate = self - self.Dropped = False - self.ConfirmedTime = None - self.LastConfirm = self - self.Time1 = [] - self.q = [] - self.k = {} - self.Pastcone = [[] for i in range(100)] - self.TXConfirmedtime = [[] for i in range(100)] - self.layer= 0 - self.Parentcone = [[] for i in range(1000)] - - - self.Orphan = False - self.Maxconcone = 0 - - - - if Node: - self.Solid = False - self.NodeID = Node.NodeID # signature of issuing node - self.Eligible = False - self.Confirmed = False - self.EligibleTime = None - self.Pastcone[0].append(self) - self.TXConfirmedtime[0].append(self.ConfirmedTime) - Network.MsgIssuer[Network.MsgIndex] = Node.NodeID - else: # genesis - self.Solid = True - self.NodeID = 0 # Genesis is issued by Node 0 - self.Pastcone[0].append(self) - self.TXConfirmedtime[0].append(self.ConfirmedTime) - self.Eligible = True - self.Confirmed = True - self.EligibleTime = 0 - self.ConfirmedTime = IssueTime - Network.MsgIndex += 1 - - - def mark_confirmed(self, Node = None, Confirtime=None): - self.Confirmed = True - self.ConfirmedTime = Confirtime - self.Network.Nodes[self.NodeID].AllTXconfirmedtime.append(self.ConfirmedTime-self.IssueTime) - # self.ConChilup() - # self.TXConupdate(Node) - - - assert Node.NodeID in self.Network.ScheduledNodes[self.Index] - assert not Node.NodeID in self.Network.ConfirmedNodes[self.Index] - self.Network.ConfirmedNodes[self.Index].append(Node.NodeID) - if len(self.Network.ConfirmedNodes[self.Index])==NUM_NODES: - if self.Index in self.Network.Nodes[self.NodeID].UnconfMsgs: - self.Network.Nodes[self.NodeID].UnconfMsgs.pop(self.Index) - self.Network.Nodes[self.NodeID].ConfMsgs[self.Index] = self - for _,p in self.Parents.items(): - if not p.Confirmed: - p.mark_confirmed(Node, Confirtime) - - def updateCW(self, Node, updateMsg=None, Work=None, UPdateCWtime=None): - if updateMsg is None: - assert Work is None - updateMsg = self - Work = self.Work - else: - assert Work is not None - self.CWeight += Work - if self.CWeight >= CONF_WEIGHT: - self.mark_confirmed(Node,Confirtime=UPdateCWtime) - - self.LastCWUpdate = updateMsg - for _,p in self.Parents.items(): - if not p.Confirmed and p.LastCWUpdate != updateMsg: - p.updateCW(Node, updateMsg, Work, UPdateCWtime) - - - def TXEcheck(self, Node, Time): - - ''' - Object to do BFS for new incoming tip - ''' - layer= 0 - Elenumber =[] - historycone = [] - CheckedTime = [] - Break_flag = False - - while [True for kk in self.Pastcone[layer] if kk not in Elenumber] and self.Pastcone[layer]!=[] and not Break_flag: - if Elenumber!=[]: - for j in self.Pastcone[layer-1]: - if j in Elenumber: - Elenumber.remove(j) - - for i in self.Pastcone[layer]: - if not Break_flag: - if i not in Elenumber: - Elenumber.append(i) - - if i in self.Pastcone[layer]: - if self.Pastcone[layer].index(i)==0: - layer+=1 - - if Time-i.IssueTime Date: Thu, 11 Aug 2022 14:28:25 +0100 Subject: [PATCH 4/4] Update message.py --- core/message.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/core/message.py b/core/message.py index c1e0999..7bd1355 100644 --- a/core/message.py +++ b/core/message.py @@ -99,13 +99,13 @@ def updateCW(self, Node, updateMsg=None, Work=None, UPdateCWtime=None): def TXEcheck(self, Node, Time): - Flag = True + ''' + Object to do BFS for new incoming tip + ''' layer= 0 Elenumber =[] historycone = [] CheckedTime = [] - Currentparent = [] - Alreadyparent = [] Break_flag = False while [True for kk in self.Pastcone[layer] if kk not in Elenumber] and self.Pastcone[layer]!=[] and not Break_flag: @@ -158,8 +158,6 @@ def TXEcheck(self, Node, Time): if Time-p.ConfirmedTime<=TSC_Th: Break_flag = True break - # else: - # p.Orphan = True