From 3a4e0caeb8c019fcaaff50090286f5aef634d345 Mon Sep 17 00:00:00 2001 From: Evgeniy Stratonikov Date: Wed, 14 Jul 2021 11:32:54 +0300 Subject: [PATCH 1/5] core/block: add `Nonce` field to header Signed-off-by: Evgeniy Stratonikov --- cli/testdata/chain50x2.acc | Bin 45336 -> 45716 bytes pkg/core/block/block_test.go | 8 ++++---- pkg/core/block/header.go | 17 +++++++++++++++++ pkg/core/native/ledger.go | 1 + pkg/core/native_ledger_test.go | 9 +++++---- pkg/core/test_data/block_1.json | 5 +++-- pkg/core/util.go | 1 + pkg/core/util_test.go | 2 +- pkg/interop/native/ledger/block.go | 2 ++ pkg/rpc/client/rpc_test.go | 20 ++++++++++---------- pkg/rpc/server/server_test.go | 18 +++++++++--------- pkg/rpc/server/testdata/testblocks.acc | Bin 22592 -> 22845 bytes 12 files changed, 53 insertions(+), 30 deletions(-) diff --git a/cli/testdata/chain50x2.acc b/cli/testdata/chain50x2.acc index 4c4e26232288aa1ba477582f950a491beae60d83..0175c453ce5f0fb0a78355f379deaa8b3a55254c 100644 GIT binary patch literal 45716 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 UJTiN89_*Q&qd9%70rG?8e_Z-@i~s-t literal 45336 zcmd4)byO5@{Qr$FEz45U(g@Ne-AjXXcXxL;l1it5Al)F6l7e(MNJ*Cn64G_U`=g)x zzP~>?zxDinf5~mg^$2Bw8Tr;o$007IofB*mZ3HyfkLj~$rOXl@kL=h;~ zF&@?Rqi|d91vUa?0#E=bbU+f^|15F!F>O=7ggCnhA>E=bnc#!>jXSWUKPeDhO-8jw z{>JG5+G+r{r-@P3&WaiS<8rId2%(L#3yELJnR|fYr}Sp0I7@+uMOjuexkE2#D1B`{5hW9)?j-@XFmI3(ZT*2Guvj}AF0=}dDXWZ` z4V~>yB-VOcovKYE|3L|z4l2$itN;4KFO%&%wg}A-?fIEG2~lV~28a|IjoZ&>1Y0FI z`7{ZcvJ*R(OK!%zenUZJM+%A`3(iia5jF@$=B%vVgBitFk6X1kDMJ1Y@JL^96^}JM&H0q zRD3cha2-)Oa8-wyPT(JchCW(~Tu^s~ZUY)i$Px2nktI>{9xG>(n~Uk1Z=JKioH`1_ zhE^xl18b6pb0lr(t{Uq|G>cgCpACBNx=u#$vkZtdq>1U0fWT8gPViMH+f`@2K=>8s z*6ZA)ClxedUsHtN>q!@V>Y{~v%1MfOSj5m5c5ci11{A30`u!16af>J){EV}-v4j-} zybNXIF{-#+jXnRQ_=4J2bUCXw$e<!Te|6g@34g3FEXFVhs03cHG`UwKy|A$%+yRN(*fv0;R9<{1s z0EK~fG@Lv3f7klt6g@=LlUp;-#Tio$LrmVC&`ixpNLhW3n2tJPNpvY0?eUFccpCoG zsw_XkIb?M$Nw47kqU$6XA*V_o4z*MeSekqJd2L!33UwV6?UN6kEZGEbCcRx1Zb}AP zoR5m$n)e~_4rZRe0O9FBqHxrXRub`g+r_?p<`F1a^Nw|6)eQvpjvftoRkM3`67*4JNI`y&htWACtJ2F1S>&6rbRJxCz-NZ7^xC_SAu0iD(009>+=a%;~h-V(x|DzY!MK+2j19P zG!&WLSLR8|6Q#TacRE_%f;?9e($x=X3g{7eJvWtP!=+cmz31QDluES|3PcY$)b)=y zU$)rqvRs;#fWSzeZ?s5pS8y<eynyt0J;INJ*)D?Fib zlDtP+)%xs}e^VdM@u*yRp@#gDgf;WOSVSm*^Lq3mU=2z6e)Ib$z4@=E|Mkp&>Usfy z>u1o&iBMi-wgxsPWZYyTE;jbUcD8r@u8}ht9hrfl1sS&&nT?6Fxt*~S8MoH|E~sZ= zYvF8RU~S=Pa<`nFsi~8RGZ{A%9htp><6TqECXV-u>(G%onmD^S+B$pK-#4#nXJLG| zxRZhD-8)kQYbO&Qy8ms`-sOIkznfzIKim4><*ZCR?w0%2qL7EPiJ+sSfd|?Dqa{}Z zYnS`4_5ZmH1YhWG5ffJvTj&42zYiUmsfoc|0+YM9UU%=z9PM1}e?_x5akQ~;ae9gg+3l_VOSIG zHtBv-uMOlh&i!|iwO-(>$V4+m!LKQ%2K~TCpIigU)hd3N)n6`>1iDhW?TQWeA0uKaEDhd3G`!S@xbbgB8#-$gzI8;KK!n{gXOCsvE*ry#eb+Ex~E6fz^^EwXrJrru>VO796T2*o~P= zGlf%@Lprwvk4{&{3yARq+;^yd7fiLcwVIRt`~1fU5U>^bri~@P3W=%%!eF0Rsp3B% z?>J4vAk&DDkM4KZmTqaF4|eVNnLVudzZ?Pd87as9K^#`jH?Z3SH?~vjl@8Yo%o4QGQy1Q$!qR@*Nv#}Kz zleH1e>-c?3tIs1ryKlzEugD&!H&-GIBdo~Yrk`qg=gRH)(G=t`Q)ExVNPxi99D{iw zJM-Q}o79ww@V(TFH&Nd+w?=N?Sdx5((d{+*x<;JsEAE{CUISi1RIm5urC;*wpquF4 z%z>0^L+FMq2;3Dk?230@=Ym=9WDBpp;WSoH#6?Og@M9AgV7}l8Tx6?Y1vr%I9NG=U znI|0k9HJH{iWe=V_nr`xeyX3Xk^VQmyLasW#Phxs4||tOy*_Jqs!Nuui1wwL65C{A19pG+viXSmrxPrdvli*ng3;Qh}f~n zQeB+Rdd1v+Sdr*)pjMOuYDnqIU=~Y)(T&T}ZpSb0{u^X@$UFadX&tXTXQps|o-T${ z|Fkw1T{xQF=-E>wAkOir62=jiIk_J_YPB8Hb3g-IU(Tf0fm(K>d>i(mHHoGuoCXLy zf`Py4kb9v)9)pxK&)YYi7e`ddSMRsJbHdsM|M7VHw#tQje9ZW0^y`FO=O>%qpXmWq zWbqN(xH358d{Fj^AaKr<_0XrBe2iODkD@t6*Y(=k89CT#0iIh8HQJBSk16&Yb)ZAS zB!`&O)@9h*PJ{P0;%Y0m@m^CzIW#sNVkiBZ-raBZ{}a#q&mQ)!C@G$uVy(}uaS8;S z_&H5PfZyorj0qv0yN+6OT9cLB1bt)_f^lHAhk6R zEMJ^hJ}B#4ZkBHS~~ujW^a-h93|# zdw!Ci*-+*ZnC2)F)R084Lmce4cZQ1I24FgbJ%2Rnf%ub6Ii(*LQ!AZL9!!Ce94-r5 zjER->iyJY?{?JUT&9PntK~g)pQ}~6C(IcST4!W*&-gW-+?tVJ~9`X(qi(gZBaY4nB zdZ^wxWD2(;c5(oJK#)dX>uZsbIyUw&c*;a#1m7wf1KZz}IDEHL*Id1eS@Y$Mvd)Am z*PG0{A*SV~)`knH)sMXFH~3k zk2oM;r6#(QS9}~oqY;F7zC*IidwINtUzU4LpkMhO6?#B(Eadk^4e( zu9VSXpE6IfnZG_C){@I2)Qy*6!{@xNW6TN&g&0r3qrVR3=*}&|?Yl~ zAgZRpBtsZXyb-?5m&V$$ZYqamA);tH@KSR169%G5ZQODqk26`ywhD3Mr=ek7);5m=E5>P(k?& zzFz*czjy-zufBdYC5EnhVWwf}F+^v^M6%L>F# z*V3Tq90b2x^~{$8;jAQL%6?WZS%AO>KHvlV1MBx_Lls-)_yev9z<^}-BwEAk{*Gt* zc<>pp&ptnWdjR+r!>YhSFX%P&LGIe;DoaTcW5fIQ({bvzf73g}Kj3*^iif=eq^^^* zuVy25FoJ+jcKf-xa=zUvm_dkV@~i&DNS35>W*=)SXySJV0g~uB>EC`T$FTC~6J*@* zwy5wc7Gs8BU9v2Z1U>exIp4_^8>qA)k{h^WdTf|G4Kbbo;9mz5DsFnbeT?$;DF_5q zAni+5XZ&nEh!0_~K&MKX@h{ZN1u4g*e!6?^JBB)fABWF+aeXs=0guhk{)IFI%SJ z`k$xK9)oCaYffx|W#JA_P}@6@Q=V0O5RQ+Z-ELw`zdnmU3m40iJnR1D-F^S`pm&e9 zqyngPz?o>rNZgmO<2d)AfB`x~!Z1)} z_iE65zZDezl-8 z%yRM@24LNA^yaD2E=V-hLc4acgpV5jFjaudjR)@hT1|asT(4f}oid?w z!&HcH8!v+@GJ5&p;<=VX78^_idA9&Qp1_<^@gm6*ZXCpT0ziKqtWizBNf(&fek~3H z>XbRqut)+1d+8tymQDVWKXIfcWLu2QKsvWwNcK^jt`uX;u6~wAKS`>2UH0c{^Kl&; zPK$iE^ZHncnC(niBacG0b?HmovzQogB69x=8n{F;*UK$}*2ZqsktJcMZd+mdA|n&lvE-Z-;kn9|Dxl|=clRCdgWes7 zwmiMc;##T2Wt+8|!H^6AOuQH1%A(M@00?=PfVjq;JV;*%v6^3bp>GRGRTRFclfm?#P9mGKf?Iuk_ye6pda~Jk z=SPA&oEMW_DS-vbJ8}skhU*tFb*==_dm!*qfq6L1rOB&rPhL^rZ3_B7zCPVUo{y+f z%dwea3|y*PJlK;hdiAyDy@9ABHFKZllhPIPb_WW>PxkB#bYq?<|E71yf57v;6c2kB zA4^>;b^`%@XVuoGJIM;8Dxi?B%P^C9ir+(?S5aS6z`RiahX`AX?q1i!% z^B`dVb`n$mg@}pu286-By-@5;O)+p$dWi<84iqYz{GItYB$?$Jdd@D1bD)q-P_`Y99_V`{Dl zQZ6A#m=XH(>v5Z;CWw) zhrN5LP+p=0RW6jx0Rm19@Z>jboP#<h{q|1pF;vznHH^MPR9qwKsJhsG z(luNUKe@;RwODc(Pa25UytH22eoxQEQX4v}?QJRfR^*onev9SmQB4GsRr~h7U*6px z@I2_9Z>89mEwGCu*G*%T8xl-2Ty14e9F-d{3g<^e@f5Q{9wkdL6Wl1*EA@All#dis zODTnFuHE>H&688crVO&5gTT)PRY6-9a8RV(=qTVne2pb;+MmvVnXcHW?-@OVKDVKWjQ3Kr>vaTD1c;0lx6)rLy+1V}?w0d_XR)4b^Ft>Wn z0lpD557ApMxGm`4Vr#*2kz)R`+yBIB`Ejieb;u+f3y-i+WB49_=^?~;0v`W$FnugR zghJouPYWv`AfD>EBvt5p83ld_gDp*rf@R^yi}BE*T)E`N_7<->x!(+a#`}ET#rx5t zF8%xwwkEqo##>+HAvr_?Xcx7SBAXdJKl8960(ZK6b61Fi{q}C;J$39*2HZ2s=3z;R zlu|zicLc6@9vZjVxhG`hwKZ$J6ITr$Yof~MqmKIcIm&6zYIgD02mvn78A1@74@Q2RhvuUOsmAhOTN!+ki-NPA}_Cs%8{+r%m z`~lDVQatS4x%VJaJ#IF@eGUZ7pfZ=XCyH85@rMx4XdphfsM}(jS+z{jBTKj5=UP=u z*o!{0I#yhRTj-x?TWUVfrXuK?jSvsARqAV0gt*D`hm&Hat_NGQEsn=2LyRW?^RI&e zJijJvkZmI*i-Lf&b=|Z&6wRjZiy;hVuw~oW9xO#|OCLgYI9(E9<|K{O*;_)THL`qW zp;xc9Qwk+w%$rU^Qquf}3~8py?u(qJEUW6~!HPR>#%C!2#KC@h=f6IJgdsh^`*N5~ zCZ~kSJO+1LPEoj)E1SCn02boBt#uZY7Og@@-8O6t!r85s?f+69>HbuJ521~AW@Sb^ zYT%c5_a_<;dZ*GGQQ9C$kRoIrwo)dlpzTLN&xL1Z)Ft5^`9z>iYugcd=xJWm*dblo zG`&#i26N#Hl5!rGcU_a!&_@KU2VX#7PCc49?Fz!{ihdSv$8xz3Z`}Nb)o7qgQFhv% zqh7x6vuk1hx=+Z@2($gt@Oz)&52u(SzZf3Y#H7?6cjl($WDwZYj8SOnc9PGU{>s%w zwjz+lG@N&(`NQ?e`et3)lETCYbXz|CscL^;Nfl=?Tg{xr0lawh_bFONITdjP-Brzh z(>ts`;CWw)hrMH@rprch-{OzB8}?&f!3m|S8I}z1gb>dd7Fud_Twn6d!fbW=4P7=E z1>S-hdKl<(NnizwL@EB0Ai4VCBtLijrR>hGIUcEv)-2S98B~l#dN_C;|ak2 z>tGTA82DH76-gh}K)^?c+?Omv>Z|>S5C$`h#4|T~4Ps}4u^~Z2o-0ko91dF|QF)|_ zAb>bJ_gs6AR1b>0y|E#0pw02+R1=Zlip=^IeAX3;SYG#W{&@k!!G3#}-kng2x#_Ym zETuA~Eo)mBjVrxe#H2K*fQ>p0#GdFyTJemz3R7bnw`QFjsa4f?ZxS-hwhpFc_rY;! zFjM?6_{+Qd^WX=)<1w5MK5XZD>Rj#CSwWb#7D(pjP3l-gK=P7>ebI2zRYuR^sM->{ zk8%hgvBnwle&D*Q{SjFmFXrb8U=p)l4G8RjBe0=C6uzm0d#*yAay~sMKG?m5(Fgbp zsBL;n{;HSF+_zMfAT4oTXZ`&9*ds#+t$j@6(2G7N!%H4A-Oam6=4Csm5vC$EddEiy zlhj3IY-<^PQPx(eM4(ZqsllXSth6yWn`93BlmPG5p4)=dS%DQY(o`A4#j_$u1M!I! z`G3yFr>!Ek)Dl$`_uV)ZWp3B%aGc#cDeXIkx2Pf;dTTo`NpkVuXb zf>O?&$we)1yZ@tSoin}A*SLa{bF0i&l8mdhDA#jjp#Wha@(xm{*0&-Eu(5#>KOx2w zfcw|M5JkFoDzK<-5$W$b6j3WCLLRQV^$`ez`2{u3BMG-qg~s_Knp+Dsa5%|q*Kk`8 z^@MzIA$U~@i(HURk?GQgE!fBU+QfW4Ue8qIYa|XA!CNo+b=d;xdWeJl_HIpk&BB&Q zCAsh!R%c+?0-7rm)km~P7@_H=)7SPc3O=3<-R`x;v#@SRw@vJ*P*#?YEns~}D5!m-8M9lCzwl*n-2>#Oc%cDliv zXOB)~h@&O{ya(`l`~#kQ*~A0`$3WHHY+)ucMUsk2k-pmJ*}_ZkN-ziv6|)_m@Lc5> z)^{I6xeuK#O;%kdUOARcG=817BJsOO?C`;smksSx!dHIHLdkuu-O{z>CS!;<*+F zK8W!IJo)QjCWfHe8GJUIRcR3Lxo?_M*jHbu_-7CXdu%<0=qRVKbh1JWz3iMpu@knH zzp+E+8o=Y4I2LC-TnB}gWgeeS`HP8X(jHdE(%kiu@F_ZtSTh)wbW%4R?P1=S-R0! zeKNKrMEgWa(8%k+I8{7|dQSQsc`8-t*|C(Z;${p83_!!nC&3M&Rlz9oV`ABq$pyKe zwS98BMmSU>VXbI(U3U5EeSAq(UIBf9@#Fjgzw$lmc0Zl;YcDc?2NnwDC=i&nO)oYp zyykcuGezv{CYgx#EW}$QE{c@e$B>=TA__Q$FTZKX>k^_`q>} zHu>BWVmtu^e;uqr(9<<}g^*|BBM5lKBRN^%UYQyP4`Hxdtf6rm3v8ZobZ3m!DAmUW z&}~eG-MM_qpkPO=SvF0+V#K{F6;;fD?7<||x0Hz16teNTOZ24C9ptfJEBPRw0QcLw zJzE=xR+WL-ujkbXMrSQ-@Q-rdac*a-I2r>Lyu1S04i%_dzkj}61P%}qG(L$K1o|mW zjLOcwU;&L2$BDLRjr{WNeqilE@AecK+}#&FRQU&!;|>KvUWD+J@b3uhx(4e`kz`nf z`hb0ol6-O5_2O8FRibCPo-GWb_8Rx@4cnJO@oy?gz<|JPB?i*@Qi-9)C*#B@TCVOt zo(uAyP;pJ}pix)n#Fg5)otSts97zmnPVe<-i0r)$9BXLL$8Sz9>~U_F!IHeY9dgtd zyW~9e(cxLywE05L$Ve*nY$_))W$SUtPflX#$$^=h!U3${H@09@rq-P1qBluwP<^oI zm=jbT_(OJZQGEZVcZ7ey^S%@hd*_@wlH#bg?ZNlzZrc9Ew+nIjASSDcdpc{Z!)#Es;Vh3JGr2 zPELgdxgO-FK>(t^4u%mdk=t4EgJew%1Pnp^QQVlFXtTBeVX*AP0oR)$)xg1LoZi}5 zY#vIrnL9X%*{0`>T5p`t6tcbCZC(@b%&(N;(0LSy$)JLu8_Qcia8Gk(YB0a4LjHU2 z6!GdkxVI-i%vbqp_C>pFatbSR&datS;tyi?=m`m4=ddq5i&eG8dzFBhB7K4@#5v6} z&qf#}ls_;;#OwQUZ}gXU_v5|~dS~4=Q$U%hb2Skk0OcD?WQeq1tTMOmi32twF1Rt8 z6JkBzJ?l(6rP(KcWokYr?QhY#uM5=;{1OCiri*B_t(l_0VaQ>rgB3cd z#G;-NvNV^s!dnD$VVh<$j3==hRW52w+AJBf#yEgVmg6B>`Heq@1aEXY9oR(nvu!DTGN|iJ`Pu#0Z zCYpPUrMKRcIiB;svr2vL)Z^^dkULwUR*^wMRY*ocNeKeG1&d~LR@WAEzXcMney0IE zN`0Ym4ZFoeMU2;>U_s|CisBtE*6FuF#;06L;whzXjq9>J|5tVzh}7iYtx=FS_6wqSryssFqJ>VUEUk%l(bUL&CF! zNFn1aW{wu<4(fl?JJLVkd0&c$y&DroBu^kdp0vFi_G^nUMHjLHX-3yVi04!gDb~V} z__G~8&^0puK*NV3D2@@N94_x5-npj}1V$VbQ$FuEpDamM8Y1oWvI?&; zOg;C>@_>A|03iG8U==l!T%lIyg;BmBAV_Pb?&DJit)eRkgWbMMCRj`GcYjs<_;$2h zsLm#%Eh?~h#t5T~FnLrvA^*ZFofs|`}Ns}AS(5#^LMpFc>cpbzY z%J1XMO%IKp5kccPt7^#JZZnnnhr`tx$C9=5ga{%N1q|DVZ;IC}Q_ImO z-CUU|g%&JDhH^1=Yx)BE$A5Wuf4${F@1Ejnin|- zm>GfYxOt&@;#ABV=*5&Y zct#0vu;1Q&PK`Ves8F6vawiPW8WGPaB=X9WH_9bBnN5Nk%Z*cEsEwB6MTij|S~pKG zRbs2`?0nRMCC;|vdW53Rn9q+k@yomW3rP=px32$wew&Cqm@Wa9@|b&lbc?E(Ib2dGDb@IV{d$)`GyG+uCRq4G~;K zqW1t;hfquNFpRPd3oWhJGCawq6YkdJkrApy8S=N}@Gq(T5HKtQ-(jcaeJ4~;u5TGV zDjU`Ufe*$f6gUpjHn!1;A~?t|fZfgphGV|^#w`4A>0?%SYaJY)vTfcjxI-@oklOlX zV`>yw#2kY~l~9O}^}fXi{*wV&|U+SVI`>28PU3 zY@X{3BY-qT-PDFx57Ewg7n@jeoH03{1(r6|RKvP^O`Mphu4dExAk#0{xuBG}489*X zsP^Cr8h_#o#KC@h7u-3pUXAanzri?b2KJxBIF{n;mid-*ZWP=F9e=C=qJ#npZ(b&AQ2{uBg> zlAnPz(}eyM86fcZ&S6tE$AibeC zVPXm@ZJ)Y&76%n2F7#T+mOz~CgEXvS8aA{+?dSII&P0>(QQMNz>}q12`rDr2nb0l! zgVpvMR9No)Di{qL5C{A19cz?JN@0yodW}M(kGR4FF;*WZ%6I|_x~^P@MyDgbcEBl_ zXkke~@yb-%kS;P|cYU*y|D7WX z)MxU?AYxAXV}XThozO<{L;gTKmghk>F7QS|_2tx0aC)iqEO9rZaTLJHDQJGCFn#?gMjF4-%}9|Vmtvfe;tfAw|K<*Se}yt7X+NQHAEAx$mXcD zgD}{tuX`fnP~~gy_m$TDUdOEh%A zjmX8=>7liV1w!wU|J<&_JKq4-{dW|wcxQZD1CCYC9`nXsx^;eL7)XlHAA4ebUIxdH zJQaC&-JBNF_FXuBUDOdL2`4-X#bJrrBmf{fTX%TEv$cjX^9VkQTpI)a`R!VrI!F@5 zVmUY=xfy?HFri@WW=b{>_K{SQhZy8houa&Vr`yEljRd|V|B>L7O z#Z{O%UXCc;K8Wa5&Zl6OkXDMz7vZs0r1Ypc-#oP2|4r{`|A6OxDIWID>e!jmFQvKU z`W*;}hO`^F+ICv=DG@?EFGk|HUB-gm(5w-Nw{wJ96q&h_l}9!8G|aWXsSOPQrHzP< zB`9ppI-0l=Dxdrw?5LB zH_)QZ)B|BKZ|oHtJk34-lc2Y z!u}T)WG&=wTWH>dJWT^0b~vk0*Ot zpMHvjCP$}uQJ%*2*VosRduyZea~4|+FQrq5zI ze)nV}p0s0cv_fc1;1Q$1`^o5!p}j*A&B;w@?}r(|8GCeW=xb!3DmoMN%r)FIT(I#= zqrdf&?0O`Ez(db4=GU)k2CUw^Tcoi*d~U>=bs9rR;eQ~C{347=%~!5%74y5hw{Gkg#RmBq|4r}c|A6OxDIWGt83FfZ zGTgQnwhROu(^hHBEUi=s7u$XK zsW5Cbp=$triss$y%I}|AjL$GyaL-z)emZiz-oNx#7;hnJylC8vPqeTukR7QdqD76Q zK;UFot|rlOv`1uj0938a9G7ooimsbAXM(_VIwwbuoUszK6l_?q{WnE3ZxCJAA_0QJ zW{ofF$#}3c>^c!an~q)?+0k5Xffxj>&^cA~9fOjp5xia0yVn2c`5ogQ@Vqa@!`?kf z$W1&PnAr241OZWwbZi;d_!4FzeU9H!Ks$lrKaLsQ=aAQe%Se-AcmO=$HFW;y-`1u8Y50I#V+&iYf4(13fm?Ph1O7-0V z0XdBp@?%f=VWBi3>`;U(vwUONETww$H5A(!^uui5bTrI1x`lsXmE5e7D`a`fgPw0Y zVu(Z{+B$INN4N@00@Y?nL1Q)xGf;X!)guIPu;1PZ7;?iOnJZB#b@D2Cp)0Lgrx_) zGg+R(+TkgOl||Jz*zXTbmG!4kFlVBJch+g=RkoeEdFlVm(nmzw%IL8XC;u$-k1F~+ zfe(e(CHj7SYEs>0dm!-j3%fpE7C0DIZKtaM`1dx8rHIDCHBbd#Mbm)ZJkM(iCWRCB zH`ONQJg&|e{r8eiXVhB+$+OgoOCLK3Nu3vhz^?D*pam8Hhc@ z?$M|Be`ezXXA~U0!tV#@C7l(49h}gfmzhnLbp7*7A z*gI~RqXV3L^c;0n5U?XkYQg%d@7XH{2=T1z5Q>fDdbSz%xXMb`-l&~$Ynp}~)rG%< z>1)YHwUuRR-pc&jsPW?T`rurxK7U#NxXr`$jWySnSK)V0!Zxvk7*D|SzYdmd0m9D@ zlYJL_H}RApP9W^3bJ&`dEQG-ff#=@j)46jEmavn zx!D&TN%E%uf_#m$Ytem5l^an5&&saSy!utpoXw6A;$XkMYchwGk_W&)N2X0vh5+;hLY zyPr?@pm!YFEA#Gjd~MYkI!t4Sg*({Ve43chu`d?05YC%!xy!R@mCyhZ%tMi&s3KR6 zMmi$~m3Q<99OXJ8J*&uywkLPj5#|@#%z2g(_k`b`65|r6(EH6KI10-6LhTnmSCO8M zerEFX{KF`y|X%ILH;LFi?K-;39MJk6^e=QOm zFa+Sz$F55I3$zzODZx4f5c4=AE8?LRNBv%bhb}s`wu{jCxG>@gLUik z?4QZKS=qT8sFikSDL|%;PDGEnrgTzbbumsl?Y6`{ z|I54kiGmM$mzvOTKmUcNG4!Gf%)xqdBFS6=vxf8G!db<${Zp!W$(Mzdtpm$RhtE10 zgCe2Nw##-KIj)n{YQLSmik9!?1cAVc_|&5LT;k8!*O7S~`ADyu+jt503~k9vy&f@o z)QU%(1cQ5DbFa~^?pOk~&CvzXo_pA+L8G*LQa0gR;z-hgz^Vhi=(;r_YqbDR_*BlB z!8h>Qr!;~6s=JP(j6D8pPG~Pbw7 zh2;6s)!WX$!nnJ^NiCtYke`p6eY)GhU?(p67zD+xR#tMtDNKl!33BY65Yv-`?r2ZV+yqWD$m|gL((|p7;asrv59`w_}0f9@$tz5Ku z0vhT<=cLN-lQ9-fp>1p!V?}4#gyQ{EXB)65(Q_^~xlL-Av^vCuc2*5JM%up}iytZR zb(==r9{Xt2pnoFXv|}O|^$&V6W$c`m6m{y>`6QF{%tbwZDFFn29gg#2-es2b605Hh z{0LUc6npGCTiY$bO5+fIiM=ed22K6O(ZqaCU+{CsZj!a#>p8~r=S{|V!(ODZ=kJ;R z(c?^xKj3*^iif=$M7b`UvM--9yL%i$A_CPh;ReO>yfK7$E)e7x(sC!bJv!ZbExyCq zyp8;{e<6v6gk!IB`DYHA@}qtw1*(G=q6?m*Iwaq+UT3f8)(Z_|xA3vLHn)w>qCku% zfb*||6@ir9kf~L@=S)DrScNO4H_^B;riBm&drM8Y^d0aGAP18OimZt>rgchiYY;fe;7#?VSWAP)}W6 zt1nJE;$y$@g_~@?-VRMU&V|s+F~W(q@$;W=^N;plEr;7 zY9ddRW9)K*FEt{pdQBwJ+*jC@UsC_tN%7l`xM~&7%wqqm^hAk^`SZJZ(I@$lrSXK% zS0nZ->U)qEd3To+?YxW1cYIpL&ZOPDXF9cA)Yr#<9bQ0DA$vZ zr;AVs7O%c%3Nf4vMRu(_E-h-Q`#u_GKErAX$O(#*mlEn#{JhuF1UuysfTEtbmxu+g zO^yaJo&fH@4)#JCB#arcEFW+;P#cO_%lJm#$fQ9V!eF+{i(Zc64a2FTT}erd*9R1K zVT|;N*CFjs@}lJ8z7&-=^wJS(i42V39lo&kWuo@;oEi}H{uxwZ06!0+W%&Df(d#Z5 zx6C#@Oy@?bfPtJu+XIOXG&*Dr5o!-aFBY7H-2J!`C%R&0hk4ho&(Gpt6k~i5 zd)EFlb|q_AMw}5L7nmuS;7_j&JFTXID-kPtjE0I?$1+kpF2a7qX6VfHlLrLGGA`Xb z&+MKoI6pZ;UT9-Ciq_dPT8=Pmkg#LdBJ&$ZTObls>@<{jqL5-?|KePzH}#fUJ=J>O zb}{Lia>U@>zv&&%AMm^{#lzkaEq=Q2caFBjYXkvDZ_{e zd6kc!K<*vyUkCH|O{)AUl(m5~0s>Z7^<1FnfzjKjAq;jD#+!ql1y~mLW3kks^b_w< zDAV5l?r+!0els2-P~fce6}nPl{iR%t99G?7eHMXEI8?_n_m{$e`kmr>Bd1GBOV6F8%WEeq#KC-a$WES$taqD)7$Y;T0uZ#U6Gb5ldcL$>EuL5$_q# z>1IyH&hOp>-J7#QHNg^VaS~5Ur;N0T~R^DddAw~slwpVP=7-oS|`I9FP8C%>8J1K7cz$rGdWKAHRC;)d*hE`@9qO4 z{Q4v z#gLp4iMYx_cGdge^p5Wjc;1)dVei)Snm8A}Iw@-1T}NP)h5C$hCi$b}4TN}3Ld%@g zb`MgfQ%%z#ONj8v3qJDO%so}%e4HdT^Ja>G;U=ZWQkq+Pro5487I%11cW^ewn9i%4 zX65W`*?AutVmtx-e;te_!nXqtUaPzL3Iwzgu;zS~7VsmD48mZrtT<~k$$cHHg83o77M)*yf28EPN4+xlAu7 zGkb__&7w-j@osoDda`1bh~<+bm%_2gZlMko)KpLc{qPo1Sx0Bi0o;1wJZ~ z@e&PCY%f27+~Gfb}DYM~*3*4tt8MldYJKoz)`lZdu@ggSk%+8*B20HD!{8e3mtS(zm*%F*Nbr}Aj) z`&3pMDWXPK7%)nsmy=!Yes^<@R(^SRe?!WH-sO;!nN|nMXY+}^)vRfikGdUQ4C^SZ zOXpKIR4{t;N;jnrV3J&Gu*-6U_0zd@xVIleNqPHeepcu-0ZE25&)sq6lGfTK2H3*4 z@#xdt-<)u_kU^QvbR?}p8X3Bq)S|Vi+L~?|CwAewV;xUQhXydrqj8kq=~<~H-FUo$ zbzxFH4+6V;9`-t%ZF7(7Q#d(Tx-s^!p)8$Y^!a{Yf?X+XMBUs%1cjCo1;h}RzsUSB z&k!^H^?c^a&&x|K1FA=4pI7bQ^iJ>(c;1)dVej@*XzM3^ZcXQ=K|o7JNpsCvefQv9 z2=SEq@FPOk#d^WO;&xjWo!4e9nbRd|30~WW++_Y@NKUF9&CO-*Wtxgym}w*;jsNE| zBD6W4M5Km>F7>w_vP*lAdnfeQ!QPI&AewQ8D&qNZH(w<$q#f+E>rp-hVK4zCN6nf@ z2d@g}gUa^riT_t~XW1218%E)w1csqOx}-Y==}}VY?hf%KrKP*OOOa0LP6_FfloToH z7*g_uwe*{;HGK0Y?6vnb&pBtFd*5#L2{=><6w@tJA7_&7WRibM8gD;B?oOQTD7Zsp9b9x_-)}q@s!xZ;k0nmvE*f%h#B=bI zCZqO@W=(rZP2#I5w0vSaW~^#KV7ujGT690#Vq^il!>z%7j#s4)q0&Kh8+sV}Io|V+ zymT-FbbeA)3PcZY-qZryfA<*HS}$*9eA8x@{JK!hkBCNDco!CT`2pOCK3G^ubh#4VMZ(YjutC5|Z;n?8 zX<-6h-=O3U^>FbGVuUyLFgG!fu^b?KKCod@A;oH}d~q;X&0O&f$6WyD#^{R=c`cZG z?I5klIoi{9!{ATr!Q8n8u$t_sZClX@wJyQ>vxN?btzVYBe>NeOo$L)C zD4|1QIe{LrFl>m~$i;kYQ(i?8HlhAzYRZ~|@>2jP)M$ISFBjYw~M{)fv-H z7{%k;eieIoePlu1IV!QT_lKtdq<&`Bki**j)51Ukv?!x`L=Bb>y)FaWDw7h_4GBs5 zYZKk5z{2Z_^zrcMOS*b`+a(bAIcqA#P!$C}b+WCVP>TKA=MhP*O5P!7RiWoVK+@3Q`Sgl6%QIE)bRv}KUf(0O7$6~X7BiM0|gXyiX0&;P@Hz}~X zG+xhuXC42ks!#b8$zpLUXYCR~E$q*Emr0PJx=FcFJEovhu&d*N_i?djW0c|46(wQ-KB3VJ56)QjKL>ij`7+7sg>5HQPxUBcl9@ScXNvOawq>zrRf_T z!+|iblG-GmveLU}Le&28+t_V}tVXjNxhhgwy7Op8%=~s~$x8r`Hr+xnYm|zVNDabd z?Tb==23HVx(Ctd^d7IN`>f#KV{VW6ej)TsKSn5you2Gom@w#4!_LE&;#w&~g(M+Pb zX6|2ysZOvC+$%DG*;O+1c>fk05V+tB-HO$d7ZbyqJkn3{S3l;+&WnwgA7Or(^~AYi**r(9fAdE0w&DC61c7gYJquj=YFt5SC50F?yW&jlSpm`7-{rAkh^MdxKf zyRxEkKYbnWh4;j#_>~D02Auaf^Qswx7^&+5jpq;eo+ zQD>RX$hOlTiLOiR9M+2KBy<9yFqAFD>4vG$w0y8+C5xoeH>RgsI< z-gzXIW~}M{WS1g*o!(C61tUTug(5!J3l00LrOP4LtnLqau_3;{Q-1kxa`*Bt@w~I*e(splEW$5E z$1|I5?}?Ekw?N9Kn;kn*p^RrxMMNqGmB;>g{v+zPe)?Z}<=J9PjFr2X*ztjyF zx-g$bDUiN<6KhUh510~9M{Pb!CbV_OYT$t6#oRPQ9Z$fk2MbfZlGI#Qwq{>d1_4`e z+@#7>CLT+Jp%f-g05tY*T(g~6$JP?_r}kS^-}+QP(vg7Fec+pEFp2|*En&mx94S3g z=;$#FjaY37_2lTI3fI z?+*O4REDK=`?@vD9T>rsVo&pGT7(`LR@XKiiSAE634U{RuPldpe*Wg}Za(;4?q(4Q zmWlD=bdDq6_BK=2ZZOmOLH1686@8UPQQ6rbhwjI-leUI0(nk}r7Ufn;w`nj?HFyq- zRxA8%+C92h@Ihb=!)UY7$#S~*zDaHI&tlBIHrE+&(K6b^kU`lx^^O#a;mhiXD6eb7 z3QC7H`VBP6bi)|zy{VtA;y)XB4F!Th;569n5=1_K8>KZ0!BCA*{hw-L-;@qcaU|T* zj9nTZNlEn4Q_1%69y{oQ?1SilXnDx7u)1!6h8CuZj+ptre*Y$SQh$l(ofY?UC$Onb;0uguD!aZXaeIXF@IP4|nV@2D6N^_?@q`4~?0;Ck>a75{iCC zqoGq~iPH>!Pkn*-l2mlCC~7#MBqkYjbe~IUv758(u zxFV;n56^hGXMQ`65X@_nN%38bm;%ap4mpMvhL&!7r-s(@=<={cO8WE0=3tD#8BQEW zbKBRNe|<445yf@g6lWoB1D4$a`i>6-aR41`<1RNBB|;f`MCSz z-Gie(%MQF1RrFxcm9|gpYnKiRplmPh1W$Ja)WZI77u&!Td*IJ!8v2>Sd^*zlv&0GB z@ZljbHvZ0Ap;1Q%Nf%jLWaY4JEEop>`@qwtRUwn!MB-L|_P)+@I3WWS_Kn}%-Oc6S z%N^x4Cy$#$obpq6h_vn{C$oEM3-p``r?Yu2bhyg4$`XFD-IE_5r<4!+LbifCH> z*#Ya}-mvIx!^0D^^iI_l9OUps$WA7FC19GL4+N%e)I(GNb{2D9B=@tdzLFX*`_Mmp zobHL|^_eoEsG4G7laE8rsMaRH$6X%qo&1TAEXk2{d;9Tu@w^LtHG$;6dEUwWC7yRy z+|QjRiz58z#?Y5=Ng!YecqS?uHt!|7Je1s-jAc!0kH3es&dye~wxUMbK}huH z{k)q0HOsUZUO9>UaX=A1o~9$0L8j ztYDdNIXvfY zT1ms|?=kOf+(&<8E$>i2KD6wE2{GGjzdlyJAd4M?TG$`%P>VJiB2nO~BzIj$azbsJ zR;PtnT^HLw@VC|lTo)erq@a(Q6LwbZo!d}WPx<8_G=cLF+L&pz>lIigWPHnjo4>ic zD;&6&yL78$*6L$UlP`&npG5n)^}cM?U!$zQ@Kx&Nw&%<6&E-7ee63DZ_-v+O42O@u z_v)#O#c-~mHEo)YJ+2igmOTh8H{*@$QOu_M@v{$kRIMvqZPCbgjwesh`yykb5`6?^ zMLmLfPPezIxc-Dp1C=nK#H(C6Gs41|;W_nhMt=&YgH7 z7P@W5l5Xim-yG(q<2ZTPazxQysH{**C#NuG>71ipU!0QDh96}Rt9IcFbvyxz4;D6g zK0O;baI$_i3<7$)n;_wa3T(0FKq*Y{$J<|aaMn}%H=`DwbTRSIiN}yqS*O`oFMUt; zq);{aZ5vKrj``QgadmE;`8Z9{NiNvWnx-UKozP%mRS`}=E$k0>bBawOiF{GTb*V(; za&$e4o5>3Sm6V{y1bkO+E+qi)DqOQJx zkDw=2_Nq`=r1@v-G@YRo9mh+3-fj?BS@B1`pnPiVFGbD^OKXDQb0di}R1<=?@zLOG zZZO+wr`ArheLJF*V{5XoqL~*tHE9Gs7J(F9TfUSJ1#0i@{yS z)S+acnW@?|V5=q0)X50MV8`0W=Z>z-fq25l9)?jANCL{m=SgH{GDte~ID_%D%KA6C zQ~FCh@2t3=yGC#utaffG8qO;a(3as*Wqr5mn)Pca;~5^8-+Ea(oNm1^l%hEycUt+l zrILP#s)Zh#yAVZ~GQ$o13x7^{OldL~C1Amt->n<G^wWX!o$5^b7^F1wB!0sb8% zX`PfCoAkyS#0vdS;ok2gVJ~{<%j<_}tu1YYrrkU~XjUva5rkUUAMPYyu$Pz>;zg*u z7~dMr@d&`y-ac3*i=mF2K(Uc?csh5G_kAjFu7)*c5}RLkp&EPCuUx1}c6)@cq4PR$ z5XEKtH+OeMANO(>kG?<|cNmgDXUxqS3&Ud)@Rgc^S62kK-i?bnEc#N3ZZ;>0t69@h zTSG{zo9D-so7RzpX!u;OiOrbo5{XX<2z-5mJ?1XZl$^LQ>3Lhi0GN|5L*B!jw0$9` zZrBwHnFwl5>G<+SY^*;&ze<^um@liET-3ZZeIXhWP=*R=AO(Rxi$wF}waN4p4^Svg z3ux3}7QXFU9-0fK&3Ms$K+uA4L4AqQTj<_ zV|Gq^YyOjI0$T&o_h9C&)Jr#O-)k~sD>(E#@1<43FK!>7qaVt(zO!88fRpl|M-_GBKCz*m#lm(#?ueOy{dM%k2ds6_0_4B?Wf~yrBAM6-SKZ|$g$1Uz`u00qE-}dISdcsi<92!s z(b)*<^3HGW?s{nMB3d6OzpM`EBqBPUb1h}tO-?% zo>Eg-ng?k(Pl+$}s11cg8y}yE=qeI1qHNsmzq2ZN{a+#thN*4-?5Bk-+>=m3FK)St z!Gn>Z;_XQWtVSciu0GGZcR2Q*$n(-a%D>mUMo=W1DeuC5))B{L0D!=o41R`3EvTX+ zKiFblE+k!Fi@U02ZfWj<(z zG&Msh3-Ibl;Ubx-ir84KKsOi^;k`Ci71zEV(*l=xP{4Ha=*4y*dok=yvZxUv_u6HpVhFRnu~doI|M2f?q8$(rJWjC)-psYiOA zk2!rApf06Zu}!9Sy5TH1a$M$ms(JZ}+`6Br)s= z73K{PhFkHTU(sENyQ{kTqwNRnW$t;ZV=#Lt49zyicwDn*nwgF({1=v4o$;vu zxq`m)v)8=;CU+WtiRYaa_j4yX_`~uLRXrKe9Rvh?RHWxEPGazbwuZ#(>h}L~$*X)d z5#&+Gths07>LAmS%=!>1l59?~ITb8s*+z;1u3rUOaMQ~uR1S?R(waVP$Y+W*den{a zrM+;d;|b7wurTqs|a{?(VNOP@I#Y^osbP=^nGCf-yp zLwF-5vFP^K6RP)qb9dMObT4o1b#CWbSWvaW&!9ibe1Ibc3~Tb zzcIAIHtC1WxV?WulswD-bC5=$i3N_%-N0dBDnPfVk5O4Y{f+wZ=SeQ9?}i{S;*nyk z@r~aH2QT{!HjHd3Jjh~$4t>gLXf{sAR`4^d!rg z_QTv-)|sE>Z@7rPk%ZBZxGOf((qMw|B-|r&xq4*My14}VRv&$Wj}GR`ks3?vhM{n- zR5+u6zRnz={cvG4LA8E9rKn^^ARuYCZVF8Ru8U@+QOXF3WGuz)4ow`X@oah0|~lFk!<*0t#Hq~|5F7w^O8&2<8P z>^0&L|D4S{iD8I#Izbo{D*=!hdF3M1F6)k;Qk0L@8+8psisQKwNwbow5nSo|mGsjo zlgtV<^5kD|f8YPj-CeQOz1&F~bTAw>`d4lh_%bzawCL$#T3KI~W{@Fg?d?EILV ziK7ujeU*wB%I;4<7RFjk>iIg)w4y2>Yad5_{aq;tj6lYW*pjMkEmI$vgLU(Kg}$-u zs9er@#6pHbcU9x5kxTCu8q8q@Ey^3__^skIw4J0-gedCp$4Zh3o1~Ayy|+DnoEw7E zWMd-&LIwF^%vF5+bS1Clm~DRjI1Sp~?aK5Zh3zp zI>+QXWyZA)Wbj>ENL@SH%4B?ljk}|pb!45w62g+Oaf58zXqkO2EG#X#7~XW4d(6?( z)k}5d3H^De`(R;Gs#HHb{0_IwGC{yKw54|}9F;-SO;8HM&Q+WVNk<7Zp<*?0d%Jix zfKl>_U60e~wtRl@Z3bhs>azvZ7zKanV(XLrU^yZIRWm;fXY%T{8pe{Si)(9isD=G` z&J=shd8SQIlij1TepGe2N2v~Ee?O_`X%DAA8Re8{u>@EU-1)! z13-7NkSxaeP3pAL34HLIySv`Cd%3d@kuObEVZzzE`g({mXJC$wdQ+2h!U7sZfOO>Q z9hkqBlMiUh0g{Da8F>k*`x2$B_ulTE6wLA#O{J|VMOXlVRceUCx^@Yl51#>91x1IE zEPF>^U|~{^*9+TCQ%5v4cfvLMrs3PMQ#-z+(B~l}kbpbRw3)nAIPMXm;dLh^1A%); zEV@Dtso_TT536(IC8)i8D1I4Kes4WA_Q>;Qv0vv;y`Xrlk|e7KZD}ON(K}*KtRhjOcZ6+;LKGFDC0?fIvP@D zK-z#s>RR7Ui~bAyfZCQ=i3S$w?S(=!ewZ|?8lr`hS~d6}72i77V9Yf`8u@AFlZe}op3EN^rrg5gmF7C$62KX*R&)<) GVgCbW^0AKq diff --git a/pkg/core/block/block_test.go b/pkg/core/block/block_test.go index 834ca0620..d604aa4d7 100644 --- a/pkg/core/block/block_test.go +++ b/pkg/core/block/block_test.go @@ -105,7 +105,7 @@ func TestHashBlockEqualsHashHeader(t *testing.T) { func TestBinBlockDecodeEncode(t *testing.T) { // block with two transfer transactions taken from C# privnet - rawblock := "AAAAAAwIVa2D6Yha3tArd5XnwkAf7deJBsdyyvpYb2xMZGBbkOUNHAsfre0rKA/F+Ox05/bQSXmcRZnzK3M6Z+/TxJUh0MNFeAEAAAEAAAAA3u55wYnzAJiwumouuQs6klimx/8BxgxA4MAnF5HGhcOTBjqdXKZIAKcw019v0cSpZj3l04FmLXxAPIPbL1Em2QOE3qBslr1/C4jdLSSq82o3TBr01RqlZgxA6ejwZmZkcfQsbMLS4beqFmtlKuK5eXYj7C7al2XmXqTJcVEm2gnZRUwe4lkBvcil1keYXNLEnHr77lcMLFGHZQxA8JYcGaz9OxOXxECrbVTGAIi+3nXf3ltsqDBmXukPeYO8l0OvXnVR30G+tXwcNw4wqTA2eZbMadwYM14JScDEipMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKUCAFjQuwvA2KcAAAAAACCqRAAAAAAA6AMAAAHe7nnBifMAmLC6ai65CzqSWKbH/wEAWwsCAOH1BQwUgM7HtvW1b1BXj3N/Fi06sU1GZQ0MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwU9WPqQLwoPU0OBcSOowWz8qBzQO9BYn1bUjkBxgxAuFCM0+tRmD8dC3ZLKxegtoqGGoun28KY79wRgKosmoMYqJmBmUS3l2cg+uzuRSfOqV0RbUm1WLtmAxvk+SAiIAxA85v8JfgZx70F2h0Naxi7XVDHONcDeiOPJDzzOxdt4C/bFcRs4kCDES56U21h6582lPUstH15LyK3SctSgAZEkAxAwcLgblSvp7Gb59aALHD4+ndxSYlBivcYh6V/SKaf+Y0510QQMs8hnPCGTAVapeFkvJMBXuqIwP/QbxW+Xll5xJMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKUA2CS8GcDYpwAAAAAAIKpEAAAAAADoAwAAAd7uecGJ8wCYsLpqLrkLOpJYpsf/AQBfCwMAQNndiE0KAAwUgM7HtvW1b1BXj3N/Fi06sU1GZQ0MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwUz3bii9AGLEpHjuNVYQETGfPPpNJBYn1bUjkBxgxA1p9A+89hC6qTfIIXDPz7XxcKOevwXxGrHx7kihAiTGMb1OO69mbUooYOfZRsUmcx7L8U8up7MrydtsnDYSDXSQxApetXIPd+zfx7oyrCzLtsCTEuwueG8yd6ttgs6pZb8N2KfNPVEoCg7Plvt0A+6yPkhbNDoSJ9IKKAlFOn/9d1owxA6/V3Xk+QhkzvAi9CYoM3E3LnLNBgXKh7PH06Dusz7rgn0u1oencsUgoo0+AOEvuwVHVt3bDu/NvJHtX4/KDcZpMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKU=" + rawblock := "AAAAAAwIVa2D6Yha3tArd5XnwkAf7deJBsdyyvpYb2xMZGBbkOUNHAsfre0rKA/F+Ox05/bQSXmcRZnzK3M6Z+/TxJUh0MNFeAEAAAAAAAAAAAAAAQAAAADe7nnBifMAmLC6ai65CzqSWKbH/wHGDEDgwCcXkcaFw5MGOp1cpkgApzDTX2/RxKlmPeXTgWYtfEA8g9svUSbZA4TeoGyWvX8LiN0tJKrzajdMGvTVGqVmDEDp6PBmZmRx9CxswtLht6oWa2Uq4rl5diPsLtqXZeZepMlxUSbaCdlFTB7iWQG9yKXWR5hc0sScevvuVwwsUYdlDEDwlhwZrP07E5fEQKttVMYAiL7edd/eW2yoMGZe6Q95g7yXQ69edVHfQb61fBw3DjCpMDZ5lsxp3BgzXglJwMSKkxMMIQIQOn990BZVhZf3lg0nxRakOU/ZaLnmUVXrSwE+QEBAbgwhAqe8Vf6GhOARl2jRBLoweVvcyGYZ6GSt0mFWcj7Rhc1iDCECs2Ir9AF73+MXxYrtX0x1PyBrfbiWBG+n13S7xL9/jcIMIQPZDAffY+aQzneRLhCrUazJRLZoYCN7YIxPj4MJ5x7mmRRBe85spQIAWNC7C8DYpwAAAAAAIKpEAAAAAADoAwAAAd7uecGJ8wCYsLpqLrkLOpJYpsf/AQBbCwIA4fUFDBSAzse29bVvUFePc38WLTqxTUZlDQwU3u55wYnzAJiwumouuQs6klimx/8UwB8MCHRyYW5zZmVyDBT1Y+pAvCg9TQ4FxI6jBbPyoHNA70FifVtSOQHGDEC4UIzT61GYPx0LdksrF6C2ioYai6fbwpjv3BGAqiyagxiomYGZRLeXZyD67O5FJ86pXRFtSbVYu2YDG+T5ICIgDEDzm/wl+BnHvQXaHQ1rGLtdUMc41wN6I48kPPM7F23gL9sVxGziQIMRLnpTbWHrnzaU9Sy0fXkvIrdJy1KABkSQDEDBwuBuVK+nsZvn1oAscPj6d3FJiUGK9xiHpX9Ipp/5jTnXRBAyzyGc8IZMBVql4WS8kwFe6ojA/9BvFb5eWXnEkxMMIQIQOn990BZVhZf3lg0nxRakOU/ZaLnmUVXrSwE+QEBAbgwhAqe8Vf6GhOARl2jRBLoweVvcyGYZ6GSt0mFWcj7Rhc1iDCECs2Ir9AF73+MXxYrtX0x1PyBrfbiWBG+n13S7xL9/jcIMIQPZDAffY+aQzneRLhCrUazJRLZoYCN7YIxPj4MJ5x7mmRRBe85spQDYJLwZwNinAAAAAAAgqkQAAAAAAOgDAAAB3u55wYnzAJiwumouuQs6klimx/8BAF8LAwBA2d2ITQoADBSAzse29bVvUFePc38WLTqxTUZlDQwU3u55wYnzAJiwumouuQs6klimx/8UwB8MCHRyYW5zZmVyDBTPduKL0AYsSkeO41VhARMZ88+k0kFifVtSOQHGDEDWn0D7z2ELqpN8ghcM/PtfFwo56/BfEasfHuSKECJMYxvU47r2ZtSihg59lGxSZzHsvxTy6nsyvJ22ycNhINdJDECl61cg937N/HujKsLMu2wJMS7C54bzJ3q22Czqllvw3Yp809USgKDs+W+3QD7rI+SFs0OhIn0gooCUU6f/13WjDEDr9XdeT5CGTO8CL0JigzcTcucs0GBcqHs8fToO6zPuuCfS7Wh6dyxSCijT4A4S+7BUdW3dsO7828ke1fj8oNxmkxMMIQIQOn990BZVhZf3lg0nxRakOU/ZaLnmUVXrSwE+QEBAbgwhAqe8Vf6GhOARl2jRBLoweVvcyGYZ6GSt0mFWcj7Rhc1iDCECs2Ir9AF73+MXxYrtX0x1PyBrfbiWBG+n13S7xL9/jcIMIQPZDAffY+aQzneRLhCrUazJRLZoYCN7YIxPj4MJ5x7mmRRBe85spQ==" rawblockBytes, _ := base64.StdEncoding.DecodeString(rawblock) b := New(false) @@ -152,7 +152,7 @@ func TestBlockSizeCalculation(t *testing.T) { // should be the same.In this test we provide more details then necessary because in case of failure we can easily debug the // root cause of the size calculation missmatch. - rawBlock := "AAAAAAwIVa2D6Yha3tArd5XnwkAf7deJBsdyyvpYb2xMZGBbkOUNHAsfre0rKA/F+Ox05/bQSXmcRZnzK3M6Z+/TxJUh0MNFeAEAAAEAAAAA3u55wYnzAJiwumouuQs6klimx/8BxgxA4MAnF5HGhcOTBjqdXKZIAKcw019v0cSpZj3l04FmLXxAPIPbL1Em2QOE3qBslr1/C4jdLSSq82o3TBr01RqlZgxA6ejwZmZkcfQsbMLS4beqFmtlKuK5eXYj7C7al2XmXqTJcVEm2gnZRUwe4lkBvcil1keYXNLEnHr77lcMLFGHZQxA8JYcGaz9OxOXxECrbVTGAIi+3nXf3ltsqDBmXukPeYO8l0OvXnVR30G+tXwcNw4wqTA2eZbMadwYM14JScDEipMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKUCAFjQuwvA2KcAAAAAACCqRAAAAAAA6AMAAAHe7nnBifMAmLC6ai65CzqSWKbH/wEAWwsCAOH1BQwUgM7HtvW1b1BXj3N/Fi06sU1GZQ0MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwU9WPqQLwoPU0OBcSOowWz8qBzQO9BYn1bUjkBxgxAuFCM0+tRmD8dC3ZLKxegtoqGGoun28KY79wRgKosmoMYqJmBmUS3l2cg+uzuRSfOqV0RbUm1WLtmAxvk+SAiIAxA85v8JfgZx70F2h0Naxi7XVDHONcDeiOPJDzzOxdt4C/bFcRs4kCDES56U21h6582lPUstH15LyK3SctSgAZEkAxAwcLgblSvp7Gb59aALHD4+ndxSYlBivcYh6V/SKaf+Y0510QQMs8hnPCGTAVapeFkvJMBXuqIwP/QbxW+Xll5xJMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKUA2CS8GcDYpwAAAAAAIKpEAAAAAADoAwAAAd7uecGJ8wCYsLpqLrkLOpJYpsf/AQBfCwMAQNndiE0KAAwUgM7HtvW1b1BXj3N/Fi06sU1GZQ0MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwUz3bii9AGLEpHjuNVYQETGfPPpNJBYn1bUjkBxgxA1p9A+89hC6qTfIIXDPz7XxcKOevwXxGrHx7kihAiTGMb1OO69mbUooYOfZRsUmcx7L8U8up7MrydtsnDYSDXSQxApetXIPd+zfx7oyrCzLtsCTEuwueG8yd6ttgs6pZb8N2KfNPVEoCg7Plvt0A+6yPkhbNDoSJ9IKKAlFOn/9d1owxA6/V3Xk+QhkzvAi9CYoM3E3LnLNBgXKh7PH06Dusz7rgn0u1oencsUgoo0+AOEvuwVHVt3bDu/NvJHtX4/KDcZpMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKU=" + rawBlock := "AAAAAAwIVa2D6Yha3tArd5XnwkAf7deJBsdyyvpYb2xMZGBbkOUNHAsfre0rKA/F+Ox05/bQSXmcRZnzK3M6Z+/TxJUh0MNFeAEAAAAAAAAAAAAAAQAAAADe7nnBifMAmLC6ai65CzqSWKbH/wHGDEDgwCcXkcaFw5MGOp1cpkgApzDTX2/RxKlmPeXTgWYtfEA8g9svUSbZA4TeoGyWvX8LiN0tJKrzajdMGvTVGqVmDEDp6PBmZmRx9CxswtLht6oWa2Uq4rl5diPsLtqXZeZepMlxUSbaCdlFTB7iWQG9yKXWR5hc0sScevvuVwwsUYdlDEDwlhwZrP07E5fEQKttVMYAiL7edd/eW2yoMGZe6Q95g7yXQ69edVHfQb61fBw3DjCpMDZ5lsxp3BgzXglJwMSKkxMMIQIQOn990BZVhZf3lg0nxRakOU/ZaLnmUVXrSwE+QEBAbgwhAqe8Vf6GhOARl2jRBLoweVvcyGYZ6GSt0mFWcj7Rhc1iDCECs2Ir9AF73+MXxYrtX0x1PyBrfbiWBG+n13S7xL9/jcIMIQPZDAffY+aQzneRLhCrUazJRLZoYCN7YIxPj4MJ5x7mmRRBe85spQIAWNC7C8DYpwAAAAAAIKpEAAAAAADoAwAAAd7uecGJ8wCYsLpqLrkLOpJYpsf/AQBbCwIA4fUFDBSAzse29bVvUFePc38WLTqxTUZlDQwU3u55wYnzAJiwumouuQs6klimx/8UwB8MCHRyYW5zZmVyDBT1Y+pAvCg9TQ4FxI6jBbPyoHNA70FifVtSOQHGDEC4UIzT61GYPx0LdksrF6C2ioYai6fbwpjv3BGAqiyagxiomYGZRLeXZyD67O5FJ86pXRFtSbVYu2YDG+T5ICIgDEDzm/wl+BnHvQXaHQ1rGLtdUMc41wN6I48kPPM7F23gL9sVxGziQIMRLnpTbWHrnzaU9Sy0fXkvIrdJy1KABkSQDEDBwuBuVK+nsZvn1oAscPj6d3FJiUGK9xiHpX9Ipp/5jTnXRBAyzyGc8IZMBVql4WS8kwFe6ojA/9BvFb5eWXnEkxMMIQIQOn990BZVhZf3lg0nxRakOU/ZaLnmUVXrSwE+QEBAbgwhAqe8Vf6GhOARl2jRBLoweVvcyGYZ6GSt0mFWcj7Rhc1iDCECs2Ir9AF73+MXxYrtX0x1PyBrfbiWBG+n13S7xL9/jcIMIQPZDAffY+aQzneRLhCrUazJRLZoYCN7YIxPj4MJ5x7mmRRBe85spQDYJLwZwNinAAAAAAAgqkQAAAAAAOgDAAAB3u55wYnzAJiwumouuQs6klimx/8BAF8LAwBA2d2ITQoADBSAzse29bVvUFePc38WLTqxTUZlDQwU3u55wYnzAJiwumouuQs6klimx/8UwB8MCHRyYW5zZmVyDBTPduKL0AYsSkeO41VhARMZ88+k0kFifVtSOQHGDEDWn0D7z2ELqpN8ghcM/PtfFwo56/BfEasfHuSKECJMYxvU47r2ZtSihg59lGxSZzHsvxTy6nsyvJ22ycNhINdJDECl61cg937N/HujKsLMu2wJMS7C54bzJ3q22Czqllvw3Yp809USgKDs+W+3QD7rI+SFs0OhIn0gooCUU6f/13WjDEDr9XdeT5CGTO8CL0JigzcTcucs0GBcqHs8fToO6zPuuCfS7Wh6dyxSCijT4A4S+7BUdW3dsO7828ke1fj8oNxmkxMMIQIQOn990BZVhZf3lg0nxRakOU/ZaLnmUVXrSwE+QEBAbgwhAqe8Vf6GhOARl2jRBLoweVvcyGYZ6GSt0mFWcj7Rhc1iDCECs2Ir9AF73+MXxYrtX0x1PyBrfbiWBG+n13S7xL9/jcIMIQPZDAffY+aQzneRLhCrUazJRLZoYCN7YIxPj4MJ5x7mmRRBe85spQ==" rawBlockBytes, _ := base64.StdEncoding.DecodeString(rawBlock) b := New(false) @@ -195,12 +195,12 @@ func TestBlockSizeCalculation(t *testing.T) { assert.Equal(t, "DEDgwCcXkcaFw5MGOp1cpkgApzDTX2/RxKlmPeXTgWYtfEA8g9svUSbZA4TeoGyWvX8LiN0tJKrzajdMGvTVGqVmDEDp6PBmZmRx9CxswtLht6oWa2Uq4rl5diPsLtqXZeZepMlxUSbaCdlFTB7iWQG9yKXWR5hc0sScevvuVwwsUYdlDEDwlhwZrP07E5fEQKttVMYAiL7edd/eW2yoMGZe6Q95g7yXQ69edVHfQb61fBw3DjCpMDZ5lsxp3BgzXglJwMSK", base64.StdEncoding.EncodeToString(b.Script.InvocationScript)) assert.Equal(t, "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", base64.StdEncoding.EncodeToString(b.Script.VerificationScript)) - assert.Equal(t, "02d7c7801742cd404eb178780c840477f1eef4a771ecc8cc9434640fe8f2bb09", b.Hash().StringLE()) + assert.Equal(t, "0285238e7b5d3ca50ae8f8636dedb4fa486bc0536016e1f1edfd74442af7412e", b.Hash().StringLE()) benc, err := testserdes.EncodeBinary(b) assert.NoError(t, err) // test size of the block - assert.Equal(t, 1430, len(benc)) + assert.Equal(t, 1438, len(benc)) assert.Equal(t, rawBlock, base64.StdEncoding.EncodeToString(benc)) } diff --git a/pkg/core/block/header.go b/pkg/core/block/header.go index c4025428d..b7f78744f 100644 --- a/pkg/core/block/header.go +++ b/pkg/core/block/header.go @@ -3,6 +3,8 @@ package block import ( "encoding/json" "errors" + "fmt" + "strconv" "github.com/nspcc-dev/neo-go/pkg/core/transaction" "github.com/nspcc-dev/neo-go/pkg/crypto/hash" @@ -28,6 +30,9 @@ type Header struct { // The height of the block must be exactly equal to the height of the previous block plus 1. Timestamp uint64 + // Nonce is block random number. + Nonce uint64 + // index/height of the block Index uint32 @@ -57,6 +62,7 @@ type baseAux struct { PrevHash util.Uint256 `json:"previousblockhash"` MerkleRoot util.Uint256 `json:"merkleroot"` Timestamp uint64 `json:"time"` + Nonce string `json:"nonce"` Index uint32 `json:"index"` NextConsensus string `json:"nextconsensus"` PrimaryIndex byte `json:"primary"` @@ -112,6 +118,7 @@ func (b *Header) encodeHashableFields(bw *io.BinWriter) { bw.WriteBytes(b.PrevHash[:]) bw.WriteBytes(b.MerkleRoot[:]) bw.WriteU64LE(b.Timestamp) + bw.WriteU64LE(b.Nonce) bw.WriteU32LE(b.Index) bw.WriteB(b.PrimaryIndex) bw.WriteBytes(b.NextConsensus[:]) @@ -127,6 +134,7 @@ func (b *Header) decodeHashableFields(br *io.BinReader) { br.ReadBytes(b.PrevHash[:]) br.ReadBytes(b.MerkleRoot[:]) b.Timestamp = br.ReadU64LE() + b.Nonce = br.ReadU64LE() b.Index = br.ReadU32LE() b.PrimaryIndex = br.ReadB() br.ReadBytes(b.NextConsensus[:]) @@ -149,6 +157,7 @@ func (b Header) MarshalJSON() ([]byte, error) { PrevHash: b.PrevHash, MerkleRoot: b.MerkleRoot, Timestamp: b.Timestamp, + Nonce: fmt.Sprintf("%016x", b.Nonce), Index: b.Index, PrimaryIndex: b.PrimaryIndex, NextConsensus: address.Uint160ToString(b.NextConsensus), @@ -170,6 +179,13 @@ func (b *Header) UnmarshalJSON(data []byte) error { return err } + var nonce uint64 + if len(aux.Nonce) != 0 { + nonce, err = strconv.ParseUint(aux.Nonce, 16, 64) + if err != nil { + return err + } + } nextC, err = address.StringToUint160(aux.NextConsensus) if err != nil { return err @@ -181,6 +197,7 @@ func (b *Header) UnmarshalJSON(data []byte) error { b.PrevHash = aux.PrevHash b.MerkleRoot = aux.MerkleRoot b.Timestamp = aux.Timestamp + b.Nonce = nonce b.Index = aux.Index b.PrimaryIndex = aux.PrimaryIndex b.NextConsensus = nextC diff --git a/pkg/core/native/ledger.go b/pkg/core/native/ledger.go index ad9b68185..969bf26dc 100644 --- a/pkg/core/native/ledger.go +++ b/pkg/core/native/ledger.go @@ -200,6 +200,7 @@ func BlockToStackItem(b *block.Block) stackitem.Item { stackitem.NewByteArray(b.PrevHash.BytesBE()), stackitem.NewByteArray(b.MerkleRoot.BytesBE()), stackitem.NewBigInteger(big.NewInt(int64(b.Timestamp))), + stackitem.NewBigInteger(new(big.Int).SetUint64(b.Nonce)), stackitem.NewBigInteger(big.NewInt(int64(b.Index))), stackitem.NewByteArray(b.NextConsensus.BytesBE()), stackitem.NewBigInteger(big.NewInt(int64(len(b.Transactions)))), diff --git a/pkg/core/native_ledger_test.go b/pkg/core/native_ledger_test.go index 71c600a7d..859ccef23 100644 --- a/pkg/core/native_ledger_test.go +++ b/pkg/core/native_ledger_test.go @@ -148,15 +148,16 @@ func TestLedgerGetBlock(t *testing.T) { actual, ok := value.([]stackitem.Item) require.True(t, ok) - require.Equal(t, 8, len(actual)) + require.Equal(t, 9, len(actual)) require.Equal(t, b.Hash().BytesBE(), actual[0].Value().([]byte)) require.Equal(t, int64(b.Version), actual[1].Value().(*big.Int).Int64()) require.Equal(t, b.PrevHash.BytesBE(), actual[2].Value().([]byte)) require.Equal(t, b.MerkleRoot.BytesBE(), actual[3].Value().([]byte)) require.Equal(t, int64(b.Timestamp), actual[4].Value().(*big.Int).Int64()) - require.Equal(t, int64(b.Index), actual[5].Value().(*big.Int).Int64()) - require.Equal(t, b.NextConsensus.BytesBE(), actual[6].Value().([]byte)) - require.Equal(t, int64(len(b.Transactions)), actual[7].Value().(*big.Int).Int64()) + require.Equal(t, int64(b.Nonce), actual[5].Value().(*big.Int).Int64()) + require.Equal(t, int64(b.Index), actual[6].Value().(*big.Int).Int64()) + require.Equal(t, b.NextConsensus.BytesBE(), actual[7].Value().([]byte)) + require.Equal(t, int64(len(b.Transactions)), actual[8].Value().(*big.Int).Int64()) }) t.Run("bad hash", func(t *testing.T) { res, err := invokeContractMethod(chain, 100000000, ledger, "getBlock", bhash.BytesLE()) diff --git a/pkg/core/test_data/block_1.json b/pkg/core/test_data/block_1.json index 6a369fa38..ac4e61d46 100644 --- a/pkg/core/test_data/block_1.json +++ b/pkg/core/test_data/block_1.json @@ -1,13 +1,14 @@ { - "raw": "0000000052191c07e42694c3b5cf52cac55f9812ea0dbc1778ced9eca81a4695ac682bfda919f78252fb966091b920c013e6b90da9d3855c1f423b5fff57b0b89ae84c0a2a498268770100000001000004e0a3c55cad72028fb5901748b19a27be21f6540401fd4a010c4019c88570296ce982f9bc6d2cd6b951756b04b440182e39147af3662855f909d392861bba73f4eb0b059f7f1750473bb4c221c11c73c4abf4072a6e89eb491a020c40e18599ea4d48bcb5761bad306b563f22f58c65f0dada00c203e0326bc96743eaee363b3007af4a1fdbba9ce67a23ba384b7df05f963b814b2429c9e41c50ea720c4019afbb0bcfa9f84e0340a64c004c65e23ff0d9f00ba6980183b739eb5ba63c5d61e7801ec5d23dcd2af510ee5c91b75d6b4feccd8f3e51e6f21b06bb3c0b692d0c40e0356d3118ffce07c0911d75ff97ffb4b4f3b776b93209d7691bd3ca0a0c9de2812142ef1cc1b4afe10d15d58d1d65c241a31501e50bacfd4f97962ee36fa3890c40036976717446f9ea3958845e2833c23c2a7b611331b0d50ee97de23dedf7a14e6efc64e257588c44493859cc8dc3da7755cf445c76be4c780fdeb291ba2766a8fdfd00150c2103009b7540e10f2562e5fd8fac9eaec25166a58b26e412348ff5a86927bfac22a20c21030205e9cefaea5a1dfc580af20c8d5aa2468bb0148f1a5e4605fc622c80e604ba0c210214baf0ceea3a66f17e7e1e839ea25fd8bed6cd82e6bb6e68250189065f44ff010c21023e9b32ea89b94d066e649b124fd50e396ee91369e8e2a6ae1b11c170d022256d0c2103408dcd416396f64783ac587ea1e1593c57d9fea880c8a6a1920e92a2594778060c2102a7834be9b32e2981d157cb5bbd3acb42cfd11ea5c3b10224d7a44e98c5910f1b0c2102ba2c70f5996f357a43198705859fae2cfea13e1172962800772b3d588a9d4abd170b41138defaf01004883fd4bb494980000000000983c8500000000007f17000002574d3c03df4a9b2772af08e4b296721009b7a6fd00e0a3c55cad72028fb5901748b19a27be21f6540401005f0b0300e40b54020000000c14f6ed986d8f6478b647ddae2083069ca4cfdb23400c14e0a3c55cad72028fb5901748b19a27be21f6540414c01f0c087472616e736665720c1428b3adab7269f9c2181db3cb741ebf551930e27041627d5b523902420c4001a8eb709edc764591af846e7bfba10a908577ad57365b590593a4f81ea5a86ac046b9e1ac69ed39ec30cb97c2c7ef538f00fc105027758454b2bede94cd3bef290c2102a7834be9b32e2981d157cb5bbd3acb42cfd11ea5c3b10224d7a44e98c5910f1b0b4195440d78fd4a010c40e254613ac2b3bd756d907932b15278e62b094a3eab90eff5aa2c56b598161852775cbd76076ac01fe48afdf897077845c415b3ca7884668e94396719b6db66e30c40a7427e3cd5238e3a5d4ab3b4361a37872af3dd8be336b9f1f19f0bd4972edb879b781d0c45dc684da7b220b8d399bea1948c1fe924daa5edbb8df117894130530c4099a1516792326083e50d99d4a97425b31c429136949688081619084403e0065c6ba576a0a4589d9115e3cf71c843c52e476b62ff4349c73838b2c2cb39f6c43d0c409ec13c315e485503ce8d1c821b0ed41ce3f39e914352973ec8ee1fefd024e106e709610bf9d500f56ec0e72c09e427cd8fd0a68bd9ef3b21176e8afd80aaef710c4022d33dc3217be4bb22144d98552ef35f23b1f10367924b4c6bea71d6c280cf2a2fff15f3c9f235cd5620bf310709aa53d6403e6d2fe6d07f13d83803a2c13a7ffdfd00150c2103009b7540e10f2562e5fd8fac9eaec25166a58b26e412348ff5a86927bfac22a20c21030205e9cefaea5a1dfc580af20c8d5aa2468bb0148f1a5e4605fc622c80e604ba0c210214baf0ceea3a66f17e7e1e839ea25fd8bed6cd82e6bb6e68250189065f44ff010c21023e9b32ea89b94d066e649b124fd50e396ee91369e8e2a6ae1b11c170d022256d0c2103408dcd416396f64783ac587ea1e1593c57d9fea880c8a6a1920e92a2594778060c2102a7834be9b32e2981d157cb5bbd3acb42cfd11ea5c3b10224d7a44e98c5910f1b0c2102ba2c70f5996f357a43198705859fae2cfea13e1172962800772b3d588a9d4abd170b41138defaf", + "raw": "0000000052191c07e42694c3b5cf52cac55f9812ea0dbc1778ced9eca81a4695ac682bfda919f78252fb966091b920c013e6b90da9d3855c1f423b5fff57b0b89ae84c0a2a4982687701000563412907856341200001000004e0a3c55cad72028fb5901748b19a27be21f6540401fd4a010c4019c88570296ce982f9bc6d2cd6b951756b04b440182e39147af3662855f909d392861bba73f4eb0b059f7f1750473bb4c221c11c73c4abf4072a6e89eb491a020c40e18599ea4d48bcb5761bad306b563f22f58c65f0dada00c203e0326bc96743eaee363b3007af4a1fdbba9ce67a23ba384b7df05f963b814b2429c9e41c50ea720c4019afbb0bcfa9f84e0340a64c004c65e23ff0d9f00ba6980183b739eb5ba63c5d61e7801ec5d23dcd2af510ee5c91b75d6b4feccd8f3e51e6f21b06bb3c0b692d0c40e0356d3118ffce07c0911d75ff97ffb4b4f3b776b93209d7691bd3ca0a0c9de2812142ef1cc1b4afe10d15d58d1d65c241a31501e50bacfd4f97962ee36fa3890c40036976717446f9ea3958845e2833c23c2a7b611331b0d50ee97de23dedf7a14e6efc64e257588c44493859cc8dc3da7755cf445c76be4c780fdeb291ba2766a8fdfd00150c2103009b7540e10f2562e5fd8fac9eaec25166a58b26e412348ff5a86927bfac22a20c21030205e9cefaea5a1dfc580af20c8d5aa2468bb0148f1a5e4605fc622c80e604ba0c210214baf0ceea3a66f17e7e1e839ea25fd8bed6cd82e6bb6e68250189065f44ff010c21023e9b32ea89b94d066e649b124fd50e396ee91369e8e2a6ae1b11c170d022256d0c2103408dcd416396f64783ac587ea1e1593c57d9fea880c8a6a1920e92a2594778060c2102a7834be9b32e2981d157cb5bbd3acb42cfd11ea5c3b10224d7a44e98c5910f1b0c2102ba2c70f5996f357a43198705859fae2cfea13e1172962800772b3d588a9d4abd170b41138defaf01004883fd4bb494980000000000983c8500000000007f17000002574d3c03df4a9b2772af08e4b296721009b7a6fd00e0a3c55cad72028fb5901748b19a27be21f6540401005f0b0300e40b54020000000c14f6ed986d8f6478b647ddae2083069ca4cfdb23400c14e0a3c55cad72028fb5901748b19a27be21f6540414c01f0c087472616e736665720c1428b3adab7269f9c2181db3cb741ebf551930e27041627d5b523902420c4001a8eb709edc764591af846e7bfba10a908577ad57365b590593a4f81ea5a86ac046b9e1ac69ed39ec30cb97c2c7ef538f00fc105027758454b2bede94cd3bef290c2102a7834be9b32e2981d157cb5bbd3acb42cfd11ea5c3b10224d7a44e98c5910f1b0b4195440d78fd4a010c40e254613ac2b3bd756d907932b15278e62b094a3eab90eff5aa2c56b598161852775cbd76076ac01fe48afdf897077845c415b3ca7884668e94396719b6db66e30c40a7427e3cd5238e3a5d4ab3b4361a37872af3dd8be336b9f1f19f0bd4972edb879b781d0c45dc684da7b220b8d399bea1948c1fe924daa5edbb8df117894130530c4099a1516792326083e50d99d4a97425b31c429136949688081619084403e0065c6ba576a0a4589d9115e3cf71c843c52e476b62ff4349c73838b2c2cb39f6c43d0c409ec13c315e485503ce8d1c821b0ed41ce3f39e914352973ec8ee1fefd024e106e709610bf9d500f56ec0e72c09e427cd8fd0a68bd9ef3b21176e8afd80aaef710c4022d33dc3217be4bb22144d98552ef35f23b1f10367924b4c6bea71d6c280cf2a2fff15f3c9f235cd5620bf310709aa53d6403e6d2fe6d07f13d83803a2c13a7ffdfd00150c2103009b7540e10f2562e5fd8fac9eaec25166a58b26e412348ff5a86927bfac22a20c21030205e9cefaea5a1dfc580af20c8d5aa2468bb0148f1a5e4605fc622c80e604ba0c210214baf0ceea3a66f17e7e1e839ea25fd8bed6cd82e6bb6e68250189065f44ff010c21023e9b32ea89b94d066e649b124fd50e396ee91369e8e2a6ae1b11c170d022256d0c2103408dcd416396f64783ac587ea1e1593c57d9fea880c8a6a1920e92a2594778060c2102a7834be9b32e2981d157cb5bbd3acb42cfd11ea5c3b10224d7a44e98c5910f1b0c2102ba2c70f5996f357a43198705859fae2cfea13e1172962800772b3d588a9d4abd170b41138defaf", "size" : 1564, "index" : 256, "primary" : 4, + "nonce": "0x1234567890123456", "time" : 1612366104874, "confirmations" : 10883, "previousblockhash" : "0xfd2b68ac95461aa8ecd9ce7817bc0dea12985fc5ca52cfb5c39426e4071c1952", "nextconsensus" : "NgPkjjLTNcQad99iRYeXRUuowE4gxLAnDL", - "hash" : "0x53b3d970ccb235bef785633817f2a947f63bac1f7fa23103f7d080a53f0361f4", + "hash" : "0x79cdba60b0197e3e3e7e8b8e42a56fd3a7c1530561da04a030c8201880b11795", "witnesses" : [ { "verification" : "FQwhAwCbdUDhDyVi5f2PrJ6uwlFmpYsm5BI0j/WoaSe/rCKiDCEDAgXpzvrqWh38WAryDI1aokaLsBSPGl5GBfxiLIDmBLoMIQIUuvDO6jpm8X5+HoOeol/YvtbNgua7bmglAYkGX0T/AQwhAj6bMuqJuU0GbmSbEk/VDjlu6RNp6OKmrhsRwXDQIiVtDCEDQI3NQWOW9keDrFh+oeFZPFfZ/qiAyKahkg6SollHeAYMIQKng0vpsy4pgdFXy1u9OstCz9EepcOxAiTXpE6YxZEPGwwhAroscPWZbzV6QxmHBYWfriz+oT4RcpYoAHcrPViKnUq9FwtBE43vrw==", diff --git a/pkg/core/util.go b/pkg/core/util.go index 325bac560..b5cfa8a6a 100644 --- a/pkg/core/util.go +++ b/pkg/core/util.go @@ -30,6 +30,7 @@ func createGenesisBlock(cfg config.ProtocolConfiguration) (*block.Block, error) Version: 0, PrevHash: util.Uint256{}, Timestamp: uint64(time.Date(2016, 7, 15, 15, 8, 21, 0, time.UTC).Unix()) * 1000, // Milliseconds. + Nonce: 2083236893, Index: 0, NextConsensus: nextConsensus, Script: transaction.Witness{ diff --git a/pkg/core/util_test.go b/pkg/core/util_test.go index 4c4a9b085..0d6215604 100644 --- a/pkg/core/util_test.go +++ b/pkg/core/util_test.go @@ -17,7 +17,7 @@ func TestGenesisBlockMainNet(t *testing.T) { block, err := createGenesisBlock(cfg.ProtocolConfiguration) require.NoError(t, err) - expect := "c3db4ba50ede4f9e749bd97e1499953ae17e65a415c6bf9e38c01cf92b03d156" + expect := "1f4d1defa46faa5e7b9b8d3f79a06bec777d7c26c4aa5f6f5899a291daa87c15" assert.Equal(t, expect, block.Hash().StringLE()) } diff --git a/pkg/interop/native/ledger/block.go b/pkg/interop/native/ledger/block.go index 1196b5154..dfd7f0c84 100644 --- a/pkg/interop/native/ledger/block.go +++ b/pkg/interop/native/ledger/block.go @@ -19,6 +19,8 @@ type Block struct { MerkleRoot interop.Hash256 // Timestamp represents millisecond-precision block timestamp. Timestamp int + // Nonce represents block nonce. + Nonce int // Index represents the height of the block. Index int // NextConsensus represents contract address of the next miner (160 bit BE diff --git a/pkg/rpc/client/rpc_test.go b/pkg/rpc/client/rpc_test.go index 3c930ba3b..c33f37497 100644 --- a/pkg/rpc/client/rpc_test.go +++ b/pkg/rpc/client/rpc_test.go @@ -48,17 +48,17 @@ type rpcClientTestCase struct { check func(t *testing.T, c *Client, result interface{}) } -const base64B1 = "AAAAAAwIVa2D6Yha3tArd5XnwkAf7deJBsdyyvpYb2xMZGBb/YwjvRiYdH/LL9atXcWbYsXLHqkKEutiil4zsK7lKrFxU6tEeAEAAAEAAAAA3u55wYnzAJiwumouuQs6klimx/8BxgxAUfn6Pu/yxlYcuGzwM7RzacB9z9YG7J77DR/j9NfrNR7leWUd0qTqnqiD1H9Vydj401smVWnTg/XAisjZTFpT+gxAAT3EbjC87Gb5UEe+Pvx3AP31lJeIuQL1gKcm6SfJBMaHon2g1dAah3xrKXrj3nGRypvWTKCVEXXDFzEL3ZndswxA/eGxm/DUde1jWbvi+avLdId0VH2roTyqJScLblo5xtRRHm0uKf6NObl6cNJLnSjcumrOQbMVgruDb7WIaOl0E5MTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKUCAAIAAADA2KcAAAAAAAx5QwAAAAAAsAQAAAHe7nnBifMAmLC6ai65CzqSWKbH/wEAWwsCGN31BQwUVVQtU+0PVUb61E1umZEoZwIvzl4MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwU9WPqQLwoPU0OBcSOowWz8qBzQO9BYn1bUjkBxgxATIm2/0zMxdiM7XnPfK71cV4fd0elAZwc7YH+0St3IWmPKYSMYfidX9xgLc98wLi8Ikp9cEmp7PUTyqoHqYmrqAxAbxxWY+bt2me1JH8pTHNMIfcnSLr7ZVW92P+jjp/Bzd0QrO1Sy4J2k990Z9YFgci0AcwJXY6yZw38Q0hqn0po3wxAhDKcmR3uZX5Egc5T6D/Ywttnw0vu01LewZMemWX+Wg7tPSBa1sz4rcZL8+EqwMoAnSXczJAV2GT1GrZDvNvBTJMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKUAAwAAAMDYpwAAAAAArIhDAAAAAACwBAAAAd7uecGJ8wCYsLpqLrkLOpJYpsf/AQBfCwMA6HZIFwAAAAwUVVQtU+0PVUb61E1umZEoZwIvzl4MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwUz3bii9AGLEpHjuNVYQETGfPPpNJBYn1bUjkBxgxA1E8pqjQrEDsUL7B2U+u2h95Jr6yvObCHbWif6tRx6cpNqy7VFJ/5A5T6W5NLLIZBD9os5ZQq+rRIgOliQOWRiwxAysxPLL6wVsETJZm2vcVQ3ZBH7IHa82wjQoyKGrhQH+rygFF/TmVH6E5oEOz/bsQwudk60CWJKcrFyXzfXlK5KAxAjH0w9It2Tlax1xv3T5xstaSl9le2fyYDa+smDwR+ytnmGRkSNn3oWsHdS8B7A1TzP76W3Dixn2NFFp9/j3D3cpMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKU=" +const base64B1 = "AAAAAMSdeyVO3QCekJTbQ4D7YEEGFv2nXPd6CfO5Kn3htI8P9tVA4+VXLyyMG12BUj6qB3CZ+JIFwWCcDF+KBHH0VSjJICSkegEAAAAAAAAAAAAAAQAAAABouegejA5skHm0udEF6HinbT8iPwHGDEBg0hpK90iZlB4ZSCG7BOr7BsvPXGDax360lvqKeNFuzaGI1RYNH50/dhQLxocy90JdsIOyodd1sOJGEjZIt7ztDEAHc2avJzz6tK+FOQMIZO/FEEikJdLJX0+iZXFcsmDRpB7lo2wWMSQbcoTXNg7leuR0VeDsKJ+YdvCuTG5WbiqWDECa6Yjj+bK4te5KR5jdLF5kLt03csyozZcd/X7NPt89IsX01zpX8ec3e+B2qySJIOhEf3cK0i+5U5wyXiFcRI8xkxMMIQIQOn990BZVhZf3lg0nxRakOU/ZaLnmUVXrSwE+QEBAbgwhAqe8Vf6GhOARl2jRBLoweVvcyGYZ6GSt0mFWcj7Rhc1iDCECs2Ir9AF73+MXxYrtX0x1PyBrfbiWBG+n13S7xL9/jcIMIQPZDAffY+aQzneRLhCrUazJRLZoYCN7YIxPj4MJ5x7mmRRBntDcOgIAAgAAAMDYpwAAAAAADHlDAAAAAACwBAAAAWi56B6MDmyQebS50QXoeKdtPyI/AQBbCwIY3fUFDBTunqIsJ+NL0BSPxBCOCPdOj1BIsgwUaLnoHowObJB5tLnRBeh4p20/Ij8UwB8MCHRyYW5zZmVyDBT1Y+pAvCg9TQ4FxI6jBbPyoHNA70FifVtSOQHGDEC8InWg8rQHWjklRojobu7kn4r0xZY2xWYs15ggVX4PQyEHpNTU6vZHT2TXRdPXAOKHhgWAttO0oTvo+9VZAjIVDEBF0qvBMlvmYJIYLqSoCjhBykcSN78UXrBjO5BKL8BpHtejWCld1VT6Z7nYrEBLgySD6HeMcp/fa6vqHzU220e/DECXtm5AA1jy9GFA7t8U6a+1uPrQFk4Ufp0UyXsun0PvN0NdhrHc37xm8k9Z0dB85V/7WLtkMaLLyjVNVIKImC76kxMMIQIQOn990BZVhZf3lg0nxRakOU/ZaLnmUVXrSwE+QEBAbgwhAqe8Vf6GhOARl2jRBLoweVvcyGYZ6GSt0mFWcj7Rhc1iDCECs2Ir9AF73+MXxYrtX0x1PyBrfbiWBG+n13S7xL9/jcIMIQPZDAffY+aQzneRLhCrUazJRLZoYCN7YIxPj4MJ5x7mmRRBntDcOgADAAAAwNinAAAAAACsiEMAAAAAALAEAAABaLnoHowObJB5tLnRBeh4p20/Ij8BAF8LAwDodkgXAAAADBTunqIsJ+NL0BSPxBCOCPdOj1BIsgwUaLnoHowObJB5tLnRBeh4p20/Ij8UwB8MCHRyYW5zZmVyDBTPduKL0AYsSkeO41VhARMZ88+k0kFifVtSOQHGDEDgj/SQT84EbWRZ4ZKhyjJTuLwVPDgVlQO3CGmgacItvni9nziJvTxziZXBG/0Hqkv68ddS1EH94RtWlqLQWRCjDEAWZUeSQ8KskILSvoWPN3836xpg/TYzOGiFVoePv91CFnap4fRFxdbporBgnZ/sUsjFZ74U8f+r0riqtvkdMMyGDEDx5iho79oDVYOCwIDH3K1UeDjAT6Hq9YsD9SCfJSE1rRsAdJPh2StYxdh9Jah1lwGbW0U+Wu6zpbVFf5CS6fFckxMMIQIQOn990BZVhZf3lg0nxRakOU/ZaLnmUVXrSwE+QEBAbgwhAqe8Vf6GhOARl2jRBLoweVvcyGYZ6GSt0mFWcj7Rhc1iDCECs2Ir9AF73+MXxYrtX0x1PyBrfbiWBG+n13S7xL9/jcIMIQPZDAffY+aQzneRLhCrUazJRLZoYCN7YIxPj4MJ5x7mmRRBntDcOg==" -const base64TxMoveNeo = "AAIAAADA2KcAAAAAAAx5QwAAAAAAsAQAAAHe7nnBifMAmLC6ai65CzqSWKbH/wEAWwsCGN31BQwUVVQtU+0PVUb61E1umZEoZwIvzl4MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwU9WPqQLwoPU0OBcSOowWz8qBzQO9BYn1bUjkBxgxATIm2/0zMxdiM7XnPfK71cV4fd0elAZwc7YH+0St3IWmPKYSMYfidX9xgLc98wLi8Ikp9cEmp7PUTyqoHqYmrqAxAbxxWY+bt2me1JH8pTHNMIfcnSLr7ZVW92P+jjp/Bzd0QrO1Sy4J2k990Z9YFgci0AcwJXY6yZw38Q0hqn0po3wxAhDKcmR3uZX5Egc5T6D/Ywttnw0vu01LewZMemWX+Wg7tPSBa1sz4rcZL8+EqwMoAnSXczJAV2GT1GrZDvNvBTJMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKU=" +const base64TxMoveNeo = "AAIAAADA2KcAAAAAAAx5QwAAAAAAsAQAAAFouegejA5skHm0udEF6HinbT8iPwEAWwsCGN31BQwU7p6iLCfjS9AUj8QQjgj3To9QSLIMFGi56B6MDmyQebS50QXoeKdtPyI/FMAfDAh0cmFuc2ZlcgwU9WPqQLwoPU0OBcSOowWz8qBzQO9BYn1bUjkBxgxAvCJ1oPK0B1o5JUaI6G7u5J+K9MWWNsVmLNeYIFV+D0MhB6TU1Or2R09k10XT1wDih4YFgLbTtKE76PvVWQIyFQxARdKrwTJb5mCSGC6kqAo4QcpHEje/FF6wYzuQSi/AaR7Xo1gpXdVU+me52KxAS4Mkg+h3jHKf32ur6h81NttHvwxAl7ZuQANY8vRhQO7fFOmvtbj60BZOFH6dFMl7Lp9D7zdDXYax3N+8ZvJPWdHQfOVf+1i7ZDGiy8o1TVSCiJgu+pMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQZ7Q3Do=" -const b1Verbose = `{"size":1430,"nextblockhash":"0xe03cb7e00a1e04b75f9acd56f22af5f15877a18f4a1cf69991319c4fba0b2fee","confirmations":10,"hash":"0x81a439175d3bdd8961b6223a9b6f6d234f996824c5cfce6af17e6fc14cd84355","version":0,"previousblockhash":"0x5b60644c6c6f58faca72c70689d7ed1f40c2e795772bd0de5a88e983ad55080c","merkleroot":"0xb12ae5aeb0335e8a62eb120aa91ecbc5629bc55dadd62fcb7f749818bd238cfd","time":1616059782001,"index":1,"nextconsensus":"NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6","primary":0,"witnesses":[{"invocation":"DEBR+fo+7/LGVhy4bPAztHNpwH3P1gbsnvsNH+P01+s1HuV5ZR3SpOqeqIPUf1XJ2PjTWyZVadOD9cCKyNlMWlP6DEABPcRuMLzsZvlQR74+/HcA/fWUl4i5AvWApybpJ8kExoeifaDV0BqHfGspeuPecZHKm9ZMoJURdcMXMQvdmd2zDED94bGb8NR17WNZu+L5q8t0h3RUfauhPKolJwtuWjnG1FEebS4p/o05uXpw0kudKNy6as5BsxWCu4NvtYho6XQT","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl"}],"tx":[{"hash":"0xf5fbd303799f24ba247529d7544d4276cca54ea79f4b98095f2b0557313c5275","size":488,"version":0,"nonce":2,"sender":"NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6","sysfee":"11000000","netfee":"4421900","validuntilblock":1200,"attributes":[],"signers":[{"account":"0xffc7a658923a0bb92e6abab09800f389c179eede","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBRVVC1T7Q9VRvrUTW6ZkShnAi/OXgwU3u55wYnzAJiwumouuQs6klimx/8UwB8MCHRyYW5zZmVyDBT1Y+pAvCg9TQ4FxI6jBbPyoHNA70FifVtSOQ==","witnesses":[{"invocation":"DEBMibb/TMzF2Iztec98rvVxXh93R6UBnBztgf7RK3chaY8phIxh+J1f3GAtz3zAuLwiSn1wSans9RPKqgepiauoDEBvHFZj5u3aZ7UkfylMc0wh9ydIuvtlVb3Y/6OOn8HN3RCs7VLLgnaT33Rn1gWByLQBzAldjrJnDfxDSGqfSmjfDECEMpyZHe5lfkSBzlPoP9jC22fDS+7TUt7Bkx6ZZf5aDu09IFrWzPitxkvz4SrAygCdJdzMkBXYZPUatkO828FM","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl"}]},{"hash":"0xfe60f7f4c720a7b0fde52f285ca173a3493bbb15eae9f5c44c1f71b493d5693c","size":492,"version":0,"nonce":3,"sender":"NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6","sysfee":"11000000","netfee":"4425900","validuntilblock":1200,"attributes":[],"signers":[{"account":"0xffc7a658923a0bb92e6abab09800f389c179eede","scopes":"CalledByEntry"}],"script":"CwMA6HZIFwAAAAwUVVQtU+0PVUb61E1umZEoZwIvzl4MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwUz3bii9AGLEpHjuNVYQETGfPPpNJBYn1bUjk=","witnesses":[{"invocation":"DEDUTymqNCsQOxQvsHZT67aH3kmvrK85sIdtaJ/q1HHpyk2rLtUUn/kDlPpbk0sshkEP2izllCr6tEiA6WJA5ZGLDEDKzE8svrBWwRMlmba9xVDdkEfsgdrzbCNCjIoauFAf6vKAUX9OZUfoTmgQ7P9uxDC52TrQJYkpysXJfN9eUrkoDECMfTD0i3ZOVrHXG/dPnGy1pKX2V7Z/JgNr6yYPBH7K2eYZGRI2fehawd1LwHsDVPM/vpbcOLGfY0UWn3+PcPdy","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl"}]}]}` +const b1Verbose = `{"size":1438,"nextblockhash":"0x34c20650683940a7af1881c2798e83acf9bf98aa226025af6c1d32b5530cc900","confirmations":15,"hash":"0x88c1cbf68695f73fb7b7d185c0037ffebdf032327488ebe65e0533d269e7de9b","version":0,"previousblockhash":"0x0f8fb4e17d2ab9f3097af75ca7fd16064160fb8043db94909e00dd4e257b9dc4","merkleroot":"0x2855f471048a5f0c9c60c10592f8997007aa3e52815d1b8c2c2f57e5e340d5f6","time":1626251469001,"nonce":"0","index":1,"nextconsensus":"NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq","primary":0,"witnesses":[{"invocation":"DEBg0hpK90iZlB4ZSCG7BOr7BsvPXGDax360lvqKeNFuzaGI1RYNH50/dhQLxocy90JdsIOyodd1sOJGEjZIt7ztDEAHc2avJzz6tK+FOQMIZO/FEEikJdLJX0+iZXFcsmDRpB7lo2wWMSQbcoTXNg7leuR0VeDsKJ+YdvCuTG5WbiqWDECa6Yjj+bK4te5KR5jdLF5kLt03csyozZcd/X7NPt89IsX01zpX8ec3e+B2qySJIOhEf3cK0i+5U5wyXiFcRI8x","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEGe0Nw6"}],"tx":[{"hash":"0xf01080c50f3198f5a539c4a06d024f1b8bdc2a360a215fa7e2488f79a56d501a","size":488,"version":0,"nonce":2,"sender":"NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq","sysfee":"11000000","netfee":"4421900","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x3f223f6da778e805d1b9b479906c0e8c1ee8b968","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBTunqIsJ+NL0BSPxBCOCPdOj1BIsgwUaLnoHowObJB5tLnRBeh4p20/Ij8UwB8MCHRyYW5zZmVyDBT1Y+pAvCg9TQ4FxI6jBbPyoHNA70FifVtSOQ==","witnesses":[{"invocation":"DEC8InWg8rQHWjklRojobu7kn4r0xZY2xWYs15ggVX4PQyEHpNTU6vZHT2TXRdPXAOKHhgWAttO0oTvo+9VZAjIVDEBF0qvBMlvmYJIYLqSoCjhBykcSN78UXrBjO5BKL8BpHtejWCld1VT6Z7nYrEBLgySD6HeMcp/fa6vqHzU220e/DECXtm5AA1jy9GFA7t8U6a+1uPrQFk4Ufp0UyXsun0PvN0NdhrHc37xm8k9Z0dB85V/7WLtkMaLLyjVNVIKImC76","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEGe0Nw6"}]},{"hash":"0xced32af656e144f6be5d7172ed37747831456cb3eeaac4ee964d0b479b45d3a8","size":492,"version":0,"nonce":3,"sender":"NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq","sysfee":"11000000","netfee":"4425900","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x3f223f6da778e805d1b9b479906c0e8c1ee8b968","scopes":"CalledByEntry"}],"script":"CwMA6HZIFwAAAAwU7p6iLCfjS9AUj8QQjgj3To9QSLIMFGi56B6MDmyQebS50QXoeKdtPyI/FMAfDAh0cmFuc2ZlcgwUz3bii9AGLEpHjuNVYQETGfPPpNJBYn1bUjk=","witnesses":[{"invocation":"DEDgj/SQT84EbWRZ4ZKhyjJTuLwVPDgVlQO3CGmgacItvni9nziJvTxziZXBG/0Hqkv68ddS1EH94RtWlqLQWRCjDEAWZUeSQ8KskILSvoWPN3836xpg/TYzOGiFVoePv91CFnap4fRFxdbporBgnZ/sUsjFZ74U8f+r0riqtvkdMMyGDEDx5iho79oDVYOCwIDH3K1UeDjAT6Hq9YsD9SCfJSE1rRsAdJPh2StYxdh9Jah1lwGbW0U+Wu6zpbVFf5CS6fFc","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEGe0Nw6"}]}]}` -const base64Header1 = "AAAAAAwIVa2D6Yha3tArd5XnwkAf7deJBsdyyvpYb2xMZGBb/YwjvRiYdH/LL9atXcWbYsXLHqkKEutiil4zsK7lKrFxU6tEeAEAAAEAAAAA3u55wYnzAJiwumouuQs6klimx/8BxgxAUfn6Pu/yxlYcuGzwM7RzacB9z9YG7J77DR/j9NfrNR7leWUd0qTqnqiD1H9Vydj401smVWnTg/XAisjZTFpT+gxAAT3EbjC87Gb5UEe+Pvx3AP31lJeIuQL1gKcm6SfJBMaHon2g1dAah3xrKXrj3nGRypvWTKCVEXXDFzEL3ZndswxA/eGxm/DUde1jWbvi+avLdId0VH2roTyqJScLblo5xtRRHm0uKf6NObl6cNJLnSjcumrOQbMVgruDb7WIaOl0E5MTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKU=" +const base64Header1 = "AAAAAMSdeyVO3QCekJTbQ4D7YEEGFv2nXPd6CfO5Kn3htI8P9tVA4+VXLyyMG12BUj6qB3CZ+JIFwWCcDF+KBHH0VSjJICSkegEAAAAAAAAAAAAAAQAAAABouegejA5skHm0udEF6HinbT8iPwHGDEBg0hpK90iZlB4ZSCG7BOr7BsvPXGDax360lvqKeNFuzaGI1RYNH50/dhQLxocy90JdsIOyodd1sOJGEjZIt7ztDEAHc2avJzz6tK+FOQMIZO/FEEikJdLJX0+iZXFcsmDRpB7lo2wWMSQbcoTXNg7leuR0VeDsKJ+YdvCuTG5WbiqWDECa6Yjj+bK4te5KR5jdLF5kLt03csyozZcd/X7NPt89IsX01zpX8ec3e+B2qySJIOhEf3cK0i+5U5wyXiFcRI8xkxMMIQIQOn990BZVhZf3lg0nxRakOU/ZaLnmUVXrSwE+QEBAbgwhAqe8Vf6GhOARl2jRBLoweVvcyGYZ6GSt0mFWcj7Rhc1iDCECs2Ir9AF73+MXxYrtX0x1PyBrfbiWBG+n13S7xL9/jcIMIQPZDAffY+aQzneRLhCrUazJRLZoYCN7YIxPj4MJ5x7mmRRBntDcOg==" -const header1Verbose = `{"hash":"0x81a439175d3bdd8961b6223a9b6f6d234f996824c5cfce6af17e6fc14cd84355","size":449,"version":0,"previousblockhash":"0x5b60644c6c6f58faca72c70689d7ed1f40c2e795772bd0de5a88e983ad55080c","merkleroot":"0xb12ae5aeb0335e8a62eb120aa91ecbc5629bc55dadd62fcb7f749818bd238cfd","time":1616059782001,"index":1,"nextconsensus":"NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6","witnesses":[{"invocation":"DEBR+fo+7/LGVhy4bPAztHNpwH3P1gbsnvsNH+P01+s1HuV5ZR3SpOqeqIPUf1XJ2PjTWyZVadOD9cCKyNlMWlP6DEABPcRuMLzsZvlQR74+/HcA/fWUl4i5AvWApybpJ8kExoeifaDV0BqHfGspeuPecZHKm9ZMoJURdcMXMQvdmd2zDED94bGb8NR17WNZu+L5q8t0h3RUfauhPKolJwtuWjnG1FEebS4p/o05uXpw0kudKNy6as5BsxWCu4NvtYho6XQT","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl"}],"confirmations":10,"nextblockhash":"0xe03cb7e00a1e04b75f9acd56f22af5f15877a18f4a1cf69991319c4fba0b2fee"}` +const header1Verbose = `{"hash":"0x88c1cbf68695f73fb7b7d185c0037ffebdf032327488ebe65e0533d269e7de9b","size":457,"version":0,"previousblockhash":"0x0f8fb4e17d2ab9f3097af75ca7fd16064160fb8043db94909e00dd4e257b9dc4","merkleroot":"0x2855f471048a5f0c9c60c10592f8997007aa3e52815d1b8c2c2f57e5e340d5f6","time":1626251469001,"index":1,"nextconsensus":"NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq","witnesses":[{"invocation":"DEBg0hpK90iZlB4ZSCG7BOr7BsvPXGDax360lvqKeNFuzaGI1RYNH50/dhQLxocy90JdsIOyodd1sOJGEjZIt7ztDEAHc2avJzz6tK+FOQMIZO/FEEikJdLJX0+iZXFcsmDRpB7lo2wWMSQbcoTXNg7leuR0VeDsKJ+YdvCuTG5WbiqWDECa6Yjj+bK4te5KR5jdLF5kLt03csyozZcd/X7NPt89IsX01zpX8ec3e+B2qySJIOhEf3cK0i+5U5wyXiFcRI8x","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEGe0Nw6"}],"confirmations":15,"nextblockhash":"0x34c20650683940a7af1881c2798e83acf9bf98aa226025af6c1d32b5530cc900"}` -const txMoveNeoVerbose = `{"blockhash":"0x81a439175d3bdd8961b6223a9b6f6d234f996824c5cfce6af17e6fc14cd84355","confirmations":10,"blocktime":1616059782001,"vmstate":"HALT","hash":"0xf5fbd303799f24ba247529d7544d4276cca54ea79f4b98095f2b0557313c5275","size":488,"version":0,"nonce":2,"sender":"NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6","sysfee":"11000000","netfee":"4421900","validuntilblock":1200,"attributes":[],"signers":[{"account":"0xffc7a658923a0bb92e6abab09800f389c179eede","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBRVVC1T7Q9VRvrUTW6ZkShnAi/OXgwU3u55wYnzAJiwumouuQs6klimx/8UwB8MCHRyYW5zZmVyDBT1Y+pAvCg9TQ4FxI6jBbPyoHNA70FifVtSOQ==","witnesses":[{"invocation":"DEBMibb/TMzF2Iztec98rvVxXh93R6UBnBztgf7RK3chaY8phIxh+J1f3GAtz3zAuLwiSn1wSans9RPKqgepiauoDEBvHFZj5u3aZ7UkfylMc0wh9ydIuvtlVb3Y/6OOn8HN3RCs7VLLgnaT33Rn1gWByLQBzAldjrJnDfxDSGqfSmjfDECEMpyZHe5lfkSBzlPoP9jC22fDS+7TUt7Bkx6ZZf5aDu09IFrWzPitxkvz4SrAygCdJdzMkBXYZPUatkO828FM","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl"}]}` +const txMoveNeoVerbose = `{"blockhash":"0x88c1cbf68695f73fb7b7d185c0037ffebdf032327488ebe65e0533d269e7de9b","confirmations":15,"blocktime":1626251469001,"vmstate":"HALT","hash":"0xf01080c50f3198f5a539c4a06d024f1b8bdc2a360a215fa7e2488f79a56d501a","size":488,"version":0,"nonce":2,"sender":"NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq","sysfee":"11000000","netfee":"4421900","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x3f223f6da778e805d1b9b479906c0e8c1ee8b968","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBTunqIsJ+NL0BSPxBCOCPdOj1BIsgwUaLnoHowObJB5tLnRBeh4p20/Ij8UwB8MCHRyYW5zZmVyDBT1Y+pAvCg9TQ4FxI6jBbPyoHNA70FifVtSOQ==","witnesses":[{"invocation":"DEC8InWg8rQHWjklRojobu7kn4r0xZY2xWYs15ggVX4PQyEHpNTU6vZHT2TXRdPXAOKHhgWAttO0oTvo+9VZAjIVDEBF0qvBMlvmYJIYLqSoCjhBykcSN78UXrBjO5BKL8BpHtejWCld1VT6Z7nYrEBLgySD6HeMcp/fa6vqHzU220e/DECXtm5AA1jy9GFA7t8U6a+1uPrQFk4Ufp0UyXsun0PvN0NdhrHc37xm8k9Z0dB85V/7WLtkMaLLyjVNVIKImC76","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEGe0Nw6"}]}` // getResultBlock1 returns data for block number 1 which is used by several tests. func getResultBlock1() *result.Block { @@ -71,16 +71,16 @@ func getResultBlock1() *result.Block { if err != nil { panic(err) } - b2Hash, err := util.Uint256DecodeStringLE("e03cb7e00a1e04b75f9acd56f22af5f15877a18f4a1cf69991319c4fba0b2fee") + b2Hash, err := util.Uint256DecodeStringLE("34c20650683940a7af1881c2798e83acf9bf98aa226025af6c1d32b5530cc900") if err != nil { panic(err) } return &result.Block{ Block: *b, BlockMetadata: result.BlockMetadata{ - Size: 1430, + Size: 1438, NextBlockHash: &b2Hash, - Confirmations: 10, + Confirmations: 15, }, } } @@ -265,7 +265,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ b := getResultBlock1() return &result.Header{ Hash: b.Hash(), - Size: 449, + Size: 457, Version: b.Version, NextBlockHash: b.NextBlockHash, PrevBlockHash: b.PrevHash, diff --git a/pkg/rpc/server/server_test.go b/pkg/rpc/server/server_test.go index e78c858aa..30dda685c 100644 --- a/pkg/rpc/server/server_test.go +++ b/pkg/rpc/server/server_test.go @@ -54,15 +54,15 @@ type rpcTestCase struct { check func(t *testing.T, e *executor, result interface{}) } -const testContractHash = "63cc6571e990dd3f345f699fc9c2a6e49edb89af" -const deploymentTxHash = "9b0c586eb07f8c9b6fc46b05c78d87651d50af8e1f44478827848d826f8cd174" -const genesisBlockHash = "73fe50b5564d57118296cbab0a78fe7cb11c97b7699d07a9a21fab60e79bb8fc" +const testContractHash = "bb6a679438ce0fc6cb0ed1aa85ce83cf96cd3aeb" +const deploymentTxHash = "1f8792e07f223e5e83f86cda3327cbe78c15ea382a1c350101c9119747682ce2" +const genesisBlockHash = "0f8fb4e17d2ab9f3097af75ca7fd16064160fb8043db94909e00dd4e257b9dc4" -const verifyContractHash = "c50082e0d8364d61ce6933bd24027a3363474dce" -const verifyContractAVM = "VwMAQS1RCDAhcAwU7p6iLCfjS9AUj8QQjgj3To9QSLLbMHFoE87bKGnbKJdA" -const verifyWithArgsContractHash = "8744ffdd07af8e9f18ab90685c8c2ebfd37c6415" -const invokescriptContractAVM = "VwcADBQBDAMOBQYMDQIODw0DDgcJAAAAANswcGhB+CfsjCGqJgQRQAwUDQ8DAgkAAgEDBwMEBQIBAA4GDAnbMHFpQfgn7IwhqiYEEkATQA==" -const nameServiceContractHash = "60d78a0fc048399438c3764f8a67d0fc86d6e0e6" +const verifyContractHash = "f68822e4ecd93de334bdf1f7c409eda3431bcbd0" +const verifyContractAVM = "VwIAQS1RCDAhcAwU7p6iLCfjS9AUj8QQjgj3To9QSLLbMHFoE87bKGnbKJdA" +const verifyWithArgsContractHash = "947c780f45b2a3d32e946355ee5cb57faf4decb7" +const invokescriptContractAVM = "VwIADBQBDAMOBQYMDQIODw0DDgcJAAAAANswcGhB+CfsjCGqJgQRQAwUDQ8DAgkAAgEDBwMEBQIBAA4GDAnbMHFpQfgn7IwhqiYEEkATQA==" +const nameServiceContractHash = "66206eb850818ec862a9332e0da10b9b7826cb0b" var rpcTestCases = map[string][]rpcTestCase{ "getapplicationlog": { @@ -1643,7 +1643,7 @@ func checkNep17Balances(t *testing.T, e *executor, acc interface{}) { }, { Asset: e.chain.UtilityTokenHash(), - Amount: "57941360260", + Amount: "57941227260", LastUpdated: 15, }}, Address: testchain.PrivateKeyByID(0).GetScriptHash().StringLE(), diff --git a/pkg/rpc/server/testdata/testblocks.acc b/pkg/rpc/server/testdata/testblocks.acc index e5aaa98583cf51db711bc80d67f63408c642f31e..cc610cb70603d2029802fd994cafede7a9628f29 100644 GIT binary patch delta 9816 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 delta 9542 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 Date: Wed, 14 Jul 2021 15:05:30 +0300 Subject: [PATCH 2/5] encoding/bigint: allow to convert unsigned integers Signed-off-by: Evgeniy Stratonikov --- pkg/encoding/bigint/bigint.go | 8 ++++++++ pkg/encoding/bigint/bigint_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/pkg/encoding/bigint/bigint.go b/pkg/encoding/bigint/bigint.go index 15d6df77b..aa189ca0a 100644 --- a/pkg/encoding/bigint/bigint.go +++ b/pkg/encoding/bigint/bigint.go @@ -4,6 +4,8 @@ import ( "encoding/binary" "math/big" "math/bits" + + "github.com/nspcc-dev/neo-go/pkg/util" ) const ( @@ -13,6 +15,12 @@ const ( wordSizeBytes = bits.UintSize / 8 ) +// FromBytesUnsigned converts data in little-endian format to an unsigned integer. +func FromBytesUnsigned(data []byte) *big.Int { + bs := util.ArrayReverse(data) + return new(big.Int).SetBytes(bs) +} + // FromBytes converts data in little-endian format to // an integer. func FromBytes(data []byte) *big.Int { diff --git a/pkg/encoding/bigint/bigint_test.go b/pkg/encoding/bigint/bigint_test.go index bb8c2207c..287582670 100644 --- a/pkg/encoding/bigint/bigint_test.go +++ b/pkg/encoding/bigint/bigint_test.go @@ -122,6 +122,31 @@ func TestBytesToInt(t *testing.T) { }) } +var unsignedCases = []struct { + number int64 + buf []byte +}{ + {0xff00000000, []byte{0x00, 0x00, 0x00, 0x00, 0xff}}, + {0xfd00000000, []byte{0x00, 0x00, 0x00, 0x00, 0xfd}}, + {0x8000000000, []byte{0x00, 0x00, 0x00, 0x00, 0x80}}, + {0xff0200000000, []byte{0x00, 0x00, 0x00, 0x00, 0x02, 0xff}}, + {0xff0100000000, []byte{0x00, 0x00, 0x00, 0x00, 0x01, 0xff}}, + {0xff0100000000, []byte{0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00}}, +} + +func TestBytesToUnsigned(t *testing.T) { + for _, tc := range testCases { + if tc.number > 0 { + num := FromBytesUnsigned(tc.buf) + assert.Equal(t, tc.number, num.Int64(), "expected %x, got %x", tc.number, num.Int64()) + } + } + for _, tc := range unsignedCases { + num := FromBytesUnsigned(tc.buf) + assert.Equal(t, tc.number, num.Int64(), "expected %x, got %x", tc.number, num.Int64()) + } +} + func TestEquivalentRepresentations(t *testing.T) { for _, tc := range testCases { buf := tc.buf From fdb54f2dc3f81c2dc864354a2e4b2a0e5981b8c0 Mon Sep 17 00:00:00 2001 From: Evgeniy Stratonikov Date: Wed, 14 Jul 2021 15:45:30 +0300 Subject: [PATCH 3/5] core/test: get rid of empty tx scripts Signed-off-by: Evgeniy Stratonikov --- pkg/core/native_designate_test.go | 2 +- pkg/core/native_neo_test.go | 2 +- pkg/core/native_oracle_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/core/native_designate_test.go b/pkg/core/native_designate_test.go index 0846a8a2c..472c28c72 100644 --- a/pkg/core/native_designate_test.go +++ b/pkg/core/native_designate_test.go @@ -122,7 +122,7 @@ func TestDesignate_DesignateAsRole(t *testing.T) { bc := newTestChain(t) des := bc.contracts.Designate - tx := transaction.New([]byte{}, 0) + tx := transaction.New([]byte{byte(opcode.PUSH1)}, 0) bl := block.New(bc.config.StateRootInHeader) bl.Index = bc.BlockHeight() + 1 ic := bc.newInteropContext(trigger.OnPersist, bc.dao, bl, tx) diff --git a/pkg/core/native_neo_test.go b/pkg/core/native_neo_test.go index 87ff08ab4..6db7d0eba 100644 --- a/pkg/core/native_neo_test.go +++ b/pkg/core/native_neo_test.go @@ -205,7 +205,7 @@ func TestNEO_CalculateBonus(t *testing.T) { bc := newTestChain(t) neo := bc.contracts.NEO - tx := transaction.New([]byte{}, 0) + tx := transaction.New([]byte{byte(opcode.PUSH1)}, 0) ic := bc.newInteropContext(trigger.Application, bc.dao, nil, tx) ic.SpawnVM() ic.VM.LoadScript([]byte{byte(opcode.RET)}) diff --git a/pkg/core/native_oracle_test.go b/pkg/core/native_oracle_test.go index 660eb1ba7..4ba681a31 100644 --- a/pkg/core/native_oracle_test.go +++ b/pkg/core/native_oracle_test.go @@ -147,7 +147,7 @@ func TestOracle_Request(t *testing.T) { require.NoError(t, err) pub := priv.PublicKey() - tx := transaction.New([]byte{}, 0) + tx := transaction.New([]byte{byte(opcode.PUSH1)}, 0) bl := block.New(bc.config.StateRootInHeader) bl.Index = bc.BlockHeight() + 1 setSigner(tx, testchain.CommitteeScriptHash()) From 8077f9232d9e82ab1aa58ba631442461dc684309 Mon Sep 17 00:00:00 2001 From: Evgeniy Stratonikov Date: Wed, 14 Jul 2021 15:05:28 +0300 Subject: [PATCH 4/5] interop: implement `System.Runtime.GetRandom` Our murmur3 implementation is architecture independent and optimized in assembly. Signed-off-by: Evgeniy Stratonikov --- go.mod | 1 + go.sum | 2 + pkg/compiler/syscall_test.go | 1 + pkg/core/blockchain.go | 1 + pkg/core/interop/context.go | 14 +++++ pkg/core/interop/interopnames/names.go | 2 + pkg/core/interop/runtime/util.go | 19 +++++++ pkg/core/interop/runtime/util_test.go | 18 ++++++ pkg/core/interop_system_test.go | 76 ++++++++++++++++++++++++++ pkg/core/interops.go | 1 + pkg/interop/runtime/runtime.go | 7 +++ 11 files changed, 142 insertions(+) diff --git a/go.mod b/go.mod index 9a784e170..9f781f3e6 100644 --- a/go.mod +++ b/go.mod @@ -17,6 +17,7 @@ require ( github.com/prometheus/client_golang v1.2.1 github.com/stretchr/testify v1.6.1 github.com/syndtr/goleveldb v0.0.0-20180307113352-169b1b37be73 + github.com/twmb/murmur3 v1.1.5 github.com/urfave/cli v1.20.0 github.com/virtuald/go-ordered-json v0.0.0-20170621173500-b18e6e673d74 go.etcd.io/bbolt v1.3.4 diff --git a/go.sum b/go.sum index 771128fe8..09e09df7b 100644 --- a/go.sum +++ b/go.sum @@ -228,6 +228,8 @@ github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/syndtr/goleveldb v0.0.0-20180307113352-169b1b37be73 h1:I2drr5K0tykBofr74ZEGliE/Hf6fNkEbcPyFvsy7wZk= github.com/syndtr/goleveldb v0.0.0-20180307113352-169b1b37be73/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= +github.com/twmb/murmur3 v1.1.5 h1:i9OLS9fkuLzBXjt6dptlAEyk58fJsSTXbRg3SgVyqgk= +github.com/twmb/murmur3 v1.1.5/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= diff --git a/pkg/compiler/syscall_test.go b/pkg/compiler/syscall_test.go index a41564437..2d864c520 100644 --- a/pkg/compiler/syscall_test.go +++ b/pkg/compiler/syscall_test.go @@ -76,6 +76,7 @@ func TestSyscallExecution(t *testing.T) { "runtime.GetInvocationCounter": {interopnames.SystemRuntimeGetInvocationCounter, nil, false}, "runtime.GetNetwork": {interopnames.SystemRuntimeGetNetwork, nil, false}, "runtime.GetNotifications": {interopnames.SystemRuntimeGetNotifications, []string{u160}, false}, + "runtime.GetRandom": {interopnames.SystemRuntimeGetRandom, nil, false}, "runtime.GetScriptContainer": {interopnames.SystemRuntimeGetScriptContainer, nil, false}, "runtime.GetTime": {interopnames.SystemRuntimeGetTime, nil, false}, "runtime.GetTrigger": {interopnames.SystemRuntimeGetTrigger, nil, false}, diff --git a/pkg/core/blockchain.go b/pkg/core/blockchain.go index 46e711615..aad8bf483 100644 --- a/pkg/core/blockchain.go +++ b/pkg/core/blockchain.go @@ -1908,6 +1908,7 @@ func (bc *Blockchain) newInteropContext(trigger trigger.Type, d dao.DAO, block * case block != nil: ic.Container = block } + ic.InitNonceData() return ic } diff --git a/pkg/core/interop/context.go b/pkg/core/interop/context.go index 4379a0fb2..6e7f94618 100644 --- a/pkg/core/interop/context.go +++ b/pkg/core/interop/context.go @@ -1,6 +1,7 @@ package interop import ( + "encoding/binary" "errors" "fmt" "sort" @@ -39,6 +40,7 @@ type Context struct { Natives []Contract Trigger trigger.Type Block *block.Block + NonceData [16]byte Tx *transaction.Transaction DAO *dao.Cached Notifications []state.NotificationEvent @@ -70,6 +72,18 @@ func NewContext(trigger trigger.Type, bc blockchainer.Blockchainer, d dao.DAO, } } +// InitNonceData initializes nonce to be used in `GetRandom` calculations. +func (ic *Context) InitNonceData() { + if tx, ok := ic.Container.(*transaction.Transaction); ok { + copy(ic.NonceData[:], tx.Hash().BytesBE()) + } + if ic.Block != nil { + nonce := ic.Block.Nonce + nonce ^= binary.LittleEndian.Uint64(ic.NonceData[:]) + binary.LittleEndian.PutUint64(ic.NonceData[:], nonce) + } +} + // Function binds function name, id with the function itself and price, // it's supposed to be inited once for all interopContexts, so it doesn't use // vm.InteropFuncPrice directly. diff --git a/pkg/core/interop/interopnames/names.go b/pkg/core/interop/interopnames/names.go index e075d37d1..eaa5ce8a8 100644 --- a/pkg/core/interop/interopnames/names.go +++ b/pkg/core/interop/interopnames/names.go @@ -26,6 +26,7 @@ const ( SystemRuntimeGetInvocationCounter = "System.Runtime.GetInvocationCounter" SystemRuntimeGetNetwork = "System.Runtime.GetNetwork" SystemRuntimeGetNotifications = "System.Runtime.GetNotifications" + SystemRuntimeGetRandom = "System.Runtime.GetRandom" SystemRuntimeGetScriptContainer = "System.Runtime.GetScriptContainer" SystemRuntimeGetTime = "System.Runtime.GetTime" SystemRuntimeGetTrigger = "System.Runtime.GetTrigger" @@ -64,6 +65,7 @@ var names = []string{ SystemRuntimeGetInvocationCounter, SystemRuntimeGetNetwork, SystemRuntimeGetNotifications, + SystemRuntimeGetRandom, SystemRuntimeGetScriptContainer, SystemRuntimeGetTime, SystemRuntimeGetTrigger, diff --git a/pkg/core/interop/runtime/util.go b/pkg/core/interop/runtime/util.go index b6f372bf2..77f311061 100644 --- a/pkg/core/interop/runtime/util.go +++ b/pkg/core/interop/runtime/util.go @@ -1,13 +1,16 @@ package runtime import ( + "encoding/binary" "errors" "github.com/nspcc-dev/neo-go/pkg/core/interop" "github.com/nspcc-dev/neo-go/pkg/core/state" + "github.com/nspcc-dev/neo-go/pkg/encoding/bigint" "github.com/nspcc-dev/neo-go/pkg/util" "github.com/nspcc-dev/neo-go/pkg/vm" "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" + "github.com/twmb/murmur3" ) // GasLeft returns remaining amount of GAS. @@ -74,3 +77,19 @@ func GetNetwork(ic *interop.Context) error { ic.VM.Estack().PushVal(uint32(m)) return nil } + +// GetRandom returns pseudo-random number which depends on block nonce and transaction hash. +func GetRandom(ic *interop.Context) error { + res := murmur128(ic.NonceData[:], ic.Network) + ic.VM.Estack().PushVal(bigint.FromBytesUnsigned(res)) + copy(ic.NonceData[:], res) + return nil +} + +func murmur128(data []byte, seed uint32) []byte { + h1, h2 := murmur3.SeedSum128(uint64(seed), uint64(seed), data) + result := make([]byte, 16) + binary.LittleEndian.PutUint64(result, h1) + binary.LittleEndian.PutUint64(result[8:], h2) + return result +} diff --git a/pkg/core/interop/runtime/util_test.go b/pkg/core/interop/runtime/util_test.go index b614188a3..4827498c4 100644 --- a/pkg/core/interop/runtime/util_test.go +++ b/pkg/core/interop/runtime/util_test.go @@ -1,6 +1,7 @@ package runtime import ( + "encoding/hex" "testing" "github.com/nspcc-dev/neo-go/internal/random" @@ -114,3 +115,20 @@ func TestRuntimeGetInvocationCounter(t *testing.T) { checkStack(t, ic.VM, 42) }) } + +// Test compatibility with C# implementation. +// https://github.com/neo-project/neo/blob/master/tests/neo.UnitTests/Cryptography/UT_Murmur128.cs +func TestMurmurCompat(t *testing.T) { + res := murmur128([]byte("hello"), 123) + require.Equal(t, "0bc59d0ad25fde2982ed65af61227a0e", hex.EncodeToString(res)) + + res = murmur128([]byte("world"), 123) + require.Equal(t, "3d3810fed480472bd214a14023bb407f", hex.EncodeToString(res)) + + res = murmur128([]byte("hello world"), 123) + require.Equal(t, "e0a0632d4f51302c55e3b3e48d28795d", hex.EncodeToString(res)) + + bs, _ := hex.DecodeString("718f952132679baa9c5c2aa0d329fd2a") + res = murmur128(bs, 123) + require.Equal(t, "9b4aa747ff0cf4e41b3d96251551c8ae", hex.EncodeToString(res)) +} diff --git a/pkg/core/interop_system_test.go b/pkg/core/interop_system_test.go index 62780a6bc..5b763952b 100644 --- a/pkg/core/interop_system_test.go +++ b/pkg/core/interop_system_test.go @@ -8,6 +8,9 @@ import ( "github.com/nspcc-dev/neo-go/internal/random" "github.com/nspcc-dev/neo-go/internal/testchain" + "github.com/nspcc-dev/neo-go/pkg/config" + "github.com/nspcc-dev/neo-go/pkg/config/netmode" + "github.com/nspcc-dev/neo-go/pkg/core/block" "github.com/nspcc-dev/neo-go/pkg/core/dao" "github.com/nspcc-dev/neo-go/pkg/core/interop" "github.com/nspcc-dev/neo-go/pkg/core/interop/contract" @@ -35,6 +38,79 @@ import ( "github.com/stretchr/testify/require" ) +// Tests are taken from +// https://github.com/neo-project/neo/blob/master/tests/neo.UnitTests/SmartContract/UT_ApplicationEngine.Runtime.cs +func TestRuntimeGetRandomCompatibility(t *testing.T) { + bc := newTestChain(t) + + b := getSharpTestGenesis(t) + tx := getSharpTestTx(util.Uint160{}) + ic := bc.newInteropContext(trigger.Application, dao.NewCached(bc.dao), b, tx) + ic.Network = uint32(netmode.MainNet) + + ic.VM = vm.New() + ic.VM.LoadScript([]byte{0x01}) + + require.NoError(t, runtime.GetRandom(ic)) + require.Equal(t, "225932872514876835587448704843370203748", ic.VM.Estack().Pop().BigInt().String()) + + require.NoError(t, runtime.GetRandom(ic)) + require.Equal(t, "190129535548110356450238097068474508661", ic.VM.Estack().Pop().BigInt().String()) + + require.NoError(t, runtime.GetRandom(ic)) + require.Equal(t, "48930406787011198493485648810190184269", ic.VM.Estack().Pop().BigInt().String()) + + require.NoError(t, runtime.GetRandom(ic)) + require.Equal(t, "66199389469641263539889463157823839112", ic.VM.Estack().Pop().BigInt().String()) + + require.NoError(t, runtime.GetRandom(ic)) + require.Equal(t, "217172703763162599519098299724476526911", ic.VM.Estack().Pop().BigInt().String()) +} + +func TestRuntimeGetRandomDifferentTransactions(t *testing.T) { + bc := newTestChain(t) + b, _ := bc.GetBlock(bc.GetHeaderHash(0)) + + tx1 := transaction.New([]byte{byte(opcode.PUSH1)}, 0) + ic1 := bc.newInteropContext(trigger.Application, dao.NewCached(bc.dao), b, tx1) + ic1.VM = vm.New() + ic1.VM.LoadScript(tx1.Script) + + tx2 := transaction.New([]byte{byte(opcode.PUSH2)}, 0) + ic2 := bc.newInteropContext(trigger.Application, dao.NewCached(bc.dao), b, tx2) + ic2.VM = vm.New() + ic2.VM.LoadScript(tx2.Script) + + require.NoError(t, runtime.GetRandom(ic1)) + require.NoError(t, runtime.GetRandom(ic2)) + require.NotEqual(t, ic1.VM.Estack().Pop().BigInt(), ic2.VM.Estack().Pop().BigInt()) + + require.NoError(t, runtime.GetRandom(ic1)) + require.NoError(t, runtime.GetRandom(ic2)) + require.NotEqual(t, ic1.VM.Estack().Pop().BigInt(), ic2.VM.Estack().Pop().BigInt()) +} + +func getSharpTestTx(sender util.Uint160) *transaction.Transaction { + tx := transaction.New([]byte{byte(opcode.PUSH2)}, 0) + tx.Nonce = 0 + tx.Signers = append(tx.Signers, transaction.Signer{ + Account: sender, + Scopes: transaction.CalledByEntry, + }) + tx.Scripts = append(tx.Scripts, transaction.Witness{}) + return tx +} + +func getSharpTestGenesis(t *testing.T) *block.Block { + const configPath = "../../config" + + cfg, err := config.Load(configPath, netmode.MainNet) + require.NoError(t, err) + b, err := createGenesisBlock(cfg.ProtocolConfiguration) + require.NoError(t, err) + return b +} + func TestContractCreateAccount(t *testing.T) { v, ic, _ := createVM(t) t.Run("Good", func(t *testing.T) { diff --git a/pkg/core/interops.go b/pkg/core/interops.go index 20ad26dca..030b9a8d3 100644 --- a/pkg/core/interops.go +++ b/pkg/core/interops.go @@ -52,6 +52,7 @@ var systemInterops = []interop.Function{ {Name: interopnames.SystemRuntimeGetInvocationCounter, Func: runtime.GetInvocationCounter, Price: 1 << 4}, {Name: interopnames.SystemRuntimeGetNetwork, Func: runtime.GetNetwork, Price: 1 << 3}, {Name: interopnames.SystemRuntimeGetNotifications, Func: runtime.GetNotifications, Price: 1 << 8, ParamCount: 1}, + {Name: interopnames.SystemRuntimeGetRandom, Func: runtime.GetRandom, Price: 1 << 4}, {Name: interopnames.SystemRuntimeGetScriptContainer, Func: engineGetScriptContainer, Price: 1 << 3}, {Name: interopnames.SystemRuntimeGetTime, Func: runtime.GetTime, Price: 1 << 3, RequiredFlags: callflag.ReadStates}, {Name: interopnames.SystemRuntimeGetTrigger, Func: runtime.GetTrigger, Price: 1 << 3}, diff --git a/pkg/interop/runtime/runtime.go b/pkg/interop/runtime/runtime.go index c5e36a7f1..f82a1ed4d 100644 --- a/pkg/interop/runtime/runtime.go +++ b/pkg/interop/runtime/runtime.go @@ -96,3 +96,10 @@ func GetInvocationCounter() int { func Platform() []byte { return neogointernal.Syscall0("System.Runtime.Platform").([]byte) } + +// GetRandom returns pseudo-random number which depends on block nonce and tx hash. +// Each invocation will return a different number. This function uses +// `System.Runtime.GetRandom` syscall. +func GetRandom() int { + return neogointernal.Syscall0("System.Runtime.GetRandom").(int) +} From 85ce207f4065c642de314b2c0cf9851627d552fa Mon Sep 17 00:00:00 2001 From: Evgeniy Stratonikov Date: Wed, 14 Jul 2021 16:04:50 +0300 Subject: [PATCH 5/5] consensus: add `Nonce` to `PrepareRequest` Signed-off-by: Evgeniy Stratonikov --- pkg/consensus/consensus.go | 13 +++++++++++++ pkg/consensus/prepare_request.go | 7 +++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/pkg/consensus/consensus.go b/pkg/consensus/consensus.go index ee2cababd..db6555ad1 100644 --- a/pkg/consensus/consensus.go +++ b/pkg/consensus/consensus.go @@ -1,6 +1,8 @@ package consensus import ( + "crypto/rand" + "encoding/binary" "errors" "fmt" "sort" @@ -239,9 +241,19 @@ func (s *service) newPrepareRequest() payload.PrepareRequest { panic(err) } } + r.nonce = s.getNonce() return r } +func (s *service) getNonce() uint64 { + b := make([]byte, 8) + _, err := rand.Read(b) + if err != nil { + panic(err) + } + return binary.LittleEndian.Uint64(b) +} + func (s *service) Start() { if s.started.CAS(false, true) { s.log.Info("starting consensus service") @@ -649,6 +661,7 @@ func (s *service) newBlockFromContext(ctx *dbft.Context) block.Block { block := &neoBlock{network: s.ProtocolConfiguration.Magic} block.Block.Timestamp = ctx.Timestamp / nsInMs + block.Block.Nonce = ctx.PreparationPayloads[ctx.PrimaryIndex].GetPrepareRequest().Nonce() block.Block.Index = ctx.BlockIndex if s.ProtocolConfiguration.StateRootInHeader { sr, err := s.Chain.GetStateModule().GetStateRoot(ctx.BlockIndex - 1) diff --git a/pkg/consensus/prepare_request.go b/pkg/consensus/prepare_request.go index 3ce5d2f77..4cbc61f04 100644 --- a/pkg/consensus/prepare_request.go +++ b/pkg/consensus/prepare_request.go @@ -12,6 +12,7 @@ type prepareRequest struct { version uint32 prevHash util.Uint256 timestamp uint64 + nonce uint64 transactionHashes []util.Uint256 stateRootEnabled bool stateRoot util.Uint256 @@ -24,6 +25,7 @@ func (p *prepareRequest) EncodeBinary(w *io.BinWriter) { w.WriteU32LE(p.version) w.WriteBytes(p.prevHash[:]) w.WriteU64LE(p.timestamp) + w.WriteU64LE(p.nonce) w.WriteArray(p.transactionHashes) if p.stateRootEnabled { w.WriteBytes(p.stateRoot[:]) @@ -35,6 +37,7 @@ func (p *prepareRequest) DecodeBinary(r *io.BinReader) { p.version = r.ReadU32LE() r.ReadBytes(p.prevHash[:]) p.timestamp = r.ReadU64LE() + p.nonce = r.ReadU64LE() r.ReadArray(&p.transactionHashes, block.MaxTransactionsPerBlock) if p.stateRootEnabled { r.ReadBytes(p.stateRoot[:]) @@ -68,10 +71,10 @@ func (p *prepareRequest) Timestamp() uint64 { return p.timestamp * nsInMs } func (p *prepareRequest) SetTimestamp(ts uint64) { p.timestamp = ts / nsInMs } // Nonce implements payload.PrepareRequest interface. -func (p *prepareRequest) Nonce() uint64 { return 0 } +func (p *prepareRequest) Nonce() uint64 { return p.nonce } // SetNonce implements payload.PrepareRequest interface. -func (p *prepareRequest) SetNonce(nonce uint64) {} +func (p *prepareRequest) SetNonce(nonce uint64) { p.nonce = nonce } // TransactionHashes implements payload.PrepareRequest interface. func (p *prepareRequest) TransactionHashes() []util.Uint256 { return p.transactionHashes }