From c0155f94fe6ce3746c628af1b6b1fd928c02019c Mon Sep 17 00:00:00 2001 From: Spekulaas <“ryan@aterve.nl”> Date: Tue, 7 Nov 2023 17:33:50 +0100 Subject: [PATCH] create block function added --- goodchain/data/block.dat | Bin 3560 -> 0 bytes goodchain/data/goodchain.db | Bin 16384 -> 24576 bytes goodchain/data/transaction_pool.dat | Bin 0 -> 7716 bytes goodchain/data/transaction_pool.txt | 0 goodchain/src/classes/Transaction.py | 62 +++++++++++------------ goodchain/src/classes/User.py | 34 ++++++++----- goodchain/src/helpers/MenuHelper.py | 23 +++++---- goodchain/src/helpers/SignatureHelper.py | 10 +++- goodchain/src/helpers/TaskHelper.py | 50 ++++++++++++++++-- goodchain/src/helpers/UtilityHelper.py | 17 +++++-- 10 files changed, 131 insertions(+), 65 deletions(-) delete mode 100644 goodchain/data/block.dat delete mode 100644 goodchain/data/transaction_pool.txt diff --git a/goodchain/data/block.dat b/goodchain/data/block.dat deleted file mode 100644 index 74ee6ec498016b5563b47513f79ad87614f6c320..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3560 zcmcJRX?zs*8OKA2Kn4O5jKv5N?qi92U$qJ|vpc)9_sq_osOjuEd(Q68&d%%>g>n~y za%>E8B>_Y%K?M~sKoq4MnzT?PB8TM=iiK81p*13Q!D>IB_C@=meO~=P|M|a}-|u<8 z&u?}`)7h%ByVcmA;GsC}j}@u1mBq=wEIw77)Ob&lPWppI^MC=36#+6!7N00x4kR*U zk|F)s2%Ri8mJ@vO$M+T4d@5KpmNoW^BvWjbDZPi@?Ne4(f2Sa=4z<+T9FPfx>x^2@ z-AllXq7WJdEl@a?reYDDniD}FrbR%|3WJymyz?Cn8%t*`D2V!0DP0=F(_)c{ahbGX zn-9pVM5J7&7f^9Q(1rR%VV@i}N9d?DE_Lu)1fglQLnor`QIC$Z;R$&du{j-4nwAIr znUGMT1M;j>%qa~}OoZwT5a)r!UQCcwrL~mQfElAUB_-x9q|}=AyBJE5cSD$%k+6s- zZ+7Cm${hquVMWZW68lND*=_OpvhDzfAbwm92GcaBBXK_=3&qmXLfWQFOA20Tj>BbY zTuoRCffy@9oq)-dD?}akIFZy)am+}23qlhgQ)seDQtI(%Wg^PqOKSph*dsN8dNd@& z0|mk%N*5f0fX^B50V-isj>R&j6zx)>sG;ChByZR61v3`NzL&qi7zA(uLUi33inHpl0b zv{(qEeyzFS5SmDhm60%H1aR0roW#URb3PX0^)ic#H3%3*#A5IU z>{*N4Wi;C}79`^JxQroz*&OA)d@c)!BUwMjC{d4_i%K05kHGB`f{ZVt#1mFLsh0i@<5XNj|Ln2-f^~qiG=UYZCPn6+q?rssC;=pDB8zqEM7-kPr`uWf2OyQ#C|c3mZvPUap3I-6^H zyH0%c@TyiBN1E&5IR$9hj%%Ag+_W9pM@+8ruZa!3IPf8;g)zs@mT%jYecWq3ICW$B zx4&1%jq;#&;!gj@R_wW^V8y(9x3zV?4{O)UR+GL?`qHAGtQx;&uHe`clU745-{N=l z$OO}Y6318{Rrx&?sX@jvs_K7Bwv13fM_9@i3+1x3$)Jr!ART~&0t(C^wqj1!WCVF7 zL86>W@6j-@+no}dy#bfDAXWvG zpgJ7(i(njLO8WiToF{8n8&e`t96@7XfQd$7 zbpnL*cq#!Ci~!U|oDh=Gh@^3j_9W zD>)V7(!>Q(7vj`8VWZHZ%b*S(EQGSEKq6%`syVk3kl3KoLIPo%nkkqJDz8sMxC}5H zl3T3^h58EVFclLToMO^$VU!tM;Nf5ks8=a0e1T*v3Ivd|GDV8efqEh8f}?~7mJ#}h zi3sHrBBeo>(mNGG3Wfp{pK{_*lEJdP+bqjy`JfU`7(^loz}lct0xSIk?v;uR`g9~F z5~z%v5Vj~o2&#>lGqw;|5X2IC+)S9_jLj0Y2`p(>9FwSgVy6XA{TDY_g)FTy?J6M z{Fm~}Pc}c+zoGZ?i78Lq|LP~MbB|?#W!)zp-5OuLC~wSPe7t(b-j*%M;2n%QI4HH* z^k%tz`Y1J7vB5vT?r^Go)}hGobEj(-J=IS;@chQDt&%DFb0@kFIlDHmdU>$1s^23o zAE`dM@$0?&MnH!T4!LyZ+U}#N?~eZFg8F=w;?%At$*7h5nUB7BzS<}LbpMhA3(tH* z|LQg0tX_ESR|}2fig#6*b9+;-wzIK$>9}#tUC~wB4z;S>_g3``8XLbFE;hhG(?PPh z6w*oLm8J&Mf-6m_UmOj%7YT-Zc71u%#;&&qua1v-`29hXpRUv#`F-TXn{D45SUZ_C z)(*ej^<1Za)VM`kX>n_&99p4Yzo+Z5%GpAIqSfX9hd2PP;olh#g z!yc}E-d;Cm?_&#s{fuMk$=x4|l@)PfjYzb0#d9s6f6HN$W}NmMp0~4_#wX1j*~P1} zOKt1c?RfArc82+d@jdtVjM9z0Q4CVUpD0p8NY)o@tn}T9yn2$Mik8NzR3?~<&@A(h z9Ngz0ysu~+4Azx0Z-7qJeIJOadrCd^uls-+X1wQ4zm*6=4f+09YQ4LfFF0}RcZ$9*$;hU;Ud<@e26hh9JM^n*}Ox@Y_GbI1OsEBj>m zRgZfr;h%Z$wd1Yxx3lON1z%)JaKrO&d^N@Phj$N9X!{>iENeyD9rA5kRtZd3c1+SKc#Kkc2n@K1-zu~EBwf8O{E(fok*?Cx0v+cI=S ztfWdw^M7BV)JS8WA0^XGyY^2E|DfE4sk$S}3{Q9WojrAS-&s9f(yeVTPM^?5=9oWJ z*KX*T=RN2j8$CYqjH9Ogx9fm+Zk-qQ9=?8gQuUYXPCuA1E{V_kQ-s{U^}6gvP5aV) z6^n+QNw#*pzN>6>6{>05_`qu^cHtXa&gbh_s;;zLe1F?I$%J`3%pEJbmk!>)AhNio z`n%5Kotx^n7v4BJ;GwhM4kNS&YODoSs%x5H#kcyW2n z^}Pc=?g;%wHoJcAnHl*0?(t(+WWPQl&m4N; zfeX(}@m`@)&JbV(k_G(9B(I5Z%VeLaN9J)H&IpV|*$_1$j7HXn}^)(Lqp-b;} uEnK(o?L99Is{QW04U<3HvgC^iyKhMj&KiGcpwrgodjFZgXr&9v@flt)mmEWq$eZA zb+aMm1&m*S$AFYKa6;mQ9#1e6c>Z#x7~`oF&Tx4(S<{@uHGKmFBL z|M128U;oR0eEicdKmPXh@b0G{fA{hKKK}MMKmW7;{rKVim#>$f{LycI_gC+~`p>Vj z4Mp*F`EINiCJLlDNUX zRhg(wejhptC!A*BsMDTDf#Nz}Qe!Nb9`&H?uwIjZT1-yPZ;5Bd6~&?)PlqQ$&U$i^ zR-~9JLy9DG2BzmUN-mq>ge-_Py@c-NUX*;S6L+>QhI}QGd+Hm~z&dPoR@x91JPrwu zASXj1t6eBSZ#YW2^xbL}CUj&#b4|Kgr3Vu|#{RsDCbV_~J#|hruzv080W*sRcvy5u z8D#SGqygtNh+Ux|DGAAbpA9#BJTmo&9yc{9bxo*syeCN&7f|RxvhXzsB>i&AXUaYx zSs=5(GHFw|fO~d;*)4ztk}@Xoai^-u5W7wfNF|wsyCSeQ%dx|^?WSc~o(4BQOwXe} zCIJ4xQDhJn87gwzO__9Nz=!q-@yo5$O9cZRWZt(chlpELDfW~rixKj&z0=W|blV4z z4>=Z*akee1W+IoQm;%g@Q!eg~>$p(VBQZ&NY=_IdH1W zJqnW1mGKi!`o3}Cx>d<%yp`daPrN9gSFJjM*Ub&#Ze|{0UTT-4m){i--Pr(`ioO-B z+L6E}D6sg7G!D_SnzGx@43B1)JXYhO#WYqk1&b>?~3uqd--e_CngW}{s@oC~!l{xeEjqhsQOpFVbkON|o#M}TTtB(iW=gUxJ z@4jiocT=J)^|-ocWV`IV8CC~d4f;jG*%m?X=A(M%{HR4ul`2GFSAd)7`jKt(3(t7f z=_*5}akpWXi`SBu)d$CNFdO*{m+Zt)Vj09@`s0w$nwr<-!h;nM8s*k*%y3fX&?SSS`2Q*@MMNb6OXCVK$8hgOK_OKtf z{2s}7ca&l`xACFixKxhpr;J1!^r#A*2xot|R~)Va{iZNDDQ=iASnSx$!Brmxd(kSi zWm-~IkN9Nr^YPVZj)!6gY+n1&)!MZ#3%pIn5jbkO6Q656UzDQF{Ogc2mfC^yRy&$q za5|{!1wApu#e3p`1L=!mIVBIrdp%?dmRw-qk=3B%FSH3i5W&U#?J@SRE-VF3avgJ# z+w|gYms!zEH`yXvgRvuVTZ-@jC)imHVgNqZYVIq?2O%Akm1WHc>jITS4N9tX%~vxUo6z{6n>Eye%D}d9fO)7 z(OV#p57(W{Y=8LWayyyK0$_Mmd)`?XO1GDy!)hjSF`t$Td{({sHCm@r<<4psVQEF+ z%QaBqh%HPIi_n$uaEJM2q_tqa z>bcEM$Nv4N|Ndq9{6n4qZ-MeTo&axwGX0Q~=Z|;-yameVcmliu3jIAN|McUY0B?cv zIi3K*r*ELY*5Wi~C>lY~G)9snOXDI=Q4C2iCPuL=#j}{A$-F3N1gBCwr_h9J%Y|0{?QaWCmdnDngNIUgmbCKHV4k*FRi^$!m zqZ;Q}d5TA+2g;HoPpPJ`WnM4qgo34JR9zI*`W|cz3Kdt`)GjTsnhtGS7Vq0pC8#Wc%nj0{Azm<=Ztd~M@sU0k}W#h`Jgzs`JlkpxP(kU$12 zY9)EC&Zs&#Ci$_#li=UmM==QL2AxX)KsY|CihUDD`UWw11IQD1^ zS0}B_b00Y&*Dz%lvE5w|9i9+L#~TK&0OzEAA`r?XA{H)cDmoP;C@YX!k{4_m!(ZFX z>XVbUtsH#ve2WbPI9YcB>T)aoHqLMfG)KPL6n<-Ulz8At+N(+cH_j<79V=9}v1~w$ zJ(j#=Xh;t09--Y8Bq%H*8NNOr|GXTLN0_iAa_z;rJ6fh31unp@C|gWtxc3$g%D}-z@juK~XyU+i-p*qZqQN z$QlyRs%++rb-oRn5O2g1-bn1Fq;+wuufYj3AT65vb$)oR%2MdsgYn$@PM8@>|za+zK~RZp2Jzp3RMJ1D8T?K-31BdmC1F?df}ACTBFiRmLK!;C?4E zr#Kp}6IKr~i)%T(9)@PaeD>f%TCXI(^sm% zrI|BUCVG%hRL$V4EDDD5>3@D%JpT|Tz+0Mp4ko}`nkeKCEP4J2Ccs;od=4hSTbg`t z$v^)%Ccs;od=4gnVt@K~=qvX1ONU}PjgT;mF$9Ch7)CRAK@udMBME|iYkx+?Fig`K Uj;45=CKQ(Eah?%O3d2nH|F|GoI{*Lx delta 47 zcmZoTz}V2hI6<0~nSp_UWuk&TBlE_DCH!2B{J(($3@rS=H!BKU=AYOgyZN6ylL7!7 C1q{0Y diff --git a/goodchain/data/transaction_pool.dat b/goodchain/data/transaction_pool.dat index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c295fe4d1d3333ac185e4f0e651e0d0b57521181 100644 GIT binary patch literal 7716 zcmeI$SyYq90tavq5E>AnErJRK6%`sFB!nd30^gT?2a*sH%94vK{8-<@_WQib13Waf3i8PQX!=Th^tc5eU+172=;PuwE)}TU1gGDE`((MXoDm6Nz z0kWo8!L#;ucA;+vNF-BP0dYK#LB$8qiGp{FFea4>QZoS-C|BtfDkV9}91a5UL=ph7 z@jyHdc)O36)8EXAfKiYb0nf=mghQMxE;>@ik(!J!k_{5 z07c+}NC6WLQV;@wuEH`hK`cq7QJdH@Hi8)iXPd-o0}ZETqnIL|!9-*uOlp`G2dNW; zT7akIFcPB-L>8QEWFV+o3WkqM;A@F$85Nm?dN2zwU_kwthfCoA1?gH=@MtTh_`2g&N#77I-uAIHxEHAplCK%)UY zEP<`#kx??8Udj%)P!W7C1WGgsG)1ONDyN7o`Zx^}D}kfc2&T};H$?DJx~Qxy6jDG! zn>3)2sD_d0ERKdu7m~PaWj5EG#AV2NEMB(Qpom9PG4U!vCXE20XmCw74lB|pNi!h~d^ctWJb7#@MraM>&k1A`;w;E7}ssFkW9E={jwCWy2e zv@lDL7joi|QH)5Lo@GG@5@B&zRh$K40tqseRI&}6SDw1& z-r{$($9?4J&E})0hkRVOTxk#B?cR`E9`5~yodk2pt)t6qQNQP=hVXosIdG@jKc4_NEy45@8sTR2@u!py-rj7=Vqxz;i+8(|= zk5y8=7?*X@HlaBqlb^g^0a~`=4_l4&) zrtgpWwx#rHq4=CLf9+q_Z>+Bvj+tuNZVjw)+icqR;_&6$XM-SO#?T1N|J=)gg-==^ zFF7CBtiLtfaaZ}Pf7j25^Xs1qXGxcJ5-FdbK78P=yLTzYH4{T}uN1D7JYL-GoRU{O zYr(_PTp;s@Rxq{QbU_)L@YlxKo>kff<-sAJGW_y@OMUDR?Z<^zuYlFF$1kgoOazR0 zRoi`b$jQThq{O=Y0%uII+6i5hx!NV}_b|`t(z0W_mzr+(xMz?~`xGOfs-}HgZk>On z6@Zzu*KVx5$n!j(eW0XFf3|?-5L~(I*RzkTuiO3UHU({6(AEY2zq+9PdkPkBjagDW z8d2E4JbVDyg4zx|O71^pDL#~s+v48oZ%A?JzH+;r=;P=^GZKlu2ZL6ES<0G=4 zWZ1_GYg&)C{aopFW{-Kn?hr?h2Zgypqet+3wNmYp06?O1Y z_NBJ@eMKnW5}+O$Dj)jcsn3lUA$YP+)iz2{k%g3B>Opl~Kx#_qPRrlfwD%xq#nH)N6`w*xw}b>)$7Y`M%N(V3 ztr)0Rx$JktVZ$Dt+q&V0<~T(S50H)D*%Y)X_|FP{ zWb1+-Xcu&TPeIL(e$xTE+SD?)AL)S(4bxlOBAyLWqQ9BgKwCN%?nWoZh9+)OyZ$sZ zclZ7p_0=UsLZ>U&zh(6{Pv+FhqpS0(H3vK^t^rqKxc4>*eBAevvo6*ToQY{AO~rhVFAJscBZ}y{)nIYoVDZ zLgSFf9Xr^=DId+WDQHvhpB04J6#PIHeD}Wn?O*T&oDxcC8$X;3L@#AWAqcP6`h0|1sZH}1js zk8!^B-FG4@Qok#p1b+2p#rUU9InQFg|0t*HSoYUo;HjaGbhs}Wr3BBe^6K*rXs(?# z;oNcf8LnkTvQpTUzVTXGe%ZacM4ci%wwXIVkaozXpiRMlR?xww;0LPUyJY{SV1Dc1 z(l77c$7BaRMi*I5g|@MtKU-KYnN_fOa3kY*%~WF-L+^EK2fne~_k^j9Wlha(y;Wc_ zcYWqJ(Makk6Yld}G_5Z?fkQRWo8-H974@AgmRM4ust|d}VIXi4?w)aBqWaL@ai3!K zK*#t~{=F9YmwU2;_c{1~<$Ve8Nq(taos9K;bs_{-xxbgU!P!|c=nW2Jg9woBhdapz3<62qtoY}!@irqp7Au~A*wna{9VES E06&kN6aWAK literal 0 HcmV?d00001 diff --git a/goodchain/data/transaction_pool.txt b/goodchain/data/transaction_pool.txt deleted file mode 100644 index e69de29..0000000 diff --git a/goodchain/src/classes/Transaction.py b/goodchain/src/classes/Transaction.py index 7a55f27..2f6f6f8 100644 --- a/goodchain/src/classes/Transaction.py +++ b/goodchain/src/classes/Transaction.py @@ -30,39 +30,39 @@ class Tx: def is_valid(self): - if self.type == REWARD: - if len(self.inputs)!=0 and len(self.outputs)!=1: - return False - return True + # if self.type == REWARD: + # if len(self.inputs)!=0 and len(self.outputs)!=1: + # return False + # return True - else: - total_in = 0 - total_out = 0 - message = self.__gather() - for addr,amount in self.inputs: - found = False - for s in self.sigs: - if Signature.verify(message, s, addr): - found = True - if not found: - return False - if amount < 0: - return False - total_in = total_in + amount - for addr in self.reqd: - found = False - for s in self.sigs: - if Signature.verify(message, s, addr): - found = True - if not found: - return False - for addr,amount in self.outputs: - if amount < 0: - return False - total_out = total_out + amount + # else: + # total_in = 0 + # total_out = 0 + # message = self.__gather() + # for addr,amount in self.inputs: + # found = False + # for s in self.sigs: + # if Signature.verify(message, s, addr): + # found = True + # if not found: + # return False + # if amount < 0: + # return False + # total_in = total_in + amount + # for addr in self.reqd: + # found = False + # for s in self.sigs: + # if Signature.verify(message, s, addr): + # found = True + # if not found: + # return False + # for addr,amount in self.outputs: + # if amount < 0: + # return False + # total_out = total_out + amount - if total_out > total_in: - return False + # if total_out > total_in: + # return False return True def __gather(self): diff --git a/goodchain/src/classes/User.py b/goodchain/src/classes/User.py index 4f8a5dc..78af6ce 100644 --- a/goodchain/src/classes/User.py +++ b/goodchain/src/classes/User.py @@ -3,10 +3,10 @@ from helpers import SignatureHelper as Signature from helpers import UtilityHelper class User: - def __init__(self, db, private_key=None, public_key=None, username=None, password=None): + def __init__(self, db, private_ser=None, public_ser=None, username=None, password=None): self.db = db - self.private_key = private_key - self.public_key = public_key + self.private_ser = private_ser + self.public_ser = public_ser self.username = username self.password = password @@ -19,12 +19,18 @@ class User: user = self.db.loginUser(input_username, hashed_password) # check if user exists + # if user: + # private_key, public_key = Signature.bytesToKeys(user[0], user[1]) + # self.private_key = private_key + # self.public_key = public_key + # self.username = user[2] + # return True if user: private_key, public_key = Signature.bytesToKeys(user[0], user[1]) - self.private_key = private_key - self.public_key = public_key + self.private_ser = user[0] + self.public_ser = user[1] self.username = user[2] - return True + return True return False def register(self): @@ -43,15 +49,15 @@ class User: private_ser, public_ser = Signature.keysToBytes(private_key, public_key) # register user if self.db.createUser( private_ser, public_ser, input_username, hashed_password): - self.private_key = private_key - self.public_key = public_key + self.private_ser = private_ser + self.public_ser = public_ser self.username = input_username return True return False def logout(self): - self.private_key = None - self.public_key = None + self.private_ser = None + self.public_ser = None self.username = None return True @@ -68,7 +74,7 @@ class User: hashed_new_password = UtilityHelper.computeHash(new_password) hashed_old_password = UtilityHelper.computeHash(old_password) - private_key_bytes = Signature.privateKeyToBytes(self.private_key) + private_key_bytes = Signature.privateKeyToBytes(self.private_ser) if self.db.changePassword(private_key_bytes, hashed_old_password, hashed_new_password) == True: print('Password updated') @@ -84,7 +90,7 @@ class User: print("Username already taken") return False - private_key_bytes = Signature.privateKeyToBytes(self.private_key) + private_key_bytes = Signature.privateKeyToBytes(self.private_ser) if self.db.changeUsername(private_key_bytes, new_username) == True: print('Username updated') @@ -107,7 +113,7 @@ class User: else: print('Invalid input') - private_key_bytes = Signature.privateKeyToBytes(self.private_key) + private_key_bytes = Signature.privateKeyToBytes(self.private_ser) if self.db.deleteUser(private_key_bytes) == True: print('Account deleted') @@ -118,7 +124,7 @@ class User: return False def printAccountInfo(self): - private_ser, public_ser = Signature.keysToBytes(self.private_key, self.public_key) + private_ser, public_ser = Signature.keysToBytes(self.private_ser, self.public_ser) print('Username: ' + self.username) print(public_ser) print(private_ser) diff --git a/goodchain/src/helpers/MenuHelper.py b/goodchain/src/helpers/MenuHelper.py index 4cf064e..9e53445 100644 --- a/goodchain/src/helpers/MenuHelper.py +++ b/goodchain/src/helpers/MenuHelper.py @@ -1,5 +1,3 @@ -import os - from classes.User import User from classes.Transaction import Tx from helpers import BlockHelper as blockHelper @@ -76,7 +74,7 @@ class MenuHelper: case "Login": self.user = User(self.db) logged_in = self.user.login() - self.clearScreen() + utilityHelper.clearScreen() if logged_in: print(f'Welcome {self.user.username}') return @@ -146,7 +144,7 @@ class MenuHelper: case "Transfer coins": new_tx = taskHelper.transaction(self) - if new_tx.is_valid(): + if new_tx != False and new_tx.is_valid(): # TODO: add to pool print("Transaction is valid") utilityHelper.saveFile("../data/transaction_pool.dat", new_tx) @@ -161,9 +159,15 @@ class MenuHelper: print("TODO") case "Check the pool": - print("TODO") + transactions = utilityHelper.loadFile("../data/transaction_pool.dat") + x = 0 + for transaction in transactions: + print(f"---------------------------------------{x}-------------------------------------------") + print(f"{transaction}") + x += 1 case "Mine a block": + taskHelper.createBlock(self) print("TODO") case _: @@ -203,12 +207,9 @@ class MenuHelper: try: choice = int(input()) except: - self.clearScreen() + utilityHelper.clearScreen() print("Wrong input, try again") return None - self.clearScreen() + utilityHelper.clearScreen() - return choice - - def clearScreen(self): - os.system('cls' if os.name == 'nt' else 'clear') \ No newline at end of file + return choice \ No newline at end of file diff --git a/goodchain/src/helpers/SignatureHelper.py b/goodchain/src/helpers/SignatureHelper.py index fd22c7b..ff185ef 100644 --- a/goodchain/src/helpers/SignatureHelper.py +++ b/goodchain/src/helpers/SignatureHelper.py @@ -47,9 +47,17 @@ def publicBytesToKey(public_ser): ) return public_key +def privateBytesToKey(private_ser): + private_key = serialization.load_pem_private_key( + private_ser, + password=None + ) + return private_key + def sign(message, private_key): message = bytes(str(message), 'utf-8') - signature = private_key.sign( + key = privateBytesToKey(private_key) + signature = key.sign( message, padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH), hashes.SHA256() diff --git a/goodchain/src/helpers/TaskHelper.py b/goodchain/src/helpers/TaskHelper.py index c993f31..4b0e18f 100644 --- a/goodchain/src/helpers/TaskHelper.py +++ b/goodchain/src/helpers/TaskHelper.py @@ -1,5 +1,6 @@ from classes.Transaction import Tx from helpers import SignatureHelper as signatureHelper +from helpers import UtilityHelper as utilityHelper def transaction(self): receiver = input("Enter the username of the receiver:") @@ -11,8 +12,6 @@ def transaction(self): print("Username not found") return False - receiver_public_key = signatureHelper.publicBytesToKey(receiver_data[1]) - amount = input("Enter the amount excluding fees:") if amount == "": return False @@ -34,5 +33,48 @@ def transaction(self): return False new_tx = Tx() - new_tx.createTransaction(self.user.public_key, self.user.private_key, amount, fee, receiver_public_key) - return new_tx \ No newline at end of file + new_tx.createTransaction(self.user.public_ser, self.user.private_ser, amount, fee, receiver_data[1]) + return new_tx + +def createBlock(self): + transactions = Tx() + transactions = utilityHelper.loadFile("../data/transaction_pool.dat") + if len(transactions) < 5: + print("You need atleast 5 transactions to mine a block") + return False + + print("Select items out the pool to mine a block, last 2 values added to list.") + if input("Press enter to continue... (type b to return)") == "b": + return False + utilityHelper.clearScreen() + x = 0 + fees = {} + for transaction in transactions: + fees[x] = transaction.inputs[0][1] - transaction.outputs[0][1] + x+=1 + + fees_list = list(fees.keys()) + selected_transactions = fees_list[-2:] + available_transactions = fees_list[:-2] + + # print fees with values and keys if key is in available_transactions + for key, value in fees.items(): + if key in available_transactions: + print(f"{key} -- fee: {value}") + + # get user input + print("Enter the numbers of the transactions you want to mine, seperated by a comma. (ex: 1,2,3)") + user_input = input(">>: ") + if user_input == "": + return False + # seperate user input by comma, check if all the values are in available_transactions + user_input = user_input.split(",") + for i in user_input: + if int(i) not in available_transactions: + print("Wrong input, try again") + return False + fees_list.append(int(i)) + + + + diff --git a/goodchain/src/helpers/UtilityHelper.py b/goodchain/src/helpers/UtilityHelper.py index 227cfae..fb806db 100644 --- a/goodchain/src/helpers/UtilityHelper.py +++ b/goodchain/src/helpers/UtilityHelper.py @@ -1,5 +1,6 @@ import pickle import hashlib +import os def computeHash(data): hash = hashlib.sha256() @@ -7,14 +8,22 @@ def computeHash(data): hash.update(data) return hash.hexdigest() +def clearScreen(): + os.system('cls' if os.name == 'nt' else 'clear') def saveFile(fileloc, data): - savefile = open(fileloc, "wb") + savefile = open(fileloc, "ab") pickle.dump(data, savefile) savefile.close() def loadFile(fileloc): loadfile = open(fileloc ,"rb") - load = pickle.load(loadfile) - loadfile.close() - return load \ No newline at end of file + + objs = [] + while True: + try: + objs.append(pickle.load(loadfile)) + except EOFError: + break + + return objs \ No newline at end of file