From 4462a6a6b73762ef41f02ec656a321354e7d0649 Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Fri, 12 Mar 2021 11:27:50 +0300 Subject: [PATCH] change block/tx/extensible signing process, fix #1741 Sign [magic, hash], see neo-project/neo#2314. --- cli/testdata/chain50x2.acc | Bin 45322 -> 45322 bytes pkg/core/block/block_test.go | 6 +++--- pkg/core/block/header.go | 24 ++++++++++++++++------- pkg/core/test_data/block_1.json | 4 ++-- pkg/core/transaction/transaction.go | 18 +++++++++++++++-- pkg/core/transaction/transaction_test.go | 4 ++-- pkg/core/util_test.go | 2 +- pkg/network/payload/extensible.go | 24 ++++++++++------------- pkg/rpc/client/rpc_test.go | 6 +++--- pkg/rpc/client/wsclient_test.go | 2 +- pkg/rpc/server/server_test.go | 9 ++++----- pkg/rpc/server/testdata/testblocks.acc | Bin 9788 -> 9788 bytes pkg/smartcontract/context/context.go | 4 +++- 13 files changed, 62 insertions(+), 41 deletions(-) diff --git a/cli/testdata/chain50x2.acc b/cli/testdata/chain50x2.acc index cae5ac69f7dc2be0a0c6e1cfb49b2424c3663215..e6f0997fe963a8f6ea669b0ae914533b09c2d679 100644 GIT binary patch literal 45322 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 W_qWPiK}n}GTK$DzeKGSO7WO~xNNPU- literal 45322 zcmd44byQVR|L#l2X46PYBi-F>x=XqnX^?J_l15s(q@=sMkrqK3L;>k8iG#lSo^yUz z#@&v4|Bx|s4;YKN_OqVnGw0fKedmM?0s_M7{@?!}Um;s~`)ZKCT3Xuk=nOrEcvI12 z#n_0%8>^Y$e+LNxi4Ktn`=29*6~ylFXIr7kooqZwgjcVuAXPegW`&jy2M{!o=h)wMwe9M_Lq*yo(mPGl-!Q(T0HbS?x9S>q zW-t2mN_04_qN*&kkv^4<*T*m8RzDn_7{;|KvL*gApEk)`s-1*7)G>W z<&r_MItxQ`FT)7M=m5kGqV;4fVXsk}JgA=@c6=)M`3m$9{rURir;vZN0zwA~3S#vX z7Kk;u9X{~lMQd_)hu%l(-r+2%19l7`)}MX}tAiMb;OuB*=VWf?2*f%y*#fmt3&^9u z_C)2vRv%?Kf%b)seRQ7kK;9c2v++iz!ni#_wERrX5m9zFjZijCMvWA?UG%ku<8nsQ zD|l7RJ6Hddg7Z0~H}O>riKAk937*JUW>10+`*xBLfuKboB!VJ=4;>Z^ra>;NUHVuf zpG|D8YhA4j7rr$n%kC;`yw~VaZlO)>p1D@jwsJf%9se@r@bfB<)5gWci*_LB?pyy#Yzi9OT<#S2M|EtdiNYD@vk2E%j?KqJM4Cf|FcRIYwIs<}?1s`RZ03PFTS1d=LB%zeK*oWs3+=I7Jybn>p^RKuPQ2-<3XY~s~NPCPMXtJuijaaiC$ z2KOjG1MAtR&ZZNL{nw{h$;(1}&(;A|5T>y#X6$LiUL+C7uuid=Rx-hul}!Jl*Pbvx z-G=y{y;g;3QGZnR)v#9@zgxVa80S3wE3uG~+3cKMg3a@f@kK)cnJ^7jSk>jX_SS4> zR?w4A4S11E^6jh>9ro^|fA!2iJBdG${R3DU6IAEc+!8JE#cv(W`SJ5~!f=vhseAkt zhjEG(&!NgC&ZSz`&M4HhVqe;ha<}vqv^bCuEd)q4N;P$+7=qK`>rR0_`W%lRA$m#ox?3uJ+kYY zdJ6<`BXbc{Y!?;h_4&_%97An}!ZFW>@Q`&xgK(43(PlyqO&X56yb_|h9t|o~9ddg2 zr|0`lfj-l~Uo*eYl=}qy7fpnOxa(CjfcS!>`s4EZCBFIT>Cc||PhBqr#0@SK@+(L$ zGCLz%GcsN>F&A40QG2`le%HjAjGoNM*piIbi_F%{*}~q`iHuk0zXuvv+F3eV8rfKS zn%y5~Z*J~n=1j)ROi$)u(!u4&DStP`@;}@9?{U^<9{0!nYEi_)*-Y5c(a3}B|7gk8$j0Tz+xmYV z1I8P=Kg7({%+C4e`}d(Id**2G;_yq1gPEhPrIVATz1@EGGP8JQWJ&77S71Lj}-kE;$ToO2G(>U@E$QT$yv z4cb$wq4vN+IF|0GTd-ko_AxxNEQG?** zrM5?b@iM=9pP$V=)cd3&O$H`Pge})vR$Yjz7^uMf@1-c)R6FAAU8*X`KAJ)@JX90=mOpWAUnf&X~<>-C2fkbmlZAR+jG09L7Rfz?WqA(gK{z`jua+z~qD$SMDi zghJnU2tX_@`sJZg2DO0^WrJnEqOb76(^A;~jpvbPySKvQR)t-?+D*uGHZlJUdrM}h z$2=ILtUZGVx)z#ub-fyEkw@@55jBu>IqD;`?ntmmSbb!!oK<@}A6vnWC&bUu?5~7H zQm1cs^fTKOQ~&|b#jY3)YU?lpr@<7K!byzA4N12*)G%jVuIjh0X<9NdF{1rpmq?j~ zgsQtFKgH&SNLLct#TvT|&Xg#pt@lmF4s>@=!((?tb1xJjC5;F{65;&&dpxl!7oD>|p+t5#0CE zF>eB<5X92Tz}!vZ_qfzA4)U83a08=0y*1FE49(-qUQ-t+!KheI(y5-vduQ1U>lAQpj&)jD8#|S|dseR1Y2#fVX0#hs2ZSd2 zH@W-S-TjYv{;=XT70I8-LjA=|T<7w3K*Jdyjw-Op*2hq%lAPB8pM=7hc!UbMAz3HsCIyv>^R)%RS43P+}#@iYUH zm+!~g_~TrU7{9DRhI{>HTuCqig5aCXPI3*BtH-(0`>QW|5f&ty zZ^vB(P0N*(Z=JNB#=iyF^c!8U)}gjWW|X6;AV;Mre=z1vrc+urZ`zY+J_Lfs_gKFY zI$Ix@&AP1fwI^gn3QaIx^NOtB@_)ezE465+?kFOAeHGzB?W&Uac4s%U{JZ*~R|ij} z;CqbCjHK5U|0Z`oFZ=(9=Z~K~%$kxMs9nviKl^QX^@bkPD#e~c; z;y&2Iesfo_u*Ax9vG3C}gc2C_?I7*czzFX^o&Ke=;<+ix}@x)t?8?Q=8%5EOnT;#4u#P4Es= zCr2wL-=9(+njlR!ivP)y@Vh}p91F(Cxb8E7cJw;dj_x*=jeTK=j+_ilsr9%my7Qt( zs30Kd8FGNN&l5L8-hzIfSrPp*?;6Blz)DC<2l3HSfQBjW2u#~Kb7d3+omLOd76S2T zng8Gr4eE{?1{Hi07ew2Wf0H}-Kg9Eg6%TV4U|1oBq9lpUItT<<`;Aoj9S5F%8V56; z6<@u!10U6yrp4+QCBI89-(JF6NR_w?)g!ix7ge##_;j!*|8&cNGNZ_43fdq#A<9Xr z0d9XZ`ZnefpMV9A2-xw2K=^B6Xprq_fPfYkg!}u{gKTI9hCBh#hHxaXQcJVE@YiqdyT`;KWluyDCMT z9ms&!=U@x_&7G;*^z))56Gofr*9t|=g==;koE2@o%4qtH+ng`* zX#{|ze2h*RQE_6;ffd)*`siEQBK-=#xceD^hq${MQCefe`BFJ#dXq}&K(d;5Kqt(s zOg@N+<0?U^I0?sf{oQ1YRSnA2zwtJajqLG{nXU!mR^4#2pzuJG0N<@ z0l}G|s+>6g<~(l%gTrC3aH$WGloyfo2kt4)?{Tw`xMxq1xfZjA5T`@0PU5(nc8?j= ztDK{JsDPk)e!DI=Gkq#!R@TzVOm0?)(NFt9jB{>T>iD&l)4ri>m&~3}cGgJh9y8=k z*0MQy?nr6erZ!HH^~n*yjIUe&CU=N`i02P09_G#%s@fXP@-!6pF%U3R%jDkGZuuiFiG-6Wq_Zd;R1yi3{pO8k-ECBKI8zZ% zrP8kDjDUBQaC!A(-b!M8u;U2<_-kQza1nA$om;khXh6WJjulH2u$`=90Zd`s^-ts# zLw9c>%UDEa&SdQIwnLqIlXi-p?vXXy@^21Ls=v>txYdwU8XCUbB0oeKz~PTdmd7Gc zf@NA!#bGQ0Ti9>z;Lr!4sYhH&!}Ri#JL}g{oo5MnTu|6=CR{CE2(!s8?;0bJCkT7! zVxl3?kDjuVz-?a3;z4?E<)V(FC3}dEjl9=5i4kSVoI(A zjTIFT9*7+hFp1I(iLI_|IK%+`VGe7qR&|yHa-pVgYCvI>vDS2=%vicl=Ri=Z%6Amo zbkf4RuTRItdx@i!`H)6KD@o?X<-;E5H2KNUebNiX?3FBZU@sF<2oFdPMfzIx3JOvs zq!O>!Ph^`C2=Zs^PfY84-d2kd^6D_`S)sD%U`*9>g%e2M0X&`|8BuO?9JW?`-^q@A zhM++>i?IT#g!2-&y9fvOvxrEqZ{hzYcSwJT=MO6$=FX^(zPqH>w{AKd2neow{K26J z!Pp+$`%LkZIorg$)j}QU4Sls3HoGK(WYyy0QEK}m?6XBRhchS`zAE8ajPZ~0cFvW; z(zB|>oYfiu*;rl*sCYh7%N}6I69V|x!bS#?-e09-R4vc|0lJ}P$w6~W>m061NrhL6bLzW= zWKH!Dz+W?3<-Gt~*l+GQET+jOm51jA&$9?rJ*1~XC&I2xJ1MM!y}8*g0u2|kErQ)< z^@%gIyW#vnWL}bFaifh<@rn?Q;famppjC3EU)=rdcpu{KLrc4fYV6#`Ak@pJ##|!T zFW4Y#mtBXScNx{Y_cO(jBhC1K-Ov`HRiB$fIOnXoFbG^`ZBv zFbi)cV68@^by<6c8E{aQt$ZDpF__zk|4r_Y{}9g~Ry@pIN&820sQxP6h5PYt|7CVR zrZYwD^Jp;RSzUMNOq{a8ozdPPuLOp|zO9wli5Ga2wY$L5yHq0g|xoraoKwsVSvrUYYKUxD* zSoENm-GZr3qy#@wG~Q&Ye8)lJio={V6AP5OOrbAFiudy^Q{hw^4qi{uf$R5m)TlgW z-(~6{i-h>YEWYFWZh$T9H+SFI608z2LTagBFhQPnu)d5dK4_D2&A*1n9Pc^`Bm{Vu zi!(TQ2FDrj@{F$HXW<+?er(|~e$AdDitK#QzeJ$?i@Trq1rKp<wP$_`Onj$K7i-?X!5RZJ6g0$d~vycMR$4M9^d~m(wkfnuuKbWmow9 zqv#vULc>(yWedzR$n3y<63E4PQZygqS{yrH7!S3_2i*vV7#X7D(1QjpDVsd{;`RI{7Kr1Lv^>1>A`iFS_u;O9v7&|-`KD0;>-mwD# zCIa=MD`kRi^5EWQBF!O1A{Y(})u3q7x&`-Z^{i^k+fCuH?x837zT^_AzLHOC?GX@7 zEgUitTR%t140yC+{Dwe{i(MsVzXZw96zq6Hp#8P5RnGdfkSnrk>JcEo51ku-S1t^O zh!#xli0xzrY*ZDzr0Qo=P7dstq6MDV(G4UVk}sn2@w;(!`_ZaOfk+@REY!j&ZeEX+ zJEf7oJxmc;=9zPREx}r&RgL5y<_KgxwDmy;euVQ(tNu@aarg6v=OONjNL}pVBCaAB z#ZWNuDba{+q27$Jx=M_8Sy!GXybMKqBvEF$sw3lgJQwqgt|5R9=qB_C>SWEn`Wq1& zM`PlB{XxMIjCmFEdodJyI{UFE4^K(NZ?FI)szCTnuP~})`V?>SgNQFGB6Cp1O|@re z`(~||Im=vf1?Z1?l(8;oZDvB2up(%y?p2+$8YWH}T18j9D}87{jkJQdx*Oq$G4tPp5AxFTV;h z3zF*O8%v$79U8BP^P%A2iiypqFeJKe=~;j2OaB_|ctT+OwXprjoii;OnE@CdAV4Bj zA5KF0^B#;Hn8GrQqEq|*r-$>4!&<2Dq3g2YYrf}n?XR{!8l18vv-t|hz=Hc)uS9yQ0DM(h>y4SgUjHl)V)L0H|t46df%C^d#YUiqBFboxO-gtP1kKdt<}q_dJE*i+?y^~@nBR$ct@KE-g;f<` zB?y-EKch#bI!*lM`q=yqfScj^>N7rP=@m=G_6{H8-MPT3o8P}V-eLYBo~K)}(vWk!_HfRK}QFyq-|>Rq;Ty}nRDY%XRc+kZ?}9k@7Monwro<2qDx zivGrcK%9`N>6|_hgn#XNAcj__W&p6jmw4jA@0u@lxa9?QJRz|DT3EYfu|IHtuRJ;$ z2nfX4X;TV*f6K24rm$0`ynJ{G=>gGg!=dfB$LqdZ7tONLbnC)N*1TjMS{Y)%@)rY= z6|@i#oex^}_oXtk6zqtGPLE|Cr zKuqp>d&vW_%4t4FsawK8ns{RvaY3@rv3gY z;U^m9oH~iO#|uHM-|t5&&CT8TeLorrS%`kEr}7c*Q`iKM&BD$y8W;`Tur3{zULtJk z%AOmQ@CNV~umIt+;vp69na=VHC$kZFE`<9Lv%F|}uXdZ|G1auI-aEAX1FNPSyItAF zfLQGSnV_-p{UakN34U)id|JH6KIWklHfyFRZ%MUxc?!K?GBkSW9sW)39{nMnKdg9| zJ2IaH$z4m-yNG2VV7t7-?eWgC-w_g+@f?aBRBzaDE5r|cyHZQ+Bf=0f&+jgv4&-4j z<&=3{WIz>Caj3%9NU45;MBAIdN>qgiTKY^muiD=BYA%AEAqDJsLSX;3u*h#QocN7I zDaLR>01u?&JF~~YA%9sgg$=S?Xnt1j=2_!?)mKFd<6xf|ujXOW?E=j|ES{)miRs%X zNm(Ex@Y*W3iNA~LSULC^d@;)WV0;}ms7#wEJRWRezqxB9qbzy7COp8G1P8B(8i~TY ziJMCCc51Trrmh#{Tt${QtQ)3ICHA-kkJ|K1PIX`W(t&E?d_0`xih_I>d168B7k58D z2S3D}o<5^u)sSsMemdaI{LRSr2Sq|9-(wmo>N{edKFUUXT#l)NwCJ20qK5epc zZwD?yeIt591>vYSbSO4)|NL%-OLEBarGCvDaR6~iIA%EU2CnQY8;^4F5p=2#G|$}G zwd&Q{F(~%oqQyfwZ1l#QvUHR$C+SjZr5`71;16U2LE^~^-QK+-IA{XdsNy$>nV5l* zB$SIwP?C2!T4I6)`j;7fYihIj?>a4gTus$mE18Bk@@T)lHb@wW^5=h4dirm2hx3Pc z{;=Xo38MCj{FfRZP1i<8SlTv88F4?nzDNID?y2UDRZ`)%f!=r@RQ0MAX;md&*OWxPz4t5l? z2{Vx_GHKpH&BzsF3rD<@pM5XI0yP)*j0%wO9v?Rt==}YBW^`<=*$C&0p#1R1@&jTh zlu%=Kjo5Cl7}MFlxjb*6pj;0nR)-qI)`pF|!?tXszY*eTjo~~^VQP8>1M`aY09XAN zcRxSiKg3;OdByk_i+vmYmntVNm_0CGN8w+os90}rDD&a*-B+n$nJ3+z%aK?u3bM$S zecDW^aN#rZpc_X>^_~Zgye~llf<)&GU!j}Kqop>E4D%rP$1q7BnW|GZUutiG>e`Ny?fF)($UH@wab$D{=UW5rJbqfmNbJI!99Dk#p@>~p#IH0`us{`gQR_Y0WuJd;%hpbU9+i!mJm?FCbDf+KX*Dd!ZbgvLMuuiEKHt1KR?GAT+C=Hure7cw0@n$u1c<2R?WBe=W@T zExvVC=*WS*0T6IIPa;5**cI9Z2c|IR5nK!o{7a4*%v{{Cv_6;+?{r&rEA1Xi&t8~h z%0$nYE>j~WkOM-#ikY2szaVyM|$G?uS#m1&r6jr#b>-N{H{W)bx`p+bDW zNaGiGKj)tw;!Xv3W(+uB{7!P9$R9o9Q8WC(+;!%oY&!$>7c)cJqFjV&#yaq?s(ITP z>k)X)*Kkegjp#@}7{aE;qRf2u=pzAwl9-s%iVyi&cZYTxUwqL$T}DEeR~5AFYc9QG z9QhJFwkq!gy#`UCR(LKN!~~xy_Oeq|3ziAJssasx8H6a6B;aeC2l>GZS(QN&`o%7D6-HwVzmJ#!JDw1a z|5{kOJxp|xhxv5MA`q~8=|>SngEGP64yLf>&<5F4GT>yZ>X0~3xS+8|6!``#;b-A} z4O=&zFn2l_VPziX_q3U0t{f9bdF3{MI2mRS*kzwsKd7y&_3{S5kqyS#@zUmgX@5?mqO$HdISU{t3yQE;2vrT zeH3rYwDl_7L{_qN%Domdz#IGY)#4qAQb@{n;YLjyxtCY#$u#F@FVTrV9d$6qM~-2_ zHvgO45&j{bKdg9|J4y@DGf{r%?RWQO9p~z#P7}wVHFRAt<0(yA7sqglf`)su`r7P5 z3PzY=zP-`M-m7+S|CA(Y2CYkzQ4^X#Ahno&lD=97)Df%mf${E%ax#(_UxGhrf4m&UmQODC^O^Bc%aW5RZ{w>|z>Fu`Wp7Brd05-a0muy= zY5PujrRUG>8xL?rE7L`H-1hIpmX4+r3fI@`#CP7AEyhNfA%sY zW2~rabA;4044vD}L*LU}WsE`6xS{g474DKn(a)VC&fN#wX1G#bl)G+V3;WHT(v)TD zhrIyrOcXMr7DX6i+tB2)mW+C=9(A@7Zp zHQ6=*uH|e5?O)veoX~!VyArMRHVD=~Mol9H{bYgRQB0evT zClt|zEIM9%Pjb&xe%<|u#r5!8BkOcy);Iw>eGCxv+1U}L?t1!Vn*Yw~tHq1vl@N_c zCi!#yTp9wXg>&jd+Ga=-C1*y)AYW}EW+eDVCv^4!uAlj-PDD>yDiIi9VF@*d-M19>L@fI!=BgVRb!v5HuZ+U7WSJv z%APjbg|a$ldj!4KX2EWC4OI3HqSNiOn)joh7n|?K1zSqy4A%lu) ztO*O}3+q*|;|W3W*TT#^$Hzxbi`o-Q?mHBi{EHoeS}{REFu98ormsIz*wdOvwXdj^ z^H0dyNl?yOvO=a;T8coe*_d0IAkjem>KdGt$UG5cLENl*;%f6!pSPF-4gmuDdJ`RN zVZXUUhv^DQ>mz6As$6}gLpm$fyGGYAv^wD8d+9-;{jFt~@su$fl5DXEqyT*rK;7rT z#1O_glCoK|jl}M@A|;@&`-{7u50W0@jzcTJX)8hEy$ix33G4-tSa5&23A6@gc^2r2 z@=}6C4MEzoFL$u@463H^Bi<5UaNaEL>75+Z8a)x0Rq}=^XaIt8FSpWXw<4&?dGU-@ zMs2pmCr%-^UqC;Wimx$)izZ6h7n;STX40g-5$ZJoY@kn2*-t%5!dr(v#^%PwC}m&; zf?|zfk^Nf8>)&ZaAM7D>8*HyKqtK1sRY^Z8@0x)-!(C&LVx%=qU2CI$JIIjZ*}PSR zaH$31jmE~9I|6tzE%$G7_v8=p{9(nz+yyULm0P7Hs?*)CzkA09&>kH=sq2>pGoF)2 zo!%>PC&p0Wn1zk-8_y&iftXi5Jp(MviaBjF5fBI8rU3jUI+S+AA9O#qpl-3CVLzjJ zTD&2~k8;-h)yV+tctTMAwXlxINNUklD$3I{KtT9*U{%qx7H9TUFol&j0`V}zOWt=t z?d$P{ zMb`;zVZXT(O{lZ*NL7($-hJ%n-Mxt zC6uP~)f-i)wh|yn6YgK^rfo91B+bim73?Pp?-T}URg&)kNj$GNe!qH7%|-a|O#?CB zE87*rD8TSg%$+BZN!63*R@;pq*+!8%nOEykU#Ga5mjs5q=Hr09OQbIQ>!4%fXxzYco z+IrYe;<0)w1yh$YZ5)*a;dp+Lmj6`Hh71&X(NYWlkcCJ^ke=)nb0}wDqk${$Zk||W zXJd{L>r=pAbN4p?ZU&D@{afXMDRn-V6B=2G+yu+?Ge$Zc9r47k57&;6B71-P_ugmtW`}FQB_)5!yEsO&}F% z<$T(>c}~z7ohMZKJw#0Q`!a&GqxYx;;agt6PzaX-T`^R~S6+$*?vWL+wLlOdz|Js% zMRTF-aXaysn_17QY~Q0d2-p{#iwsYDJUke!6G&cdsGn-1OfSZ6E@jV1U&wWXgsR3n zd?+JcSVGp{S9tR7n`-n^_a7C9`_J)2OYhjpM;JE0t~=}=Y;oxCMc4Q7#%0^7fz1%Z zGL_`RFi~3OSbdilGiPF5ALz3^?)qMlAtMyBkajqx?}ouUq19NI z^ruemk`12ER>nj`BYZsE_Voojo)ENuEv!A;!RI?&Xx#cd5Rfw^s4gwNr5^(irm*bZ z;Qi_*PTQyj8Lj)`uUtPggt(HUe9JLAeI}Niggc!?+hxN^{8*!l;G#mzk9C-7xDulf z#TXfM`;%locVl1+`#s)OHOxMe&O7f6nvm8lGf>6d?O+c_HbNCYOdtM)As)>XrgHpl zPpFS_sVmkrJrnmbLf~|_Wf(3qG@BF^I>zU1g;j93H1vn6_dEekjGHb={WtH+|m6ZoI$-f9eYEo_(j#Q$|A(7^$=L{-g!E7dnRvS5)V0WE(g{dw8v z@h-uj=X-hE@zFvTNOa7cU<>=r9be_C3gD@Bq+(4tra(YI5aGtRI^=q8 zbG%Sd=n%=5edjWsIEx0Sar#``(dFCb~``nFFO zC9Rl|Tfy=o0vEOcvz(h&K#-j-GO;TK->jR!kYC;Gm(lI`reZrn&abqE`O4}k6(m_t z#TcxfB(dQaxr|)2Ny-6Qya#QvPPuNbstP*LAT0k)?il_M&mUGi%-yPuF1oK^SC?%7 z5U>l~Q}nSMJ za*!(A@W`x|tG<4uuOq8(rb=Z7i~8(KbF&iI@q}RfYhh=TCc+qku4)*ZK)^^g+D`p& zqbb8Mn8E;_JKwLRcL6zZvL$##L5KXkcF+*V{K=_b>Db%|p2axLFR^9hLNT(Uw^iXilCSw`(SdMTBoL8Zn9rQ|*N;Nx$Bce)_p`3&A@0mEOU+RIo{JSR zVOx(?Ffwm8DcCQ@V^#J)-zb7745l+vch}F*Pi0udj`T2ZnhsbCb?MV=^{BQjgNI0+ z1K!VykSg9T5c7!#X+D$s)Y}&KmLYuGJ}!`Bcl%vi?o<@E#Eh3xFs<`bDdP~R^#m9W z|L+{V+p{0%CMWkeyBd&QKE2-wFxCc8#M!PoF~8<@Uvl;sw&c5dzEkpvdfTK;5q(tL z4$*Dn?LHYIZLWff)6x9-l5u6ccYGSW(w)ZaNK?ATzsVibAL9ALiif$YAa}3lQ@xI#e@n9xysufP zYvlZ_iCACZc?^WGS{gL^YrGhxq5U$r@Q>zSw7}<%`LBghab-lPcM@S}+TZUd25Ak+ z7E@x2vje8EI3QZ&Xb+(QrdJ{Uc)eE%vIaIwjA@KTKwRp<4hDh=B2p&O21y;SJu7?U zmYfM0=HmI}8)6V9zFg3#)LgGI*us8~cbwXF0Bz4{<cuv3sOm zJPeAu>w@uj=K)_l9Ks4)c&m#Gz1+>(^dC_X6Ni!sXw+`@6Bz&E?q|W$L)`7pTtS$1 zKVD@O$Xf|3G_A%E*q`R|68zH1MNmhsefcu@F_cy*v3A;}_G3&@KE8pPAtp~G-)E9- zq1NzW;(qt5c$}*}m6KWaQ)`_Ux4bTQ1d9bt3=4&mNH3M>840f%tknQ8C^9F}=J1=R za~Cb8=z^Y`hY8$}QHIO7kLTOG?sxA+F43nENep;FnIlIn(z~V_h_-^4&9AE^PaU9O z{j{Nc-VTH!P(1_6@b)pt+Ca#_9zm*%eve1SCF2lO+Nmw}Z*s@-hj{+5;$iM2J>Ok+ z?Q1=IA_)YPppqJLaZ?9FdV(3x+)JOZAvg*{4S=;b1A2}%4OI7z?ryj}?McE%xBitu zZUy|;(Ig0~1Cu-L9Jj;{@S!DeyRx8nK$t~Rb>i^`u;U5A`q#pqXmraf%Ij%p*#ZGv zCPku4;{^xHG++wb*B-b&eGRgdD)2Ci?C{?^P^wIWa+J8`zlq6AVLcu{(B9LcchOk~ zZS*uKk8)IyJ{cvSBhOa1djHt_i;e3n*us8uXUUsY6|dp1s7=b&HB0F+ZDPkpZE3+4 zUlR~vF}fXz55IU8tI|Rpk&TKd^V!k)e&lvIr?;@OXK->F@uL+bA-I94FFH`W-0YDLxbJ z>2qksh?5-C%Nii4RBzcIE?=Y%#!`}RR~8e7QTK_5Fw$G17j#N1PEGs-mLUc&hr$u)vfPl=EFbg&({E=&jBxFJhO(e z3->;Iw0UvsJsm>S->JFoqtSzywIq3hjMTGr4lC!nY>ZCiaMJK^a>w?Ec>b{BVeV`f zsIUW8gKhKMfB^TTd{0h`iiPPcFyrZ8DY{djAxpUd)dADFWZ>Pg{^7Z#`nZBFXoPXO z9>4O29BbyIAL%m+Xx~r}ReO4JL@I3eoeB$2jKNw~T!A#$@q}RiYhj(~oo~WEAO`l_ zZ^%1k{IzFZDz0)E-1X)jrL?2Yp&kqo(;~_Df8}7%5BipwqKH~FZ%0aE6 zS4P_$o6}HGEtbmWpbp0skTbsR?98V#?2@}=u!a5RP8u?!!<(3c)8g{dM!EU6*an90 z_0s}#({Fl8TW>0C%q#78=icra&~0wmNz*Q<6Ipt%rloz1zg4@4BHM>%EH?ec-Oob7 zhq$Y~^HLjXk(lU-CLMA4iaPiz>(+C|s0*pg!NHuvrCLRB9P_oVg@)pIIYn#*m&pHH9}!djGrv`);Lu zkB7escwf23mgw)2N#t*138X(Rdz+PiFcGiP zpi4~F&PY|)PJ9&S5psH&oh$!5H!r2k7~dcV6wwrqr=w%;Y7wO*i}kwa)4$0b#~C^&$Uh79Vvs#2~PT7I>jroB6k zT}qU>I}cakD|0bAcUC2+qG2mPaxh z!u*nD)~6i^U=CwN8P0&%d7 zg}N%*cBwK|*5yRkx)UD|!4~$LJFATIQn-X%%agE!a#Zedb8ng!JM!!{6K_DpmLf-`R^=4D66XILb#*rNX zL0JSYRbFt0K+XtvQ4a8KMFgYC68Of#tK>=r&CS6BIx8W2o7OT663?O!!4&4-5N~g$qi4tuO&ca!to7=>1Lu?07Xhd_WfI|en$T8b)G8<@f(j0D^Z{qFxj6n4ezU6&k0S9Kd4gtq3vazqOG z&8?E~>%OnXw39il#TWg2K|0~bB&EE=AKeNXru77;HJCiW-w69RcRZPAWI7ZvYHvA7 zvL_ALjM;pmPu{%tbs0$xYW8Wdt}E;f#ej|+tv(Hq&zhsByI(7L%l9bLa5VZE#dZyXE1%rb)p+@|#5ff|y_kS$(z#J}erHBM14Vs7$J>ZO!^zCs=$I zQ}Meh?TFCv&M1xwcdLR?L(h z&t*S#<5+YR+EZjUs0YvKrcl70;WUhA3!U7Ehu-g);6~Ppi)-xGNm}nKrCUbU3O;wd ze=Tg+vh5&~6RMq}Y{h2iPuEvs5=Q8es|An*MU$UKe1Bb_ zvo{N+b7+|Mx|n-lfN~;gvJ$P~i^>x-1Rb6G-JVf+I`u5{IA(}KhcoL0*)O$Yd9O@J!iFw&}4+yYpG<{Sh0&?8X8V`dLTKJbM2AquP$2kE)%BhjK^= zhpT=6P44*q5YHc0Jj|U54n8()k726V9uVM6(X?zotx;;L2WC7aD9Ul01`63pB#&v5 z-F4%L!t`~;mh!J(-K4SP#w(?lWRLhr2m2vl3UMkyw?!sxC`meZt}cZk5d@s=Ljtdu1FH&>z})Q zFkshPovdN=Io?;U-lsKCbDf&$&7(%Owwb&|1mY&M@Ur3Sj>RwTeip_*#2rFz)}IgME-|wdcS+?~4 z*fgX_?9H&1-3H3jWf5)Y-Xhr7Eop6N5r@Wtc|`Z0&W0u4!6t>Q0EqiLRn_zuX=5q$M@&Q*wV_^SK46jAcS6 z<=W^~Ce~Hu6xH*>W?xKcLw4YH_B<8XqUU_FLYbBIu{!4sew|JJaGWbt41vC@KY_8m z=lj4#ZZGYBlRJSw#Pf$04|5k3XnJz{(M3+v4G5@eNh&?u=JWh~4kmZ%cir)naXgp2 z*B@0F4JB)c!i%xfeIt6S%eIzQKW^S!;FWPC;o+y=N}1}6k-ljVXL3;sjNW1rHK$0_ z%wrP+JDw1Ne=Q86rAaO7g5x0P^u7QNnTtn$nHTpO+yzd2B}A@rI1)G4WUO{oN&*el zH=fYDz`%6e3@Uge&7kr&*~=%6aDOd=oRJU4#Vm?*ws+w`>O<*q$5S2PUqX$YR#u}~pu ziOO@^eGqnM)ziCwlRKe5#Pf$04|7N6Htk$O=RJS71q2`^_c?`b;#qL0fyo`7oTi~% z@fS$f7mcvt>jK@rLmIdEK&V+IZB~^>CW6YJF8dG?3s%wUJ>M2JRYCSUQ!4L_+BLjC zLqq%)WBSYo?07@YG?Nam&3Nh5>K)k zKjOU%)kss+p;V-kIh9cu{yy`ut%E3l)W}|UVN8)})DQ9Ll_k9BDRsh~2Uj0C`{%w} zu!a5RE`22m;hOr$6aC3i6>?b?D*HDE?SL|v;@JX4rx%&Kb*+g<#-T+{?_ZODNYzjf zb5X|auI45u5-1_m&x7G}T(kPc-OmLn4{^t?D^e>Vpl(Zm!rP1}Cgv2|d@>~AVO?(`hwIzJ*YD39t}j2&XAl*(pkEWn$0hj_C+t>Q_~cCX z-q%H238F=s00O_Kg8b%v=WB?G4cyHxI?-Vc=VMPWieK#=+t~+J0s$y-nG$lT8qs0>}Sq?ykC`?7}br4-MncA>ExyHv`h$ zp>#+|OLupNfHa7NARr?k9nvTzjdTjqT_3vq&Sb6O%%5ILHyY_JgL{U(ckKZ>q2lI=Nmm-q|jIHU*<#cMb?r6Fya7tI(2~L&|l3Pro>vV_<5FZ|zCNkNSK~%=N_B zP8M4_6arnzW9z&u{w=$V z_-s^SL1E7?_^i`(6sX4-r|tH)Pu^#kc4^Re5dwD-g@4MJo4SJFc7@Z*(sBJK5&7G6 z;WNZgJl(j%W~aLw)oT)WPVuzLLssc)*&SGZ7S`syTKIE$@$ds2VsOD3%(-5+C5>q@oM zHkf(7@y}!;(bX}XH8z2QRG^hBf{2e*`;}g(bwy---Xai;olREBx*Z^SvmWCp zFuDRaS)RDSZ<^aC_i?!WQDuJEl%jG7&6QU-BSZ!lhk>i2vAHIT*XEDA-{%zXaz|Gp zA7h*9 z(83u+IeF{+yypT=(~s@~R86ioDPrPyj-GyN<$VVe962$*+e%?v_rJlb=aksli zZrG6SGt;EVjN9*-x?ipb`#u?7K>Iz@-V0HLU>CL2fqhSkHfYbBO&{fhyFF;!K%k&8 z(-f%Rq+pVxVazyGltX+X&%F1cPCR+s!S4E9t-4-heqd=Q)b#{N-#ggL*Rp$D`@JsG zK_FntwMeSs#4|e$NhsaDS}cp+TG364r8iv}m6644?fi;vDJx`!ULz}8wqQrmql4U? zWcI~SdIX)T`Wf|{`5p>P{`;-;uL&94Wq5kfFOK=&9WP^%YtAG10p9)E>PnKfO#fEf z$%TT$coL(SBb%MRH(LIj^UYI@ef#3CT#}x!sy7;~rYcx$qlGggr}H6<4cq>4_xk|m zUG4zZ_}zmELdmPcwvv9HPVR4UQ;CM;<}%Kb5VBjwN$uDj5D6$etr3K4HmxeVO2(!d zdP(pTremE}5!U4R=37Bvzg#}8dHg60c6+1iQI)HPbSjCjvO&Hr;fF@LxtrM%h?iNy zB-_^O7-VUr#);#Iu6fTJf8Go$b*cLq90^2i+};?Ar5?6gexvoh>TBS`50LqksB>X; z1SD=YB!_ly1o(+-QO#_e=cDn_y1gJxeep6LILj=}zV^_53x8 zyWP>L6cw`(FI%Sj-mcvuY$O{2h}?*^LRrrnJ&u`U>0z3;sk1sKTRiSwn#VJAQAxcL zMl$IGIF3(iD$VTNsjWYLUw1|e4>~kbXG_OKd#|#NF_@7_J-HYRy*t@^2Wu*BmYOb- z$1^Gc0eRPyjEO=OakC>hIVPmwI~W0yIwaMqWjZ zJ}}pg=>QJEOZ(G0R<%O}+zOru6Ktv=5}a<`vozeNiUV32#sj>pl|Ft{G5@AJxxdu& z*C_6GhsG(L?NvnWsjUbCW{oP6>tz8ARFa^qr?kbSH=NUGpWc3$>v(%}vQO|96Jb10 zM1wCS3({8ZH{X%RbbbmZe61H<3YnB_Pd$WO&mQ0e?kAXa>)?!pe}TH50Qq|d<2od9 zet7eAQO_9!WRocL+21=pA%%9&L!%8*))ej+6TOW>OQ-728he}7Za)@?La@A9Gz+?+ zMBbD7K&#obJ&zFD8iBr=&=(-i9&?A?(?!V3=5Kuk^H2x--(8kK;M?`;CrT>Jj{B>@ zt(me>f%Jw|adEinQT!HVu za{0(_q*IPhyM0Z0jvvivlfq_5d-W`vq~{qBq%Jb(Fx=kvnrmZqRjwQrykttRZidHb z%BD3#FPogGO}b^mAa}i*;mNhO$ZzbPaJiIOod4F7My?fIn%=Lz(ObEqm!FOG-*l(& zmwNsh#og|@&3vphg&(<3V5nPa-L@3<}SM42zx3n{jvyO%PLS*0&@+mrN zQ^hLPxcNKd=$Ydr#y<0I0KHJA@2Y?qR8$_nr@xMvcfrT~C1Gy@TzO z*NdWb9omz+-yST);oE0#`gY!O3}rAx+^{d-qndC@I{&>{RR8gDi-o3RZsKf+S{s+GuKAf(XP&R0m8%gCP*>R|u7yW$B}e1=%OW>O0$ zVsMf6l5S~Pvt`~)9*NT5HL42tjr_)e9T`NG$~o^Cu0d%;(dUhq{_;_hXV`KzcOz36 zhr=Itzt830j}A|OM^t!^k$S1#x4+8o$p;EE3Qkkm^aV6l>|ep4toH1?vJOBc4ohZ z)_E3w4O8xXFr_u2?kUQqNzbxZ7Q&vnouLmw(VR84$4b#QDhQ4J#5(1(fwPrsqCf@3e2>QGKq^N;I`b zQq~j`!W+%4H+%($?8zzZc@tFqgoRbnMzZ3;0wXj&PkSIkw6@+|QN>Usi{ z?;VW2^E~KLCdL^71qj&fBS z?{5m!r4IU*GCR#xU@lT47~;y>x9GvZT1z=F1bbK`f6$a+V_p{mb+G^4Etd6|=-zBR zN7=|$XCvK5D!)0LPFpvvS>2&Q2g4!_(FiurJPC@Qi_arZ;i@{;j2iPc`a~?&XTg-E zyTM~V?D)ss?}Y<*xeGOx#%uB#pc;$GKl3}l&cFGDGV$HL$3Wtvxk!(*-ZF&8Na)9V z9BkVY39Wo{jH3+ojDgEn>aNykM(-y{=4U|QBS15!8yYuJqz#Ivi;0I7+odmgOhGOy zZViDg?7G+{IO~abz_!4f$XKE{BNj{?@RoZ}9DU!R-y+y9n^W!f_nnpM8kY>SMIOug z0N1|fem^>vth@a1@kcE_zddQrn=jRuqY_I-VW1#HW}(l5mHNKCWntJG7Op3mgsD<8 zvG4v(cPf9W=dV%R?e6oIPzTR&fy8`|ki}CYs69tdfXL%d}l^ zBW|Bty$agXrG)Boh_3`ufW|#H^Dhn#kj&{yY5fQ;Jo%~_Z{BRH*ZiF8G(thD3ciOs z)q4jcay{W*D%Z{tBe;ETPJc4bT1IAuQw!xE6iKdkEMm5`xnT(-Fb)2Wj(mhA(;lm* z-x6wEkX!NDx(TpcWl5}DEuPe~#IJHVgU6nqZ9Sj6G_UN#8u%1KS$^+A|smA=_+Yey*`=2*HT`te?_G!LI%HZz#%_7Q|KVGCYFU zbr3G-e)-4U??oSXxg#c$9En0NdA`u<{Vmr{D8tR@{8Rf$SxOh{vSb6gV6aoB+?kpy z)4802c@~RJdsAByF+~B1ql=50-JBfWA^q(=TvQDoy(%fN8-^h+B(#(RX6aW-%tO3G z$q+QY&)9yM@{=X;7#U>ACZF~W=ew@f*pr$?%v=i;j0OlL8`;(&{{I~8EY`EZ)4&D)hXK! zBvRwwbf@u`dj1;4-R>@3k>DWexStk_LBNeR%b}q{bi9HEDC-%E6kq<3nQp~;HSt)b zz+=>L@S-FnBOlZP7mju5*wa2vI#A7cif1q`Dd}2KiBSD=8aIvn!9IGFolyZZje@?H#bdRwu2uMQUyz#l?Wg_V!l)>ab+B>hP=}f1)4138Al-S$L7C+)7 z68Cg+3kN^MKqpBOavmHdHq!AOoVVkb^FS)i;tD&eDIT=5e_Y=GQQ-c2jVxCuuYxxs zb?YLLS@##nL#kRX;ow)AfBgLJv+d=CsAzeLWf7icGOTDHgun{P5ZM5^^j>jb&+a=g zQS)iWB{=_a_j?b`UG7p1CY#=tv~x6V760@SBsZ_d?mU}v*;FF3E#!smAu2t4Jj9T~ z*^ne@?GtsqLmlX{Ci#BkA@yRMa+zRy--FvNd^+ZMu>zS}mbJPaXX9ph#?R|itoYO7 z;&`7ina^?XJWYT&Pehzvc}%{`mm69GBFZ}Z%C$I@qDcl5Wa&({*n+@Zjfv`+RCRbD zKJS{7I{7^JrBkHYMspuoPjOgZw}wxz8XoiS@)A0UpdNA}ykc0FFjbGAm+*^`$D*rw zsH$o9Z@Sa^OFe&$;%;~4Vdh&nZwgTiz_j{Fwz+7S;820Vf(L>2lO;17xo|6uPQsD()?b9{lTt9(@>u3up_Gs*lw)YV9N*w zara~G)#PC|M8(gH`lVWAwn8X5DfMMJXo`%LxBZMPmcp-XG&9E0k)U6c_W$oYe!L@o z6Nec6920b5{w8Jr95*IKI`U^)tc88UBv%nDlcDZ&jExQ2tsMY%X*A*mcs$lcB}V?i znSz~63!YCHE`QwpUa)hQyC1IYUVUw+?rH))A?^BNmD{RV#{D)e7S)4Rb4Y8xA#k)B z=>)G@v2QdJEe^fv$udPL0V}>CBerc063a#5x99Ih6t;z^Q4;^e@+vWk^N0rURJaH)COnL;<>Jxwa-29AM19>g; zsuRE!9==IKy9qp8ot{+Hi3ty93@9P$Xsmt1e~sd9cPXn4D@K!N1f!QAAS+o*gH(6gPR#d&5)u_K(99-Q{772ITF`D?tbroy31W5gf|=uFU2G2_Wfn6rWIm4a8Ld2R7fjPJ&8JNN-!QcIqO12$ow*ZgH&WlZ!|~B zy=p}0vsqxozv=GTU+Vd56nDGJ)4~g$q^3FA4+R0ej&Jfk_IV4(h@q@!yJEVs8~+m$ z?t~qL>P%0IIK_v%0n%toXc1JTJ;|G%h|M1iKQb*j9a+CpZVx40kIQ{fT>nPS2rj(F zpXyY{9O`-kbnhK(9tdZggOue^CJF*3k}czKbUfmEW(H-jL{9CajXM608eG_)GHvcC z=a*;Xh@mXhGeJ1nBQgb8`MoaFm28_w8J$~riC3}}i-Q)06OM5Dw!;$`C08dPsDu6Q z&Ie!`>ERE;DIAqd%%o?sOh6co4vc?`uN`CC;=?Ro zWtwSoYoeBc4Zc>=49obLg1AX7xj^*6MM<>qHh z;Ya8je!(~BgeY_WraQgA)brOU?sivP@JKQ~ZaBS19t5;iGn!e;X=v->g0h~`A@$c1 zaUBdACjs1>iBhG!N-@C3J#A)RMuak%0fv%x5eT6fK)?iN2oocQ?`yF<{#ce5`A+h? z-9c=0q2p+%>j}`mf3QfL1H5v|$(kwg4a|DCT%w7{vy9hPezA6ME$hJf}*}U9SsXGs+`4al{lFL;sK3 z|J}JP5pN~ZqqI!gMZfdx;w;a8pL$LGeI}a<;=G3Yg8Th9xnLdx4L|XoD^X&ly`S4n zvE(SIEFGjRupBgFq>&Qtf871vyLOj5LoF)#r4h~t4i6a2(1YPi%B(4ZGZEmVHFq2X z1RgPJiL<%{`ob8tows^c5h2)&u<$4?=TV%! z#i0uRM*}R^noZ$xV)W7M@;4k(3HHy34X|rdV8qBE`5{`j@mSv@v3_1xZ?$F+kz(4Vo zPwQOCo~fuhLFieZ8&b{>XPvUlsY(IT&8JZjNd-<`$yRM6E0v!eug~KzwrBa}F0IO! zTr`AzTd@mIkf3*Gc<*51%P8k6A7FD1Ux0vQfvLNTZeL=OzC!6Ppb*giA@_Y{jpU*M zcH#JoMD|x<8}9>!9%8SuS0#75tfAtp<6nX!>=1HHoFVJpa5Z>mq?IYUOD7t_m#*_C HPzU=DkRM)8 diff --git a/pkg/core/block/block_test.go b/pkg/core/block/block_test.go index fd5514e89..e00d22366 100644 --- a/pkg/core/block/block_test.go +++ b/pkg/core/block/block_test.go @@ -112,7 +112,7 @@ func TestBinBlockDecodeEncode(t *testing.T) { assert.NoError(t, testserdes.DecodeBinary(rawblockBytes, b)) expected := map[string]bool{ // 1 trans - "affad44bb6acacabc058db0bf1e12ab1239ae5e04007b4d4a2ea0cda868e284a": false, + "6fcc0c48c5d1b28bb5c2effa1e5b7bb054d22a8c30d409a6a7a3527845229056": false, } var hashes []string @@ -165,7 +165,7 @@ func TestBlockSizeCalculation(t *testing.T) { AttributesLen int WitnessesLen int }{ // 1 trans - {ID: "affad44bb6acacabc058db0bf1e12ab1239ae5e04007b4d4a2ea0cda868e284a", Size: 864, Version: 0, SignersLen: 2, AttributesLen: 0, WitnessesLen: 2}, + {ID: "6fcc0c48c5d1b28bb5c2effa1e5b7bb054d22a8c30d409a6a7a3527845229056", Size: 864, Version: 0, SignersLen: 2, AttributesLen: 0, WitnessesLen: 2}, } for i, tx := range b.Transactions { @@ -193,7 +193,7 @@ func TestBlockSizeCalculation(t *testing.T) { assert.Equal(t, "DEAZyIVwKWzpgvm8bSzWuVF1awS0QBguORR682YoVfkJ05KGG7pz9OsLBZ9/F1BHO7TCIcEcc8Sr9AcqbonrSRoCDEDhhZnqTUi8tXYbrTBrVj8i9Yxl8NraAMID4DJryWdD6u42OzAHr0of27qc5nojujhLffBfljuBSyQpyeQcUOpyDEAZr7sLz6n4TgNApkwATGXiP/DZ8AummAGDtznrW6Y8XWHngB7F0j3NKvUQ7lyRt11rT+zNjz5R5vIbBrs8C2ktDEDgNW0xGP/OB8CRHXX/l/+0tPO3drkyCddpG9PKCgyd4oEhQu8cwbSv4Q0V1Y0dZcJBoxUB5Qus/U+Xli7jb6OJDEADaXZxdEb56jlYhF4oM8I8KnthEzGw1Q7pfeI97fehTm78ZOJXWIxESThZzI3D2ndVz0Rcdr5MeA/espG6J2ao", base64.StdEncoding.EncodeToString(b.Script.InvocationScript)) assert.Equal(t, "FQwhAwCbdUDhDyVi5f2PrJ6uwlFmpYsm5BI0j/WoaSe/rCKiDCEDAgXpzvrqWh38WAryDI1aokaLsBSPGl5GBfxiLIDmBLoMIQIUuvDO6jpm8X5+HoOeol/YvtbNgua7bmglAYkGX0T/AQwhAj6bMuqJuU0GbmSbEk/VDjlu6RNp6OKmrhsRwXDQIiVtDCEDQI3NQWOW9keDrFh+oeFZPFfZ/qiAyKahkg6SollHeAYMIQKng0vpsy4pgdFXy1u9OstCz9EepcOxAiTXpE6YxZEPGwwhAroscPWZbzV6QxmHBYWfriz+oT4RcpYoAHcrPViKnUq9FwtBE43vrw==", base64.StdEncoding.EncodeToString(b.Script.VerificationScript)) - assert.Equal(t, "63d18734a3edbe92a9480b690734b85aaf9c24361d034afbea37d749cfc62d6a", b.Hash().StringLE()) + assert.Equal(t, "53b3d970ccb235bef785633817f2a947f63bac1f7fa23103f7d080a53f0361f4", b.Hash().StringLE()) benc, err := testserdes.EncodeBinary(b) assert.NoError(t, err) diff --git a/pkg/core/block/header.go b/pkg/core/block/header.go index f0b2f6f41..39ecf4b7a 100644 --- a/pkg/core/block/header.go +++ b/pkg/core/block/header.go @@ -110,14 +110,19 @@ func (b *Header) EncodeBinary(bw *io.BinWriter) { // GetSignedPart returns serialized hashable data of the block. func (b *Header) GetSignedPart() []byte { + if b.hash.Equals(util.Uint256{}) { + b.createHash() + } buf := io.NewBufBinWriter() - buf.WriteU32LE(uint32(b.Network)) - // No error can occure while encoding hashable fields. - b.encodeHashableFields(buf.BinWriter) - + b.writeSignedPart(buf) return buf.Bytes() } +func (b *Header) writeSignedPart(buf *io.BufBinWriter) { + buf.WriteU32LE(uint32(b.Network)) + buf.WriteBytes(b.hash[:]) +} + // createHash creates the hash of the block. // When calculating the hash value of the block, instead of calculating the entire block, // only first seven fields in the block head will be calculated, which are @@ -125,9 +130,14 @@ func (b *Header) GetSignedPart() []byte { // Since MerkleRoot already contains the hash value of all transactions, // the modification of transaction will influence the hash value of the block. func (b *Header) createHash() { - bb := b.GetSignedPart() - b.verificationHash = hash.Sha256(bb) - b.hash = hash.Sha256(b.verificationHash.BytesBE()) + buf := io.NewBufBinWriter() + // No error can occur while encoding hashable fields. + b.encodeHashableFields(buf.BinWriter) + + b.hash = hash.Sha256(buf.Bytes()) + buf.Reset() + b.writeSignedPart(buf) + b.verificationHash = hash.Sha256(buf.Bytes()) } // encodeHashableFields will only encode the fields used for hashing. diff --git a/pkg/core/test_data/block_1.json b/pkg/core/test_data/block_1.json index d034cc86f..6a369fa38 100644 --- a/pkg/core/test_data/block_1.json +++ b/pkg/core/test_data/block_1.json @@ -7,7 +7,7 @@ "confirmations" : 10883, "previousblockhash" : "0xfd2b68ac95461aa8ecd9ce7817bc0dea12985fc5ca52cfb5c39426e4071c1952", "nextconsensus" : "NgPkjjLTNcQad99iRYeXRUuowE4gxLAnDL", - "hash" : "0x63d18734a3edbe92a9480b690734b85aaf9c24361d034afbea37d749cfc62d6a", + "hash" : "0x53b3d970ccb235bef785633817f2a947f63bac1f7fa23103f7d080a53f0361f4", "witnesses" : [ { "verification" : "FQwhAwCbdUDhDyVi5f2PrJ6uwlFmpYsm5BI0j/WoaSe/rCKiDCEDAgXpzvrqWh38WAryDI1aokaLsBSPGl5GBfxiLIDmBLoMIQIUuvDO6jpm8X5+HoOeol/YvtbNgua7bmglAYkGX0T/AQwhAj6bMuqJuU0GbmSbEk/VDjlu6RNp6OKmrhsRwXDQIiVtDCEDQI3NQWOW9keDrFh+oeFZPFfZ/qiAyKahkg6SollHeAYMIQKng0vpsy4pgdFXy1u9OstCz9EepcOxAiTXpE6YxZEPGwwhAroscPWZbzV6QxmHBYWfriz+oT4RcpYoAHcrPViKnUq9FwtBE43vrw==", @@ -51,4 +51,4 @@ } ], "merkleroot" : "0x0a4ce89ab8b057ff5f3b421f5c85d3a90db9e613c020b9916096fb5282f719a9" -} \ No newline at end of file +} diff --git a/pkg/core/transaction/transaction.go b/pkg/core/transaction/transaction.go index 5c3102f94..81f2274d0 100644 --- a/pkg/core/transaction/transaction.go +++ b/pkg/core/transaction/transaction.go @@ -212,6 +212,17 @@ func (t *Transaction) encodeHashableFields(bw *io.BinWriter) { // createHash creates the hash of the transaction. func (t *Transaction) createHash() error { + buf := io.NewBufBinWriter() + t.encodeHashableFields(buf.BinWriter) + if buf.Err != nil { + return buf.Err + } + + t.hash = hash.Sha256(buf.Bytes()) + buf.Reset() + t.writeSignedPart(buf) + t.verificationHash = hash.Sha256(buf.Bytes()) + b := t.GetSignedPart() if b == nil { return errors.New("failed to serialize hashable data") @@ -230,7 +241,6 @@ func (t *Transaction) updateHashes(b []byte) { // GetSignedPart returns a part of the transaction which must be signed. func (t *Transaction) GetSignedPart() []byte { buf := io.NewBufBinWriter() - buf.WriteU32LE(uint32(t.Network)) t.encodeHashableFields(buf.BinWriter) if buf.Err != nil { return nil @@ -238,10 +248,14 @@ func (t *Transaction) GetSignedPart() []byte { return buf.Bytes() } +func (t *Transaction) writeSignedPart(buf *io.BufBinWriter) { + buf.WriteU32LE(uint32(t.Network)) + buf.WriteBytes(t.hash[:]) +} + // DecodeSignedPart decodes a part of transaction from GetSignedPart data. func (t *Transaction) DecodeSignedPart(buf []byte) error { r := io.NewBinReaderFromBuf(buf) - t.Network = netmode.Magic(r.ReadU32LE()) t.decodeHashableFields(r) if r.Err != nil { return r.Err diff --git a/pkg/core/transaction/transaction_test.go b/pkg/core/transaction/transaction_test.go index 08fad6243..91e1aa8f8 100644 --- a/pkg/core/transaction/transaction_test.go +++ b/pkg/core/transaction/transaction_test.go @@ -50,7 +50,7 @@ func TestDecodeEncodeInvocationTX(t *testing.T) { assert.Equal(t, int64(9999540), tx.SystemFee) assert.Equal(t, int64(8731800), tx.NetworkFee) assert.Equal(t, uint32(6015), tx.ValidUntilBlock) - assert.Equal(t, "affad44bb6acacabc058db0bf1e12ab1239ae5e04007b4d4a2ea0cda868e284a", tx.Hash().StringLE()) + assert.Equal(t, "6fcc0c48c5d1b28bb5c2effa1e5b7bb054d22a8c30d409a6a7a3527845229056", tx.Hash().StringLE()) assert.Equal(t, 2, len(tx.Signers)) assert.Equal(t, None, tx.Signers[0].Scopes) @@ -133,7 +133,7 @@ func TestDecodingTxWithInvalidWitnessesNumber(t *testing.T) { func TestUnmarshalNeoFSTX(t *testing.T) { txjson := []byte(` { - "hash": "0x635a3624bbe6cf99aee70e9cbd6473d913b6712cad6e717647f3ddf0fd13bfbb", + "hash": "0xb229ff232b2adf62ffdae21d892c3e8a71301530ec06037f98f1c6ba77989a09", "size": 232, "version": 0, "nonce": 737880259, diff --git a/pkg/core/util_test.go b/pkg/core/util_test.go index 4cd46e6ca..eb2a222c2 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 := "de3bfe3e328af04d48f62bd7a9c533641cc0e1fb6a7741c5119d6a6eaedc5269" + expect := "5816ac116af288777c4c454425fb687981f508826ec474810ff9e6b24202fd9a" assert.Equal(t, expect, block.Hash().StringLE()) } diff --git a/pkg/network/payload/extensible.go b/pkg/network/payload/extensible.go index d894d7712..ab09f2cb5 100644 --- a/pkg/network/payload/extensible.go +++ b/pkg/network/payload/extensible.go @@ -84,7 +84,7 @@ func (e *Extensible) DecodeBinary(r *io.BinReader) { // GetSignedPart implements crypto.Verifiable. func (e *Extensible) GetSignedPart() []byte { if e.signedpart == nil { - e.updateSignedPart() + e.createHash() } return e.signedpart } @@ -107,21 +107,17 @@ func (e *Extensible) Hash() util.Uint256 { // createHash creates hashes of the payload. func (e *Extensible) createHash() { - b := e.GetSignedPart() - e.updateHashes(b) -} - -// updateHashes updates hashes based on the given buffer which should -// be a signable data slice. -func (e *Extensible) updateHashes(b []byte) { - e.signedHash = hash.Sha256(b) - e.hash = hash.Sha256(e.signedHash.BytesBE()) + buf := io.NewBufBinWriter() + e.encodeBinaryUnsigned(buf.BinWriter) + e.hash = hash.Sha256(buf.Bytes()) + e.updateSignedPart() + e.signedHash = hash.Sha256(e.signedpart) } // updateSignedPart updates serialized message if needed. func (e *Extensible) updateSignedPart() { - w := io.NewBufBinWriter() - w.WriteU32LE(uint32(e.Network)) - e.encodeBinaryUnsigned(w.BinWriter) - e.signedpart = w.Bytes() + buf := io.NewBufBinWriter() + buf.WriteU32LE(uint32(e.Network)) + buf.WriteBytes(e.hash[:]) + e.signedpart = buf.Bytes() } diff --git a/pkg/rpc/client/rpc_test.go b/pkg/rpc/client/rpc_test.go index 9a4243389..e34302c70 100644 --- a/pkg/rpc/client/rpc_test.go +++ b/pkg/rpc/client/rpc_test.go @@ -50,13 +50,13 @@ const base64B1 = "AAAAAMU1lpLU9L9XS3U0WvRgGV9aU5WoX8f6MWgNjfz89nyeomtq7Iw0SoX9ca const base64TxMoveNeo = "AAIAAADA2KcAAAAAABJ9QwAAAAAAsAQAAAFeEr6oeuuVWIT2+c54RYzMuXwwlQEAWwsCGN31BQwUqorPhZ1P5AKzTmc/IVaCF5akiOsMFF4Svqh665VYhPb5znhFjMy5fDCVFMAfDAh0cmFuc2ZlcgwUg6sGea1VwFChOtQ/WTbqc/XrHvZBYn1bUjkBxgxAihAB65HLkuCPgxiK4X20uEB5iEp/o+tzNxsoZ5abP4o1ZQsj6ZBt4M8VYbeYbA+RIEQtWpUytQ2qKBkt+UmE3AxAG6o6TzGtWUDHkDlVr0WUyG7eKj7Aiu5s+hY2vSySUEqHjwf3DdYc99MUFIBbwz14+i79NVczjRf5TTt/L6z7wwxAiXDUApf9+TWufUaqNk6o2aFWNA+bpOTsJvV/N4FrhtogTLkOZpozxrKHS2bw3dVzwk1LCcr3W8hc8b8D1EpMq5QTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUC0ETje+v" -const b1Verbose = `{"id":5,"jsonrpc":"2.0","result":{"size":1433,"nextblockhash":"0x85ab779bc19247aa504c36879ce75cb7f662b4e8067fbc83e5d24ef0afd9a84f","confirmations":6,"hash":"0xea6385e943832b65ee225aaeb31933a97f3362505ab84cfe5dbd91cd1672b9b7","version":0,"previousblockhash":"0x9e7cf6fcfc8d0d6831fac75fa895535a5f1960f45a34754b57bff4d4929635c5","merkleroot":"0x07a982b6d287d1abbb62bdbfccc540e9e21390bed3a071fd854a348cec6a6ba2","time":1614602006001,"index":1,"nextconsensus":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","primary":0,"witnesses":[{"invocation":"DEBUsre4rmqvJm/6MG4fR0GftVT6xjO05uPWyPrn9rPW/ZcKuUuUvbPYt4dxxGefuMBdQTSbzSrtADERbKHMk8D9DEA4JwDK1q9NM+/S5D6uGgFFe/LFpoR1IJmrRUMkI20jg72IVer5D74YmPMDTjPhBmjsoIHwoPxqu4Fzr2Lo+irDDEBHt3M3UMCT0bVEK5JnHtftT+qol9PtZrhSz2Sr/jQBWkmDCvRE1QZZ/VeHwrnd/63PDVS0dkygjlhnIm0wSJBj","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}],"tx":[{"hash":"0x7c10b90077bddfe9095b2db96bb4ac33994ed1ca99c805410f55c771eee0b77b","size":489,"version":0,"nonce":2,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4422930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUUwB8MCHRyYW5zZmVyDBSDqwZ5rVXAUKE61D9ZNupz9ese9kFifVtSOQ==","witnesses":[{"invocation":"DECKEAHrkcuS4I+DGIrhfbS4QHmISn+j63M3Gyhnlps/ijVlCyPpkG3gzxVht5hsD5EgRC1alTK1DaooGS35SYTcDEAbqjpPMa1ZQMeQOVWvRZTIbt4qPsCK7mz6Fja9LJJQSoePB/cN1hz30xQUgFvDPXj6Lv01VzONF/lNO38vrPvDDECJcNQCl/35Na59Rqo2TqjZoVY0D5uk5Owm9X83gWuG2iBMuQ5mmjPGsodLZvDd1XPCTUsJyvdbyFzxvwPUSkyr","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]},{"hash":"0x41846075f4c5aec54d70b476befb97b35696700454b1168e1ae8888d8fb204a3","size":493,"version":0,"nonce":3,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4426930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwMA6HZIFwAAAAwUqorPhZ1P5AKzTmc/IVaCF5akiOsMFF4Svqh665VYhPb5znhFjMy5fDCVFMAfDAh0cmFuc2ZlcgwUKLOtq3Jp+cIYHbPLdB6/VRkw4nBBYn1bUjk=","witnesses":[{"invocation":"DEA7aJyGTIq0pV20LzVWOCreh6XIxLUCWHVgUFsCTxPOPdqtZBHKnejng3d2BRm/lecTyPLeq7KpRCD9awRvadFWDEBjVZRvSGtGcOEjtUxl4AH5XelYlIUG5k+x3QyYKZtWQc96lUX1hohrNkCmWeWNwC2l8eJGpUxicM+WZGODCVp8DEDbQxvmqRTQ+flc6JetmaqHyw8rfoeQNtmEFpw2cNhyAo5L5Ilp2wbVtJNOJPfw72J7E6FhTK8slIKRqXzpdnyK","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]}]}}` +const b1Verbose = `{"id":5,"jsonrpc":"2.0","result":{"size":1433,"nextblockhash":"0x85ab779bc19247aa504c36879ce75cb7f662b4e8067fbc83e5d24ef0afd9a84f","confirmations":6,"hash":"0x5097754aca68e5db86070db369ae4c18bbd021a86dc88fafc5c809afe15e819e","version":0,"previousblockhash":"0x9e7cf6fcfc8d0d6831fac75fa895535a5f1960f45a34754b57bff4d4929635c5","merkleroot":"0x07a982b6d287d1abbb62bdbfccc540e9e21390bed3a071fd854a348cec6a6ba2","time":1614602006001,"index":1,"nextconsensus":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","primary":0,"witnesses":[{"invocation":"DEBUsre4rmqvJm/6MG4fR0GftVT6xjO05uPWyPrn9rPW/ZcKuUuUvbPYt4dxxGefuMBdQTSbzSrtADERbKHMk8D9DEA4JwDK1q9NM+/S5D6uGgFFe/LFpoR1IJmrRUMkI20jg72IVer5D74YmPMDTjPhBmjsoIHwoPxqu4Fzr2Lo+irDDEBHt3M3UMCT0bVEK5JnHtftT+qol9PtZrhSz2Sr/jQBWkmDCvRE1QZZ/VeHwrnd/63PDVS0dkygjlhnIm0wSJBj","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}],"tx":[{"hash":"0xa10e7ff4103b5fbe57137012e7060760b7b7caffb4dfe70fb45d1cf8a5045b09","size":489,"version":0,"nonce":2,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4422930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUUwB8MCHRyYW5zZmVyDBSDqwZ5rVXAUKE61D9ZNupz9ese9kFifVtSOQ==","witnesses":[{"invocation":"DECKEAHrkcuS4I+DGIrhfbS4QHmISn+j63M3Gyhnlps/ijVlCyPpkG3gzxVht5hsD5EgRC1alTK1DaooGS35SYTcDEAbqjpPMa1ZQMeQOVWvRZTIbt4qPsCK7mz6Fja9LJJQSoePB/cN1hz30xQUgFvDPXj6Lv01VzONF/lNO38vrPvDDECJcNQCl/35Na59Rqo2TqjZoVY0D5uk5Owm9X83gWuG2iBMuQ5mmjPGsodLZvDd1XPCTUsJyvdbyFzxvwPUSkyr","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]},{"hash":"0xcebbbdbd35faeb3d15e9c6e804efdf250fc23685e324bf31c1c142a1b78be5e7","size":493,"version":0,"nonce":3,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4426930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwMA6HZIFwAAAAwUqorPhZ1P5AKzTmc/IVaCF5akiOsMFF4Svqh665VYhPb5znhFjMy5fDCVFMAfDAh0cmFuc2ZlcgwUKLOtq3Jp+cIYHbPLdB6/VRkw4nBBYn1bUjk=","witnesses":[{"invocation":"DEA7aJyGTIq0pV20LzVWOCreh6XIxLUCWHVgUFsCTxPOPdqtZBHKnejng3d2BRm/lecTyPLeq7KpRCD9awRvadFWDEBjVZRvSGtGcOEjtUxl4AH5XelYlIUG5k+x3QyYKZtWQc96lUX1hohrNkCmWeWNwC2l8eJGpUxicM+WZGODCVp8DEDbQxvmqRTQ+flc6JetmaqHyw8rfoeQNtmEFpw2cNhyAo5L5Ilp2wbVtJNOJPfw72J7E6FhTK8slIKRqXzpdnyK","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]}]}}` const base64Header1 = "AAAAAMU1lpLU9L9XS3U0WvRgGV9aU5WoX8f6MWgNjfz89nyeomtq7Iw0SoX9caDTvpAT4ulAxcy/vWK7q9GH0raCqQfxbcftdwEAAAEAAAAAXhK+qHrrlViE9vnOeEWMzLl8MJUBxgxAVLK3uK5qryZv+jBuH0dBn7VU+sYztObj1sj65/az1v2XCrlLlL2z2LeHccRnn7jAXUE0m80q7QAxEWyhzJPA/QxAOCcAytavTTPv0uQ+rhoBRXvyxaaEdSCZq0VDJCNtI4O9iFXq+Q++GJjzA04z4QZo7KCB8KD8aruBc69i6PoqwwxAR7dzN1DAk9G1RCuSZx7X7U/qqJfT7Wa4Us9kq/40AVpJgwr0RNUGWf1Xh8K53f+tzw1UtHZMoI5YZyJtMEiQY5QTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUC0ETje+vAA==" -const header1Verbose = `{"id":5,"jsonrpc":"2.0","result":{"hash":"0xea6385e943832b65ee225aaeb31933a97f3362505ab84cfe5dbd91cd1672b9b7","size":451,"version":0,"previousblockhash":"0x9e7cf6fcfc8d0d6831fac75fa895535a5f1960f45a34754b57bff4d4929635c5","merkleroot":"0x07a982b6d287d1abbb62bdbfccc540e9e21390bed3a071fd854a348cec6a6ba2","time":1614602006001,"index":1,"nextconsensus":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","witnesses":[{"invocation":"DEBUsre4rmqvJm/6MG4fR0GftVT6xjO05uPWyPrn9rPW/ZcKuUuUvbPYt4dxxGefuMBdQTSbzSrtADERbKHMk8D9DEA4JwDK1q9NM+/S5D6uGgFFe/LFpoR1IJmrRUMkI20jg72IVer5D74YmPMDTjPhBmjsoIHwoPxqu4Fzr2Lo+irDDEBHt3M3UMCT0bVEK5JnHtftT+qol9PtZrhSz2Sr/jQBWkmDCvRE1QZZ/VeHwrnd/63PDVS0dkygjlhnIm0wSJBj","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}],"confirmations":6,"nextblockhash":"0x85ab779bc19247aa504c36879ce75cb7f662b4e8067fbc83e5d24ef0afd9a84f"}}` +const header1Verbose = `{"id":5,"jsonrpc":"2.0","result":{"hash":"0x5097754aca68e5db86070db369ae4c18bbd021a86dc88fafc5c809afe15e819e","size":451,"version":0,"previousblockhash":"0x9e7cf6fcfc8d0d6831fac75fa895535a5f1960f45a34754b57bff4d4929635c5","merkleroot":"0x07a982b6d287d1abbb62bdbfccc540e9e21390bed3a071fd854a348cec6a6ba2","time":1614602006001,"index":1,"nextconsensus":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","witnesses":[{"invocation":"DEBUsre4rmqvJm/6MG4fR0GftVT6xjO05uPWyPrn9rPW/ZcKuUuUvbPYt4dxxGefuMBdQTSbzSrtADERbKHMk8D9DEA4JwDK1q9NM+/S5D6uGgFFe/LFpoR1IJmrRUMkI20jg72IVer5D74YmPMDTjPhBmjsoIHwoPxqu4Fzr2Lo+irDDEBHt3M3UMCT0bVEK5JnHtftT+qol9PtZrhSz2Sr/jQBWkmDCvRE1QZZ/VeHwrnd/63PDVS0dkygjlhnIm0wSJBj","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}],"confirmations":6,"nextblockhash":"0x85ab779bc19247aa504c36879ce75cb7f662b4e8067fbc83e5d24ef0afd9a84f"}}` -const txMoveNeoVerbose = `{"id":5,"jsonrpc":"2.0","result":{"blockhash":"0xea6385e943832b65ee225aaeb31933a97f3362505ab84cfe5dbd91cd1672b9b7","confirmations":6,"blocktime":1614602006001,"vmstate":"HALT","hash":"0x7c10b90077bddfe9095b2db96bb4ac33994ed1ca99c805410f55c771eee0b77b","size":489,"version":0,"nonce":2,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4422930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUUwB8MCHRyYW5zZmVyDBSDqwZ5rVXAUKE61D9ZNupz9ese9kFifVtSOQ==","witnesses":[{"invocation":"DECKEAHrkcuS4I+DGIrhfbS4QHmISn+j63M3Gyhnlps/ijVlCyPpkG3gzxVht5hsD5EgRC1alTK1DaooGS35SYTcDEAbqjpPMa1ZQMeQOVWvRZTIbt4qPsCK7mz6Fja9LJJQSoePB/cN1hz30xQUgFvDPXj6Lv01VzONF/lNO38vrPvDDECJcNQCl/35Na59Rqo2TqjZoVY0D5uk5Owm9X83gWuG2iBMuQ5mmjPGsodLZvDd1XPCTUsJyvdbyFzxvwPUSkyr","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]}}` +const txMoveNeoVerbose = `{"id":5,"jsonrpc":"2.0","result":{"blockhash":"0x5097754aca68e5db86070db369ae4c18bbd021a86dc88fafc5c809afe15e819e","confirmations":6,"blocktime":1614602006001,"vmstate":"HALT","hash":"0xa10e7ff4103b5fbe57137012e7060760b7b7caffb4dfe70fb45d1cf8a5045b09","size":489,"version":0,"nonce":2,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4422930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUUwB8MCHRyYW5zZmVyDBSDqwZ5rVXAUKE61D9ZNupz9ese9kFifVtSOQ==","witnesses":[{"invocation":"DECKEAHrkcuS4I+DGIrhfbS4QHmISn+j63M3Gyhnlps/ijVlCyPpkG3gzxVht5hsD5EgRC1alTK1DaooGS35SYTcDEAbqjpPMa1ZQMeQOVWvRZTIbt4qPsCK7mz6Fja9LJJQSoePB/cN1hz30xQUgFvDPXj6Lv01VzONF/lNO38vrPvDDECJcNQCl/35Na59Rqo2TqjZoVY0D5uk5Owm9X83gWuG2iBMuQ5mmjPGsodLZvDd1XPCTUsJyvdbyFzxvwPUSkyr","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]}}` // getResultBlock1 returns data for block number 1 which is used by several tests. func getResultBlock1() *result.Block { diff --git a/pkg/rpc/client/wsclient_test.go b/pkg/rpc/client/wsclient_test.go index 20a30edc2..e8a6915a5 100644 --- a/pkg/rpc/client/wsclient_test.go +++ b/pkg/rpc/client/wsclient_test.go @@ -118,7 +118,7 @@ func TestWSClientEvents(t *testing.T) { `{"jsonrpc":"2.0","method":"transaction_executed","params":[{"container":"0xe1cd5e57e721d2a2e05fb1f08721b12057b25ab1dd7fd0f33ee1639932fdfad7","trigger":"Application","vmstate":"HALT","gasconsumed":"22910000","stack":[],"notifications":[{"contract":"0x1b4357bff5a01bdf2a6581247cf9ed1e24629176","eventname":"contract call","state":{"type":"Array","value":[{"type":"ByteString","value":"dHJhbnNmZXI="},{"type":"Array","value":[{"type":"ByteString","value":"dpFiJB7t+XwkgWUq3xug9b9XQxs="},{"type":"ByteString","value":"MW6FEDkBnTnfwsN9bD/uGf1YCYc="},{"type":"Integer","value":"1000"}]}]}},{"contract":"0x1b4357bff5a01bdf2a6581247cf9ed1e24629176","eventname":"transfer","state":{"type":"Array","value":[{"type":"ByteString","value":"dpFiJB7t+XwkgWUq3xug9b9XQxs="},{"type":"ByteString","value":"MW6FEDkBnTnfwsN9bD/uGf1YCYc="},{"type":"Integer","value":"1000"}]}}]}]}`, `{"jsonrpc":"2.0","method":"notification_from_execution","params":[{"contract":"0x1b4357bff5a01bdf2a6581247cf9ed1e24629176","eventname":"contract call","state":{"type":"Array","value":[{"type":"ByteString","value":"dHJhbnNmZXI="},{"type":"Array","value":[{"type":"ByteString","value":"dpFiJB7t+XwkgWUq3xug9b9XQxs="},{"type":"ByteString","value":"MW6FEDkBnTnfwsN9bD/uGf1YCYc="},{"type":"Integer","value":"1000"}]}]}}]}`, `{"jsonrpc":"2.0","method":"transaction_executed","params":[{"container":"0xf97a72b7722c109f909a8bc16c22368c5023d85828b09b127b237aace33cf099","trigger":"Application","vmstate":"HALT","gasconsumed":"6042610","stack":[],"notifications":[{"contract":"0xe65ff7b3a02d207b584a5c27057d4e9862ef01da","eventname":"contract call","state":{"type":"Array","value":[{"type":"ByteString","value":"dHJhbnNmZXI="},{"type":"Array","value":[{"type":"ByteString","value":"MW6FEDkBnTnfwsN9bD/uGf1YCYc="},{"type":"ByteString","value":"IHKCdK+vw29DoHHTKM+j5inZy7A="},{"type":"Integer","value":"123"}]}]}},{"contract":"0xe65ff7b3a02d207b584a5c27057d4e9862ef01da","eventname":"transfer","state":{"type":"Array","value":[{"type":"ByteString","value":"MW6FEDkBnTnfwsN9bD/uGf1YCYc="},{"type":"ByteString","value":"IHKCdK+vw29DoHHTKM+j5inZy7A="},{"type":"Integer","value":"123"}]}}]}]}`, - `{"jsonrpc":"2.0","method":"block_added","params":[{"size":1433,"nextblockhash":"0x85ab779bc19247aa504c36879ce75cb7f662b4e8067fbc83e5d24ef0afd9a84f","confirmations":6,"hash":"0xea6385e943832b65ee225aaeb31933a97f3362505ab84cfe5dbd91cd1672b9b7","version":0,"previousblockhash":"0x9e7cf6fcfc8d0d6831fac75fa895535a5f1960f45a34754b57bff4d4929635c5","merkleroot":"0x07a982b6d287d1abbb62bdbfccc540e9e21390bed3a071fd854a348cec6a6ba2","time":1614602006001,"index":1,"nextconsensus":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","primary":0,"witnesses":[{"invocation":"DEBUsre4rmqvJm/6MG4fR0GftVT6xjO05uPWyPrn9rPW/ZcKuUuUvbPYt4dxxGefuMBdQTSbzSrtADERbKHMk8D9DEA4JwDK1q9NM+/S5D6uGgFFe/LFpoR1IJmrRUMkI20jg72IVer5D74YmPMDTjPhBmjsoIHwoPxqu4Fzr2Lo+irDDEBHt3M3UMCT0bVEK5JnHtftT+qol9PtZrhSz2Sr/jQBWkmDCvRE1QZZ/VeHwrnd/63PDVS0dkygjlhnIm0wSJBj","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}],"tx":[{"hash":"0x7c10b90077bddfe9095b2db96bb4ac33994ed1ca99c805410f55c771eee0b77b","size":489,"version":0,"nonce":2,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4422930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUUwB8MCHRyYW5zZmVyDBSDqwZ5rVXAUKE61D9ZNupz9ese9kFifVtSOQ==","witnesses":[{"invocation":"DECKEAHrkcuS4I+DGIrhfbS4QHmISn+j63M3Gyhnlps/ijVlCyPpkG3gzxVht5hsD5EgRC1alTK1DaooGS35SYTcDEAbqjpPMa1ZQMeQOVWvRZTIbt4qPsCK7mz6Fja9LJJQSoePB/cN1hz30xQUgFvDPXj6Lv01VzONF/lNO38vrPvDDECJcNQCl/35Na59Rqo2TqjZoVY0D5uk5Owm9X83gWuG2iBMuQ5mmjPGsodLZvDd1XPCTUsJyvdbyFzxvwPUSkyr","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]},{"hash":"0x41846075f4c5aec54d70b476befb97b35696700454b1168e1ae8888d8fb204a3","size":493,"version":0,"nonce":3,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4426930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwMA6HZIFwAAAAwUqorPhZ1P5AKzTmc/IVaCF5akiOsMFF4Svqh665VYhPb5znhFjMy5fDCVFMAfDAh0cmFuc2ZlcgwUKLOtq3Jp+cIYHbPLdB6/VRkw4nBBYn1bUjk=","witnesses":[{"invocation":"DEA7aJyGTIq0pV20LzVWOCreh6XIxLUCWHVgUFsCTxPOPdqtZBHKnejng3d2BRm/lecTyPLeq7KpRCD9awRvadFWDEBjVZRvSGtGcOEjtUxl4AH5XelYlIUG5k+x3QyYKZtWQc96lUX1hohrNkCmWeWNwC2l8eJGpUxicM+WZGODCVp8DEDbQxvmqRTQ+flc6JetmaqHyw8rfoeQNtmEFpw2cNhyAo5L5Ilp2wbVtJNOJPfw72J7E6FhTK8slIKRqXzpdnyK","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]}]}]}`, + `{"jsonrpc":"2.0","method":"block_added","params":[{"size":1433,"nextblockhash":"0x85ab779bc19247aa504c36879ce75cb7f662b4e8067fbc83e5d24ef0afd9a84f","confirmations":6,"hash":"0x5097754aca68e5db86070db369ae4c18bbd021a86dc88fafc5c809afe15e819e","version":0,"previousblockhash":"0x9e7cf6fcfc8d0d6831fac75fa895535a5f1960f45a34754b57bff4d4929635c5","merkleroot":"0x07a982b6d287d1abbb62bdbfccc540e9e21390bed3a071fd854a348cec6a6ba2","time":1614602006001,"index":1,"nextconsensus":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","primary":0,"witnesses":[{"invocation":"DEBUsre4rmqvJm/6MG4fR0GftVT6xjO05uPWyPrn9rPW/ZcKuUuUvbPYt4dxxGefuMBdQTSbzSrtADERbKHMk8D9DEA4JwDK1q9NM+/S5D6uGgFFe/LFpoR1IJmrRUMkI20jg72IVer5D74YmPMDTjPhBmjsoIHwoPxqu4Fzr2Lo+irDDEBHt3M3UMCT0bVEK5JnHtftT+qol9PtZrhSz2Sr/jQBWkmDCvRE1QZZ/VeHwrnd/63PDVS0dkygjlhnIm0wSJBj","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}],"tx":[{"hash":"0xa10e7ff4103b5fbe57137012e7060760b7b7caffb4dfe70fb45d1cf8a5045b09","size":489,"version":0,"nonce":2,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4422930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUUwB8MCHRyYW5zZmVyDBSDqwZ5rVXAUKE61D9ZNupz9ese9kFifVtSOQ==","witnesses":[{"invocation":"DECKEAHrkcuS4I+DGIrhfbS4QHmISn+j63M3Gyhnlps/ijVlCyPpkG3gzxVht5hsD5EgRC1alTK1DaooGS35SYTcDEAbqjpPMa1ZQMeQOVWvRZTIbt4qPsCK7mz6Fja9LJJQSoePB/cN1hz30xQUgFvDPXj6Lv01VzONF/lNO38vrPvDDECJcNQCl/35Na59Rqo2TqjZoVY0D5uk5Owm9X83gWuG2iBMuQ5mmjPGsodLZvDd1XPCTUsJyvdbyFzxvwPUSkyr","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]},{"hash":"0xcebbbdbd35faeb3d15e9c6e804efdf250fc23685e324bf31c1c142a1b78be5e7","size":493,"version":0,"nonce":3,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4426930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwMA6HZIFwAAAAwUqorPhZ1P5AKzTmc/IVaCF5akiOsMFF4Svqh665VYhPb5znhFjMy5fDCVFMAfDAh0cmFuc2ZlcgwUKLOtq3Jp+cIYHbPLdB6/VRkw4nBBYn1bUjk=","witnesses":[{"invocation":"DEA7aJyGTIq0pV20LzVWOCreh6XIxLUCWHVgUFsCTxPOPdqtZBHKnejng3d2BRm/lecTyPLeq7KpRCD9awRvadFWDEBjVZRvSGtGcOEjtUxl4AH5XelYlIUG5k+x3QyYKZtWQc96lUX1hohrNkCmWeWNwC2l8eJGpUxicM+WZGODCVp8DEDbQxvmqRTQ+flc6JetmaqHyw8rfoeQNtmEFpw2cNhyAo5L5Ilp2wbVtJNOJPfw72J7E6FhTK8slIKRqXzpdnyK","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]}]}]}`, `{"jsonrpc":"2.0","method":"event_missed","params":[]}`, } srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { diff --git a/pkg/rpc/server/server_test.go b/pkg/rpc/server/server_test.go index 2a5c18335..baebd390e 100644 --- a/pkg/rpc/server/server_test.go +++ b/pkg/rpc/server/server_test.go @@ -60,8 +60,8 @@ type rpcTestCase struct { } const testContractHash = "1e1c3024bd955ff3baf7cb92e3b7608c7bb3712b" -const deploymentTxHash = "7cf43b182dee2e8bd2c5209cd230799aeba1b5b13000db682d917c89eacd1eae" -const genesisBlockHash = "d237e3500d8b4cf0df3fd9c4c053016afae141207a6c732303bdd91aff444ecc" +const deploymentTxHash = "b67eb38f1e6805d60b68cbec9cf8db7e4a71313b6f53ff8545c578b51ce874c5" +const genesisBlockHash = "5b60644c6c6f58faca72c70689d7ed1f40c2e795772bd0de5a88e983ad55080c" const verifyContractHash = "5bb4bac40e961e334ba7bd36d2496010f67e246e" const verifyContractAVM = "VwMAQS1RCDAhcAwUVVQtU+0PVUb61E1umZEoZwIvzl7bMHFoE87bKGnbKJdA" @@ -865,13 +865,12 @@ var rpcTestCases = map[string][]rpcTestCase{ "sendrawtransaction": { { name: "positive", - params: `["ADQSAADA2KcAAAAAABDiEgAAAAAAgBYAAAFVVC1T7Q9VRvrUTW6ZkShnAi/OXgEAYBDAAwDodkgXAAAADBRdSe/t0S4+BgGLRljbEKiXX8gLTgwUVVQtU+0PVUb61E1umZEoZwIvzl4UwB8MCHRyYW5zZmVyDBT1Y+pAvCg9TQ4FxI6jBbPyoHNA70FifVtSOQFCDEAppqgOf7RZvrS+uOVzVNlcQAQnyujtzHzv9/Za+FFkxWFd8mZ6AvWnFXAL0W5NafW4xyP7Kp/qgWCmZrHINaLkKAwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CQXR0dqo="]`, + params: `["ADQSAADA2KcAAAAAABDiEgAAAAAAgBYAAAFVVC1T7Q9VRvrUTW6ZkShnAi/OXgEAYBDAAwDodkgXAAAADBRdSe/t0S4+BgGLRljbEKiXX8gLTgwUVVQtU+0PVUb61E1umZEoZwIvzl4UwB8MCHRyYW5zZmVyDBT1Y+pAvCg9TQ4FxI6jBbPyoHNA70FifVtSOQFCDEAOJpFi9vI44kaLJcBvEyqSO9Q76XluNyozh0lBueRwXMijYJa1Zlp5jLkqCsmNsEaF1kCpIQ+2wtpDT+HHZGI4KAwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CQXR0dqo="]`, result: func(e *executor) interface{} { return &result.RelayResult{} }, check: func(t *testing.T, e *executor, inv interface{}) { res, ok := inv.(*result.RelayResult) require.True(t, ok) - expectedHash, err := util.Uint256DecodeStringLE("3b133d0c2912da4f99680ae3a5f0e178bc761f2c360662a1fabbe1a8dbe309ea") - require.NoError(t, err) + expectedHash := util.Uint256{0x6c, 0x8d, 0x40, 0xba, 0x91, 0xde, 0xe8, 0x74, 0xf0, 0x24, 0xc3, 0xbc, 0xb6, 0x8e, 0x7e, 0xf4, 0xf5, 0x77, 0xd7, 0x6c, 0x9f, 0x10, 0x66, 0xb7, 0xc3, 0xab, 0x71, 0xd, 0x19, 0x1a, 0xeb, 0xac} assert.Equal(t, expectedHash, res.Hash) }, }, diff --git a/pkg/rpc/server/testdata/testblocks.acc b/pkg/rpc/server/testdata/testblocks.acc index f6ff51a72b692ac24d2516f90ea290e9adeddb36..618d990545d777a0fdd45a95389736566ee6dd02 100644 GIT binary patch delta 4088 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 YUK{!#eahM;-{3J;G?B_3{Z+{GzoFowNdN!< delta 4088 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 Vqtj#Sr&X5NaI;k2xM|_L{{fJPVN(DA diff --git a/pkg/smartcontract/context/context.go b/pkg/smartcontract/context/context.go index c7facc572..5a5af44dc 100644 --- a/pkg/smartcontract/context/context.go +++ b/pkg/smartcontract/context/context.go @@ -180,7 +180,9 @@ func (c *ParameterContext) UnmarshalJSON(data []byte) error { var verif crypto.VerifiableDecodable switch pc.Type { case "Neo.Core.ContractTransaction": - verif = new(transaction.Transaction) + tx := new(transaction.Transaction) + tx.Network = 42 // temporary, neo-project/neo#2393 + verif = tx default: return fmt.Errorf("unsupported type: %s", c.Type) }