From 443537eaec2e9ca7c4fa7cde5b97666fd4472750 Mon Sep 17 00:00:00 2001 From: austinabell Date: Thu, 25 Nov 2021 12:35:22 -0500 Subject: [PATCH 1/4] feat: Implement fixed length hash functions and optimize existing implementation --- .../res/callback_results.wasm | Bin 104452 -> 104452 bytes .../res/cross_contract_high_level.wasm | Bin 244783 -> 244751 bytes .../res/cross_contract_low_level.wasm | Bin 267530 -> 267498 bytes examples/fungible-token/res/defi.wasm | Bin 118869 -> 118871 bytes .../fungible-token/res/fungible_token.wasm | Bin 201136 -> 201138 bytes .../res/lockable_fungible_token.wasm | Bin 134801 -> 134766 bytes .../mission-control/res/mission_control.wasm | Bin 128548 -> 128511 bytes .../res/approval_receiver.wasm | Bin 116414 -> 116416 bytes .../res/non_fungible_token.wasm | Bin 287058 -> 287137 bytes .../res/token_receiver.wasm | Bin 115685 -> 115687 bytes .../res/status_message_collections.wasm | Bin 86767 -> 86767 bytes .../status-message/res/status_message.wasm | Bin 115268 -> 115233 bytes examples/test-contract/res/test_contract.wasm | Bin 28014 -> 28014 bytes near-sdk/src/environment/env.rs | 74 ++++++++++++++++-- near-sdk/src/environment/hash.rs | 12 +-- 15 files changed, 70 insertions(+), 16 deletions(-) diff --git a/examples/callback-results/res/callback_results.wasm b/examples/callback-results/res/callback_results.wasm index c6c35cbdf8ca64c93e57a5aed346b907e1f322f9..bde93744b1acffdf448fb7b2aef457ffac887c26 100755 GIT binary patch delta 35 pcmZqKz}B*XtziqJW}=`cBLf2`0|Ubf4gm&LAnmo?Dv|M&833Un2pRwY delta 35 pcmZqKz}B*XtziqJW}=`fBLf2`0|Ubf4gm&LAg#9DDv|M&833H=2hsol diff --git a/examples/cross-contract-high-level/res/cross_contract_high_level.wasm b/examples/cross-contract-high-level/res/cross_contract_high_level.wasm index 1131e841f66bd94f61c5d8ffafe46121166fa525..f9f1c2b5bf7af712a47fcfa2608e4e3ac32aae84 100755 GIT binary patch delta 11066 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 delta 11208 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 diff --git a/examples/cross-contract-low-level/res/cross_contract_low_level.wasm b/examples/cross-contract-low-level/res/cross_contract_low_level.wasm index 23a2b177ae098c988ee782b397538ef81cb26631..f8c9a904561e11f49c6f4148505118633418a17c 100755 GIT binary patch delta 12160 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

@KfK{$W*%QH6nQn z(2b-LoQ9|tLNf57%Wg>j5k-=G(VJQ+o`r>b6&8Vdll?PP&mf~cbd7wK!lU7d8KnDjF6;n6B5);q(sreV?X|cSfmqKmU;fN3(|2&oB#PTE zGs(+g&fR#fzfxQk@;>+vHd;B@*!D%CAg^KCD5nz- z^3!1{EjY-(hEJ=e0)7oFqL~GJ0v=U;4)I?T+XedTA^r{Up;Hg@Z<&)WnYpRx$_GEJ zhkWF!!+fZ*Bit}^&WQDxx?tKCQ`XBJsn1EitNUPtZ4kbIse#sJ^Iap~#4Kyk%4=rs z6-?8y0lGNgO=^Q^@~jr}J&1#uJ}o-Q&muK9sHK#D!J`J>Q4GSg=7zkil%EID z`88&4G7?+Rj*T-7pG4fw0e_D8SqEH(xSIp6K-|{>`w`V%9(S5=*8}`$)IGk>+-+?< zlp4n`UN9#{SP~sKJ9=I`niV3?M$EjJx8vVg&?GsJd|Tuf&zl{usozG586 z4ms8}8R(Ivi{j&E&zmK1Zz8WpJmbyixab-2F>yjv)KcUO$gRW_>&?9}XMS`%(_S!t z_Plr@Dg${oZBQPrC?Fd%ih(b1`HRIRk&z}<$Jx`HUYBGAhmcIzE)6AdwxA|(5 z2X)KhU))r{w}rtp{=fVQ;N)k2;Xed3=i!0AIIgUnJ*11YqK=58F6Lq9Dyv{x0 zZ{jPjy&O6EwGok{BPYF#cAEXWn8%seh)-djRY8+K#QY=&{0Q@G=xB1l5c@b_H^h$q z3<^$YGBCDKaBqRzw7_E#vo_QUj6v)ez(T}q8Q0`X5IY9E5^*0{Xy8XX&7L55aL=Ib zGW>YqN5i?8XF+RtUkkjy1JfA0E}{zz_Le37Y;blsiWKO$!{1i-Os~Uw6cgYzd)ng!j zG?huJY!aQ|q#NYE03kZy(lGU)X{&i}T7WLhg(}}0WfuGtQkxTo;4g)HbJr33W3 z@jdzmc_{ncDQqD&tK#Dp$Gj0eXHg91HJJ&QXSUk+rGxTC*1!H;0`eW*k zX>#H=I@e~WUq`fKvD{i{}=2hsHt&eG#vM83* zY&Tt~P>PT(#h+u!7VR%EWpQik3jKU3-`AoU>$-a=)2KV9Z13!iDcehz(_sc(PjeK) wK!j|qX4`I*oM_M`IQie}>A{5{X5)mV8fKdui{)NVYBB4cfidy~v+g+me^gl(J^%m! delta 12174 zcmc&)dt6l2_CIUy0S0E!83X|pIfDo)nB)V^M{@A3-PH2l%AXpfWRh>u9zP3IR6(T$8!6U%Ot{))P2l%&74&zu7T*r)sX{qxh$%--McT6^ua z*M9HehdfLAK1<;#cdwN19fB!YkW#+4f8=fwsbhB;tEq)2?f&6a0dQ2V8~lXrXl7Z8 zAek*&mZzi$CbJ-d2$nl39QYuRj>^x(M51nTOfVd^Z;$bzUbX9Zk#17XdilhVXWCy` z&ta5EBy*yavaA$A4yP^=NmoXQKmz2M`vgpv z87s+r<5eg*{N|6;BXa|9e6@V{t)p;H&VRc1-ypA+m3Jp# zh|O!mN!mKO&)U_bHbee$eFyo*+L_2dl@U&|*2xPq)?8FI<#| zuFr(`CF?O`ap4_A68eUzjLJ0gZ#tK0GrRTtuRa=*?U97q&$PYFRhcE2IHm3tg&6Gdc65yg2oBZYS> zST-(2&g6@foO8f8pg|xKky^gtJ&TiHa@a2(=tSFPb2F0qZP~yJh5(KZij3@esGm_6 z+eaO0??y5<%P$|@PEt0@9?B>j&f}FQ@jFAwhJ3ku(J{!ke^(R&;E=tJ_f4)l!7T?k z*PhlUjKp=7Y45_EQJHow%s!O~bYZrsjJAfUc2=oO8yB6rN<671gCsmsI96}s0*`JWn5jXFKXV7D*K8P7I3TC zf&%vQ4rtGe5zx+FUR+1OVZTsv8GP%qQD&)jjs(#MJ1=dky#G`JE)&+%{!nf2dfJ!x zR&V2`BXAtyfXv*^LA8DS+1ucIZ8HbjP_0zes^oF!i*QZwEDOQ!$g;8cy|`=$ewUUl z!S7fH=Mx;9f8T+;{Wr(=X3xSLZYdO(l-r*zA{$HOsaMvKtP=U&l}Ut^$P+$)fov*~ z3qBw1apxr0tT|liPPm@&%S5uRL{9p0DA`^jAOEtLqqv6>FLmPThrHCvYh(3N>nqdj z3D;ABE8YGoh!^p?@fPfm({60$)rD3~BU?)3^r|avDZ8;A+4hZ}{mq*PD9PMq@A~a8 zIFNVCLAO7ET>I7A>pU=-_3!Cmt}8~}Xkx?wF4=I3be7%jb~NXH&_FI_wob&)KJ@N8 z02T7(dmC^mpZ4n-%>VLh8p$ZOFRtrOa3<{geU`lbejB;l{Z3FSKYc%lY$}##-R}(L zvV4CORLR%xN8@Dot>5aoTkVG^4A}Adci^sk<&VeY`G43j7xti!eBlqX%8ga=YR??r z7^#a?DW7;SwoA1dLW5<$I^A(Q#|~{tZ7z{}K8)1EiD=iuR5-Gs3-p4s8zwa{F2Nxy4ZVv_2#ESRKwY#W8ASvkOh|93aGk?a!XNdwFQ*v$^Q!8w|Fri^(J z(vfAl!!)R1zq!MDxW!g`KptD=0aiBL2&3VMvd##v8%X9EX7Yx`P^+YQLjaDhb8M#t z#u-!3U_5X_vP0u(fZ}6?YzmdEz!yehQs)cvFiG@-2uwEmK?o+toXIsmn9-qfGcM$b zJp^HZz|U)ZF}@|td{u%ZsglLFg(pydOIrxVq_i!_J~`Q_&vo4-k|^P}zmp~S!xEBJ z#;X0{ZKzYG2SAX!*DkInb&#^QD(`lLTNLuyf)LnluHTNly3t6btSS^D*r-m>398tv zPVfRIWjr~{Y@zT16GOqomWRSvlChm#35B7)`CHY}U7Xug2V7oKwzHhh&^E-&gdh?< ziYEN9(NeLFS;N4ez1107w`nQ8<&++Mw6xqQ{pr!tA}$Skgwb5JScuzSxt8rTzd7uY zu4SlF3vFhF%?pFB%p4A_9}$&XTh*wrVUHGHRKpRS6mjkp&V%~9IqY&c z>?D~vY!9}(x0@gyl;vNZyJf~*tL zLvzg&DrwcoR!%ZsC0lExH>>FbzCF!O*;-X*)?_9pxk4p9HIk1gG<}c7MT2kh9o0cE zO=fh;ZZz@Q!%2SDL=*2y+{y)&)a&CT0?CsqY0_*Ooa9lJ)Emuv9W@U`sI2Z9ak4v` zlm{odbsy{47nTLp@e`T^BfJF(52W=R4Qp+Z1U%o-I(D)zyzE)Ho2x`fb*y_o2!KLm zct4m$+|oGh?7dB6pf&rtKRg9jS&sp*p4RMku*r$Ysx-lXAF!3nu8B{i5)q=EfU^}UiwfKs6<|@!mb15pK(uFC zF88Z9?q|hApgZ>04@2O;MqlHFBuI=VYL3M4|J<53afb7W6N~qk6bnumu588wMdM_` zq9Jb4d}1+a0&PDU+sQXJU%dZnSqrzOx*tNM<5)n@7T^$EtWMV`047a?+R9s3B5U zjOxa$s%4U@73(N?g}Bx6VXm$g3a%C}gIDbVBqXbpc2M#B8>9gCYWmZV19dE7ECl=3 z=W}r{Y!ptDJ1TG}Q^taXFBU9k984iu2ak@2Zy`DDCTcd^G~Dqh+Jr&ej1g%I#;rLc zCAVM>^LnHp&AN8ST>|Xbau`ZdKW00|K``sM0y-$)J`0x&o>>REe$J;3cIQ2ElV!gE zHgK?U6CsTG?Il5M>qPKkrir|8g))93)B~-oaIhtLq%C`S5;nA+hpLL*wcP5dt4zk24IJGV+C#FCL=$~E4{UMg0 zd9ijT5`!CtI1k5@C`h|inW2fSRM3P+m^BU!l(WY$8JBj5n`y7BiURJfjRC!_`P9f% zw_uv;D4XM88TdBoGtHp#_)D-2!X70;9~!#c*?G#{sc^|Vx&DZ&NJLB7@4GNkmfDN$ zn)ae-Y3Oauxj)gf{*_*`)>@yxQq=UIxt`df3KvF?Wy?}J!~QuRI=Jy>=PNhoL#{qO z^q9BsOKfCx>me5e+sw533*wR5(wl<&$uCFQGhv~-K7`rDY4 zqOu*N>?UmaVQwM_-ymFdcd2X#sZ@Dp5v(TKT+!R)%n-H+5BtSdo6pok!fgN zL+9zSNN(MNYGm|c{w;KZnlpbg{r^%=pZ>xBp}`ie{7JsdNMa~UR!42;^;Dx+?CHyy@ znO;wWh46#&V;Z!FWPPv|o^rU1e0{K$HevO_R^Eiw2U}GWR-b4!O;~+WrkvJl3r*p_ z7G!XUbG1~bRd$oQIS1ikFFzf6;7iN3biBP3v#zTekZ*ATH}sP}m!wZ{H&>3Wf(K-L zm1;ClDt9$1QjAZ%%2aEGY{+Dv;bwG3jiJiu;pRH|ig7KpCDtE!yc2tXVDnJ-=PK4? z9lVKg-M0>uk$OC<)bje|t>FmYH#5)jdUUo}Wo^=KR~C1CwGnyi;UIL^8*!wG3U9<& zmC;=WWGYx{CO#_NQeXq%J-1d>&|5(9w2^v_joFBgF}cseAa{JbN|uV*cN@Xh=c6+2 zUYO+$4~hCxeo$qCT$r?`I?~t5AO@3Y8}$g)8{|!suQo!1K9%FNDD<<;%Tr0ZeN2 zY-UNY8Cg{z4KzMH$6JTz!jJR7zfH<{L^d(bM4^3*3UZvTQC;h@5392R=y8$!G940#r-JkH@FpFL_eKZt51%@a&RRU z72~)dDVJFINf^%4IVZu7rz=jvCt}Ja9=B3{;{>Uc1IzztE0?F_Ce7E<}(_Ng|AC zj~87$vmna~u92Q3?Q1suJVbVERD1aFp)k)z_$9@FuBpoG(0PcVDc?BQ-0LJVtf-2+ zTdlcEr9*C#qZt*9%lq&$e4BQ#lrk7YHeX?v%3w&u<||lqgg4-Gjp$*cqMME2VxX}C zzVZpu!-sU9&46pz00%qFWm5}H%)P+BLFyF^*?Ph7TeZO#4^it#1t zg$i7xd{aK|`2s3{q8-Qci=e zRk&fPluy}jpF?_^ruSXE8cXWR-$6NC33~|q!d|!vA($+_3UQcRzY4LwzwiZA`^Ccf zeg*!d)#Yj<;MF{(R4|>XHnQ9qG*_8(6S642%6QMB5uR-f7NN5s2t$>D-$Jk( zR4J2w0MmT`b3O)0hPS=&(+Rf*oT269)evCTSn8`}P9hzF$( zBsIv0PfgAyIyW6qUoY_QCqg_$Bdd-hohi>);z@9KcguafSw(;iGK=n(t;^8Qc4%K~ z5^nsW37cwUlj2Dbz6U$oBYI%tm&X&)ih3FNpw64Vnx`J@XgsNHRZE*hiQRmO3~BG~G>LyBg3BKNu?eIsNW>@45Ca=Lm5lIlZ{RCcUNo?*sia%5 zH;)8~#TD>j>t!}?Y&UK{Ak_(pXe-2>-JD7S!NBfMCC~a8x>BL9YP%A}9TL&~xM?VM zXKzj;{ZPw3jr0bL&@|FH3LV9#9_$ZViGRC+&wV(SMWbc`|0*C+^k@KR%D@ICkYMm$ zIXQtSlM`rxhjZNaf}x5ui*D;5B1Dy01usDm!tnD1estUo^S&H!%%#CroqZe`Z_cu) zTsj7#*y3Co5wA(=Y=$Qzwz$YSZtsGpU_OXrX3V3V8l0Gkl+%fU zd9)WgF*lDs3sK71JUSR4mKpZbUY@UiXjN@xvzYyK75=7iaX$@bl`HVY)RIqE20A{n zsuQ;}2!baX)NvRq%%?qwr5T(t_%W4a#W(a{BO)Z(Mdw>FdSK^)HY zSyl<1PJ|l_O6h1H;f7V<-TydxF#uEHhBCR7&W89)RaW6S#GA1kA745yLEOd#Uq&3| zg3luE>Vh4Jd%NIZqLo)7Pt!KtVK9sNiT0XxvXzh8;-rOhXC{b?;^)tZpPhuoDv;-6 zXm-MDNpH+;l-xnSHS!B*&q&hM4Xu3yGja*D7tRX6Ja&mND}JsJig}9p1qt&OCd{6i z5XGu~qW;M-Nb?|%otrdc&TKR?b78{snhDJ;GJ-G@Io>x%uu7gTNSZ%m_Hq;jeToL~pF4V*+3C_u+qOC~Ux#M}G&VyqaibS{+>mP|K=+qdhPQ z_#OA*+5jJ+2TEUKgiPDK&T}|4n-S#b-y2cyZ{c z5u+wNizRgnZ(<%NY6CundEN$H{u|~exZvM0&qtCj2XwNR3-&_nYR{zNr2;HI(5kB->!<J^A{$(96xhG0_Js@1y^ytDNJCQ9@v%#%;8}e(mg61 z>q9mc(-2JO$IqUgASTS7CeD~WE#Y-B33F8jBc^<9{{>U-x4z=A{jbyBHob6YHy?F+jmDI3vCm-2x7-~} zG#PqWQxJAW$X9f}JEtgdCPT7YNb4vcp$lR@PI#(gz87*|T1PRk8XkjJlqjp=IQ?I8 CD+FZ# diff --git a/examples/fungible-token/res/defi.wasm b/examples/fungible-token/res/defi.wasm index 12a0ef30058818913abaacd0849e142e61b66f0e..d97994c7367bd8910f417a98bb8c1afb2b3ec5d4 100755 GIT binary patch delta 11869 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 MJ3Ghbz|rLY2R59fxc~qF delta 12096 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 diff --git a/examples/fungible-token/res/fungible_token.wasm b/examples/fungible-token/res/fungible_token.wasm index 77d0b7bb6adfa83c55f6ee890148a5e7731535bd..733fc90bff4d74fe12d6bc870a87110d019422c5 100755 GIT binary patch delta 20008 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 delta 20094 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 axL3w|uxx$O7>ooWTvD4&rG6HOnnRSWT94?V zitdha@#UFkfvm#z8ER7nX6g$;q?s&rXZZh_`aA~-r!+LN27KGS|4VyHeG440-Th`9 z_md(puq*7GBHazs-^}D7bS;80(W=50SU7`ZQy7w)Wf(z>0+8dGb=18Qv{7FqbRUe1 zK8WV@XLL9$f6+_a1i>MJmDr+(s0p=_nu64C@u(whAc|ISy#$e=WZB7=7%^NUDd=`m W&J;j4yGf^;(DE!@?DRgOD!Hx=B@ zbpaC;0mNI8O0!#(5GV>AvOI<(Tro_L`(iD||jVp7;6ZtI&2$7av zs|Wp-M-`P^5ozNV`l>!Mz+L9BYGEwEn)8V6*2}fLjD%7QRzVQz;prctByD_fO5+?- zt_c6}mwier9BdH&VFS|)0|ODVGm5YMxG>Ad084KqF!&>;D1sfbZ9I6$^m#I*?~+9m z)7rY69xWKy{6S*Bo1&vjoqU9xyDl;17^_Lc0V9I_mgHcxqyT%`qYm(P1bZObyVAfW zGH>iiY@)1PoouR!7|kLFr}#EbMg={z_uy#$${~jFJOAeUMEW9vF?A RtaFpm$$47sy!U7_^$mcMXRZJM diff --git a/examples/mission-control/res/mission_control.wasm b/examples/mission-control/res/mission_control.wasm index a5eca0c52fad8571b0a7c02cdaf751d118265397..4933121c1d0c683a5655c27fbfb8cf4ac6248469 100755 GIT binary patch delta 1227 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 delta 27748 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 B6G{L8 delta 11245 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 delta 658 zcmZWmO=}ZD7~XewnVDpFb$j zFvX6>TszV4R;%UM?I9&CU@S0$+)USw9|7b=_7)IO7TK0XQDl8Wy~Kz@_aTYa@6vl# zHVoUcBWEEUmQ3BbD;wUeM;G^hO@E-DBN3npmfZ37Y z&cH0+>5R+J8D%5OO43zUw)|J)3`%plKH*xtQO_Ua(XW4j`an?vSv)}GqcmD3 z=u=2(R_o(uCCS<(DCp{Io5nKtsm!_1rAK6c3rZAao8XZ}s-tUB7( zlp{3X7bf@o*PEGXoIl97mGr)3iaA9_Li#BrI!a>CbQ^OyzH>Yn9;0WzG^X>Rt%g

    H1~sNE;X;@yn^eLhP(qBjwSRTdo<+cV{;a~$LT4cw$h2c vWY0m8FSrAW=Aom5gzA`2Ez$in4`F*P-CRpyT|oKCwM94y7d9U*f;saSXZe*u diff --git a/examples/test-contract/res/test_contract.wasm b/examples/test-contract/res/test_contract.wasm index ccb344ddd2d14a03f8611ac8e7081bededbbaf3c..1956ad09b1ea44080581e21d53e228635627a3b4 100755 GIT binary patch delta 16 XcmaENi}Bqp#tm}Oj47Mtqy2>dME(Y^ delta 16 XcmaENi}Bqp#tm}Oj1HUSqy2>dL?#A{ diff --git a/near-sdk/src/environment/env.rs b/near-sdk/src/environment/env.rs index d39fb62f3..21a04aaf1 100644 --- a/near-sdk/src/environment/env.rs +++ b/near-sdk/src/environment/env.rs @@ -3,9 +3,9 @@ //! whenever possible. In case of cross-contract calls prefer using even higher-level API available //! through `callback_args`, `callback_args_vec`, `ext_contract`, `Promise`, and `PromiseOrValue`. -use std::convert::TryFrom; use std::mem::size_of; use std::panic as std_panic; +use std::{convert::TryFrom, mem::MaybeUninit}; #[cfg(not(target_arch = "wasm32"))] use crate::mock::MockedBlockchain; @@ -51,6 +51,21 @@ macro_rules! method_into_register { }}; } +//* Note: need specific length functions because const generics don't work with mem::transmute +//* https://github.com/rust-lang/rust/issues/61956 + +pub(crate) unsafe fn read_register_fixed_32(register_id: u64) -> [u8; 32] { + let mut hash = [MaybeUninit::::uninit(); 32]; + sys::read_register(register_id, hash.as_mut_ptr() as _); + std::mem::transmute(hash) +} + +pub(crate) unsafe fn read_register_fixed_64(register_id: u64) -> [u8; 64] { + let mut hash = [MaybeUninit::::uninit(); 64]; + sys::read_register(register_id, hash.as_mut_ptr() as _); + std::mem::transmute(hash) +} + /// Replaces the current low-level blockchain interface accessible through `env::*` with another /// low-level blockchain interfacr that implements `BlockchainInterface` trait. In most cases you /// want to use `testing_env!` macro to set it. @@ -218,20 +233,41 @@ pub fn random_seed() -> Vec { /// Hashes the random sequence of bytes using sha256. pub fn sha256(value: &[u8]) -> Vec { - unsafe { sys::sha256(value.len() as _, value.as_ptr() as _, ATOMIC_OP_REGISTER) }; - expect_register(read_register(ATOMIC_OP_REGISTER)) + sha256_hash(value).to_vec() } /// Hashes the random sequence of bytes using keccak256. pub fn keccak256(value: &[u8]) -> Vec { - unsafe { sys::keccak256(value.len() as _, value.as_ptr() as _, ATOMIC_OP_REGISTER) }; - expect_register(read_register(ATOMIC_OP_REGISTER)) + keccak256_hash(value).to_vec() } /// Hashes the random sequence of bytes using keccak512. pub fn keccak512(value: &[u8]) -> Vec { - unsafe { sys::keccak512(value.len() as _, value.as_ptr() as _, ATOMIC_OP_REGISTER) }; - expect_register(read_register(ATOMIC_OP_REGISTER)) + keccak512_hash(value).to_vec() +} + +/// Hashes the bytes using the SHA-256 hash function. This returns a 32 byte hash. +pub fn sha256_hash(value: &[u8]) -> [u8; 32] { + unsafe { + sys::sha256(value.len() as _, value.as_ptr() as _, ATOMIC_OP_REGISTER); + read_register_fixed_32(ATOMIC_OP_REGISTER) + } +} + +/// Hashes the bytes using the Keccak-256 hash function. This returns a 32 byte hash. +pub fn keccak256_hash(value: &[u8]) -> [u8; 32] { + unsafe { + sys::keccak256(value.len() as _, value.as_ptr() as _, ATOMIC_OP_REGISTER); + read_register_fixed_32(ATOMIC_OP_REGISTER) + } +} + +/// Hashes the bytes using the Keccak-512 hash function. This returns a 64 byte hash. +pub fn keccak512_hash(value: &[u8]) -> [u8; 64] { + unsafe { + sys::keccak512(value.len() as _, value.as_ptr() as _, ATOMIC_OP_REGISTER); + read_register_fixed_64(ATOMIC_OP_REGISTER) + } } // ################ @@ -719,4 +755,28 @@ mod tests { assert!(!is_valid_account_id(&[0, 1, 2])); assert!(is_valid_account_id(b"near")); } + + #[cfg(not(target_arch = "wasm32"))] + #[test] + fn hash_smoke_tests() { + assert_eq!( + &super::sha256_hash(b"some value"), + base64::decode("qz0H8xacy9DtbEtF3iFRn5+TjHLSQSSZiquUnOg7tRs").unwrap().as_slice() + ); + + assert_eq!( + &super::keccak256_hash(b"some value"), + base64::decode("+Sjftfxys7v7mlzLDumEOye0rB68Jab294PiPr1H7x8=").unwrap().as_slice() + ); + + assert_eq!( + &super::keccak512_hash(b"some value"), + base64::decode( + "PjjRQKhRIzdO5j7CCJc6o5uHNJ0XzKyUiiST4YsYtZEyIM0XS09RGql5dwCeFr5IX8\ + lPXidDy5uwV501q0EFgw==" + ) + .unwrap() + .as_slice() + ); + } } diff --git a/near-sdk/src/environment/hash.rs b/near-sdk/src/environment/hash.rs index 1b7fa5cfa..f67c888d4 100644 --- a/near-sdk/src/environment/hash.rs +++ b/near-sdk/src/environment/hash.rs @@ -1,6 +1,4 @@ -use std::mem::MaybeUninit; - -use crate::sys; +use crate::{env::read_register_fixed_32, sys}; const ATOMIC_OP_REGISTER: u64 = u64::MAX - 2; @@ -36,9 +34,7 @@ impl CryptoHasher for Sha256 { unsafe { sys::sha256(ingest.len() as _, ingest.as_ptr() as _, ATOMIC_OP_REGISTER); - let mut hash = [MaybeUninit::::uninit(); 32]; - sys::read_register(ATOMIC_OP_REGISTER, hash.as_mut_ptr() as _); - std::mem::transmute(hash) + read_register_fixed_32(ATOMIC_OP_REGISTER) } } } @@ -58,9 +54,7 @@ impl CryptoHasher for Keccak256 { unsafe { sys::keccak256(ingest.len() as _, ingest.as_ptr() as _, ATOMIC_OP_REGISTER); - let mut hash = [MaybeUninit::::uninit(); 32]; - sys::read_register(ATOMIC_OP_REGISTER, hash.as_mut_ptr() as _); - std::mem::transmute(hash) + read_register_fixed_32(ATOMIC_OP_REGISTER) } } } From afc50c4ecf58ee7488eeb0710d676fce1e78f381 Mon Sep 17 00:00:00 2001 From: austinabell Date: Thu, 25 Nov 2021 12:43:06 -0500 Subject: [PATCH 2/4] re-use these hash functions to avoid more duplication --- .../res/callback_results.wasm | Bin 104452 -> 104452 bytes .../res/cross_contract_high_level.wasm | Bin 244751 -> 244751 bytes .../res/cross_contract_low_level.wasm | Bin 267498 -> 267498 bytes examples/fungible-token/res/defi.wasm | Bin 118871 -> 118871 bytes .../fungible-token/res/fungible_token.wasm | Bin 201138 -> 201138 bytes .../res/lockable_fungible_token.wasm | Bin 134766 -> 134766 bytes .../mission-control/res/mission_control.wasm | Bin 128511 -> 128511 bytes .../res/approval_receiver.wasm | Bin 116416 -> 116416 bytes .../res/non_fungible_token.wasm | Bin 287137 -> 287137 bytes .../res/token_receiver.wasm | Bin 115687 -> 115687 bytes .../res/status_message_collections.wasm | Bin 86767 -> 86767 bytes .../status-message/res/status_message.wasm | Bin 115233 -> 115233 bytes examples/test-contract/res/test_contract.wasm | Bin 28014 -> 28014 bytes near-sdk/src/environment/env.rs | 9 +++++++ near-sdk/src/environment/hash.rs | 22 +++--------------- 15 files changed, 12 insertions(+), 19 deletions(-) diff --git a/examples/callback-results/res/callback_results.wasm b/examples/callback-results/res/callback_results.wasm index bde93744b1acffdf448fb7b2aef457ffac887c26..932c950780429568a77b5fee376313664b437c85 100755 GIT binary patch delta 35 pcmZqKz}B*XtziqJW};vaBLf2`0|Ubf4gm&LARWBjDv|M&833X$2rK{q delta 35 pcmZqKz}B*XtziqJW}=`cBLf2`0|Ubf4gm&LAnmo?Dv|M&833Un2pRwY diff --git a/examples/cross-contract-high-level/res/cross_contract_high_level.wasm b/examples/cross-contract-high-level/res/cross_contract_high_level.wasm index f9f1c2b5bf7af712a47fcfa2608e4e3ac32aae84..83d64350b004c4123c127cf5390b02e61e2517e4 100755 GIT binary patch delta 74 zcmeDG!PozTuVD+Lz)r^8>4G~MjTsBuU3W5WciqX9+W`^Mo_^1fnS-%#`*TO;tM-CH Zj0_B%3=9lA&I&T90_ouGXB(NFtN`h&7xMrB delta 74 zcmeDG!PozTuVD+Lz)r@L>4G~MjTtlAU3W5WciqX9+W`^Mo_^1fnS(K7`*TO;tM-DP Zj0_B%3=9lA&I&T90%@=9XB(NFtN`KW7rg)g diff --git a/examples/cross-contract-low-level/res/cross_contract_low_level.wasm b/examples/cross-contract-low-level/res/cross_contract_low_level.wasm index f8c9a904561e11f49c6f4148505118633418a17c..1e39b933626da683dce451a53ec01044a6214458 100755 GIT binary patch delta 77 zcmaF0QsC7}frc%N>`xhUr}O4AYjX;-2r#HJFfbIh+dO65Zu6AsLOVptn6YrXV=i-? ay_c{$^ZbRrWOJK delta 77 zcmaF0QsC7}frc%N>`xg}rt{`9YjX;-2r#HJFfe4a+dO65Zu6AsLOVptm@#9!V=i-? ay`U!}0|O^e$%@m0V5MH$H>_c{$^ZbKAQj92 diff --git a/examples/fungible-token/res/defi.wasm b/examples/fungible-token/res/defi.wasm index d97994c7367bd8910f417a98bb8c1afb2b3ec5d4..d9db8ba08757bb93193c61689ddc3a2324e5e7c6 100755 GIT binary patch delta 98 zcmcbRWMGhEU|^WQE5M)%q=SHbJ~X~A Q8lMx1AH2PF65}OX07tzNR{#J2 delta 98 zcmcbso`x32ElkYo8FQzztYso`x32ElkYo8B?aStY1 diff --git a/examples/mission-control/res/mission_control.wasm b/examples/mission-control/res/mission_control.wasm index 4933121c1d0c683a5655c27fbfb8cf4ac6248469..dbedd7f2791e504b48e96804b6233051232663ac 100755 GIT binary patch delta 19 bcmezWn*IN4_J%Etmv=MfZojgdQQHatZqNz9 delta 19 bcmezWn*IN4_J%Etmv=L!Y`?ObQQHatZjlMM diff --git a/examples/non-fungible-token/res/approval_receiver.wasm b/examples/non-fungible-token/res/approval_receiver.wasm index 248f130b2161c474abc582087a995ec5dd333f1a..805352ba4fc6427b2c6156e9369ad61831fbc23b 100755 GIT binary patch delta 98 zcmX@m%YLAjyFeqljTsBKKdNW^&gmGy$iN`Sz`$^UM}R>UNCyG=d}w@K QG(IO1KX|)T7vnM;0KC!@y#N3J delta 98 zcmX@m%YLAjyFeqljTtkxKdNW^>mR$iN`Sz`$^UM}R>UNP7bLd}w@K QG(IO1-)p;67vnM;0I(_(egFUf diff --git a/examples/non-fungible-token/res/non_fungible_token.wasm b/examples/non-fungible-token/res/non_fungible_token.wasm index 6e147cbf1d83136a27eaa8b0f4e10869b8c6cb11..5f9435972a0c0bc7fc00dff6ad4160919951df61 100755 GIT binary patch delta 102 zcmZ2@Sa9KC!G;#b7N#xCQJ)!er$>KgHfAi`-v61IUDh#xk%2*ufq`Lxh5&;qkPZU! U`Ox^fXnam2e(?6|0xYKj02_`J#Q*>R delta 102 zcmZ2@Sa9KC!G;#b7N#xCQJ)!8rbmBfHfGG&-v61IUDnZ^k%2*ufq`Lxh5&;qkoE-f U`Ox^fXnam2zSs8a0xYKj01oC9h5!Hn diff --git a/examples/non-fungible-token/res/token_receiver.wasm b/examples/non-fungible-token/res/token_receiver.wasm index 52514e8a1ff904a8cb19429197f3dd6e5c04e683..cd3312cabb083d48c280074d0296ec3156fcf0ed 100755 GIT binary patch delta 98 zcmaFf&i=feydMKlJu delta 16 XcmaENi}Bqp#tm}Oj47Mtqy2>dME(Y^ diff --git a/near-sdk/src/environment/env.rs b/near-sdk/src/environment/env.rs index 21a04aaf1..9e2fd62fc 100644 --- a/near-sdk/src/environment/env.rs +++ b/near-sdk/src/environment/env.rs @@ -248,6 +248,9 @@ pub fn keccak512(value: &[u8]) -> Vec { /// Hashes the bytes using the SHA-256 hash function. This returns a 32 byte hash. pub fn sha256_hash(value: &[u8]) -> [u8; 32] { + //* SAFETY: sha256 syscall will always generate 32 bytes inside of the atomic op register + //* so the read will have a sufficient buffer of 32, and can transmute from uninit + //* because all bytes are filled. This assumes a valid sha256 implementation. unsafe { sys::sha256(value.len() as _, value.as_ptr() as _, ATOMIC_OP_REGISTER); read_register_fixed_32(ATOMIC_OP_REGISTER) @@ -256,6 +259,9 @@ pub fn sha256_hash(value: &[u8]) -> [u8; 32] { /// Hashes the bytes using the Keccak-256 hash function. This returns a 32 byte hash. pub fn keccak256_hash(value: &[u8]) -> [u8; 32] { + //* SAFETY: keccak256 syscall will always generate 32 bytes inside of the atomic op register + //* so the read will have a sufficient buffer of 32, and can transmute from uninit + //* because all bytes are filled. This assumes a valid keccak256 implementation. unsafe { sys::keccak256(value.len() as _, value.as_ptr() as _, ATOMIC_OP_REGISTER); read_register_fixed_32(ATOMIC_OP_REGISTER) @@ -264,6 +270,9 @@ pub fn keccak256_hash(value: &[u8]) -> [u8; 32] { /// Hashes the bytes using the Keccak-512 hash function. This returns a 64 byte hash. pub fn keccak512_hash(value: &[u8]) -> [u8; 64] { + //* SAFETY: keccak512 syscall will always generate 32 bytes inside of the atomic op register + //* so the read will have a sufficient buffer of 32, and can transmute from uninit + //* because all bytes are filled. This assumes a valid keccak512 implementation. unsafe { sys::keccak512(value.len() as _, value.as_ptr() as _, ATOMIC_OP_REGISTER); read_register_fixed_64(ATOMIC_OP_REGISTER) diff --git a/near-sdk/src/environment/hash.rs b/near-sdk/src/environment/hash.rs index f67c888d4..640215b1f 100644 --- a/near-sdk/src/environment/hash.rs +++ b/near-sdk/src/environment/hash.rs @@ -1,6 +1,4 @@ -use crate::{env::read_register_fixed_32, sys}; - -const ATOMIC_OP_REGISTER: u64 = u64::MAX - 2; +use crate::env; mod private { /// Seal `CryptoHasher` implementations to limit usage to the builtin implementations @@ -28,14 +26,7 @@ impl CryptoHasher for Sha256 { type Digest = [u8; 32]; fn hash(ingest: &[u8]) -> Self::Digest { - //* SAFETY: sha256 syscall will always generate 32 bytes inside of the atomic op register - //* so the read will have a sufficient buffer of 32, and can transmute from uninit - //* because all bytes are filled. This assumes a valid sha256 implementation. - unsafe { - sys::sha256(ingest.len() as _, ingest.as_ptr() as _, ATOMIC_OP_REGISTER); - - read_register_fixed_32(ATOMIC_OP_REGISTER) - } + env::sha256_hash(ingest) } } @@ -48,13 +39,6 @@ impl CryptoHasher for Keccak256 { type Digest = [u8; 32]; fn hash(ingest: &[u8]) -> Self::Digest { - //* SAFETY: keccak256 syscall will always generate 32 bytes inside of the atomic op register - //* so the read will have a sufficient buffer of 32, and can transmute from uninit - //* because all bytes are filled. This assumes a valid keccak256 implementation. - unsafe { - sys::keccak256(ingest.len() as _, ingest.as_ptr() as _, ATOMIC_OP_REGISTER); - - read_register_fixed_32(ATOMIC_OP_REGISTER) - } + env::keccak256_hash(ingest) } } From 0d54c6eea9564281c0114b0a22b61bf3333a410e Mon Sep 17 00:00:00 2001 From: austinabell Date: Thu, 25 Nov 2021 12:45:09 -0500 Subject: [PATCH 3/4] fix typo --- near-sdk/src/environment/env.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/near-sdk/src/environment/env.rs b/near-sdk/src/environment/env.rs index 9e2fd62fc..e6e5b0026 100644 --- a/near-sdk/src/environment/env.rs +++ b/near-sdk/src/environment/env.rs @@ -270,8 +270,8 @@ pub fn keccak256_hash(value: &[u8]) -> [u8; 32] { /// Hashes the bytes using the Keccak-512 hash function. This returns a 64 byte hash. pub fn keccak512_hash(value: &[u8]) -> [u8; 64] { - //* SAFETY: keccak512 syscall will always generate 32 bytes inside of the atomic op register - //* so the read will have a sufficient buffer of 32, and can transmute from uninit + //* SAFETY: keccak512 syscall will always generate 64 bytes inside of the atomic op register + //* so the read will have a sufficient buffer of 64, and can transmute from uninit //* because all bytes are filled. This assumes a valid keccak512 implementation. unsafe { sys::keccak512(value.len() as _, value.as_ptr() as _, ATOMIC_OP_REGISTER); From fe1a2f5a6ce263286e392ccb0b6dd9d329600461 Mon Sep 17 00:00:00 2001 From: austinabell Date: Tue, 14 Dec 2021 10:25:22 -0500 Subject: [PATCH 4/4] Switch to array suffix, add changelog --- CHANGELOG.md | 4 +++- near-sdk/src/environment/env.rs | 18 +++++++++--------- near-sdk/src/environment/hash.rs | 4 ++-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcdcbe336..2ba5c8512 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,9 @@ - This is only a breaking change if inspecting the `VmAction`s of receipts in mocked environments. All other changes are positional argument names. - Add consts for near, yocto, and tgas. [PR 640](https://github.com/near/near-sdk-rs/pull/640). - `near_sdk::ONE_NEAR`, `near_sdk::ONE_YOCTO`, `near_sdk::Gas::ONE_TERA` -- Update SDK dependencies for `nearcore` crates used for mocking (`0.10`) and `borsh` (`0.9`) +- Update SDK dependencies for `nearcore` crates used for mocking (`0.10`) and `borsh` (`0.9`)9 +- Added `_array` suffix versions of `sha256`, `keccak256`, and `keccak512` hash functions in `env` [PR 646](https://github.com/near/near-sdk-rs/pull/646) + - These return a fixed length array instead of heap allocating with `Vec` ## `4.0.0-pre.4` [10-15-2021] - Unpin `syn` dependency in macros from `=1.0.57` to be more composable with other crates. [PR 605](https://github.com/near/near-sdk-rs/pull/605) diff --git a/near-sdk/src/environment/env.rs b/near-sdk/src/environment/env.rs index 619715e90..2f2675cd9 100644 --- a/near-sdk/src/environment/env.rs +++ b/near-sdk/src/environment/env.rs @@ -233,21 +233,21 @@ pub fn random_seed() -> Vec { /// Hashes the random sequence of bytes using sha256. pub fn sha256(value: &[u8]) -> Vec { - sha256_hash(value).to_vec() + sha256_array(value).to_vec() } /// Hashes the random sequence of bytes using keccak256. pub fn keccak256(value: &[u8]) -> Vec { - keccak256_hash(value).to_vec() + keccak256_array(value).to_vec() } /// Hashes the random sequence of bytes using keccak512. pub fn keccak512(value: &[u8]) -> Vec { - keccak512_hash(value).to_vec() + keccak512_array(value).to_vec() } /// Hashes the bytes using the SHA-256 hash function. This returns a 32 byte hash. -pub fn sha256_hash(value: &[u8]) -> [u8; 32] { +pub fn sha256_array(value: &[u8]) -> [u8; 32] { //* SAFETY: sha256 syscall will always generate 32 bytes inside of the atomic op register //* so the read will have a sufficient buffer of 32, and can transmute from uninit //* because all bytes are filled. This assumes a valid sha256 implementation. @@ -258,7 +258,7 @@ pub fn sha256_hash(value: &[u8]) -> [u8; 32] { } /// Hashes the bytes using the Keccak-256 hash function. This returns a 32 byte hash. -pub fn keccak256_hash(value: &[u8]) -> [u8; 32] { +pub fn keccak256_array(value: &[u8]) -> [u8; 32] { //* SAFETY: keccak256 syscall will always generate 32 bytes inside of the atomic op register //* so the read will have a sufficient buffer of 32, and can transmute from uninit //* because all bytes are filled. This assumes a valid keccak256 implementation. @@ -269,7 +269,7 @@ pub fn keccak256_hash(value: &[u8]) -> [u8; 32] { } /// Hashes the bytes using the Keccak-512 hash function. This returns a 64 byte hash. -pub fn keccak512_hash(value: &[u8]) -> [u8; 64] { +pub fn keccak512_array(value: &[u8]) -> [u8; 64] { //* SAFETY: keccak512 syscall will always generate 64 bytes inside of the atomic op register //* so the read will have a sufficient buffer of 64, and can transmute from uninit //* because all bytes are filled. This assumes a valid keccak512 implementation. @@ -769,17 +769,17 @@ mod tests { #[test] fn hash_smoke_tests() { assert_eq!( - &super::sha256_hash(b"some value"), + &super::sha256_array(b"some value"), base64::decode("qz0H8xacy9DtbEtF3iFRn5+TjHLSQSSZiquUnOg7tRs").unwrap().as_slice() ); assert_eq!( - &super::keccak256_hash(b"some value"), + &super::keccak256_array(b"some value"), base64::decode("+Sjftfxys7v7mlzLDumEOye0rB68Jab294PiPr1H7x8=").unwrap().as_slice() ); assert_eq!( - &super::keccak512_hash(b"some value"), + &super::keccak512_array(b"some value"), base64::decode( "PjjRQKhRIzdO5j7CCJc6o5uHNJ0XzKyUiiST4YsYtZEyIM0XS09RGql5dwCeFr5IX8\ lPXidDy5uwV501q0EFgw==" diff --git a/near-sdk/src/environment/hash.rs b/near-sdk/src/environment/hash.rs index 640215b1f..0b42367a7 100644 --- a/near-sdk/src/environment/hash.rs +++ b/near-sdk/src/environment/hash.rs @@ -26,7 +26,7 @@ impl CryptoHasher for Sha256 { type Digest = [u8; 32]; fn hash(ingest: &[u8]) -> Self::Digest { - env::sha256_hash(ingest) + env::sha256_array(ingest) } } @@ -39,6 +39,6 @@ impl CryptoHasher for Keccak256 { type Digest = [u8; 32]; fn hash(ingest: &[u8]) -> Self::Digest { - env::keccak256_hash(ingest) + env::keccak256_array(ingest) } }