From cd84a438ab59c1384dff1132536e982d4720bdf4 Mon Sep 17 00:00:00 2001 From: Michael Turner Date: Fri, 13 Oct 2023 12:49:12 +0200 Subject: [PATCH 001/339] Make all parameters downloadable + enable feature flags on all crates to ensure bytes aren't included within wasm builds --- circuit/network/Cargo.toml | 1 + ledger/store/Cargo.toml | 10 ++++++++++ parameters/src/testnet3/mod.rs | 12 ++++++++++++ .../resources/shifted-powers-of-beta-16.usrs | Bin 0 -> 3145736 bytes 4 files changed, 23 insertions(+) create mode 100644 parameters/src/testnet3/resources/shifted-powers-of-beta-16.usrs diff --git a/circuit/network/Cargo.toml b/circuit/network/Cargo.toml index 2d4179f463..895dbd2a50 100644 --- a/circuit/network/Cargo.toml +++ b/circuit/network/Cargo.toml @@ -30,3 +30,4 @@ path = "../../console/types" [features] default = [ "enable_console" ] enable_console = [ "console" ] +wasm = [ "console/wasm"] diff --git a/ledger/store/Cargo.toml b/ledger/store/Cargo.toml index d034f7df2d..3937947af5 100644 --- a/ledger/store/Cargo.toml +++ b/ledger/store/Cargo.toml @@ -27,6 +27,16 @@ serial = [ "synthesizer-program/serial", "synthesizer-snark/serial" ] +wasm = [ + "console/wasm", + "ledger-authority/wasm", + "ledger-block/wasm", + "ledger-coinbase/wasm", + "ledger-committee/wasm", + "ledger-narwhal-batch-certificate/wasm", + "synthesizer-program/wasm", + "synthesizer-snark/wasm" +] [dependencies.console] package = "snarkvm-console" diff --git a/parameters/src/testnet3/mod.rs b/parameters/src/testnet3/mod.rs index 4039577458..2d6025e265 100644 --- a/parameters/src/testnet3/mod.rs +++ b/parameters/src/testnet3/mod.rs @@ -21,8 +21,14 @@ pub use powers::*; const REMOTE_URL: &str = "https://s3-us-west-1.amazonaws.com/testnet3.parameters"; // Degrees +#[cfg(not(feature = "wasm"))] impl_local!(Degree15, "resources/", "powers-of-beta-15", "usrs"); +#[cfg(not(feature = "wasm"))] impl_local!(Degree16, "resources/", "powers-of-beta-16", "usrs"); +#[cfg(feature = "wasm")] +impl_remote!(Degree15, REMOTE_URL, "resources/", "powers-of-beta-15", "usrs"); +#[cfg(feature = "wasm")] +impl_remote!(Degree16, REMOTE_URL, "resources/", "powers-of-beta-16", "usrs"); impl_remote!(Degree17, REMOTE_URL, "resources/", "powers-of-beta-17", "usrs"); impl_remote!(Degree18, REMOTE_URL, "resources/", "powers-of-beta-18", "usrs"); impl_remote!(Degree19, REMOTE_URL, "resources/", "powers-of-beta-19", "usrs"); @@ -37,7 +43,13 @@ impl_remote!(Degree27, REMOTE_URL, "resources/", "powers-of-beta-27", "usrs"); impl_remote!(Degree28, REMOTE_URL, "resources/", "powers-of-beta-28", "usrs"); // Shifted Degrees +#[cfg(not(feature = "wasm"))] impl_local!(ShiftedDegree15, "resources/", "shifted-powers-of-beta-15", "usrs"); +#[cfg(not(feature = "wasm"))] +impl_local!(ShiftedDegree16, "resources/", "shifted-powers-of-beta-16", "usrs"); +#[cfg(feature = "wasm")] +impl_remote!(ShiftedDegree15, REMOTE_URL, "resources/", "shifted-powers-of-beta-15", "usrs"); +#[cfg(feature = "wasm")] impl_remote!(ShiftedDegree16, REMOTE_URL, "resources/", "shifted-powers-of-beta-16", "usrs"); impl_remote!(ShiftedDegree17, REMOTE_URL, "resources/", "shifted-powers-of-beta-17", "usrs"); impl_remote!(ShiftedDegree18, REMOTE_URL, "resources/", "shifted-powers-of-beta-18", "usrs"); diff --git a/parameters/src/testnet3/resources/shifted-powers-of-beta-16.usrs b/parameters/src/testnet3/resources/shifted-powers-of-beta-16.usrs new file mode 100644 index 0000000000000000000000000000000000000000..d92d3c8bc1c5165f0b8a316215678ccef248de64 GIT binary patch literal 3145736 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

fjy`OIe-p0@3^vG7fio%ouQ zfmbwe8P_jae{<+_ohZhQC`5=mIl%nG$PyA39!F-oc;&iO8LB zLXC%8@6Q7puBFKX?+~?_S6D+Nk@uBupOZ4Z*DzU4Rf&=A{R>hmCp&NeXWkYDJ=kUeJP4J$x#Dh`X!DLpb(xijr-T3*;G?<6i9tkW4<+OPr-<)RZqNW8Wu?Rdp`L}Guid(sbT%sR*rK-MjbQ?=}kwyjqv`iPh8*;6}xhg9HJaI3Qs_k5Uwan@cs(`1#o#oAww=|?y{yJJ4asC zruj~jglwCSDpfs1a{RR|Q%2z8>cBPzZV3D@al3>8Qt59FX#>*l#Q5u=;CHM@>OlzP z&mqh(YVS5A5W!Q0EuUIHqDJQHwANHgyY;33WgxGB7HN}}!Dy<>*SnlQ(p*fi)4tnO zUP(ftlR0{DI|6F5GvpzBxWp4*^$#Zik)Pb$gE0+-H*9y5!!=lWxkg-^XlnloNYpAd zAT9tseHwq~A~eif%U#ArmS++HEU4uwRr>OS=}4LO##C0nvLB;GE`lzpu_#`5Rn%ul z=>T_%hRAkyA|DG(J%2O+LWn{wIz>AO#4VM-K%+fYIlf7oW~-Ce#wF8p>YaPj*d~h| zDyhcxJV~xw<;^$&ue{9Konr()WJv`y=NQ(qMX7I9t602KUp@#KX3s_=ks+dQ7-taM zC+9XG8Gw2K8{*$P;;-)6U)$6yY@Sdw!-diGkhhssF1Ju>bwT9ctXFd3AeSS1j4Jwy z75pm!x9n$oMOc(dF{MB$ihSn+W7nuvhvyd5V`RUjpmL1b0qV5O!u<@Ez(%ytpfc0| zouF%2Y{TV*={|HS&78_*bm54f=p-EVX3uPvX<&g7`|dKmy^ljEls}lsugQ-27*bj_zTK>my$7 z-gmJ8i&`~s+U$!~gGqhXz3Wy6#umTW@bDW7`x?02XDkM*9>H(3pIpqQ=7UWPLG zHaj7|08Q_%C&$x3d$|s)V%DWbNWsB)G{={H`+ZLU7mdj+tl|K2DCPp_gIjS+E+UJ* zS8Gvg+u$l#(r;SSI zED7uVFfGO*c=@_|pmD5Zxxl$r^?%v`2`q4bvX)GCBWtrThD}Jz!kl0MlGzSZOHe-(8dl@v<4By82{1v{wZq$76zX(j?`ZHp zV`uFA{Jw(pykipB0I9|R_s2qmtoRi;Y00m!k-$ikR$6f??gAZ+`o)64Y(^E z)#TU9ne7C1T4QJcXcDVXD2`_lmcfV)>;M!$@CbuD(iKp5d7XX}BT2sQjSxy`?X!cL zHWZP0l3wBfe`r2wT@f+?I88K{3OEe{aP9!q4adK0as>pSkM3$^gvD%-HtdT2w2P|+ zS!rDX49^OuDs_3C0)b~p_~omaziiKSLj|lxA-ICi1q$JY69AD_#g2G&Xhr4c7v%#0 zFbn5~&?BiBWJ>5r7Q;Z`nZQS3KBqCam+Ma(0#Ps`QsTZ#AjN7bq7>E0C zH*)(54N~HNOjGb5Fykk10Oa;FL9FGuj)S=XXbbs&IM+c6cMdq(4we2eeBC&_@I}2q zn<>J2-Eh_lHkDVptJv!Ranh*YF++?^23HAo&u0ae zC8rQ;oy(4Z?v9Xk+blK!!Oc>5Z`Gb?Q*f()x9)UkJ!Cu+h9dsB5n7fE27^~M>RdvCX@AA zY0;4Z->rr?-s3){%R;hI3+Lf$=1q_k8@Z7#v^R@tzO@T4R1?DlFFJWVp_FnFJa;Am z#{LYb3j@EoZPm8Fmm9I?c@TmzA#?kwuTdZY6OM-AQ6xZbCy^2cC!9}MwE$`XN+>Qn zQpdxY{~a*zDGSUMjsVYI9hJ5+)JqJ>EiIvM}m zPGtDkR?`CE+0X^whWc%&k5^OWe)aX#Rj6cSm8FRqMP?1RxkMrWY+A?jrS-FI{^;`; zp_(%A-pcI5L02ge*0gtbuH$w6CYpRz(iaK}a%W9;$|`nnLG*{RSr z5;o<-{UOU>a0UL|@;|lD&&4LC^OgH-FqsYktAiC>!K(_odN@(ZTBE$|Q4!UsD|itv zVjvMw$jI*ju%)c;;_;-}{)ol`hIL^8xj~=4qwK9m8vl}A;EaC+_C|Weo{SMq$8X=a zj5-2=UH8^PumN zaL1AbhwwiEEXy*t>El5)AS^{7XqXPW5@|>s0}fukz|OLWLBu9B@_G!>A|Ach6+cn@ zE=ddkIO7*JSVt5E-|m3K?l8WS%|7?E2=n(9W_s(tanr_;DZ{ylx05h?Y*g_LW7d3HT)>;LYg93LhcmViP@3d^j(bRO8OL{7Nne5u`MSHXXNex{Ij*I z%Y_d*2XEl`PX*3|4jw>__{0>u7Nc3|ED-)t!j27Vun%?)AB*(v@y|j5%i41;e~-dD zmypHgi)qbVY-P+NQ$sf#R}0+A-C$v7*LjuY0GU0I_d)wDp@|OxJ^tnU<(0=J^^NwBtZC zv8bLXGnCNUv#34;)5^v?DKjpI*}2*B1f-?M}P^{JzQ8iTrw1Ij!inK^bN|20UF!X}1%~?+=M4 zH-0LrPeBfL!#$gp1M%JgCaDJi&8bj4zGz(zU#Z5=6zvoaDHsFogm8$!P}eA@4Yeg7 zk(iJ?+i-|LEnNSEM^{4ueq*~}w8oISpcmuDB2Pnw1Y%N8G%bVuv&l^hl|eQx4g5N{h59>EZK(1R%B)XeWp7|x!KuvIl6cym|p1i)(t}dXw$A) z_nBlk((6ulE9Yx}=XBOI&Saw|po%5ST9r*ov2#!3kR%%(^DD`*H@^k|vO|~((~pak zm)8Yk{oQ@&_LrQYb_nSj>Mpgu+pR&vUUSkk3tEg9e7&uhOli^p5zY)#6m>Im1N)MEUXTaA!HL4u;xXs5A&JhEgSTur2a`nhamN~0K%tHWO;7DP>cK(H+Jiw zAw>iIDRDJ>Ts%^~y9C=@%GVJnCF#bfXMAO=*Y(GA0Pm1ElZnccs9U*&jSzD3$qQ1n z-{AFekcBK)+5C$7S^1s!3nTaZ9~}kW4t7gO0ScAIfUoxiJ*{k>M#v-eh)f5{Jb

  • ^91VmTH#ap~HSaK0Jk6dMEDJXI@wdd`{ z-B@S-Q)Mf}<8pu8AC70Jp32+hx*J(*i7}d`Kz|6^UIfgR(kS75z#A<0|Gg zZLy(QxM|{pxj5fMK($qZ0px%y`!4L_iG7KpV|P6IPh#L(5-Pp*3kGlI^{z8juZm!$ zK-F%nX!?nwN=42G0BqmAd)$@6wUVax+-N^!51DwLxY$)fxO#zWha94{$Y7FktF~30 zCT;+Zmbzh90Bk>u^qSE@B{z=?i%<@ZlcE|qv~^rKQy3>Ec*n;$HbVz&vdLd^jf+K2 zZwrSH0sB$l`@IV z0Zmr*_E6{}y?Cm3Qqe;ZjT8{vybqHbXR(*t`5V8j%hjtTONhRptS>~-dah0G0R9(C zb+yq{o zn1{zoFudJ9un`(Vt2(y+ZfUcD{Tn6{a2Uw;+TB2U+6C4W04z+5rr%-0u&+y6N|c#q zWit!kjFB5@%3%6NC;gj2W=)0QW~pFw{NYtYfv ziJdv!Qua2bQa0Z0>BCn60Ii$k`f+XrsS$?6@Z2`>O_S<};EYjg6dIraJGf9iRT|k9 zdbI@HvD^WLtApTJ0D2_QQbv&f-)@3&c>|1P^SK$Pz`vv%Je<=_yWXmKKtH2rwtZ5mB88Nd#HCyR*0SkFBK;wD6 zPj)3>J%Yz!0X&rDOlWcVBuel-IU7r`00`$vt7%D2y2hDLD&emu0ceLB>=HXa5D(D- zxbgo30cih)QX`J%A&`tMeHR=eTh@b7BSUP68F}$`my%XH0cEzy)Mp~By7LWN!eozx zvV`U+h=IHlZ*DiZ#obIYV>6gSvp2%u#1SbH?U^~50NY05L-@SJvnDR(U96yPT+M}t z)2)YxM!*wo)9&1letP%qt*nR`<0-OIigtxY07ytyQQ?nqSV?$vz69NOmzaE0-?xto z0#>c9yeq}%9HA`j4g}<#1n-)Q^f5e200w`!U}xI&Ase>I$gF>VL{ylgr;x(s%<%f` z$dN@dZ*^5E$9X;C6O8ZOHtPZ&02gnZ=TnGE7I_?UpLLVdl8UV+U>x#&l?CP;P`=1f ziB=X}dNiA&O#x2{?$Lpt0J}XYK$+zjUe|AgiPXtAU;qvV@&v9Rd9k@ zc>qX@P5^&y0jTOL8B?zn27A|PZ`&9gbS{(V)q=2GT1RD->#$7Ks}Fco_-2t24-0NO zW9QeK08qQn(b7faK)a!Pr`rbNP;2iJYfMS z0h1&2LrR<-rJeRt^K#5cOlf0k#iQxE`hpsD?SGHHd{CMmDNTHrwwzF#nU{Ac07H6I z5P@>RHayF#fxfSq06>SW4D0s_kQCBZUp?fXt`)k~L+W!Dc=2}ISI%tT0MF^cd<{=Q zrT~X(AiX0$S*hfxNnxgoMFp$s2xEBt>cLFB*BdH9XUj? ziAA=}m=HQcBdD&*_K&nL!MJUMbvLLIKXKy3T+qPxzgsI%0Ds;j%FpXkC}iqwjY$vL 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%0Df=ur{)2_9NrKBHd=I^Hp1$1vLA88t`LmCLJo zL8OY|s`O8BQ!||a?n-k||0XJwlaJHFIuIe3h%J;;RVIQG*WhF(`k?4OT?dU#zw>nH%^0mW>oj8mTo;1`l{0B z&%68p%iDU@aUp@qe!Jx*f|7}YdG?zOfS8vPA?Qma(n1P!s_xQEmRw1AvBN{kj+y3r-GW!@m%oi(_|Yf~1da5+S!?4ygoOZG zj`tK|7UVc{O@eBYAKcoZDDL`h@Kb!WN`vnl>Edyjvn=QY(;29An&%WhF99B)G(J0Z^B&@*aNdH4VeKcMp2ip_w$8e9e*$ouH z^dsP6(a-@`_hS_O*_x_Gso)%I02&)=ee}j<7Si4T>>Ig2h!*~$A3s6WiilZipjz!Y zG_>*4TqBw8!973R4DTh_#oc^WU2cWyIF>vC8YtoA{^Z`i)4R+g9$}+ff?ZA$JkE%A zJ}~d-i$To&oA^@TX82z-0!k1|=u0gCEXy@KuFG#QqciAlic6U%6pSCHyAZslXRhw# z@gM2(bbHLemY)(!#ie-@#`0hRqki(`(Ca^snQSY{HZCENkgxmd#LqKrfMM?MoR*7rM8R?Ima4<}R@<&5f-P4+eZT_i6TwUT2=irKmWU%wM z9$GB9cdR0jjOpJ1%I`rycdEJ6DOEb>IB2VdB>%bc_r^oD3(AOOGqnr5oPZuH7aKhe zQoa6s)=>HYRriMbd48{~n?yBeP9}H+n4!&t`I-x#LsC}Ms;e!a`xc|}Lk+4tdm%rn z*&YZ0BQG}X*p>2gOw{O(=jHZE^0%b3yJ*mqETrs@QUF)G6!7& z3=~*+6419Z?aX=R#ahitsF*Sw(k7LP-CWm6K4t+>2*<)2%e;gKD0ZD;hKmjXGa7o@ zY-620A+NH&iJ35(AB2fBv~w~i)U`ut&Cu{$SX<0-n*b8rz0e3lsSWKQ1VeDtU_$+b>|J-hNAvJFC+$ zJ{BalR~prVpwRR3wphX{w8>H|YC)!V+tT|pI1ySwbOBEQ^se#M0`V-HFb>n-sRlfQSV;>b^n9584b)F<$;M`i9_v&_#Yas zMf9N(L{tPHf19@#X?}-*aKPf>f{dYpOxc$KmCwp$x=S7j^&hDbjKPQc#%npi1dDX4 z6=8TAbxg3EuE`I%36TdtK~SwSu`Ip-Mkr_DyjcLDg)JiY!jK>RIL|l@SlUN5QASx) zqDDkzsHL9ZHSuX(j~?2@iz{s&u-q#RS(QAYMteKw zw>lAzQ7hVVoWO4Z>YjW!&)@=l&^gV4q9zML`D<;V%p(Iyhxnc#x8Nc?COOZ^?#|AU7LbBqqYuW zP@16tm}H?)j}QRhUkLTerBxRiGg=2WZfL{SXR^XSyI-Ptl%O64Td^Mi zZ8$mPn(hu`4Ta34FZ@jco8%Zukbn=Fz(dfS3{&#rNVfXQSG=?)^w1A*If+C7IHgZ& zi;-}Bq6}$*!kZjRbyvRmGntAXS$)tU(1QIk_hQJB{f(KLE!=B;~ z>7bI%e#+MYlcGnY6$WNb{u7t&KgY`Gq^lkJmk&npv65*S51R3&4e^15t|Vc`oyqaX1nfR=jM&soqIL_Jq{xPUkN zF-+14-V<)ukqQZ4vvqT}lOe{lX_2lHCaE`97VOgita9JZpq3{z(k+t8CY{X?fOw8l z$x)>JNyG-{BmeQ6kv}hww91J2T%L)L)Ig>IN&70JReH8w?n!G!`2^G2NdgVJvaw*k zmbGi?N?~RkXb3G7IPc>W1=&rBqO}PC2c9r&@6y0keN{V1JU<%a`dXgv|kuv%CE9}DSMykj7!ZM~B)9)BElvRg-pLgy+sEp85vz(58{ zbNSc**2cpfrn)80O?BfL%f9bA55D?nnh$<)!i!4f2?jmajG`ut--7c$YOy z!6mCuAtIdsU7!N2gEh<5dhF})4I@b&--lbi;5lEc_$`6{E`7+lGs23Ea9vP2NfCJ6 zSWI>SF$IS#m=%d2ME?xXA3RV&+Zv5zaRqP#j_RYgPyB5*lST3kpU^koYHcR0wh z-SghqEUEFQQ3Yqsuxgh9(*RqSGI!|5hM*t+Y4qdt%TBfd%hRq-}oG z)!c3GXM{Yo#&%#K9g`4k80-RGvt)kAhdtAL@Ot59`uRu!S)zV0xH7}EqytVGa6HFB zC|~E%Q^NAtSgBFk6582UUi$LUQp)gTw^v+Zv;0T^!>})dd6GaWU0gsyr<>ghsh{_j zNV$R|7RR~;_1^jr?)K6xOLtxTtjy}mmmLY8^x%LAsm$@LflOQgw+R{XNq?X zKc*Zmx&dCMr*;;{htY_`GcU;lk@#@|*=1dkE6!Ye`rv-0<7$r-DSdj5CKIn{oneU- zd?dNzXD_LR1_`40%E)K^${>UQg|_8B`bd6FraCO5ZTp%Rt9|U}wS#c0z|@7~GWQ|y zKD!7n*)}-0Ev1Aw_!@Ko)YNLuT2F{35EJNB6NEMe8!4u-&osE7D-uPVA|tELh`7vp zXtY>>X+EQYHRbGS2T2XD(yRy(Ah#5=sr3 zlPyf)w*C_Qxo({Tx=SNUFUBUlShiK=Qa(~(DLc3p4F_wgR&R_y)PTX zOh(L}qJdo{Q!bPL0tnrKTyr8(@pIqH4&4k zuZU2TxlQRA#l5NdR3qW!jZ11G1Gq2~Z?dZ=fI$C&KLjzxbY?bSINphFVRl zeCaeaXyv%unLp>zU~YFUZ=D<0r&ojlNt)JBcy$OK_gTsk$%ZIsjH5bL0Vx3kSJHqV*#@VI zg)s&sfF3b^53&daj4JQ|tkY=;q^*9FCE^rxlwD`NG0dJ88!R<#iB}xF4p*?UhN^6j zSKVt1o&k5%kX>W|ok;wCqkFwy2!hxBxKt=c&X!;Bn!9rKHsrgF%G(o7Ns6}`o6a$% z*U6%GM8^;S(y;Dz<;n-DpAeR=uzr~23p?L7gwHN+MHliB_}C92cBunx*fu?BpQw^h z_pAc|6NKUhXUd^abBzPJfF`xK*?#odq?t!1@qp{dI7E_wNH%F5^=q~8j~#f+!sY}4 zOE?RYuZ)NO2y-;bL#{DozJ4pfSCD&cxn-5&V-Mj{_}Kl_Gh%&v4gIvFkE%lf^+n#J z=1h)4`U5lZgiL025E^XQbRy$RK7r+f{S3sF>a19%2MfniOx>Gk=j~ho_7aVqx?kb7 zbYI7P1>kr#6W_X^O64hiwKuuF+{G^(i#Eg`oo#y%4RFV{QCUm?yy*~}8Q`!l^*F$p zM5M1!cp4txASIQO)V=LJEB^{KGhq2dmaKKND8;nS;U-vi_btnT10LM?*K3Nd^{TiX)$7P~C zXCQa~Mk+IRf!-l@kK$forv&OYLH2|I#*+P$e<(b2kbi6rvBodEG8zend(Ume@HCAO zdDdos6BJe1=jW%UT&r_zug`1&Q_jxiH`@Q0$)0-Mvs zk5Ykvm+wJT^0J8Yjg+7PiEOFO8RLEkA9LkF{RA!KDoKJC=R6^g{hyWWB=9o-Y77XU zE%HKc*8pX=K}mxE!-*a}ssln@uF$=L6__8Cm| z#AG%AAh4U#;?iRf(v`(_r#;GJ7e`|B#aW5y}jj7aK1DhAKB+ zk0VkJ@9Z7ob*maxqLS9WC^8ZuX_t7fE#AI zMW(O_yE(U;-nH4TJaks_>qL(UgggG_Qpry*a)9ggq@!5@IFFhaMl$2=jQ`pCpRV6$rh<5N9R`R?J7-Xt???4Bgs$2wjDmf7DOk#YrXZryqkA>O5J zQ<%R!V7keSLIE%V;%r<+$Gx4&t@{C7`fU>-Z#K_RHO=E)W9oFt0?p%-c04xsKdJUd zh{P-qPk3bkt1q!%GmqRpAhrtxz9UJbmZ%!}>_q}LFZ_XN4Q16~ij`yZ`eA(ib}kB_ z2Dm2xxm`r0Z!9eIogHRi&d)mYfA;)ZuRp?FWY?M?%x;iN@^#OxWop!xctatxrrBKp zzmv=`ZbgVzy}Z?zo(51&AD2=j2df*a;<^(h?p!+rnP|2ZjVq_hP&nAFUG;PU`{=10GV@4G1hq#y0RR`^KO=t1QN z16rXNWJOfsA(}X(l9CZ9)_-xz51Pas8G0u`^JxAMNtXHmKLOlP&+%E=wsE3j#}X`w zdk5}AOJiMe*=0TVo{k8vU1h`!f0!rPBe>&D1sNm(1T?#qRGS*|29l$K9XC*Ux_eJ2 zA}tWkGyh9Sz{sSzm_QaOrksjK?g(TMiW@@!(r70Az(C0DbfIaJwar763TSJ1f4T=a z*Vs&XbQAo5HpGg{Mzk4ukDfAuz4|o)<;oYKhpxgSAb`cp3lu}H0zcA1N5)=wm;gad zJu|N#2(l3w_!^}CE@3EM(6A{18H2PAWYHrU?4p#G$@e`~CHp$6zpbEo@l8uH&LnksDE`t{- z{6?ySABLaP_4aj%&UVWLh>&uSaR{gdVd`n2=F@Yg(54S;PVo5eiY2(}Hn z$b?W@!5L_>?c^|UL+);JuD@fh>|#+-Wr zBN~01X&m}gzE>s9x@Xhdi|5nv9l>M6?iiycHVBDU{rd5nskpBnQ7%(H98KyvU|->6dR{ca>L@r^p}`)%V9T!ytAp&rh(ST7*G$Su&g zIFG}pCH3`+RyB#3q^F`fH7j+y6zx{?nYg|H8IiQeY~^1fbzV?}+M`TqI`o}zZ}$4< z0>&ZKIsnC(P&2Rr9J_$`UD zr%)%7E~zZyACz`H0fJ`)t61r7aU*5OqjOr(nAr_^Myg`LPt+m|arJ@&Avv3uvC$2v zr<|YRwWgDr0AWsXlE^VXB;Kj0u&yI4j>a1K*^y8|0>O(RshR?0^_equ7X2V77I861 z*-BPB0A;>U{AzyOQ)E;}%qO}IoV7EZ}!TMr$7nC|z0#^~M4Mh+bXT_cZ&G0q+e&9@7Q| zr9Cgy%gz%Yj?K*$`)*djD0}E+?>M#JbZJQYc4-Nb9Vard#YrfY0YH{RAgKXvyt>|Q zn&yF{@ES8S`BRrP{?asJ9THN;HT7%E;Iba%N$u$hbjrPI0PgVMiRAj#$@z=axq-Pr z(ve`>oD?SQfs1-Mz?6)vm3Za~Jz!S_H9S+1d0)*70DE9gAcW14ECQq-bpE$anYET< zxQi-;71+DKwqKGhL%m@~DFeu}u^Ke{HJq&{0LZwak`a(-;b5t3n_WWe+2q&f@oVwd z{2~6AKhfU&`}7+c+}%FJY77wz505XBcy}dd^$_CGvFBR2vxm?5A_- zeIDfn>*yk3!me}0ABsA^eATXD0Y9WY6#y#;$z@zsf0hC3_EdQ$Zr6xAxhFkNsjm|ONT z%(qfZI;onCb|}G zRk~*B036@34$sm&Zq=iyADR5r1Gr69B`>CU*&_EZ7u?ITiKI=GHCNf)i#Q#-aS``hcYPHN1M-Nmv8wp01ef)opqEk0rbZj zCD0qONq=3&Xf}P_-p@f7p`}%VB0YD8>u{3k{IX$u+0|XRhx1!CeBY630JbujlGXmi z+!nl&v>U6XP%AyZ+ndHtf^zKT!hJ%K6XBxRZfH@gXe*>lyB-#a07~7i6n`vLb1HjV zaeaBelg+Bzjf|W5v=^+d7im|uNZ8R0@J;+_CJ2q7_EAt1>@An z_aeV!DHa_fel0(jUEGw6zaM^nt`n0)u=v9h0TdJOU*;-FnqyA-Gfc+lgrw8?&va~3 zUEwId526Xlt_#;o0h6U%$TB@Ab$q-)00+3B!EFE2UqR09sZaRC1@|NhsB~4N*mojp zF#cJMjG@XotOwYj(dHrKeMhtd%Y`s^-lIHVKyc5z^Yd{@IhT zN4GZ-d*CV|B_<5oVmyFM0g#-FxOd^lQ>|m7UFXUh>Kv|w^nct5u&1BNgQYTYk~wnp zP>n16e02DRdr(dc0Q0`Em=uOqqdagF{Rm#xkv_6ikLeFkFiNwQf5G#U{M4VsQR3F& zO-4EsEB5=x03k!t69rHn+J1`xTs`iQa#!G2qo&`dM00t@N~_IA79F|F9HHdFEvAUS7u~)9sUoRY?Kt)f_u`Hj{`Rym0~BjJD}r` z0j4pbVP;-(xl!{;ReqzE)zHFAOOD_r0$C*SJAd$1AATP7Y1N(&tQ7^c*ZM!q02~&^ zL}02;I8BpEQzho^ zRF(}r9Mkuw``$Z<{mHD|J)hf-MWEEAno_M+^L6FL49Mjs?Mki#0qk?=98|fL>j<=} zEZbNlp1*L0Yq->G9I>A5__@<-g={u_K_z1d#|{M<&F+~h0Tt0BTJJG0z=|=afC&tG z@g2Mp8oUArI(e}#IA-FSTP!%01Hr6QIZ71JJfXh9)ri0+R z{E5GcL3dJxj=im0enkGdAn~GL?@Sb8*kL|443Qut&rYAkxgTz zU!mHmf8G>18DAabG6Z?3vPT}a_8DPYG z0ZR|$c9$oEif)Szh%WbF5K-=*d*8;{ki;azZ2S~k>8AI9wg*OV>R-K-fqN!60PES# z3N3=AcP3EZDtP!)|AG;WZ;;n)SckHfE)kn!)qgs%ood+rnditU zj-2-Fb_#G|+Z)vaen->69WSzD;VZtG- zwRV2VBkFTggMt?LpJn(4bQ~(@ zM2_;=uKfM4#=m{yn$#XL020+dNij!UA&dS9z_On@rOq78C-~x)I=4bnN}&;*8C9lf zuAX>F(SM=>e$s4)0V+3c*FBR96CnHkOCm$2cocvbvf1SE+<)IVJv1cb8Zvac-$w%k zE3S^#!V2)e04Dr=S8(#x1}ousQi=$Ap*0!MA`ubp)`oQ|&DbJLg-_R%HwJpOE<|K#_(hZ98JG(%%wFRBViFImRA!-Q)rQ>s{ZMbo988zQ}y^;Yn>)0dfxy zDM$nAho0n%`ykrCM4;Gx?_<3ylJvdaec3@|pZxs24M&Qr?>bvcf6~2F0r5g?)eks` z!8Ya8`hW^s96NQtZvzNI{nX5mz&h|{t2d=m`|shF9c7PiKquz+06{H!fn~~!AvjG2 zhhM$SIbsqvqBD5#bqFT6y3U>lxU{DFLVRdJ_rt~Krc0?$0B#C3l9-hJ03=jKQ7yo% zZIqVxDz;a-o2&n$W|9MGIxG=A-^FYcSz@q2aDsFf9J^a6|muHttE0q2E)0f*o?c;o3M5n!earC1ko0~2UJB*g(n z7NCT#J@!ds5d1Al$C7;zP=eI9xS8; z%D}s7C1)7PbF{aW;6+ys0iWlczwR^`dSZ&n0S8kA%pyDu1wutKl=Mz4Jfe)cBJ1=9 z61i|P=(Ult5O8?70QDsS5&h{IO?e0NfiE#d9DxL`q{Ht&!C5?awGkSn1{&i%U9l5!g?~HpmtW~j3#N`41irs5}XlF04;|d zR9g%J0@H20n>a@*>_D?c< z4$D%TE_Qxl3gcfq;&V>|hQ2~-BboO)0Ri#`_PaCphi02ZP-t+YKCQ^t0R7L#`$f1x!vdCdGy`zl9VyxMvF>f;dOHP9@esJs z!wR384y^9qm#c5;@e)*p0OwrD^wR7um7;pKT5tZ;OM0qPC;1>X7^;bza1LXYtt^Yz zrG{2=weXG4M3%vt0pTQZp**V13Z*uknX5;f62BXX)6k-O*ooDmt6D>6Yixf=9~%p? z6bYVZ1vDXU0UsppM#_O=*sHO}n?lpz&md+MgZr@#qcrUqHM;^QlasDmiJ^+V;PKQz z?ZO(N0bA`K(t7+hs<0P(rqDi`={nfuM8r6LHnfI#7$&VaE5k&|Ro70OB7g z({6GQr9N9dcrkH^gQNkV9f*}O{c4dz+X|N72ooLvHwl^m4)C9SF!Kd10DYho6&fqQ z^dq!bwHEykT5{J)%LnNT{|PJXiiy-%hNyz$m>K|;VN!3oEqT@A04J<6F~5NyhNyz} z`nw8RvFVR`bg5js_BsLs4bMZx4eo8Z`tTG7iwiV_&UgbI0km2;a_K|1lZ24xNKg@q zj-N94BEu{$?M*pS2Qw-0P`D@9H-X7?YN(toK4D}G0Ar&BWszfe1jid?mjlsJS0qo=6gZM0HGWI6Z4%`>6z;5c_ko0H6F+le8M~I*e>Ss z^E9Dr)&+>)37AJ_{ z65S#Tg+4#?k`b7Y0oT8WgGiMef#>SY6w$jFTG7+ z0e74;Qp?i8TS~}*KTlOt+zDc}EcQ|%ikxI00Kw2i?4-_M%#W?pW?3%p-_&rW0e@Yi z*Ft?HuPST8H9jF!+8^x&L2Ww*KTY+1g1Q!*gRXg=JPz^%V4&R{%Q4MH0e%bxc1yg1 zI<>35Tm);~QA3NPY4y)qM2+9m9mX6%)perzk$a76;T(i#zkTL>0biToJ~`|@-HvCB z<_8l4i^6rfcmnP2Mj`3R*34ERoTM5}oq!)Hz9aHB0MG{w0KigSIMpY1h1B()MHT;J zzcv`PJE$QC5wh4S$StCOB{C-Z79AV)xRyw3h{Bf-06mpZ(Gz0U4NWKF$-9*!{Wuzxk_(M1uA)CXXK2 zy35~J;B*DVL>>o3HJVgd4ITw>FXiYvw=H{w!5&n zS0MCbAc+F;lkw%af!9~&0N7ranK`GKw;dS%POCQ2MQ0{d{M%!ua8Tr+coP_D*mwuI z@^>>Q+F+)mB&%Hs0i0C7(e|6K{x5>0T2b8R;*n~v3|XL9a{~JnL2*S%ZFStUN#3$+ zs~KBJDg+io04w1}$5@24HFx!p9YCZ*fC=JH_mma-XgXN2Z-_#H=dYp3(_xus9qrGs ze<;gL0kZC}#=VVu7TEi690rwo%sE{gt(Lm8wAU;`CNgt_NX$eE`%yUJFC(X--&brj z0fxfYuu73=$nPUK?7@vjNW=4l@>r}PS?yZTIAja)ahLqOQ59Y{l0AsJ6 zm7f5Vc(f)kGN?eS*mrc~Ty`NGYzWAI?HspvNqAk?!`=2kFl2D3qIi5I0F|cEX|@B# zj2k3WiGx5NLU?ZygJW)P#ye5t(XJIwS&%L!AIE=nv`PbywpQ(<09B`JufcfsNCALMUe`5}S(iSxIPmIN+_O*VL;hbB7JB8n0C|-~3#Ni=lz$hJ z6+|e)B;>!Bk-Zc=!7-Y)?+#|l#XVNZhi$Jd0c#n|psBnporay9$q;BG=-~R#3rqPg zbL>3EGIBkM`p>ov3;%p6ER_w{=2OB9lfLf|%yemHvz!oQpfg-d2>gpfkoi z%uXC;vuX*yrE_610gp4{w9)C)YB}CI9Esk4+nXm}zCK3SKZxD~`~TG6y4%k@X18bV z_Q5xrK?gVt0O!u1O#M5&ILO=vI}ZFeQ_j`ZrG9*5MGUcVA^)@qRr$^kJu_C@blfv? z@GEs_0C{}O%O2&2S?ou%TeSn!eBR+h_IU#Us>Ge#d2jLp&br`R z0rrQ(ZY0T(wUy;3_l^<|M3e!5lg-`_G}4@_}rmLjBGC(Vjvdd7hV}f)?HFCL40PaP6;nVA`?KBo5_omVlf@6q4eUcXGV63(3 zv=~*OrPy3H4*D^$flQ6K(U5V00K}yCl*UJd%ML-me(FGT^y<11Kp#H%@D08{Q98`o zpL**i>JXDh0<-xxtM%BJ0AE_SJ$mn)w8jA%>lW+`T%J|qkE&?o#p$xZQRn0B<&L|( zrgTTsJi%sUfbwsm0nic5^1WkuH`9uq=5ofk=awO|h!&PRCFJp9!fwkgMe|<~ z0eWsKDx_I2#G5%ga+K5KChSYE7SnrEkd0m4Q@I9krLV>Jh8&rLHMUvaWmC^}I-Y7p02RK$@U2le z{|jezhXx3+GhORUds;BH_jwbYav)`Mi2)7Vr!R=Tj5rNN9;mHO00zpnS92gpg?)YtgNH3j;_GbQ#fcqm2to#l|00??*Dbe={QyT+LK2yB#5Fuw0 zZ_gqP1hbD;8=D9zQGz5Z3-j>M2!1c@_)X`(05y}?^mZdo+(l=Zy5`7&uFlu9tyeb5 z4bZs_JhgWzfifDzKUZTEU#MD#N&qXL0pTg87E5d5v-{|}Icg}kl?4eby#PBVddG7T zyhJ~P9DHJ~kW>|P=;vrJ_(jPJ055lfWkN{3`v|IWyy3X+03HS!=_^yogIE0c)phtU zXpA4n-o>bLP--590rsXWQ4|m{LI>)+M5sY7+%qsMDYng(i0%HZsz&QUSYHcA&%Hq(d+jT%Pu!G{k$gudK0ep;9l?(NB@4#TLn(Z{uK@!K_bl0FWXa z@A?Z=(m?v#8u`!y54tTR=S|QFwK|l>!{tQmpYe8VWe&r54*I{j7L$G)|HPYs_I|(sF)gkWX^B4Kl0Kw4Kfr0E%=4*T(wO7CI&( zBKNTf;U?_QCZe{?e+zwRNOuA3rUMieviA5xv`D0;;FEQ0GtwF0O%Pbf|NBs)rYf6soFe6krtKDSvi#k|Cqbv zKqi~>?vVXY`;$vc@ zoBn92+SfjZRNN=OgJRT70TemDZ2P#TPdg|uNQS5yN8Kxe4}DD?7DB!ovBD`|Y~Z-# zQ~3Y@0{^D7O(Y^s0hmG<=@%)BSbs&upF$cSb8C$QV;#C07Nf?MoebnszW`gy=gI<9 zF9M;k<(b<^0Y^^n(`EuJqTS5=Y`mlO%Fb--9v5MgmkeB7Bp=wcG}~j_7gha~I@Ti> z7)Q+^02w^kc^F2APGWWjjkbTM7GILa=E;?7BLoEirn#AoRND^*`sf}qpdqL)ZO(P` z00~?T_K+%=RnJNb{inSNzXs^aLJc9GvA!K5Qj_HTT+jYzBIj2q#5NLyCHc4}0TyjE z;^^oIMY;t(r98d_Bi;QFP|3BESSg_xzOEMU?dXQgjYrBq+PxBS@-~7B0a5RfGF~ea zjMRX(7Mp20q??0MOwk;Cau`+uGpT z+G+1035xXar|3~j6H=caYWQ8QA}No2E=`YN<%a9Tu{nBA0m*4;gj662Yszh>=0w0_ zPlQ)Q-IiVs-tVNx5`aAvsuS(fQw($nyAA`Toa0H-07sKY9J7C}D|M;yT`I1Y;qz<= zm^a%5X4iU}_LXa9Fq!#KEB)>2wA_W$&!+Ws0B!vg!vxJ3`auW9L6u}Ch{7o(@WWEd zT~GU>o_yiLYtKK__7zCHszl6qif2JM-iM9J%k0exRfL;zrQ47S6=fyF{${TMpJj&q0>zaUC8!wezr z+apXslIIghGN|_dBV=Hq0O8%v&)n-2wt#R05hol5>bYBo7BR{1+`LQ7xkYtFpdijsyb;*9b-uK|vs?;)5 z2q%+#0FZG1wo@_Qh0Dyjcc)DKc&H~V&b&hj-T5#2qr=+yY*u#(qV<5sFEV(lq1K1T z08Qow<1>vHR;x#6`c#M4Oyz+CJ{00Q!+D@jmXZ_3@n993+%#eR98=z&a+wQ)Ghu{QC;eKTRPLUMC%d;`DsE0PJ)a*g{Vj0mVla^a=Pu z!ieZSz+;*mWPRVt2WA=;}#00m+7Ky30*PI<#AjwT*2e|z9-_~X-X7|H6FBglReOC{ z?!Qs5%Ul98uevDI#ZQ8D0BD2nHmg~R;WrKhG_t#8Jb!8dUHS^4-A#u8o<>w9T&cPu zme1lca{Ww5A5%xS02@iST@AHW>xKeD*%3T-zMv}ssg4?@Q}pY0F~}^zOQqP#^wl|+ z^Ptii6yC4E0Kz~JnqyA$uha_Ly;Ft(o;c2m@}Ew*zi5WSu=7NMBGfSu>5{jj>cwi^ zua;9L0C&qYVB@NUEsQsg>VnZ9PurI8affc*q%&^k^yO0V3PUM**j*3>>;Cg^OBK{z68lr0RPE)9Tj)RBjJM$^(PdD zy2~4#fwHT^khM(_vmQDhcj!4YHUvKY0Qv2W6X1ef0e+SNUq7%R^u6WiaZvdT^jpq$ z*`B=;8s6+#`6C_(=-cEA2`r5;(wqvWRWKHD0GZ%a3aF6G>6rIIC;DnKh|iUK4)8Bv zXxr{zsEkQgBDG`Eat6|1m$FOD3+NNB0MdK9xPeAy@}5)6IFHRQVTw?Shjctc9<53^ zGHbsxsaNT02^UcwYgp9v%Y!060e=WXIe8vqqTpc43QDTvguf8_8g6{;A5wt_eP2Cm z5Ax`_cFYFl07&|@EP`PV0Ki@h!i$}<1Dbqf3#O>7tpT6W(&coFoG|R6!yg&m5)5!{ zYCS23Yu{xXOl{{C0N*U!oj*Uzr{X7D=K)vdO25t~A6YSY`fZZE`m(WhSJNc^n+*f^N43XtZkju`k?3Ol34;fVy0h{#w zkoNAlN&6&A+3M=b{rT`lGxH_LY1TiIw_^2AXVaRq9u=jL$Cr`U5i4j90Y=TB9n)E9 z6~SQ%0oWlpl#zkg6)*1wRLZp7 z^1}rY8|oy1XVc>*bqxjL6E5Afa%AT+(PS9T>p<+*09-hWlq3em*xHN0xWuBn)!QKh zo5Y2*{g79yLpED)+eO_$&61*mtfM~fsiIsa0B4pz40m^`S{Ow*N)5+d6w_vr2MYi{ zDSn1x^DYskQa~ztK$IvgdDoe%K>r@I07hodEui0gvZh>bf<&V%r;PD5i^}Mq_J}{X zhVBh-nYz+=krAgX);KU#mFFp;0dm(}>Ver*eq)Vx-$8K%XW^VM$R0GQh0M$*uykHx z2Le0*04;qS3cdi_d7-Tq0O;X86x(`g(6}R}l#aA{%Ns&#ns6hijR~gZq;t1M)7#X2 z46@6HAW>29*B)_#09hm!U98(0NPo5dL#Q0C{sbbyfeIRYh_#omuf|dO$N2^R{?|Lca-i z05DIqLh7nu^(R0F1nmg|-do5$flj<+BQ0j;@3P07Ut%W3pzCr>DI4BDLk z_WQ0IQMQex`x4o*J}hNG*%pmR^WFPa<(*_h0omVh{PU4V!NDU;EY@(?RyZJr6cED3 z)H{B>*(gtJQOSFsz2Zb; zkS^LU?#=_rPn$k<)qRCE(@XB(0A=%5L0FbRxG0APpEFdBp3mW5?;o+S_41e-QlhMN z_?GjpO~SABh;F`Yi$f^!01(;cN^;GD1sE`xxnUX97_A{%U82+{IF|uqBVIOw^yII{ zcPm8|Xav6Qv(f~Q04CoCxDGTykdpk?Q)e!cOg*9mQaZZJ>doQ&%+Tf-z~h9F&j}E- z>BQZ-5G=cD0e(Erh0*wo_Df3g;QI76vj)(`A~t#v9PW{xhQ*?+&j#1FO#H~AdF|PK z`tjIJ0p*_GT*5aypGIhRaf6E7DH}@zlG7#aL$}V*22znMGOk-e6fhqFBF|7-)tEUD z0X*EK`CioEBNf+|{%$GAjq%dg>a&t=63;2_d(!}(l#`3Fz9QDcl3<475>_Ed0eIGx zkZ%AJp%TExEWg@j-9@w_pMgnH&YgsJ$`%*Vt#i2K#c30Zc#1n)2@1&ta;c zQvIAI8n?Rd$#xTSCe8<_9XC`%=MrJYVn*%UQZ}a;u;{Di0DeSmg3*2PU@*{vCbv4K zGy1f5(nHwwCgj=<+xoP&#@sD8$nr9&C0LHp{A+ktVKYNG%U=PYJttq2@8Jv4 z)^N0(A#%C%^%_8Nb3aObJwli%097TnYNZU2G4)Ox6lw=l-)4}E3qpRG3SEc37I{@e zNtxd9G8~7={ctCG0D@^$0N3F4pQ^WrDGfGx7YA`;X)(8*)`swUhF12;c0znz022L8 z`DN{KAxSGT7`}Fk0F%h*I}T8}v~nzA*t;i1Za-1XI=%*zZN)(n&TCX#NLEW6<{jj= zQDk4sAX&uL016@>`W>PerAcg^0N?qixa%B%;~Quhe|+9-jVAU-wS?hdZbRh-;)+O> zuMqa20SGi}lOhE{$}9(sI3?UA^1p)IkmPeqHS0v6r@6cS+rmd3l>rMRf$C zn2-s|tfXLPm_G7d+-84GGx@mJQRkhd3YWDoi~uU5{$<=+fa);#__Hoe04}y6)qFR& z!Kg;p_WR3KzLPl@=1&^803_Zo1plnEbG#rMzT>rkC~@Z3%OCn$0X*2nAFGs%m{S-9 zVAl-Bs;37>ud|y|D2hHuc6Px%i@Iy*F&u{g?m`B@uzHU30LY-;eoAVP^&t5X&p|@~ z=&=9wGCv{)n|&j%{Ic|2xd%oS-*~DKZ^VmJPRe-f02_$j$9{s>KB1Htis(aN%f%>@ z-i5tH>BWxtzL+f?#m9X!TR1~r8`oJj02=nbPEGT_YX|ljOH*KI;fG%7jw>2iwglVJ zW_v6O);TEs^eQ5GRl=2Tx2?|=02Aq$PW<`twhvv$Avo9IXx5Wm$>ICc%8+>V4fA@^ zOZDy;1z>H@`PH+8Y^RAs0emGA8E!4*4{YUd<`!&Ai4CsFD1sdc?NR)1wdmC98B)Is z?KpnrR=RUV%AwdB0aB)Y*2$;7{QyG|CQ$Sj=GJ7zA|sd1G=Sj3q59n=XPe?#WB2vT zR@dsa@z?8O0bMfFBj!yw6WE|NC$i>YZHX62Aw%S&@6@k6*~V5T)xoG; zG;PCu0fC64G25Ld2Pz151?uh?o`e;pgO7~VgSqqK=SBBcYl3kR2$ywt)~A;hJb9QG z0pqxl!9u)4N~E*VGJ^L%$FVI~tQ{TGYJ*Q2K1t%0vl{hGc4Ebz4qja-qo_QH06(~6 z)33;iDC^!C&Cs0=wP;Aq611gRq6@5fvLtXVh-!ZU9E?P1xd0P*;W2vxlf z0++pC{%bnW??ADw4YY{6KtVq};Fq3~NuQ#ztHhXw$4-gakTV7)00sxD0aomN7I+pF zI1~^PS)b}Y#%Hi3^kDV~%F`xe4k94Roxw?FAZm&l9i=Zb0qCMtgf-gQ&V?V8uj{8?oY$mP3 z&|@BE45lmke@WGWbkA^60a4A{i(|m{_H>$0YB@HI60mfyU|RHn-Uw>I>W=a4!@$oG zu!jgn4a`YW)jd|80b4x1rY=%GnSSU5XhuHrPz1H}sW=yHL0luef~8ce9^ZF(vp`u) zmc*MQqBjhP00VLT8@u}SdALqeRlAbTuwK8_{~cB#88C5BcmSC4C@0=-9sb((4LEro zFox&P0GREi^;XfFyqOaq?2^!BSW@np5amhG)}5gNS(+goZTnj-Oc`=ND=YSPCdq<1mphA>@YlvzFjwM|{+81HZ4i0DxK4 zb31Wj;xoWy3A&L$Z(h!^t(;A;;(_)fBZ9pV8+`7Qi1!PFh!i)?1@TNK0gBv;E38Fbs44SELp?A>)^#O zMuk~q$*f9E7^@50?|vLqj7u*WQC>Cl@W4$S0CCBIAIm4x?IasGJOuo*u#TREk|2Ve zE;kr(kq;%52pW_ZqA97`Plg0oe_AC^0Rr2P%JEVRJ{9SfJ;WB2j?~3$>$q_~636{P zaU#~v(vojp2WvwxiHm`s9MoMk0g7n)CCeEhhNokxrZpv1N=`vLF)k091IiZiVF&|A z5k4nW7u=@EFCrgmA3?)J0oNVlA8~uzEx&D6)3dV)rn;Kko6k?K#0~p0O&U`2w&nIM$Ukx=ERhwC;%*WqmY8t*F&}{=<2l^%U3HI*(Yin>4xYB ztr9m(0kF3My%16fAksKa1j|I^0z(uL%htD(kR;^;Fz(wWd?y5JEOCgHZ1Rrf@FVz3 z0OkoLXuc`7O3anyY;D>`4ijlH#>Ex66LE3EC_rtb#lh69E%;^3?VmkO#XpfU0Q?qj z7&=MZ&+O*&m>Bk?ce>o~AH9l=p3FEG=Dlp7ufKRZ)p5lLZXc3yV>;=S0M-0IE=j{0 zJ=AR9%@SK_qS;~i?tt2`C@N?|FaTZL%cbY`{ojlSLe-MH5TmSi0h)^J-oNJVRn*8( zA;8NHqYYL|)goCX-?Zpn49EHeUN3zeWX3|!D-7PbHxa3y06nMK{{6Wby8?+12o)iy~)uBdnD-B*^nu@LB@0U}oviWH%=bb%sM-$cubxrWZ! zDlowK>DBYM1Kg`?ci!;YHf~Oq3h!h9=Thx>0SyiYa_E9mZf!2*nnrfsM+{-~K@ujp ziyE3HWPMuUssHHfMwTd590?jJY{_vY0h>^|nL;ii@+&gSSUj<~Cbr)B+|GL9^@o0J zl6n3A;dbQjrAgncuSiREDPr250NofT{GVLpm%MTl@;{@3KAnheSDhRi{3| z)}zV?nPrGa9O8US1iYRG00QG&hq3^~!T)HF;MLhz^(ADo@K8NW>F4FcjV`=_f+WVO z?Ha=!KSm(&#{u7?0fK{nJo?ldqH@}1D}0Dw2zf_-cg%1t^I89u?QXQmr~yP(O3Ul# zROYHm)wM2)0a`0=GR?qa!UuhpX64GFlEkE!$dQAWcVW1x{f<(q&4X%!`E#;)&{Jcc znRxIU0rrXuN$68&rJK(IP|r}Wxa31>~GQC*3(HRHp;07MmN znv;3M+A=ddTc*S~9q$&~8XzlO9C~o5K&9A?D9xST}ug;H7AD5V+7*0S!4z#sd-gZ>q2n ziH|BuMit!fs2*j_1Y$($@)gD6uRRk@w06>*Bi0wXed{ zo3-c(_~;v`Wl3eRBU*8ok8P!X%AZZ)1i%?!0J@l7I9qDhC&{nFMk=+rB0bYNLHz57 zsS@c5m-g~kQ0p7tNVwd?C_?5!SE6oCURu?Uz^t+c=}X`5O{?)*eImuZeb10S-%lYZu^~$m=007y_BH64dG&PNuw1=}21oI*)Y- ze_l1^_H1@E1HwlhRktmx0JJsW%cr(qj7pn#@zJ! zPI1s30i(f;8APJpfs0_*a&$;K!?J7L0+jSiH6wmWBAIBXwkCYT(FMJA1rNs`f@=m3 z0m|`-k5*pvKHJ_BDkyIeRhpuUwl(^f!JT$+&}Ont)*PYmgZEP94Qike(*<; z)=UdfmBKgZWE^h>HX~R5MY<16Iwf6;+CG5yexau+b`iPYlmzWj0SsIUcvK{);Jrz^3xg@aOo2a@XuS&?tlRt+!j&HJ#}L&&05$WHq%f6aNy>Q0X(4Y| zC?zbp+2UtI{+hnZ7n|Xo%ZSqAab?l6X`APritdKD0NHe751Z*F4u94$eRi-cOYd)Mo78-!kqDUv17xK-Bxn#$4a055+S@1wN4=pYc+F;LCP!%3cQVA(bi zJ;9klU!D0$*Wsj(vE5b7(`95eb4u_S0e_9jw#RxyTZ$99w^ARjj(JSv7AN&E=K=FM z*|&g)5Cdh%wtN5zXtJjp^UI!v0D{k++ViPab-f+*!Zbaj&x7fF>vr$=qjkeQQ*=nK z-YC|khqY7p_z0C>tBM7e0A5L%sFI0x*Vz<cc71@mfpW0F}feN{`=wtXn|)aj>o^&@)+o;(94$$4&ZJ2?YSS=LUc(8P?wg z`o;&?=+&X%07-;r)aZUwvg^#z?Vgj>`_XYF6#(MAo^;&b_5oiuo?uT42r16bwNXXp zZk{D00P7XnFa?A?_D7KK2 z0EZ=_@`jyGVPQwa3s+ON!5+*&)60o_K)=#6k)GijWLWrzV7~B=bSMEGQO5tw045S3 zn64#Q4XjbXqfYaY?ab1J^{j#eN7RHQnkYN#DGe2Lroc{h6B!`ubc$)`0JdQU9$3ij zA4fl?j_Za#8cE3A_u_0Z2tBCu^eX1Xp)i?{B!N7g+%{6jih=5FA^0rP@ZX#CbJF*xvvw1N3B200O>#62~^G~lm!O~Yy%or z_egq5tK*fkAk+O+KH2#O{#La#L9->jIj)Ddg~5+p00rN0^_zq}pRQM2{!0BM-JFFp zooA~!DT{!BtRLTIMa$M+@O*Er64{(RwN|xT0Q~9QgDa^NjWkF2)%v>qtF5PiK0QTy zC+PqJ(z@j9DzEbKDAmoRWV@I1Gg-TI0C}BjGx$XNy^I~OXGZ`bobh9Lg3DsfB*NgJ3SW|6^roA7 zuu)|=v(wy8cV(qT0lbMYoQ-w4NwqFF7Sp>Vg?>Z0rF{|Nz&G*tH>qs%&qfeplB@N>YrR1GYD7tu-ldEg z_`v;;0D3WyEgr8>UYc@EI|;lxvGxt9fL&gv=bL0n8U? zd2_&snP=pd<#U?n0Q5A@Gc2La28G6p03ulD$k|e4WaCLy+Cmp%o6nAb0BB4o{!@0< z%$71+@J9yq(ibSvb8CsR;dW{S!xDlkvs6XD03|F-6OLQS?~y<7 z?Gvs016e!-FjCC_&{`t6BD)H65FayXdcgh=Y=j|@0Rm5C4ahc1N_za-**H|N z;{c`Omjh1rSWfc&<}Nfp-75eM`XtSuGbiGH-iKjn6AA?pWnz09(ipXb{{Zj#(DrMD8j z+SQFB$Q>xBt%@1W7U8Q*nM?D%09Z`zJ(FZ7;0ylW---8~Ksj+BgG>SCqSqT`4;+*M zVx9aXa%6L_KfIoNoxTQ)0MpzK$dI6a3&hCO{y9U6Rv>wASqWU<|1E?Ai68lLH; z0pUEWcLv-;zhoo-JLs4_rN&vYVA~nXrd41zAh=8A#h^<4j{Q%g4wCyb33fD(06X~4 zsgw+zV`E)Q7=`zVZQE&V+qP{qX>8kSW7}?QH%4Q#v2EP@4`#j$-i7CJBa>GHj8W_a zQ6JlMLg}0}hav}+6rMsJei{vfdWl99fq6SYUkR#=9;jdBrjV-Pg)k6=C}wV_4!}p= zzBYnxZt^B)YpU>GLTpK?+cMgx<8Yo}8^eDW2E85-2HSVD10~RH6$0fqry>G|O`f6*deyIW}4lC=v1adHG zY&j?y{Hl%RXz>SM5 zvC$2vLYq?2xX~WojBgEu58L2AyOu#nXq^fOC;fRrzKE$mC8rr_5Z`3IsOG;%=MyP?vHDWgl ztL8Zj`6G)(gWe^rI&994y<10jt`S+tPB~sL=OuMXk$v@ULgH}{=_Elq>~zAZG3A8? zd}}YAH6PWhR^yiICQx}P2Mgw)O8nE0GUr;lv>Zxvw-m&k_@slq@DpA0*!x~ueTo3>PiDX zotTQ_)%E?=mh<}bP|sI{19_9e2@T@2eEo@v;yeJ+sc6O3{psZUC0P0i(=-{=_EAR_ zx?EnTDlnANvW`*Y4pVMXbA3%vogKC6?*fWQry25QBJf<625-3*;Vf63=0s|~sj9=@ zGw1bJK)Zz$qrIY@R}PP}M19%79RVB}XoUZ_)q8+`-fqN>NoYfy%zcx3f6Bg0;3PFO zE444buAwWj3ch(xZS;9Bv;{QWQx6TD(QjEtBh^Wy<%i-f3ZRuW?jxn+DI;rJX0HF;B4~Lq*KhJx5wa?!pQX41n9QtY-1)zhFVY+>3eg z8(kG4SAbSnE&Et@vNGG@)>u%9^*}I!)3pCx2 z9MCE^hK<@rdNOo-mc#fix1gosDq_8}&i~s@@;sU40Y4*zGVM`$huRfZ1Gy2Kq~A*A zy+V@m@~?g_Z0CZnHdk&8csRIetY8LBaVZ!CVBmsrDaEZoBx4gW~0f9_e!!WHM<<`R@}a zF04^-JWs*SJ$!3*B#kuDJux5hZ}kX1bPqWEo`!}+fO9w)sxjTG@kth0CDu){BAp0{ z`0jgL&Rdy2lI~>Iw0A-`VuE~fge3hv^W_Wu5Mz18@Z}Wp| z4G%;0AhZwnC_~;o#8oR_DpiYgdJ5_gIAOouaM3L>m}0zq`S& zEmX}Spvhr~7@UlB$YKV@;EtyR3sM=pQ`$$Hs4 zpq6mFCARtcnzE33!7I!6>tIx4^&b<7wah??OXrg=P7Jir+PToAKf zzE>L!^@SxwK7>HR5<{bUHY&he=24?vX4Jy{lC>)b;*}vB&^=Xgy>$dYxA^8%pHV`j zMG*u$b1Sp-p)4{g8Xk0j-1U!+xSN0gb0S+P!`&B{y*M$e<&s!H!LaY2K3)WaI@kr= za=Xhcf&^cAv@}>H>Xd8wSp(Rl^y=h7R_Y{r!(owEjGQV6d+J@GH<3U_>}=)JYy3CH zkg&5q1p1p7K=u~xDf1n>Y5+$XZwe6Lb1kahG=>bIl=l%2Fr zG3+V6Ha`*A2ZFp*ZD69KCockG9g-9-xds^Etf^KQ^{drSNbqpuWI#Q>%UeqCX$Vre z+b2EMc~rK*^eZBpq12?|kD~phpo0=fIhKu4XLAechciDl!_5oKRD@zeV@f;HO{KP* zb*&L1b7$NH&Zy1f5*vlc`Unyz=bHuemoYq;m>v$S@qD+Wqw&FQ$_dz&*O*u$p9nj< zK{m&#o7v^j*h)f7CL99jG$C$^K}_C&FVdNt38|yhD}OI-O42AwRdFJ+;|lkP1qa$G zSwOa1JNuf;pQHm=My1uPdJ8y~nm?H4#6AI;vYUh(l1umRgO5GhqI`cgb+h~mSccdy zs)vBQY@`4kl`&>qYrEn_evqe^n%inMtC6TvKq<=7e9U(|$H-BsdzM8AYK`>E`Y7AS zb#(wWz7ZugQre}z;V33o8y~}Xl*}VJy?;j-@NP^KbU>)Q=o=atvd$Q-X<&-5XnTWp zTcIg2r)nF9@w>m(S`^VDWiP)FKqMnOr!sr2JzDz-H=m+p5<>O~u_2Z%e9!<@J&-%& zv@90W1l{MHj%FhkyT`9e7R@4@qbX@lmIYMu1nVV(z?{P?ey;_UejuG(jC<6UNU;L1}`Nlw_JEm8Tqu-+~020WAo3^2qlSc>P3(LVc&yQn)iz6T3+gY`Ss^SVB& zA#om28YndU08n-F(79OR7z&ay?)<%n^aima2)ND#dR34GAB7UNqAFziWTGoisv6TY z0O%H~j;(Z^Cw@D7|Bmv=d%H;;W72##X&`;N78%k?=NEQ;p=nL1RX2 zpeQ325gOqir4nj%3+iO+)}yppVYfEX$}Ofp>F_05aqko@t$2mn z4Cr#ttThzK?Gr}S;kWoFp@|C#i81Eyv@=HIaiLkdwPsEzz&MiF$e(ljs&EI7L2DUK zCY|Q`e+3RX)=^8RVk8KfQ`c|_!-*}(K}f&D@FKelfmQOO3xD>P_5hh2=SQI@^-ahh z;&?7&9;DiysoL&Ft5eB@?I*Z&xt5v-)WY~QAi8=lZ)Zf<&6{KRJIid+ZUeQEew4&e z{pZ6q2SzCZtK%3%>7IO1B>^e-Ns<5GSACQ#5Bi7K=EuZSpWW5nTjW|o)Sk9N>ML+` zBXz8HIjY?JDzG$4?a_(D`o~X9pn=;&DG#fRp17S`1CRD3$`2mn_sC8gj7tG5RZJU#>?gq;D0IbI^SI zV@57(VG9bg7#-g1pcx24$JcNidFy-kIEp@-X!oO@D|#%bu?;Q&ewYsUHo zJEPA%pgI&34Lofr{fme7$qZWjilq|sMS~1A2aD9^&{S#+H6;g(&%J*nM(4-nWRX%t9 zHKk6?4AghXKGE)f*Q^Cw=8&E_T`UaYP<3kYNWNa-!7?6=R#_E6=KQ2sx_I+Qvn#Li z%G<16UElr1rtPKKHsVU+0QWv;FR4lAyK9SrvLSAL&JQDCBtH=Uc7m79OTV!7pS}CE-7xQ{Lz|8bU#eeGTgmCsQ)6Y)*vF8}`kyi`XG?6ym}Mc;9=4V?;tw zGW*BwQpyM{NIgc$452_7ny_gBByK!lsalws2fS9txNAc7C6PJsW-cy6Qr`5}^T#20 z_NDQX1i~7OFaYq(4VPTMEzrx)3wJ^<;k0J69v?pIp|KA;xj2v9RC# zaZG5a^96kH%;*lR<|z1CcL@hHeW>G~b>-tt#Aa{Tow#0VccmC}HyHJh1!Xwv#JdWU z%YgJ@KlJ&W^?M%!OVtJVeWV_g`bS^BIYG-jhQbQ{g%8a_@p#%1ia@IcNBg{V(*m|I zyts-@p-csDCcXZAm~$-62kRd8Hu0aGC$OmNd`DD&D^PD?O2o=5?nBS`a0Y6a%yV_K zFENrG*b)sy!Tj)+PYRy-w99)lEAI1!!Fp5TnV$w+*f-b3bjK9n?tlqc`Zrx{1aECb2L z+`W`Py`nxFjg6aN3e3GcX~_=@u1Y>Z1Svct27nOwU(nU}+|j`}nDmdXC0LeJ-|Uel zm0qX&W!95FzdVAOC-Rc2c$}F?QvRoq#Dm-^FA#_DG&$G=2sV5=%<#H0^FE%d1A4F$ z+IWCmiq4H*tY~F42AH4Y#ZFk`l^_idGZTHhJUG=F?jI*QsEcUGLPPRsLmh#v?#-4X zVq70mucv$=$QG@b+A+UWNI{M9)BcNRE-uR}(0FnlPCz)$>xvb)Wb&}MiIweO23Wg$+w@kI=-ud=LgtI)IC-j zQb=VA0W0bixeUt^D6^@cTrRx7GG8Apa7<@+J53n}NgEnvd&j-c26|di)CBjz;&g2= zz=X(+z(AJ<;~%T{Nz5GX5qQ7Zv>X$?q?yvM1%sRsFX#nxzeB{(f6A;afjlxDz<1A* zQr@ckJq`NjK-M&ED9tY}rwms4ZqV#w1zk@l|B*rp`{h6C;vXc6;B3N0fX*>-p@J9M zY4-;Egjvn-_@s1HvdPbyVA#RAMCh27ew5#2MihZjyXb1BoB(mH%@M%=!LT0IR$oI=^Q}=w9@$CE+o?e3`puXNn1$tsl`|ZowG|qx` zFCx13yY*9w!G5WFF8dBfEHKnK9#nEu#7!G*&1hr=#8#8gVxvsX!7dFYr{B3{Vl|x(Kc`Uub$E~GLg;eN_Xh=GJ%-;rU+X$Hpu-2- zvHO7RlLmc%r+8x(Keuo$y917}GZkRK@!;Qp>+mb_r*B$uHjl&x*DbIDlCCyl&XVi- zuN{(sKYgF378eDhc!*A@$6q9YHR&6Po{BsH0`48*r=E=vk?Pg+e|Gk>vQPPiJ z4j3}p84+I_mjg3Egto}!RVW(KuB&f6%rE<&+GJ*>m>tN{`wAWIs8I(7Y5z~uFCTlW zE>H4ouDzImP|--%^3iuRD0keUV$N0!G`QXA~mbk zCzCJa}FMDyIQU@I{HZKp`M5`5gDlYVK(bxjaCjC(kf<@&PNt<*@bn0vqPa& z?+fqC=XZQLU_rRk{0;Nz;i$)=e+@9Lq}L%5(O@%wbULy-lELmzcRVD`4SE#-f(mWx z;B;jVHEJw*AN@vD9=zx~g=U%eiNAMGZ?y>YO(ZAz|6=MnKd~(%l>O)?Dd94|`dYnyazr!RO z9fOWr|L4`R{FL(i{59Aak7;cqtt{_(>bev|s>LHRcD1Oh<~@%em`xJu`XwX1nZxqb zuMWbDpseuR(10dR6bqwoBx~0RVU-v}Mw!BxF-oY~gGC@A9)%(mYaWP>sVqFPD+VU= z`mmH?&&?{?WT>7-mfPVE^p0TQ#CO}8YCqPe>3I0Urm)tkCvZ^863qatOd!KDV)ycI zthcdZV*VoC09p$T1c;F27y^Hq37iiccrfp+N%EAI-B8cF+(NkI1Y9EsNR8{6b~Pj< z{(jvT3os7!pWe#1hM2Uxc!nosP4|C`4EWw&g6@C5P=%j}253BLb%%}9lr<4GKDp1= zbYwEzA^5S=r7hcXg|u_WHVqP<9D3gwp)bNx1|`{*0Bow}xR^4}M!k->99L@61hcW4 zWgT^BIeM;PUZ?!p2B?#LSa{zCWn&QtJ*mDMfM%qc)T1mdQ0UN$+msB>R}hQYA9w7- zqZxbYn^V#0_#B_(+Aw>U>PprsKx9e@R$6)Y9<3Y zOf$7=l82Ew5u~F!x<pUx*_ZRU1)Ou_vcEurw@tYhqBiH zjcDgLfX)vQ%<~Jk2kv3YsRT-ne7@}#Sq~B{V%E0r;@I9UB;siPiZ~C-3{eP1{_^kn z>8goTw`{m01VHPMRmsqYx?p4V=Zm1z^lKAf(L|^vc~M$1LAl@ppu(iyD_d`ZNicP5 z*&XXY0RE34^!U3S2VbVPkxZwFzaB*K+ZqU)2AKdEuCrIuTWC-Rw*%RP>7lzj;^M05KkJtqb^C z%m0f*WITv4FEJuG3(ev?XaNtQkQj`d2o(!0#VOJ29duZy8FDRSKmvqhJh$YLei+eR zrAU;X`En0zc6oMKfve>S?h|<5qRKr?F8-Re8qw})q3r@R5XXCY`;M|=v{dm85HGxU`>WAm5b{LwqJ@)rg1&K-z@A60{Xuw||}hcoQqFq*mOaUpdS-J?^vflQW9@($8)c9Pwtn zaAZj3+NnFRGjKPGDBrkkiCudFWkv>WMJMh%3)}^poXaT2_aQlQsA>0K2a3z20p(BN zEm;OAui$q*$2je6wXp@juegB91%x?#^Y0h6+Cnn#*;E&jJjK%;|2q_e|2c6viKley zN0}u&ovSkBAxhZ*mU*6%WkXedEqSpgiTSM8jzz-N#c0GmB1$5(bn|IckMQ9G6EcP4 zb(-rMF#DQ-gvCBO()(Q($nl=@)c0GS3bBqEU1SM{;MV@Q9-oua2Vgb-rT|p z+x#;?RUJTyA+oaMN%&jQNpPs3p3pi&xuYOVdQtJumrSK2$*Ny~ZXU_L5FW-e8O9Lc z65ZZ+8V;{5q$z9cKWLUi|GD71`5q90g)~CJ&c=N#Q2tK4isSgjv;$2GwmlCx?nN^Z zg(yAVo&2v8^qpk35=<4}sSOT5adK8S0L`0|rtQ|Z^xhOO9FI~uI~4#g@l%)ph8eEN z$onrV{U?zfql9{G>^J#(IMPhS_A{2YCgX65h$HNkc zDm2J{X^U8Q zZ5uH~szu(K-gsK;0W~xC3BXL|w}rr2&cUasX5pRnKsSzr4$(xJY|LsmmYS18(YHFF zu$rp?uIXv~Y*IW43}9E%8Zm$DyL*Yb*=Hv6tC1~D$(lkxck@9Cz%oY>8*C`#f8$IiiS<*%iInvk8Rp%_)k99gc680ZH_rywpR;hNSI|NYKEpUX(x38HSmJ0R4Q!F;@)!fzZ|W zEj;3M-&KA4(sIKo0}Ao^OVM(Fp5h+HnaGRlCe36>_DSha3249OY0q)zMAfmK6zP&^ zv2FrZj{B(BX6|wMhky-f`TIE#9K#^b6F>XmtWLla2a+hg?cTBI%3?7L&8~OVJYjwZ zkC?$#<-4PLo4?)^FBrxW(Xv)=7CX~R^YG4>1=&kXCNyq*S)T6O?jx9XAdZ~n!}p7s zVZSx^m@YWKFS1JhqfU(`Jnqc(nT;6Z1jtuD|KgxB*wj8|P`|@bZ7+NdQWB5~m>Y4g$>?rH~dGASj5YQ_F0J~e0}#%ou`+y%5RsJ&Vq}!Bt~=vEM@3Wqy=Epuwh{~{xM|-YU48)qV(%dS> ztP&^iPx4N;Z8aZhDfmp5R3k5Vz$RfeJ-p%@jy=U$4Mat~unGD~0g^a5{ROt}k7J|L zilu`2H^~$`gtK_iP5BhxjJK8`5j+(XT0@5q2oTJ@ryQ{h)f0KFrxdWx+Z{*nY1C>y4r^G41ze%bXffz@Pxcj(0 zbryLkiGOnJMCG7?V7CLs3F!i3JN zYyNk2JvJg8#$+Oh)AbZUJT4k=m3?NAsI=7o^a6`Gztr_09iHz#Rx5j3)SeD(@4 zz09LPCf$PZ0p2YyWSX#CSfwXVwPUeBk%L3G4o55r&ySJ~Xhkmk+3EFoO~2f6X)syP zHnvhTUb&RxTdD8@H3<&5VDezORw)#>8iB1%TH^GTIAIy=7px$G>eBS3Pj?(hohY_A zdIdN7X4Y9L=-MDV3+!D;Mx}Z=@c$cMm?+BG5rq$l^G9hrW=iuM) z{nQ~lTo)32Y!nd?9l!&;f3^Q^&E|V~OL!N0Q6ed>rhO}kh zoAJybaTJv9Bk=$F`ZvLlh+$tD0yl9S4jps%+^Is4 zKxMoA@4|{v+_yD4b1{+`(#AqlZa7pNLZ{$Oc8*N4q{e%I0<5?_(BhQSxHO=Ml9?9@bsR;IXF+nxo$_ksC@ks=EIf zgE*bI;{`N-(x{>S+(^axyw#j&*kwfAy;%eI4e+^e3~@|*VHt$=ilgdT;uY_)gJb8o zyaSSY=i`Y9D7pA*b$rZ6?D_)3%fDybFY<$*qu`?9;1s{B*gEE>#Q^=cYD*0pMu4N* zT2nxt9<}-C20O>@i$Jh~do+$F4m=aw)haF(`&k|?Z|)}jM*dbj#dcNcIM6Ct_ibZw zIS1t}bQi(UKBJo2AoqQM&p?VEUx7Yh>P%ip{2ttdJo2Bn(LB;=5`fw`B*f=&yN#rv zJ5^D{S32tU*dng6!RVCX&~Pl*U|DI3*=Un4yP?m#Y^^yL3u1!%9RtU*(fdqHWnY*o z0uP>J&(MFisyUB@e#8*RmQ#IimG80OxFP*8b4y?d)talJos@MN1HX2rv)M73siKkcF<#x-+OP&|>TwxpIA? zE3POhKyM_QZIYVng^z0@{QZP(g#W0U0(eIw#XbI(?L00DU71B!e8j-jx0w#nwnF58 z^c@<^ymFfy?F3%ph%itKsW-1#~>^qH#@Nz?I6Kr_+Yb39LDs{-+< zUp+UMYG1cS_#53&Inre$Ah|0}o^_-F7OVi0XSA~ZSgAigBlcVNq8G+5a-h|fp70AB zYigXAY1$Y658aL+;8%u@os*EhVOm97S!7?njU(JRBru+B6we%~8|snD0*ABjse@nIZML@N?&3`_JD43H_9}M1TKQ^g&`%((+)Y$t3Y? z0hwS|N51dJxOCP^<`dmQsnQ?j6Yoarj;8_Oo7|PbQciD=KEc?6Kau&w>zj0jfd4V7 z4j=M2nGC*J7+lcrx|@nkJYatPD#%0xbQkvz@WJ1;7W5gTu6@~hnCf`l0b!^iEF`Yr zEf#9o<6Uc@|kZWNh?z&qS>P9(zcN$wmK&^e8t7s{6H{zp5J z!Te4%!I()?iKocK((tq(=X~#zj^&ueUuzEWTg!97P%;O2}HpFhx6JrT#aM=&7 z36sniY{r|T;qi<%0IOdxUJhX7$#Eh4=YW8}IVWlTf5g;T{0xN#B z_p<}PSa|0tDfTSgG1TRt25R>OOy+b!DOx5-(o6=`*4~p;)nRuVxL;ql-q5|Q3dAN~ zv-_BuN^iR;(9tE~CXm*AcG3R;==p{Y)bCDA*&0tc<$wRloli+CS@a)7b!pE(&a&7X zwtNoy4%?$z-GlQQXQvGUc0`?Oi8C2Q)y&u;4i1%V4`Mjj2Od#wZL0A`i6`GS@{&i8 zE};_WO62G#lv-&3hg_(2wvoR(SEv6EmATY!=X_z9gCCbJ7a}Z)4)kvhe?!;xJBbt= zsNwuw5ZAT_6FJc{vy3`gvL>B8LkL1w5(B4meIFH`7 zdJH3j;5q+?1fF+3Sn<%(w@x?gmLrE~KUPo`@YOz|w=&G7D|ga8%#pL0VZP?CEje=l zs+o057l)6Za1zrxeweQ{{N;tv7o3GEtiRa$pMLh>6bmX)8D7_Ghi&FrldEb0=@q~V z+cp3m*$+$7x8^+daTn!}HmvIbQUW(SF0Px?vaw+X=a6iyeFNkx)*&Gu3kCubdfj}BT4Z7xiwNmH! zh0QaP)TdA-?nxo->FYB2I@=Oe3{;|#?LjvIiH#DN>@3hE3c@RKCP%Ogl+&t{I+K(q z?y6GkJ^M`6_ptA0q90Vv+iYW@&o(IOLrAO_wQeA#S!Ks`{+yKUeTE7$LdM9~tG=2Z zjz>C_cf+?+)tyviJ>1fw9U|$EK(h1XDp-)!_(br|9&fV!a%kS+W4Lnlbq=}aI(%SK zUdsy0hrE?Gwzc1SM&&ln=0b`gmj+Nkx?dR}2t-Xv-RU7`-E;A?61g7L8mH&^G0Lh# z|IfQ@2MmU%ye`#blB7Sg^#Kx9OjByyXBCAf6O;wdoH7Fa#IwUeo$1dWf%%I|Y4ACZBAY9bG`;V~1yc-HehDR2<4y!<< zb<>?^Mgi^ree$iYdw{%dw@1eaGP!>cfCZ|ML70?R9 zr#G>9!2v^I^dlN1S|Spw0zc5l_94Vd-wAiq5nV* zyr<37-`=TTIY!kPzanFrKp?MJCs*ELelDxMg5!RFG~nTN5g?_!M6F<9K;I2kmqe74 zxb1D`w?J8$!(LjR(;Jj3dA^=>GEujMdppEnP)(D}0=#yhNgtN9wx1t3W9F|rD;#+I zT_MjUn5?9usOa1dX5E+Lbo2Esd86uNU_+}F0Xz!UmV?F~9t)`&Fy$_|>$t?o|doqn=#dx!-2N*el^9euM>UHID4`)dwaAB zfm#q#o;*4@gZ?h2ZTjEQ6A#TLNZwwdn zVt&8y=wht^g(5|UK$h^^|8I)5`jF~^|J7Sx0iN;4^g)eipU`0kA6w%Z1QW|S5eldM zhfh`;WRYGQ2~{b(mU=SFohQ!(rzHAmTP!UtT%FFJB#8RM__a57xhcbZWpQL*U9>O^ zG*sau?KWv=T!q}MFvix+xc=<*G#+!$y@GfT`ZSwm+!!I?5&-XHp7{x-WNdm4RQVn2 z_5VAQ={Btl#J0-`F}4mD*{Gt|-f2ddcy>2U=T4=}lpHngEnM0S96FH((JdAQoS2M@ zus2)6TZM}$$vYSgI!Uj_WfVe4^3G|!DqqT*=uz*}=2Qtz@G^jcM5c0}fs3}gge9Kh_ zLMW#kL#4xeFkA@-H~JI|&0sJ}3B+2zQLP6@TMy@hx`S~p1qUw)tPQ+y#pzVmB`4;_ z359Tfp+iUs_@tZtOjL8BrXUOAf;=Bz4J7;t${f}k?m~U>tubXN+uWs<$j0~cp{#B4 zK}lFFEY0NdNb7MfPZ=W5c3S8NqE3Evh`x|G~`Q)1(eM-P>U^<^RL8hx-{cT& z)pT1#A(Gr@l&9JmOJ!YNosXrBF1!H@GWzTox*U+XD2fc%^dF86u63|D2X#DEWOm#o zy#1KRtVVSJ;2y#ba-Lw&umK5b>sCR#jkfdtlA+~wr0xY~R-(a7&Hdi~HAIme z+)IC~Gihiv2u^O6B@F_Mw4HlleK-gjMm6-7GD>6Cnp&D@o%%(7)tV*gZ428>tLZ=C zRGAj|SDAjRhXKWgysdf$@L?E0M>=5&B`03)?6_RGqq5neeEVc(zgU8amKTJyB#W=7 ztgN@j+X8xSR(P~cE$2+7axSQPK zSzk{AQ)?$=<(F5S6`9&Y9X?(yr$yi_J5PIsOy-C;;);nQ*v4Y16%aF4yrPm|ekcFE zX*V$`42|OyR1pGw#EvG^-_>q2?%EizNhpnzl&9p(X*z|63h115H5ZjLaDRXa(7xR| zE401ij7Cw)tq0u>1=k-uvN$T}oS1L3#l^nHe_0l#f{KyjIdh+a)F<&c@KImmHtgoiZsPiccW z6P+Dll36tpI?rx~(kPh?fX%D{{vQnnevT4#=BDEpdyl=!IGj9ZC_KPm{-7f^vmv)Ta%kKnkCHH z!ytx6+b<;r)Xr_1`F9hX$=H=q$|n*lt}1*8*4&B8{?~QE^OAW6}*nQV`^@fy4Dh*0NQz`uJD8g7*`^n~@k$ zzWKV4GY(pFfy0YfmQW|%gdz0rEfY^vMi~)&=!#zs76)7L7te=LCDWM!jN=S+^TlbuOSh*ygP7%ub=`lBERF(OR~LTnEYV3aC?`D* zQPSnK#>=9pW`y4irtBG&2{ep>ht?%N2;KF!#HYeLVE zKU-(*6PD$;6Qp)r_eD0Jo=8k^Iw4P?EomUQj7wxMobfNrGR6fL#J@9JHYg{a^S^YZ zi|t*m8jCBrlYX*yHYN9*lUIS?^2*1A6f}4m#fPkhY!Q-ly!29m8ti+F<#OpHcjgI>u#g< zO$3b3?XEhAy6_QVf7$_YS28_ATUq=W(K9QGQ)xL+e|BzkFEaA8;9!~MB{bheP{Rd{ zIXb>bK*qxx*(?xz0)rO+ejMS^EL_53rn)uD(eAp?ly>O0!z7Vi(pO%~5vx^A)ptt9 z3AwCB=K%Po(1dPoV*2wM5!q08`*Q_@Wm3P=ev-r%xU2ULSXr@1FO@)WVUhB}Mi^BF zbpqjz8cjR`q4li46}|)eXejH)XSlwQmn_D5REC-crJY_*gLK_gD89;1p;w(Sus}!_ zj{e7t%LN+)9`7Dp{66TeilU=+e&ytJA7%U$0IQ2+D2w!BoXt=Zssnuv05H?cI(rKI z_KhK)Oaxo{%;1LezdP+oPGhseO}p(~^LP3PT`RO%nN5#Xx{uVcfpZIR|C`qdswUf4 zD;X3B0Vlo4cT1G=CO^^v4}XdPEy$vih3jLcrYWJ6n~k?h;E+D50tP2F{c19WdK(>m z^z~BZ619OWcM=CGN;*ROwTj;=w0;p7-)@Unf( z`xn#oihkz*fp5hO<;J<;3A*lVYdIGNv?3)%_N9ig(V1?;8y{2xy!R=$$UIR@=!S#qU{-Pz1K+@PRA%dDipF!n~Oycy+K0qbNW8@o4Mc9^GPXdE-uS9f~Eaq6da*8WhA?vyBk&X76$oY64Lwa(oO%4K=F>?_x|JRbp zLAUBS$J>Xs3etf%%r_FmW(KIz z9QT&B63tLFtgzX2q_mFYq&A|+uEs)Z!sq@XG$f!&ZCd2ZYeE4!or3r}0Bnwc*1bs4 z?wHs3qB?W?NGtxQyUx!F>1E@a(H$%5B!%5h+Th0oN#+0dD;MrF!%5uM`Ky-KF=!U| zmlwO|S}4Mh`9C%r&MMm9Z##N3ydc^)n2Zq&0+^ILAz zhRZ=gh%JYkp<2Uilc74}c=PWKeOL~}cru{VJWkD?T}T(K^P|igwuvSB<4Bz%;QO-8 zTyT81c(-xiv3nhK;h~M76V2tUwLe2|w-n(%aIZeHZYA90_n;klaI7 zJ`NNV8|GdY69nb{H1U}HhJ?PrRNYj~kY*#afu!oV>*I4kz{QvR;PCuQDzDGP#(Go& zYZ`mPjst{TjY^v6K#w3P$jI`)Ho=aKC8k`}GSy#__mCBB`h%Ie9B1zZrm{J^C-bP* zvkXLMzjV2iKns>{<}o^q;lMmEa3LUzaw>L-d#bGf#QN=KI8LZl31f+oxC6Oo^MJ{m zfg7RcJbSZu;(7`;H@8`^Vdica;v1HnXqz>XYURItw1CEO!O99Ljf%eQLjdM6s-=>r zj;})D!63SC!1Mno^9?SNA?K-u7keTC@fRLGjjC;yEN>*v=Q&n62{5wNwd{PX#?0^$ zf<$*hrsiK@^YgBxXhvlI$+92PNEV9OG62~+D&8<3gd0)Tca2?)Brl`1AXU4gleqyPdw z49VG|B^HY&xw+u|w(RlS!i0upR&I3JnEtdxY@Map90>zcyIB0)56j;3H6VttrB^m@ ze7RdP9xmWfG*~gvl<)elcnqp>&vdQIcPs{ZI9L`rChBrL|9A|yEkJb!4;t2f#*8iG zL-jZ?ajOSmy9w_>-RNh{3}1=;e0vzGyidRlEq$z_GYpacIWTIXac%(RVZB+fH2MUZ zugIa$A&7V8r0z!9;z%;J&As=!#C?EuZOY+tR%^bH10tGtS<;;_Z5M~G)5dd+b?Z)E zqR@h>6ItqhUNq^-6z!kuw1SNP15H4(zp8WOLXuL>q$vS$F=KHmLO((HQo)(|RVx8Ld*#6%lI5GEILp5S{ZEnN2a6cDdV>K&&ZTA|q<(PUv7zr2)Li$Y z)c;~m$^ZbNNBh4j;SSEExxsYXNi=UY=?FyPq8N|mO<~Lc2Oh_2evSttn;`HX{jeId za}oj2eP0F_9S3$Lbc{#~!+N`RK>YWB?ZMC<)Pk+SrKm>=OYv zSb``fta_;2Xw4R0oB-$+hGyN^kf~x&^mtZeA>aDb7|Wy9H;>v3;#Bmijou$!sw(tB$A#anT1Wv--Ho6FzP|IU z3bgqoR6Z8~ju)^C|g z43j*<<|Qw$!03THS@BGmkfp_XbQm~U=6eCNEO>F^Ozp{QeVn9DdFY)KVx};m!vBM7 zcKl?|aY5VCF0WY4c%AXyOU9_SR?`4+C|ho!H``UPNy%QAa<3e1C^r$p+v#@R!*gfu z6KJadbT``8_+jnSJ#UTq3eo_X{_{2X7zrHaP}2J)X(DzvQ02MaFpFfnEVf-5MFeGR z%Z4z~l`%rN47DbBk!Jwf+RioLLIbT{?OtzyW-v!wCECR=26H>al>DfE~6)~WMONS!qzZQMG`E=1}L@i<$$@!be3WH0O`f8YXW zguA~zJ-O|)*@rg)&-RlaCkB>4-2Y$oPBbxJ9Zr4ZA!VcO zEvEpA-X;4t@&;un`fk98Lh6$gE8$@3r3E=}5&_=P>_6$fC5e)uGlk2fN}FeJ?Pmd& z!J;}3G9c7lS*-vu^U(c5wL2C8n~H2T*Vj_`)|v*y;Ymuur(`AuP-kHY9$x8vwhjm@e_mqkPHBom1UFeVfer6J1}uv z$<~c|>rEye#aFm~GJe0Bx;rtM@%aEKOmx}uxzjqbKOzi|<i%TFZxMT!2`gKFKAhrN=KtMi~5O_ zXk3J`??`r)e87#4mR%u=d3&rLeOu%+ z72<(y02M8(o^-A>)_wtOWj^7`dr&Cu&spam+?Xd^P+-RcOfe?TP%L1trfmWw_ix0g z-JGqZ!v@@$_HhBR3KtD8WKEKYydh*FOi$36!nC+zhxH(P(ue}~Xs`^t$myg}Y}SEQ zz3(>m)_(yFB_fs8Ih8)ud|RriH6~&mfswzk$0aw z4x0fN8dXZT^Ru} z!ULva*M)3!2s%HJuV93F=_nL&J)P6Z+=t=P%pw^C-XO8XYAxM=7={hU1~mXQTXTnC zLsfC_6LT2azk1&X#Wv^UV#E>or;xaK}oWVqNgr&Mr;tr%nN8U7wL@z15V4APB&d z&~Sim1TbXc0J-(iBFdS=A@|N2b+E&uk>auqVs4N+#z6s+{L1b*%90W?D(Z3EM?XC= z1h(fbx*Q_rggfb^6v>5O_|HWWIoD|S^WkV%YN-Ie@F2ct5{CVc6dO0jnA>yDf%43` z)#-;Ht99|duFB{bK+)P42mr2pB;66u>M#!-U~D;GKYQun)jNW~GX=swTfUJb+eI1B)eD`?58M zJxT$KNwQbp)v-t9qIFqe!VNjjC35%1*`@QWL~5fJK(whx{G}J9&8zj^udh}Bh2270WCa*6{rBul!k9Wwb+He z-yy(V?-iG#c2pHTqH?3CezT0mYCVP*6C%E&#)&n9qN9R&|3Ux(*0zC^IzlNrz20N8 zAz{3WcviT8dMh6vYF!Fd3#1^5b3yrx4YCgG;OL$Yq&5LQS@858J`WAv3%?x2SSb(} zyL7h|w{bKgX4R>!K7T*B{$1Hh8Xl>?sizO;#3%stHW-}|!06GO7cV~DH6%+^qywra znm~|8bx^ZXQAo1eK?lo$c;Zx|xE%+c$4voeMBG-w(0|2%`g}IreRIoMIfZ0l|NRwx zvJYHh0Jh;%P(%PMish)_+!tOmV~Q!{6CKG9xZ{rpMX}5vt(xG3 zKh5p+(tAt=8f9%ro8c&JNZ0@)-0YYQf>+gKAaU;X<0S~nnhiGqI7DndwAUr{@hddW zU+xbnIKr3lFDhO0a*+Ucf@L3@n&uAEq^EGIEd!2#V8YL~#N4rO$alqh;LQ&$f}OaL zhRnPewi=f5@QVSaEyPmMuU}-(J;xj0BZi1m=(AwoMEJ+0e(|5vS)wXow9#=xj)i_& zer6B?8)yNvc(q}oMam6Kg&Lc)Ffuc=-K^zo@AnjU+z%P00fB_tzrf2~~ z6{OCCz=Ak!sh`BBFE#b83Ne_werL|>(o;R-PaaULI`d6NXs(bB?s>eR^Ev>$Qnd(y zkPF%5J+Qa1Cf5E%O*+$8&=jN^5;d|XVf2dl<6 z5C68DbiVM$KY!g;Ayafx+?jHN5#eDJkent1*;GoD+U{|eg-ZbJ3D+*}W?4dCsOATAYD^g6gNcN?{8cOQi`LXPAb zs$2j(>3frb8eo~b)k&B9LstPf%4z}y zN6RL(#E-94!La@IUKa^%C`6_=vYqO>qM=xY*R1xI7DZ^wD=`3P`1k;-nL+@cNn%&?Z&sFkQ~#TS z29w9E);A}I^u1TW%q1-0Pn36Gb+(&leQG%TA?kosqcj0`u)2lCNk+rUd@#b~ccb#p z^7q9FQud;+QVl{S`H;F@bw0}i$H0}ZBgF?7NALhTnfPryQ4C3GBRO#8Sj-`jMh3`2 zj@v0l?Fca7=`5MyGQ?P#wCgP>e{@I6d2|4X#5IHCUGw~e;mBK8b|m~Ht2RIt@3I>2 zl!QQkQPmKYU^NR8Lm3j%nv3$B^}_&8G*UVDy+3}1fvTTh3D4R_9Gtj~^HN6@&MYNk zL_R2w8|k02l%ramVcvQrFu(x!96vN+BW0xiqi|^zK}X$K=P^PqvGj3Pj^XLauG@zd zc=cgE@e-9bUP?E|xJ>}C`b1^~yJF(nvS%s-k-ZwT4TNRA=qdv)u%|X`Ku*Pzc!T#W z>YE!U!j1NG!J7e>+BT-x3TfmL#2-52XIG5t)B(uM52SOXnK!$^;XSjG*v z`z{CQu8Hl^$sb*YQd)^x=Fof846Z#%MwLt8=RUF24< zr)CKlf7MzV2lu!I7fwgX2g5mk#8KXUl6pL;cebuFcEs+6O1fdF^rMq(A>anhqT$a+w7GMox6rz8(vKNJutB+zJ zHR0YDlpXwo;*G9n$v**nTnEfm88E*$l<~KN^=ediixo0w9s3ybt+&I!Q9n@ePRWlJ z8hR3b%d8H3<1_)eNF8Koe8m38f&LX`_KmWnp77*h5)&nN-Bks&1DtkM#D$kudx^Tr zJ5Fi0&NKnMucHd{nh1C^GF7^eDZaRV$Omj(l<~SYPbktV(+Py9w`1xT6GG((&`FS@ zI~f70j>e`Al}9J2h1tfzNt0N8>EH8Y5A%6^O8(XM;B{JhSpNd43zdsNtcR(wO3FZ-}!L+$M?zDwe{WNEJ@-@S^BErI}GnBx#P0DQLY z{M=TM$?}&$a{f~uwIEDdDgecO#yf7H-iC{;gIy3kUP&V&ur~qz`Q!Tl2{P` z_{_ZA*B+pwl}idlG*I~ZnPGAN2*&nYy;`cm;@!N4BNqVnbZCkda0+fYqpeXklcwag zfQfl!DClf7tmtVN*X zkJ9|bypG~Bq~!jrn?2m1lmsi^c%GEhq7|N3sjtuF@Ss1!1*GYUTq4V0C@e==U+vQ=E0Kb{EPV znF7k7!0z9~2%`Wc`NQB0)}Ra)6BUlnL9dH0gsLc`=GbSkxO2YFb5=Km<{^*Rt{y)V z9dU`cAd>;7s_0D8jj)0<&24qJ_8B1Vy!$$Ab!rY?FTMg)L{rk85nGIof_F&!sF614 zka_^?+>Zs@vZxgIvCfrUE*y%yxXC`WfQFH>hHQPLcxH0{VC54V79xzrX+0dGc~v_gNtw@k0UXvitJ` zUbnras$g4Bk%!{Mq{`_SV*4#fYn0N@$+<++unY&@5AH+xwQYK0mT5()eDQi5M88b{ZWQr zBNLtExU1Cf-WnoE5nAEcpAI(pLdjMaYPj^Q45p75M>t8E*C3{sJHQdFK3a<&|Cz zDh$l|B;S(O%LofTLOec9x(@+^eBkO&nF2BI{vdgxesc zR(;=nviNq*d?x@BLk%O6Ug4HbxbA&qzppaZ-tn+81F=qx$Pm%FRWwhBwGt8HD&5Bwo1eU?}^S~4p z-D?3)N*H-UkrMcJKf!9{+~dchO$c#Xx+I|o0YhTYBhLP<}735F8fQ+{elC21#q_Kd>Uq(k0M?)?B7WHWU* zzVoqC)#xm?1(LAjdB6z7zvOOb_#k7RT2h5-Ltzvu5Ikq<-O=C-s22g=X*$vaQqI+1 zYI#~RRP1!3d00_@sT_q4A8jFy*=~3 z2u-1U5ItnNx>M772@i&^p0;U4US)HB8&_`vR>-kOBb~gE2whA8;{NxHw}D9!(m7 zFEnIQMWjBpCcJbI{eD13Q#JHls^1neZKKCRry&7y`J(_Wtf5*hxf<56)>mJlL)RGi zj-#B{=sk$l9S>Yu%xCnF+vK??m|kB^N1*{|y+YDh=)uOvbolgNo~$gF=E8hNk(ZvD zOj@Tg*@bIfCR6zo0VYBi?N1#b_eBBbJhQH5Ynp#Z4MysNIYg&cq6O8U{X*K6jo@^r zqntc+W946VYq4u0&X2RK8!`bx!t;g*RHWd5q(z*DvAv2fbS-kd2+->GhirxKdo5GP zkQn;KaU@A(9n2Je>CXTeb^Zj65CEWVSTFlusmVQv5maMssAQ2>#+Kh;jwHpnWrWd) zY9d*7X|vv9c%T3$Gig))`K66~_+v_^)ub*v$b+Yv+>n+p6Svh>fbZl2jH3uuEcM&73>&|LwV?UDLxei0LZuClF6T{{5*;Mtf%i4YFr0nM2*TF>MMo{JGjs(k>% z=q-hUwI7lgRWBK+b3Nry^Y8e!Gx*%rH4G$85^oJb1&6ic>yaml)viL=S5E+Q#oD;M z1?s>HJyQCFiwSCRfN}wEoVTBNCb7q|_XarL(qJ5i})pvqT)j6sd<+=IW zeSa*(5==&RPNe*x56hdUHdhI5$msbzX?uaprPKgfF`=8DvE9?NC5aG2x3clL6)MOF zlTz#8>#8e_(+u((`Wej0Bi-uSgDc#Hs*M300=l0c95=p~a)ujx&O-S5tM{V{rdzpn zfHNl;1(B%SSQ7xUE4BNbVo$YSWQ75def%$OZr`21YUVZ?cC7*Fzjtiw(w5eB&H%Q` zZY$dkOtu+WwWI$AZ|Tsv<=_B=66}2voTWN~+v%BtxJMyjAd@RN2ZTR=^T*2x52+%A zDsefDSg$p&=`K1DcU%FSKkJ<7bamt#+&>Bd1YmA;UYK~|`{~xC1 zZ0sO{FGrLq9)|$rbBIC|OBBl%r%0PD7jNGBx%t(C^;0koA}74Qm#)DI);D4#+Z#P& zEzr0tIuHQRnlRWC+nk9WKolY(L-%8|dP{3!Er5dMnB|-1lvj>*ixNWR*v&dc3jY}$ zA&vn&!PCJ0g44hYz=0rC=1*9LyT?_wxZ+PA;HvFQK_vhI`TL5q zfkwLM1M_|2rG|=`1BUj8SW`gxLJw;Bx~$aUh2;#)VlYKlfQCdJ3I+hyDPopKMGeXt zqs>Rm*hck$kWxa1)UY(ru}?BPpA-oQLV|M0c?2kN<5cs!XPN=RGrzrbNrN=<^`#gs zF8j9HA!eMqP9pO|Jd;A_AO+i~U9RL~9ot)&y|B@%rKJI_Zxg<-QI%u}RZ%pSejDK} zgE)GO^lyAMX_FFtkNBm(6O8omnh%S89SOGuO;7=l&#?pToRun0=7cyd#VPbs_>PF#}Lm1zF1#;zM>IS>!mx-<~IRrFCfAxI&SeiW}xXeD6~^VY6fA8QQ@Z- z?B=rQD_%Mv`DpI!H%FmLSm*Nih^+zTT9n(z9zxqB++2d(r~3vx$kX#n&`~lr0(Q1L zot&XCj{XBIzB6=B(fG@H@00+O4^j7C?h%bpW8BW+}Hrc<2rY_HIS>3I_kUrW(!uH0O~DBz+hiBpGM1;GU{Z&N4qtNk>u zz7PS^qiq70ZgkwW!rSQh9MzC_n!cEnlh5am9C+-8GA0pLKIplb2K;<_=k}hhdOdL1Do%3RYw5x6sE%9cb2WOt|$jG4GMEPIW)nS zV+!2tUQgF(Dyc~tL7P! zpb=Xqc##IYx}d2QboGEfr3p{W3fPSTm;YRwURg?#sA@p#kn$xXt|ctA389QZ5f zFpa;_cw=j4%o+Tq9SL;u?iK-qAa5rM6cy4A$iCSS$asPWN6uCq$bc~T$l{S6%<2mWcekALDGvv3^Miu-*U?Ow$teHKph+GT3af&m)Ic zv8w@T3yl9CdY7ml#~b4z!gYvL;C%!4*3SmTG5Dw8vXKV#%9bC~q;rjsSp_nr&%564xUo=JWNXiD@dD$zFmtB%w zAGkD9Qtsjqh7_kaJw2B21eKA#9cBSEb!Ac%Ur}8mHVL`{O;jOfWdP2$Og^imcXv~q zLsC`E5ZT9+yal8>xqH>AwUq!^ecqjwp9~(~Wg;$J%STimHtwyez<+yBJ<*&n7*f*v z#{?ty+&wAtKefYeAaemaW7>!^duWnGJPb~&f?rs_@jQ*~G!RF^DPa+WoBp3Q_cB1x z&wTUW>l~hs8f5^isMSI)-o!rvbdu%`S!`xpFEN=kup=NdVITrO&?X z5h3O8t}Xy?FPZCl5=zZQXs^H(i{khQP&6nwZa9DBN&|#B;4aGw05uS9aooZMc2IeE z1@!<>o|B-Zs5wu^E%`C(cfv12i0DR7IcI-6snK6FZeXAi;cG6fNN;k0gN(%uu2&vvI zRa1y&O6El~-Z;aynXqXW>)$$zqo6Z=w0RogTTg2TRJZB}B?ZcZ(Fy@4J_Qxnu^^>w z?zhX>`Ony1MRb%4$x84xPEeW)VX4?(PDg&Bl-LeLdtjQO5j_Fp=a|<$>32YG>#=4V!tty=B@h+;kL&bu6F^}h(hWnUcg)GRgsH{igUo$$sdjaRp;y-+qHFr$Pp z+P-Jgsd10`-bkkdM3(^1PQCNnxYT2B_ps*UJkAqtLm|U*F(AR#Yr68qYU9pB752fq z-@9oU2OMS|rPKgkW036(hgP?h&e11ZpnbWyB78X*2U)@8f_9KtK*GiTY_K<3CAd*# z9ktsocxVA$6j!K)Kh6_2A{ECLs|r+?eHr1U6|v}(;qZEigrxc#{G!~TkO>u{6GqS|6*OqKxD zAzp!YsI)Th?rzx5z1~05Z;t;e`FH|2%z_5<9xZzsl)$6tvoI9HT}y_X?{)zHW*6TW zK6Q8*0Nsq}HdAPEaOST)+=Z6g^ES?G*1DKoDvRPm$r@6=Z|T4hW_SQCW%KzF^@v$~ z=Bh?G&BT1JP_BV|5+RuYx+WzRL~IX~2oBujI;}m9JIxkG>pyk4xOK2=J zzR6$u1G%-eK(gCfCuAD~jyoPxO2+$k%boyZfpq{a%Bv9XsHJ28P-brPGW=8U`+yD( zIiU$cByPRkggU`6__TJ=TtOMfc8?ib)Oi6cT~`dLOm(hN_7o zgKuhojhJ|B33cKobM+q4=9U*ZJ}&@AKLV0KFT1qc1wN@OSP`l_StHXpSSk5W?VP9+PLHYU0-A4|BEBPUHX^~3s?z9{`2&oTAekw? z;7uzT50N7Rwr+rVa{hTn1%n#HO|YRJ!9w&zq|n#Z!JsozOfz?T z6_x=6!UAG%w~8K)LAw)6u$PF>XGO0~2XtJ6F(`CMewLHoB%Y45-pcV7Z~4K=O?N6YOX=`^(vQU61n_YOIE?{g4}$)8 zUI?wYOeb#HAAV1vZUD2FZk9`7?Qla9NiJ?bCiYVqSXCuG1Dd)AZ-3B#wAKb~vZk2vN)MtT7*?l;a7h{NCgY?j{e zj~gq(cU)C8gb>NEhL?Ty;eHnlnW;9#paPlUku zB|^-2VB@vjTyC~uK!YlzaZ_ke+4}B+bX&s4uC)MKaNs8Zt0_UaBZ1!9fcUnj1D_`Z zsBmq<<$fi;ag!w9isab2l-m?Zy{G|~_Bp>3mVUbJTx1D8|J$^=u2I5|eZQeY&9kUb zB!WeDmsg?z;snq^&PcJfRloqP2)U2Jd>mA1jd!K~qT2mMidg z4(vwPD&ZDKeR=l5nv(&Z-F8!0BYVC#2fohtkDwxf=NU`wpbuJq_{Qm(S)KX!V0LNs z_uh6=mZu=1s7OEJOK_2(s_e(69*t8`WCILI zBC!BB6=BLilwxctCwe(b=0H8(iZ)<&qnt)^JDN6U3LisG{mYiS1I8dM@0g95xR(Gu z>3z(WXN!J#RU^=XPS{lAi-lCZOAu0AH48cP?Yc~7-LvgX3Y-l=%|@(w+gaGXPDJNVNI?vW#Pu zpDpo*ezW53IOuUbWo2gtWR!i=j}*g0Fg(Tx#83V@z$*X~yJ06OnVHOX&dC3b2}c8kfc&Ld^Q%e=xKL3|4j2j^@q^ABpou7Txq8GwbPyO0K0 z`b_F%P`aZEH1AL3{73+<{Zl4`4#`vyfZq1v%2e61QB*85Tbq6CfHxD{dvzn=9+b!- zgpZ~K@g+OPm4g8gUdEJswsYm9)|RPV<4W2l(PC>i$LS8#)Ezh1Orxz`L7WNsFKpK%4_nzRea<;ZV1ED&0BU9J z*bKwE5t2P)5s3@x-$V7MtKl^LoUs??0vvB> z91`7l?T>B&QaRRd(ZK6esb;UE&gcD`1;vO2RAT@zJN0SM9I)(Y(&&38T7BpG-V;5M z-$bm%p9dejr*eyzsLe$8Nf1;&g+y6seh>k17^eppj@S|i!`>LUC&n*mKN{-S)6xG| zCiHtTTuRMHT6UHbwQyd$f`F&yEQtYLrlQWK1d0Mw>i#W6%>8>3;cp#?sK59~01LZS z=SZ`&_PMO{uvsU4_1Lw7ju`=Z{Gt^0aE>j24utUv>|&gujR6+_w(k=q*hR5Zts#|D2mzd+sx;!O`r6w%kT887BDKmh_A@&b>_7o zTrQsD6TlTnOUVE;AKy`1<4noIYDr*CCH|6y{bvePl;8rAGoq8Yr=jdjjkKC%yQA?l z{Y!Of9h);xN${nNL~d!L8@YJ`nG>96 z2$%uFpzU9 zO(4wOubANCz%t@!Fo?(z1M&SODKTH*Ep~l18PFz~zqWpn*Q9!2Ct3}A0F?ogSPd!d zDg>?(4bOgwAfZqwqyjf8@~knAV#*d8PGU(X7-fSf_t_4df}OB#gAV{W@pW+P{@fQt zxrn4u7f`|#ZlGP&tI3c>^!#g*wts_jpsBQUQFCO!ooPd@F8}~lZJX4}3dK zl~aObz~&xxQIf5Zq~de2%vP?Wn-3i_(T{^#HZi9_Q=I{c_G6}p*sIV6Eh9cTo9`_* zoMubl64L2#b}i%3!dK$yfa%>WbMc#*4azVsVj2J-1d3S%I%f6@dM@G$B`SuW4FQXO z)Vzq7=CD(ir?a7P$PG4TDT_d+(;?u-{~_8?=o2|X6F;Wo52CmA z+p{hC7wM2jyw`LRXxR@=JaL^MZ(#vik+q#HH1O(}?U_S1mQhBN^t$)e$&-{k-?w^1BaQZme~_^wZWsGBQ9)KuKfXynpz-@#l= zL6QKJYN_qK7aeD=I7ppCPdhMz$M{J&i$B_ep1^Yl>DKg=_4F7YHHwap3@`V5AS?kj z#Bf_=n`gVc(ovcc!0QLwyqR>-a8-nD1w;adhYLZ2VoF$3{3ISZ5PKro|3U!23SmNR zEqNR(EaL*z&Y~;<1~kBXm1%hZl}WP)qvd{fqGJ>C(U0dBI11x<3oig?47)@}&V=o9 zAsdXe@D)5xFdx6i(ipCSaC=_D(zQ;oqSI-!ihcra=ft9}BL@KP_{?)sZ~jE?3*u43 zZJPT*xuoH9>2P1o_`|Hk&*fl#K3_UV_UYlW4Xzu<=h*-l9|+Mx0?WX{!{o$CNmk5Z zsUwa%UFmot#^xcF+Q7k-Xk=>w;es%#xe90ER<{7(VmL%pOi_ZtP);BA5zV}k+^~m#qwQvKqc-Nqy zQj)D$aFP|B+4T>r!eM7O+onbjd~yNN>69eT?f20?ZD3wU(Ojn|SWdcQv=J0qrB_uf z2wLat+0UnLc)Z@7FtVT7fdc`U!F!lvgZrb+fdO#y>wxqr@%vjXD}bxB7DBmP*+MNB z@i|aGIj|sy>wn`w&{Y9H6?TERHJwvG>;HkXR zJNcYvYx@n8xqATEkpa3{dBb44v*}3Lh>|@iEggb<%+B!KG5#gOj-`+EsmwT(kLSbC zVS%8x63hUnyCMQ3OxVJQGvZB%gnaSi7Ot8Z!pwZ$o1ZO%-gF`xAc8wTN_brKh)9q3 zU=0AOlV}nb9hJ+RM_t5MBUsiUGz0dtW~`h-3NUzWN(`ALp1_O%Jc{xz5*11kr33)E zhHp!QI%0I(3mKU3YEBi*M)ii&XE<$TrJRtg`>BVr;xNzax{WWMyma}ECn1sjJkFfbGP)niUDYrQ2M`1N@L=YvBM~lE+UQuh;7T;PF8m9-HFo z1OuIK0QDd>X6F^=ZhD#ymegyCyJJ(?)J4<7KLi1?Ac^Q`^1bhtrfZ+<=N&yy)USw) zru;X|x>2Qp6{ilDWzs)5rd0U6y zl%fU~VS67ry!LdaLs4}t601J)xlexQOfO_;g zn@)@(pKf-geV$6F@%wLT1^ob^y;67hn(PXGs`?pvZ_cBv!dt&7$(tz${YgLVOyl}n zi{Xi)y)b!Sr|kaDkTL*)G#yM>b1N&e3wEM4&D8*Y{NnLvn#Sb@%R7`5VC~ohX*%xbIqWg- zpgn1|3m5_C$1@He)^KJ49Yd1z)&kZ?PignIDf)Z=?Om1|QB?q6ZK_=_^96uV`nCst zotyzoDQkd28tznG~=bxhc(+{w7-qaKHlO(EDjfy(~m|y|C zG3k?=D>;?!)v&mTuWmhDA8=U99mj6@!K$SejbnNpQU4*e2t2ir++&9mE>;0EC-JCR z{t)7i`+YUr6xQ`Mdp_?w8`z0Q8Uaid4WG=6Mjj@uz2?bm*;QN&1V90do-9RNc*xY& z4-CMiq2%0-LdEE1)RO>qo^3~?l@weks7)GmDWldvEVw%E?w9}?CQeXTl2BdVI?s8a zd@$-9zs0gy3`f>a4a$6$c*Wuka{r(Ypl%p6CZ2e$^nd}aMzp_-p;%y|Q4A)o=KY|7 z7p54z?+5(WSseDQb$Yu#cdq|A}q;nJa=p*%mb||KeqO^F zFmR%U1F$}tjhO)Hs_0=IuH}q5$5)UO*>!w`${3&{2Ru?DxM_dnT2;WeD)qO8b&Xny znHfe@kEH=IG`NDL%9o5F?~KB^I-dAiQoe~PUxCtTFmX3fl0@0mZcjhn+PA_RXU!|! zH)H|H3c%XaShA|HfCsr|X?e)%)-s}cH(Q#&&HUtAba_7ur}-(0R}MQGKJhzzCZqt@ zoMzmZ**H$El=q&@1t>q$)WybeIX#!67SJ~7wwN+s63KjXv>yh0{AIDz%f$c-Y8oS2 z?>>$4<@N;g(2XD9qciPoKAZ~iWBHI$W1)eVG9a63%=1YNGsn7&+n3i z-50Mugj>lPTmF*6;q&#uiEFdR9C<>>1snnO_oX4w^Hy7>5pj64y%PI~(jP}c9Mic? z$bBS=5s4BB;PHBtGvdY`VOjSpd8YvPW5-lcAW)_tGs&QLonDasCZiCN>eGgWgdN76 zyRWqPc;rM`6R5ASj;mTaM{@wTd|tBCJW9d(Rcmfp)ZKEl(J2Tjhg2@I=Ib9BPuTXz z!tp%}Qif8-s_$Pp^i2SN8!+So^4Bra*Te`%nX0pdeNNx|SH}nidh?DN3+m>ZouSv~ zK54s_i}4lo0=K) zz+5Us{~Q3nSK%g1Ue3>1E`a2fI%nggg>T0wUtde?X%>u0gduillPI%N%>|KF7JEJv z3NZmgJv=Y>(K*chMEMdCe<`b0VBJUOj~D(!#_$8rs9Jj;;&ozcFhC;B$7KC+h*SYF zhdc-DWIKl(@ihownre0lLjB9+X5;m?-s-#XAV8mwY9D&HUubwnZ}g&~*_8lQzBxd& zeUt6rnfn?3c-F5j!n9{kdCVo|BELG1C&OM7=!No}HGHSc%`>kc9034_53DjqKv z_-#7~2&v0^#?q`S(1$K(nJU1@taVF;q`dVW_)Ii2JLx9ub4>vWE!WPDi?TahBOgps zFGFfSdjJDQ4TYqVvDAOVM{0ega8J35|8Jo6kURlB3s&XP;X! zIG_E$De@q5qR!Xm^z2o+Ya&YJnN!!|j#&U@0Z(&n36^9K=r*xdd@jzvdH>lQdkUfY zm>v43N`*u+Mp(=V#>p@5@f-+zOUD4)dRpmrSLJCF7St}0H>eJ>2QBJ1wPm53i>gNV z4)fH>|2>F~X}K73$8LJ-FN*XudU+D$U3T*pzy#Lv)Fxi=e(M1N2>q1Bg(5d zvQ_I4N_K7s@Fw);7_9(!-UnqNhGK!3>?00|OIhul2Aa^JC%^vwFlOQsR(?&bfvi1? zOft)m($TyoPdWhZ>2lc3OHYu7E!<3M0kpRfb9p#gtP+}_L+}x20fY$=AwJ|NQq0|h zDRr<`y&nNo8Sc+Agt$<$&EB-&CQ7_zIC3!0mFcT&p{4aO;7aG3F8G{yaO)XR};t!W#ri}=yQew9(h$_-l?;*{?WV3fi*mgjnn{$ z#f-HFs90SWcek97V;V&K*gR33Z~1gN!Edt)M4)0=!$H8l-t`ec7ikl3z_^dGhIoYM)NU#?-8S#jf^8Gs}NLT?9pRYkLG$zNE z4W%Krc5mio+^Cc^mpm*%KvG;=+wivkJ%A&AHSdsOQhIwNr&j=?A4S>n-r^yQK=yPUw`&;CpxM_d8y6@Rqw!F9%0)L$b}%`mcpjUt&M zP(CG6ttA(0iw>|TIWv+0_v|rw^GbBIjXwZA)G)_XD;9t+?a-GcGfPZWnn&FW(q1Q| z&-0iai%8@lo@s)_k>Kp2f#@ zbnyUJK&ZbEuDbJ58^$9z9`1Mnd)G?-Ma^0S&^*F1cqVv8HGky4S6l`tI68*LZ_fdM zM6?EgVao~JHebFM+)h+1y#BJI>Bb=%Lz>-TM2Xj_rXteDj@ z;Rb>aiICdKuJkbg^gYEs1>+|1!d>m2_7mLXFM(iVzn%sb&DmnN{46Mn9^M=nrvToPEIh%<@>77oNmUTc3<&P}@!=_VD z@G8q9P5)^HUKql1U#Dt&x}IO?gbvzr8b5wP{?`I&myq&5G|fS z_Gi1yO%&b@PNS8snYYwWeP-f;m}h56ExxD$5%~`Af|;na12E*qQ;DgzF&)E^A!0{DCe5&N*So}cu+zsJ`S_|u$ z*N6)A#z~}niRE|zcn-v+?N8UPOWmJ=T}pR|CSCpPo%mCr!&RpE^34!&w)bHz1iOZW z)GDdvCaM$w1|kX3ZKL2|7^urdJ^;z;&G-}eKfq-jI3A5pyAREJ1JI_Lx7W&#LD)kL zj;d(^c`8XOxAulFI9^wkY)MV*)-}#}=!6x;1@NT7=kinaX$H#*Kp16FBNBnmdo6yFf33f9cp72&L!nE-wFIeL1AAhGf()MkN_kjA z4_YY=GtsL!eCqn%{+B=JJ%LiK{VasCbtVzAhiHFWB$!`9otVge$X?V~P~;xcTZ@GUM2lr8!GaFJ_EV*# zjJP(&CU^R>lc;g3O5Bxk4(q*mrdpe+h+lR9Nt2PN$i_MTsPc!N_sx`>5y{6h%4-hM zj4&pr^IRMCn)svu>3bAf044~-bx-wRQNhTXmRTVN#{rN&^`^0@GT1+$ zB&oe1({Ct9$PJ3W3&yfGn_L7tNPY|pF?(_WPDXD)nJ*hsJ;9r-w38x& zhqu_3pY1*X|87rv8_0RKX^9?&Q@qn}H6Q+rs)T>lroW7$VRx9;aC(%wd%B!OtqPSg zQ^_^}Rg0Y*s1~>Y_L(O*w`U3_1U`k~Vsg3hEW<(rl-ZiFNWe1GeDmLAg*r025m|Kr z!)hW5rOUmK2Q}%fHOJ)`i-Ie zxfeTlq~;V-o%&>)>nEWBq*{YU$Jdleg8sQ3`{rWT`L!`}ye({(h6z zm~R!pd88=y!W&Sl;@-s5#pQl>x`QQHiei{PS@CWd_*%A24`f6EJNx#^2v-eB@jw2H z&a61&;ot+S(N5xqA znFZzvt5`@@6aOOe`t`#R(~!Hp#wdIuY+nXgF!YK0#LK`Y;Wk&gNM)zg3iBI}f@U)8ap z4ZG$nSt-H=#4HSD``+nhB-~G}AF(F^gRUMbtNYXaH6KoezSGD@6Obu{A$shk`cx4> z8sa=qYL%s74&lWH7j~3gb@q?}*$bI$Bhoxo7Yj}yBv+#lU)A{SZH}fQ+UY})j#~a; zK>43~3^RfSplj+Fy)_&GqLCFm+=d3%h;z38DM^eWoek_H(dsc$Gq{dq3pjbnFqsv8 zpZS_fn1WKKLjGR>O1H#TNgy+Mz^IPcWf(^8^b#QSI?cbril_LcjJv65Y?d$Aw_QmR z!)mV7&vw56Wq62KBf}%a9J|1Gt_wTsxW~d=9dG&!vf!Zm`^&L5u=l-82~hB?Jhp#x z#gdi)5=6-pW`$}XZ&T$`tooQf3S*B{1K!7{lUQrlmSy9@wsYN$KJ}q6X8Wr zhQ~0&tI+RVb;OYy9!SFxP;q+&ZUd&sd`ZFGaJhukd^gSfFydsmDT22EK8|RzZ?9;C z-EKd2c7scyCEk<6HEH@zk8N+Co_Qse)Jgu3TutMBXZ3t8|Zt+4UVz# zs0h=jWR(}zrH#A4FtzDCK8lvfSh4PF)O0D%m0>~v)ZYvyWqrZ=@a`nZx=H%Ofozi5 zb#QZ4c~}}^bk^o{krQ}gB>wPv17FlWUNcbuINZ#}jOxjeh8{Ln`u9CU1sdktowhFA zCSJ>BWk%F$rUSF+|R3@ARMCU{Rj~b{DDoM$Ast@~3z<-UufpkdMoVp~uPW{Fy zSv(6KRyHO{oQ^3nJkDBkRE^94bD_#C>Sw#*VEqp62}n4?sG($bQ)TAis*dZ z@SQzQPs~99l*D0(Pi0z;b_CB$2ov1HRvr5mPWn-@NWemU>)}K{0?cvAw?x`P7Pr4k zF#|XNaQ4St5V_Am_q@FP&u~JbH5R?05>P0#e6B93l3s67k;+qm775>Iw|&(6RvkeB z9I}$rw9lZ-7zYwqcTcF`GdQ*(;G2`q1i)x$vZG8w!8rQg{Q zQcY(}+&>Bf{+AVYEOhv6wrZxkW~ag4-J3`C4R0~0Mn(0jH{s;gr6o;&tYl+WHXoH8%8Tj_h-iFU!)-4;p6bs}D-9gkiwuzNj`cMH@666W0mP{7MOm znfaCQ-T?+@omqdj__yhD)xjjv)xkahZfmZ4rerL&aH~{N&djOTG75xX?w3y05BUS~ zSN^U|lS$}i%l2Q#qThC)uKRKUdXTVWL>%f(bL7OeiNkPJJIC#oo(F=K@EBAFRbC)i z*i0kZ9P55oWocdwz%XI~mrPYFm>*edUNr<@&R7_MZpT|n{7-CYZ*o!O_Aq>xyO$Q) z?Nq80|4L2+k{AB~eZ{YB2SN3NQ#=A15G)c@SZ6iwWmyIFyuv@NrfaKEKqqw;9*GIO zx|U`wc1KeHn!KNA(|u%E$LO2P9J$h{?UFtdC2`XzlDftniy3Ubgv6B52v5W&J51BG zeNa~b5WdRn6xDm)klvj+zxOMvMt;@n?uhoZ%vhzO9;E0A>0P*ISZPx9(Rn#f3qDl= z?Hbrv`KgwtRt)_H5ws-nj&YdLSbZ+U7(0Xv(GW~4HslUOsWVM$av~h5$2xTYFr@SW zJQ=iKkgp_V8m8WB3KU|9@{H}w7!^6gt65(DiTN7 z7?Ok8&2?}P)_V2Jq7V+X>Y#K3Jq}A8Uz|Fzko+T zI_$k(yz{C(M!tO%HtUux^A^1kr=V^D5GgQKe&j4~axyWa=OzL=ROa40Kn-cW@oW+H z&eY|11?nd~jGFqA{r|1113D)GY`m@?w|=p&N04^GFTTU>WeZ8&%S%Q`#6+&SjKrAe zXwkS;)NRSs!+g`mFaweSrJqd4{4RSO&o9PUAc1F=eO2d zA<$Xg{{Gh~7yK6iGz7|1k~ZO#O%~V2*alE7jf}MQ2lJu{EwOqQF+z8obpPQ`V5_lwU~$2N!)968IL!x%tbivw zqnz~sSB!Ytj>Uj4;_4xNqUXTjq%luY`M)>Ym4W%CjxnK)P^0+~$aaATepW% z!ILw^<4Aa#h-?qe1k94wL!7pNst*Qr+l>R!zAzJ^RnxGo@L zqfM%7ekkaE>z^_kPh>{s$7^&JMm@gEm)v|xTqYFjc`<+iqq|*=qZ-?YJ;yfO1CB&| zRZ35;KKq>P>-4`WcAzKt3}8e%n|$Kr<>L2&tt{#@mCJZOQP=^3s#$hQ7Fcj3EKF z*CN%9ku`YN1(f39qLGyV?*j+MYnpcmZ8;^5C%8hLSa|PiS9^c5@RLMK)}B?Av*xo?*tS_1=U53{~X)&N1e^+~!FX)jPsTZh}MvEzk=6 z|3d?sVZY-meadqRgz}qvoJ)#nAEP`0>^;m*Hna{d_)su-h^=$Gqt&+gmN?V!Fl|Y# zm(Gb`S-$zL_fAWf^6U`GkAZLjqs&ULstJGQhN_d~J9DB{gQ}TgO#Z$W%}%BDqWglq za(@3u-Q;XD!msro-?lWm_T#uZIFg^3+ABj)#uZ#&%>$N)89 zFR~i|4CU=PkW|Cv4MY0nbKdp#Ptc$^=KasLXcnjBAa9FhGKc_#c8WYsB9H+TzX7KJ zEEuT)W!C`K;rtN6g+c6l9N;4qNiRL7TTT{|gg!OI!8wuM#%vHYc%`sDM zFzsO0$%@g=7k;iwQrGcx_39XM{*CQr6_l0DJ@jfQPOc>YE7!DmSdU*LtdM29&LHyU zftK?z<{3+4t{}&@4N`Cm!vj?KxBqZ#y*YD*u3zZ@kKI>8NY{GdPY zkK~u>qke(}w!D`iJvBlLdL$SLS5Mgh@SAy>Y#l>E_k=?^uQnViVrfTkK{X3jr%QukewlPdm|-!`@X)f?KrBLOc*M+z#f_zyln(yj)~PaiTuN+T-Gp zE6e8^C>9R^sK-+sj-~+xR?jnL?!0>EZY9O{##+8W9{aoov;F?ewEDV-U$A3sM!ynl zhdIIkY`1<GXMx=?QaPa&8BWJ@~$ zdJl($MLDR6unB!Scx+Zqnr! zI#R*{G*%kpg9D{=;5$eY;D~I&l$w^!08Dg+3(eX8J8&f;<#t8^>4I^@H`>2?zU>mb zn85aj3eQ~%)Enfw(%jvpx8sTVoiAA8^j+eYwH5yvyo64Y{Qd#;Sp_qvstzCIl{wG5m%~~-ft3AQM23_FLZ*Ir0!=Ma*8=(Ux%c2y zpDk&0CSTbdYJ+M3D`Lu9QbCHkaiZm=9cu{Rm*@=bb$?n~?O!mHOO`^Y2hxh|1-fd^9=0eEr5tQ)<|b;AA9yGx4Q0$4Py`|H^N zUG0xpMqd~6T~LN6!6|##4`P!1{<3k**?4E{8V@P*(k|+{i_EQ_*sh>Cz&knt9;}up zwpy6%JwHQeSXyQQU zMn6aT>~KqMT_g|4#q`+_0?e1X#3PDu=oI|SU^9>bTYyxn=Lco1m``3{w^?IaXE|r& zE<%gMn25%{T=;co&=$FcT^BX=Xsa&1fiy+{FYijIScLJv^Iyw;7Uo>TILfv3mAiYn zDQ-9?lOF%)IPb?V7V?%_*hXxPnCb=rMn1m-g_x7}NbhRY(c1J9i+rd0?42c@P&))ktrX?}F{NuYN&Vlc#qvfhjhq*CI_LV^U zZ^TdkWv3SI1SxI-Ngz%e=fpW0xIovnAd8vvgA2P*+ZEFlbT8MYx5!}O0pvJ7LsvNT zcZ&(iAvS)wk~ zbT4)E#zory7^ZMO#wBOra7U`Q9M;Ii$dqA9IPg`CUI~8zZ^lePUHUP#MAjbVwc103ZAB~;YHv$NZnG}kVP<@>%l zr>nO{ppfH1@zUxULFDNH<``K4Wd~A^?t%T35E{{@*1&L*8>-U0v9ci9jKkX(ex9=o z9&yMX7%A?Yu>)0UsF~fT^pUmyMg58C| zWrP6#+>}N+sb@C<>oIlfcxaDm&p-8Y@Qj#rxrk;pg|)o^qWRduOaxB5W80{=SumtT z*Ed_xxX3I44UcY}pWI$K8ql4mOdq!$${y*g4EIw_F>E6HFKWa#w5aGGM!*<0SG$m7 zzrJh$Ogn3LVX!Ua3M=8+p7Rp+fn_w9{7|>M*@lWl|KNW4Ppve?n5Vk{&Kw{^h>Rrx zwF}hLT(9k~w5sn|SM|8hc=A5=77TImR&J94_JN5FL`Dg{QlwYd`WNdgaRf*Jn(*S# zg2GE2o{-KTr1Aqzmz5(2eQ(%(oz+-?zi1%1H;|K7D-xKR3#U)IH`Rmz&Zce?hXrvj z=O%0t@7FN=XRzQ^OvLC%9^UA=rG*f3WX`OH>%Yaqe!vm#e_UY!S8@9i60HT~1e^Z9 zZMgO%w%^NU#OO^7ODW%4CzZe}O4DIXeg*|BWm^6@sUAN86$DiQmyRt9Nj6o-&{e`7 zvxzJGXwN3F)(x+W9=Rr5O_fd)fU*7X~Q;0N5XyhmWdRuU!<|_bu#Fqw4PU;n?1)_*oQ=7r@fjDF+ zoGy(g?UJ%M=j!Q7_V*rEZd=L#w7A=a)<@h)FYpWd-Hw+iVx|VDM5(FtY!TfDf0_zJ zM-`jcsJ{1F6HvHz+YMj=C~cp1fAW%$VkFe0GZ~>`SHW$OfA`|k{yw|LDwC4`&t;A8 zIJ$$owi(e*PjnUlW+Ha57S)37o(D!~Z&=JeB3jIN6H~Lv=^nz-Zl(;YKoN5cpY`QN2{P0p4S7 z!3G!sSiEJqyw_~Q2C`JG$oiE}Fh+it7~^KjnsHH^-sibU=Wa=h<^TR9RJ^nuD5<6Z z0R!>j5jF}SK(0<^{*n1n$h_W;J48gH^p3<(7sBBT^2ib9zA$;#`_bb?^mu3h#{F7P zGLwf{*hGe4q>Q5bpxn@YN(qETt83n65str@Lw{PEK;^2lAipFfWDOJmLI$T;aw5p` zT{3Pdn$61Y(HsG5NZiVyy&c+BSk-~;xvR-2NRCH}{2(-t`yamm`tOC3^8<~r#ggLW zNVkq5w5ue28f|ORGF&R_{`-n83eYKw7bEJ5(6i79Mfht0!u=(0=(12gdLnc$jBS>? z+B3FcDuNKG_@AVTBu8DI^`S%Ce~HZPrkI|Hc>kRN!*+@oaQ2e$T`3k464}UBc|ByV z;bqC8Hi>S&ldWdyi#`$6TOB!Y0b}@e(*+R$x}vTn3!mm-K&NCf(OY9=gIG>omERPE zRv*`t$ozkXk`YK<&0Sb|n=JXHQjjhH@6VPYP66)Rw$=n6Yd7Hb?nU%xs7}=#zDhc@ zEO~6X0#57zZzf+B|Mb~9%LZ8iN7L^i?f$xMUj6ALbU%8~I=DEp3ro|bR;{I%qiN!p zSYf-d!xG#Y+_<#$N~-VxjW9rfoE>V@j}lpl3OpPD`9lc!szIlnw8!x6tkx<-2c;}= zS6~6Pb^Q&o*}feC6VA&Ay=dpn$W4&+V(htx0Agb3Y>B@VhiqQ+dW`+?{=Eg^3V8T5+m zE=C*xU?TIcbND^JxNbwO_CHBExbqD=v6<^lyxGhT1ccu8##z_7!`#!;(k@-IMKOi} zH+5EumO8Y+C2ktKBia<@o9TxG(&-qQ%)@_YKnM8bTMOyiteeqvZmOL_y3{`bJ2}ry zb^liJw3}D~=O7vLoE;Jkmg}mFPv}HbsLnufh%v}Vq*vG|T$!Y@M&|?oC8a`Ul>QA^ z&Wyfh?U$lf7!9QTBE6-z*KL=Xd6JqnEk=rom_caLE0&l3tDUR>_+MiK_i<1juq+c% zC)FO3<`2o3SWM(q>=fiO)$g+_Z);%m4+9$OMBiEONZVckW`Y4?7`AnM%4*c*4}oIl zKSxsfGoGN_#3?|S=7+a<1ZujXEAVy5slWvZysRYwxopMgMRMC)DxS9T1XfovtzxIU zawHk-{*w*9;U^egotJPC|`reN!(|B7$AjIoWe`B~Tm?6{u6@GXN z93rG%hDqa*{t$!ke-fPqE40eE6>?FD&nE`=5jDTYeG`O(?x8 zci-Fy-QUy{7>(W)5ll`29!J~)*H^nWc~taxK`g^=iScRg*sf=vsJyHq`7qy4FLec-O7j1kek$RUjk zQBZTQS|>qX9^Q!nJPn7@Q$@X) z^Dk<+h~-d*O_)t!bgo1fWKE4#PnQ|ItHRlLl2l%Qobpx$J0h6@Csx+Agm8k3WRCK7 zLaLhx(3bRD(ym76Q=NcHIyvqWy|No_#p3A;ud<3icwR67;G2>@pr+xe)Rc=2JnF<@ zfXRzX?WC)tF;fRv$qgJWRMU}>w9aC_GbE5rmzfgCMWY<<{zI0pgo5Xkm>2UQ;VKe$*m)X%~Kyt6i{K!g$tipIT3$DBwjvOj`R$9<2 z5c%Km#jyeaC&6(m8?9Fe=pW`|KeF7V(X^@VeFhNBS)c!C3niq1@w3X`h%kgOW`gY4 zgDr3Y9)mZuspQz>RRSZ?F0Y?rZ46;?#r%^2tIK-@_l1;e>C+dP7E5o;asN*m0JVPr zNH>ASnHsS6(nAsVGqpGd4y97e3aXoZ!BM#9xUw}KLKsCzrtG$5=SgfU2}S||4KKm3 zXm~6rIlnW}w zJd9J0OTp$9KKwJ848nW5xv`ALRyQ;U0md4#a!?_CtduNi4=e!z6kW!-0DPzkL7>*uLv`l1A+3UF|nDJDC4n7kBv+0HL=Cu&3Tx|2f)9H4E?T3Ah z;5&2`SjP85oFwrv1*aNxyW2?Di zTw~DaoYN5x0?42$Sj#8hjg|=Re0O*O3wu4H1&gXF;izhCe;P5e$iLTVU(b%0Nj$m{pZFInZ?5){(y-Q#-vZ{&NKBu`H^Kf~-U* zMk#K2ST1*JdN+Lln87#a7n<%RqKyeQjC8h}@#i$ufja^S9vKok^e5NX)eO^F`y+Xx;Uu0a|l9!T-SrBh=ut#cue^R8UpI zxVLTrOaP^NS_t^iHJT6Iv;wMdGebXv{fO`J%l^;VFJK(}Mh$1T(eu@4mWQgvv6OQT=k%N_$*M`U;Ld)k->23?53JpVFtJVJ^KGswAoZm>oSL-^G*xmDCGe zRXro)GZmRm%S z=HV~+UttpAr!ZylGOp@DJwy$Rlil-44=88%H#&fo!=?QImvAU__d+Dm&Q5wSd4##liHoP4g zY8uy6E4axFApQREiIf?eh3QyX;4TaRTSlMYPDsPI5k;{c3a-`=x6?PDF6}0Z;Bmke z_wl#t7NN*+b2mtT2rhGem$)tfjXhat_f^W(x)$j;LxA+&=qqJXV*H-Q77$x!Fi{C% zK~%YUQC*q609nHzY(Yi=&NF%&eO=GF3)U@GQt2Y*P2;>#&V>6DG`2#G z%8)StHL~Ua1ugRaImG(t(84LkyIM%`3Tc8sTA~>O()DR(S}H&lKc009)JgG}MWinP zs6S!=LrtzO#kzV5jJRQB+1ds~(;Osvjgk}MvJS+0r{>uLJ1C|q0-EdsyrORQpk0dq z+WaN1#C6z7h3jV5N*dk>F<6Yj4S91<83+r?U}!Lxg~Y)3iW_Wd!;i>2)x4DfFW~rS z&fbo&)|p!9!t8~cpwGS50Fsg7CjfPv929G0GHcqo=_wZxTAY&&g?3H=SKw#8IQ=8f zEEo#bOJiP&H1R*W0J2(T4Kp{7bBMxk*ecH8vJycVjQQj?wJBTyFnHgy-Z}^kTKCR( zQbc^%YU+|%mK@zxcCC-r+=_Bvrb zQLC1Wq9+tN1>b>P+{eFP>d3yF6#&Ue29Vn3!2>V=o`o)X@f`#z8s>B2IF~qj8igaR zGZKcidCqJi`PBW{3T~i(7xQfmbr@?9J^!2mfT!9;NF$B7xQf-3ADzq)kHD=DRknKU zr)mfagU1~$ld1$(f!|m#w!79Vs130IT-B`)GfxJpuy6lXZI#^jJSAG-{Q~+2i2E}< zMx3O+lyY#&f;K-UfFkKPnktR~>DE*zl?QxPEM2}jOR896Sv&6DIR=1G+>o@aLk+BE zyaXaZt&7k^)Gw;X1kMiWP0R%`Le?~w@iXPF zJqRy&qE`Bv5I%_jHiNl4HVn`WV5CVw&WB))-Xn0=4PWY=ucYYE0O9TTau(pDt*4be zfY+rg-^4ut!8++v>0+GggsNlEGF&P%WfMq|B-CCh7#+qBt)V3uMlpy`t$B?$(us1` z!dL?UWE=-7mECvTrpeyH3H>$eCuFo}>6<}|LUwt;YN4ut}@O5p^egB z#eYIrgxi7%9i^xNGu$skyXDRE-vS2!x~`hud1%KI=1P^^e#O(xWu03fW#@ z*?J^+DSo0pNgyjv$qwlNWj7VG@)*H-f;fYCZDuPs>i(KHl5;jx&=#ljWUlYIz<8x* zJ_=GP(H4O@!56Lo7DPgX(B_DyuhoIiU9DqJ6*+3r@XFKmUdvuz_~Iyp9sbQT`Hfa|s7yQq8(>!(a7 zF$h*U#wXOe)@9QBmz(GGegzZ(=@mhS5D@;A)mV@2X1Vf3okirfA#u%mziflHtZ*>A z5?kr+y!_<38LdN5mFPAA)NOw4jjh7n2?&lxtu3IQ8Ba~l4uR;$RQ^XO^&XkXUw}$C zNwFv~2v&rcX9x!XUk=t6g6Xeq8HWh3hDrRf?5n5JxZAn1bj2~4Gilz}KK{n+Z*nuT z>o#v$f6_kz6N`XhE(UY_%$IEFwq>|ISga^mSEWcA%qqg z#tP~jKxoN8EE-#2U7IMxC((e({v-Hm67_R38&l?%G|Cc2!B4cyH?3d*^lnbVC(-pP zV$=W15=4L4-nuVUrwmox3ByLupfdL(s|a~H!=B_|!Z}RFj=ib@Gx(=;uo-HOM^A-4 zyHT87G1}KdkN<~Y8zeT(1fgy6klyT{Qwsg|nr7*&58s0TZEC0KFiC>?Hjt}f$z=Q< zccNK_zaJL}8&h$vsEXyZGeU~u_J=j(X+g)KHFNJoOE{>>btZu=WNw`C`I9 zMT1b-IeLmL_^_ur>B7SkeCVbCD!0j|U9kywr3D}`hG=JsXSr74NFxt+*sbmb@ zXd?!L1`eeLn_~BBiVxNRRC^$_@f?}jrm8X%2j->|0%dTT`73D~*mgEj>l0JhVCQ1^ zMO-%+=(+r()BRuop%ieJcPz)B5*sYx-}K~pV4CO#Trh>w#vioo9BYMwm;V5NzF){+=Pdl2rUfqijWyXxq1hZ9{{GR5i>q?E zU$mY8*Y=w2TJ#i`duxchj|P5AZzpWDwR z6r@nZ%$F%4mKKlosG@<*C%2^P8Jn-c(o-U*Rp1$VZ9yT6EfRO*X+hTj5B@Iy`R!;e zP(001%*#`c;wm^MIo}qC6nib}JkbAnK5L|dC26etWCf^r{8yO(w-p#rCF-o_1JFD` z8R5`1RxL4JaGw*B1jPj@KW`uF#^C~I#WogB*%i}=(0{xDepflLu-m~couMgO7gVRV z|6^R8Mg(`~kJf{H#VNg>m+Hqq>s8pgC*el!(M3f8in$V#M)%E^u$;sWx~Iz`JV|_g z{-}eifTCXSQ)K(Cf-qOKHbf2yUIRMP*s7}mu3X+9v@r6f!Z4ZR$B0@t7zV`IU#QDU z8PaBk2(#4ZcHx*wbqgw_-qn3}ZgM~YhriG&QhjEcnW60^_D%b;Mz4{iZO1cLEZD0O zTBhRsJw!`Oa36ikPv9YyrQUG>cyw{v7YfnHiFT@;suyylO>%z$h%`#5`5HK%A>17t zq0^eh`P^k_PbEu8*aa^D*Xi|MVOulorXryk|AYLh?dn|xlbSUb-V#E?Y}m30LBnvp zJbO;_%?V6xxqrL>Y3y9qTJjFx{*!q^dvqe#c$E(AHo@~v)1PBv+W)$gYu~9vKLTP| zAZr#*+!WXV3(tK@ycmLeG~I2Sf_%@A{im@h3(s;19cS$VR4yLZRSgSaL_pm_IFoX3 zL-y(b3niZ6KVZ~Y>!~!_%d4snlUh#xzW&CZ#VP!uBY6_6{H|D5Z-=u;0EGMd4K?)u z28)%v#$L5Tx((pY7-U%Tpe_37)}a_irV@JYt$Nq>l7t zOlEDJM4~Tz%0tP361)yM(On&*qT*7%sH+tsWr&s$9G-w@ccKPAw^6kK02W~&G!T0Lf+@JkX-p~Az8Fnop1@hV z&k4Lnbb(Apo|b%pEPQXbD#x(Pa~0aV7(jq`RoqhnD8wG;^}WKkFQvKcgI)W&_xD*- z>9Vj~C!Q~>x83<_C-KP$ymSiS2|kn2Q9KL*>+3M*D^uiRGjoDb60Mi~Q|Lt;0rs={Qb};y zh=N3=0zHN<4)Ax2aG0--=)%|l)_faCaky-}r`R0&V~#mbXaK#a6s&w~DydQ^mlT>n zd<%Rn#<>)1ysDWpQ!&~ArWk#%_f^BXH4WvwF{+9aHKwTDu`kUPZHPHbdS)~9FuQ^f zYB1-Fzz{;7!vrG$mpgxvyh`D~X|YY*?60Eu7E&7~T@+4l2rzl?XIA{W0Uy%|nLGJb z@SqH9OZvY6$LXq*&zdj3ftirVm=pz~7}ZK^hx~4{qcTIqG7V$)5t;0OUdP>^7VelJ zC=}`d>kqDuP*%i(mnzN6atlzN4A|41il~{u@Zg;NVOPMGxYPbCHO+jgf+5D>j4G22E zRp~s|_I}-0wW4^EW%1hPhn$?25SCAN14z!)ik}BCIY4HjP}zggXTQ_{G+3k;TXBu{ ze{r)tjU_5@RkR?YXCCOfgmrCuBfwqYB9x9Vw~vrK3n1gY!0XTeaOa#oNfWYokD%dR zpE9UBjf>^3_zlU_rg)t_@DMy4`G)Ff%i$}Tu5%)nkT3fHC$lxoAg>q4`F zCT1jD4Td4or@sifkW}Z48pkIj43jFSx|XkU$WwL!NRg$N$co}&7tF>Oli5SHNs>!7 z&nGI!;KZaI(ACOKNFn$-3L0mL))V%8`dF#~-hkUiW;q;>HnMRdM!{R4unVojd+lfE z6^@PV{N~ED#!@H=>-8>PYi7g}=Y7%9(gCn@se7oWcw|#-85EP^x6E9lAd-p! zhPrj3{5^|dG-FbFo6q!zR~$H$#C@#R0GuQypw@XM>#WlMg>|7QD+_v%s9tgaX-Irt zw*1UL^VUw`MQ+S|!aCfDEq!hq7n=6SACH3SM@cf%bGWw%EjBK@aX?=IOLG^1aPb#* zoFnn=#%7}TyxM_(LS(SO0+U8h6mfCDEbYdw+3)aTm^Rt|EB#>sgbQ+RMm0|Jbr~(w z1T-TBz2D1;;SpoXgglg)zQkeamO1?Xs1p$LHw@`a@kxvT6*IvoHO~!yG|W%P2*XWc zcjT|D`g7?T;6ot+gr=?>+@xjo6ga(O)?VO?`iu+!AR2Pkxpn)+t%bHQA9;OX9$X7h zicQebo_6Hjhc6*V6t~+9Qh=EQ%Vt?KI>j^rM5=5{LT#D8Urrez)b{Y+L#d`Kt~Zt9 zsPv`L$d_5zijyL<$N9E(_B&!bVze^=n-t5MLCiK~1FB&-( z*xHKfxIf|mec@%zn4f(IVB9P)aOavqHY%0`FtE#aqXJQTbcbqdOw+jAfq^yUPUJ=k zC)uq5oI$+Mc`V!ZKp0lil_x4|#&>MI3tG>n37eClMQz>^z#m^ON4gYlY|8*mK(fCX zIUmZ<0Hv+)%~g7oq3|*b=MW!Qvi7?Q-NdJ3Z+cHtxR)-6-h!-UTR^X+<{4f;>ZE7T z0Mfop1Q}NEcAuwRWBx5vo<`mJ^jV<8Ad3Ff+D5|=R{>SC%$53tl3D@z2gws60QCw9 zth~7TT%rk5%v@`o$1hm%h?L1mew ze+n&nmI5*B7t!#;sjX8y-3QhKi|xq7y|)WN>+X+70GVF)+>O2y=>WE_E@W>BeRWh` zjTwuBg@z1vNoUeMYm^ML1f_3=t<;*#2iit*02<(*Mh6F#GNzC^gfarv+STn2a#XxX zXSTRwC)@Q9;*-YV=5Z(GuFX&@&}8zt0G-HU$!uLbuz^^y40xLEeQ#kq;^6ykVFn3k zMzBl%^V&gCo^7U8`DS?Bk*A;)0JJ8oH(2_{6&adh<@sU{x@N|dQTOgShP3$q4=IGm zk*1>*oh*f(WTN5R@=>K20Jl5L^N|Gsn-qZY;`Yn)KUPGEp;Q~kvzIvXW7yFgcF7gU z)RMwA6#W48{mTqQ0Un@e8n^aE>+*Sje=wUQ1KR9Xzz=e0V<$zCMQ%z!1ScP4wKGH~ z)PO1ABP({F0b{*DIk=KUH*E&?8yw^SY%C8sQ-r@zsVH_DrT5ret$eZI(7wkx8NuZk z1@ng`0OMe9)N*F7&Z56yK7TlK)3!j7Q`530N{sS0`C(Q3e>2Z@TfuKS9^hF@bf~Ad z0HK?)!>cwqv^PEPm-uIgh23R>9-o3oj53W(M@NICF0HoE?==PA4hs)`C z<am=s-bW>0R+YFOl!a*hB;)uLN`2(AORtC z5Bfh)wSlM$5!K%U<7@P%vQEhbG?sR}4Et+=0Pml}f8rje$&tCECvO4q@tYNv5jV#; z1$WJ04VO8=#;wuY05w8h)9D4J0o#cD{51!=LpLuF8-B3@9~)1xIrStA zrIOyvKc2|pI-Z#o$>=r}0Q33TLnl+=3ZfBP#QeO65BNIA28;-8GFRm5gIB+rI~t3- z92v?k>yzK`2jpi`0hz|C*)rsC5j(jNEcOcgBJ|kFxhvr&C}xR>253HuzK=3w$eDjB z)CU6UK(VUo017y#yFv503g-+sjiBD~GQn6=r$vEiR;_@c03OT=nZ(*NK>YL}^SH2S z@nN)L08*)&w-hcjgc6Wi-jr|$xoeWLSNm7FUrZ}y>OtBMa7XJE08vPgTo6)```0>L z06IsX`FW0dp-5W6z)Z@#2VKs(jZl4i5eNR0-c5SNA2CkRwDRx*vjr<_(TQX(0VY0u z9B-EpP3{zq$g-Z4iF4*5;g>nTn0mhji6nBh8#tLHQG{?LS|N>{8gMvu0ZS2RNM|%a zV$rO*Y>Dk76{s2JkXQtd{Pvre(<01#iK5~d_qFi9!gdJ^PoGBvE>b zPUGDjqWI<9x>g_4%y}tu07v(|H#|-xpne!L_v+a_a#T@+KM`fZl=W!_9e?+b@bzlz z=eq2H=koVPCBfFG0dm|}G&SfdkhW_VL-^leC4fT2Ri7a{nVVr7d~t#!hNHO*k3O_1 zl3R;bZ7~=O0IBrZO@&LN@@^hd53XoQd_8X|h;V3^Xd-`>TlVnLjEOUL?Bqz%jxKjB zW7s4107B&uK6f=Sg6y_I4+Gh7rYa|l6k~}*-{5U;L%|*%PLzxLi5lH^?5!ySAZUSL z0Z@N6!fa3_kgr*X5Q7?Rdg|ydd&bvu&jGK3s!2Y7zX+Flu9QzV&T&or%)Ivn04Br1 zX|6%@k;$E%f#s%gn`@wbDvxZb0Kz_Fk$x0xkj@}%Ir7*i}u0cCuJ)F{P4 zus64X%Rpe$0$0fge?Wkek)>7_)7DbUXy zy82q~WEV(3qyOU7ze}G*)eIo*)Fwb}~&o>CN zTmS9|iAtIUmmLYM7uoK)mi2QRnJapO0ZZo2BCp!{RO97b48c1l7>**iM+E`!BcGM@ zeiqJ(uJ!RslTUGBi}Fl#mxI`H0g>^=+BlsmuGd>AhOnc;Pk43(Fd(zh}@8L#zcKRyWFopISe8a(y2uVrXX`C`_t8-7 z08CKmA^-n+Hr$X@Z3I_(gNbPU(}j(^0o1Ot;vejBEpUgSE8OqKenk|;ldSPT0hQZn zvF#qD6g>k~urlStZB)CQ$jahw`{3J&1s#8l-J6ojV~9krfZ9jp$ecO90O~k<^TtVu z<&v+l?TET-AS21buW}t6cJ0K@E1T_TO3mho1ePVbN#O-rO_o{<0AnmE_?{H@)QI}> zG=->$$a&AtApZk}AG0>a-YpV&^3(G4W)O;VR3_Nv(ePE*0G#Ixe?&?mc3E%-AJDs5 zzsrOeCCe!r1*?T-R1x%balMRA)}Gz^ox7X~{1%#d0986;R@ZWR|N2}?Ot(Cpb?H!~ zBDLNagyZVc98V6~G(KDFIH0V*5QDX}aNuus9(1JC%a;1!1$V$P(ooe<3}-u0d8Kp6VQZgD3T(j{)enM9L)-ullk#zv3YnfXUyPxvEKiy z9<>+Pp9}t%ZAEbS0CtVipLT|!Sa2}o)YfUen>?aM#~^R>lXkV)U&FzGlYaCQgzm*+ z48HJ{)!E>B0cmokB1WqFEedes5u#KJ&BZArs=?2~CVvJ8)40F{ch1Yq?_>GHocF}6 zA~_%|0Y+5(X0s*U{1$@wr-IC?WS9*N?VsK6j3)HWz^OP0RUTN4 z0c1}*!qqGUlu3lv33oO*;$gO33T|8~u-wVo!%^NY9#H<>zpm-LXuPDmD3)Mo0ML$A zOX?v!%JxMn%dJr9)r@Mlgwn1sQh}RlYva1B#$Vo3_Z97p>lKBW=vN>X0F0IrS91Jc zn^OWk0svP9_bqR&C4-!gxb6}Geg&6A)eWL;hZ-an6B#jOcBI890K-J{`e;;KJ&wZbLF@0c;~mTC&-6va9erG@^iQ`<_k zw?DOh29BHoLo(_N=-B^cx8HIWxnzC_vYMN@ zAQx$X=1rw0>>@%PenEO+0I5^=mDZ$6py??CE|-Fk4o~Hr;$}3Ak`*hVg#xyo|V-cV?F9H4~iEqGVOs~0Ghcg zBgZ3O_PPK$P@?S5{jw2Mli@9PU4=s`lbE%56$%o$e2dmz<8KB#*kEX20G~P*%FE0R z>JPY$f&t^b!u5Q5i zG7He{-@?+Vza-d0hc`?wYZe<&F`s_$&$`z z(z+d#ga)OeUDTiHIsPc$-XbZr*;o>C_PK{i=QOix02I+-&>m~)6(=h;dSuglQJOwn zo;%O6lqrx7TTJcL@ohi)dzowt_3lQ7W3>-O0YtQ=AB%VWFYyKwC$_XDS+P8VzJ2tU!tval}qWH0Iv!cAs&Y%Jv}hHdt;`u(&drOio~JYY}cMt zcqmxN`{Hi(owg>YcjACgEE1Nc0M+NISN@pJrVD>^CJf{%%&v)>-g;Rab@O<>Q@SuB zf%V!Y0){(la+A{KviDed0MwT{OWetQvH3_H5g57J$1Em?bB7c$r@xZNI}RqQPZO7^ zH92|u+LD3J(x0V10IQ|L@27#)5GLLG+s>1QkDnq=2*%K@hd*oQmaQ!DAp66j^!a3> zvi-tpA7kUD0n`j3r90b!kKsJ}6qNvAUl?wOlONZde1P8e>r@N#Bn+z2CiRitwKJNq zLSk$<0q*3>oKxeCH8&UiRwzqB1;*H-iOIi1UQM6lMTZEU+)T6$3+% z0n)o&n*cW-X)m3N^G_88#se-)F#botz_)E)&;S8>93>S9Mv!XgF%k=V$u(#<0kk}Z zjEtcy4@u#S{^tZzW2@h1x1n%$JQDCt?WKcm2jlO4hsLo<5Y@%GQ8nZu03lGv@-zgi zu9Ps0@%3M#9?Kdi8>-(@=p7-|-9cg0u74|wA>_uhhIt*a)d`Lj0l>t>uopdg?^a6E z36i60)!v*BZy?SV4~NvWx-|vMsxQF@Ib}$+AN#3kkVuYF0lnNjLUI*#y-eMH7CYxr zABVXa8!g@}#KANYSvzaYnUATz?!K51w^&tW#drmd0V9`;XTIQt_6;!d+y3}So|rGr zclnom2%otKhSnR%6}JcYO4m%J5E!rLWcEGD0K8177} zQSI@8C3o>z*j@pp1FM+F9KbL^Je+6{87E!$KtjF0I|vD&{Zk3S_#_5)^ka1!1&u?Kf?b_jQFO*};)kRtz)%gcbA*Yq<9IV=4nBUODvfAXszw!h06(&n89F{W9pxU(uI^}KG5Ag3 zjy+1(X;=l=D~`$5fd89yYOiLZGS)lafeUOh0Y6Tr#A2q|&v{g1LL$xc2WxA8(B4LB z+%MYzU0x$MSoI6#N@7X;D9Y; zbILdRTygh%SO753Qi5yHNG-Hu&s_C4P00mI7@Rt@pT+&nDya}A9DeTtujvdSW z01wR!sJxW@b26bZv8Fv{Ou)8ziG4eGQ^Tqw_l&a%3okubse?*DTaAxW1Zuo!0l>H0 z6W8*HGq#Nd*Tf}TzTEv>2Z4p_`D}wxK1J}9!S0Uf(X^DjczhQ#qW z?i9I%yIWOVDch;tweD2Cgr~8)^~M!3pwSI_*Opwpl{*^Rjtc`A;>#cR90S*09x=tX&4n>;LG(qs(L`H)+Xor z`tU

    GTu_y6D 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

    ;iQ8j$e>kU4T{p*St6Yb3UZrhd*#IaO+~H#)baw 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 z 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�QkWr+ed?&RGu;q)Rrg) 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�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Μ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

    = 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 z

    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%0D7Y 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­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⪚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

    2-L(S%li6Zo#PabAlYqHCjMuAhS1x`%2UolBf^? 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�-tpUXG4hT0uC+$i(*Nd?2W*uW`tDw;lO-u-S~ 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

    F1gftMUDaVWx^bYoCx98 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%0AU8Hsva=_R6$W#Nes9yD5cYW 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°V+Gii1oV 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%0A*WErXjbhN$pjQC^KmvTj{)_t! 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�MGMhkJ(Q<>(x*ZX$_aj!tMZ8+JPjvcZm=5?oT!9 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�fB_j7ywch93wq!V3j06X74;T#OHtm7h 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 z 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

    6# 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


    hNt?#n|+$HgFGp*T&*=7b#HRyf1(F2+yS907o) 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 U|HeV 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
    =G(S7#( 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%0AM#*%76PL=}qT5e|MDawgGGV{3vwC2zDjOtC!h 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 z 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 z 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≤2$e8=(@bY=Y7`(b) z5C*(rKp8d2ur#)5@;B%wTazK6v7K}$sy=gV2>}h#eG#AFfx|WbaH}hJ_u|J#k@I>Y z%-5)(3*{DCGAe!>LzSk}2|<2duDmT<69AI>7#XP3;K7Sz@EQMqqkW7T&_}QnNeeA7 z{=JAv!3c;pLG3G?|H_wwwp^<%KmlZ;yT){lOC*KVX>6tD*Wu6l2${$!Zsp}GC&q5x zbwu*9yN7hDnwvAdX&@kR3;|Yap<&=>RC+TrK>WS5yNew?lUs16VG6&UfHJZw3}o$4 zT4^z1J5xv2jvZ+iAOPs#CP!=p47kuiLl4a@j=^O_OX!qP@Us8JtqcH9K(N0k@O7!t zAA{K){ssgPRxqPjjZOeG{E?@o91o+X$ur&?>KrGn&CrcvpK7HILa)Zp>C_T) zfQEUXuROIe6Vw0-6$M}tjL`n8Ebh>2?>4;%*jP(>HO^H+*J223AVj^~)>}}tINqW) za5oUL$EN@T^`%nCqNTrJNfu-quTp)Dr2}<=d5*N^mzzzJajXaI28l6Lu4^eqr1}X0 z=RE+6uosvWw!^vM`qVU?sXMs;?kf#djYyZ$H5M{V$&KRH`LeuvTx!-s4=;JECzb)3 zf9ao&ui>7XwLPK%8vw;&x`~i`$d?*#79`V;_M$TKv1)@6$vhR+*p&52uQLHO4lR@J zw-00)Uquq1B-Z%^wZ+2KiL z6|K~pNC6>>aPB~=FkJXe`tQfGUTg&^G||4d8rM%T4&4)P`n&)yLAR~dyq_S)cE<6FK0Vu>#&;~5uPI}QIiQ_K=#t%|2 zcSP61L_goT&-M|GaGl$_zko#O8Zy;n*^jP})_OB^#1sn6;B+y9^(RQ{?Gu%R@JM16PJ{#Vom~kPRo34c<04?A5h{9+U8yGyIVhbHZs{_ zDZ_U7YRXWGE@c6kK1;VVOpm7A%DiV=Q3q2%IV$bFl?CQZu#sveYj1tx1XSiWRZ^?q<9Cbg%&G2dbcO)N zH$TtIA%EgVxCBxEly6$NArMjY>0}KecxAB^=_ho1v99qk%^Q(UABG|bel7rpk$tW7 zJ$I|$%%`B`1|FkT=~e|Sfg8(!Fd(miEnzNKkqaV4lQB5ojGLXl%~=86F@&WtvI_Hb z{Em+g<**UXcEV+}(D>tZf?hB~I&dp6IfITMI!rvM?kNvQ9=-tCiiacTtfu|o!p)#` zv2yIhnb{ai3)m95fqR(lfQOPHyPyObSjqJ#(6@}fag6~NUMt9h0zL>K@4J^qyopZV z4=ps=kdN*$9sP>a^N?agPBEy!9m7!kO783UPrU#_n(|PfViz|Dp}@gb3Z{P9PKvyH zM?3(%x3dRrkq(dl# z-MRjy*(%A&x|GYpzyd3**=Gm;`>X&~{Sf1`LHfQr_2TU4#bO7n4krSw-$;V84}Ap# z6`O8%2R8bSy=P4N*tBvm52XRh&SE<)Qz5|WaUYSDgKt-*cQBKXo?Z?yLs}2DuVLDl z91wGe*WX@jC&%Rw1X2NqS1tzKda(#j2d1Ax^6Xlp4p&;>RzQSL-eP64Kr6DIk~%$h zqg?(42(Dehps@hSrPp>)vCb+5O9$2p@OqiK5*baaI}*+cH{wwrHlv;yxiS}D{BC3Z zpKHXrHGlwq^u90Bm^Hqnf^O1WEU)T8T5{qZ20f`C-*^EbfxQPt)!nZGvR@;{4ldn3 zJx2f-*L~-pUgp?T^DT8&Hx#QMBuLh{6+Nhy*h0x;AXeN8)YqPO!519t68g>vIDN#v)%PX-7BeRu(rxOD>_XWUna=7{3J z1+^q9FgG(oNV>6^Olm}AVNFp`7arT`6l3p2i2Py6-!lMLWCY8=h7Fl&7DchxiU`Qs zPz>J&4h{R8mUFzZp5_|lH;s)FZUj}9ttM;Fs@?#@*s4y6Ht@@khImmY7F3CGrZD*1 zZxU7;ZUpF>FFc0}jbC+Mk^gY;y#4?#WH$k-`)ElE2fS{$DF#+wZHF}CT)r9qq6|XY zEBs??4;LZn*j86Z(@U`kXy%trgZ=cy4M6OJB)Ko%C9= zGYuia%s@BBKTTZnIS-`o|0 zcdsBG%YvB%Ek0bX?P37t^=T3xCn5#;M`r5W?^*Y*$s6ndS+~?mlB(Ke|BRE`XLyii z$K}{OEjHUX^br7tB3gN|quC`<%gxLy5L?NY4Qcd(@Yad#!j1uXCFPY%S}0Sn0Kx#b z=@_xftr7rKLAFU{>91|p!R6+ys|+>}hT*Yqj6E$kQj0|P17qiYOC3n%F`3cgWt26w zT15b{I40Yajob;R95H1Mk^w!v{c@IrHk3W6ZXA3SVXRMO$7P4eBcna^&(nLCd6fXV z;S`wU{XgIfz{fJR`o6O4&A{e}%bx)Y8VO*d)f{+vLD&v7;`==B%GOfc(a!+&{r8EL zk(kc1O^66hxiu31FDtgI<0z80b>K{fkLY+Wnk{AUqCOma1^OCNlg0qU;UFEyfv}I) zNl+)R)Om}gW#>G0$cY)LUTi&tDLa@}5~{!%EiGsXkos5?PbL7r1RM#B$uBCu>0EAT zw!y!NjG}=nJDhunpzQ={m#7Xx%c?4={a*pcU_AkK34+x&aO9pxs|h&(zB96q z{Ny-P28>7oft{EVq2ZcA%>pX_?sEe3Er4oy!9@W%p1Rw%@+jIlKjYpIpot+d@hw>@ z+hm~-b^sab9KFA=g5=s^TLld4mrEmJG8O;~5-N)*5l!jMyo!ks=1*J#=eY2iY>CrWb05hVeb6%2K-ed(=KU75_Vy#u)nb1qh8Af+4b8(nNP-7S2a z2_bj8gjamonS}MLUlRc-vislLJXh{bJMHqYVP&*u*j($}CXIK>Y%sBnAg%Cv`4-V? zz$W=S6jP@O6Pf`%V{87?WgN~KlV||kJ9DPh0=GiV%&^OVAQBElHXFEj;B7~KqL&?O zG^lYI5b6L!s+ED2ezvN)zF@gXCF7{*b5vdCh2rLz{kk&Z|63&86h^bFKKkopPiTEk zr$zxjN!?x5mzUodU$H=8H-QrcgN<)?>w3lgi6P*C8a!3asXQjx5H~oHup&$^h5evBn(U|FJtFuUnV+tE;TkVokt(_*e83&@g>RTPT5Ah`aA$F`Z*67 zGeN2;{=eNpKTyjS0WbSYoR<$i5ybzn-|AI?Tp=u@r2j#s#yi|pxWoWPFWhZBwtT(w zq-43MJCAyJ@(WTJ)*UG%NhxH}&*oMy-VYM`G!yeU;0HaG$C3erI`i0g_&OyG*V~*C z=2(#o?&H7H@Hw>NgL*+SQJ&P%#Ki?pDl&23-?eJBAPhRn4#TAu}}M?A-HE_ULda8Yt}VR zB%fvMJRh0oxYc&aTTFf2B_!oc>;3>IEKz*C>|i!TJ~4 z9V1>K&wU_s2@r=2D%AkdRKcI}1f$z(7dvBYgaGGZcsqa8$dsDuPQ2qkS^k)$>f$L@;xygzJ-Q7a%Cx@;$I+T^aAZKnGlI3q6 zXJ!FMB1&M(Ic|dQvBFJJbAQNJjT+cVxT+F!5-v>QnJ!VR(xnHftsZ3o^&$mGAX)$p zq1-V9VHZK)@qvzON??2mlAhCpJ)Za-o3%;%jp6rI%mXhU0BXeC7^*2$P&EPIJF|Ip zLjQ}14raxfCq%F#jmnYD!=ZRQK(?4t5)36MW7i!V5IeHJ0V(WV&`AL>?uHIL^zubN zn6RqU;@kqgWZi~>dxxLQa?iU!_>%~i9QkLeLTHhyBPozO?)CsEYu7R%SWHCKxzpOg z?Uit*gbO(gKAb!o58}O^70E}x69WH5C`+=E;2LUABNzZn1Ff(iq~ha}%K-GkvE(-< z-P~0#jvu)1B@Ea)9?!vHb1|fI(9$)3R2p1Hn5qF*lLuv(7ICcTDH!Ht*@Zgjmn96X zR;*!>>L%rjfvezb{EM*URs?o3a1EC8OR5156KnD6_Z0{yJ$|QE$tlOR9|A1Wg4#w_Gx`_Ll+WzKGh+d%GkEMNJ0@*aB+=c`RrGjcSkfk4dzO zbO8nFe+q=j4=*0CpR^YV#5Mu3#i5&e^cHd^tb{oaNpc3>J@8qoFPs@GYW;=*jOa7N z=?0xO68)a=JY$?Ve@Fl*yZ{Cpz0}RAH(dJDCsIM+DZZEVt8NHwf83lW@B(Ra`y^Wb zq5+OWLmyMEQbz#4O2V*82JsM4RO&-yt}~Fix2)U~AvmHE7450|DsvK0J0^a9svt*3 z0}g|iO@jdC>{#bSAWmsu?cy1xgUiZ)YIsH`f=D7}BBRCuCy~gMD7G+)K$<$hL|agT zb;1BZDf6~QaWrAq*c-;uvc`8}cYd!yt{t&|y{ACy;oQd>a_0K_8hSO66aE+i;*+6t^GNEcoMr}AI7`8xq!5cAZmVKQf{u09lFCRNj6 z7RQ|JF@Fj3+7xC@N!V_*#?_Qu>13@*%A48SI$!|d)aWIW6vMyN%)oYwBb{a|_NW+Q ze2CWORL5?}+dt0$r+aZ@aQK657V1tac0&N)3>XRz*g-CS++7zEsvZ@U%%PmtYA1q# z{d5T8MLPYr{=+o3T#a^JgO%=89c2JE{X?!<-p);L2L=A7yt(N8Q~hAa>~-zJ_C!=^ zaI-TfTqL|e5jryR%H$xgl!5_#>PB=Gtv^bOCB`{Vr*#!Y^KPCi9CS=~hIQI#3}STy z#NR1|NN?ExjuySjkx~G6E3ADGlEp2VIt?rHaiG$m#AMRjt)yFCLI*y-w6d|+xYBN> za^EbJ;v!=mGY|mi)M=KM{DQs8A?BK=is}`{Z`Oo&osx6`BTpfh@?&UdVF#0G&cZG zS0V)sjo)91i-MP$9<6|XhTCU;A!C#SozP&W4d)GzGx?+LvG{FbP=_-9f@c9pCOogj z|H5m^e$bJrS(WXO*6(xh7Wz z{odNwfN{DKR!=4H|E;qpkieW~EmlY8pE3a!3M_-;W|?DDPA^`kTQim_Bu{Y=^cMfq zVr7{%_dMdub(9wGNMNwyb_5v$oNEEyI@YwKok#e&I647MnuOm+S8HS0H-i~&a3h9Y zVNflGz!i2CcTN7Q{rh=2#y|jI7p+$pl$9m@(A8A^j7yvKR^R7BKM|fcdlWttm*SH_ zBF()m7|!oo>JT$r)Yt&!fZVM=2v%L;fL;Bjngwa&hOo4Qm_}T{gxRiMwZ)rlD`Q?K zNR1hT56Z9iMSB3h;*#hWx%39TldQ6m1(Y>9enMF|OPnB27-#aK99K^oG&9GlDZHz` zDoP!QD;fYs%@WB(yAW}MTC`?aHRiiUNl(T)fM2Yg-}$F*vg^rG9gso#*eT8LyAs;B zzfb`+PmFCb6k;6{cKM-W8IqX=qH8S%}m=t^NXH4W%J&}k_O{am5`Dr5S=>8t@N zgA%u(vX_erTmaL}fIu|{37uUuB?Z4fo2HXX2&l#X-Tjb5UO=!Ll9=S=hKT_WpaLbt1Upm# zcR_ZU!rtf}ejx)_SoN0j5A8@p&B8R7sGZ7$~S88_>waKbjI z2w`5YOq*hX7=$_2=%K-xZ98|&SCUL99}v{v+E~qt<*X_Fgx# zKK=RwYY0;TT}8jx^)776{WNILoo=pfvLfhPO1c1yn_q6oAQc7@y{|R(-Rf`Qn78tc3*QSgJCrUr*m>qHnll91 zX}bWYQ`AQ321HJ)C%IPrM@!XO-XsBFi6e3%k~{D_NwQ2t&>q1Q3>V4b2wL9VK{^3X z^UD|`7(jJzVScyA0f2Jytd{Q^jfkSmD8$O_cbNFd5yqhk*>Rfxyy`*3l1KrhGgFa; z4fl_J5(y-RMmKD8NfdT(8A$a2$z-r|50}72-)N9=F_R#Z6)U&!RBQkUbb9)&k4*<* z8>3j(q*#)1hV$Vm^j?4G1xK(kgJ0zD5gW=EqvRaz)Kznj77+pVCk&m4_qqCOOgfzf z!Y}*`9AR`NQpQx5f@6K%df_=k@PpqU-m6zCK)Hjlb|e8fcBRAtH6`uSa$y{#(C%JS zzD`=;M-I7Sv|1|hdFTM3M_!cYOYj#~(MqoG`^7Bej~e|R2tfVSF* zfD7jV#hs?kQY*D3*rb#Xmav}U~=%dPL$bQwadQ-y*u2#OL;qgFjXOtdzNbw+qFH-L->Gwbyw%^+Jg{ zvkT)m($S@x3`?5EmFobdva2JJKAZe3ig!d&%4{ioap!VT1HW-CNOG?J269p8z%DHY zo5$?y4S)jZMbiMNl#0Oaydo3zii6qD>`j?K7#*%fKs>m%l3xB*k>62W6n!UlsY(px zqMDF2s>J}lgYqkLt{sX#S-8a$qXlcw`tTihyjFrU%^!a=5-Vu(9!P=5FGQ`3e@^$g zWyS!bJmdw&b%Rko-&D`ZZ8AIWpC!kAcwPp;vP{~Q#%A%ba3oX|w`_kh@OVR0qtyWE zf|0n)D1yTFrEij_y>B7Hm3BRr4%xeUFebYXN=9mj2mnvpyDj=lD~DRtwKD9rIy>jU=)tyKs3Cq_Ds(7}F&SRPyQ{)OEcn=3oH2i=>zePrYTl zXAWmE&ccr^;etv6mszvexlTfI_l4jUf3Jx8(e(X+0{i7-LO%dMo9>MVrcwFG^<;TQ z8@O>-W84+^`6LJ8X`Ea;o!^KrdZ~kqzUb~D!{_}tU<7NQ<+u%NGch2Pt+XCvqwuGuMb27u0 zZjZOai131ysa#;-KZtQF40MiZI>*GB6<+`sR#d<06)EbcZLF{S$SL{(#j5h=}% zT8mf4_rbK!;G@_}{XcJ(+!`@R+z0_%{(Jo?-!mOYea$W_0XmFl*$|YWa-om%xVHVV zplz%x-Bw?i9WJ48k-AWPbKwB;A-NugR3AA;uIsrYrtAQ?!aTtb^DgesHVM~DOr)K? z==TBjXb$srNpGl?1)l&^Lg_(ie%x;vWTc8HZ150RV9Q=^b3=?^Cnhr&-vo}0U~?ZG z*G-6`;IGM-W`h8rv>9dvA|qQpk&Eop09h_E?>L|LFI3~E438>7l5&4nHuK)6X^VW@ zN=|F&C*c6PvxYfn0m)Ui^lQT1L=td$9;<(`tPRMF%&Rg~3Xm!dRG<@qo3$hwbDvUT z4*>w%szI}VX1Cf^mXq%GgKpAyLlx^Mj1fz3pLl$0SHm#{^l&_mpX@vlvmq!X$ z=N=<;Pd`QE&Jr+PaD2U4$KMHYS9$xDfQJ-E)Vh4aum^Bz$shI2>OTR|#~k2+(ajXI z4bn${+3TY99{CI%%iafotU*vG!X{SEFw2?0U-x7q`JO%rY>@#39_QNT748=EK#{J? z3&e9f)Yd05q4CR@L4MM%S${P0lmpf`b}tMp-!Sh&KsW(z{}-7qBy`IBy>!Lvu>>o zy|gJ+v+kHIiM8~{i_tkajgm(=-n9cV?h*lOTSTSSFRDE*pJy@%BTs5+TRcdo;Kvio zAGNQ4VQb9!#4dhC0fdV^wrWsSIAQ?b1YEjcBT8+zZ@L3C44+Bd0=H@t$+rT!tt24Gk-Yg*j>r}vN~mL2@cZV4af(M{p*(o zYbT6*6z^)LY%Kw-pYWUd^MBxf2^IzkpJj_}>H~XTXAIo&ldEu(@=jL!AG31W7E*AB z;8!1g#OVP4yflzFD1(T}bI_mv3z80>r>YL$orDU3`?CH6=22e|xjxRFGM*nN=mQf> zI@kcI_?tcr4!b>fJ|^`spyCzqh4eXR4=h!KA|7?NMr@JH;1$A!rZIvu2P87#hz5i_bne?bAs5$o*?0&CR0 z#$jmAqan!z$*T+>r9Bh9tyX{!uHyf~JS5`vl|fEj_*}tiwg~`NMoRcQgI+7cDCZzV zmC#sz4kbUY@X&pCL&G|JlInwvq`87cjTF}%Qx@G(x+4IcG3$Y?d^kXf|7Z}LLs54i z&pcajC2$=Eh65Z{e}sq2|7TXJ7+iWTpwuxsa{T~LB}XInZf)27qUfav!~ zm2faU)_Fs!tevJ-Gl|&4})p*;QYLJ%b%<5n2jFb!_JPxpaL!8 z>C_H&xv%;1pJmX)6Y0exyV0r6+&eqMiS0+ zdcS^`3k>`DJB~*u>?8oVOLi;UxWB;Kp!w+&WIr}YSHjCGI9}z+zPXJ9nQo-x1kawm zRc(DhuOJi1beI4yRu@5t>)XbuA?6#tLI}weIk_?W_h|h|5h6d7IKb;x@`36;e>~~r zR(Tqx_&)%{wBuP=@bdt7QZRpZ7E(b11#6GJdc~f?c+pC_B@+CB=Bb7+(@7z~=vb2M zkTU_u{_gUbRlWqel<$A@uUCr7@B@|(L$!NY%(Ld#rE)OC-y0*)pW5XLyIlzTRX+e* z-%4_j+k{OE`O!EHF!)y#g_UgaW0-JKeIyiZZEV1-jfY_-U-MHuI`3Dm2{`}+kA>k( zT!-r@#B!~!0NN}1z+QSNyQD+@wls#FH|b@AfGU0h&j}GxcD(3f`kw(_Zn`nP2~E`* zPnI_VMOBwX0j5o4_{w@MmeuE9cUhWI1wX62_){`2j%DRg34836d;Izi*GYH1F1e>a?cz=*mYAO)CMpWH``ZgT5S3rzzVrM@u90 z%S{x6#2Ut^&iXgn5}^nwPM9{nMiwphD54#g4FLf+u9(fk&a%3nD~SfcIKtOoVB6=~ zO==Uy)N)oI^EsTAk4JpcZHVML97Jp)(-{Ct_yGif?Nhel(oFy2e^)_Zi&0`CVb6~@ z73i`6hKUi|Ghz}u#1x;50)limlYRgTDS)F+#Ve2P8$%i3!B_y1%_rE_JEZcMsCLDa zgrxs`mTCpW8uGQd`!nBc6{P_iY-NZ-y8n6qq7yI|vu~;GD-F_UKYWP5degiq0?1Z= zYo)FyLBc7b<#sJFUx)!%Tfse+0VnPY=a|7rTZJy5aWo(h#$6oc#aFd_YY8rafloYm zYB@&UcrbcKRz?9MNfHE1f;u>t?~|A&-d-zyi8rcP+4YgW=Rmgwn7A~#lv%8>kO}d6 zmKf-pF^2%XHt4yK-=i|Uvb|qM|6);xHIsb8rOMEIG8~CV?Co~_QwQ~}l_r!HX{VOe z5lH~_>|RFWISbdB(ShRYdQ2Ta#}ushJuS|!dP20I5LKW@(6SS#lH#cnQ^Q8bX6lKI5{Sr10 zy=ox37Z;vv_he-TQ05uq(_Jq!$_e&~)TX}1)<>7rd{gFxq{#rt&AQY7gO8o1l>yDq zm>@~D%2U{a8ViwvOs@?+-}4oS;#Kaf#Pu0mi!}6Nl$QW;t@3(FL|u)-)r1F!zwjuX zSnKxwKhARLQQp_}TAc9k+oRFbQesJCMe$e>jc-4!8h2=;012M_mk;{xj6m=vOc02^t@ijcuP_ zezv}722I9>?k_=+I`dVBdBL6A-2(s{LALuTk`4FrBU_{rx9l4Dg-Y0H1G1RrXBz&c zOvldm5X)q5K*iFH^07o?1cCv{^Ck zauHP-!M9`nk$M1PWo5~eRySybKx-4Rh%Bf1?sAu#|2%tL!B$%hC1v56r%d+q)7nsqb@KJk?#!f|~dp5oG}eHnkbTzu`5_Vz`1q=+#}0;;O=K z!Can!wZN;XV9bIhX?#gZNJC_^Ff=ppI*tLJruHfYh~L*=Qnm?GJQZ~D!Hv>?qI0FA zo%K~-^P}msbMKw~5-~AE@+y3yZ5{ynQZmuUQ>|*Jprm@feI&5Mfew|EA&ss0=DV;G z5vU`{xjJFHaP9raKdZF&%0vLiT;o!?-Mpd^BD7xh>QbGzF^bpbB@pOapC3;(qVPqk z0+(w+=&^zX93{Z{h{yn~hGU@{h#}-M|L;`A@|&^#DxFl)EoL+eADltf+J?@0GTKD6 z%x3-KQM{#%pS=M8AfPYaZzUc=HYUnnxt*wRCS(c3(ZNE~!FcUQjwu1hl(q{l@ z3u_Oe{>^S>E6@OZx`dUylzY zQC)_6roAR9DdY#F!n}dtGlp6(AGk^MZ=TqTK(PRF+Nsb%Hc$!F%W>KQW!dZFgWnZZ zBc0B-p86T;mS?ny!$+lPCtAtNCcHaTjV5ltM0U} zF_#>XYzEoV`|)^PZI=PBJJ=P`#OV@S3C5#o#&7n#JP>z0!pHdpFI{HU2vMqx9fmI% zGsn%8Acp1-rHugIShS=uMlJ{yt~EviNWRx8goSyOa;_4de~CFWHN^*$;pw~Jil^~L zm?2X9DQE$yq%dK?PDm19ciig*1Ft_M&soyY1S%k=Z9~1B?;@In#x!r9efRupf{RUc zA<6(3qmvk)q~<<~5oO<2@QB4sYAHH~TL@sP%rXOmd|Z9s1;7Sh=hz75MG_$8EUf^d zc_9X`M?%T`lJvBi1%qFW=s)2m%46tU7gn zmC9SReb7Wyj+xzXXJ>{<5A+n{^8ewbp)#M@oJLT07nCVV-m_34lXn1z)_(rG&X&>a zTNrc8c(Hl)N+*ttlmpgux!ng(Jb+=N3R4g0mp}K0w_y8Cm|6j3QZ`uAMf5Tdr8oz> zV~Y)UnJ3UJANKeUAo8LlE@QdqD{Cm$&Uj>72rpZjh%Ct1-@UlMabw7PgaAUoa{zx~ z{+hW3L6k!b_!N~D7|z$g#f!~D%)0=uvTUs6M0R&G={u=af5~s^jZK$Zr$S5oRA>rT$Ix z*Y;2Okxl`meFATZHfUWbBds*x&m_`ZKmS}(u#OCgBIctUBLprq%BF95mk}U5)Mb?w zJR|^ynu~hC6);_|aw4{r%OWj7@R}gfcxjCIB9z+PpFI_Z-lz-OHb{2h4K@WfSDXQ# zK4ZFTUv*_qWe`JE&sQ9DWL&Iczb#APL}uV7(~3_ zk1()HeOewaYOqlE3c^`P4R5Ce6EQFV=M9dnHN`r5X?6h`?_C)O^uVxiBYp=DGF6nA zJDB&5Xv?L~>7wyMEhp6~E6SLCHNa)Qt9HLPUSR<~Px$l5&zwKpjlzEpGt3Wkt0EK0 zw92(FM5W?6b85%w=;69lMb>U^`?aNSKal`7!e&^W#jDg}%Nz1=Y!k|M$2u4o2hPqB zGptETD#|%L!ut&6#W8Pfz+`xuw=?0k zoTT^ucD%3IxR@V=ky8N@U_*D&8@wb4!!*VGWr-4KnwnT9uW!^grzF*)k zDBp+b*Y>K!F-rkrPTNYZx80j0sqcsNeZJj5@#h&>lV5do(Uw2^`XgB@2B`1NaWAs< z)d7JFt!x2ipCLMdK}NNWZe)aOfe2$^lx)UXns2ojYP3i+GRF9)YO$bKz^RR$!DNlvdPwU zxvzFCLe^ZwMsdaLamPjh_@4a6(Aoe}h%c&Q$Z?8$-L*{s3$b<;eccDy65hj9>6)F5 z90>X3lPq$n# z20NALkcye>s9*qio-Bv9a!^nC5XG?T=c{)d^G2zoaBk=^tl=oxIaLPI&{gZDMBmJd zC=M0uypsU^8J*4icAdsn9^FDf?>;V8H0k{$?Y{X+-ghMszHB&%Cki1)txohlZGP^a zvn&AjQLt(f&|Dli*%BP9qn466Cdi%H8A4vs8N?)*CToOH=jx0-XAFuupUI9FG}!>t zl;q?%tWdh6OYIIWLAJkw76So!5a0LDvPpn|NQRxJ#$|2eUq1zq@V?b(wsQa^005VY ztODG!mar46G!PUcr?%JOAPPOU)Eau3w@sOCpQJzjb4WfdkIZkT{+9q};vAzfVj5Up zDqMQQ?VbU`+k}6yZf&|V3=b%72ep+y@14hdm}9Tup-8FA63qZVXDzEx)f`t=X;FUf zBi&k-fuCe2AeRzUUD{=n0x)@PZ=fAW>Mm}g)X1SnCw~E;U;}K=t6@4xk*Y0t0K5}S zwl|aRzzW*>G=IZ^BWo=VJIQA@wzb*(F%T#V_YML0^h^ghxF4SV>goQm%^|hoZKFR} z`D1Y*<+MPa8!T5fq89e?3fR~V!~iw19nku!#4hBRvv4cf z)4f7_k6sPpH>r03|3oA=lGgx6Nv|m&>HWXp;r-)h6wJs#yJ28V#t`m~Qn!`M{1X{o z-~mN1tdM^vdMLhWxkUjniBXY^s74d*(LNEFMX%fNnsOhBJ%>I~S{-u7+^^Wvs>OGJgGT~_4$p-KQTL@jA~ z^CDdH^^u|zNo0ggth*y<4q}{uB$6wIKQo*P0y@1rrASw(jQzdmIi>+jM$%ejMeMP} z=^soD8K96ukceS|8fFLO6IE5tY(Ze(l`PzAw>Qeq8A(B4;2QvLIeMYWP(1q5;_Q&a z_rfxl(jFkq2=o(_a}*U*XW7Uui<_g09%sVIZDp7PTKtoh7Jnc9h4^?_XM!AjVLOA}eYU|9U6u$0 z^hGY}wIu39rRKXOLX&`Z>x)ht!7PGcJ|LnK*W z27v%@9^iqF{xzoBiF25WEESyR!W>P?f+}}u{Y83<-7&#@G}6( zLF^jzHj7U)qlShd1B!_e?~YT*YEJtEW337lm`=qjqh2zZh-*vk?OroCq?`bxpcM|v z{u}<#a$3CtKVX{zRGSpn5}T8jTCh+{@~mnUdyFF)kYeky=mycf57_`OznVjsC3k_I zIr{B@u(0l3F=8b=Vs$_}FeYQ*=rR{#p2z&r%mjza=r2vAH;D`ww z;Vd>=*zwNGZ$c`!Xtk_??Rw4wnLJcP|7E=?OPuzee-Z(I#?Vj!5Ie6lEe(Tpxq>dK ziI*o|KSY5%s%F_*lW+rP4uCFf(Y@i>H~uB z+1{)HqHDw|SV|3N4Ki|t|CKg@Th|A6dS?MRg5OX+P<@2^;BjyQIv>4G`*%Sa0~B&B zIi?9QRGCxQusH1z*AU)X#_Cad^Pd3~-2kDJCB2NI>(P1rq=RUSA0Vfr>kQxO@JGKzm0}&8fL-;8No<75%pQq ze^mjp5Fz&7BBZHHZ+Rb4kVx{3Ehyj#ULNvzABy2z2h|MaGQ7ndk@X7I7 zU|P zELsY-?NQEH!!9E3jhm9OyDcNzDZhgVjonYlWbz?79r<8 z{3qYuN_uHQH+5g_z$=MM%W&bxVP&#G3a5Hp?S_vDN zC`=h)mRHZoy~!V#8(RQH;H3B#>I`D`!9eM#@4ym%n`EY#Pi|E=NK8@7$4|#8-d0h% zB3hG00A#e0qPzg-GF^yb@oWw_C!vuX#+$kEh>HijQ~zW2{hOt(N3%FrhreZN@Y@iq zqpBDguEPLjR>t_TVGZdAR$}fFzT&IW?dwYx=?R$O{M9>S{a?XH#l6J@)>g_Kp+o^x zk_rKE4|N;xK2%-4h-Jv1h@Qbr81+q5D8K?ObR$q9Q)fY}gimDGtcZIa-1cqarX2yB z{lMdt_E_?kP-B_)b%0BhYV`yKYmOX>0UO0`XK`u~eE+P>a75Ij1kWP$YuNxGMtUhZ z%_Bb-<@b}`Rz~L-7SZN6(Ihb%G-#s-#aw`pU*Ii&-iB#kyXWf~h}ZzAa6s&2T(sJi zTjIK&;W6VfYQN2hF)He9;3|_9l6Ejcvrjr9lSbkJAJKvz5VimnIWEfsO}Xu=4hD;* z2S~miA#H~d_sX(oWfUBMc+W)kOzBgJ0muj#?AiVKg+l;POKRKJD8g)4qXBb1vlV0J zclWf6u46R0edQ_z6AX8mbnj!dE}9eB&1Be)1m0B`|wq#lwjqLyx%TiqY4*$V7~PgpV`=*Qkc z5!V?Z2ALWFb~gKUVW`G3wmDP}lbHcKAO2G)LC7V3Mj2b5i!f$*5O%op?|`_^5J$9o zLFKTXT(u+oX~`=r!(HN@c`E=N(XtD(*YB744cQg0;$q!Ru|Oyd<|fxLWNpHq2+Y0| zehnF0>sVh`qy=sg32OmdH?iIhyd*KFOrN=g?iyPSEt=j5F&(c5F4*9SIlW-%S3HS{ z+Q90v`*?&>xefuO;zLWEUC@}kQ~f!bw!`aTs6DHyS+kjj5Av&1*kEt-H!!0qi^ zrKhLoWhVe8nehdl0N2*6!z3wo>#5f?=iFK6iK?@g8LN*o{STPr<@Y;RO{5hOWK?dq zsW1VGRG6)2qJ_7r!Y=4-)y~jIrQp+I8cogTbTwZLbl`cGS#1h!rvRyG**|$314IGY z39$%cVw1|2NymcRpWeA_CYH#82+evF^4Hok=F`#B>7?rh02WE|Q9Vwn^>_i~1*nlU zpILPf+gs-|F4q0^fVwyI*=;x#*6>9JN@eS-IA};*ckwoaF2%c=^gA- zgO;{U77S!F|A7}QX)k~+VfW6lu?hJcdy1Bibr4=FOA^$w%(?&&l7CzEex@9v3!&BSXi^$E%z@=LE>Fg{^dbSPLr@Y>VXQ}KVP#pl_j@KDJkld z)Fdzpm)NI*5PtZzj4S~HjfX)$l0hlYTS}g{z226|djf?`wR{z%nn>!+MMgp zv2_f{=bUe`-h}}pb?m~VtCyZ#@zG%htBF7Z%b`x z4qzj{V?qJ=CcxhjqJnQEmdg(!S6RjC(uJUQq;h_UUS`a41M?rh<&tXcgpyvp>yREY z8#w`aNf{dTiTjJEpC@_DmcV%uc$m&q&6`)b9~ntyRAm4>6yFu5QxV&;FJLv-$~^(S zN1oMfPvDBX<@6Z8veA$)xs$J`!g-K$+$#V#K*+y)i^^aypyb@sl(7H9kEnpir0Jyr z+h+2FNH@JPRUblES7D#83qZ_DRx0QFMsV^cynC*X?ZMtUYEdNtA1OOV6$WMi=zcFb z@R(`rM4UU2CKIY5ZU*%?_Z)d^)&Bv|kTb5bGl%4`R3^BSGSh9vmgn}=05$ivGJ!+wEDEMpJd{mf#-6C8HhyFh}v0SFiyuE@p-_j!@mLXvUdh zf>h|3dpR)IxfdPgZckF?tOw&7aKb=%Br7@qFO=7`5O{VnY!gc`>$3*ia>Uc-P|?F= z=yhH8(BJoPGAxB`;Elkh^Z;gv?F~EtB_d3C)^F>B2`kIjpwu^}K_>?s!D`G#8%gn2 zZoUk~oR+sl&QC7a`ty*o*bImPPwe+fxI7a-%WqQuW3np2ow|0lk!u*Q#jzKAQYXAC zI&^oz;H9&`uJpF?AFC<=37Xm8B-b<|15eLl8z5woePJaq1C1?K^4d-SEep7&jE-Mk zdNdGJ?k<$4$Bm%@sK{(hebOUKBLl<=wadOCid?5O-#92`C#+PVmw*6JPYQJ9ZXd^( zn1pG|cA|&?p!gu^1C4!z6ld6!IpC=B2r;M?ru|)}U+>6Y^{8@SQ_NksG8Y!T47xu&ahqpqRg5;u@{iLHA->2Q3m+3W*U=+!mrScC!O@z32ypz7A;G!--bZ6S=T6dEG z=|Omp{xtkF(UAq+1B7~N*4-bM$WHvHV;{#CkGmBoE$2)wNE1r6s%(E3F(EPlOEv_) zpE>1zwpgumcU?hPbXyV1^GK{v#`2ShQPvCEBXH5Xjll@P3a^f`2Id6-cl7tq-<+9pixj^Dh<{O*`;~0|~TC zJh}tT#Rrw`%I{;}7_qQ>RPeZmq)F*){7rjUQD~(l8DT4vz7@aE_RtnKqpb)bW8Qd~7D?tDZ zo?J9GelUD-psn$77Kz?w#kJ@F`Wmr)%DET4b=4beY~nEfW}wA{rvnvOB%~6p?SXzg zk%<;z&meLsF52UE>DiqCNAMgaI&=fPf)7Je(ue=H>$2f9f3> z2CVbf?hL6MHqMOz0-fGnRqr-jSabMi8>`YNB^c-!b$_adKuJ0gBG5Q2CmYX0F+?>+)yrA0q{X;1M95>yGfkVzVoT}%2@2N$4l3Ux7GH7^35E*KImk5?`bH#o7S6f?6l3(h(pa=^osR9GjB?lF_On z=76KEmO9j7-3VOWv*K@^a?y2_Fj%W!Bxr~ZVW(NRMI~2QO@$D+>`2Q1OV#Q4@>cMK zJSAF4?aqYI_AH{?^V9-Fj`0#l-%A6bcO#`-HA>#ljcLkjS7>GdsR6C2Cw{|SWA?T~ zjAVVjx2~W~dq?wpopIOCC`z4_#v)URd+M+N9!xlDcDpAnW=xsPl_)7Ba>1FQ zS4NQOr+1E~Ff`n-La7B^0HL%3ED3ZzfmdStSC$ z|1Qha3c@34DY%oZ)`1oPzGyl}OIloGkS|2;N`6nCw|pbsCX}m;&TU3*8X!gcDZ{GtMFIbU57?~mSH%rlhrwC^ z?h}yVE%FNiIK%cv69UiKWZMmwBh&Y%7~Q}zSg!yR9{h_qxKXOpV0OI00f?; z6LFyQy`23zY@GB_cm}N_d@FxQer%YxJxM`-_IUJ35Qu!JaE0ce_Sh)^vfr6P+!Byd z#*%+;`h-dsB3gd$he%4#GN+H^g0`})Dg9`|q3}eT(K-^B_uW(h|9$-R`3QevLG;WU z1g@ zfqnd>$WD;bX8f5ek{CI{;0-v&+7tRHWx^5xp!exFR|uScllD4JoaS~uX&hv)xKyEA zbfDuDA@kZ@CJM@o&@zF8hx$y2aY&f};uslEF-W=kOP`gk$4z#jwVB-;GN%223Gtx$ zRB^tGnZBhcC1Bb5_%G$_nKdi`Vag@%1cij+6=_6r5}7eu^TuyGw){$n_XJ~fcZf0JX1WU}VbSyLl z9LBg>sGm#vmmkXj0WmV(82@nx0Or)myD3hiD(c((&$lsHUKJI{+BXiMQ9m+;n@I>Z zu(EH;C3cqq6i_u8UHoNhO<>I&lo-V>JwE?a54VE9jGJXp?WuHily(#p4n^)_!Wh*F zcD*tH*%NTr5x9m{M^e?XJBChW04#GhpZ^Mdn6S4Wf*OL58el37$qgq6>S(0hI2n!r zBH}Wb?>hUZMa%YJa_J&eNb7dwcsQCu)I6rMf?uzBI@KyBJ;U-i4)K;E03}Sz-2Cpmyg_L$`(;#aZm8_Wo-eU0+yyrPQc~Y5jmh_r zck0N|i~jmQKFU|1VFxMDJXH0?^+&_oOQ_Ur!vMdT9uSG^(7Xx&46IUE^e)~S83G;7 zEl`G8ZVgfR4MtQ9X8M~t-|MEF>(}I@5{IgrqVVh6FpEzCmU&{Z+M&DnFz%77DQ!sq z=We!2YzhWrouX+er0J*q-czX3t3R%$Yo!Cx!}*N?Y7b#u^rzMO0i7%@3oA0gj)Wlr^UU2%A2aKp+#f^=2-Yj;Wlx-+W;VMo zF2v*jG7k>9nGWA=$W2q^iohqgq;W0*SLgBDTb(QIc&`Oyc}3|s3j7g4noYxNx4g4j zB_9sdVWO@2Hfw7Bo_GgTo3-2kOcRJYtaV>QeIa8C+z<$0*bni2^?f=Yg=>Seu_XRa z2hsw7nxV%&51i!=5k$`bVDsZP$~gT%704)t*uOP{Z4_Spj3malKYVs@M8ijr=rVM) zW72MnGx$)ZTSce=Rnbj$oqno3Zbo4&H>xiVTS&mYM=V*8E^QQvhGyv#wZ&2ieu z{O~MgP%Co*Xvo`+#e1hjga|Au9j5G}M0%$6X)#>=#|>HmCVczK+g|_8J<9W0n9Qa-KjTCbqc!^m5sZWZDJn-;QjLI^yaMO4wkvM* z8~Cw9ADfj~Lv!$F^U+wvH_-{Y266x(@e_)U5ZWgJhiU*))TBlJE0V9R8Ajz8;naaR z{m5;M&Fb9@u?VZ}3#Ud^7$%a9o}{#hr1U-j0MMRO8~6(#>;>y-p*g83Z$7lg7kEn5H+>e{rY3_SfH~A0*hH0KHYI zImr&TTBkIU4jwp9GWQ||#Z;yMyj(r$QGpZNDQ~%yRsTyNtv#U<(#--qK%0WYZW{qG z%cO(JlF}-6#+aPm3=xe1$RZu&1-SeVRSMjPXpyMg7Cfm33V3`&Z`4>Jv#dcMo(se*H7=kcO;y%B6)E))HJmLGJI#`gfMKKSqeUF;jLK4_(5 zLc#$be@FvSj^0dTxQHyiBA=&r0gf0V8~J=?dC_A3%GSGg*rZ4R5G8`A60%4b^3`5; zQk|LvftUs`IC{1OyiZr^cZ7= zfRRBeRO{Y-h|)mZ@Tha+Y%0^w7pOwsJd*ts=#Iz$ZJn_duQwBHGshXz;Q@D5W=jbMuP&ZsVanSn7o@NRa3bDbC>WKQ9$Il63%3@ zo(yQJPVh;G{4(6m4wuhKzFE4b@~04XQ>4< zTh8A)-(~GQ?r9@(UHy5B@_O7cKKoH$3E!tdlK4UZ;ep;VLL76CSPmNDP+4exDyPwh zLUuWY(6PG%!;*K^a(`-hw$=3wJ24wq&A|}>Dr6>om#KcNmHK@N^(TG(A(c$xl1+?c zt`iGnjmFXkRc>tU&4yG=aguP$tZs||PZ;c;#xdfaO{q}uAocg=nz$}=B!-rP1GUr2 zNIVi^H%lg890XBN_&k4V)rJKCp%MoO6|1HFzsce8&#<_?SwPgu)Yc%8DcbBA{XpP8GF2+OAN{uuc4JGIKTvGm6~8TGPkT=s~&Oy z02-&LV4y-x5{c{H1B-gS1t^XbsKcgX`tcY$4FRisd?c`Lt9z8KYtLuxfwfKmDQDRt zxycj2iybTg#-`j>Q{adu{LXATI$Ti@o9*G?MeLVbLW=U~HsnXM>JD)MkmftA-zd?y zQovX<6xVjBO1~s&;$*zaVMe{`kN8RArjETr^G&lyqub}KR$uO0NJ!n|Y@4 zGOu5$E{D8Zm1ahnv*~q5KA=9o8mupus1s0dbC)`5;cE5(8yIk9E3oOOQT5TPU0mmh zl`jHQl?Cgzvo5FI+VIG_BsebX{(i!ma1xU@TB*Z^Nr>0_QCp>3wZBOcbl}WV%2RbMS!WUUF z?Gm6FYIV7w^6fq;dRVhLjU5L83(^fs&S`HNzp$C#=l(gUjzJ2S79sU>0p3~NYPa`J z&_<$W;rv5GKV#!OcSte-WWf+VXL#BWrui)qP9$4!1Tgf_U<2#1ja)}miKm^MyNm%Xz^3;RJ&ChWF za}t7%b9_;Sd`^OjC!FbHQQ*;f(Tv4WOmTwAm&6{@QhuAEAGJKZbf^fgGbbYe3T89? z8(ca#x2u_=2If`$`3AxfYYW3{JdC1c2si6i0(C|1h`Ly&0&BCR!)ONqwMjvD4sle+Zui}hU|0}%3 z=-5Vn9~fZq-Cm12Su?wRP+*$(GGoMX3h<jo{Zg0#n_WG^sSEq6 zveJeEW#%Erg6OG-#TE-ZD@y}>C0;0B0GTKO;^Z_s>VRfy$BVnH{wwLL&{+A22Bl?R z2MTbzMQMmWM;{J(rIR^x-Z1(Gd{|NeCofb=Sy33psJ5Kt+N=*52!9iPFP_TGxu8S0 zC_SLknLT(IKfsi8W9ax)$KgByWz?7?wCPU6M36wf21T}2XjD{z#ZE~Nu$M~?<#}L# zRK&D?Cy0fJz=fKwDEIFGpyt_$yCls0mt3BwR7CWnw<&`J#tfLi^_vO@mM5Y)&5?nB_PcKZLdyuQ>wf>4CxT>{b)8vm3J4l3fA+~C*5)z|0IMp9qm6ju(}*P)Y6#3_ zmEng07KZivNtVISjh$3zs4E0%*Ih_*Z6D7vT~{yJUJX84aW=(W79jqhGW|z-EVG^g z*Ey1a@|1GMC2CvBW~MeQ3N>uhJ0^eRWA+yg;D<=>>ZxF*FmS(%+Gdf`5b%Nk3$Amz z0}^<)tq00Foia>zOFl=MQ&nBL@LcVY_jsmtBeC#81YQyiUb3ef{Oqp)>o*`_LX<TCSqj{n%%nJt=zc5o;?Vd>)WjzIcj;5ua4!)^E5?i`MKe&Ex z6H~d^2C2++E!J}z{6XqlFNk~xc0J&$;1dr4#P4J!tlFrXu6sGLjv?lZ7GItqv0+Wt z#9?uWkw9OW$M5hqoMHfMA1^d#Lm+wq4vn`oH#4McR>HKuj}T*C(ScqeBgD~6crpzi zkOcv4@bt>LK+tx^bGE>cbi0lLbUv$W{pEJtQh!Ctg!EjgabYRlhRp%7~6Bndz(gf@0grHB=iUUA_?mnh28oV zB|dNfgONo8luUb*P?MW}#*Q0%KuH{7J)+A{1BhQ(=$;4+#Knqb(FvZ$t9bszD^>ph z)#o*NG^|^cs}Ad3Q1LhNm+O07R}<-HnHL$)E(*TmQhnyjP1r+-ny%5!{v?V4XsFK0 z7GBou4NZutlr;rdbDwpq83l(K%P|ZR`5EPipwZ0SpgkdS)>%^OU%9u7b z{;{jnV77!-$?T@7P8JlGegxkKjy%3hVEZr9us{x{enJTV*hRjvK9#VMVX3COj!^*1 z`6UHT?{u}P{4gfsM}|m$43O(S_7 zJ%2;{kYgFsCCfM-&hij*`qhzJRG}+S{9% zP@1c~rnY~y8flGMnem~=1Gn(sou5nqUEAzA=|IS_Z&tcG(MQtI!E_u)EvY#bm$wr9 z1U{W`_`ym0DSt;X62={sL4tGvIfK`vLJ5`lIIers*#pA}{E+N_H zX0Q;}48+E9I~73y@M^!6W+n~{U<5xwEyo0zBFTV7Ss%11BJhY0dG*k1=hNC4f98UT z^nOh^oAN0E>oS{+wqz@Lq=-85O06RiDP>W|&fEdZNmciDH=fra6_);pc4m|Hsrg(y zj45XUZ~WjhFQ%wc%E+T|)8Lk-I5m3WKQ38)vJHZ!mO}!^P3bVx?3(8{*$|4A<5X1u z9v>cFI)1ZRmt#~TL5G-;uIVD+<~U3!@^?^ff2$Mal!33|>)6uxY)r2u;+J3nZuTmz zIm`Bw|Mt!j=DGJr%M7~1ZNO0%s!Oa+sYp+5p1+^?dBHGL;|MU6>Z@r0s7wlvMRju!=AK~uh%FlGlPOb*`L&G zB;{&b0Y>|B8XqexEVGqQUuaPQU=;I{Vt)EBQ8N5qvfD)1^hL-M16-Z+R)_T&#+#`2 zt+Hpt%!tB~dz_7m-Bq9f_{$2Xm%S$K0vlvueikrbhobK{WHaD&+j?Z{*n(_PeUv+F zthHEaB{)VS_nbxninJWMmq&-~wd1m3yJNyIBa|o{hw<0|NHTb+;~WH7&h!H>N<3Qv zdwCAq)Il%-uD&}xg~HIa$T4-GkD}a+uZE8=*&_Sx-=?|?pVpOPJZ;>z*J4V2SpA{| zkE=%k3yO%fa`O^s*bXa?IikYK!H-K_l%~wD9SLRd9o0zr(u2LE3M|+}LxfB85)@DY znI<{4GsQOkb-2kz%mLco)M^=X-g>uxT76hR|IHuNVf;UaXj`Fs-^s5P^lTFWFj!wV zIEc!gv_YnZzF|AOV}T&_bXnsZVX^1S(D3rpp`A zR3i1jsEvpI@pxkP3-3MXQo~r9wwEm(ZZv)0!}_P>a(@@wG7KyLD0)4Dr?#{za`RV{ z#yk&EPG*rhvj`ZOx6Ss%vU|E{yMvcS_?pvpgO&>NII(8{YNqId;_dogqP%_vRxu}2 zhP0;7iyOD?mI=TtQ-?IDrn-baT*(qZEnld_YZ0;lOxAQdWx8;odCHrs@gT)xqO!1r z+1 zktEKKw}%3uZnWLiXg#=jawQP+IrljHRD7C%@W3;9AVA*p2dHj5C zQcA(Jmb1qImN5pY!EOkR_>@P}Y+vSBIfN;>L`7r;aRP@6#L`R|Qkg5i`{}9n9s_T$ z3K_oulJiCBNemMHd@dt39F!Deu_8=4vz|CpDdue8sL;A{NS#>ENq}+*NdiUH_eNv@ zbACbTrZLyRijIzanvZeAOc5!>C4w85@HCU1ykwsh=g^oUeSQix?~?H_sz5OT9+lQ9 zrpliD_xi(QzDRr|Z zSxc+*z@6j!%eC%9IlZp+uTAx8k|Sz9m`2WqLwwHwvSx_xa#EbllG0t%*yo^Ux9u73i=>?>Zg*Q0Oiajl>o?`2{kkm%dX>VGN&0b z$v~NP>N(#`VHdprzvl}8`5PopQvdga`lo~`XtdpgzdfoN#M<&gz4W}MV?7GLM0pz2rW#77Y#chW(v@Dm-$><&x2UuR8 zQdLPlmsRNhe%-D$1`kUn5>M&0IctuZ@*Z|la%8B_Uqa(iVTiM0aZ zXq(>vygR^kvxsb}x}dBnF`4v^u;aB*W^{Y6g;BVw)X}VwTs_TvxGOhBv0P`z_?K=0 zz~(_SXXa0z6O6zlML=ui0>broi%JmS<}HM(ivkNyu2}D;!YPpU+~jjfuol1oDVHLy z`vhOy&wxICS6JXB1r0>lAWUkh$_8Jg8h)OKR_dzh3~%2T_V<+lW!zb*qFZVy z;t@CvDRr*lj9&%|N2ivOGPGuP?2ZwUW3u#)rI1)l);{~Ig6i1-A!P{(=7JbWhw7~4 zs~}=gW7c+)=+|>hy2)2LP3;BJam!Q)3pPhpqz%IGErZbj(NjBK;CZA;>u*7&M1$#C zpI$JOMi_G(ve@3_N85cfn@#kQchb75%alp$c4T}25OTwgOLJR!9t5 zf;ET8M^00;$PMd~SsyF!PW#6O6d^tUM=p#2m__|(q+^d<6FvXdxnHT)y2uQ-c9b<; zBoMVY;%|b3AiE$aS!GOAb`UiO1ki8*@fjBlvpPnU0+~6sKSi&RdDEkhrQzegi4L;) zO8>L@Jhd{a+NwWA`s;b(rI!l?d&9g|UOF9X<$m9IdkvZ@yxPIF6u zp`(OYN$dOwF06@ykf(_O>9OV6)#QC;;p3-L@qHL*3Zdw7;1Ably3*j^p+3d@7OnCl zP9aUXF=)#wD7ZlZ7`7N}Uweaf@l=TAyX3$E-rlDjuz9C{(YHgzuTQn!%XZ!GHd+x? zPV7F)-YAX%!Wr>V5%xwW2siJ37e|d_(lS`szWmE(k-52E6X2k&rE~=@!dETz@-C7R z&R9wT#C$`@!cV4I7}0&#U8*kN{wP#Ti0!4$4+64!up=jcC+@y4n^Ud%)axhZnM$Sr zrENIY+A^&P3d`|<<$V&x?#a9;Owyx?j?8D*l%)TC&eTzD=weJ`sF$#7eIHW+yi~|* zw|NUUCf3J<*_?JX2<{~kx_*0E-i1h4y`J73YhO_ikqoWc+<&fQ-Nx;e{*Ah5$7*WA(C z)JJ+(^fgOqcT^V#Q%|;WMASRU3{X;So)$p>-&q&7<7$@SQV1K(R4YiADmLXw!Rjyh z0RSH)gPj@0gLf|$o_;CHiJqex^KyRxL0`s)jrZq4(6vzluss`!D4`rh=D3uvU_&<3 z4vi&vlZF{?U(u+~9d-tH%sEp4#E`$t|HruD0U7L8+N0I8Mvz|cs=fxR4FLjRQYR!R zhSqT2d4`gCd7IP7pn)(282$Gga+Svb0 z3-2xTxH2h(ZZw}xf#0PV9cd39$r@M&`8wyq^HHsZkOByoTYFN>4^aPtoVAMqayt|} zFPT!Z%YZfB_tYT;^H~iK%@NjWZAA%qrWZ3JJAeKkKqZt=Xl^~wdA6JY$-rWvP7rSE zgZiVh(^K=~6l;%BM2)wKU~(zCF*5Thj7cwRVE$x`_UI;bWX>)DuO)AX5t~8-HL)-^ z$(t*T)rj~B%0#{W=}1)&_8VjEzAcQlI`07@6OXHZj42?a-8@hia44o z<7y&?F_;S2WXxgPj!~ydTk{j?6+0*KZcR-grOtW)(qV@`g)V>6eHR}h{aVOg2;=Dw z@LfNW0f7YCSV%s8x;gA4T-X70{vU2o=a{7d9#+5RZEqnME82eFAM?UI=TXP6dlw-B zoSa-Dfu#t}db;gw_OS3fYpqiNRm^tnX=%8ugdTCqW}UgIdu9d-<2uK;o0F`*1xC*ddsG(J3#zthV;PA` z`Q6+7oTFm7{VYcT1vzNTrlnjuhb^3!%FKYZT=yXOLmjS#geOznhle3AC~KZwywLc3 zMTtf-jspe(Sf)-P2foOue}W!h7Qui%td?o%d2oZ#M5lkZF!s9NLq~@= zYi`ngmJiVxf%ynD4AW zWl=U@ssb3-TXI(xpt?y-X?XQ0DHAZXbf61O0V?mkce;hZ`}-iI;QfLCqYCQEZV8G< zpeTrlS_kd=^ezfN0T@h$FAOQgfc8yh((N7>uFhCY^)|~#^`WHzDxy~~acvb-j{$pI z_qT*hZ~X^+@7xA6OYr;{P=9tI=+zrA0&}F67s#~cPVJ%qO`q>~Dz8{5hJzsAZSY(b zaU}Ko!6!lOFjr3YBk}<3xF|n4M8_4A`mRk>TD4yRHKD3Q&BBk6flof=6)mWP!mbw=$c_{MDn{Jd;>K0X{>mj5^LSWtw90R?-j2}KdPx(3 zrVNHsbU-ro98)b2j_cz#tWKo?K6QRd$VW(AZjP42<3jv(?*3I4r!@|MqI+@70)L5) z@7VVY@HwWbTxn)qNCr0n`W=6U5v8*{NyiToXilP15paUT#I9h9d?8j!0i5>fk-Ou3 z&y|0oL;NMyqzN|xiNgo|g1Mm(Es|gr;Yo~v(cc!LO4R6tQ_w%UqS5Ixml!Eck6m_dMsaT2aG+YV+9U2WQFvgWVN2 zl@~a4NwJo0TBnC}@WaEZTZ&y(#}h5z8hyMyp0>JH!lN2d0aOnnCX?seZax zKXkJ$iOT*ukLKwnwKSOqw=zc7X9E28nV*WlQZA|ilhB3$Cx87$pFol0$PFe%_>3-Y z4Peuh9{hlWIO^k=;kBc#{fr1%Pp?{6a40DOEG!=kq`)K>D7~fS-q{W!5)>?z;fm-S z%f3dYMcJ2JlySjabUTNZW|u8mFO0P1)mY|!J`gPO%oFtx z@XKay_={qM!Zc?9I-GZc4a4pUc+t`Q42II1q&@5>jN928>Oi4Ta)j2Ebddj2Q? zYZ7t%UQ&qe03hO&>biEd4q{jMG-@^t@20Ux({i&1$RpEtkaLzQg4tRt>a$>Z&m0-?|kHC{vj-f{(U$QVp# zhiOsAR`7{kQbks22Tq7gYMbW}iMcV|-twpSJbf+N7npoI%Ak%5AvDj!E( zm_Pdnj5cKQOq9rpgwc@Sm{ltQA8u5^mxljBWYZ9 z5GQy_6q)bwoBF~zR$~(xUo?yWL5#Q*mb3ZouAbKi-GJBKiqoC`=E2QUG2rAK?fu8} z8%y}o;)iH=OwMIw*0zEH@^#I+*yEqumL?B~w*Kzqi@^f9deL8_Q4IwtMSJ|&j}04# zo&mT#AualjW+vWkCiH>_#+9;X1R-$CYj#4AO2PH=Olb)c`ZX&<$Qzip z(hT^(a3I_Ohs0Odx-=F3&VBH$v3m5dLO@COsRNMJPh5-z7jh)jh1gWbjvl?6ikc`hfg#*sbv7x4rLl!o!mWodSZ@*ZRD+eb8 zcPRUuW~kLq4;}-NW7#EQ+s(_Y(?^UonSl>SFf$2kLKz{I_i23q;X)96p1FVp<=V0a zd_5mz>8-kE?qTQeK=DyheIF}41~$#@FZ@whbX}_(fzUkxgFUFxo%@&BxR`t($cBY4 zse!Yd)BQ?=Ld6{vA|4b_Des^% zJ-QC68+PofG0c&bouEQ&9bT1&CWQk)gNoV!$J~CpY(f?!xTUFGXAAq6gdNFqpIZCo ziH!&E+243>$u|_X{$X=?R%1}{D3VP8$kA0f4fdQ={?Z`;^PT$Ph23M zgd!;H=gF!Ixec&_tJ{|WYh38`1TY_!FnUO3V_pH?moSB1QNNg!UBdQZ!Id0;16%c8 z!98ly9BNG!>MnQzg~;ihLd)5@)0_lBs}h_mVmux>@YdfTEGSMlUv~^Ej{y@Nh|-fA z^S2JzY+b4WhUDtYRA??3TUk@>x-oU2u10m0!a36(OeCz&+Z-&k25W;d@)MopNQPp9 zK_P$v1qW2P`=jrs1P+h^bg@Ee z0Jxr$zpR4WtX)b*3#{b|W)(%ey{jh0)pUwvo9wNl-Fx!&1KL_n0`kZJUBhDXv1U#- zb@$pS12|2S2QPV0yJ8zBLKRlw$>qJqm*RZXSb#G4F8_P63TwIxa0&HU|_@aHQJe{cvMVq zzEP4hdm!loa1f~k{aJDV$?Zq3MaTX=bmaZjS9^J!yEK@aqY4J-06|#|yYgwNOdyUn z=YKE_E{H^x?_!4l71AS*9j=gYzO*aT&@kPiR=Vd@oj$ShiHj?p{wM04v%T9Q2i;;R^^wd1+$m6_1ODUYIa zGqutHU5sX2$j~AyJeVW2s0ILDoQTwfZ68_hVs%f(XUl3#QyIY?)PSd5=07AX=G9;U zYKvdUW0!h%O#1D;# zpaNAaHLA4_>%$>@D3bq@-CQ24MQ_xC5Y<>4DSd|=k{1j6GNaA_59i5%A(&wU<(o}c zx8XtOZUpXp1l949glq&OwdJCZwL9Iqyr(wPG~04}!u{m{8MZBLcJR}TR9p>?+TGXS z9KiF7N`k@my_$o6&tss)M>uU9JYZThjbHo}GDl$nCFib*F=FbzzGqj2w!A&NtZf{5 znUK+|KpW~wdDO{jALxPt60XdZb4ACa`-^(n2aeCz`tBQlu`2!^A2 z*vEq@w^yr5D&yJF6A-YMSY>PhNRe_opQoOxlWq_2PdeVdkuf^MFT zpO8>I_Mhz{$ov!(Y#q)3&P2SanvooeUW0mhP>wf-@pkGc4O=&YVBgjN}YvSL713|AFfIxcEFRJ z3#UnL4+2U7$;Q|1tL?{VdoV)y6)p()=*xoKse~u2Sj&ZL7u8;o!-v?p>T@`|zM7@# zMim19q^Jj=b2Bv8#7LpsodOH0$~Cmk&!!}ScCOuYX)FbH+^B#3z&Jfk!#WmUh*7Em zZ)#%A4BHCH1>d5=GH<_L4Wz~FrCJr#SY5d!LN7&Tr&jTUiL(FM)v^Lzp_*g>ydQJU zn8~X)u|!INMu^n;@RMJ6xDC!ekBC|BE+0cCk#-4vHM1I8d|CWb%m)4RT_Bj z=?ONSz1WlW;jUi_1EWm&D)SahI|I1W7Y*Ecr*iq9ZHDeAL=1NUQN5){e^TNy0;9F) zz1l{`Tn%d`p=|PA8u6$38GpJJW(BJS^||cvOp=R=*Lgt!E2an=LZ}+KPYzb7T`965 zLUEX;!u~|;H^qHsyM7aNU5Iu8!983vC^n?}K2k0L3c~@^qpVvGJDLButa+f)HtL`` zlXg(0P^!caIm04euv!`HhcV?h*3zw{zp``x9%hujQ7#QCkW)ASI$-eSul$uMdyK8fM=v=X-NRH>l#^0^-JEA%~hXq0aG9<4IebFIQklLCDFFgk^Ar5~JKYXnqup{IAR@Uw{5~IL}2!IIyC>$Zk zlE>ctn%3_%>(vR(*h*BAB0*Eppuvp%Qs~3qchThePzp9+HTK4VW??uru= zlg-wwQam{*+dURW4@iNb^}xS#V7@cQfBD@%=wx_uQrcdM`mONTS1Xm1<|g zh$9^Z3EyaS)WCX?6(ez1P#DJof`p07v4J9%me(u5-rDm3(D-EE6{?hZ>oUSR?>fEs z1D>&m`HovtWM!lViyb7NJa1o|x?t?sq&b!C{?R z-IKfCJfldJg_Y8$Ib@_BT-_F;7xV-|HUlJNX&FH*PHe*Y&Mxa3VC(aONLib=J| z!5=I$m5-@zMq-@=*ha$;p%WU=ltE1ZU0vFk<^u?MV6G;RGmN`yFe2^4+kzC*YiFCc z{;IhE4UOTbQFVy-K>tv-*NeCS3rSvCgJl~ait&@VKl`Y^#$RY1S95;}X+(7JC9a3| z7i6-20%(I@p2^UaC}EJv+qiQC>?)*jDMCB%$^{2d$CdLjx4XVSuBEKR_Mvai; zix-UqIf-2WCs3MrOCmF8xttD4p9x>%!-{_8{(nRT$KD2Te88--4jiIe-lOe~Aq;5G zP-0jBdrxOBlj_kSPpfUU);6QkVPi9rGrdu=Vqc`qlGju0jA9JAQK+jdi|{@&Mg+|O z4#f3x4P);jgb{ce`ZWCbpBeeQqKQ@(+m7jn3{Es{+DfCoa7 zI8NFaw&0CRu!Xm9WgsFcXhoCw;V>%(P?C@|(5~YMDdi&pog@HBK(@cTJVaa5>s^>B zv+622N{Y=hyG1L-BF@_UkT>0A~KW&zJZ>+V*SJymUPZ zIO#ALU;9e@kv5T?!KFeq-@dxpQw#eCjnS*-r>xl40K{coxVm4e0;9;ey%u}cg<4++ zwCs~myVUFdj9f;czCMSN{^JMcUYaHOZe8E)0N5{JYi#4k3TY4Mu4Gd$`zSb%-B~%A zum?F*!>0hQuwfC4jc5hTe=JF}3b88y0l1e3DHnpPde(CxQ4TJI%T=FgOI-XSijQIB zqlB!uTE}Pg;yEw5_ZvpO5QB(a0eYTc@p{g`|G~}D+I5^s0!9i1fpIh-v3K!3g^BLW zOPsy;M51=dsKuf4pL@&^0VK6E>9t{(p=yj2VBuTuslT;$5jnMF&sxNI#S2*3s_iLS z447IPmjP^q@?`l90dII?96IC3vw8)9Q)>4=)5Ih98pc8Sh{Snm<9aWl8UeH{nTos1 zEnh8kQjrc!0RS@_VYn9!I^W1qVyXiw);~;!WXD+60a}!EeZ5e(YNCGODctBk&f$O9 z2eEKN0YZupf$TsD07I`V|9LEGeth3Y6Qgo6vyF*yXA9))pdPQbAXX+b6Vkj=`oxo% z0SyhM2amtrj;sXku!=3aDdk#p2!QfjVf9ud3V30{;I3Z@47{ctD76i$Uejo709maq z68TMcgG1_+94jw?$SPO?(>4e{6^dYi=AW_5*$~>Yfd~mj1>$HYLQdu+0L=ryE{yzn z9;Z=WYvkqoTX=&?HkjCmI9CM}gcq;anq6v#O9X%I^GfJ6n+B&B0C(c7JF+hSW-jl4 z6UP7K`V3Fv=M(ek9Jv>Y|228$N9N!7HK@)af}y_YJd#sd0d!EXZR{q_A3#Xye?o!E ztYYqvMt9<7E0dwa2!sl$o*ue@&!_j03MkTrS@DN2im%QHRW|$uX``x zFk+Uvm@@X+;6YG*2J{$o@N@8zSiT6ua?&-x0N10UgSmC^@>WDxnJfmUp=dNW9dSN` zi6L{IDVQ`s35yW}#lJ`{0lAML1X=Pq0K80ZSKey{G0pVuuG+09A-@htiDs$XZ-znf zm)svT|Lk!0)V69+xJM}eOO9SG0j@{n79`;^-svU6;(E=~fc`arlz23?^P=qGx^sp~ zi)C%>;xcp!N||QyfvoF(0sf29a;FNI8siz5kNGM=44l6jYhCQ#3vbc?i5ZTG%R5q6xKr8lqY;Jn{xT{wF*4-2F*(hTB8^r2Cyn;^517bA2^d8)hO z7mrbu06L=ANGsi88`%he?i`u=)pgQ-VP0fT6tsj7mL;}7kV5xG6+1-v#%QW1)e7Uu z0D7Oa>B>@*XoXD2C?0NPh?!l>EuQRs?bp8HRmT?2lDDtka6rv)fli;$(mwe#0O8md zS>5X-2#CSQuVA}62Qflr9#JFd)^WNpKX5In-&udc0DrsF+E=q6 zHb(NqavwE+WPbkIlU}g^tCQS&0@B8|_l2=F@Yt|74mWB#IKrAM05y&1e%&NYPaDKB zcA)p*eZT};tvL%p{Cw}>fQ_0oOvAb2^eG;anCXUhb@C6%0E*#u8Tj_Crd}1k4Qi$3 zeh8vPU?c!KH5|_zRlwd8MpHZj0?4)Rg49~_5Mg0u0IWK)b;Z(5c}mEL$Od`yB;Jac zh>a4TB)NALo?KSE&{k^A71(T8X}^>X(?VG`0numZ9fF9A`5qqd(JYkzTGFD8>Um1*??}6ar6^sBOuCp_G6GOy;GR%1^CMfG2(HDLw9z8u}h7|2OTjXClrX zljnJ90IH&ZGUFqN9W2V0-SQI3&9V+(Oc9QdyN!`5rCHq}u+p}1osI*+q^?cTw)6Hv5^F^|ji&g@kEhU9;XJrW(}0KK;;rkP|$ zh23joZEB{&Ue3ur=>8p^RE`mBD0an0xoSiqt|{#tTC1o)jZ`xe04)Uq=%Ki0e^KpI z$US`{Xe{4z2k03T&-wnOnY`bi0Tv5{1@Cx!i0d36t)`_hbUK4$iF#0A-kUPp!}ne-_wtWz z+CbqgR0_^7>_o4r03k%_oyl0LdYHF4^0YbZkJb4?GfVk&78+Yc^$;sdS+y zgyqp>?l9qM0Ze-RFw+eRhA)EVxSz-S2{3w&klU!oD(c zq84P+0CSNmp|ctRSyMGIS!b5Qg>evrRgFx`jcLfC>TW$zi7tV&Qw1qSz)eVTlB@07 z0P{yvr~Tx>Gn~#X&^3j&jnk(VPiG+j*{6fI*O4Sd5K$YLpt2shgALb$xbMJq0U=W1 zsje4yXaQG$^AibBtX$X)G2gLpo3pHi8Ld~#pO$2~=Fscryw$Jvj-+S#0GbIwUsg6J z1IjPpaLZ**2iI}boAO70!A_?}GOB0^IqM$lL2`>R$2u)Zf7u$10Cjx=r|+>@OUCex zOieXxz@z^w3p=-OH(;B=x0y|;SYnsWI$>0_yymMWr&eD80o7(l;Ej~ZW_*$0Qt~gs z(ABfx-Amor1p4YuK9}U9S!hy9ay=$1}?cDhO8R_**~pxlXn7$^}a`06wHE&@db1-%YwW9VCUfaXH1KY-$C( zQ;U*yYzFVGT1g@d@D;_I@eYKN=o;`>03XAre?$7`#l_T2xU=71rg7)-2w!}%S!vy? zP@2rw*V>9hrQwbeEdo|oTss*z0X$zr2V($*5%*A|$AKyc*$fQOMJS1(-eWweciWHG zIq5u3_{U#rSJf(XU_VG!MHKpRqx#B zZI{jSu;sAK0O1ojb!WP1>vLlvkoS@(Sx3vCOsuh(icjb&QEMXBWqvKNVQ|fz)(TDM z62hfk0JIZkUGPSD-i2>9ucnsE=2zZ1my#uvV{}c)Lr>c_-j~S0E~U&5?mBuLj$0dt z0T`vDq%>kxcIX-R?tYb@r-rZz9Zf>JDPDyNd#0l5WPJbHk2C?e0UGS^&WGOf0KRb3 z{VwKjpyaetfLKFeb>m;qQv#x%`gK6eWpwm^nu0x%9oTdgUJ_RG?2R0^0Ps7QzeHWH zWFipuJ0A}x-b-;NQYyt9HPrfZ0F;hsH2cmFC@0raX;x=O_l{p(0dC!N7L6FaYP9;w0ZuC*Q zTmTLk3H^%H{n`wjlZUnl+#g@_pdN2*DgsjQB>*{G06vQBd%DWRvMBIn3XNR;)YjR! zvq`%$q4~wH+xb09nLrKQU_zy6dtLnFoT?$#iX6>}E0@ zMft92u`wpB`**)pNc5l1X~F;*c4VDL0ld=LKjie#OW`Yt*X&c)u6Yxjf9&ugt}v2b z{?wor6e&V=lyO*JtbzQTb}AAo0Hkvo#}D%1mv{kdagI85ru!ve(0DA$=P*;3>#G{+ zIw!y*U>LcOWvjTBB+Sp(00YHzp!#DjupbLd0saKMC62oG8mI1jAkG@%$1=>ym1JDb zF@n5j7)Let+P;@B0p19D)C`gg0QB1{y)lL>tAg|NXiuYSPAO9PzfN%)mm;eRSM2>^ zXAnscNh0|K0mv|!&Y;gTA`>F+F6i7)`(~Zz7tvNf0mg;y&GU6*=1D+XnChPJ(Qx>! zn?i6*0F$CrYpbqKK?HOq@#lQB18r1R>LI5MLVHr36s7n{AN$|p3hagsGWIF93}Qbo z0R(grBH*@W$4Xh9kbpFD&pFF0G@Ax$!^3NVMp)m8%^)Bjo=?ub1Dd)H+jhrE0hi|< zDnZXWy+F8~Xp$JrS!t>je$Wt>5xGDQPASX&Ct${UBb!W?d2(fo-uWA<0LC6d68;bN zr*Td94r6E%qW4r01VXG4^Pr2=3D4hJ0DtfKA)9yi*PakU_;jYMIisS~ z+P!f;@}a|-`u)Y#>MpzFE)CUtL~e1nR~9#v0P#mBt?8VtUKmY=%p`=$giS8qZx-zQ zUJK#=i~jwXae0V0R4<%t7FQu;md;pX0PQ>nU6;3Q-S}pLu&^zlO6%18b*{%`#Z>Cv zpVi6=oD&;>f#UR)eTnysCIbJI0oIW5v)a_O=|Zm~nPBFl6@+P|yEZ5AE#S|B0%#Jj zqpR}-9X44@H{=IWOI3*60E7*Tlf+(P-5y+8lynOrd!QDH*&xqn4%uX*8!L}9TTAhR zA68=Y#2GYQwGu0N0Fypc^Q-W~23zP}Glhr|*>0DfP;{p(=foHUD>_g_$c5Vn2A4r> zM#ZOnRWNd;05?2Cu9_r?3t0t0i)n|)6QNMRh;UX)c6cMZbrU4>HQ0~qBe_=8pYGie zfmiul0YMDpWpnPDJb%mmSeQI7n`tu|iY~*nA_^-m%IcH>sHPop2{gvEtIA#cf&PV} z0sFi1ql{?22;%PTeVRU0Ez`E`C)MYP$;!$>CVztwV^sgMQfaxy!I}52GtTd=0TA*E z##=W-3PG*aYWtnXg>zt=s)0pDT!zAPYv5`0k>U!XOCegCX^?(WTqn7a0B!qf$L4Zj zZ>D2d-`P5VZs~}OdTuy0aN=Tat7}VftjV6y%JHsF^l*`*sIEz!0pJ&amP&gV$GJsn z*FS}$@nvo%sqa-Kud&VONv=LA=44A_@LTp-JT*NyWUT{@0Fq{#iQE92MIJdV*j>~=I9YedfhJb4$Z zZ)6b?4v2RRQPq_2^0O0wo~5@7;V3!c9iN?60T}jH*nT~scX#AY?pct-PW*8v$t)Mo zsdtfeHB#g4WOxQ&3c#)uItS}U)5IF~?o0fgHaJOP2iL!_KDq__t*8p%Wh{G5V;lPiX{l{)Zx zbPkbu&_O+Z=*(z#p$J=;0S`u&#howX-LSiyLKjn7Sv(*_?H3sy|2SLG%TU7MuMu^} znJ|qJbLliCD(dR6087avz>sK!3dbd6N|c!}A4xQr-+3W8MseqA- zZ^jln0TXa@CI*uxcZB8?P}-i9?4Ef`oK6si;tQJ$tJ*f(TX26tcXwZog>^XDL^1R? z0HU3F2jTNPRIvVXDD|xa`DW>6mK;m7CzAtcrX0E%lrl(*mrb2rFKC1a>;CB!0ioQm zx$>SM?;lM$;HL{?tjUCT=jd7(#p>Z6%ByWw2*v8@!Y>^sSQ1H%-1KKR0m^R`9v$2A zA#e7hl-KU5)qU$;>DOh_!=!E+MKzw(MR<@qRG)G?p-iGhnu#T5l&VyB3$;AC);p-bc_z64+m-u-_XtStv3? z&$-<Zc*8$`P^7-V2kFGnK-R0H~ly z@CC~g4mfL0!$cpQ0OYJrJLC=LbYT(EOs3$~)`jo;i0h@_J`%L8>%smJh7`7j_NpYx z6Ju6Xp4cd|0D~wpooCL_w<{ee0Z6vsOTZg~Q3x??+iSfH6^rSyRqphy}#N zCoEVG0JPYdW3E>1;90(DZDN(*lO1p_*J`onE9Uo=%lbFkCldZilo8S>2k^hQx|hkA z0C)dqrY{(z0NDS5itastYlW)lz@*q3Te?M;O_Ok_Y#B*QQ%&?%UGUm^NRvEr0oy+U z3y0rB6U@-}2ZM;D2;B0lf}YQ@VLfW@fARObxa4=6g-A8Dkq|sjZ}w(803g3kRw*`* zSkV&uS9Ub77hjm<_(^!UdxMVM1qn2NO6hlveuytAWpw-Quw&3~0iMRaK~IAOU0RAH zu1h!s5u0IT*dZ%ysS4LJ4MDxdTO+ZrLao{u2ISlpsLD`D0Kk2%Tb|)5E<8|6$k}q% zRN1jkJmLwv2oYM@N3Zow;bBSm_RR?nLO>@4W5Pq105kmTz$b-Zxf^-uNt!hWhtZiP z0aD9G2d|)>a{dI9(Lb{Y}n>B8|6%)sV`ndlNk080QD1x_W*p9r$D;{d4I`E>Y0MSN-!xy>~| zA(elRw7f?S-eSa#**JzE>CzfC0hj@Fc=@Rl@znCZugfKR48q+Fw)g|NJqysI{>Iz^ zHjCy!|4i*zCLl)mg8ap90E0;JgVv2W^AvS+C-q9KT7cV_=97Q1tm=8YV>@fH4Y5^W z9wgoC1+IU6tWByf0RO9Kw3|KG%YdXQUpA3~7vlrQwK+zbttg0QQv-%gvP`sH*PEe_jU(7$3c9qK(@0~z0O#LC~bsU^UHDClTzV1YKD!RRwm?D`D0`?OSoxTh|l0Crt@ zkH|+VFqIk@<;=2@89xr}-jQ+Gf6zQM>LBU)bxygc0njQ2udf=qml`|@0Ani@aIr!y zuzWkaV!hhLBwbo!=IPlngNupz|309FlSap3J!y&#S_ zLK9&^Q6B~fP;ti4&};tYIEivm*L+;@T<)5ld-zE%y3!a-03&VW%IqX4+<$Yn_lrGD zorn**5rxssK7e(XO94Y90WP!BhE3Y0P6#>}Zi3>bx7X?AS{Hy92k<}*0IPQ^EOZzWDX(@-1cslLHY~`?UFpInGhB2nZYv+A zA~83|rob=*bJn_FT;hWm0Cc32mG*?W5w={pWmMwrMbbtJWnU51xq? zeBJ8_0T*;A0}`keZXD~Q7@VZY(_Hh#D*N?SxY3_cFuaA!=C@@)eD*kU3U1#txA0Gi z0Ko4sYte)k55MN$r&!2lpJ-rGB7I0vs#{nor3W2{yiU(L_Ik)xroK%cwO;fH07sJX z+bUj@O#YQO72fg9puT2%etG4wH;y*1Y^jNrYO3UUjnxIFwDXL(`Y}#y0MeSwnY14F z{cHupF3e4n{`VjXeP#g=03%I(7JYi2!$-{0EtoqkEizgYn9lHaqQ9ZVn`&{V4e`} zu4>^uIy;Yhc9wNC@!RKl+HE!B2kh+H07_A|rIXQf+d-W=ZJSxWJpsrV(QHd@;0B$Y zUCd))8xFs+2ndfBdnA=bCC1E%0kfpF_LhOrV=H-hB=MTkRK^X7sc_M$_?2{LsGR4# z=T>VY9L_a$Em<)ze4b#50q;So@&QJXaL4&i!5W*e4R$vb6Y`HF9?A`UVq(C`e{(Cq zdL<(gE3gP6DLn;w0gBKc9+=eZjzMI;>mhIcg^viE)1pOcsOm~@KOviKy3=^B5#i3} zoKZItCa1oq0F;;;1cQ5#ZlvaTx(t6p%n|6zmjDF^!Yj>=zoP}T+h}jrIRC=8@7ik=%YEXdQu-5bh8|+08MJ- zW5#rw+%cD5?bCqC%y{%&n@>>kng$p^j;MmxPsUq-L;|4Eeq8BC*GyB90b;nY=UGoO z_Qf5Bo84>@;YjdB%xmJ=?z{01=h9)PdBxpLTyv zPZ;82f%6^>0b6;}qn@dym@68zzu&bOvKEd+FPr(1N@n3F0J~!chE&&SDR5cyniRI( z!gX(Hmk)pt97AFJ3^UfT#x$RG(9Vm#i*ih``(qdP02FAQ9BSJN?MTt?&P z7*?)UCfA0_`k203H;EcO!p3r_N2BgAY!m+g2w~jJ`X!5&L-6 z=2B+!Ejtcb2-e{L7nIts{vji;02zFd931!WYe0f2mr+HSDC;C74H+14r`?2=TeaW3 z0vjikKm;`n>V@&PTo$b302susl&*|YF}Q^CzW#@H9lXKM%Sm==9TPjB>mSUqd!K=> ziL*p0??#KL>p+K#0SrS?2cCS^XU#mSLB@Bz19ma|n;2z~MCC>mj~+b{FHoe{AKbQ2 zBk`$bZ1{1g0TSx7Wwz+f`yT4l-z|b@B)C@-$ohc?83JsBQUw!hzzrnF8ziR-JgMJ> z(D!i}0E5L@Tk5;h7EY^C^|S)s<5))2(td;RPJ0=g?+cL1E7jinc5r?;{EYHxKZ%LKB05l_s z)?hUrLhG8ueL(8CaWeD)4yrm=DV$6>r!3p?{%y4*>K$)Pp$K={ErNt2a!02n)wtwAeWI)N@=Q;mVtTPwU$*8gC5A1|hpQM$dX zR_K(S`>EEqwlPwV-l_(b0mGvMJUzFd04wxV=VbwHT+d5r431kMi}sNupUgXS8jb_A zyQ_7B0J*jgt?8v30iJ=fkGB1+HH1|(NWhNmfI=0ee;dX&@yBtV%TGSIA;eII4enHi zy{1o3-lE%F0d4zN?qwBKB1tR;6@)sR>Te4xuoNXU+go8Iqzj`9^kTdS3V4+i27~Vf zp!G;p01lZ0czUe1veie1NsH5iw6iMxnB~6{4oL`47!e7wG}^7?z~!ojccKc834XYg z0W~oB$@=1c>GL-NCHoZnwL$~PEhhZ!SqtM{Am=*QS-`WS7Gs9=CW~CNFybaV0a1Jq z4V#Evh@v@1ldZ;i8|Jyo zTUiTi{e|-ZxFcXoNSEKRNr4v+3#Mtb%p03m3}(JlNlS#4*CgzIv@N^(y)#iFGp#7+%j4Xdxw>0X4K)D|l4i*I(_xGDh>A=0FmzTuG|xTEI{MacZ|>+^ObF2KMM$o zyHYUsSoUP*wV5pUccmMZ)^j6=%MHW40QM@Qrl^Q)y%%(R7JzlTjyX=E;9!HSdY?Dx zfdY!>(jTjL=JA7^xfLj$81IF%__Sksh|OJvPHnpWVKI??ocf;{ zB*)d%?yCkeQ{I|d0T@Ub9&8aW#Z()n@L{^u9!E)9`Rp_^*!y_CmD)x9^F%Z$t)pI@ z2D-M8Y8;g>0Af6kiN=SDlWl00_$VS%4<*NC4A!T>lEvnmQ+XaUQ=^n;bnOrh7%@;s z>6HL!04Bkj<#f}DXIihWD^ztO!1lvPH}F@UE*P#N00+>0e-HN2?zEM zu;eQ%yL_}zVR8LFqtcIkUVjefA1+FpebWh}?oRc>@TA?2t&f3a0Y){4$wNY+Ob?Hg zEs-Db*E4%4oa_d`LxgoE;B;JOVsF6XpraqF;c=#CO>udU09YZ=v90>{bSj70D4aDy zwtyuH;Vg)~*E2Z091?YYiwsXp5oBnrxgFRLwny(bDT85=PMN>f=Wv;DWV!}0nKx!SOI@96UfY3)?bVwI|BKQ!t;GQqvFT2 zqhUw*nEn3i%#!Wg7l}B}&yy$;0cMJj;ZS1#z~LlK7N%r!XGy{&4+B|6Ibj55HB6RT zDFmp4yDfvYhN4fPdv%ikKY9wW+*HaX<~tpylV0Zqh~?3B0>VV+h2&S4W`ZD8qs=6n9;}xr_#z0khO7)bMvJ5e$OC zhrRAiJb_v&Qz~|7XfT0fNCnfDs8Z`K0^aLMuj3 z_0mZ-7BC{602R$*UlaoGepkqgeb zuePF8ep6Wj!+&$ECO|*a!1L-e0fVB?h*2midApLI(7W8B6l*Wae(8S)5=~F!6@5Y( zc_Y*3zua;$mj@FzokEhT0i=0e!6(O9R2<{Ju?_I4#q}BRB!w%+7ZLBYB8irae^}ah z0pdC#Ffsw{3RUy80PO_f4)q<<+P~~+;YVZfCk7mUQx{H1t47wr68D5|D2Xas_#mP! z)5j9^2Z3qV0D)!{Hz$K<6Xgb^Xy-Y^#zhV7Md@XsehR^6h!MI!!_dlyATP6)echJ2 z95a<-0Nl^z+(65|F441fw9riYNz@+(VO6m}m(=wDwMd4f)z$)z>SA7KN_E(gp&vVggVI6?OYE0D0H!a# zJ2-LMmBc8H4g(T-r7e;`Q8-xFrgWzJ!CRU|*MZB6K`!wS344Z(@QP$x0XZK)V{TmA zI<$TD4thSTqRkTjyIj-=85KxW!k?V&i8IdaMUIH@5vyhl^E#7d0rZ@U=&(G6em!0O z)c66HzS;wf-iwJCoD3RIeKTr$m^CB}c?XPpNP==ugksNr0Ki~n$r&!;boxmo=tTn?i9pa zJxYtVF`9C*pD0p?H5_)Td9vEEJfh&kNOdMM0U@byvdZ6Pr!@;r`0xht2|$SKpYZbV zId1KzPR!NBO$|uKDi}1=61eHLN8Ju}03S_X`6r0-m3nSy!2qlHC@WwBA7839_(my> zn8UFIi7&pnkRE-qPNJ9Q9_%RrWUmK80n>`fUHurRlVKysjWQ0ZuSh&2?d7JDVa%YQLIZ5atOtN( zviTzY<*p9Iv~k2|0WaibT;S&gJ6Z22-<^(f_%a)rG35fA;Qb3UQZJ^BrT*V1ktGaI zVX_eH$q+3-01jhgD2o-}|9CKf;hOgwZxNYidK4r%?0cora2JI0$c0Rr*1XLY>a^AO z?0oiL0UC{lg>`isZ${!(3{)F-?${dI~OH+&h(+0x%8^j^FNk~RzdY;f#3QU;5uFVKXBfWL$(_lleyb}0pB^XV(cBm!l7^) zTfM;40+JbLTZdmLxaIl2Rs(OXNJ^=?S|I+W<}vq^y2z)70YcI>t(b|#l+%@k`}!62 zy6i^OS^tI(+g~`@^8`TGgT;-P+G#cN&<_%N$(&d%0O7(5g-t%n&~uhPcAJj`OLOgL z7TEA$xIoINT<#TC#b`{7SzoKu^nJG zk+gy9VOi~k%hNZ`Nf&o9`7msR0LGJY)925VeC{4|0+M9fY?6ejK7}TzDL7C(is&ts z*v-|nn2Yihhdk5cxsy8;08%LfF2qtkH+s4glu+gu2Ew0+1vEPc>xJGCnCRFh%nv&g}%{QeV^>a0aY|O%Ftdqo_hS?aRQ3>6_3+SBHfAc10W3w=*XIN@s0Q41%1uA)V_CFOv z6%#CTqsYVsD}SkPbT^)1Q!;#`z$g;pQv-C56DF8e`YT3R0X~yNJi&W#$Jkxa?q5(H z^!(eKSicyFbzBExJlD~43__~88X_Ck`K+=|7SFq=0s7;W{#{`^BK)s^7#FZ(Ere$t zjb#N!fc+N5@KR(BpT6)oUHSw>xGhsHQAvYf0eMF25DdD4X4vM>+i+%(40tp$b&F|t zH3Q~Jsptx?IAhg$`$=q?cb$cr$N^Rf0K1#!hn1mYle~q$t8d9G>Y(TE`uCK|D{wVq zpnw#efMo!N3L-AaVjwu-i6f=e074)?QMEp7<8?w~$|CZexvtrHZUWHdIQ~mydFF8^ zM5i{(%>}<4f;hi@cUG*I0k@@dK%bmCeW-i2-(h40{$;L?i!ss%|K0=1q2`=bEnXVI zQeEp&AtG-oA{bjH0Alt1nH??V?DY_Z@{`KS$={jq`u^uBvJjQpT$YVvhq*IGoQZL$X!Fi@_U1{vTG(;p$+16|bJ(1#X{zH?6iaYE0z&}&b% z0NZg$4)V@U4=o}T8moS_wlFe*_4WqR7~m0t$Sp<0;Agb@_fh;r&{ZgOROm6}02xXl z7N0%mXXtkv+5S9`Zz<~CnbW1Im^=;6PUhjX=yQ?#p~lY1Ir60Hz&K^qVy5 z>j8%!a@S1(u(Z_G1^BG0eavhFFv?~%(D_2<#9@>$G`_wZqMs~b0K`w*e74mQ)RJdt z@8HOU-ivcy&pxcSQT21-2!}@tM6|q8J4p6BOxg@qg?Lp40bmq3hWj`)l4|`PzS)yg zb(8Zf)yvs-HEZm!37?*Nd^a+E6NgS5C4C&->sNnQ0o&3*l99+qpdV2#oqnn&^twR^ z@Id^$w>`ZX@ST~u%py3uMEeEh z>)a;zIiX#4D;f`1O^wRGu}^G^0KP#|aOhIfkCDpqDlv&9@mC<%#iXajal0ZQANAm{ zQ0TQ-&cLT9!$FXsnexT907-<;a$oJ4Re;HVtSj%b&_$?(`)Q|37um8+zNBrn5~k|N zUzWD+w16=-xpxup0D!JV&5}nHv=ziL5XQs6$|L{8Wh`3ue=YkRqL2pX^ONH#o$dOj zHD-$pTJ4yg0j!ZkMfxkSD-%#$%3s0V1E9 z5?f*S`NdTHF!^{&Sb5XSq}IMAUK2BBWy^(Wr)GHRM+_+}S5NV%g9<&^06;o$f+Qfl z)M{#CgTdy^YF0c6{8B~D!PtFuNKbXWF_rd1W)U|8`@@A-K-K_d01(yw_Bm*Fu!vZX znmonB9k!%(M3eh4;^E3U7K$D2G;S*uU>b|^q4$jsM{|Zg0XYoAV0yME{c3xr?5ese z^N%d*pV$9H5&&614}&x7OKQ+-k0t_UV{w!l)!tP;0lGKx%#TKePV+m9LIxB=Fi>*u z{uMopRiyGgjeB)+ss`xpbGjRwv1?nz$W^Lf0HF1DT5B>@NQP(^E1{am7T<{s$mfQ7 z330_rhnNQ&CnGvP^#xv6YQIY3p~~_C0b%Q+V7DTV)bg@db^{B{8-K&`xFHbIK%or8 zg40u6H2Uuf`P#B4;OVe2Tg}LO0V;`oYO3x={fLBTYJehjK1lFQ`fvq;ZbqNQw6d@V zMXQgR+UiW{CZNo@T0uHs0Nlu!18f3|Nt&6z z<=m~&pU8*#k2%tG40bQ-80c_cn2m3mpCt&3(AXsO;tuXHjw|Azu(SPTF zkZ;*1EGTHDs^=Gb1cmC>nwhCA0q>bgl19(j&J(>PSzYzVINGRZi~i}eBK#p0g4_v{ zotOzdI!x}cJ_*4wgm@}P0A24u2}LC~M5GkT4K(uZ)3MXu98~9HViFKS*TDXUqb-PP zEFR`8*UNsi5%ssr01nS()I!p5Cf}@kanmD7K^7TtVT%#~$RF9(!d7i3lZ$5Y)OFH< z*m1XV20*D}0F+od^N4H{dv#Z?D?Bf5>xF^uVHqtN zllnT30rAXCNiXDR(ClV*Xy4=MZH?1@XT@b>bcY|6>0j`hqC2vV&DR&Q&0EyGowI4I z0Hf5J+(J|6jUeB(Me1k?_`oOlAJTNecjodJ#f6-fDsxp;=W{Y<_SB*3v*Be~0GLNw z9LG&aoy@EBZQ#|sQ`;_c+m-!PbT`OJB0C>v)8Sw8y zi)|~i=tSw_D~R0DL+sv21ttCK%Q;(HEXK^ub10eX$>wAKX_PbO0E?`^9AG~T4%5VO zyZW=_@?hn}Hy|%Dn`tKabT0lj+`QfLy^auIZUF*y!J@D10KvriR14$dXBIZ0{o_fo z#Xj;4I`Sq*--N4r8_4`*YqYxP9buq@IBZZaGJPee0ZLI2sn#@pFJ8D@75tMkBb&;2 ze38aaS}dcl3Pg&=kf1FKln$q&qe3Q862;1T082Xt!eJ+Lh=*fd_Uxuiz3{HnZ3{F% z$MYF|_=7zO=AxPP8`sH}8b{^geBSN;0G|+|yKgdnv0!oo3${fEo6sMNppd;U{0gVIWACF@crn-M-f1+Yu;OR`?b(nc@?$^mmCg-9o zsE0p#dW+VS7R}~ua8N!o0DyRQ#E#Q`CJYBW%q=rCmIP;c3}QUdWJsYHj=eRa)b6X0 z@C03AADr^qUorKT0TOF~I`&clIl7AsAd_p_ruWB7>dCM)Q=nMk&H!;p=@?Ba{O96E z*$SxiiTgQ}0a_yBA(2DG`K_@^+H&hj{U&5b{Oo3jP)u585Sey#U5}Zj6fn5n1qN9Pr`wPp&50o)VCZ!$)*kTSNZ_L?;<=acL|*UT6A>i)LK)fm)pqNk{=n58qh)9vI!0Hz6C7X4W6#2tt~ zm_{Hs-CJ2|6(X#g0*z8b@E#sk;$h5`Qs#g7dY;R;IRW~ zKDd#E%H+8bG@4rbPHJo*#|7%v(2ihbYyx;X0m{I$MNeEy$^wl;r|=w2IjWtxmXny| zW>K7QKH#9?KfhXx-h3O{{#h(tZyRdh0K&TR-Z?%L-BJ$32(n>}8Edh^ZdRWdP98U- zvXKWp+Y6lq79Xs<1>P2hZ=SIR04|~`fYKo@fMIA44N^a!Wpl2OuLv)_ej)`zS5VQg zLS7~tYg-E8a-uJyJLvyBB)WRFOHD- z8V3;Pj=b+s0ENYz=FnTsjq_@m{_2>}LgB^E3?T8Eyk{Ye40`HC;=`E6gHr3BC3`@h zNSwMO0K$!*n*3(z?mAeN_a0kcJGHchPMk;Fmq&*Tz|OVk8!1k3hYayXd^9dMnhF_;Y80Bcx8 zcNT#EWWWmn=vIzUlj*#scX9ShZ>_>vRTx4m7$Qp|bCjrF#t8f@Z}Bfv0I+tWBJ1f%vh6B#Ux6-0=r(1gcuhn<*QJf0Rp$HH)C(e)cWwf zMiDJ2J{@eEb?Rk#W1y{S2Xfaj3L4Ob7xgO<#Kx8=Q)I620FXVxrHTWOcZIx&x;g(! zR);Ue*%GhGEn6nv`0lfK!TgscR*YSV><%`JyVhhP0QPPDjqLZNP>MC;v`6;czmJBK zqgeo98rL-{H?6vwI&8)U3R0r0|BPxp|b{;!mfNL(Qk#H;*iDz0*Ah%+(n zRi6WhhQz*+(panmhf_W&DjscK0j`o0(ba{T{8w(3>4*O;87wQK5Z)L+8dpb>aAy-= z_>5~vvKC<@fu8~vX>k7{0nJ;BAlwLaV8FOFAk8sVGgaaXwv=fm=?OUD+olO>sEYIb zFCIMG`AyX~U{+dZ0JSjQQp|t5+@9Tv%CQ;Y2#k)G8q1nP!yIOEIhihF%F&=e$)TCB zXMqBMvSj^70M~QEP@-!`t~VFIzWX}k6a`#@b|&KHa^Yq}EWnEsa3zB4ECR6=ckMJV z1Kn+40c|tVY0~%^oaUMle%2LC$tQp6OuZ1$S!dROJD9COMECf%*g}8WQv_j}=al(o z0bXIqisd3E9)_#7_pN8~Gw;+`B2239VwS$*Mi~om0U2@X*JXqEQYN1j*ih?z z_?nEX*jh_3T9laN5cKlJl>-@MY+||gM6>iGn7b3p0Av}Oz1b#u?UNLvunoR4CSJ%h z;>y7PYEdoD-*?T88<2$w^l6gY{XgX&_B2YK0EbZ=_>C$MOccOdIsLO6a6Y~-Bvl3} z&WN>o^lo!+7Wu>!s{=}`{;5EKMcM2zpJsxDL zQ>bqjH)BD_!XoPfq{s`!F!z<=-z@0J_uGT^dU<~<*}Edc?7 zW8h~xwI#inR?=|p><h(yf93T;UhB_5e(lFOd;!9p;(R5|3f~ z{~1RrUFm1V$2^x0*{Ew^G5ys`wtChD(H?AL{CxEkkpaucG7fsDX8R*y?wRnTdSI4~+Ada+hnO2aP)*C!_NMd-5wRK)4U}e9iveHVu&SPQtIVk&AwZu`hC^n3#EmXG zyqBSHSY>VpxOI-v^APhQhC=agpACx_odFh(5ynlMRT{+Te{$NXvm9)yj zZKOCep3U^8#Mr?OXYFs>_b+9RNH zT~Gq6d;zMCC&hmpgaW3x{nbk2`%a;cLhSLduQOjGq8c*gh=R62ElFIQnuL)&_phTI zEde)!>E)zbzUG7{qGaW4>m>>O7fb)IEUEn1Ww-=BOpD@830I>fUh9FmPu`o=831)q z=(GNoTox@-94aEDqDzO(Rr4<;QrSYZ3Z*KQ{zyO+^xkQ2zB{9u=lBoWMgfGhGNBjq z_DjDd(Y^bYomi}*Whzk1DQdQ_GN=`&h;L(HbG{$cL%nPWScp2p2LUWvvRkzqJ{A1Z zlNZ=;S|N5rkr5?te_|>7-P|M zw7q-f^E5q>aaagoF~(cSEMC#V&U#phzS*6Ol?Le}X8=;KpRZ!Qla%=%DS8ejOnMC; zPa*A2c^#h$`f-wv4t>r+JMT6E0E`I;dz=p;909kZBu^VIP7&n4ecOxv!Qid_?T7#m zwM(9BcsDn6HH{}El||y$T3u|fi#wNSumCq62~9$ZR9HKBLEdmQffs8p6)w24N`Z(T z5LzzTyL*52OQ6L8AKVZi@IalAegQ5W@`c*k_f5to6V$a=%DdRP(UER?&qY54UY{>y zW@HMwSh^DsQiO;AsS(l#hyc&Z@;*qget^`B4OJr#ciGE$`4Yj%UxKWBTZ@%u1#z6F ztT6La`+=}0Fm_F(g#p%xnIJ@eJ{XjQY?`t6s8_r0L)2rc_6t^aa8!GkSiNu48}v4| zwul|Vh!;f7wZF+f8Jep}QKB+fe#cL+|MF~YnF-9eu{uw#a<>UCL z_+1RlKmojrwWRuhy%X?Dw!0ANPO?LGqE9n1f&S$vhG8It^|MqrjaTLR{UCo8v+3>U z0s+`Qsok$U_;zxdS;2V<=dV_N*A3Va$bMmu0YVAVvq3>wtBKU6MB=Hu4ar=9#;zdil5KmGc~?_HT5w#HJ&!~)2^oacck+YSpmFuFw<8M zlF~V*_u*D9=BjH7-TVv=@Vy%Wij9ixvAW(_kZb+1k2U)-*N9NC^G$E6acP_yfR{W#-cfgRk$ro zQ;aYerOzi^t9HWz1PYRU>xI(#4cQ*$cdwt;C|v^{YXCQ^j-zp#83gP(?3CXVeF|~i z7Z7BVhmJW+eiXhNY=t=mt~TQhteM2L2$It~l>kk*WKUR*P5Q4Pnec=hRZ6B1$r-xP zFfipnz@#K<_hGQgR7mlN6J{!Tm9_ePjsg4+G6`m#&XpPaG$WCC+MMZ!{{l=5mRm^; zjOAjn`lC#Foelf>XUdBl*D1SXEC5Fx?v0z&@#d)uNkG}_Pq(-Gl}hzqHvsaGnRC!* z)LuwBjJT3uJTX4P7L#b!1OQpQG2$HF8+(k!Lwpi=i(FnPd$J|)O1~#L8em16yL!c} z+oqXRN##MyNo|IyU;$(CI)a9_E3Ln-J%o$RF-ag)bT%6XSK7s&uuT%s>rur7kwA+6 z!~A`+Exe#5QUHCn!5Im?wduSi(AMU}RJgZdInjW_)A%dQK53{$l|E$oa{-P*3 z(#d0IQ31XkScRwf&uMdVx=Ez!c8%1RU7BuX6VKA!6z%0xrKm;2`9Dpd6>!5#6vBQA zk^%W&aI#=z&M{auh05-*5*Y#g$7VRi)h5_8I>?g!Qmv3v_>8B7S<%4+!Rp?5CIR~` zSZ95E&>u*X@CXIX6P5e>ngyf`Awary=m)CQOaNp!q!UAWHkTo| z6(_(A(Z^qmcqPSiZz3Re@qc5gJHpqcZcHs89WJ0dwR}u{00BYuyP*YSHZEFlr%XDN zkv-QLYJDam>jpU?yPgjQE2%Bb^qhjC@sPhw1G+=@qyVsOcD~6AU3;SfsexZI+=`@v z8>|d4gffN3y6Enp;ZQTjn4!MFn4@Y2I}R$&WB{3aTF#{_xCJFRV z-xHrK05KB>%cTAKeH3p-cGmD1WdMON6@XF{1H_3=9!_gG8TWHV@t;?#-_2C;yd0Q0 zD^YjuAuSOtU6hUr2`OPuZvj}=!3c;ExCVZ`jQG%cWLps_*Qh1~+R!1R2ie0OTrgm{ zQI&^Jr%!Rr+Z?>8aL_oECAbZoKbWJ*m4)mfkN<~)St#J2{snI=6ted*o-@eaAxpe7y1YK2RGSCSH`{xi%V5+X?jKOee0Lz&Gh_TMpH}E&g}x$TeIbhsXZH(I2o1lL0UX zWr?v}9~{ufD+kh=oA2>b3Mar6^M^lLq!uziBzxlKNwTkW1w|(EEbwI6paD~l{Tb$B ztF|my?&2%?ujaNm#d8nGCceK0t78N$;#fNfhUY+*{Gn4>Pgt71e*u+sgRmaNICr3o zA;x4Upe0MV;iJggw|*|HqX6nOmOBX-xr?7qyvB|xBw=~0@meV8d=}2PL&Evm3kqX%Igk) zk&N6$1RdTU)l?6mNLuRS_ss`&s6`)R7yuOPhm9&T&3-ku_Iui>f*hz*RWe*sXyM69 zST~H5yk(C3cYq3S(vkl)=s@00l>y1G^ykb+lFPd)(J7#whkZ98rffpOCmn?lTKA8v zq;QLe0M>XQYZ~`^CrL#ItN;_R^V6b9lIk98UZD0{)LS+F^&{n_Y5v9?lvjj zNh2vJ&ob8Zf+#9JJ^(md*7nI+rj+w$JNC}Qq(*1V6&wjR^OL(f>)rC;S*TM$A%8e^ zty#dIc@Nt_i~yd_PeP%r=IU<+PM2Lz=*u8Hx#CK`EBuKJ4Dp=%%1MyaBVy`0oLUHv zxq*|8X#i`s=z9`e`9=;Pc=r`jI0AEG0ROQZ)Raqy+osfU2u)CZ>!qd>{J?Bd`b)fX z2LMgmeh`wQlStxS781OR;|{9CA!|nhly)7I15i5Hy0`#!JnBr16PM^GW&XW1lmMoS zWf#ekV7oe0sCdTh^bj@X?9(OLv7=VLxIwyKqgbR$HoIu(B%C~5%@vM{r~x&#(u0<= z^b*66V(lIBh^8#etv@;TDtoev$K&G?3jrmhsmj2^+&_V6T{?su=m3yBO{#gy5aADf zQyH6oxi*zjH=0nUgG_@#7^Jg!^gVL=&uMGvvc?E>j3ZUv7S>LrN{IE4j6z>%CIr?ga68-7#2TV zz%kDLn+^y5MB632PpEw(;{MwSLjkl4O-LttS!w|^Ho{ztAW^`~;RdQ&YM8;=9avO! zQQqQPK%Y=7rlL#8EXrQZ>i`I%WrBz*fbDqAXF))~*BE{t6paFgxf!rl$HLUkRg*`u zjw6$sYLADx1KjQ+CjjAh_rT8Q-=(Vfg;~1fEi)pb73~>4Yb26pL#W76C@!VNSu|Y) z0Os;fO1QapH37oUD~)gN$B$vQ%$`cn#Llqn_Tl*P!wpENR%v+~eAijkq^4Q7&yj3gB-75r_zl!~F!iz#O)6a7!{RLL!Zd@@)XkTXWV z_y9Wop3n_rR|Aft5&DyJnu(76x3PBgnP~p?L7xp?oS~0n;u+rM?F(kiI%Yh3m;e^f z_f|cfIMG8rR)y@8O7BiNnc>S2dDm2&9_9`@9)L*q&-#lKDMq85c06M9PXJq)Nsa@^ z94OsPi|7@T-hQ|mp2=FFNq6H=#5Z=!DGBsO#>bvzVm45(#(Ae|nE+6rCXi=8HoP0` z8E29vw;@o{;d&$S{U86>0XN-WVi=i)Ulrgt6liws>VQJJV*!+a4&7P!%f&{+g1Hhw zlrdcYU9u4Qw{k7|X_AYZ_uBIy`180Rcmi=3jqxZFa?9ew;)PSl5vE z_6F#tGBtKHJh1ZAoh!loT|ns6%=`qwqxF!d5drF2@=){StFHt2Fu{9jU^!Z6b)eZN zk7tGsips<6quASG1F*!vawxT5eruZ|TmeHup_$`UabfDQWcK`cZKcZk4-0>AO427? z&gx0AjqAw1+!FlrJiyMHs}5C!W&l&z(V7&3?cwh_hH|GC-2)cbr5P0Dk5Vg$_e(i^ zers9z+9i2a{U`&Mp3UHBKLJ#(emZIc*Wr`$0}t9#kx4-3>iRL`5xmqOhphyqH)u=_ z(dm1q*P-@-GFbEDN&pR4N+_?LuzEZrh8Sp`zMuvFFEK%iEuWFwB)P|noADRL=dwEn zkdmRqyV!yKu>hyakYMXbK=rMQZLNY{8qwI@y1sYHryk)5|EYq^z~UOY)1a?qFso}8 zq@_a>VF1hhip3V4>t!p;aCjykUcMxdiBE3G}IlDBQanpudlJQO$@^_u{B7 zO#w%B*x0Y;`My*0q$uPC8`u7svtNx<3@;<*9@HSv=m{P6hUI#tv7*<(-FkEpB>_AC z)YL$s*zb}%32y^AW!-vVFNCx}j#Zl66TXi&YY%Wx_sl)7W?2!_j49Q0eF0Wbe$R73 zQ3V4WbWv-iUZ%F@N9a0I7yhf$tHL9%mS2e?;(sU78*1J$`GaAd837)6JLguFaN4uR zE0c}k(hBY9;_REA<^l)^eM&3VZ?qd(fW03TjRzRsf!RE zN~n=ig}J8!NGIMb8l7)OPl!j%YNc;Os~LL78s7bJga9lz^h%`L>B3(5B;2q`ojgyO zcXDl?>A6asE$UO$gvS^IpIWhnrNpHd{&Vrt+5psa?IQ>j`^%u$RHBUJ`1CljJixf1 zVDBO$SIG^mUln*ezEd>~1-}Joh^eul(5V1sO{OXyAF*%%*dB9Cw z;(Yb3K{{?MV9lw3T>#hmM9Ui|aX-E%vq7{2>1uai76_ zeVy@nf&sa6hS~z;+P3fzPgkRoda$b(jkk|)9-5pEiF#kmZod<0-a0F3-EGdlhdp3~ z0sy#*0A_gVS@zSP0L>wj>H2Tdq>>*h_N~lpq;!IeUbZ|6@o&Z=6&UOe~ zsc|gVI1$Ywru9+!=;PSw8H`~>>pMb^op>jlmJD13sz{?iokLYJJ^>4Fo`H)g#xB>? z9z`Sc!lb$$ZtDf#4*}uOtSG$HOjE*r#3ivP_8Mh_$_`3F z1QCuqk$e-rZP@6yo;noDA?C~Z>dBzii~)NL`uL-C{}0jzdd8A8dEz?35kKD8hg>^1*s`mtyE%jNLB0PlGp4-DL)m&OCY589OLF} zzXE@salycznq4-O%0);tqPcidtg*3=?Py#b%YUjjyPPOqQpGBKL9~oCZ;U^ zK#V6{#s>KIVp2@`R{%7}x~`L%)#baqVA2ADGUyKRuJ4zg8hmSL8vz@`vB~B~&qF=h zr?=7)#OA^=7Axoc1gN4;<%(_SbO zV~>@wR8~x!QRYo0)UC&jtFOs+%36K?tSxeN&zzx`1KNgl`+`(0&i0I3k+3V z`}fHP*5O1%T3<~e8Di`I&iWw?UIj*nm6=k?qya}q3H3$D2%GC3Z!z;U9mmxVj`hXi zxb(n&^Js<#U*=y9aU(iAl_dt%Ta0>{E&%+MU~9v%fEudpS^rbExeV3mu1$78C=AmD z(S_N8lNMFWKiq+z=+VXo*`18Ig@iI5&;TAS;pq=F`3~P#BNKu?XlBjkYML%&+%I}a)YWA^AXvM^dHMoZV~<=z z1w{tRHv#I(4u0s0t)07K+8xt{&c!wd?2hD)ek0eQK-e$5*k}A?=gcU5sjAQom9l_* z4FO{wr#6YnEZ!PZqn6J<#8+Wd){%DZ{@z5UQiZ4+!x?32EznY7KDzYWxn#Y#i~(SR z2ih;L3zOb=;1FVW!;Hue9|;EtY`a09+B91&2tBX8@I+YXKL6CAKyzGR4L# zlaSiwI+YJsP^rh3rv24d8d>h4sHap}AAqF!ehe*GgaGO$T$vHxud8XJ;Fxhljr+s= zDgXknb73Xb!-Tke$3W+dG=GXa8c2YlJzTnpBLPIDS#|@kb-C_>Nluz(jTE|yA6&|q z2~L7QIty{m(8M;07aYvH;xk7t<>i2!&H(X)7L#F*MI=?x~hAP#x!{W86WLcauk z4x*^c)=K_r5CwH{r>*>>>lS36p8(U7-va21t(_?d0c*0Ul33X9H}s>D)qZkA;dg8e z0-ZuBH6R~}w0~~CCv%Cf0RY2b=*J_nyE}Q32kMun{Cxvr_tqsOXJl@sHCOmcL>|5b zSIVlb@rw9Tm0lJxg#hz_jwl>9r5p^98q0CT>oZ;nLr^ceZe1&1PpH=vCl`mL(Jf#Q zK`QkN58IycvH)efj{)sugun$2g{cXSwt+IRlQVT>7E08*Ns`L!^M%TRB;#-lA55sJ zM)E*2r2$rgvD-9`>ev%O?ZNq|PL=uGq52GTuQLI3V6zfp;zPG(Mx&&}L?xmfoXlI+ zp8)n2zreF$*_`G=_^z@bwP7pNf66wowUl)Fj2LnEaf?Z}&VMtE!rib+r+J{FMgf`< z*OYxt2EjrHgL{aegCY7!^hw^;AB;5m>A`MofaVzt^OtL{SueA-cNI36^Z+gnfID9% zIY0hogFIkt4bSb;E#?DUwt-=r5wSq4kBjNi6WpV`VOgNv;ITJ|Cjk{<+r3~I3xMgd znX+5v+=sMb3%b{6NSVl?`;Bo%ahrRiy#;1U^Cp!ZX{i}%jR5yN&N&KR<`tXnzzjzk zHaJG9deIv{7tL2V1%cyaeHWzD}_&H9$1Ybl(syKLL|{e>R!SRI2MSKLB*3u0t z8vyX@3%EK(LbHhudfg_92q5(GSnL$nS~2(=xBIzej2_L~eee153ORE~g=R=r;s6+D z2G*hP7^5d*vu{9@O2;-+J!C^&2g3zM$z`Vv8>}G;+yPCKXkVuXXyz9Q$N-aWRYfXs z>!>{@SAOY?E^+xjW`4MaTY7h;H3hxXe?ZC_2KBrL{`AyE;M^_6)hsD9ITYn zIrSfDb6rLMG(wro$%s@kh1WkTsw%N8jih1f7Nj1Bf$%`VDgkONxj|%XnfB6*$_fR# z1aY!!gQ^?`{6xKaj1qGC{~52)FQO}0t(&9N_&1v)!l~#;cv{4vBuXT<-BD zl=|$VmryU`SoG1OR+_GQK?dmHhK0wl*Z`3D9gB{uXU$Ps533zm=t!Ulx+}8=%l$v> zWzd-u&rLq^l&;c4krhw1?+H=MEdjB|`M_%F)((SjIhIyiI`mzDMaH&oZSenkH{Gof zST_q1M}lD269uJV5ERVsKLG14L>vHo2QxqaeOLoj5~ai*o}%3|5BZji6EJ>_iZap- zHY4Oi*HcSPwd{!CY!F`96+G`M_*;ruyO+I1%L`VF4MWGQpSE zHrxrEG*(9JR+WaPh30IJMGaf49naV1YBocra`LVYHxB@w8i5O~tN>X8{jH6fJz70NRmybUSpe6P6E=mR?3zP!Fw`0Z z$a_b`7Nn+kD1!$V03&NrhnuP#J*1wE;&Ok1R%Eu6f&r>lv@Yogmg?yeqn==qOG#@V z6ydjZq1quJIALlhTXiydik)(RQ8ge5eZQDVdH|>cq*_|&c;T9Qz&Lw*{9^JTLoJ?z z#K!Wa{#A%i>t}S>NtveK#6`{n(M4N-hylf*r0a+y>ggM*GuY81-=}-{ zP1L=0F&81gb|LAJ3ut&S@Jm&z1_87q^oPdT8i7NNWIKRM8^L_I#re;Mb209W;)jpQ zyZ4*HkX5>@!(wynH+8CZIRJtW)zYg>W!8 zfaDjs6vvm{ydzslKmcp38oQ>;T)dC)r`!N26NIamTu*%Zs#_k%%%!f{&xt&sbImwT z&Fs}2;!%!kApj5t^?BN@uB&3QvG;eIxm|m*<+7D=geEN9EsF60kqC2;Se00 z`~a0!w?-`X8QonOu_+sU&ji?MN+kZ`sC6~`T><|Gmi5W0G0vmg{scbIY3uJ8hX4j; z#)l?W>_RXHo7oKT;N8|ESb3O?1x$TxpwygAU1v0rX90xL-I4`4MR)Mj4*-FGlLg-q z@WJ)W%IIv@DqIS}e7&rEL<7?%4&|(=e1kT-N8N}mT=$A@kUQw84*<@(u-w`6fPM_4SIYyrR;z|S2J0~s0U<{icgS*tlO zB;8o13FO$ldrFPHk1e*-Rij=%QMJMYf&DBRX{#9Ee2PymIx!BiJ{sC9FqdIteqB}Z2u#wy)=;E)I8UccJewxxwnMAk`L zuA!bQ1oJ^pmI2x^|95`u;}=*muPRJyG_O!reIP!l2|5H;+;21AH90S*SvLpj#m*2< zsAeS*hXGqX0B8$ibEsTd-biEtJ-?}2sTomNiDl}AsT$pTat{3ZgaKD{N<$MJ`O&Yqlac|ZflI`P^g+motIB$H$FepQdyw$+IzlL6z2DI^St zK$;So28BDjR1^+;2{$TNBrBUwX-?K9s$CAa7WLclZ5PrO0Z04VWC3zXLiBCalDD#y zel6jx;jn&+aV(ruV{fpGw}4g0!W?Dp9*C5L{x23_MlbPFX#hXJY;RqyGydbg{@WQX zUZ`@N(bKL1`*n(+kxcLQM#@<7%zDT;_&zq3U8hKpf&dVB!Pqa;IoVQ`W8$FDGmKo< zp4IN$z4*3gkzud}YHeJ$z0wY&kzWJtZN{kCECDg_<)V4BE)#Q*lT}||$eSie#o>;7 z!EH+i_0{K&9bj=_`G@Qb`k{0cgz;TG>j3`9XzRP#&AzXu^Yg%M`mw43pIEIfjk!+x zvaN@4L7H7{pL|6Yr!s3c^m|sDi~y5jC^ZhbBCzx&Yte4ADIhe`fiKYU94{g0K?~Qc zuYTUD54E8l%gOhWU`H@BLIE*M9r|RpT&dPJFIaICb>Yog-qa^V(28CC6(e&8{_U4F zXqn(k6KZa7E=)M^F9F&T8e@?W!zOHYx{IPRoiur8%ZR*0K2l;{nkhK6?&G`RpOb&R zbM^~<@k(ykDFBRjQ^cNuuW@I{&*KSKDuX8K7@4cG=~CY3<}hQh*(vjX5*aD1B`tdx-%CfcnV~O!^MU~%{1rtsSyD{b5`csLoIVQcP}&5mXG{hy#O9_ zM3qv-%r{B1vH+$=SwD~P860Dq z5x+rgF6yw8KXZi5G=u=Td=t1eT>XULYH6Vx2SF{7!9ls{@c=JEBVRxRMXH(XHfqBu zo}k2f31(01G&aB(!SfBbC1rNuK_SxK`Qg~c?2)Cae*rFS%8=qpjCwUt#7WKke`^$;G*mNykb=}_o|57kxI+Hl zItLWzUq3=zY`ef}sK}5|T>(ltB^tEoYHsKe&3Ohzkc@ZU5t1k9xXtSh>h%Vfc*5QM zt{3tP`Hc-K`AM4-zW`X^d$li3jsU8x1^Kcp$nNfnDf=*rR5N`v9?>UT4Fbad|F+MX=i+(eU;%m85VF(9UhaE4AcF* znE{1g72FH5f3_>6Dgs24=|}1mvIsA`W{wj=I};)yMG+t%XJ04Xth?wFY^TZWQUEO1 zY{egB4u$PcD0QC~~&t{%3wzUA|>b6KzD9dk(fm0|NgaB@Bq{`~a zXAjZMoBRw?wsmxBIax2>YS`_A1eoT(?f7e>dG_K>X$_m=p+sR2n?zs{_VR)7>k z1*yVGH2q~WjO?b~WubG>M;f)KJ?xCaqiMmmL`IVR-9IWPDgjM9kSU@Lnm|0l^2+a6 z0PgaELfQ|{6r_HgaR4TL+xP#95S9qHV)(*9KR|53k^vUE=;UT;%R=;2?OgB5Bnn)^ z24&Pn`47!T${UZ#Q%TnkaF`!KaxCGMOM5@7X#v$h#H7>9t(nu!b&?jhpi*2mU6e-P zM=dA$^zq*3DcQDmGEm&a{fIn2mwh{b#CH;a@-AtxycQ&iB2yqD^0||BB-x}Z75Lj zd5Wn`0iykD^Oy_Z`4tfbpVSt-hHAYg4MbY3a+%mL(UisSr8ZErfBy${RlR){^|ArG3{grr4ajN+|bS#HpT_$ zmjK4fg$g+>!*$#7#a{jANUqUZP{03UU(G4E7#uV;bimrd#ror1JWHqL*pmTCZ2%Q# zAPQN-rNKY$*!~xTDxw@^Z~KCDITOfaZL0iM4%fBjr6+~wZ5&+&WM*<(t zV1njt`{AKirWY2v*j>MgU@#=?XImFa>Y)L;6^1RuvYLfUe{Djc4RSLKil)O;bX+#EFPkNm;t)#2YkbD7Lwn~$mO{O zofXrpJ^5w5A+)hrR+I`007$86DAq8-qKDj7X~nNVP61Zg-(AZW3T`}0+!xA#r7gZ)!UZvb{7tAPMGIrEkC)i>q%I$>~{SbySxG5J`b z_i0}JfiD9tb^`;mm0&5pRT>C;9{{wJVo>r%){Jw!VPW67C=lpOl+SJrd*1?n?TB@d ze#-r%3}tiNxMl!uPcj|qLjkfZ7}VAwURaV#IADLhFi({dCL+R7L$2C}hVONq(+Y(^ zto2A(oX=RgAw^$5Q~~CCTN$P^uRgugaGt~9Z=nmB`|w6?dwVmn9|I%dL5DWMDZ+Nz z>O#&1SJQ08ivfJ-iexb%Z1(7mNAdSDMY`tFJ#PJ=L{@r5A)|fT<5!Eofy#@n7GQ})zf-^HPp)tOsQA*E7OlV(ZltK*)-u;;U9 zTmiI9YLL4&*=4MqSkIOFkX~;rv7ra*3xqdT+X8^Uj4lgTuF8w<&3`<1rSt+p4FD(4 zv8iS}^?0q4zIz@|!z0Y_ZvcNDicH{(k>hp+lP?0BG|(mm6MA-qgZHm6c>rnOvGno) z9=u}FL~<>t6^U!AP)BTpyDa(mZGni%+~PK4q$sNOZj_%2Jl4F1P62@|>QN5omtgA+ z^VKh{#zAofaC(G!?zCV+F*7Gnhn@R_o$J((7U`tc5p2g z^_9d6G9^*k=7zHZAsk`|XZxl(ekS>?dZ<}Q30y9qB7L>j|d;{iGO%l!c~By zXaUv@Y=wxt{K(!LL{rHgOjx*|2qJWf;$QwMp#bqdN|Yyf>`%1PO(6WS2e$fArh}aV z^ns|QBS&LihShWDZnKxO3vxN>4;R6-tpR!vkWdyt6ZL<_Q;X#C=MPgAz^xS)yd`ko zC|j*1H^JbuJLR%*jCwNj15}9JC;>y3d7wm;0-?m+y(^58XWR1GQVJnSvm|qxSN`Oan>xkdnUn_dof3r*Hdl=AFS|*}FqiW&NV^uTo+A#rr=RfH zLrgsl9meTJ{{S~Y^m-t*>E0O(l-lD2OUXY{K-oM?Fm;IlWjsJesjfjU{lH1DIK(+> z-qLYF0s+R)LAP<`+=GoNr~B*n{47(KK&iTJNOiKR<51g)?>(k^o94J+bV7@oMn;X& zzW}eL7_9vMap-DmH*}UNL2UifPwqU%jfXXr@!yq_L^UK~&7j|h7z$%35_d;*`Aski|@8WMIUY#D^m;y^}eudI6V5x&T_uo^*+LIJhSZNKt{_=^KZ zCJ_<8YZVukeygvubm9Fcm~Y3NLPsZbm}Dgq!#ZV&hX9Cn^aFT(K>T6@e@UD9 zx>=d?*!@~Wq&WiO_Y-J(`eHsI@7GA!HXeIvB8y>VRNT+s99#W$ z@d}UQM&HwjYm&hWXu)(Cs;z=0Vo`bCM&r?Y>i|?gxJtsn$nI^Kri=B__`(gG=Gq`{ zE(x6#g=RDaKyY*Vdlg(#eFgH7{|^4JTLChOXyBPvch1IFxr>rI-X)*wjn}Qy`K(&! zV>HE*UmvK_$Yg0<6@#X4)dF<3*#M-x&|K==ap5a(9XC%k;dbz^0Z8iuy&|Z3``No6 z>iYR6mdo>2^0$J&HgHEaFacs{T2swhU`#{e9#VPX&d}pcc+o@bvO@=WUHzXcBlw5P@09+AH*^y&9?u!V+T&EUlL9}mC- z%HUesZOLSaMgbSg@)||cLwPZ-R1~yI?4sSr{4E!`T;6g@UIDK~t z!q71X8v%`aB2qMM%84ois%pU>Tb%Ls1HD#pCvV_dZ4b2qtP=J@<-QFz&7XTBENV{_tu&cFE zuMoinc)6cS@H3$^y|qu;xyq_RY05()(q4EHM#!)O)BJ1IK>_Vg4kcWxsjbZxsK?#@ zJu7wdG0=b5O>!ZYk#p39UOzd_k3gGO`0G{n$=!<$@@Ftqg=P5@1tVT86=UONseKENWx?Q_3KFsCJ9 zoOrrVWV~kGB%;DCA|HvkJd?<5jN8RqQ~=wQUZQVj8OfxTbbFjA4gMupu_~8wF@XMh z?q~Y(jy@-LesB8b^FT{sTe}8BcLBF6z-_&M>&RMUPMjQ;NM5swO$xX$hp5k^@t&=6 zn0L4fRyIA#&xplzY4|Vj#bfH7bR7GS14-17|gHe`wj5$q-2k6 zWKDYp&SLoCCIH3VbybmbII>%z+{uydFBAsmkZ`N2@UGc`J&*g~Ld>*LxfB;S?Z~mDEcj>3LTPLw`br2xIV?l#zlv>on;RPOLK$mW+#xxOO&X(XEcq9|W zI{;Y|olUy8h8KlHC0Dk*UuThC3oE`xaNiajVYr+ESIK$30p_$csLqi62sEN>fB~QGsK4#!E!e2*DyoMi#aqY($o{|bdA z;*N;`D?XXl)yK=*5I&A1b@x$~Z1+K&@m)sy_MWyCM?pl7IspX)EFk^*XW!77a9V>o zhyac4$_z7gmnV{)GJJ^2rJfgO-dft3jsnjGGIgl^d;kzzL?6#FpD132OT3*@5Pvx? zS<;L4yf49V5_45^JK(H$c|d8rFaOK5NMFdJr~t(%KDQ-r*_QxGbKR~QOF$JymAq+2 zPT+TeD|&qr+{(``v?BJ@$MAAdxZjFC902Yvn*s`w$Z@C;OPZd=;{ON<*vH#rIq_0< zhu)rIytl#HeG6T|=h$oTdOdY1A^=UK{ZK^3X8kvwTFn9|TbGKk(YIZyo0W)_zH?sr z7FsHY{wr>f9wiA5tO3l{FG@{u=^M%0C9p40$&qR#Z?NCpMnz*97Z0IV&W7-#pe|^Q zsLKdz+C))YQ~+yqH^uem!NM#iA0|lx3GQYm;z;R!pq+>EVr!S7Q_6-#ch6FV)GaVk z^M`T@ngOE~;aY`hKr^p;0Wfo(K=U9=46R-k2SbLyx+WKu%xq1etdM8wm5oZel!8cD zEdbq@X_KW-P|@(;U3Y;@E7`XXX{JUvBDgJDVF-DzJ0cP}Ho?DmSa2mq&R;->nn#ICh=`Z?C z)PMDS4ptd6>NixDMghZ1mHE{-GvODVxEv+#>_bN!w$U7YI{`jHiGmfs3{ZUF2Y%0M)Qy;?L|8#+3o|K|W`=ah-EUin3mh?gW0x}1P;ZdLe1A=s~% z@NnpcfdNxGpT-f<7eZ$wW7EvK;qjP1XxQ~u)YvR~aYSD}1;(qFF44UjW)qFSzxa7h zP5{h2=BNS<{dlt;|$MpQXXBF@xKCVThjxbDf461E6jqLO#$m={Eu49 zSCHx&Kt8DbV_76Zk;N%dE9mBDjl>(DvEb`vfl~8R(_4 zWV6|b{QvdrTw(tKAG04vL;iy+eQ>m(&QT@LA!r^j6#+zMji-K?AxWGXBo_t-{5NI~ zt?vnlvA`*ZjZl(eK8^TKn~1VJ#*a4AsMD=~n*gUnAOcQYpftGE?mpkag$Y;g7JM~y zh);;un?}pOIEUH+Pr!I6UGmMr4`?LmRRAsk9srsV5O^jCJ&S-l{y|Wibn!lmp4#i6 z3PyW0nGWsGXP!`vk;>QIL4$W<5CO?)@c{xQ{BSOq=GkA+TLAyMt)-r+cnKi%ok5xr z;k%$L&GrXx5Na6WP&TJiGyyceI>_k-f3UPcP3y(VhMjV! z*CFF;wfP!>MD$)B7y&lXJ1(>1JC2bXVpG`IAWfYbJh@MljIIT(W|^Kxj0LrUDS#)P z(QW#=OKMrh3IM}Rm>7PF&~LkZz$Cey#%=&f*28Mfb&5wbBa1;&V1yLP)Kib64CJ#PSI)AFH{P*}s~P+xO}RLw3Tlb`|!6i~)zK z2%jkkXk5F(rl4`3teU~QpW?BK{w@q~Xm%&qz#fV1nc~G@)Fb|oKMwmb@c_2*2oY3O zA@E*d-00S!k|K21ss$^(_^Xnw#BMr=@vXrF@W(+W4TnN?_f3Hm!2m2g%nh=_C(g9zhDQF)8iSF z9rgLOTx4lA^ngTxJ(UeCWxw-uz z+NlBYfBN&Q-zin9$jnX03>swSb2<%a2I7p9fuPdlcWcXXoVcd_c_TP3?wOq&D*FHi z($JpD!Z_J$aGkDfX5dA|6l5o#z&hgzOCdVVqa-as)X zQe@H_mVyI|1vheeMLAC9GQ0_jlv&oxqScuucDdd$P{7Lp?>YXkVImn9cha+gpMKoFeXpS(9hX$PqSEO zvL&DBw#Is|>E8e$b*wagF8SLRP!Snk_dK@7;$76$vu6P47~)L_zmnX$ALOR47!>pN z5brLUB}f5dZCblY7wrfd>R)69IroMX_x-fP!_{Jf8aQ*0`DA=k>na@8b5H#Cq+EV- zXEXt(1<$b!5vk9qk8>mo9naA{Yu!JuRr#>2aOxc&0GP2 zrZ{mQV8d|Pa>nOq#^T}6To<+(S}ruAWYqIXKLr3JsYX1^Jfrz4D8-}Ig+T$1 zv?UL;Qjw7gH=H7Rmh^9+!ecw44&=I!Q<{F{+*1KW*KliWC~O`6k6X(dgK*vCI6MD2 zVc+BU7)ExG*)3jHbXy7g`Df3L@-T}+Iz|Bh11*o}@vW0z%GasO24n)-A_ZJW1Y9lC z6BS1oYqgh#sP<{11mE;hESMgF1rPuho)O;CrZ`%yI?~wGJJpr$G6}&xcS}OzTaHnK zUEL`@irJREOAtYC`#FUTj%5Ir4MDu}{zUk<^P+9^?p>9QG~g8js7dNB6pY!noRYs) z8vReCyAPgULNnljdhW_1 z)-}^b!z}=$*%mP(a8Q=SOB%@{=Hbj)%}5L}t$*G*m}NzTy-#2>fyMvP-_}7!+inXo z-ADjT*?TRG_|ZFVH_b~He6jGR6%UsneO3x%##s#(LRt5VmAuNDoy$_9DgZbjAKCym zSH{lFk)B&syfR4bKQgCXijE2sj`{rhcPOB#I)8Cy0n1h(Q7 zkNelVyHBl;M+%UnNgfhP$6;V91seO#Ss6b+xz;0aJE8#me%mZ%^8J^2PhL&P*txp5 zJLGN(8!;L~?A|EEh`$||^v4UG!I?IC=RODD4IuzG8R~ap2^%MY{j~-mSEtveLT{qV zA3`$FTrgzw?LKLlq>!ErwjPN|%r}{bJ#hhVdYJ&#n&l;Pus^`pm2XdHUkD6wB{#zL zd5U%B3}c02vcVg*kY`7ZK4+#t%0mDHqgL>yE#wd3?i!o$psSQKWI|(KJF6u6MGw4J z>q5v~6rdQxt|XB}rYGzi4GRD=V>r$89e9fKy|5OZhY#Ou1Mt?l^55VG4=@)4jrX-! z<$APo*ztJcl8Eqdp8K`ekmD|FL-(sWX2 z8gu}!SEhCo(r`fsKJS`QpYq^N-`6b-WMF=*o+J0d)yJPe!}SxscXy>(^ViTP7p?&X zTnI^I+(Wq4+M-X^vdzy$vTDM)jcq!3W@6mXCknbF;IgS2OAK0xlo!uCC6gI}9Pn!VVn=)Nj;$SwHfnhc;hhsjg z2RHl(+lqTS!o`I)(k(Mnb53RJbW)EFWFy=<=1Tw|$Ha>7X-dSQtjex=W|~clVpHCu z!^jm<6O1xEWUu8t_OWiX3bY$U#jAS#mze>)=E0%U%phXO-Rzg3PE)7SRmS(xD3hr? zWPVq)Pw>#K>YAoN2^ZHUpw$OT=sf`aK#p@Blb9Tw)=MwVRNL2VwKYMj@C^$6(%mB8 z{BQbv6Mj1Vvar`zr|@W-1Y-dgvZ4)lrU~mPR!?H_ccUj-nhj$1WpGpB#)^lGA~-sF zKxIPDXjYJixCT_ivWo!qOHh*(9v#M!XA10(v!>q%~nyG8&wT zxP$Nk79M5SAu$10DvBac;0xopT+py(nOl=gv0OFpG6Wou&atR~tBv_kT=9^(x1O4s za1YU~9~c1~C8f}`QQ4FQyZ}t%yL!70p)w0J4vfN?P1-3Ny#d&ePD=WY71ItVj>0-D zx(@-z2rNsYKEFcPsaoa~EpE6ZHc1%WFN?$v6NaZUe;tl{5u7e-nOgWxV|&5hHWmSL z)yEpT2eMHP$O<}Spi13{jw8k5B;M_RfhdEq~Y@u+5q(2dhm&g*R%KkEf)Aay!g_#PR+uCcOH|7%O z;0n~as942}ya$x;^{N^s@FqqHVN6wY^jjIMH=zs6sGk8`t@u4H4{QbQ`3iLEY?L(y z^Uw!0Ny}`yuZ!a}&sLe`N*78UD}nM4r&Loyt1(79 zM0UGELD5-&a8Zu)K&Vue^3DDNtzabMItYNhM3vQWd1g~|h47g;F00O+ij&w~Cmgf4C}i7Trg#Lu z?ku2%ahJ-XI6i|+Fcts>*ZDE!L#fJ+(XiI*Q>;S)hiNGWScrKlR4>8Fwo@z*UH+7S z1Jp^=fV0i5OR53y{CIG!q#}vUO%&tZ+iOJU98iNwyffh`!k%v%M!u~SQVpPx`0eH< zq#YU%cmDwBJ8|W4rU}kIy_lq=J_hacauhf7`>U4KNxI08j@#GHJ;}j+`cqv31c&>V zj(q^Z#NzLjtg1nwu9ezhOWnzOLXL|oyL+9n*g^0kxgo}&B(+V|yuB^KfYSkQ&>sNP zE<2|m!~tt&p?75?2no=zK8SfZLG=|TeZi5|n#qD&XaAa-itPTMvN5YQffE5OpgmK4 zD0Sb)Sc5+dT$z|*?MoMq57($iH0u8DY>#xqklk|r`>y)xr{7~RNDTmWD%Qkx9#sIk zzVm%HFFbTaE}Tgjm=51!I6>GLdDjNTUs1y@+`EB$k_dv_u`&VcyM;nz?aKHd-lrcu ziSj}C+&J81mrqif#fG_pU18}Z_c!3V22(9=yht?;?^c#me$7WF;i1YY;}P2 zdLaazZcCuzeyjkWi?1RNt(SmGJ8K_;7g5C9DH2U_o%JC(`hx-sCoESrUdjn3poU`v zdC00obaMe#krtm=y=rJ8eTupMk|aa>9@fEItiCGnz5hqQaKfe$1%4>nEIpqzY(&Y5 ztdRg((wM#`1Ykogc8DIZRQ(z`z3Qnn=oqEk4>xa)Q3(3=T5+o!mw4m_!Z(V;$TI*; zly+%n#df=nR~v@oD4`K`L(_588R48gOur$J7;c~ScHlm@-tmas!lagtw4eY?fqjq| zYz|J9S4k|0;Fk+)-5$__X0#4mEd(V?A^{}D$FJnn$H{3ubKC~X5uE^H>kjO~U%6I_ zyN=s^WM2~OK?MCB7&EL)e%HUtCPGaz*|nM~T5!m#QrH8I<)8puY>BkfYo5I{`oPM< z2`$ZO^s<6KoHY;7#Slg(M#Lhq9ZI`dFA=RcbSnpayC(p0eDjX%Di{TbfjfA zAK6>E{JHRH#6VBtv6!IZDTw}!gX&7)6rFNkcd0Z8`-v zt6SQ%Cnt)NO59q}0?4Pl`i=t0IFRaAytk0^7)@L%|gw_q{% zUL_t9VQL7P)R+LIE9mzKD)2bc#rksk7qE4ZMDfHuGQ>=P2UbzpICmGNGepMzZ_Q#S zerSo&r-uO;CCk?lAqbyU_#r0sYsHwn*sWv?2Y4}7G>S7W3O9M>9g6xdG=(VMF)E&2 zYM}vOL!2j}_`wJ!GL(Eu%k;sHC)u#kf~PRKze8SbCCo9UUq^pf?eaa{!jYA{a(Mvd z_gt<)J1vZNbSrma5_`&kXP!tI4nY~wB$beDVC?TC=<9!w)WGU1%<;hfID-H>Z+k@W zI#%(NWxK8ZH_b}Ki+BM9HWy0vH`nKA)VV zP5?dyF@5-rip)HbP)TW(i65V;m`G+_vc)bMtVaQcqS+b6R*z(9mS=0AS|d0B6pj29 zS=8N3%7z_3_kaNw5+V{KNBgwhJ;IjuiolcB1qxOa}odzIKm&o|FIvfDulISh*g+~N4YXR(IziY+G(G9_5&9% z1@>Dm_ROfaA2SQZl92%D>h1SJmNK|;EFC*|)mTPddBFO%0q*^wTjBB-b!Ca-RGbmT z5n(Yoz^7g=PH_Q;OlQ^p2nOJsocK4A?wZfSdhs}JWqpeDsNxr1J035~M-!m$LyV?) zANMj5p9cXHhq0d=+06@Lz{yZ>Kzhfg*0fFE6$P0aen5^+nswBqRF%mJHb~Y0_CnJn zjbQg2Mh{`b=zmkn)NpyyiO#nWm>gl7q4;>z<6uu2R{rWTA=bp<%t!#W zQ%9`Ny#`6508QuW(@A>vmX^&UA7XC_^Mfs2_A=b6m?*tYF{&C5Wo>#PWjX*r0L1_^ zG|_rUU>jQSvyL3np^z9Dw>#4Th6u%IHv z1^|k6+ES)1rMXvgyiJX?CVj>)U~i=$`*lWy)_}GCL>B?R7TX@@tvzbS8; z9K18AyZ#=+So!9?*x5Jt4x2!@$|u<{H*^JcmmQYJww@QmitBX z?UjoB8Wej%ezQaDH!lDQi^i_U+w=6=j&AHXpfWoOrx};}7Y%Yl)$MU`vX|b(*zxzZ&p<9(8B(9FL~_&)bwdqV7X9 zzNr-f6=VR?xSfxK;EoZ~iY($|n*NC|_g_=Y9562(yt1S%ZXc1yCy5-l+G59XHl_)#Lg8{~JbSe$zEIYYxmJ;E4v1zj42S%}L(AJF`FO7K#D$WNaIq z#i9JAf|6i0QFH7WG>}X-exxZ!sROsgE(>WQ0#cXckpYGg86goZL5R~I5yv{{LnyVb9N19|E46Ek&{zR-E1ET2t!1;46${(RN}aGQ z(kDt-h|3BtO^=jAy_)*_FBBsKcC%}&%G7#ahe`nUlUc)bL=Trxz)!{yIFt1N0dv0z zD-WE1(0&!vX&qri=Q}CQ4aB*a;cpsL`ilV=h`Cjz$$%=vw4ranF2 zJnu#TI#vX*wWpGrI<5H}@z?q(&td_-g`=Y4;5^0``eJ>G#T5py;DfJ$+MiLi^v68h{!=$UiLi#DTE=b`{8ou}*bv{Ke|XiVu94)mZ$kXXD=VbrP`tg~4Oxk+QNp z=$!6Q-l^3mv(Vk5n}-><4EJL5TO47D;>&qELbqLg@OP@+IfAy_0RZDwPBR^TEZui zFXa#ymW>c7CjhwIr+f88lCid0njTPQ%)!5jyBq-)KhXQzmQo*MCtA9nQpC{>H(gK6 ziJ}0_T{HLT$V>-Z{F>gC>u_y})93u@6n_CsLe)7=__56I-)0L)(=O+NqZlJ0CcN;wug_<*NH1f_ zLAN@^5gc-)C9p8Ts-C?xczFTT*z^b2{((0hJ?e#Q1F>-!R*0}Q>(w)#TZ%;Qs5PhO z!#znRv&h+VHRlj`_8S3oP@F~YW_y22F3b7uHZ zb5w5xM`hTlqZLvjMd85+hk9Lke~ZctA|(O(aWV-j6JPfO#)(;YQV8aU+I@d(+Ax?c z%o7XI;3R2sp^b{^5A-;@nej91QwagU(%ZUe>&vh#CR}fkN~Wxm;oAX`JAy;49I&1g zZ?&u~s-|8y{-t@7mpPUvtb_puXOFCB6s5=xVwhp=m2MJT@?%>K`S+D$zDk^2e7e&bqj{PRGe#3lA7LJbD)yfzC}=8nPvlZ1>*+0z|4wWY(mPjii!oe=-3YMyUko z{f_yJ)*qP&B%xFp?A4p_1;w$LhC?VKtV~`1rxhE#P5m$|1FvY#v5l58D5(jM}d4U6~_&u##&dR}*Xffx~Xk*o9J zPx?GO$~EI;Y9lMteQ56F&bAF2&6Zlllrjd?k50*$6AByzGu|onQh2gf0-%CZMVN@d>Wa@ zsB{?wKm-c5v?S6HO0Y!hU=Rz9enJ4$@ot@;^;HuFLTzpkHz^B%Iy!m6OO2i4_a}HB z?h%Jf^a``#LolwL7AM$8t5X1_DU^AXTe}GpFg#SHuqHi?^oZQX{#Kp@SWe{-;qQkj|wg9peqS0k`E1owaFUPf6hPzFFpsUXmS zyRaXPu0{dNTA~z>Tkc5d-=3&$1F{$T^ms+6|80|j1(52?-sIwFXbS+92mi3tH{ zN6hZab5!g*5`xe$>5fzbYOuu{ov-$Gy7|Hk?c zwj2d8Sa1ponYRNJr}v59v*zD4jE+?`K!=A3-+5PilveCG57f7S#2o<{ZUqFZkYH=b z8&rn03Jj{&`wfm#Mn|g>4*`7ne7xw=mRec^-Jq2$qBv3rjPC&U1BJcP8=_!37vEt@ zgk$F?Jrblu6iC*v94PET4=9bb9h45EoHKiz5(1lIudD#E_b9IjQrxOkoaWsy?$|)_ zV6kOpfMU0dJe2QSL_dDcqmZ1#SJ!vmSJT$pzLNj}7rbTT4Ka1@*4}Aqu;s}5p$gQ6 z(8It*BPuf9(WEO-;HovbLWf>@y{RVB@}dCeB4StDO9{0|h7Gb81M1|D1?Ko5QRg1yTdT=_;XxQcg+L`(LJ2rgr zxv|+u(VhVzs5o@+)Pg}F4Kn&e9V5A`s?&}ZMU@_$fn*kVJjaPcUrpQ_9H<^&Xj@_r z2Y3LU7g1ZH+Lc@hF*08Ja^FHLl!_>#bPYjN?5bWujyxM-6A**V8OKw|B=Q&W>YoA3 zp^9~Ar+c10$}l#Z9p^jfk=?b^MR)dye&ILWW#ZT6+X*Bw7Q+I{{Hz)BEu;auO)=7E zpeUk{&<|~-nEU6-jfjw;qeGtd5kqu&AsE%=?6Vh=dXP2i@jpQ{mN)>o@Pid1qpZo<;&KC=3O|Tv%T{B>lNB0`EsioW?LoImoOuA%`9q88Z_Md~oeupm zAf%2-epw3p!3E!TrwIf{2%DQ1ci8|6WChXUd3d|s^OXS)!suB5&xQ?QF7Tz>4z0LAzW>>; z6PwgU$lQBJQ@%Bd!Qptf@=3}QH23t;^pX`WM0Shk_ABKr#$S+Mi&{ovIT$YIXsy$!Xu)B>3#fT zTv?5E;`!ezA&&uIm;V+sQtE=QHWndu<8l zV?x0DJ754IQq4i&yy@9E4Rkt$-0FSz@5%tz9WD6`c~+5=-3hTDU=fLbtc#YCz&ojKZ>q;bv1mV+dz^7L|}7ZQCP98KeE`TG;^U z5SoG4JHW%(;ClH8G+Xg^*Sv0N$_$rO+yLPJr3QmgXv4W)6I`We-&g`)wU+_a$nyZU zC3F$WYr6?vI1zl0Sa#0VU$+mYVYbvCYgJpr8Pd|k<9y?hq<+pM$=CqGXgUXLU_&r? z&2BxD0uZ{V@(kWP(rD{~YX#w4@|6L-td3^Y1P_%g<kXum00_*R zymWFFX(Kh0$%~f{Hoe@T6}z)>Q56pX65$rph2Mj= zr*ww#exB^BYmGS;PuCqql+!>{PS)cG1;$LCcaH$q%NIYVwaO^E>Auap<0G^2Pc#gekcm>4^ed|W0zd@PX8 zB-B5b&8Jy6-qp;eN+h_UTRebdZbAT>O5@Y~f;k3#^IQuxOIjj-cMVzfcvOO75UBwc zhuu8^<%N3HCCMs}0ylwHa_|5-$b&A1Vbsk|MbkWTLmklB$F^XDj%vW+`R>@HPlKaI z7knP^=Oc=U+wVelaVr33UX`#b@O5sJ99RS$-?FY)Hu0bt{;qIq=$tyBv@sJ{P$%k| zx+mk2Yw0jO|C9hT+P}wvAmm+U#WdqM!F%F6wkRA8^#c^sLwW=jd*9aL<}rjU%9_bm zp(u(}i#!0nddBey6Q4qi_~S?=`ymu)-tO^aM`{I&hQpn`^S#LaJC;Q}uEj22Rj9=* zs+9r26nW}uC-n@AQO?Ha%di=nP9p=0ts=N7+IQcAARo8G6DjR30B61^N4tasYK{Pl z3!jC71lQNa9~cN=A;u7V=#VALgHHh50MB|O z8jbF|TW{1NHFE#t^>4g(>O$g3C%uL;Ec`60Q+{+JA<4CdamN(F?3w}M^8X^b=-m?s z>jVilgdv_MS!yX;kNaV0!s1(*ztrttB1*2a(6hezL)pV0b|wHKhm_@ts0+zk8xuwg z|JwuqF$1f|Sd`nA-3exZQxItFgH4%q51B-NGbR50t7QR_>lrUUek-}{qSR1YW3%5; zU01MNI{>D(W!W%}9=3*Q+!@r@1$FeqzNR}6DH;GDZ2>YIhDBUD*XvJfFKW%8S23@| z_JrzdGe?|{xDl^f+qniM=;;6o?+L0L@$Uc)6@wCz&ucW?nD#SGMgzKqkz?!ODAvt( z^6R}miYJy_w^)tii$OJ?q>l%;FEev zD?aax<}@qO_z=>wO~Fwu$`$}#hwIqi;79cfZpT^k%I$lAIwM!blLq~$1hr>+K|}a@ z;+})T&3|GC)BCwYuC)M_#lO`tvWH8+x)sy@wHohD;|Q-=uI7wISacMT?8n9`x~Hjr z&sEm!?5@Ki#;XBn3U(&u$O84cV=I{!B9_-c{GRv`uFZ-~XRE|bHHRN^Io`;s5&p0j zS^$|D?;rsZS@@`d9vyZ!Ixj>BC}JW#jN!ACIc;p~eD2GcMeDu`*+5yG#X@`l|K)3q zH>?1vco9yyy2+t%Qu5LI>T403IQ{y6Y#mHe%KlE$VLq!Xb*nL;_Nov{d>RjZNVfoZ zY}x6=TkSa33$o4xi7*$mOjQPk|4-%NvuYUGQ~24Iig;0PMh^8ctBArp4I2P5ck#~t zwZ8D6kDcGIDAY({)n6;1ZN%`HD@udD2>+ADZLl$R8kmi0SbEeffe``E_+}lHxYA&0 zXt{R>0FE0#f3as?vV_j-pt9W?*AxWP{O<~tk}&JMZ~V7>wcNz!I9(4sR2TsuZSU zst@D_a6-+2eWAMlhUuQ#etYm14z%&l0jm-C(z5^!VQ!lg^t)XZ&+$KUMyRjK+BP-B z8tk7>h>>&Zv-U_1ioQUFZ9;fUf=7CBYEA$}s_HC$3ZOVoe*c)O6y|?M_}vk=!ATme zx~_vwR~Fy~9mf^q^2_W%Q;FfYeT4yRwt7iDPo1Gb%BSSB46Imx-wTafs^?1lpCj?W zQR*9YGQ{NIcNOYuh5al`FnA)_X=vAMB>h>?>4R*NnQrj zBj-=txipuwk9!TqkJkWpz6)4wHOrqTBrFioeXl($gpfxeeBbKynN=f}%A1s<$_h8D zZ(p8=@-J)frg#Ako}OLp1rBfLT|Wd6e`g}llZ&6^m6aiuGdC(yzJSUo(VFtX$UrW4 zRSH7fP#*vq`FOeSZ-%~50b-*}&lGvd0Sw1$7qzqpueaTT@j}LQKx=1Nm29)9cwFpN zIqv{lZO2BhJ}e?DFB(8zX>zWVGJu{?*+7E!bNUaU2gD?S7<0i(l1b_DYET~te!tqcev9ZlJ_3#Zl<7~xPNl(xGr)_>P8j=e^Yu{;255TP|C ziW&9Hhs+YPT|o35Zw0rqoKK3R3WIjsM(~@~G?4CvD&b$lpJH6TtdRk9kL%J$-)(WQ z6*ex|uk>cOaUGdVaQj`tnTs|P06%^l+B56h?@15_w)cBj@$qp95m2p+oTGK z6e4-9l<@Ru>BD^d`^w!+LISlUbERaLj(|6&o2mGz#v%a^?_DJ9x8_b)55_xHqSbD* z(@`Bg!$3Q^`&(pDn}9`Ty){yxA-wlJH0{f6oq+*qtp0GJGm3_wU|QMv*IcA6jRYqt9 zrodb30ETd@j6cJ`Cnpv(VzmGSe;SE>mKr%H|+j2b>^FZ|b&eQ*JDueIsBb(*KD)NFHTB76b*d4d@%uV1LAQof*W;`TKY7IsK-5|;{+Z;*K`-aWYXEaynAESGT| zmA0H)Bc}mZ`dni8Ndm{474V_WU0KLs%DA{`8a`&7K^{l~qA%kkxcYYLHTBLRldH<$(SOXU96I%|c?&<+7e07VPNhknU)cG5IW;{iC zk{ZyH)eoLFdn?`LmYF5#kT7|h&{tiItQPEMMF%;-Oc>UDuRiUwPXPdb)reI&(;zXn7eu%?fj%mV zAk?Z`R~3!9q61|DreCYt2tlB{uC$P@EnZAKN}m8!>54LOL~D_HR(q_;Y1K2{Ys|(8 z1CDOlDL?p8%+cn$iXGWg-0!y-@C#DP;oSfMwrEq`j3IxbJfr|IJVY zdNsQ@q5k&{W9%+CY-fDn#~A?s&iRFvmg2&-cEzp;GOe|QYs>du#OYrq{mC#Z;~xKm zJ$>B|6JTJWXeo2@_f`P)!T#e|$sRq&lXggbsg9nH8dZV#o-^-8TDhOu?X_EB);!yb zdf*o|YgYn}POAXimB4OZge!ih*`Bkd!wm)%yl=@bynvLIzxd>(H7T(|Obf{u8pj!5oYehwZEV?`I0bN?WBma5 z5sA6XT!PU;lwRT^eI+)CPh}F_anCme-b4NvUbcn3=S+-Ir5rFmrVZ#t>9 zq0|_Ev#+xsA~0-PDQJ^)Nmc6@7NsmmTC?u??bOj4ilL#CZX9wj_Lm+EBn&6>`MZcD2^m z@-n}5`hTWCd~dW$c9H)EKE(1<-jz__f(Rz@)&v0P%2?djHniD~s!>E-v9cdS_zG;O zFHI14p|HYHP|5CQrL6d8+-Cbz%-noc%ToX~O9n^VsY$YokzSaUuW8!6S`m6;qU?>+ z5ak3mdQBa*w>A@w?&+F=api)=Ix+x^Vv>e*W+vzP+}O1KbXS#v{(=(6t0Q$~buo z2rzHvz)deEk-q@Nu8?{hY|mB<6tz(x_|E;&t~;P_T_&AzZuEe zV@7jyYapT0Vho@B2s~4=uh^yNOIwaS#27VWF|g|R@^%79~q`AoAWRoTo{%FtzxLT>wQ#d)&u)pk!|(w6}xJc=B1@;&e-nUnDX9Qx5^9Tc$&DA)F0EfPY_j?|(}Kjw zYpj>^;6@MhpFL%taFLzFJqLN%G@grFIMDzJH2_mR7|4CaV*go=11Uxn4~68~{Hy$! zTPS0P_Wfm3fSo?nA$YGV*x5fgbr}J8dTO^IPgK7p)FJ)Mzq20=KBF;->D$9EY!q}T zKuT)S=r~#js-}OjHkYQc&WixaWe=Dw-O6^*N4&$rlA6Auj~cIfLRc-TMV_Cql9!T4 zN5^`cPQdVun&gxGUfck*2VTB?Num&^{N}0hoT-SmDoR*KuMw+kAqF2(7s~BC6Y%L} zT`0Yd9872mxM=~LooDRF#8HJ?QHl&2R>&tVv%UFhymF!!jJ_`7fkPb1C9^>(6-<@; z{guM87#sjELn_>)E1?VkCE^GKyzUQ~&!cbK={{$Qv@>kF<`JA(?Uy zYDED(_p21El`X#PfTdRVoEiwD?0KA|vL|jeJr(2Qj72xwoTUBW=rFb#MSxqF*(4mTa&+ia7vctCzS1@7vbT zObF|SWM;CC*LAY&>Aw8WIkNNQLzK8`*C3H4ew6wAw)q|0dJO>nJ*E-U{@LChOlQrP zA5_E8KD{_r7dXTvYj@0MYM-PC;eu_^JnNMObpYY10+j%`3oVbh2pB)#57l^s?yy5j zDnElP*$3U{1@jNll?p*S;yoQ8xs%!y?_yzcJ4^u%&-Dh*8 zau;!4x@7(d9g@pUa>)=L78)v0a615YY^N#&5Tn2+<=OMP?C^Y!b%mi+NN-yI*f- zEz5{ex(sm=7iFjdpj7}`tC@nE?z}E5Q0z?5vqfbLL}X~CZ#|6_O%VNy@$l;>CDS)K zO!ZZ&G$Ej_zeNET@hT6#OM`$*?rX@Gus!MdQW|IE1##drwl+=a5{aOy34&ss$mg{Z zJJ|?e^1lFLng);#X3x8SQ;4o3KPp$((nP(Vu(!Ikyb9C-clPS_8vmytF>JU*RQJEF z-qHYY-R=pqL-e|cl6C^%j=%l;`_io+(n~|m!r^TrDoVUhQ|?)oN|W`@YeuNAVi>u zYAfcv5MhyB{J)_*nOLS&KsS=DGv?m@TF>;w{L=<%P%%KUzC19B5?}$QoCsy_o*F?6 z_k~e+hp}YG^v5YrCbkv8($^J+=m#}9T&%GWP1yttT@wF-*8>2!L$ZW??7~P1YWRQS ztOqQlE-y^N@BU=JScSWVsH1)0RfpF8YVKI*imf%fAH)DE=_vW0vFl+Clrnb7cSZf3 zdAp6=jnq6HL>*)3u%vz0Q1sxfdDL8e&HCA;W@rHNMFm*Vx2k_G*U)0i3PZ5`pgu#l z7m~}`uzXHcKXAspyYvWW?}mXi>DQmVb>|&bnk*U)QGDo%(DtxS94N$vcb36q zcrO8!6Im4Q#^r`&@kW_`L%?%3EKT0vz9IYLT32VEg_V_!kd`rmJbBCD{h(Sae1rf| zf!98);%SoZ$M6f7_R2Ct;S1)6{V97blF(!xPAdpQf&dQ zfo@@c+9)zMZ=J&I$hTMhI*FO`R__ifa*Zf(Z9jSS3u-1RFXxLL+HL^55owzt zLS0uC;og|gXZ_GM&aZ>rVpztf*Oe%|?ds(~^bY~uD+hYj_CtFzb%g;E)0F*C&e6CUgYeXUnXoM4&TnRM368SMxRj zN5lt70~cuCzW=8%!1^7;o)nsrNr(Ujf9xk_Z%V6xv#rO$cWu}4 z$lKH*gpZ}BClHZ#NL3IIY;*cOSI$8Y}rmOZ}tv24;yDp*l)U5S}BDg_^4M4p{_I+Nb zL3Uc{&BMwyVJZOaVNlL07sTA?-ian;_+}xduB1vo75BeP|AJkDX1H?z>1*ANO1O(T zK-^Gn`5h?4!5kfMv&`S%CnGM#8H%BSLs zi8=tv;Gl^zU`Vl40t?CAp$Iju!%|iXF_db?!2AXZ4T{57*+ps9!HW&8L=6fsK8zBcH1p&oNdjzHWzF8C?q9u_LLyV#r0{M!JKXSzWlvpEnB zZa+;3YtHgIeKe+R1MNwQj52@Kyd#=p0{VB4$b}mp8k^r;_$vSuBt6Kdj|_b}@|=qr zq~116w*%%Tu@n`P(=rkn2KEuByH$jAA_-CqEC&&Yl9{Q2V}NDuiXQ%(RYgTbAN{wNzG zzRe)bawZ3wK}_o8GJKXNI_ZndaNhuarahGGA6lhB2xCH(|4){dH%&ty^JGO<{{7BL zYl0KywjXe5A}dt6df*z2Zao00F=NU-W%5BNxuY!oy+^}w5fxHQEjc*NsiTQ^&w)Y= z-ov@m)DE2*!WC#IooE3Fqy}VN$z{uGu3w283RfZ*tXZp5|6>gkOf6~>y3E-zR%dt7 zz8*YIv{?1z3YP%m3+B=kWPg=H4O6(}sZdm{_{RQvp4ZT6VM0CaS;>Plr>LcQI_$=5 zH13m$14#kCDUl>y)fI;0L2+0uixJ3OT!>9yBUPNx1UZ|FuvbHi`x&_>U{ve0+ky#4 zNfVVBm|u1LaR0L#Iho;#$X65x?&Ib;v~oUD<+(gPHA_wbjn&cZD2Q?Ui$_Gn|W3u(`6M}fAiH%!MU$sBu@9NJ@av$Me+KduOBnvRIzZ?TKfyZuh#Q?CR14=QMz~lOWKk7 z9sZ>5^>c~7#ic*W&rSD9sqD8L_Z1~uphv(B;B{r7v8~??cIu`V0bL6K=Ej z1fcVY;nq<$@Pbs+)=3<3lJe$mei*)hp}+Q4PrV6xOR4E<7hOaF^BG*y^yH~QI~Q4G zpbyMNx?%XMgg@&_jDvHklafJm!wJMP^4aw@PWE}l|3Yg4373cO9Tj{FkYefxOgYPM zObD00O8fbtaQ=QhgPma+?IMAj+Q@5YDks2cT-yi$&D+gc#oaJu4)n5iiQ=i7C-BE<9nhwm?iTm(op`&LDoHE_ll_j52-MCb`11&7}}Oq6*VWKvgb=A98Pz3 zKo@BSijZGS)K?rO52U)s6J3M7J93-=iFVsAQ;q$q@vw` z!5I!Fv9ki08PX9h^nR~`xYa-apC&}pz9pAu>8N%ijf!R05EXbd3{=9w*Co8+Gc>~` z6uxe)gG}4BMDADQMK5vz@-dI9Bp&mRVx0?seGte9E9OeChI@6f)Ez-GhH6*b-(3@)+xq@GnVlsKv5Y?a4yu#bb zmPjPri5?#S#z&hk4HS?#cS>V@uthrT1n~*%NF@(tkZes0uls{S*TB()7%dm9`Ai@7 zo6DL3rHhV63WGmLA%(kC@9jERVq3Gy&eP5 z`4#9)V%?pqhq)eviOJyzbyVuVb_-PHxlVGFtoMDSztU9-80c^pRTw`3F#>n&m(N*n zE5$|Q+bB#K7!PXCOa25aE5BR5e*tfT=O8oqYXUqK=2LJ5PbEydODF3sU5vsIF2WIGcynn1-=b#<&nkCq_b_z@-+@RDKwk>u z<~*wz+0GpQ&2Ik4RyOm@J8;@$Ej;JAcsOkVnaf0$`iqEx|A1rPc(2JIU$O7~J#UGF zH_W0z)e;@QoghaWTUft^K=Tq$%qB4b_5atHl2^t;*bqb*!8J;Bv`gShX6gjFp|vlz zvQDZUcnpNSZC{}p9K>fe+NxFolJ42(@q`$3;yIoz+8Q9FmM8O(g6h~cX4A8gYv#+8 zlbAGY9|Ex_D*!O2P#^gKwY;WCl5IEK3;Rjs000V@S4a);^6;&;9;?xl;Jgj5;{yTcWJ{^+TZN&b&#-5B$m|rdlw?V#3K-QO&bMhJFcJO3}Yf)C- zM=mu0gFDp8mAy(e=2cBo8R6)@@=s@7Kx9ztoig zz|@BWnAI8iNIEF?L14f*L=!=#@{Evn=;qau3fANd&S9A@#FGvrFeI+XQDCP4W2l_r z+VvIY&0GLp&)M8?31zj=e$9(A!1@bXyJ1HztdjBtwq^Yslzy6ScHv3^Iz`?E`Yaxd zcj5@?d_9*-fQS|po6La9FfJn!qnxY|a63QH)MZ&)>7?uiF(Rh{)zQvkplA%&QuyJ} zTfZ(EGoqR8u2qnOcQFMINP&~@zC)*1wCIQXLh`39e3AnJ_l)8O{42Fn8kO31QmE&W ztG2;>?(M#u{Fc>-NQN3N5-kw@iR0FXrE#7(tY60fn)i_QdX@&NF=XMLrcAC@y%$j6 znJs8^Sw99C`zEDuVYxRt$hYr_fQZK20-jg_mF)8MgCoW(xT#3Ycz)aI>^zA@YiZuF zVJ-*fjiYc;qY7D2@~Rjd9tpiVnXbzKA&Z)ENus5q8Z8jMo|!(T+AHALt0nA1i+BlDC{@ z_}IQf8u&w))m!`kAkDU<4j#ml6s zABKdimn4({#SPBVb)4z8sp|Mk=-~+Ciq@}p>nB=ZWVywkrKk@ z8aZ452RgwFlN?lc7D7o#I{dD9O-8;|d=P}XksKPj10!K5RrbR^J&;9>_+8AKVuL#Y zAPx7k?f9Ac3s0|j^}4$_O@|TjG3q)vFQ!ElKj9w%3KhqAMUCc~roZ+lR*WqG%c#Gu z4N&KHQXI`3-Q$Zs49;>7KjQKgFh(Q*TpsKgEs~8PKbzt9AA<{F-nEYao>4s6%!YA8 zvb0S=^W@}kgQ6hP(vD{Qj@HF?66Q*mKf6x^rf%5J^Gh{%)=s7XYOavxiBFHRL=ak1 z6-`@K-d&K*t;VR?)fZ_?LeSbc+7N`nqoXe0gwBRYJEd9yRbJffo-=KGoMVPuy5cNn zfmeeO;R4cQpW*eY_oZ*v10uXZCDj5vTLY@$E4_IEzotty5j))<7!Pivu|{9qOIB9G z7J^9bJ5LT#TrxR?WU%HQn(<#KSL+v?cb0JhXW4Lpd#ck0t9A_8>8n-8U!JcOaF}2c zE`^uC3IQ>LXLR=j1Frz-;m$fckK#)K@u-YDDJ77l299@5oiusmdW`&AY0AtPUmeKY z9gKbHp#D(o4@Jg-FnA6?B@qb#v1)Si(Gi~cHKLZoQ3oY6o3>ZoS7h<9<6_G!_Fp0C zPvx{iOBfN}O;_pPaRkZ$ekmHiFf?r>h6{GOY0&BkxsEyi1i$*Q@Q5nLM87sjMh0z3 zOZh3PyEFdeYRAR^Fi3v2X`B6dB`ipYFJO#~1sT)Rp5de^S~0cHypn~%#fM#C+!Mu# z1y#7ginbvDoAYxohZZ3ygzrsw?(xd+j5G?YL<(QiT{z05$UT9_ts6&i8p&7n;_*nv zg@qXaKFgX$Yej&0#%0?RK27zW>8N`T&i+I`W=w3^Ytjqgif0yj&0Te z5ly(}%#*y>h_uY(m*5o2OB~o7VyV4UDZsC4BW|c-20wSM?_wjX#fegmI@m-27h#*c zrmRzY2)RJj6^I{^d00|*rsyuOImkA4?+Z8zY-N+crT=qVjMJAv$UwaSba=ij6cT-$ zR-kA3sTocIWd*)zlt?4Mh{4O$TmJ<}6L67Qsf=kC=6>jqrDLT4!y{R^F?YdrglS9N zi4@gpejb}o*uckxnG|E?`s-6|xBh+j)o`3zzvjHB=zd)Q6@`JBBB)juo<^kq8E%XH z&Z%RJHmFoPe1y}5Xw)o<*JB*&HjaI^F^CGSbSU?@q$HJ(HEas6>sacj6!5yH6nZDoW!qAku5 zKB!L-C-}p@cT<7NubLFyA=-Y*=zv4+9i!`J$cVcP;H%pRhPljOKZew1M#wZHN z>o9sEc)w-oDWFpJstq9Wp>jDMe$lVq$b`8cOF^+oe=8JodV_% zx)Vdu_`xp%EIB^>3JHga%FiOac0NRg!GpGqg2L1qsOMk`(=TcP6pU7GA5zK9H!jFL zj6m%x*46yPcdf^HcY^>Oob(3hV= zqVOrxlewoH!~v+$VWPq7D171Ejv4>F)>Ga9&NDft|3~})t9cE!ZpVL=xY+d!btB=bh!$8-#b_W~ zsD&ru8y}I*((N9r%@lMxjAL$3u(HqqA zTIvr9RowJQ0%}qkA6cXUrjoV%+Fm*A`3car&MO<~I*wgO#I$=8=aLeKjw~79yot^Z zUR;V0MYbiU#i<$q<8%+{tNrxs7~{ikp>UJnOcEypS73ay&ixJ?j$(FBehEtpH47C9 z&<6}Eu2l&DM_KE72hWcx}g8D(WO5~J~a;K>*O z6n2F=xlrT3i!_QdlBn{WL+N2Z+Mi8qr#7J2X=cr6w_M-{T`d?={*HbjB96xZhwlp} zIU|~VMh3*tw-Ztj{OlZZUi;J3dy5dk-}xn6ljST?h?Y`M-f#ra^h9$3aBEPN4!?|~ z%Xz3GSJ+cCg;Hx7ytJdMWeTqcvww$wjT^8co)72}LjmJ9dy<#{rE2f_1^G7X3l{WT zy0aP1y$)-Dj+*T!@?IIGMZ8^)sI@K9cZ;$G(*i|IuHO|UL8O`8T(7WdVWAO4UTOoN_666+rT!)TTRQi@e zd;G%;sFCffO?|v5e_IERs)@REt`n?cSgPAlWOCP@i; z=BRvG?~ECTX2r)cWNa?JaBevTbcziDS_{p054k)BZ1I+zdj)sp<+%6#g{fsVKu=o7 ztV>WCxp`?Shfzy1*0;7H<(V7+J16q*Q2wLsDToMK&$G9Es&ugTSw4bU3@WiY92-u^vQ`t>-9>B zas7R~%#z?#JjJH~T;RrG;S;-5?Z5`oogKUxl44IdOZdDtFe+6NP-51M#N@9N!4*YoWFMN9I^ zO$%p5_*8KCnhG%OFwtJV5WFcG9yOH5h8FHk$*KB5N-5yQ{8h&iLX9s01aQL$y5c8F z&_K-CF{_H*jZa9 zY;Kb6ztSWzs90Z%S^4TS-h-iCplNOaIg=pMgUm&jCG&7>*#rdu>(@8iDsZ3VHA2z! zilh4^pPcI}TByoI(bI=ls$1OvacEg>kHTFUq~~@Na)~91j(_et|Ww+ z1oFr=sqg_|n(I?ewyK8BJ3A7~0q z$!mWBL?mftOanH>vB=G54(*0f^ML|wp0;?yf5|3Ox3N>gktwhhjOw{=DPdsB_zgn< zEdlZ*gu%zXWY;9n1E_#0)?~m#s*Uh0(VamV7%$BOR0?k+Jdma{m7zXii=nXq-ziu~ zJ6E{k1(1J-d}!1-aDFR`iRjo)#w1Ey`cS4j8z~3|6!Us#bG$n7-w1XAynn^zP5DQ9 z@H~j>s0_*qS55Vx#vW(W>8H%CVABwb-||zTBzT+ad`kwmY=IF04=SO`cAW2<@fBG- zY#@^jUP+|(wy2EoJE`~Q_Ju%QbXNK-Q4J=;3g!9 zX-(e8KS!eUuc2=Gx4}G58AWqX7exLjId(Dt9>sstZTk~ZjNuN0|C-%64m6(auMcCT zw&MA@IZFL!`VUoD|=fmYu*_wr-BSmj+WNw{y%;RlNV=5 z6Qmd7U2g{flObrREmSJ*EU;|>uY7hsWbN(Dls5G-ZaRtx^srg&BNR~=JuNb;t8nZ7 z*BXYsd*Vu&7Prb&g;j|FE+t~L51SO)ew3#F86OG*9nT+;6SA>)&lH`kXIAHNNq*-P z^JqAH1RlLatImx96Tq3t`M-6P>|(+JmIhlWib@Q+iLdU5unE%1@^?esSOQ&LWYIC( zU<1n62Kdy-SP6$}1uN%=XQD3n&g zD`olsG_!RD3#?O&PLgaA*f^_KS2tOmge$;?lWm5_KAY4PYf*kVa7{E7x<#`55!@Bi|dDcKZD9$2lmX;VHR^QR*4}@rrv$gq!KTnaQM#aUzep*9gzwFD(9#% zl7}bi6LV#l)%G{i;^jKByNY-my|_J0bkfl7DvxQ(W@v6GNIT%&*cF)E~>$ z=*LTVqtsp#da11dH$BS;XP;2N1^0t*4Kd6`r#PNkW;w!WT(`@BUuspr`kQ?mKEY>Y z#-{%}6K}Qv)t!oO*PszJ>{-5nO{$!ILjV-eB~*8WRV9TY+|zB-XR5GtYz?PgX%w`A zU;tDB==kq3#`h@*6PEe{DB5)?g&9xu*t{d#N)eNn z4oU2N5Narl8aAmufxCkl+!xS+KS?gj;!{2T(xonT*&BWqECIx*^IcE@R+Zf%^kIdl z2oaq8dihvs_Q1x-egaZvEzCpvHd+*_l?k9O7=~MM48oSm@gA@MD}r=_y5vUB;l2wn zfKsAYAx^Q86UX+i=I*bA)Dk>RiL6}_Q=3xu^lzkJ*+Ss}0=e*Ei7~eci-H3%2`9v% z!t)ZM>Q$JjoM^e^ra4Pd*JuC#9giIz<$l;lHp}J!|44Qg;21*&W~l*_bGoet*=uYY zghj)`{K6MB{7n9-VYA||LXiHe9p$$!5+?-#aU8PDg|A-DyA&db!OaXYlGxQHbKq~m zsB)x-6c-^8L&)$wJryqZ2NC&5EG zzIW+7+hU#$HZ*y^51p!jpe+Ufu5IHxctoNqc#!b1Jb_$GfOzF25~MN*#+RNpzk}M^ z4@6Jv^k==pHu3JSV~ZF8x;=EgyD7CDUCRh(k2#g7^AmO|{SoRSU|>=bPw^(xm9Uo}C@Tw}DM+`COkUd`C|s2bDeCGs+fRq>(V$-dm-dVl z9D=dNa>+1i1)6>SulYmU1aLUX5`{XVOEjiNQ?HJrYVp{iw!R&r9q82nDN!O=U@)#e zT5(4&Jy4tiO_#QAoZ*$D=q#?U076tMf)AStj>A^=^at$psVIs8KWywC9CDf(c2Xu) z1oYkhm%bGA^_qPELfHJ(C%#cQDekDD^G#PcGG1iW3{3R^Sd*W^bg0yP06O&5tTPJD zhVG7)llD{30dr3GcqC~R%MV4q{3(qCMBc`x&69rt{YTG|bhl}=I{p7=sRIeJ+MSB0 zX)Y0Ye#?YZ&TM!Xp=IS*hdu^iRcicly}LmH&iuoPSN{b)7C!CTzule9>Mu!M%469p zA~9NZWFAvKp{#z6yVyC09>oSvWIPi9_#-uj*v7_Ulij8FApW*n_~I>PVmGw+LxZ>a znUycZ1Vu1L#ZJj<$3%CeB_My<^%b05;o{`Zs{%6RDZdc zCA`J}jJ+h9S{%1*#cBZn6>n|gii5ZOD>8hvr3VQ};JOUtlosU;3x-!f2f-)c+El)h zm0(tpsvA|?C9@3xOQ?pV8jk&%nZ(p8?|)q$HgH40uINfm>YP?o;?K}sV#NEW|2Hw9@MTT-$<>6Zdlsawe_w5VczEb zlBd$Y6YZSNR-rM861OyZw~&W}ZJQe}F-HwI{2avl(g<9$6cny$LN#XqU+TXjWo$9D zLTV?4dRHvu;TTHTh$QHM3YThc4XXtvu?~hbxM4AJOqk_00~HwnnSUZSYkaO;@n(<3 za9*DfQLM`EEA&ptRQOloEehJ;q?`Gyd=6(590?oVM@CTVC zFt7&ckX}ZKPX>hVH?ifOa()3N-Yof>nqs>BjEE-yf)yBklGbjYjOhf^LI0V|L50$M z!HBS-B+;B7w_$3JGAKAHcsHH6jV(CBkb}6Rx@72vDKiAI3b3Z;nH9*yh6tXf#vik75mhU zRgQUzUE{=Vt17zcSMHJl7eF0lk}7h1B_-CE{mqVwIiWNrbqf;A`B8{lEHOeJC4LJ( z9Zq2q>Ld{Ui_dCL_!8s@&o!fVl=8oPpK|8=srzlHLEQ2X48Jr7n^a)X=s-cC3%+X z!4n*%Gp7hmUD7NoXltYrrt$#cby1D3A@LKvc1Y+ZhZM#D#&tYH5R~h7^>(a8BwAh;fsg%sh2&??ur@)kg3bdd)AX6Q;g4ZG?{6*78 z5U8v&SzD~(@yz2s%V#T48z zy_?{RTc=_AR6LUaWCiXwAuXE^zpxxu+=wt^$aB5U^vBuduB7VA5{Ad`o0d`cYEVQ7 z>UO|ylr^{jI|i$-Rc;V-Y?Sh&2*f2pM6Ny3knrtD1P$8$Kk)8ZKYkt=iNNE7fTLGK zosBvHDfIT`C%;WsLEE%UI<@LXpdoTlQ;XO#C2#t6xE(COSC* z=5xvB-CXBpdLEx5+owjX{`EQJ{`W~IMCfMjBKZetXFkb1yKHg!?1bE$bM==2CWnNZ zo)8=|p1vI#3BPh5&AMrE8o+t1;W(c4X=guCAUV3(f4rz43}vQ(0@PIi>6_G|Ap@2) z9iwT^C*XY!ajyFvil?$`K@Z>!V=!%UUArwiJvGTf7-gu9#Dt{)dGJo|<%S#zEGkb#_*%b(qZFm;8|*<}J#Q%T{(MtzGZruyTY1RT3Eh^>V_WZT8P{nYqoW24 z7Ub=4GM^S!C!1*tuf1X*3Epdd^nbe+j+9&hK@TcdC_BdRaXr%Pg{TbK{GvRCq=bBP zbGD(+2Q)rH%RV7k(r&k-6VD3nmBW$%So++K^-n6PeGIRtBr2^?k_g)qdx{9S|K@Ij zS^EHH2wiT=6AJ{rjjI+tlkjB#R-t<;1(wXCy4^P;h7r09IXcj-7G%=d4IP47?!>e6 z)9+vR?dgn(1{lHclI73<+nh)1iSY!Ev38@1aN|qr@tC1G%pm;xQOVAD{g>a@_ziAQ zz2IOgi&L83%C|ZIM1b~XT&4KW|8SCQM17=Z$VE4R*4Fd=dQgsF|HwLFtp)jYGKi8U z??ZUZtLeD_4)og_za;@t4%w(dS$WA6ifG~;STTIj&6NG~J*HNi_)f$1L{E!BV}*GQ z-kS%*u2^+<5-mQJ zr|-D&#nj#XUgRr1UjYqr%Rd1!e6*dnGL-jiWOy@p=77(2Bl$DzvhEnw} z5Nfu~#v6Gyi`IN_(l=INU|QQO{&pxD8sV`6R@MOkqQ0qBbf48~wD3$hkx)3IK=BGq zKar1Ch`1uM19twE;8?M@;9z`vG&ue|)L$I#(Mu(zW&XCBNA+!onP z%nr^^5d1GNqBcN85|1v|9Z{l)S$Dnwe3`l6G#0e%@dEmE)Rebalp=+rMc^b^^f>n2 ztMKzF5mu(G^*S6T<$c((mL50&7H7XBqjPlW-AsNoO&hEjJlNNe%wPINx_;-9ZAVlV zuEr_BxNnX%tCe_p%WRFyiJ-CTtRYuA@=m*#8h_;ag<20B{EI<1- zBDebfJty^aSX3apFN+*s1dw8PcW6IP&Dppl23jrZ2pHn9t+Yv^s^QBOkMYuLS zBAN7cuG_Hy$@L049gE*Vo4}VK;|{ty z;L9BVOF>77F}u~l&+t3jG~W?yS9MQMG&JfHub-&2(<>frM_4~Xc zwWkcS_`pV$F;23yZ_DatRR)5=;A_)X)X`urh@Yvy-6#*BPcy3~*$E5)k%4iJzK1R9 zojvy>#G4W#vK?$}E`xxgdvXfIzTPyFI{*Cr&0&pi|zWyNH9YSM=ojchi z?v7YS@jO&)`53nn;!{i~o@*J{wihki?Rp3SQ^Lv&uDxynFN$`gTjf&z8=seI(!jN#e6g!v$oHKN=F^WwvW#Q%+B|7jVBoJUI)I z(tCS7IEQ4}>Us9*(!^^2tqlkP8-A$7Ni-#@pwHThj?@a*PU>V9i#~4hoP-WF>Pjt+ zEs2uiqVzz{68;YW!I`Q6qRFr(%fGk}El%Y7P1_}Wo!P7fv~AnQ6!zpKp=zXru=Ac% z<}2z}&H3+ftpG>>Ho{<@pEyA)!g->P!6Ud#BK1bWBd`tJU$H}*S|;ap50P3ykU()| z$wf(BsWx{3`1dA{(LInO>vb{`Ly|i(!kYF1QFvUWF5B&n(7{9hyaKX(5d-ipuh0Y* zUYwc%GqNCBr{@9q7IueTHqF70);`843{4j=)@Ctp3ks5sVz&59V_O{b3rDZFNv3%L z;7rzs8fIZ2*wty}{4r<5Q-5`(Puis!VzR|Y8(Q=Cr<2!&fH!iOG)Yxt>yak`HCYui zt+l%{Qg0%0X|0JvtJ7kvva6*J_UbJuT8iNl548j{q3llyk7oO&)aqLSUXD8vBIPqP z6QhQUDLe81{86g25hoPJT0&gg3ZRj(Lm6T^0I}e(p_8zpN^7|Q=~JfVp1y^YaS(_v zyrYK5Y7jV{30X?5Yw|)|7Tz@?4py9Ay$T^Adr2yrwxRC;tavPRV^f}J(mB)tG8cqJ zWF@QTwrDTrA}lfP=(9R8ql`g37cWZCOrorIEA?FfhH2{`Fw>wUrNeNwFYYVpG%Y)Y z(H%oil4jvTe8;r-CI9+|*H7KRNi&>vU~**uIdvG+`0~!Aw01m5mwYo|g6JKVYrwFa ziw;Q$l?{!(Cq<0uyr^0B-G&n9J8Rtlvw~K#;%z*VpmZmns0d0J5%CqzQTR7ingXl` z&V+9?*I&)OVK@+mjW|qW?kNEQ{C=5$Xr#b`@UMr>ba=Ld?J4J!?>Cd?)$T+E?H;~Q z^SqP4mEHY_M7ETvcKBuhwD%5fCeE>Z-bAi?Fdw7uwk{Ydj=VVf6bY?u8h^EOi;Nkf z2gT0#Wx$) zEBeRO9Cr6KEpvq8i%wvwgq@Bh#HNoS@+>r~vKaPW52U6T8gqbuCwt}dw6LQ9x87-O zPSKqr-bUv4h$={X{>ydV`Be*njVk>kTFmHuz2#;e1#(TX#CMEjb`aJ8xuyGmx*#d^ zpHYidmFGSsxTOZ!{9R$WJh_MJ{b3~M4W^)-IoC5ZgwteFAkm-!2?-%+ABU~*D4iE< z#e|EGdKqptvODr@%?Vhk8-}~AG-(b9B$n}yGZb!gji8YM7!nfrNch(~(|he^009j4 z&>bQN8P4gGn>c5KVliFsgAvIOR?4KT4fd@G8wf-J-kHGp)hH5zWFDuBY{4$(v<7=H zAh{Bmwz>IkF07HjA+)IU#B*a;b2qvwYi(u#qn1-Bn(ySYCT+J9&A1M}qI|^HrTorA zekV{1a&nBzXt2%8{?VC;ExvKQilI{g4%Y8RBoE-|q-S=0^V$3^qvq}Ah-hXVGTs@M zHDy}DjLI?`Gtq-JjQ|kpCe&a7E?x~b!s>8WwLk_Y|79h5YltLU*=5^sjZD7LdREdp z>1hman*d%*Q3mf!RPv%0%V8< zqZP<|vLIq%u03CH$UaK2jF| zw2EXZu+oj1)KzEbT*eC}COY=bksoLmw#Q?9YMY;0-B~Oeqp)Bd4!{^^vot&aSM=tk zV0~nw&I2LvDIfI9a&h8aGwT)k`M@S0S>2jJZQ~_@|CdZ>cSVNR#-Rv9z92a}HD)vRV-x6?!E;JYU z)@pk}8O8`OuJ_q<9Ee$;;BH4KvULNDru10H%`A)odYp}DeWw8$&17guSFbezS|RWJ zTxd+UbaN~e@gPWjxUz>p$~61Tks156K-*RT;SgQOOpt;dY{gxn(5dA0yw-Kl;LX25Vp$m&JMIFthyCeR>pGMx$m1C+eWH?nw0IpO)&$IZj~U{BLatJ%f5oKa4od0{apeEIJa2?&ri7jyAQ zs?yg0-FQuiQxJ>;T-4O9#>Lzh#rCFsIlPB~tTm8?Mq=Emd-i?!d#lm-)3`WR%G-DW zqx5CvSKcICoZ^s3odXKSg=~=e?e?<=5%ab+bw|;|DUk-;m0edKRw^zc-z#tcu0=Se zx-_+%rUv(h4hW6#DD1~RD_f!PnXZLT*F4*3Y%u+B%?unmsI>pd9c$F|Ja@ zl!5ZXWpZV>CD0)pd+}>pzZ3degp;Ip$Ocg6acE}-dKYR^ua6aY@*kk=m&hVu`F8gcc#}At z`n_m3?z0)N&+(7&dtM+$aem$h01<$<8(?by4*r@;UdSqbvB?q~_?A3?a0&Sua0e;i zJ$hw-R*fCSdE|v2kmA8z3F250FF-N@Nomv6y-)fle7qO z_0Ug!SHj6X<`W=jH0`&)bFAhqfU^t^AZEk?q8kIY(~Ax}CE8Yj}l z{r}?VfJlqMD!?W22i|P}w}jRQ2|3+LdU|6ew_m|dGJe(tdEl?(($Q>+CK+v6w}KaE zv!V0Q;JF&gTlFmfjf*A7!Xe&!HgdvIF$9fODVHY*s_A}aiW}%w1vme|L7`cdE~o2) zjgGACK#masi6f`-J|V5|AZQ4V(_?+EG;Ok6<}KUn3F9`pS@!JOp)rvZ=M$ZkvC7Gd zb%}2Pz4>4zb`%_?1pj1I_D-0VjYFa|4%5}_KPVk$MK8yH6H-cbO8aLM5Sr$qQl z8_OQj*S@C*1&XvaSSj#mfTsv0SDvgmWa8({GJoFfqSGpChLF7de*Z%xE!Pe@@;K*%7SZhs))_amD5U#+K|CJFN}%-=pd9N$%oRR`?V*o zK6(ew45v9L+9?2onxPP{;Fq(P^i_p?XN>SM*5wiu+W)rzVR|iUGN5EBPq1yT3i_lG zpWW$Hu(>jRsosk^(Q4?9=W`kjrvx7O8tG=rrXzX)j!ptRL!b?$Rm)zN5te<#cem?g z!B~OmHM7xbeF^CqGA#V0|6>pMf{7y3nj1m@oqE|C!$ICp?d@r0Jx& z;{LsXP?cw`SytD(E_4Z?4pxf)1GHTLV5e&D1O;K<0O8g_NUq`FiIQGRYj_Wk;v~g1 z6m>+XUezs5zzQoT;1F-bMcjn}=VgD5ItJ-NrjJf0JGTmwIbCa@{lFVPniLr{Dk@rpq3AqRE3Nx{u@AZtC@bDAOp`6O`uJNPm&E@4;2f5ocP(RX7SQQNqXoNM5tM z=%3!RGvO-WzCwyG6o84|4VT6yz)Z}JJNZ!=)c?6Xe4Njd!JaF4GYVx+&l@pc#`zU^r;%;vcd#dYW8hCIBHTLvzS%06_ z0O&jY5!VK**I@UJv1r`Ybn7zjN^1Xojlx?eDn2y7i#18s9^aC~|2T;YJVWvcIL9Lc#7*s7) zW9;3tBRZl1`&*SQU_^F`y7?Z+zrjjaf{6J25x}Ysv+yqwhe2101fSV;KK@OWb$H}q zFPu04nJqjpv}~;2iyv8%iI&juP(8z|IyQzPCi4%gkoM_dIZ7eKDx$A-;ZKHINVOFK z0t)md{rg+PHRqb@&j6Z|_?(}bHHtR>`Yi9H%@tDH!>^)sMuwM$oWTSv{j>`K^i|Z) zOoTn0C;Xfm279Twk$g>o7SnFo3;Ww{SrTAi2N)O?*-)yEd!5q~CQFwA5ZXsPL=Hij z|LJv|2U$*T!{_N$ulxM7-0U!^Wyi)zX4}WlAVXh~9-)KfbsnSvmn@}PRJ~ZtWMt?} zfHMLa%}I7<^=I}y&;`p2ViEhy1|v`{a&LOgq>e?XERj9{#?_~Z)Qnp-d>X*GN9(nW z7J}&c<3&0PbhD9WbebM!ZNAx^mJes2!to;BNd=4n8O`F7YU6KS{@De3@GoK}7`z(u zZ{kY5uwrXQf_cMR${ydM2;Ev>LsQ%Y9+(XQ<*DIT*fJpRi_ZX$gPmY!h+0S8TXm!S z4FzZB<(UFaKHrqHheKOSV##obNA-LFq<6zQh$$3J8sw#JSgPzSnnm5XH06q;>N|+x zYHshCz;o=Ka~3)MlMC;1<)@DT!V!{+^@B%-r~lPnq_~6QqOO&Lgx9>-a%f!knDBq! z?rQ|((Bx2Dm}C7Eb+#D*i(3LGam#_e!77Al4O9m)SAQF{B`{3f;SPAzF}za<4yogU z<@?Y38aU?=lMM#|<**KvB6hODTPf`iREs>^2vH6|=5O?g(C78*GxuV|8}m0YCDt=l zpD!5jhB9~n8j-mEcH=wwRr7Ayd}Z%cdg|xi6gN3am^!=pNE3_*Mpf!pf(?~fm%(IJ zF|uRm3AC@2~wU+ldnqQ{W!po4fA8@g&&%_QIwCe;BI> z6z6ce(Sq1DI#dN2&kwQ(v$dLrkabsz!&GsbC=k1kW=X)j90oZby-Z#zJDP*cu7p<>G(9;*NYRCVEu zDj|ryO!26%r)E%ruF`ukkWII}Amaf5iu^h#^4Wud$}p(|)4>Auf(Zaaft(VM2J`r- zUXi!8v9oA*s{;(HA*>^9-q{2I={#Gx;Qr!wG>16Ku z0$e2q`BE^miG}-i!{BWI4x*sy9=}vRT-goH@B;9LmC+O$p;EombFOK|u*?ViB|F3D zWs5PdP8l!cyhOSHwjW1{o3VytLAKzRq;Cm6VRCOm61@ z2Fyo}JWxEU`c-QqSyX(LdQ}Ldn+P*H>PxC~4Nm1;h{lQjM++Ymfo= zApj~gu}x$BjEf?`>+HsQq6;WxWRCp>+|-XR8>%T1tp?zN*{BErVb0vqU6TcmauwAW z*+*$uVmQjw#ky44Aj5E;ewCsYLpo}5KcWH}vTP;<(nd`Iu@rvm)%guwg)z60oGsnm zz4qOb`})bT*2}MFNr_@KrZtFeG7pt+ACs`^(6&ASyNZg$|Nfvt454KV1G0m7$)|5KT)X@=5;sq#kHP+ce?F z!Y^IzDXSOCRtHc~UTuN^>rf33hWPWs6jAng=6ycrJkMZ-80o>)qsQT%FbY&7yHE%C>P{*aHwnZ1zYi)?cBg4ylD*HuFRW1%04 zMkLK_o7t^`GCz&#_CxY}p$qzG|2zLg*0)yxg$74+YLhH)!TS_LSQkJ6?4P1&-MSxK z%lo66d672AI3GI@a>M0-IAB7<=8xC^H0qFBGjzJ(9FGXm2(EahPseb0iz-;Ctra>HrXY z%=O@gC1830KS030{wP8BY3wS#h5+gGJr45reRg2jzfdZ_Bgjh)yaakc*5X#r84~5dlW*MM0J`YI_;V2tbMYa8^nLfp zK~c!eQF(n|XEf0Tp6);{WpoH3y4R45UhQie0OH6hOn0t5S!L4k1CRtkN-ow%o}r+J zO*mBoLwkfwM-;hUxs*ZKQ#~599s(;<02YcV+>V#za_Hom5EZAzBi%K$cV6(a?$8^v zn6fbhTwPQatPwN}BI*7jXa_2;0TZi?_tkfWKcJ){6k=uOg1+HL3AZ~!Ke|jv z@N2JA{|8HD0R@}+cVwaX@YN4zg}5xetH0n-8`dIH8N3Fep%|bqu4f2 z05bCOhfji1-YM@QuhG%QEDq%lI=`o?%VNzJ&swSh7Y~-A{-P1fYiC%>TmB*$0I3Tm zoYW#>IzW%# zA5cshAjCV+TyznJdI(5jMKrSq{8hnj8h-6Iw_0NT7GLUR0JfL@vN(G)<3rsO^PMz0 z(_zRxVR=Q}oAXo$V7LB1jHzbQ03r$)Zuu?*(Ph=6P)zK6Jox=K zCln}#0t4ca+=jkbxGK8}6-}Vb|9nQs9k-vYKY{-44NQjAZBT62 z2Gtd^CjPn(xaPA!hJxlH_>3PTGG?gR05dQdXWe%S|8|C#%=-`Y-mFRvqnuL-^(VA# zbA>za=xKFz}Gsz9@GE4Bw1=CFNv99@QL_qw|$*%C`m zN^z(Als{o;E);$q0GArYC#D-_V&q)UZwwn~_c?dBDVAU4of=WBW6 z7BmL{TSV+n0iEd-l!>u8MH8eT?G0Ve6H}nh)$s5R#|7hDSoWAL)=vX~tHz%}TkrWT z7BOH@0YCax<>h*|73AE>PXPAgu}Ki{!mZ(hsr{y42X?lD*icXak7VF}M@?$s3HEzQ z0KScAau`lbDIp24nDLO>1k#3hwS=aU^g@CwFdcKhL_J8cp=2ru>jzgk-^7_Q0q7I% z20g4d68vNTJOXI@7Z{Nx+T4|@jzE-oJs-+^^F5q<5dQjXP~$j+r#xF)0ah;*F(>sd zXVFDUysMZagl+k7p7a|Qg%oN1_<(NUD75BY0bk(#GRRy@)@0UA0b-4=ib-jvX_tYz z#V6^AGAt0?R^BQ@@esj4587t`8zm5$=fN%}TV1ej?8F$?+_V zT{6=|;dYWNQI+?$%7LZP@o%xqh%PeEtRF580M1Sq+9kt|=7JZV-F{N6t)5N>)n5cb zbfV{&!k#+t8k>9aTMd5UcCjcj13%QL0PSIRqcMI+S)(bcX6m{J4hatN)PY&9%YdGa z`g8xTA{D#-Q8En5KJ8bu0N9#g0RpSXX0)9Q*=!S&&D08V4uGrv(qC4=!QrAQGshjM zi=h-f7tD{i-cssvB4$*303J#bA(LL!$g!@l6G1ZoF{Lf*=Zt;+-y6J3#e`j{OROj* zdyNgqP*3m~^sX990HYU;NdA(plRCqKEb_aK*$Vmv%E+FXv$wmQ9goD7mG0}cUqw-8 zSEhG$=$2pE0NcVDoNe<#8u6(Ny43QA#cH=!-*9qgp{6_cKYujtzQW4Ow($`oMUQM2 zL;DM)0RyXo5dyy{3Cx~DfkRkKpE@8?S674;F*VWPVh?9hA)~y z0aE^^dX$M7pCT1y<2w6U>Yn*u%jAFXqI^XP{-QngX2)Au1Wl;@I&HR=d_MV5LHZG4O)C>y~T0e;8dvGrR2 z9og3#?f>q6!zY~&E>+o~GS=HzUP2VnC(}>}+N5dcMXd717FfKm-{2 zE45aX51zNdX`!XV#jGIuN+JVEST|^h@*%tp034a9H(6L=`07R_>ttT^1O8Z?v^rfa zP^#n}iRCM8C_Yk#tEjBltuaNwE1;%J0R-5DSy+NM^6;@^sEymgcEq{J&z(h=Urosu zjanuViLgk11D{#*dER0RiraX}0A3N&B*AN^Vn^qY&+rcPo_HZ;XV!SYr7FtA1e(q> z{{k{>#V>4RDnaqy2#^j!0V@UiZq8kpu|2SrJqPa)DdkfIu5?UDwwxD?Z?~V1Db*G@ zzY41YRQWp8y9p~O0f&$*%{9WL6nd0K_V8&79PBu6cEey!&wr`AC(82Lr^?AlRbX~N zm+85%U9~9#0r_57xZUP;J=3%d3$l$`J5kn`k4>txV%4)`iVzZ`-BU)1Wg_?b_tjz= zZil>F0i@Ct>egz6;Ns~e^bNn#rQ4UY@3Ph9l8vkaaOS1zE2BRi+CpiVPo{dYynit% z07Lttk!hN=vKo&GNImiqo{}qeR6^uT*}@RSQ^SEaRK8L#w3-UF;>T&bcE@7}0H*kx zaR65fkue4Q{7Gl5-0lBHsA#LDP zLA)5Ul&4A%Nn?YiGRS~N{44Xd8D}>p{M|;Sg%SKO@ObfDE>zZO0hA~tsYI{gQ_jPn zYGu47KVN-;WiZkT2Hecr#Oz4-XJ6{LDoe=uy6k52yTr13048qNq@;F>qBZG63`U=j@Ueq!;#Zl9%J=0)ZA87ZKd%!@0BbMavxM)X)08zxq+Ihn=adDP(geh( zk9Ywh^+qw6c6kso&p8?p^U2yh(XmHt0Ufoi}m==}v8+x>ZgUlR*r6VTW!* z(g&P5fT^`Z$Lv1;lu$5~0r?siqapsfU)xHv!+ULrSCr~C-H`>?zBTbIJ47$A^WzjT zLV!f!fbhr{aA*7_0SsN6xOC`?`U0l4lG%!n{3mvN0&B9Q)w|^gWEpSmtjcawH7Kn3 z6oV88{(FnK0AtQj;zj}4jMF2oZRbhcHNK`5F|bQdJN8;~0p2%=1JJ#*cCl6mL~so? z7H9o}00@stJi>e16R+^b(e!Hf5GNl+`bUx_iv8T}MtoAINZA*RYy+#d)Hoqxj`8|7 z0Po9aKVq05<@Bdx~w|R*#;*qii{G0Z-DT zwb@GA-xtlKJ{yAeqM`p(=ai);bYu?yZCdH(8jc6M13?BqUNcn0fgFaHec0H zy=|PDWVm&b@^;)OsoG%blvQ@{91~-UOQcY8)?P`A2xQk`Zh;qs0C-XvEmcbY`lYl`9Zh(ShRI{ycwFp`OeCimE6l-s)`jWmnO}0AOa&oQm|_KHGBgBCd?9$6HYw z9GBorg<|ZJ#f$0UkD`a$+w0IoCV-EnoD zY&}t;s%3>0O4s3Z8xl3;47_MI0Lsx`f_SgEk18(ES}r~^2oxwuBO>jT#Lk;@$MMfi zB66BN4M^UbJq`sjk+WZ>0IzgG-1Vpuw!0!8xp7ULq?fEmuc5}*7PqSXq8E44Tzfw| z$XOq=AdZ)YI$#X}0aPc09rVP1X6frq=WODMN=G(ge3shZJk-*kW*wOx(*SkmRy|W) z0?z8I2FWrl0HzmHBkl+zS#|h&YNibdV}kk%&UZ6Oi~hr{e;Jm8zk^$2lHdHPH$KyQ zWG{To05P9fO5u@3LtsdO5J}5a%e?7<7Pt4?2OgY+>(W;b-+#7!N)CpV`kL0hh>(1E z0H|1`8XD?5p8)t#I0ogw#X+zc^G}w*r0K8gO z$!UjWZhX$%kgGybl;#ZWwwE+SC=tmNRHe<0kgSH*q>5( z8?Og@HW4P@Kc@@|CR->{Of_6Od@>1*W#O?}yS43(P|^A4-Z0&p0W`I$uiNN8XcnOM zd-vBL6?NIJd^jOYIF!J^2U#!w4tZ~aTw9K2%Er~=i?C;m0kGq#7oVnTqpC5b@PF91 znawyZi_3^e*{`Z{nx>0uICTUkFMV~Qf$lyk)4m-w0D5CKTcR*6b5GO=tq9dx2Ur0A zH+34G&!PF~x)qD&v`QCu*E_99zQ-0L;ZK3S973yvrH{YUUw0J&_yKk~@9J)tfRc z4Xb7LAIN5I-BQ?22=%adPTz(w0C1_&kTNd72JKvEU>$E0r;KBSD+bhD&R#l*X9Sjf z^~cEvw0Fgk)DXU10}COi0K@T>SR?-3JxkPFK3f*uNuph8 z0T=67Eq^a367T_)wm##l@m$BoF#)Mtpyz5Bl9erO<8>5;^RW}==Z{bUjcbWV0r>)h#g_r^qE;V^qeEmty1GHiHbVx%BBvDG5j zgf!J$4#_|i0X^1Ox$dsD_>F{8RZTT2fWTg>sP|S^b?w9W8JBi7_8dz1uXE9SXg9$Z zZpdP*0Z$U8t#yr@>+HWD##1e0HOovKFuhjcby0n~X`saouVn70_X>HZKzmUD*JX8| z01LK4pOo_~)U--ad+@xwEnbdBPmJeF&F>Z+ILg1C4~J)0RT@j6^z8LcUE&d%0QM81 zJCzml=y+)*IMpMApX_PmG0IV;Yjx%dc zX`yr=+}~Kf*4-L#`Fi@o=Ii9sPg~L(p#X}Jd1e0pIcf$0jl<`g+BzksPm4yJ?=<| zj9{veFem%j=R+~d<33)}y#28?Meb-9(_KuXb={kh02r+lIW8^XB+#P)vSxH@xb%)9 zn6G7FaW0G-6HQu5azfN*0!i;TX}wK*ysc)jdv{RztAm8a;{0uF3}k83rQlU zzc3(fU}jiw0R|0dC2f}27ltB$4?%Zn(;#8wLQ_;rNo^{-7v zDX4)3BmL)f_fe5v0a3|@aMhWJ;;DhPZb+KS4tuS;QcZj)G1a^)mKYHQ0fyo^C7O&h zr}0w?{j8X;3wlOak%Dey&=p@u`#8z`ByBo1GU#dJd^|jUMNuGH0p|}Uz; zS$ECaA~(1!2uUhMC8L zN|*+yaI(32sK0FDE^sz3$4!KM02LnrL=iA-Et7B53DDWs3>=o!m-cB={FRYJQiI3E z;^BIt5$3E{4f>kE5Q*tQ01vE;eRZee#$}7kCuU+A-7h@ST1+y-K9z+br1`3#yt7^=s`vEp6I z098+EoY-S907Na+&b#JJBNQRtRx$y@JNfJWL zsws2?0X2BpoB?0VGB%o-k;7DO8}YRL_H$00j;9cYK57moWw* z3#A9T4w3fMLXF2k@{x&UAH9IZ0Ij76vTp|51yEGxJX#fj@Z_#`z1bsgHpV3z+MjVd z=&N-{$p$Xk>#luQ!5T#m07u09`F_x=w8yKsWaxk_A4vx*K`v4vR4^LN(lOvrP(%3W*0UEXd zhD^c3yp0^O=;rwWN4w&P04Sx33V|W<0r4JHgMqiR*9ER*HF9q&_H8Sc038eB_-C=6 zu+h6bB+bD~4xGW~KFwolqVkNd@uV#0f~eBW%3_pboJvSsWsYf;0h-4z&Fk_K>r__7 z0;FY@YiEbd_LZ6kH6_!!1(J4b(G4x}LrS+`L_1E^UFVvq0o|Xd+r-Jwidh}NXgK86 zpEW*jzvvJtt(^+r3H*_|#UZ@+{sz1X+ZJY9*{%6;0l;5m#)0eO3hYB@X0R%fEtW*w zkVb9p2{%EIL%Z*T46@7!mLZ{dbp_JJu>g!a0jsWV3_XuL7iN0V5+!XoI-0;Ts18faBS$y#+9)D-jQC0RQlazoDIIwPHQ|i}ME^HOYTwibVEAcX(VO z(US@+=HK3IEIRr(Uk>B(-`ChLKpiPJBqMc=&X zN%I5M1Z)?d)+cpJRhi8u0ne!rzB010AGlp#MCIb)(32tW#;fmRPRlKAQn0KjRU9cd zim?*1pfj16(0^wC05l^&FfjO_vKUapAelq1E6JCbX%rsvE90XZEc=G-0n!G$id!{W zsb213Ahun90WJ5K>b-0tL%(CrTwK1Xe42$NkX%ni;Tu5W7&1S#ue6+j^)KP{S|-lE z2%iC?0qhlIbnNu1*T(LL%}d%`9`Acu?-FoXcNSw(N!gooy2negkbEv?1%hL2uG*KS z0g}c43C{3dXlSL11C_QkNCA(61kqf65HuM~RfH(CmH8Deznuydsr_m7Amyau0EVwQ znB{u!K^k@Fj7%=ZNuw`;kB147H^hPcwcqb0Kss9}83P%GTpSKjcO`+O0D9m`&ieOd z$9YSke#7Z+dyMu4N>QSog}5G_R1#BP`M&@VC8T2Bak^_P0GHH90C10t1b4Y8@Pw^D zCX{bp&Zzv{kT}rZ0B(z$jIYZ^6|65RI=cj<^X-jyPX`~R05F4F8dbO{9x44l20FSF zp?IS^YGN_EyS{(4T)>~|-GbeR24KNSPd8E_vGmFBGbC&7OU0Dln8@p&?$0Gte(f}aXTLPNYvheajq zy`Vw$#B*^T33R{KR!TlXqZL~uuhpWE01T64N=?Gy35ZJf*&0iI4KLAt8pqQnBx*GA zkHqvq8YPt|jOGziL<;YcFJlq(00~>*nUU|DOJh{VdxpQ0GfxcnWoX|5>{mCN`oQp zgXDw)6G{VrE%hNvRNz2+H5`p6L()0i?b^v6r8g!IRk(dlK4=gW#e+6z|qG z5y)R_A0gf04&dDAUSv4tu>6(qF74pn0RP~?8Kn924-^ObsV4kUvANFs7Yp=6*7nwT zIahIvch~&aEnN7YzGeTYGD754051J9DfCAQP%hrtv#ps3SZ>lZtP4{cs8f$xoMX@a zi&4?ZDbN*QAg{o9$MPp_F3@+9&m}Knv=DMX`C~ zzUIDJ0E=Z;cq#pKQFI+>%?Aa8Ba0wNCg=IYnh0-6#OIRr+;|2YVr$zDxOAs+i17!p z0HrBRwx38i_?Teq1jct$=Sd2y&YeasOJ3fZJbs7IRwKPP!@_@MpR-Qy0B0P{ zLi4(Eo`w|8`3k59XF{yGqHK!N{C0R_*0|)*eBrj{|0Qe~*_drl%i0>>5 zK+4B?nf~|2XZ6bC2MKy!3AzG5I9T!!^cLPgAqj=l*PoJW0KKD%qebvSVRnPd3!&JY z&C1o%h?PVj{~!lH2^0_F)!PW>G@RtR@QhsSgfusO0F1@;>9(0NHbb-lkj>?BM;SqJ zEzOLbSaCxym**rzHm(zioc)j%B`R6oIdqF704*cIE&)Z^$WwNe$T#rV-_QLDvF1*( zi(Jf)k*1g59uG{#=BW)3Eqn$gDsLE70ezSmAkM1^j3U8-Xd3G~*5jNn_Q91%IKQ9^ z$Fk=7qls@2-w8gAiG0jbsG00n0ABNEEn)o`j@YgW)mmEpN??`2PRY{45jF`{)%bn3 z^{USbW%*VG5xV(jAwZY<0EG+uG&{dhON5kD1bai2T&?q=Z8FY)3E>ZuRZTdSHn7Aas++=;<$Sfwz!k)LV6cA{++ zRj>D}$bvLS0MF=L?oDLXdt7Y?O8%x(cUZASE-+W)@t$Os2B1y-B5#$tj%wES>C0=23sz!>GLetFzkVE<~Lq?mmJY#s`dtV<(iavUc%8AWy$_0U1&e zn`}erGSue9G)rgyWVf7>iIDg1lUvqt^H|3POugZD^p>{)ds-Sn(Q9Xx0LUq5*z>uP zmv(tCEpF!tkDFQ=I~b7A%b_;_z=2r3c%}`6EF_J5F9ZLL(oGR80RMv#4~!aL!e4J# z?3;=W7%@>{AnC~4jbJ|zzg4`LQjhr|n{%SUIH{^CTe=w=0EOsP8Am-2vs!_RU>i)6 zABg4m%}s+LP;mZ?i65GVg#JYvJRYtCb9&_}bVHwH0S7ciM2ruv+vm>0Wt@U^RUD@T zL?0KJ`0c2KT%7(517L_^WZT+{i1VK6^T6wQ0D8@4T8vhVo$fx#$d6B{b~B80gWQN+ z9$(pkLG>_5#U)7#rWX;IX?JjU!glIg0rdAT@@DE?X*X8;m9-+dRd=dOeFchK1LcY` z=&K8v_$(&p=^GsZwh>?Q?nVHq0aooFlrSxE_IV+Z>760SI66C$Ab-dq9B@cjMmX!u z*=gP`pX-#4)OdT}MelZ)0S%n=$4nG3G~6U|q)&w@C3H1m<1>AlIVzCro`wubH1X9K zgxR3*KdE%nPm_o10Ix-Tf281E&Xpza$b{ z+$RH40Nd?lNi1Uw%!Jr&6KHSHW|OPDHV7G1_G%wfz&=0343&x&#_MSG*W?X5e97;{-qR>cgSq?5}u0ooG3bZ0FI)yedG#_u&br> zJ^eC{>d+CyR=|tt$tWo3GXf$4=_$7J=Nte^X1Z7nB(2B&0IUc`-GlxuS;GaoW_S#D za)tS4n$xXG`ruA$JiabFSRQ(Wcs!B^^>%G76kjII0GlU;QK(x{A8Yv+ZSxJX{YF5` zk{nS~b9=$(0M8crc#2cqwF&5k#HTXaAoK0G0F<$UD5#M08-aTR3KfM~GNG2glvbgX z8PdLR_iArhid6t!gf$kl?fcXJQ*v;E0UuX^L#~qL(J0&P-3@J41~LxmIL5+1!pH;` z3ijd&CDa9(yoYFD{o2;nbjN9|0I{=R+oTHN6D*P2l)*!OD+QHs)$!O(#Ew}%m9ye_ zExUnI?@i4NF3L;`0%s`%4dptZN)jcGPS8BobcS8u>9-CnVC@9yu?}=uFUrC)90B6-b zUK@-u<$zlk$2+-mL6&WmkrCU~PwmYyQSLiSIf;g@*1cEBE}c(n1TKh-0h7@Mw|GNq zIKm0;C!6vO1ID@hkt-V`k~hXc>1aX=D#S-gf$Af>9l9kd0zB0T0eR?WAEWT_L%Ha& zy)%*_C!>IQ!=|Qk{e+PWH(RgFD=vpV5v-*yF|TM!q~CC80Hcg3^q8wP{q=GZA*iwv`kRXOJEkSWbS07hRm#$E6CWGj=E?DQ3pPeU3+@jsBD z5x=cNEPiTLeGf|6KZw=Y(rhBgCEIL600pu$R&iyw=6_cJY23Jlgn3u&qhqq=ysYIW zwpyV2a0cv+el3@v?j_8XBtV*E02p+qQT_F>qj$h&waHLUmLc&=>L8>YV^J zT7#Fxmu@A#`8myfAC6iL001ZmizC{euA(!>np{V!6>Jo?VTS5VzrxH*{p~Oh#ZF|e zq^jm&ciE}0QQ$dW0FnbODxjh)3I$bEWe9`l_a4QMWzuKWGxM4_vaW^``DfH><1|mn zl*kfPpt?Wur)(0C2O1IMAAFolH%< z5BH3YfKBdLj230yg?+l1*Es8DAE<#x>qMc-q3LRv#$45p0RrZ758|pP4ODAntb7@* zCC=A{h*KZA6B1Hn6xUQ=6%?4|0MaKEa(=!1sW435PT#eHvApf; z48wFi0AAVQ38+E&iKT_JY$c{h$6TGA4s2|O zI_Q9m_#HW(V)k{=UfPbbrKTIdEEwyt0Anb)qvdwd%^ujv{4kcP_0(-Gzb1vY)cM}L z!$uU&izQ}4)JEDCI8l^pp^&(20ozMegWQlM>AP#Olj8>v!knOjNyz0pBj!qbx=1Zh zLkZ+X2A^1HR&vmEU!=m^06y6!=N`ZvEp8QZOl>jSiUF-F0pV(qqYva*_Vpa>F?7^< zv_5*h&v~Q$3aun!0fCvf`Rc(zkv7V<>*Ukj#na39I)4vP(0EVxyaW8%s7`^zZA2pEKvtfJEYJD!hF=nmP)S0498``7S<>m%)Myvf%qk z7;7Bsee9$PNqDY5t5j$7sxu=uEcW0aCPAGCYT`hT0g!#4AvBLYg3!hU1lQiv3P;j= z;)A$Y1eJcdGr4_DDCS;!38E(F|8RZq(le!30Lm;YE|7eg(|HmsKZ)rk62+{tv;g03!ODK8>eP7Otk4Dx>#9(Pbbo$EKt>vJ_w1 ziCfM`w8@@hIufq2oOZJu-72EE0C|Y)8P=jb()+JfYqLkv> zsxhy`Y{W630T$PD&!61yd?J40PjEnZ&D5#YwGR*?X<&Tj;-N(G{U`%PQ({qmg7VF; z6J-LA0K4;L<=}(-qs$9VH+yb>CXQ5rUq`UXY8{$h+C0oS&GQ^+hamKk{oOTn!bI&R z0c>swHfsLqU?0kW4mqHh%cD;5Hi6(`zGdfXq&k&ia(h}nr{)f$Woq-D60(s20k9sL zMmElX*PYIvz^YI4ov8$}3D-5lApMUml63^{C?NjN`{5YW6PJN0H~;WL0kM_qs2>5& zl@LQpw)WFa2FP#ulwm(e08Z{xd#u6${_}%6138RFB6D{| zq{NIKTW{ONoq)Op(r$b?Qel`HZOUSn8__0=0LudR3TZ9J4S#kKBZe(6`}+=$0H;zS z2Qo`;ht0npHSWS~|2PBgiO1J`XaMMh0BNP+51n~5eiy_N!-^*?(a7d zusS>QxMLsp$My=1)Qr^F0KeV(N>4VkKiR!~>HM4?@_)=s;i9fb*cTjG)pWPjc$^3S z??-mak*c<*rocQV07sfOQgw6>R5fZRFPuapkW%$B#>aaL=s?;AFm@xWx+1q^0FR3F zXkG||>}kCC0Mf!7&?!$-DeJ4Al$l}Z9BeoZ+32rfsf}U0-_Uo%GI4jm)IpcP-1SSr zD_{(V0D2=g!4D5fxJkr99XZ74Obi6z26nx@l2wHgAKTMC$V4Ubu@z{WfKC8)T(_M` z0p39kLHrT+5+&NYWc5$HTe`7CNeImw!)*rG8CYVTg+aaLXjFq5D7h^s{mKt70JaLI zI%hQJKghkL_Pr(8dhr|aZ<;uW;r^b%YrH))`!RG+O0+tx}4>j099*cJlSZg zPlf=5=b9m_8t{%L(}4#*t8EG#?q-506+i9InX#iDdtGX|6h=;;0F)cHV?=y*?>xw< z+Y|+)Ec2MWNVly&SX0!Yd41l>FOKiIf9y}taB5)WCF^F%0J*O6^ujYAzdI5+O(qD;)-6QQ zn3{2#T&BkKC}iU?h6H+usJLXf0LagzN_j2b@Vn0#K7s2! z_)zR7W`m>V`@J6RC@<4-0C6XN@szmz)~8w>JgGXSY`lohQ_=Jlm|kV^MZj3FHQZ0B z6FujMR9&Vc$e6ut0eG2bWSqEJki>&jK<=2sYk$a5L@QNt2z{ zJtMj>z*hoC6+JWi{-Db-C{0#dYS&gQii8!EPIOzG@38K_&a`O(fR0Mv29 z@@8%$j8eYPJ!-d6(uwslk-3@z3Xlahc$NUjFr+73Uz>iIV;qk@mQu@rVs8@qjV0u15Tsa;0Z>C&pc>4few_B(aJb^d z{xn{~L!We*DCMj=z+ve~*lE-SN_Qbui50g7(Tl|B%>9-xJ99x*Ldv$uS1 zJe;WvNc!*2aQ&veQ}@uP|K6Flx(W*zmkpUI06P<7-n6T45rmjtJNdR9L*GZ6r51kB zUj4)1Wk4uK!!@$4*{lJ$8T%f^%;ARA01kLd-DPgMn|nieJzSolP>*Q=HWKx{T<0RfCCOt))X zwPoZD0ey3XXG4E@De13QTmGN^7ewQW=Rg?pu7iP!GJnX;J{%BY=B32LA^7hyMRe(_ z0qmuzBXHEI(aBP$v&kRuC}@N7G-L0p6qf zkwNStI7QICp;VPW?C3Y_Q^F;&kio;Hmkuz9$=r$>bW^rKKs1(Qu31uD00nuG^A($g zHIej!Or}>vc<61%2;p;zS#z$czT&;xU)`p_;wlF*KnFm^nNB(V0LN%p1?Oda)^p*L z*AqE5VxAU1LM4>Iu;4EE{LuUn^YjuIVlbzlY%Q+xq_naR0lTC>CxF|hgVw*?&U)U0 z%ce@8nUygrE#iV{wcmo*YRRqt!Q0aYkWdJiXYpCT0K!GYUu>(%rPsxq-@sixXqE8R z9^znN;G4X=-%2_dHX?#%F0{xv<>lYrS!NT$0N127C=;uCC7#P(0nQ{&P9kyBqA5rF z901|}mg7RU=Bh;BD2vhYcM9|Rx62l@ex&; zH1$REajcV102z}HUKa@n0sGD}B5lAW`B2{xf7!qXV3}t%TmT|VrOLa_3Yy2@q>bEq z?rOXM0G-if|0G*{>LcZ^ZDyBAlzBhBph0B)6JCLsbRD7jeSK{r9V`Q(8;3*VCZhUU z0m8%yc!@@50sf8Ktv@*+z+k$~@w?X>ujhr%EIfHorH;mF2B0KoH+JknAp zYtqy5PcK38A@IPgH01}!8{ki~|7u!`=JsfGOM;x7bfotV_?N*vD~036Uc1RjfkyQRbPg;dmW z%c9HLV~&rdLDON`;DEbao*uzV|1HtN00i!ITG>a4#|DoO$L=KoufI0_(8%{AdWg=w$vKgr z)qQOiZttrW-BWnu{jmD20H3Lw7EUlW9Q3-Yb-Y|_ZElABvp&GWe{mYQ=%~n~@oGIN zzu_7FNrOT(CSGav0A@=Uc;u)>w;inNDEXlNWN$J+h?+9szxzEV(gyG}BFOKVhy!f@ zox&ou?Hi|B0cCmmMXAT~qI)E`;-pj>O>uGj11@>k8~&elVnZCX=_ByEX=DRStkcN( z6r8PC067?0cK`3<^|bbkEm73er#v|*FX%urRd`!y238yMw=h}~snZoqpZ*GI_EV1# z0Yl^52ZBa(xP@f@eJVj%RzJZG0ZjP~M_Nmu~x#5C?y!%PDt)gL)z+w>-bn`zg3))WjJy6FY{dtN*NP40M|rK9ER#@8jOOO zsQIW(k%;&G-I4cu=J6RL@e|F-k0Qux=;4iQ6x(4Mg(^?S^_RX20 zq&|jQphcnIb@?a)>9cnzGhm>0!gBnU+c@qa&pzp9rwct z%;JQ1z=w}ZUUmyg0IHh_wy-z2V2Nb}1TDRXmUvX2Cnqy&iP9AixWuTp>={XQ4$j_4 zvy-Z+0*Dja0Gk1D-H+)+#RMw35=ZHrIgsGwU$v(|joL@awOQ>*PRd0&YXMr@!*M}ki?p7UI z0TB)K%omr!c6fx-Qh`eXNLU-C*zkjCo$GZ_1Zr6%HxZdBAhOAWm0*i$N+v%RN~x^&yac2e?EC4=hW-Y*8G-Ia06kOJs6GbjTra1@ z=J705$^>*o*YEQE3h!@&4WV%Fi*xJFH9k6x8NF%ItYTDe0Qa4u1ork?23!`v`i(U~ z-xef4Mge67w$@|Xa-W4{Nzc&faA_+ChmO%o&|t0n0DLLD)N02N>hgGCXhR#;x>`OQ zHN!FHTi`M2E)`K8zskPjEB&2;Dg%w()77q{02zB5n{9%!E|5?q&4S0y>q(RiCGtYq zoPj~=kj<@H8$yUl{y-b^eKPZC!PO@+0A}mcstsKu^DTg?JuJE-FwHV?Lr3K>L6^@;5%}XaeUG_2nQq#5XXE0D{+2emJfGXF!<0VHRs#59)UXhHmeW&4L_G2Ay-z zptB!EGQkZ=+WR5EmXN3dAR9nv1p&|1AK>RR)~QlNqmdKVzJ(c#c6jdZMV1Ag2hOFm z)luGFUSsGcFk3C*%N=IOEdWa8nN2|FL1&@o_i2n8*N2+DF`#BhaY$0RNru9I_No39 z4D9liWNHGx|NM%0jsTx~+1L&ghia@qV0Hz7g8^IjtwKAtPz=q=K`x8IPhw%m|Bbl+ z@VM8PM$S*L3IJPiiK?1SAU?51^Lf}>T(1CP%k+PuNe6*O@K_~PE%L1cP+qPN7IM?c zNSX~s!vJ02iuIDNNAv81K#BDNq7CaK*Iu=t(_;WAJ6_@sacenbVo16Xq7ImsfD&pj zbpUVYYe)!g@?)mVm|jO}ZN);!iHnYu7R3$LGaqSO9;YVby-i2)jT zTCK-sadokLiO3#d5uFD@jI}lU(`=w`i}eh?O{ahG@4}=79Ed{4gd(k`EdXBKnTyM@ z`7IIOT-7VW-oai{^chnJEuzO=Di+{0m@pgA#zetQs>)W4lv~Q8ngKa&6Ap=r z2;L^<9nP$IWXScfN+p3sQg2o^{D06HEm+p%i~5?vYXD4g#p6gPNjU?BM-0*GWodUQ zJ6-DbK_){7_q1Mwx$^W41$>b6yY`})kn~-hUjdfwf88_-*EF~;(;Tn3#UXXT96#_* z*Xy?Yw*YBP`_Sk{_Iw@7wOuv%8h&sW;{d=2%f4L)-X9_VBvJxJ3@?CmuH|n~I zRh-zuykR^hPw4~Be?h}U;8`!Y_E%^n40TYHD^c9)mi<{N`w_NzB;qjR1n$e7>CPDR;zb zeE~3E%Gp|2(o|7_8&_ROObGtBhrL(bYEb4}Nc$_J!vQ>ZQ2@0r`-yt@@aO|%nlHzZ z=Q(2fom@HY0pyCk!zt!!xZk;alNOqPk1=V;TIw6(G65EJBVQ@EwqiUr(q#ng7RS$6 z`kN`#*HU##`b*CCHf>+-UoEkaMrZB7>WuZ`vPUXEIoRTUzaF?djL_!i{ZYTe&EWRGA2elbK-YAK9=wR7kzrTvc|G$ z-S}1y=%S$bE`;tcj}x_wUI33!avLu{;)o86ixL_Egil_0j?x*%w7k=zY7RFBv&GBy z-n18Y4RTQkDK}zDbOF7_5dN>J0I=aGSAlY6S%rt^R+T$1Is!LRGB{M}G@qR3f`mwy z+s(boi+8Ti*8pFLeuf_Qmi-e)i;mATtqcN>Id=gzo$2=unZ?tNfaVl!K-f+oj2Vr> zla83h#{e?v;eY~&y4_qx$BNCKdkD4}IHto8{_Cidt)`Qut`FeVe`aoE{81C!c4_g$ zI{~tq@}osWYJ;#iElz~-3#XTac&});c8E zX5p;n{CjXVj3+{wSi98(hxIt7>qj_76jnPG)|3$UhK;uRRY_{`5s9f^f(n-09sze|=1HeZA@c`o zF)ekJnGfngEEGZgk`8qzb4_X+(I)nXg&S-H{Kk{*izEQX0{{cGu1{qSkhq?%QFf@A z_00OmfTc?HmF2oYX2q6NrSINg$R}Q_bs<*qb1xC` zZTzr|&5MyXx4=A-0S`WU&127^Up!vDK|zEu*Z}h zSSq0fa7Xl~v{uH5ik3-7)c_&+jK9B`(V|!<_MNAd`QHIdY~Ng&4>8@gPFD|yV`Mr8 zg8hNJBEIuRa2I>Y5&?xObvsE-1Bu5(EGN`{zk`l^cSZ?rU25PAtEIuv>H9D4xwO+I{L3Sq_mVE_nRy2+3!AmB#ts%VPd-t0a1X(qV{Puu=)R31|TP}MM%NueX|QlK2E z8q2v7nE{9z8Ytq@4>a=oFg1?|5lcC8BHN%O^GQT9_`W7=#*-NcwmS+)FQ?>J zH<7D^=d#c2JWv<|* z@FChPzb|NwCcu*r2fPxNuQWedL1W)_eHb;wA$pMR76JdgxFS2bhx7}|OzfsVlO${K z<$|e%{>l!j!4nY!$SN!eEwytnb+G!i+R|)^%15-50MStjdLtFt;QSAdtPF0;~*^H=?wRdk{RM z51sf_6ad#+m>4-`EKv>g+pJmE$4%hn?D)|LeO!%7-u9d=~X zc>vIFxp^j2L{{{XlixCfv1_5p~ zKR8gE_jL>?sxhkM=hhkoWKg(hK1Et12V4m*M6^@K&@*3s=g@xsr3E9JZvg(BOVc_; zVPM!qwARgKBaeVO@zb){mnK2{>qdLXl3e}>8IgblUG-(dz?$WZ4FQ9!@g#@Yu<#D_ zR@W%R?y8ISLv`dU^d5+N`{{+9wXjN|o$#D&02MwLCyvcPQUOyA30{)R7Mt6)k=nB! zsV4z3JPvP*qPGA52yFi^T3bvh#=X%(p-J${r}q6R1OY;gK{~t?BJ&KJh&y!ejmo7? zt`6!Q^v{>ELqHIkFBJnntTS)MZ|@IAkZMlK!2n*4T6S%`e7@Sus^P3-z$Zh$^f*vH zmq=~Yix7yaGlLm`b@t^EMm0+;sBlcqUjgwo^;>GNVlmNKNX571zGEtJYo&3FRW^JpgOVbnCaGVlYW-3hL*jjqc}pkED~AAI|3L;>`v9SZwmn1*KZ` zqS|M(Ie8u@!~lW^BmTIH8ORA1?KM!_R#`E0e69e)pf@Q_DnQL8U^GA?;`SEDs>&VY zqA}Nj5&>7CEBzwk{AXash$<}1Mc=q96fyK|bgtpD2a8czGU^bm7CJrF?(#X4dvjb# zbO7s%j%j+u;K!`bRB9rMq5BIH`)`T*uS9X?A$G!+2dM@-s)WYRUspz?fU~xUjsZ>g zDeX;zDnac~DXP!jg5>FO2c#iZAXU71Oaq`y@B1$sLDnCphxP~7wACDrm;f^Y*!HTC z?^x4)@za$nSawZ%wwqIF%vMhV#-~EIA&gXv)oIm*`~CpF6~4_8GC8t zWC2w2nxTK}_N{O`*BAAAYye{|fK*&RIqS$Hj>wEfcmOURLUl|<8i{$^U|e*)m?>nm z@B*il-(TYeyN`q6|1282a>>WF>cDe@abw-(Hx`x8lD-BgTLbcJzSQTL+ z&zE~CeVHY54fGA3Tess))|$D%=EjAZ1^^zI{w=YrIlEDVf=VB}&YtMLqNDOk2`~sC z@Mhj!@?UnH2xfo@dPg|9YpW%F!~lU?y8+>?LH5-P5%QZXBJ@C0wZU8DE2Q2EYaek7 zj)f{=&hwzypj@c-VUhl&+17R zGMU843p8H=DHSILMghQ@krqZ#J*|@blnD`J>{bK$0+JM1nlL{w;5x!;rtv&5L>esm zb%ET@>fX3ag8_F`6c9fWZgE>rukA*)k%ooaYwhJT4>ioDh*j+Rslyr{dl9v^^I4Cshg_e6rtR17O_}vXIa95nCJ$3q>r6;BI98Q{2d`wsZyY& zjsOO;JL6MnKrj@X`^L++Pk<@yffz{tx@sJ9RG9>;@}I38>42O^kPeSfZyG}_r2z${ z5IT3G+Cmw}Q?DOSIy%?~udWnVH@WaKNuEQl(W0`AV?c?>MlbI*B}1OKEdg4O|27a- z8%gS(kbxCKC7ln#Sg~Cu(^&8K{+DXawR%P~+KCk_c9`xFDuuI(O8|gpPyU8izCN=2 z6X9U7<9>*dGth6ECJJN9gN;$_h4@(`N!e=Y6WRL)#tAztbpavKYIu)vY^)->Opk}Q z{PMcdQQqyN&)gNR1v8=7bcG@YSzwZ3A&60 zZYs@obJoMLzMCM#DoxD-KCv;Wba#QZL=PZMVgb-#$TxaWgZP!)tUc`Nvt35rxIF&C zVz&o(=EUJNu0GlLy!P_L?yg0}F23(jnE>!N$MW!5d*6FoT*b%NVP>lk4iAu;3E|QD zI!5N`zr-b7(U@EBt&U1JZ(cv(nE+W_GApLphKS2F{I1jG+80Y!MB$5~o)Z^4PHYoK zEta>LR_#2)VVwxb2ZHN*r2rioN{;t2as99xia@J9`0X5Gx(ms2H?-e*tDVp*JOsb} z2+35)D41}l`!OdIbOA9A9v&8zS4jj??5GMzVCS~d_H#-CnfgkHhGUywrt!lauKQ_N zQ+bJoWT~sJC;?{zMDdtJW;9Tacv|J9;zU$`9q>J7M+F>qTN4)*)EA{KmwL1Fqsq4tgfAyURdd$mc$74Tll|5UCYVqJh-Ussx;8xEq89>s3%cy3AZ2W<8;gWvV&O`5rqwiBsyJ?tvzJIc=M`?$+^-^C=k4h4n*nxlPw2a(O_*%R zLc*$^FXy6Xq7;9lu#dZQ8w*OYULV})-qx+n}x8_@3ygQlthM*s;TBd!0(Q_9O=K#TuUr1s_L zJEC~gylD%g?g|Fs&0t8dby`gS&OKn-jVG?MZ2I4n~ifB2$q-58PZkMmP8BwKulU0|Az*EH(+ok%LUW<5^^qe)uh~*eQpO6TRTq znOo%+1zGdF;8#;wx2aijR!&p0q5;>_Lo#*nnce;FHEVw>kk<)iH8OH)I6ad;jVL>P2L) zPLD%+?sJRU@+O0dq5;0%hGlU?#xOHmjT-R4y08ww5{{t;he$Hj6MkcE4cx6(W?^Qe;968MFOxyzDkM7f4)A@Jo}TAP%w6{u#|( zfH^?8nI}$>2z}*!Pq@XZqLVq&nmYmYff#FtSp%#^OdrNWHGdhrh&ke z6f`#pJ3PEIDJ7|{-0S!cjT@;EYB@XU8U;<-1giSXj14!mtpN!1e#BxI-Qvp>L0DEI zxl0W3yjk?Vk_JwT>xl; z)Al=&QIR!$Y9ziRc3ij_&bp|i60sV+0iyD%!#u`bldl|INtId1{S3+8Xwe#li}Sn2B(74G$@>@@ zn4@$tL~VU?mH-;z>qFgk=|_Rl^y;#x^&>a0pY4lp-mlV?!8i%0a-(=m#b}!i8@K(y zm;$ajF91X<#XeAbyLq*P`vIcDs}+)6=Sm;nyt`i-UDIPazeM@x4sx91Z~*7q z7B1wRFpbOHMstoF*CTNLt=qFPV1w`o`yvC483J61C8p1+izJ;86F0)HBmgR7&m8l{ z2RqukgEml&+uD?U$-7U_dt0u z%ma6Kk)7mq%*f&J-r`|*W?0nZhTssW<9k;nm+% zXRMkut#n6Tp>o2xWrKt8695_V?Nk!cyGvE<8=)x+P^ROhYqaItI8oB(_VobH%(q@HmuS?I1npih7)Dys&|-pCYAEiEIiwL-@G#ZFxm zr1@2mJ#Ky^4FL$J*%LYUJ}^xs*Hl50P7|3j`f#n1xwV_*GQ81Qi)wV#_299hPr~wGAX}H69 z%r2n|8OYa~7GKu1SpMTV?*XEIa?cXQCsG_Pwry;b9ZP%WjyYfgbpiTicGJKV1=yv3 zk=t~f$&v5#Y*WEs9W`Fx03iX#b!Ci~0;AQ{3`LD144lt66#=u%gox0k;#T8&3&X8K za3zs#wEKrE3nci?qeg=qEdu$|mT7?@Ja^2Ybm~3HmjTyh(rkN<&gX?g?>og%mrE9= zpgDB!kUf?Lm51t}C#cdTdBh}kP)Z)$-O3NYe*u+_OR!1Zl*%L7g6^SkI1WdTO}OAq zgAZ9oKqlJs_(}DAb8|(HQVx>uc?wRJ8~`AT>5fz8=&tK^l5L(wjF_``+p`)&VyO

    qg91X@${7I7zHGOG^d) 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 z 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 z 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Í*J6Nq}X-WH<)XBq&T7A908?J%v$NMUgVu)4x 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

      Y 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

      KB5he-K7Z1gD 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 literal 0 HcmV?d00001 From 6acd1af391d2934031d14d5b38cc56fff1235980 Mon Sep 17 00:00:00 2001 From: Michael Turner Date: Sat, 14 Oct 2023 00:34:33 +0200 Subject: [PATCH 002/339] Add minimum feature set needed for program execution in wasm to wasm crate --- Cargo.lock | 4 ++++ ledger/query/Cargo.toml | 2 +- synthesizer/Cargo.toml | 1 + wasm/Cargo.toml | 33 ++++++++++++++++++++++++++++++--- wasm/src/lib.rs | 10 ++++++++++ 5 files changed, 46 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 570bd13c95..e1e9818e29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3384,9 +3384,13 @@ dependencies = [ "getrandom", "rand", "serde", + "snarkvm-circuit-network", "snarkvm-console", "snarkvm-curves", "snarkvm-fields", + "snarkvm-ledger-block", + "snarkvm-ledger-query", + "snarkvm-ledger-store", "snarkvm-synthesizer", "snarkvm-utilities", "wasm-bindgen", diff --git a/ledger/query/Cargo.toml b/ledger/query/Cargo.toml index a054b07c35..514a11c949 100644 --- a/ledger/query/Cargo.toml +++ b/ledger/query/Cargo.toml @@ -24,7 +24,7 @@ serial = [ "ledger-store/serial", "synthesizer-program/serial" ] -wasm = [ "console/wasm", "synthesizer-program/wasm" ] +wasm = [ "console/wasm", "ledger-store/wasm", "synthesizer-program/wasm" ] query = [ "ledger-store", "synthesizer-program", "ureq" ] [dependencies.console] diff --git a/synthesizer/Cargo.toml b/synthesizer/Cargo.toml index 715662817f..6b901b67c4 100644 --- a/synthesizer/Cargo.toml +++ b/synthesizer/Cargo.toml @@ -56,6 +56,7 @@ wasm = [ "ledger-coinbase/wasm", "ledger-committee/wasm", "ledger-query/wasm", + "ledger-store/wasm", "synthesizer-process/wasm", "synthesizer-program/wasm", "synthesizer-snark/wasm" diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 06a601afa7..2fa3545014 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -31,6 +31,31 @@ path = "../console" version = "=0.15.4" features = [ "wasm" ] optional = true +default-features = false + +[dependencies.snarkvm-ledger-block] +path = "../ledger/block" +version = "=0.15.4" +features = [ "wasm" ] +optional = true + +[dependencies.snarkvm-ledger-query] +path = "../ledger/query" +version = "=0.15.4" +features = [ "async", "wasm" ] +optional = true + +[dependencies.snarkvm-ledger-store] +path = "../ledger/store" +version = "=0.15.4" +features = [ "wasm" ] +optional = true + +[dependencies.snarkvm-circuit-network] +path = "../circuit/network" +version = "=0.15.4" +features = [ "wasm" ] +optional = true [dependencies.snarkvm-curves] path = "../curves" @@ -46,7 +71,7 @@ optional = true path = "../synthesizer" version = "=0.15.4" default-features = false -features = [ "wasm" ] +features = [ "async", "wasm" ] optional = true [dependencies.snarkvm-utilities] @@ -77,9 +102,11 @@ version = "0.3.37" [features] default = [ "full" ] -full = [ "console", "curves", "fields", "synthesizer", "utilities" ] -console = [ "snarkvm-console" ] +full = [ "console", "curves", "fields", "ledger", "synthesizer", "utilities" ] +console = [ "snarkvm-console/default" ] curves = [ "snarkvm-curves" ] fields = [ "snarkvm-fields" ] +ledger = [ "snarkvm-ledger-block", "snarkvm-ledger-query", "snarkvm-ledger-store" ] +network = [ "snarkvm-circuit-network", "snarkvm-console/network" ] synthesizer = [ "snarkvm-synthesizer" ] utilities = [ "snarkvm-utilities" ] diff --git a/wasm/src/lib.rs b/wasm/src/lib.rs index 6105b7c352..2d9e723294 100644 --- a/wasm/src/lib.rs +++ b/wasm/src/lib.rs @@ -12,12 +12,22 @@ // See the License for the specific language governing permissions and // limitations under the License. +#[cfg(feature = "network")] +pub use snarkvm_circuit_network as circuit_network; #[cfg(feature = "console")] pub use snarkvm_console as console; +#[cfg(feature = "network")] +pub use snarkvm_console::network as console_network; #[cfg(feature = "curves")] pub use snarkvm_curves as curves; #[cfg(feature = "fields")] pub use snarkvm_fields as fields; +#[cfg(feature = "ledger")] +pub use snarkvm_ledger_block as ledger_block; +#[cfg(feature = "ledger")] +pub use snarkvm_ledger_query as ledger_query; +#[cfg(feature = "ledger")] +pub use snarkvm_ledger_store as ledger_store; #[cfg(feature = "synthesizer")] pub use snarkvm_synthesizer as synthesizer; #[cfg(feature = "utilities")] From 7ec57d4457c6f8cd4575e015bf1a8380515a5c90 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 13 Oct 2023 19:26:00 -0700 Subject: [PATCH 003/339] Update parameters/src/testnet3/mod.rs Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- parameters/src/testnet3/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/parameters/src/testnet3/mod.rs b/parameters/src/testnet3/mod.rs index 2d6025e265..5ffc8b3d8c 100644 --- a/parameters/src/testnet3/mod.rs +++ b/parameters/src/testnet3/mod.rs @@ -23,10 +23,10 @@ const REMOTE_URL: &str = "https://s3-us-west-1.amazonaws.com/testnet3.parameters // Degrees #[cfg(not(feature = "wasm"))] impl_local!(Degree15, "resources/", "powers-of-beta-15", "usrs"); -#[cfg(not(feature = "wasm"))] -impl_local!(Degree16, "resources/", "powers-of-beta-16", "usrs"); #[cfg(feature = "wasm")] impl_remote!(Degree15, REMOTE_URL, "resources/", "powers-of-beta-15", "usrs"); +#[cfg(not(feature = "wasm"))] +impl_local!(Degree16, "resources/", "powers-of-beta-16", "usrs"); #[cfg(feature = "wasm")] impl_remote!(Degree16, REMOTE_URL, "resources/", "powers-of-beta-16", "usrs"); impl_remote!(Degree17, REMOTE_URL, "resources/", "powers-of-beta-17", "usrs"); From 196f00ec956f80cd450ba39a4976aa703bb985fb Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 13 Oct 2023 19:26:06 -0700 Subject: [PATCH 004/339] Update parameters/src/testnet3/mod.rs Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- parameters/src/testnet3/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/parameters/src/testnet3/mod.rs b/parameters/src/testnet3/mod.rs index 5ffc8b3d8c..5233242d83 100644 --- a/parameters/src/testnet3/mod.rs +++ b/parameters/src/testnet3/mod.rs @@ -45,10 +45,10 @@ impl_remote!(Degree28, REMOTE_URL, "resources/", "powers-of-beta-28", "usrs"); // Shifted Degrees #[cfg(not(feature = "wasm"))] impl_local!(ShiftedDegree15, "resources/", "shifted-powers-of-beta-15", "usrs"); -#[cfg(not(feature = "wasm"))] -impl_local!(ShiftedDegree16, "resources/", "shifted-powers-of-beta-16", "usrs"); #[cfg(feature = "wasm")] impl_remote!(ShiftedDegree15, REMOTE_URL, "resources/", "shifted-powers-of-beta-15", "usrs"); +#[cfg(not(feature = "wasm"))] +impl_local!(ShiftedDegree16, "resources/", "shifted-powers-of-beta-16", "usrs"); #[cfg(feature = "wasm")] impl_remote!(ShiftedDegree16, REMOTE_URL, "resources/", "shifted-powers-of-beta-16", "usrs"); impl_remote!(ShiftedDegree17, REMOTE_URL, "resources/", "shifted-powers-of-beta-17", "usrs"); From d8644ba73244c93b089c24c6c0b9dd34f6857931 Mon Sep 17 00:00:00 2001 From: Michael Turner Date: Mon, 16 Oct 2023 12:52:37 +0200 Subject: [PATCH 005/339] Organize dependencies & match features to crates --- Cargo.lock | 5 ----- wasm/Cargo.toml | 52 ++++++++++++++++++------------------------------- 2 files changed, 19 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e1e9818e29..d692753718 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3382,8 +3382,6 @@ name = "snarkvm-wasm" version = "0.15.4" dependencies = [ "getrandom", - "rand", - "serde", "snarkvm-circuit-network", "snarkvm-console", "snarkvm-curves", @@ -3393,7 +3391,6 @@ dependencies = [ "snarkvm-ledger-store", "snarkvm-synthesizer", "snarkvm-utilities", - "wasm-bindgen", "wasm-bindgen-test", ] @@ -3958,8 +3955,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", - "serde", - "serde_json", "wasm-bindgen-macro", ] diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 2fa3545014..3b39a973b2 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -26,45 +26,44 @@ edition = "2021" [lib] crate-type = [ "cdylib", "rlib" ] -[dependencies.snarkvm-console] -path = "../console" +[dependencies.snarkvm-circuit-network] +path = "../circuit/network" version = "=0.15.4" features = [ "wasm" ] optional = true -default-features = false -[dependencies.snarkvm-ledger-block] -path = "../ledger/block" +[dependencies.snarkvm-console] +path = "../console" version = "=0.15.4" features = [ "wasm" ] optional = true -[dependencies.snarkvm-ledger-query] -path = "../ledger/query" +[dependencies.snarkvm-curves] +path = "../curves" version = "=0.15.4" -features = [ "async", "wasm" ] optional = true -[dependencies.snarkvm-ledger-store] -path = "../ledger/store" +[dependencies.snarkvm-fields] +path = "../fields" version = "=0.15.4" -features = [ "wasm" ] optional = true -[dependencies.snarkvm-circuit-network] -path = "../circuit/network" +[dependencies.snarkvm-ledger-block] +path = "../ledger/block" version = "=0.15.4" features = [ "wasm" ] optional = true -[dependencies.snarkvm-curves] -path = "../curves" +[dependencies.snarkvm-ledger-query] +path = "../ledger/query" version = "=0.15.4" +features = [ "async", "wasm" ] optional = true -[dependencies.snarkvm-fields] -path = "../fields" +[dependencies.snarkvm-ledger-store] +path = "../ledger/store" version = "=0.15.4" +features = [ "wasm" ] optional = true [dependencies.snarkvm-synthesizer] @@ -80,19 +79,6 @@ version = "=0.15.4" features = [ "wasm" ] optional = true -[dependencies.rand] -version = "0.8" -default-features = false - -[dependencies.serde] -version = "1.0.188" -default-features = false -features = [ "derive" ] - -[dependencies.wasm-bindgen] -version = "0.2" -features = [ "serde-serialize" ] - [dependencies.getrandom] version = "0.2" features = [ "js" ] @@ -102,11 +88,11 @@ version = "0.3.37" [features] default = [ "full" ] -full = [ "console", "curves", "fields", "ledger", "synthesizer", "utilities" ] -console = [ "snarkvm-console/default" ] +full = [ "circuit", "console", "curves", "fields", "ledger", "synthesizer", "utilities" ] +circuit = [ "snarkvm-circuit-network" ] +console = [ "snarkvm-console" ] curves = [ "snarkvm-curves" ] fields = [ "snarkvm-fields" ] ledger = [ "snarkvm-ledger-block", "snarkvm-ledger-query", "snarkvm-ledger-store" ] -network = [ "snarkvm-circuit-network", "snarkvm-console/network" ] synthesizer = [ "snarkvm-synthesizer" ] utilities = [ "snarkvm-utilities" ] From 1a5c65ad3053cb2c69d4d424aae91ac0393bba6c Mon Sep 17 00:00:00 2001 From: ljedrz Date: Wed, 27 Sep 2023 13:01:36 +0200 Subject: [PATCH 006/339] perf: employ short-circuiting in equality checks for console::Record Signed-off-by: ljedrz --- console/program/src/data/record/equal.rs | 38 ++++++++++-------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/console/program/src/data/record/equal.rs b/console/program/src/data/record/equal.rs index 0be7c4fc2f..61bf58b714 100644 --- a/console/program/src/data/record/equal.rs +++ b/console/program/src/data/record/equal.rs @@ -27,41 +27,33 @@ impl>> Equal for Reco type Output = Boolean; /// Returns `true` if `self` and `other` are equal. - /// - /// Note: This method does **not** check the `nonce` equality. fn is_equal(&self, other: &Self) -> Self::Output { // Ensure the `data` lengths are equal. if self.data.len() != other.data.len() { return Boolean::new(false); } - // Recursively check each entry for equality. - let mut equal = Boolean::new(true); - for ((name_a, entry_a), (name_b, entry_b)) in self.data.iter().zip_eq(other.data.iter()) { - equal = equal & name_a.is_equal(name_b) & entry_a.is_equal(entry_b); + // Check the `owner`, and `nonce`. + if !(*self.owner.is_equal(&other.owner) && *self.nonce.is_equal(&other.nonce)) { + return Boolean::new(false); } - // Check the `owner`, `data`, and `nonce`. - self.owner.is_equal(&other.owner) & equal & self.nonce.is_equal(&other.nonce) + // Recursively check each entry for equality. + if self + .data + .iter() + .zip_eq(other.data.iter()) + .all(|((name_a, entry_a), (name_b, entry_b))| *name_a.is_equal(name_b) && *entry_a.is_equal(entry_b)) + { + Boolean::new(true) + } else { + Boolean::new(false) + } } /// Returns `true` if `self` and `other` are *not* equal. - /// - /// Note: This method does **not** check the `nonce` equality. fn is_not_equal(&self, other: &Self) -> Self::Output { - // Check the `data` lengths. - if self.data.len() != other.data.len() { - return Boolean::new(true); - } - - // Recursively check each entry for inequality. - let mut not_equal = Boolean::new(false); - for ((name_a, entry_a), (name_b, entry_b)) in self.data.iter().zip_eq(other.data.iter()) { - not_equal = not_equal | name_a.is_not_equal(name_b) | entry_a.is_not_equal(entry_b); - } - - // Check the `owner`, `data`, and `nonce`. - self.owner.is_not_equal(&other.owner) | not_equal | self.nonce.is_not_equal(&other.nonce) + !self.is_equal(other) } } From 461eda8f0b80c01f78c7fe140fb4a61eba7cd38b Mon Sep 17 00:00:00 2001 From: ljedrz Date: Wed, 27 Sep 2023 13:01:41 +0200 Subject: [PATCH 007/339] perf: employ short-circuiting in equality checks for console::Ciphertext Signed-off-by: ljedrz --- console/program/src/data/ciphertext/equal.rs | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/console/program/src/data/ciphertext/equal.rs b/console/program/src/data/ciphertext/equal.rs index 0dd57ac917..31bbd5fffc 100644 --- a/console/program/src/data/ciphertext/equal.rs +++ b/console/program/src/data/ciphertext/equal.rs @@ -32,25 +32,17 @@ impl Equal for Ciphertext { if self.0.len() != other.0.len() { return Boolean::new(false); } + // Check each field element for equality. - let mut equal = Boolean::new(true); - for (a, b) in self.0.iter().zip_eq(other.0.iter()) { - equal &= a.is_equal(b); + if self.0.iter().zip_eq(other.0.iter()).all(|(a, b)| *a.is_equal(b)) { + Boolean::new(true) + } else { + Boolean::new(false) } - equal } /// Returns `true` if `self` and `other` are *not* equal. fn is_not_equal(&self, other: &Self) -> Self::Output { - // Check if the ciphertexts have different numbers of field elements. - if self.0.len() != other.0.len() { - return Boolean::new(true); - } - // Recursively check each member for inequality. - let mut not_equal = Boolean::new(false); - for (a, b) in self.0.iter().zip_eq(other.0.iter()) { - not_equal |= a.is_not_equal(b); - } - not_equal + !self.is_equal(other) } } From bcdca9bff5b55ba894e973c05eae8b25596626ba Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Thu, 24 Aug 2023 08:21:00 +0200 Subject: [PATCH 008/339] WIP: add sage tests --- .../resources/challenges.input | 9 + .../round_functions/resources/h_0.test_vector | 1 + .../round_functions/resources/instance.input | 17 ++ .../round_functions/resources/second.input | 9 + .../resources/test_rounds/h_0.test_vector | 0 .../src/snark/varuna/ahp/indexer/indexer.rs | 17 +- .../ahp/prover/round_functions/first.rs | 44 ++++ .../varuna/ahp/prover/round_functions/mod.rs | 2 + .../ahp/prover/round_functions/second.rs | 194 +++++++++++++++++- .../ahp/prover/round_functions/third.rs | 10 +- .../varuna/data_structures/test_circuit.rs | 4 + algorithms/src/snark/varuna/varuna.rs | 22 +- utilities/src/rand.rs | 40 ++++ 13 files changed, 335 insertions(+), 34 deletions(-) create mode 100644 algorithms/src/snark/marlin/ahp/prover/round_functions/resources/challenges.input create mode 100644 algorithms/src/snark/marlin/ahp/prover/round_functions/resources/h_0.test_vector create mode 100644 algorithms/src/snark/marlin/ahp/prover/round_functions/resources/instance.input create mode 100644 algorithms/src/snark/marlin/ahp/prover/round_functions/resources/second.input create mode 100644 algorithms/src/snark/marlin/ahp/prover/round_functions/resources/test_rounds/h_0.test_vector diff --git a/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/challenges.input b/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/challenges.input new file mode 100644 index 0000000000..7b5623000f --- /dev/null +++ b/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/challenges.input @@ -0,0 +1,9 @@ +192227052363656631588532416871623144703550161931839758861584664328510563277497755573976602426207185410738608382385 +1 +142964935874847288293053714326875850636452886309576462057129885229184368029665262252640373066545420958268146190542 +130772004358781065335697536908031061362482993289814161322663091108024422360727168867592409548570893432602044910287 +94159178481698625866834292426194288892481000237055817778450407880911966894586090114426703377102521778272596259403 +1 +150212484332755645283716251559763892624630250900657735003603251789435633969818132856394958909583079564826956379484 +5995267943708997134860198278542428639233119910412849290681720175671154580110616714403050309227204634155015022534 +220865766116593916805661529740669880775903272671194615565235895783143237414690739939323324369572382485430460237939 diff --git a/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/h_0.test_vector b/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/h_0.test_vector new file mode 100644 index 0000000000..d439c491da --- /dev/null +++ b/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/h_0.test_vector @@ -0,0 +1 @@ +185915056196821536320156652343204727229282837292594912263041813413790128633338782286664390688677458447575662586331,116436695030533106638201415925398905964752267163498842797409034081983882550857533173419098227197733153495286551772,176724664172550839779291935285512872212018255755058301004848323584037179119227257149679920295405461288336468335461,4214851417732456422060319766109647918123064394298538595788822773835685084493111090055138992597379374654196449409,44134823005560246353212693330039045145438017273498486801562673680673891561668385836664416037039683563797591867592,78020517738058871512676400931019255780875357911533762287171501471212065916298075065863777895405900606867937990243,211751619601782024235615902270722907880979418973383889004153153941815351552217815474894072177092563874237900974217,153655852560612090010349545605213115481470771968999258060612155642223235354090966197568452239925752836635695245036,202848120220430692412653504810450093141252531381446689838379041178859519641454786778369457174554121167624887979349,32526265626185439178636804091467122800474386581026181563918618539503262502173225070548303803781671023436578752223,203171121093916756987859553767945578265459550649232105675184113129228384295974526445047563818751019115082066132743,232619671702156081272203798469092856680903790391162977758194567492361622488121455147176879851974945669114464341957,111737015146959471292871264133248840138608865402103502615250051664305168553474444668910665642999633731168782600005,135190128332101810222359743922415978967972512583942390126919080725822432901380455056055131533194879769361584258400,235416092328363403696666633563706869646069773659039376283006767934765474270134621191790482358563705454897682817729,196770562184018772765124541980340309238319913562501462322182844979008445479460810369366966120207441291373721956473,15067607251506590764593012999532188576952430337502695941848134497698211663403542907707693219447072455142228618654,153112970752348304711555303521770085058676635044498504670119841042682692992218557852917073653287078758016332389429,41814227831101358085552293725702577007475013206507922524665935684855910703075617006693673312094130919855250701816,46210991084261735369540176336785401926050146142894166239023429874075954137457537347356904190837289668357338775719,65180690410618316159590711520057790476043851474414048250779381848867867752191201309386944964137061678729666372404,163977009118008876397481104934488926280906125214947204954959058151586803233598126321208128615487240116914878196904,107624338781797786219187860500638557499388171469045256687296355903088482395585665425250192519275596854440282610214,249278217714096142452500317876751424994857427780886239832626112975678948442962872640287508716310677134212894568938,181780279468431650292509126375103899200476654250097243259416839008038007601340629888731244061317442925182706610387,101477487238140838785180196322359177562788001470768818963269623239161764677475077294532264035949163024995841987609,39500708497211819648234285504045618657265603080056578424958533523307249563842879645368409673300576347337870706810,153739957531959683383924916676932627445950033750065743904704677389935459403176230576033900786849178956111160811826,223220562335325081889062483683175560450893617533886304374883836450192638262516696830878199370240362358747909954755,16173397298172619673439254893062353729873219019949999568160504648515309262585249444067059165722662207679024557360,21450874001726492846898211206264300216915341709078105085545028008084995695202216674454445018623884229789170035958,176023918645459885893056702950382496785643061799980752861802280426759287774079671917213366819679107073634785367032,141156064975761261972387979397349112916628493984120918745308855740600589653942158984252371604924599380201292062753,117985392887425477742590999150088302896201095364458607112029508040768111857951066472685625314636280505311253831799,230107243375374908452761364989785887814278367793276099309661221113899558250145675927601161585708447621491556215967,78796787763801128117591163253860635255451381683420881796703382739940544536649834363719139773332907644812775008281,143627218725845932329677530061006905724693725855988419302025202338322845946940752381923065952823427005823043787786,64603060760821711315171263154882478847853516719474487827900650493518877444355646343079807944155612658187577959927,78116938648878032080007332589865471901175486321551311406025557293918830091691278983068596100092353228976709174430,184085108229869019331960428782583222831401177507356960872965287384901378631548116273615054935432708548350743088180,44785299482578491967585010882674306949680965891741233102605956907988629696758527736736059754465444338896453585808,145097838029239451391835088100783725562518034017266127945974256781989472772641684234423649414334123592706488266575,101524030183992525779753753921794380630502066877069971133736116751012103847060981189129951764838134542937546434077,244881762862854575711641155186443800920195224733867215803699296316089002051271957443112738533518687382672550717311,63812586515988693035735187671422934770569187132322932415570861417327039950760450669262452551991399755370023753389,24079352271903683627283889196219841254073124496529957738561900622051733860009343739727198474799877978196139275614,57876990818466035512748173250690721840310229339104932146878038113579881247204613699113613748555797091692341736991,158155705405577143693427638882754376170491837569367872250973517844400384478250306208098372896546409782745007064923,132225203099468279300283267273843403442146817430971521078145389992686592429117407112234495703272277324090901065205,107476600943010178512367340863188890521822931973209947077930911719969281943656719377403506433948301292654517183386,33357069108861986925052630007594108068928700320775254116983029930783500716054427496707951446805837678842611213467,243923660897860469008246690386790884915505967327163547470234520378323687675978216054016349746029469319117051063413,80312052487412555021525805460708579621866525814327662526931459702298144813611184836223736123629843302858174485036,159495338177353926779439712781919632013565418431974259244083584481356116842167744996910165746025212714032629374095,170717731837329726722809253216925419463082875512994122091272562636154471568569042260382104254949670731509031631921,23708894078899136632576739791915566419273581462739795245943604537002125079268582201442779131039767623114237677255,153713205976574946807239319360901394637407461724672689032762978582721187640366380615997605334576865778792114257843,6574088240663187039203523402469900172823554527578415081433323175286525096720388521227028107757639904916976195814,14754228682957576410561321346405080120918860924185445097283436524223405516860510123605649604288401214567500832338,101678517350598732060667272844483554496557367276389826354204188487356160224518036810167937032169105822234882316622,97603971509566353229593047894141977296587056826820850348365433658150459275198243424311636549986013034189103611293,255470768480835808807276021143407041393334114766470462142690645804891848651823595646477502365950909469138237940276,27193043914175513272998248763583127488929864632262266253900680795317712531862305574087921521449783081227536178240,84798407977218981826978375524482498358155715403944237429188064734277828732078769997282836930446711123176274239994,232563388983113636808128021183952194470646192940588838566899830914626566636997440230317305276654580023291449990750,29473803943250149783638618707613910340044689582376425151839683584045150040308180762445822012856985356169811005310,3851457732583529499205831128407556859323038441358736209844055779256032330721959907343062761086429981611760134997,85253125684067690753139330953046067054394099824194866161864580252357209824539980205386993880060316181284092483544,132747558363986229291203342314413085775343602565647451539507431829662667573172210931554179518639056711815723702972,56429146066298876274239208899061375321766373888108162948856070110900850344348129990303672007756586385380055069256,18389847780302989697053754885221096242782050782895222758354773834611723170856974033276822907355584916380449745309,64633389852263731647301714258555601347350566063981432234840623818057149232867377147958884486513371492089515180086,75736622923576807757985704311860603198341598438404359399594286668306746262287451198191476507096903455561351482036,47924938280440088416548644659316327884359798717944313850923257133970523112859003213198874987899307330395238059817,30970673039877340752800381124437887953653106796700147945813719870579691764473738585153661221633511881957227774658,232691551268889726098696328007030810640843263473764638787148074538127520434142025150874522514318581109013623000541,236299625590611434221083094078951434794514486290156394977269184814841136001182793052559660157183775344770566753232,41462222888125900535044807448273323269800220936314469913613912862346305555560868362353202225169702877115352724782,185078110694225639198314004460135875837158807042789126291613207370262334214375997017248946439551232954621009094053,49395242095584305343602128918845904700797431108259932958851501015970781799683259012781858179709497747821505986421,185746979644565076107063856749294998089482289970249417433494606438102246714927908602633175113194743917839606027282,108982585245233959834236880832639962546050091280853361023319172188852460682440554358501938750473587247463103714000,82531855419799361537265339827417729218359343459387541020429546192422997314513631480581442572753699916060172878983,151254953698390848847297635160714044752558223982278822713169709557356986494602923540873506098643238898828895367665,195376996759321231671403693308413507669863302926014294068924314329643040130885405298314814012573801978788448023544,126118991625778610443444798701194808076224440933304070742110154937968125027720747333834044478235064116496558584408,3616586306865760557901049769039373823195086472207081519266269348523126189808388070799575812414246646981160783840,121961773735012581936244409769325976683329183622110182740810012578890354544912357266239248364782675900934735125986,214004886139112306052448450825105960505775910842446241836230969512960604575675419720916815859675170651103954570836,234626563853479686872145380599114135076488450497131672483260093217855203917600820465251602910951536572788822851979,114282865050695189246910319811456064620377255173459118270134736391052986016688743497454169234069104949010582757700,34074160339996061543033379517540556095652803075169133409356794042613745003082194463602240796865159489901140224828,185559424087925994158070838579207461847896298482256584606887682837886581404948409761487073587888421863945372957230,180681831088182903464137350938370527659384146490353259796209770447722757491931730319958028052309997707654058812694,61735753056195236795757321586046205724767600724695564641350053902903145692989286231789191194923825282521902103651,53441948774328760880125063524609107984964353098802082130715244306715095604691809024231836385139218174260981218594,170284122303083169655069835955324932541435206383911157266648389414178934591222016410861819073146031809133930874818,190823746081505750261281589278120249993509616846595235929138844694564189095286207327653442333217119071839605059857,91158404196369577971006406030024111877525679881831338727004454936777420875782391422844227590946232996828312630514,103281300051902710504517682293222405228355314016335693452550733064571992272308695019941292994522781638815051734577,167955147421127584599567563206552789034765060029281187108531011275295420943827854529092838405880321812632018491530,127655903737432082742158565324441703784577651149163237949949572779619245001313837087603784563857049604930428861060,44479156420753265286265412591532760187998668820652872190414701540625447152786354613442203903898069943519244531972,113690439735543373221787839375330997492745614364541396117785297940492176583769522702277317429852573817575168280289,241860387345958859198444337813835064529923707262324798152313004885803099700917081903263830060034925987504816130841,116647215544507608361674235279543398627393612217149182330467230582207130183910792117273681040867783320208376713863,65963987516855463802696213540309911609203331370137256454823892075028666213734337311446537324956179549161833622991,102431656738040859399601084834731074531337501579908517996276678145384387798299818302912986612403013828018012073632,7346844916235481859575828592619095820495545897136340790762361967499847499288171642067296535456387460918670088534,100211581799177322713775640983089528699328681752531562130386046693959893487473652263780226546489250295191327961943,66152206339838705673694218248058536407695803789281561750363088831023062265348646642214382774748109044709025339207,189839544586713416053893036451331070068871333274563698228880192433095862667532368304283510773800113949068197032922,201556681139987697069942561413023740616001054018988669582339394004705308696351509556458718693878391046350429029216,183950790546985957805464675366716859391882655842690700294969212025530753044542961895793826525157337466309696530232,14837957230010736930762457560754776991812365678785643295115575415154774564484053274548787742984757963825697116864,218244459133980935539689064625395515290468223526350824317565060876083484629422104097577360316610723204154886112897,64476443322626109949784596791891753949592443505419620959762201760119896761436954548107585032587121096295216734331,204580679641620681607796530187415235020944206108981346445116819239090275631554028430776472593485776122736500627059,137791805662709562173467670240651537141114306604726872565242912347083779942690003998654987337338286224123290711621,116902015637296284454594656428864325872856259446214318588209296446862609663643358650203959046373867311301665823900,195929595625832041015072248546886474548832174777299183900446266229591218283163635570004970563403124513694096796982,114330352930988461123019776598136288053107421520716258590261232227447755224462335750938682089889594404578576419957,120738188399965705493618689540477953139699904141157650679534312105039764376730909182013462282286338297982646218248,195163452690082202590102106230937308021677963803618354626310513875073053344974056521780779368977099347556046751633,201525596052767211105650220583954732572769968237337993362962832933383261562205363993784303594352949597026962803631,100047244125089227039875872832747346758007419310301401032976423728787019401329691209266894347904604951167414143717,84366079422570471768609822461021004205092733471429482159625785785718082942301246470508514429963566876144155849624, diff --git a/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/instance.input b/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/instance.input new file mode 100644 index 0000000000..27ce595664 --- /dev/null +++ b/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/instance.input @@ -0,0 +1,17 @@ +0, 1, 0, 0, 0, +0, 1, 0, 0, 0, +0, 1, 0, 0, 0, +0, 1, 0, 0, 0, +0, 1, 0, 0, 0, +0, 0, 1, 0, 0, +0, 0, 1, 0, 0, +0, 0, 1, 0, 0, +0, 0, 1, 0, 0, +0, 0, 1, 0, 0, +1, 0, 0, 0, 0, +1, 0, 0, 0, 0, +1, 0, 0, 0, 0, +1, 0, 0, 0, 0, +1, 0, 0, 0, 0, +4, 2 +8, 4, 2, 16, 32, diff --git a/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/second.input b/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/second.input new file mode 100644 index 0000000000..c4d388dfb0 --- /dev/null +++ b/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/second.input @@ -0,0 +1,9 @@ +43719561533842476373783670372904509453942239614039851160651722575355200513690215676427143818688669409477717356697 +1 +221400395006961780677343786613069247364561322399032182018779372395547677427473563761257898688782138184082453089080 +220857107422062177961310768973448484943348952807551776483013286539337828841179434809386713211789661237952735284503 +93140711900014280323811219767030904360542834646330898824133268751714031953884771421485624661328159718969289922279 +1 +210691428699097896481859553574055160381026932138503481370159927734408364611239823344879652067796513776859977564687 +39291796191041067223251635051890547797734640797759684658651733745713541775929823595418082554573556182974397315204 +16963008194059394677667633670174788960123081977519241438404044904900225908849305375312962047657570434981724274395 diff --git a/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/test_rounds/h_0.test_vector b/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/test_rounds/h_0.test_vector new file mode 100644 index 0000000000..e69de29bb2 diff --git a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs index c38e4a9970..00b0e432e9 100644 --- a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs +++ b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs @@ -19,12 +19,10 @@ use crate::{ snark::varuna::{ ahp::{ indexer::{Circuit, CircuitId, CircuitInfo, ConstraintSystem as IndexerConstraintSystem}, - AHPError, - AHPForR1CS, + AHPError, AHPForR1CS, }, matrices::{matrix_evals, MatrixEvals}, - num_non_zero, - SNARKMode, + num_non_zero, SNARKMode, }, }; use snarkvm_fields::PrimeField; @@ -64,6 +62,17 @@ impl AHPForR1CS { id, } = Self::index_helper(c).map_err(|e| anyhow!("{e:?}"))?; + let joint_arithmetization_time = start_timer!(|| format!("Arithmetizing A,B,C {id}")); + + let [a_arith, b_arith, c_arith]: [_; 3] = [("a", a_evals), ("b", b_evals), ("c", c_evals)] + .into_iter() + .map(|(label, evals)| arithmetize_matrix(&id, label, evals)) + .collect::, _>>()? + .try_into() + .unwrap(); + + end_timer!(joint_arithmetization_time); + let fft_precomp_time = start_timer!(|| format!("Precomputing roots of unity {id}")); let (fft_precomputation, ifft_precomputation) = Self::fft_precomputation( diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/first.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/first.rs index 43e243cbc6..3462c339e8 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/first.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/first.rs @@ -161,3 +161,47 @@ impl AHPForR1CS { } pub type Witness = LabeledPolynomial; + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + snark::marlin::{MarlinHidingMode, MarlinSNARK, TestCircuit}, + traits::{algebraic_sponge::AlgebraicSponge, snark::SNARK}, + }; + use snarkvm_curves::bls12_377::{Bls12_377, Fq, Fr}; + use snarkvm_fields::{One, Zero}; + use snarkvm_utilities::Uniform; + use std::{borrow::Cow, collections::HashMap, ops::Deref}; + type FS = crate::crypto_hash::PoseidonSponge; + type MarlinSonicInst = MarlinSNARK; + + // TODO: make macros to use different hiding modes + #[test] + fn test_prover_first_round() { + let random_state = vec![3u64; 100]; + let rng = &mut snarkvm_utilities::rand::TestMockRng::fixed(random_state); + + let a = Fq::rand(rng); + println!("a: {:?}", a); + let a = Fq::rand(rng); + println!("a: {:?}", a); + + let max_degree = AHPForR1CS::::max_degree(100, 25, 300).unwrap(); + let universal_srs = MarlinSonicInst::universal_setup(max_degree).unwrap(); + let universal_prover = &universal_srs.to_universal_prover().unwrap(); + let universal_verifier = &universal_srs.to_universal_verifier().unwrap(); + let fs_parameters = FS::sample_parameters(); + let mul_depth = 1; + let num_constraints = 100; + let num_variables = 25; + let (circ, public_inputs) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); + let (index_pk, index_vk) = MarlinSonicInst::circuit_setup(&universal_srs, &circ).unwrap(); + let mut keys_to_constraints = BTreeMap::new(); + keys_to_constraints.insert(index_pk.circuit.deref(), std::slice::from_ref(&circ)); + + let prover_state = AHPForR1CS::<_, MarlinHidingMode>::init_prover(&keys_to_constraints, rng).unwrap(); + let state = AHPForR1CS::<_, MarlinHidingMode>::prover_first_round(prover_state, rng).unwrap(); + // TODO: checks on state. + } +} diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/mod.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/mod.rs index 9251aa91fc..9d374e67ed 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/mod.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/mod.rs @@ -128,6 +128,8 @@ impl AHPForR1CS { Self::formatted_public_input_is_admissible(&padded_public_variables)?; + println!("padded_public_variables: {:?}", padded_public_variables); + println!("private_variables: {:?}", private_variables); let eval_z_a_time = start_timer!(|| format!("For {:?}, evaluating z_A_{_i}", circuit.id)); let z_a = cfg_iter!(circuit.a) .map(|row| { diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs index 9060e7746e..adff95febb 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs @@ -21,10 +21,7 @@ use crate::{ ahp::{verifier, AHPForR1CS}, prover, selectors::apply_randomized_selector, - witness_label, - Circuit, - CircuitId, - SNARKMode, + witness_label, Circuit, CircuitId, SNARKMode, }, }; use anyhow::Result; @@ -47,7 +44,7 @@ impl AHPForR1CS { } /// Output the second round message and the next state. - pub fn prover_second_round<'a, R: RngCore>( + pub fn prover_second_round<'a>( verifier_message: &verifier::FirstMessage, mut state: prover::State<'a, F, SM>, _r: &mut R, @@ -151,6 +148,7 @@ impl AHPForR1CS { let evals = EvaluationsOnDomain::from_vec_and_domain(evaluations, constraint_domain); let poly = evals.interpolate_with_pc_by_ref(&circuit.ifft_precomputation); + println!("poly z_m {label}: {:?}", poly.coeffs); debug_assert!( poly.evaluate_over_domain_by_ref(constraint_domain) @@ -168,3 +166,189 @@ impl AHPForR1CS { poly } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + snark::marlin::{MarlinHidingMode, MarlinNonHidingMode, MarlinSNARK, TestCircuit}, + traits::{algebraic_sponge::AlgebraicSponge, snark::SNARK}, + }; + use snarkvm_curves::bls12_377::{Bls12_377, Fq, Fr}; + use snarkvm_fields::{One, Zero}; + use snarkvm_utilities::Uniform; + use std::{borrow::Cow, collections::HashMap, ops::Deref}; + type FS = crate::crypto_hash::PoseidonSponge; + type MM = MarlinNonHidingMode; + type MarlinSonicInst = MarlinSNARK; + use std::{fmt::Debug, fs, str::FromStr}; + + use std::{path::PathBuf, sync::Arc}; + + /// Returns the path to the `resources` folder for this module. + fn resources_path() -> PathBuf { + // Construct the path for the `resources` folder. + let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + path.push("src"); + path.push("snark"); + path.push("marlin"); + path.push("ahp"); + path.push("prover"); + path.push("round_functions"); + path.push("resources"); + + // Create the `resources` folder, if it does not exist. + if !path.exists() { + std::fs::create_dir_all(&path).unwrap_or_else(|_| panic!("Failed to create resources folder: {path:?}")); + } + // Output the path. + path + } + + /// Loads the given `test_folder/test_file` and asserts the given `candidate` matches the expected values. + #[track_caller] + fn assert_snapshot, S2: Into, C: Debug>(test_folder: S1, test_file: S2, candidate: C) { + // Construct the path for the test folder. + let mut path = resources_path(); + path.push(test_folder.into()); + + // Create the test folder, if it does not exist. + if !path.exists() { + std::fs::create_dir(&path).unwrap_or_else(|_| panic!("Failed to create test folder: {path:?}")); + } + + // Construct the path for the test file. + path.push(test_file.into()); + path.set_extension("test_vector"); + + // Create the test file, if it does not exist. + if !path.exists() { + std::fs::File::create(&path).unwrap_or_else(|_| panic!("Failed to create file: {path:?}")); + } + + // Assert the test file is equal to the expected value. + expect_test::expect_file![path].assert_eq(&format!("{candidate:?}")); + } + + // TODO: make macros to use different hiding modes + #[test] + fn test_prover_second_round() { + let second_path = "src/snark/marlin/ahp/prover/round_functions/resources/second.input"; + let test_vectors_file = fs::read_to_string(second_path).expect("Could not read the file"); + let mut test_vectors = Vec::new(); // TODO: preallocate + for line in test_vectors_file.lines() { + test_vectors.push(line.to_string()) + } + + let instance_path = "src/snark/marlin/ahp/prover/round_functions/resources/instance.input"; + let instance_file = fs::read_to_string(instance_path).expect("Could not read the file"); + let mut instance = Vec::new(); // TODO: preallocate + for line in instance_file.lines() { + instance.push(line.to_string()) + } + + let challenges_path = "src/snark/marlin/ahp/prover/round_functions/resources/challenges.input"; + let challenges_file = fs::read_to_string(challenges_path).expect("Could not read the file"); + let mut challenges = Vec::new(); // TODO: preallocate + for line in challenges_file.lines() { + challenges.push(line.to_string()) + } + let circuit_combiner = Fr::one(); + let instance_combiners = vec![Fr::one()]; + + // TODO: understand which data points we need. Starting with a and b in the TestCircuit + + use snarkvm_curves::bls12_377::FrParameters; + use snarkvm_fields::Fp256; + let mut random_state = vec![0u64; 100]; + let add_f_to_state = |s: &mut Vec, f: Fp256| { + // Fp384 field elements sample 6 u64 values in total + for i in 0..f.0 .0.len() { + s.push(f.0 .0[f.0 .0.len() - 1 - i]); + } + }; + for witness in instance[15].split(",") { + println!("witness: {}", witness.trim()); + if witness.trim() == "" { + continue; + } + add_f_to_state(&mut random_state, Fr::from_str(witness.trim()).unwrap()); + } + // let two = Fq::from_str("2").unwrap(); + // add_f_to_state(&mut random_state, 2u64); + // random_state.push(79601084644714804u64); + // random_state.push(11090443381845330384u64); + // random_state.push(17770411857874044427u64); + // random_state.push(4538334656037814244u64); + // random_state.push(11709709805437321058u64); + // random_state.push(404198066556501712u64); + + let rng = &mut snarkvm_utilities::rand::TestMockRng::fixed(random_state); + + // let test = Fq::from_str("8").unwrap(); + // println!("test: {:?}", test.0.0); + + // let a = Fq::rand(rng); + // println!("a: {:?}", a); + // println!("a: {:?}", a.0.0[0]); + // println!("a: {:?}", a.0.0[1]); + // println!("a: {:?}", a.0.0[2]); + // println!("a: {:?}", a.0.0[3]); + // println!("a: {:?}", a.0.0[4]); + // println!("a: {:?}", a.0.0[5]); + // let a = Fq::rand(rng); + // println!("a: {:?}", a); + + // NOTE: we can tell based on fn inner_product, that the public variables come first. Our goal is to get the right values into: + // padded_public_variables: [1, 121902002256018526321273757023754328318276501290347840063579141932923540131] + // private_variables: [7637532484706255996016764771999758676172095851412507196353554567622637938911, 8436595930774912737517092455800659045000222630657145426921353293889876675680, 7637532484706255996016764771999758676172095851412507196353554567622637938911, 7637532484706255996016764771999758676172095851412507196353554567622637938911] + + let max_degree = AHPForR1CS::::max_degree(100, 25, 300).unwrap(); + let universal_srs = MarlinSonicInst::universal_setup(max_degree).unwrap(); + let mul_depth = 1; + let num_constraints = 5; + let num_variables = 4; + // TODO: pass the right randomness in + let (circ, public_inputs) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); + println!("public_inputs: {:?}", public_inputs); + println!("circ: {:?}", circ); + let (index_pk, _index_vk) = MarlinSonicInst::circuit_setup(&universal_srs, &circ).unwrap(); + let mut keys_to_constraints = BTreeMap::new(); + keys_to_constraints.insert(index_pk.circuit.deref(), std::slice::from_ref(&circ)); + + let prover_state = AHPForR1CS::<_, MM>::init_prover(&keys_to_constraints, rng).unwrap(); + let prover_state = AHPForR1CS::<_, MM>::prover_first_round(prover_state, rng).unwrap(); + + let assignments = AHPForR1CS::<_, MM>::calculate_assignments(&prover_state).unwrap(); + let constraint_domain = EvaluationDomain::::new(num_constraints).unwrap(); + println!("assignments: {:?}", assignments); + println!("generator of H: {:?}", constraint_domain.group_gen); + for el in constraint_domain.elements() { + println!("element of H: {:?}", el); + } + let non_zero_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_a).unwrap(); + println!("generator of K: {:?}", non_zero_domain.group_gen); + for el in non_zero_domain.elements() { + println!("element of K: {:?}", el); + } + // TODO: the uneven indices are not consistent with the Sage tests + + // TODO: I could test the witness poly and the mask poly. Is z_lde sufficient? And the Sage tests don't use a mask poly... + + let combiners = verifier::BatchCombiners:: { circuit_combiner, instance_combiners }; + let batch_combiners = BTreeMap::from_iter([(index_pk.circuit.id, combiners)]); + let verifier_message = verifier::FirstMessage:: { batch_combiners }; + let (second_oracles, prover_state) = + AHPForR1CS::<_, MM>::prover_second_round(&verifier_message, prover_state).unwrap(); + // TODO: I can save space by using bytes instead of number characters, and allocating the right amount immediately + let mut h_0 = String::new(); + for coeff in second_oracles.h_0.coeffs() { + println!("adding coeff: {}", coeff.1.to_string()); + h_0 += &coeff.1.to_string(); + h_0 += ","; + } + assert_snapshot("test_rounds", "h_0", h_0); + + // TODO: checks on state. + } +} diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs index 4e994d4981..2e57a34de6 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs @@ -16,9 +16,7 @@ use crate::{ fft::{ domain::{FFTPrecomputation, IFFTPrecomputation}, polynomial::PolyMultiplier, - DensePolynomial, - EvaluationDomain, - Evaluations, + DensePolynomial, EvaluationDomain, Evaluations, }, polycommit::sonic_pc::{LabeledPolynomial, PolynomialInfo, PolynomialLabel}, snark::varuna::{ @@ -26,9 +24,7 @@ use crate::{ matrices::transpose, prover::{self, MatrixSums, ThirdMessage}, selectors::apply_randomized_selector, - AHPError, - Matrix, - SNARKMode, + AHPError, Matrix, SNARKMode, }, }; use snarkvm_fields::PrimeField; @@ -231,6 +227,8 @@ impl AHPForR1CS { .zip_eq(x_polys) .enumerate() .map(|(_j, (w_poly, x_poly))| { + println!("w_poly: {:?}", w_poly); + println!("x_poly: {:?}", x_poly); let z_time = start_timer!(move || format!("Compute z poly for circuit {} {}", circuit.id, _j)); let mut assignment = w_poly.0.polynomial().as_dense().unwrap().mul_by_vanishing_poly(*input_domain); diff --git a/algorithms/src/snark/varuna/data_structures/test_circuit.rs b/algorithms/src/snark/varuna/data_structures/test_circuit.rs index 8e66d71f03..80bed30011 100644 --- a/algorithms/src/snark/varuna/data_structures/test_circuit.rs +++ b/algorithms/src/snark/varuna/data_structures/test_circuit.rs @@ -73,6 +73,7 @@ impl ConstraintSynthesizer for TestCircuit TestCircuit { public_inputs.push(new_var); } + println!("a: {}", a); + println!("b: {}", b); + (TestCircuit { a: Some(a), b: Some(b), num_constraints, num_variables, mul_depth }, public_inputs) } } diff --git a/algorithms/src/snark/varuna/varuna.rs b/algorithms/src/snark/varuna/varuna.rs index ac07edcee3..cca9765627 100644 --- a/algorithms/src/snark/varuna/varuna.rs +++ b/algorithms/src/snark/varuna/varuna.rs @@ -16,30 +16,15 @@ use super::Certificate; use crate::{ fft::EvaluationDomain, polycommit::sonic_pc::{ - Commitment, - CommitterUnionKey, - Evaluations, - LabeledCommitment, - QuerySet, - Randomness, - SonicKZG10, + Commitment, CommitterUnionKey, Evaluations, LabeledCommitment, QuerySet, Randomness, SonicKZG10, }, r1cs::{ConstraintSynthesizer, SynthesisError}, snark::varuna::{ ahp::{AHPError, AHPForR1CS, CircuitId, EvaluationsProvider}, - proof, - prover, - witness_label, - CircuitProvingKey, - CircuitVerifyingKey, - Proof, - SNARKMode, - UniversalSRS, + proof, prover, witness_label, CircuitProvingKey, CircuitVerifyingKey, Proof, SNARKMode, UniversalSRS, }, srs::UniversalVerifier, - AlgebraicSponge, - SNARKError, - SNARK, + AlgebraicSponge, SNARKError, SNARK, }; use rand::RngCore; use snarkvm_curves::PairingEngine; @@ -421,7 +406,6 @@ where let (second_oracles, prover_state) = AHPForR1CS::<_, SM>::prover_second_round(&verifier_first_message, prover_state, zk_rng)?; - let second_round_comm_time = start_timer!(|| "Committing to second round polys"); let (second_commitments, second_commitment_randomnesses) = SonicKZG10::::commit( universal_prover, diff --git a/utilities/src/rand.rs b/utilities/src/rand.rs index 818aa969fe..e30e1f8ee5 100644 --- a/utilities/src/rand.rs +++ b/utilities/src/rand.rs @@ -140,3 +140,43 @@ impl rand::RngCore for TestRng { } impl rand::CryptoRng for TestRng {} + +/// A cache of numbers LARPing as an RNG used **solely** for testing and benchmarking, **not** for any real world purposes. +pub struct TestMockRng { + state: Vec, +} + +impl TestMockRng { + pub fn fixed(state: Vec) -> Self { + TestMockRng { state } + } +} + +impl rand::RngCore for TestMockRng { + fn next_u32(&mut self) -> u32 { + println!("next_u32"); + self.state.pop().unwrap() as u32 + } + + fn next_u64(&mut self) -> u64 { + println!("next_u64"); + self.state.pop().unwrap() + } + + fn fill_bytes(&mut self, dest: &mut [u8]) { + println!("fill_bytes: {:?}", dest.len()); + for i in 0..dest.len() { + dest[i] = self.state.pop().unwrap() as u8; + } + } + + fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand::Error> { + println!("try_fill_bytes: {:?}", dest.len()); + for i in 0..dest.len() { + dest[i] = self.state.pop().unwrap() as u8; // TODO: use try_from and convert the Error + } + Ok(()) + } +} + +impl rand::CryptoRng for TestMockRng {} From 62f2809292205a3c118e7ed8b4869da480e9d161 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Wed, 13 Sep 2023 11:13:22 +0200 Subject: [PATCH 009/339] Rounds 1-3 correspond to Sage output for 1 test circuit --- .../ahp/prover/round_functions/second.rs | 95 +++++++++++++++++-- .../ahp/prover/round_functions/third.rs | 18 +++- 2 files changed, 100 insertions(+), 13 deletions(-) diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs index adff95febb..ba6644a692 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs @@ -148,7 +148,6 @@ impl AHPForR1CS { let evals = EvaluationsOnDomain::from_vec_and_domain(evaluations, constraint_domain); let poly = evals.interpolate_with_pc_by_ref(&circuit.ifft_precomputation); - println!("poly z_m {label}: {:?}", poly.coeffs); debug_assert!( poly.evaluate_over_domain_by_ref(constraint_domain) @@ -305,9 +304,9 @@ mod tests { let max_degree = AHPForR1CS::::max_degree(100, 25, 300).unwrap(); let universal_srs = MarlinSonicInst::universal_setup(max_degree).unwrap(); - let mul_depth = 1; - let num_constraints = 5; - let num_variables = 4; + let mul_depth = 3; + let num_constraints = 7; + let num_variables = 7; // TODO: pass the right randomness in let (circ, public_inputs) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); println!("public_inputs: {:?}", public_inputs); @@ -318,6 +317,7 @@ mod tests { let prover_state = AHPForR1CS::<_, MM>::init_prover(&keys_to_constraints, rng).unwrap(); let prover_state = AHPForR1CS::<_, MM>::prover_first_round(prover_state, rng).unwrap(); + let first_round_oracles = Arc::clone(prover_state.first_round_oracles.as_ref().unwrap()); let assignments = AHPForR1CS::<_, MM>::calculate_assignments(&prover_state).unwrap(); let constraint_domain = EvaluationDomain::::new(num_constraints).unwrap(); @@ -331,15 +331,92 @@ mod tests { for el in non_zero_domain.elements() { println!("element of K: {:?}", el); } - // TODO: the uneven indices are not consistent with the Sage tests - - // TODO: I could test the witness poly and the mask poly. Is z_lde sufficient? And the Sage tests don't use a mask poly... let combiners = verifier::BatchCombiners:: { circuit_combiner, instance_combiners }; let batch_combiners = BTreeMap::from_iter([(index_pk.circuit.id, combiners)]); - let verifier_message = verifier::FirstMessage:: { batch_combiners }; + let verifier_first_msg = verifier::FirstMessage:: { batch_combiners }; let (second_oracles, prover_state) = - AHPForR1CS::<_, MM>::prover_second_round(&verifier_message, prover_state).unwrap(); + AHPForR1CS::<_, MM>::prover_second_round(&verifier_first_msg, prover_state).unwrap(); + + // TODO: hardcoding for testing purposes + let alpha = Fr::from_str("22").unwrap(); + let eta_b = Fr::from_str("22").unwrap(); + let eta_c = Fr::from_str("22").unwrap(); + let beta = Fr::from_str("22").unwrap(); + let delta_a = vec![Fr::from_str("22").unwrap()]; + let delta_b = vec![Fr::from_str("22").unwrap()]; + let delta_c = vec![Fr::from_str("22").unwrap()]; + let gamma = Fr::from_str("22").unwrap(); + let verifier_second_msg = verifier::SecondMessage:: { alpha, eta_b, eta_c }; + let (prover_third_message, third_oracles, prover_state) = + AHPForR1CS::<_, MM>::prover_third_round(&verifier_first_msg, &verifier_second_msg, prover_state, rng) + .unwrap(); + + let verifier_third_msg = verifier::ThirdMessage:: { beta }; + + let (prover_fourth_message, fourth_oracles, prover_state) = + AHPForR1CS::<_, MM>::prover_fourth_round(&verifier_second_msg, &verifier_third_msg, prover_state, rng) + .unwrap(); + + let verifier_fourth_msg = verifier::FourthMessage:: { delta_a, delta_b, delta_c }; + + let mut public_inputs = BTreeMap::new(); + let public_input = prover_state.public_inputs(&index_pk.circuit).unwrap(); + public_inputs.insert(index_pk.circuit.id, public_input); + let non_zero_a_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_a).unwrap(); + let non_zero_b_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_b).unwrap(); + let non_zero_c_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_c).unwrap(); + let variable_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_variables).unwrap(); + let constraint_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_constraints).unwrap(); + let input_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_public_inputs).unwrap(); + + let fifth_oracles = + AHPForR1CS::<_, MM>::prover_fifth_round(verifier_fourth_msg.clone(), prover_state, rng).unwrap(); + + use std::marker::PhantomData; + let mut circuit_specific_states = BTreeMap::new(); + let circuit_specific_state = verifier::CircuitSpecificState { + input_domain, + variable_domain, + constraint_domain, + non_zero_a_domain, + non_zero_b_domain, + non_zero_c_domain, + batch_size: 1, + }; + circuit_specific_states.insert(index_pk.circuit.id, circuit_specific_state); + let verifier_state = verifier::State { + circuit_specific_states, + max_constraint_domain: constraint_domain, + max_variable_domain: variable_domain, + max_non_zero_domain: non_zero_domain, // TODO: currently assuming same for three matrices but we should take the max + first_round_message: Some(verifier_first_msg), + second_round_message: Some(verifier_second_msg), + third_round_message: Some(verifier_third_msg), + fourth_round_message: Some(verifier_fourth_msg), + gamma: Some(gamma), + mode: PhantomData, + }; + + let polynomials: Vec<_> = index_pk + .circuit + .iter() + .chain(first_round_oracles.iter()) + .chain(second_oracles.iter()) + .chain(third_oracles.iter()) + .chain(fourth_oracles.iter()) + .chain(fifth_oracles.iter()) + .collect(); + + let lc_s = AHPForR1CS::<_, MM>::construct_linear_combinations( + &public_inputs, + &polynomials, + &prover_third_message, + &prover_fourth_message, + &verifier_state, + ) + .unwrap(); + // TODO: I can save space by using bytes instead of number characters, and allocating the right amount immediately let mut h_0 = String::new(); for coeff in second_oracles.h_0.coeffs() { diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs index 2e57a34de6..63fce90dba 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs @@ -227,8 +227,6 @@ impl AHPForR1CS { .zip_eq(x_polys) .enumerate() .map(|(_j, (w_poly, x_poly))| { - println!("w_poly: {:?}", w_poly); - println!("x_poly: {:?}", x_poly); let z_time = start_timer!(move || format!("Compute z poly for circuit {} {}", circuit.id, _j)); let mut assignment = w_poly.0.polynomial().as_dense().unwrap().mul_by_vanishing_poly(*input_domain); @@ -298,8 +296,20 @@ impl AHPForR1CS { // Instead of calculating L^C_col(κ)(c), we add val(k)*L^R_row(α) where we know L^C_col(k)(X) will be 1 let m_at_alpha_evals_time = start_timer!(|| format!("Compute m_at_alpha_evals parallel for {_label}")); let l_at_alpha = constraint_domain.evaluate_all_lagrange_coefficients(alpha); - let m_at_alpha_evals: Vec<_> = cfg_iter!(matrix_transpose) - .map(|col| col.iter().map(|(val, row_index)| *val * l_at_alpha[*row_index]).sum::()) + let constraint_domain_elements = constraint_domain.elements().collect_vec(); + let m_at_alpha_evals: Vec<_> = matrix_transpose + .iter() + .map(|col| { + col.iter() + .map(|(val, row_index)| { + println!( + "**{_label} val {:?} row_index {:?}, row(k) {:?}, l_at_alpha[*row_index] {}", + val, row_index, constraint_domain_elements[*row_index], l_at_alpha[*row_index] + ); + *val * l_at_alpha[*row_index] + }) + .sum::() + }) .collect(); end_timer!(m_at_alpha_evals_time); From a033500c2a16270d8023cb45723c3748e81615b7 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Wed, 13 Sep 2023 11:30:09 +0200 Subject: [PATCH 010/339] Move tests into src/snark/varuna/sage_test.rs --- .../round_functions/resources/h_0.test_vector | 1 - .../resources/test_rounds/h_0.test_vector | 0 .../ahp/prover/round_functions/first.rs | 44 --- .../ahp/prover/round_functions/second.rs | 265 ----------------- .../ahp/prover/round_functions/third.rs | 13 +- algorithms/src/snark/varuna/mod.rs | 3 + .../resources/challenges.input | 0 .../resources/inputs.txt} | 0 .../resources/instance.input | 0 .../resources/test_rounds/h_0.test_vector | 1 + algorithms/src/snark/varuna/sage_test.rs | 267 ++++++++++++++++++ 11 files changed, 272 insertions(+), 322 deletions(-) delete mode 100644 algorithms/src/snark/marlin/ahp/prover/round_functions/resources/h_0.test_vector delete mode 100644 algorithms/src/snark/marlin/ahp/prover/round_functions/resources/test_rounds/h_0.test_vector rename algorithms/src/snark/{marlin/ahp/prover/round_functions => varuna}/resources/challenges.input (100%) rename algorithms/src/snark/{marlin/ahp/prover/round_functions/resources/second.input => varuna/resources/inputs.txt} (100%) rename algorithms/src/snark/{marlin/ahp/prover/round_functions => varuna}/resources/instance.input (100%) create mode 100644 algorithms/src/snark/varuna/resources/test_rounds/h_0.test_vector create mode 100644 algorithms/src/snark/varuna/sage_test.rs diff --git a/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/h_0.test_vector b/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/h_0.test_vector deleted file mode 100644 index d439c491da..0000000000 --- a/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/h_0.test_vector +++ /dev/null @@ -1 +0,0 @@ -185915056196821536320156652343204727229282837292594912263041813413790128633338782286664390688677458447575662586331,116436695030533106638201415925398905964752267163498842797409034081983882550857533173419098227197733153495286551772,176724664172550839779291935285512872212018255755058301004848323584037179119227257149679920295405461288336468335461,4214851417732456422060319766109647918123064394298538595788822773835685084493111090055138992597379374654196449409,44134823005560246353212693330039045145438017273498486801562673680673891561668385836664416037039683563797591867592,78020517738058871512676400931019255780875357911533762287171501471212065916298075065863777895405900606867937990243,211751619601782024235615902270722907880979418973383889004153153941815351552217815474894072177092563874237900974217,153655852560612090010349545605213115481470771968999258060612155642223235354090966197568452239925752836635695245036,202848120220430692412653504810450093141252531381446689838379041178859519641454786778369457174554121167624887979349,32526265626185439178636804091467122800474386581026181563918618539503262502173225070548303803781671023436578752223,203171121093916756987859553767945578265459550649232105675184113129228384295974526445047563818751019115082066132743,232619671702156081272203798469092856680903790391162977758194567492361622488121455147176879851974945669114464341957,111737015146959471292871264133248840138608865402103502615250051664305168553474444668910665642999633731168782600005,135190128332101810222359743922415978967972512583942390126919080725822432901380455056055131533194879769361584258400,235416092328363403696666633563706869646069773659039376283006767934765474270134621191790482358563705454897682817729,196770562184018772765124541980340309238319913562501462322182844979008445479460810369366966120207441291373721956473,15067607251506590764593012999532188576952430337502695941848134497698211663403542907707693219447072455142228618654,153112970752348304711555303521770085058676635044498504670119841042682692992218557852917073653287078758016332389429,41814227831101358085552293725702577007475013206507922524665935684855910703075617006693673312094130919855250701816,46210991084261735369540176336785401926050146142894166239023429874075954137457537347356904190837289668357338775719,65180690410618316159590711520057790476043851474414048250779381848867867752191201309386944964137061678729666372404,163977009118008876397481104934488926280906125214947204954959058151586803233598126321208128615487240116914878196904,107624338781797786219187860500638557499388171469045256687296355903088482395585665425250192519275596854440282610214,249278217714096142452500317876751424994857427780886239832626112975678948442962872640287508716310677134212894568938,181780279468431650292509126375103899200476654250097243259416839008038007601340629888731244061317442925182706610387,101477487238140838785180196322359177562788001470768818963269623239161764677475077294532264035949163024995841987609,39500708497211819648234285504045618657265603080056578424958533523307249563842879645368409673300576347337870706810,153739957531959683383924916676932627445950033750065743904704677389935459403176230576033900786849178956111160811826,223220562335325081889062483683175560450893617533886304374883836450192638262516696830878199370240362358747909954755,16173397298172619673439254893062353729873219019949999568160504648515309262585249444067059165722662207679024557360,21450874001726492846898211206264300216915341709078105085545028008084995695202216674454445018623884229789170035958,176023918645459885893056702950382496785643061799980752861802280426759287774079671917213366819679107073634785367032,141156064975761261972387979397349112916628493984120918745308855740600589653942158984252371604924599380201292062753,117985392887425477742590999150088302896201095364458607112029508040768111857951066472685625314636280505311253831799,230107243375374908452761364989785887814278367793276099309661221113899558250145675927601161585708447621491556215967,78796787763801128117591163253860635255451381683420881796703382739940544536649834363719139773332907644812775008281,143627218725845932329677530061006905724693725855988419302025202338322845946940752381923065952823427005823043787786,64603060760821711315171263154882478847853516719474487827900650493518877444355646343079807944155612658187577959927,78116938648878032080007332589865471901175486321551311406025557293918830091691278983068596100092353228976709174430,184085108229869019331960428782583222831401177507356960872965287384901378631548116273615054935432708548350743088180,44785299482578491967585010882674306949680965891741233102605956907988629696758527736736059754465444338896453585808,145097838029239451391835088100783725562518034017266127945974256781989472772641684234423649414334123592706488266575,101524030183992525779753753921794380630502066877069971133736116751012103847060981189129951764838134542937546434077,244881762862854575711641155186443800920195224733867215803699296316089002051271957443112738533518687382672550717311,63812586515988693035735187671422934770569187132322932415570861417327039950760450669262452551991399755370023753389,24079352271903683627283889196219841254073124496529957738561900622051733860009343739727198474799877978196139275614,57876990818466035512748173250690721840310229339104932146878038113579881247204613699113613748555797091692341736991,158155705405577143693427638882754376170491837569367872250973517844400384478250306208098372896546409782745007064923,132225203099468279300283267273843403442146817430971521078145389992686592429117407112234495703272277324090901065205,107476600943010178512367340863188890521822931973209947077930911719969281943656719377403506433948301292654517183386,33357069108861986925052630007594108068928700320775254116983029930783500716054427496707951446805837678842611213467,243923660897860469008246690386790884915505967327163547470234520378323687675978216054016349746029469319117051063413,80312052487412555021525805460708579621866525814327662526931459702298144813611184836223736123629843302858174485036,159495338177353926779439712781919632013565418431974259244083584481356116842167744996910165746025212714032629374095,170717731837329726722809253216925419463082875512994122091272562636154471568569042260382104254949670731509031631921,23708894078899136632576739791915566419273581462739795245943604537002125079268582201442779131039767623114237677255,153713205976574946807239319360901394637407461724672689032762978582721187640366380615997605334576865778792114257843,6574088240663187039203523402469900172823554527578415081433323175286525096720388521227028107757639904916976195814,14754228682957576410561321346405080120918860924185445097283436524223405516860510123605649604288401214567500832338,101678517350598732060667272844483554496557367276389826354204188487356160224518036810167937032169105822234882316622,97603971509566353229593047894141977296587056826820850348365433658150459275198243424311636549986013034189103611293,255470768480835808807276021143407041393334114766470462142690645804891848651823595646477502365950909469138237940276,27193043914175513272998248763583127488929864632262266253900680795317712531862305574087921521449783081227536178240,84798407977218981826978375524482498358155715403944237429188064734277828732078769997282836930446711123176274239994,232563388983113636808128021183952194470646192940588838566899830914626566636997440230317305276654580023291449990750,29473803943250149783638618707613910340044689582376425151839683584045150040308180762445822012856985356169811005310,3851457732583529499205831128407556859323038441358736209844055779256032330721959907343062761086429981611760134997,85253125684067690753139330953046067054394099824194866161864580252357209824539980205386993880060316181284092483544,132747558363986229291203342314413085775343602565647451539507431829662667573172210931554179518639056711815723702972,56429146066298876274239208899061375321766373888108162948856070110900850344348129990303672007756586385380055069256,18389847780302989697053754885221096242782050782895222758354773834611723170856974033276822907355584916380449745309,64633389852263731647301714258555601347350566063981432234840623818057149232867377147958884486513371492089515180086,75736622923576807757985704311860603198341598438404359399594286668306746262287451198191476507096903455561351482036,47924938280440088416548644659316327884359798717944313850923257133970523112859003213198874987899307330395238059817,30970673039877340752800381124437887953653106796700147945813719870579691764473738585153661221633511881957227774658,232691551268889726098696328007030810640843263473764638787148074538127520434142025150874522514318581109013623000541,236299625590611434221083094078951434794514486290156394977269184814841136001182793052559660157183775344770566753232,41462222888125900535044807448273323269800220936314469913613912862346305555560868362353202225169702877115352724782,185078110694225639198314004460135875837158807042789126291613207370262334214375997017248946439551232954621009094053,49395242095584305343602128918845904700797431108259932958851501015970781799683259012781858179709497747821505986421,185746979644565076107063856749294998089482289970249417433494606438102246714927908602633175113194743917839606027282,108982585245233959834236880832639962546050091280853361023319172188852460682440554358501938750473587247463103714000,82531855419799361537265339827417729218359343459387541020429546192422997314513631480581442572753699916060172878983,151254953698390848847297635160714044752558223982278822713169709557356986494602923540873506098643238898828895367665,195376996759321231671403693308413507669863302926014294068924314329643040130885405298314814012573801978788448023544,126118991625778610443444798701194808076224440933304070742110154937968125027720747333834044478235064116496558584408,3616586306865760557901049769039373823195086472207081519266269348523126189808388070799575812414246646981160783840,121961773735012581936244409769325976683329183622110182740810012578890354544912357266239248364782675900934735125986,214004886139112306052448450825105960505775910842446241836230969512960604575675419720916815859675170651103954570836,234626563853479686872145380599114135076488450497131672483260093217855203917600820465251602910951536572788822851979,114282865050695189246910319811456064620377255173459118270134736391052986016688743497454169234069104949010582757700,34074160339996061543033379517540556095652803075169133409356794042613745003082194463602240796865159489901140224828,185559424087925994158070838579207461847896298482256584606887682837886581404948409761487073587888421863945372957230,180681831088182903464137350938370527659384146490353259796209770447722757491931730319958028052309997707654058812694,61735753056195236795757321586046205724767600724695564641350053902903145692989286231789191194923825282521902103651,53441948774328760880125063524609107984964353098802082130715244306715095604691809024231836385139218174260981218594,170284122303083169655069835955324932541435206383911157266648389414178934591222016410861819073146031809133930874818,190823746081505750261281589278120249993509616846595235929138844694564189095286207327653442333217119071839605059857,91158404196369577971006406030024111877525679881831338727004454936777420875782391422844227590946232996828312630514,103281300051902710504517682293222405228355314016335693452550733064571992272308695019941292994522781638815051734577,167955147421127584599567563206552789034765060029281187108531011275295420943827854529092838405880321812632018491530,127655903737432082742158565324441703784577651149163237949949572779619245001313837087603784563857049604930428861060,44479156420753265286265412591532760187998668820652872190414701540625447152786354613442203903898069943519244531972,113690439735543373221787839375330997492745614364541396117785297940492176583769522702277317429852573817575168280289,241860387345958859198444337813835064529923707262324798152313004885803099700917081903263830060034925987504816130841,116647215544507608361674235279543398627393612217149182330467230582207130183910792117273681040867783320208376713863,65963987516855463802696213540309911609203331370137256454823892075028666213734337311446537324956179549161833622991,102431656738040859399601084834731074531337501579908517996276678145384387798299818302912986612403013828018012073632,7346844916235481859575828592619095820495545897136340790762361967499847499288171642067296535456387460918670088534,100211581799177322713775640983089528699328681752531562130386046693959893487473652263780226546489250295191327961943,66152206339838705673694218248058536407695803789281561750363088831023062265348646642214382774748109044709025339207,189839544586713416053893036451331070068871333274563698228880192433095862667532368304283510773800113949068197032922,201556681139987697069942561413023740616001054018988669582339394004705308696351509556458718693878391046350429029216,183950790546985957805464675366716859391882655842690700294969212025530753044542961895793826525157337466309696530232,14837957230010736930762457560754776991812365678785643295115575415154774564484053274548787742984757963825697116864,218244459133980935539689064625395515290468223526350824317565060876083484629422104097577360316610723204154886112897,64476443322626109949784596791891753949592443505419620959762201760119896761436954548107585032587121096295216734331,204580679641620681607796530187415235020944206108981346445116819239090275631554028430776472593485776122736500627059,137791805662709562173467670240651537141114306604726872565242912347083779942690003998654987337338286224123290711621,116902015637296284454594656428864325872856259446214318588209296446862609663643358650203959046373867311301665823900,195929595625832041015072248546886474548832174777299183900446266229591218283163635570004970563403124513694096796982,114330352930988461123019776598136288053107421520716258590261232227447755224462335750938682089889594404578576419957,120738188399965705493618689540477953139699904141157650679534312105039764376730909182013462282286338297982646218248,195163452690082202590102106230937308021677963803618354626310513875073053344974056521780779368977099347556046751633,201525596052767211105650220583954732572769968237337993362962832933383261562205363993784303594352949597026962803631,100047244125089227039875872832747346758007419310301401032976423728787019401329691209266894347904604951167414143717,84366079422570471768609822461021004205092733471429482159625785785718082942301246470508514429963566876144155849624, diff --git a/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/test_rounds/h_0.test_vector b/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/test_rounds/h_0.test_vector deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/first.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/first.rs index 3462c339e8..43e243cbc6 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/first.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/first.rs @@ -161,47 +161,3 @@ impl AHPForR1CS { } pub type Witness = LabeledPolynomial; - -#[cfg(test)] -mod tests { - use super::*; - use crate::{ - snark::marlin::{MarlinHidingMode, MarlinSNARK, TestCircuit}, - traits::{algebraic_sponge::AlgebraicSponge, snark::SNARK}, - }; - use snarkvm_curves::bls12_377::{Bls12_377, Fq, Fr}; - use snarkvm_fields::{One, Zero}; - use snarkvm_utilities::Uniform; - use std::{borrow::Cow, collections::HashMap, ops::Deref}; - type FS = crate::crypto_hash::PoseidonSponge; - type MarlinSonicInst = MarlinSNARK; - - // TODO: make macros to use different hiding modes - #[test] - fn test_prover_first_round() { - let random_state = vec![3u64; 100]; - let rng = &mut snarkvm_utilities::rand::TestMockRng::fixed(random_state); - - let a = Fq::rand(rng); - println!("a: {:?}", a); - let a = Fq::rand(rng); - println!("a: {:?}", a); - - let max_degree = AHPForR1CS::::max_degree(100, 25, 300).unwrap(); - let universal_srs = MarlinSonicInst::universal_setup(max_degree).unwrap(); - let universal_prover = &universal_srs.to_universal_prover().unwrap(); - let universal_verifier = &universal_srs.to_universal_verifier().unwrap(); - let fs_parameters = FS::sample_parameters(); - let mul_depth = 1; - let num_constraints = 100; - let num_variables = 25; - let (circ, public_inputs) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); - let (index_pk, index_vk) = MarlinSonicInst::circuit_setup(&universal_srs, &circ).unwrap(); - let mut keys_to_constraints = BTreeMap::new(); - keys_to_constraints.insert(index_pk.circuit.deref(), std::slice::from_ref(&circ)); - - let prover_state = AHPForR1CS::<_, MarlinHidingMode>::init_prover(&keys_to_constraints, rng).unwrap(); - let state = AHPForR1CS::<_, MarlinHidingMode>::prover_first_round(prover_state, rng).unwrap(); - // TODO: checks on state. - } -} diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs index ba6644a692..7826a1cea7 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs @@ -25,7 +25,6 @@ use crate::{ }, }; use anyhow::Result; -use rand_core::RngCore; use snarkvm_fields::PrimeField; use snarkvm_utilities::{cfg_into_iter, cfg_iter_mut, cfg_reduce, ExecutionPool}; @@ -165,267 +164,3 @@ impl AHPForR1CS { poly } } - -#[cfg(test)] -mod tests { - use super::*; - use crate::{ - snark::marlin::{MarlinHidingMode, MarlinNonHidingMode, MarlinSNARK, TestCircuit}, - traits::{algebraic_sponge::AlgebraicSponge, snark::SNARK}, - }; - use snarkvm_curves::bls12_377::{Bls12_377, Fq, Fr}; - use snarkvm_fields::{One, Zero}; - use snarkvm_utilities::Uniform; - use std::{borrow::Cow, collections::HashMap, ops::Deref}; - type FS = crate::crypto_hash::PoseidonSponge; - type MM = MarlinNonHidingMode; - type MarlinSonicInst = MarlinSNARK; - use std::{fmt::Debug, fs, str::FromStr}; - - use std::{path::PathBuf, sync::Arc}; - - /// Returns the path to the `resources` folder for this module. - fn resources_path() -> PathBuf { - // Construct the path for the `resources` folder. - let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - path.push("src"); - path.push("snark"); - path.push("marlin"); - path.push("ahp"); - path.push("prover"); - path.push("round_functions"); - path.push("resources"); - - // Create the `resources` folder, if it does not exist. - if !path.exists() { - std::fs::create_dir_all(&path).unwrap_or_else(|_| panic!("Failed to create resources folder: {path:?}")); - } - // Output the path. - path - } - - /// Loads the given `test_folder/test_file` and asserts the given `candidate` matches the expected values. - #[track_caller] - fn assert_snapshot, S2: Into, C: Debug>(test_folder: S1, test_file: S2, candidate: C) { - // Construct the path for the test folder. - let mut path = resources_path(); - path.push(test_folder.into()); - - // Create the test folder, if it does not exist. - if !path.exists() { - std::fs::create_dir(&path).unwrap_or_else(|_| panic!("Failed to create test folder: {path:?}")); - } - - // Construct the path for the test file. - path.push(test_file.into()); - path.set_extension("test_vector"); - - // Create the test file, if it does not exist. - if !path.exists() { - std::fs::File::create(&path).unwrap_or_else(|_| panic!("Failed to create file: {path:?}")); - } - - // Assert the test file is equal to the expected value. - expect_test::expect_file![path].assert_eq(&format!("{candidate:?}")); - } - - // TODO: make macros to use different hiding modes - #[test] - fn test_prover_second_round() { - let second_path = "src/snark/marlin/ahp/prover/round_functions/resources/second.input"; - let test_vectors_file = fs::read_to_string(second_path).expect("Could not read the file"); - let mut test_vectors = Vec::new(); // TODO: preallocate - for line in test_vectors_file.lines() { - test_vectors.push(line.to_string()) - } - - let instance_path = "src/snark/marlin/ahp/prover/round_functions/resources/instance.input"; - let instance_file = fs::read_to_string(instance_path).expect("Could not read the file"); - let mut instance = Vec::new(); // TODO: preallocate - for line in instance_file.lines() { - instance.push(line.to_string()) - } - - let challenges_path = "src/snark/marlin/ahp/prover/round_functions/resources/challenges.input"; - let challenges_file = fs::read_to_string(challenges_path).expect("Could not read the file"); - let mut challenges = Vec::new(); // TODO: preallocate - for line in challenges_file.lines() { - challenges.push(line.to_string()) - } - let circuit_combiner = Fr::one(); - let instance_combiners = vec![Fr::one()]; - - // TODO: understand which data points we need. Starting with a and b in the TestCircuit - - use snarkvm_curves::bls12_377::FrParameters; - use snarkvm_fields::Fp256; - let mut random_state = vec![0u64; 100]; - let add_f_to_state = |s: &mut Vec, f: Fp256| { - // Fp384 field elements sample 6 u64 values in total - for i in 0..f.0 .0.len() { - s.push(f.0 .0[f.0 .0.len() - 1 - i]); - } - }; - for witness in instance[15].split(",") { - println!("witness: {}", witness.trim()); - if witness.trim() == "" { - continue; - } - add_f_to_state(&mut random_state, Fr::from_str(witness.trim()).unwrap()); - } - // let two = Fq::from_str("2").unwrap(); - // add_f_to_state(&mut random_state, 2u64); - // random_state.push(79601084644714804u64); - // random_state.push(11090443381845330384u64); - // random_state.push(17770411857874044427u64); - // random_state.push(4538334656037814244u64); - // random_state.push(11709709805437321058u64); - // random_state.push(404198066556501712u64); - - let rng = &mut snarkvm_utilities::rand::TestMockRng::fixed(random_state); - - // let test = Fq::from_str("8").unwrap(); - // println!("test: {:?}", test.0.0); - - // let a = Fq::rand(rng); - // println!("a: {:?}", a); - // println!("a: {:?}", a.0.0[0]); - // println!("a: {:?}", a.0.0[1]); - // println!("a: {:?}", a.0.0[2]); - // println!("a: {:?}", a.0.0[3]); - // println!("a: {:?}", a.0.0[4]); - // println!("a: {:?}", a.0.0[5]); - // let a = Fq::rand(rng); - // println!("a: {:?}", a); - - // NOTE: we can tell based on fn inner_product, that the public variables come first. Our goal is to get the right values into: - // padded_public_variables: [1, 121902002256018526321273757023754328318276501290347840063579141932923540131] - // private_variables: [7637532484706255996016764771999758676172095851412507196353554567622637938911, 8436595930774912737517092455800659045000222630657145426921353293889876675680, 7637532484706255996016764771999758676172095851412507196353554567622637938911, 7637532484706255996016764771999758676172095851412507196353554567622637938911] - - let max_degree = AHPForR1CS::::max_degree(100, 25, 300).unwrap(); - let universal_srs = MarlinSonicInst::universal_setup(max_degree).unwrap(); - let mul_depth = 3; - let num_constraints = 7; - let num_variables = 7; - // TODO: pass the right randomness in - let (circ, public_inputs) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); - println!("public_inputs: {:?}", public_inputs); - println!("circ: {:?}", circ); - let (index_pk, _index_vk) = MarlinSonicInst::circuit_setup(&universal_srs, &circ).unwrap(); - let mut keys_to_constraints = BTreeMap::new(); - keys_to_constraints.insert(index_pk.circuit.deref(), std::slice::from_ref(&circ)); - - let prover_state = AHPForR1CS::<_, MM>::init_prover(&keys_to_constraints, rng).unwrap(); - let prover_state = AHPForR1CS::<_, MM>::prover_first_round(prover_state, rng).unwrap(); - let first_round_oracles = Arc::clone(prover_state.first_round_oracles.as_ref().unwrap()); - - let assignments = AHPForR1CS::<_, MM>::calculate_assignments(&prover_state).unwrap(); - let constraint_domain = EvaluationDomain::::new(num_constraints).unwrap(); - println!("assignments: {:?}", assignments); - println!("generator of H: {:?}", constraint_domain.group_gen); - for el in constraint_domain.elements() { - println!("element of H: {:?}", el); - } - let non_zero_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_a).unwrap(); - println!("generator of K: {:?}", non_zero_domain.group_gen); - for el in non_zero_domain.elements() { - println!("element of K: {:?}", el); - } - - let combiners = verifier::BatchCombiners:: { circuit_combiner, instance_combiners }; - let batch_combiners = BTreeMap::from_iter([(index_pk.circuit.id, combiners)]); - let verifier_first_msg = verifier::FirstMessage:: { batch_combiners }; - let (second_oracles, prover_state) = - AHPForR1CS::<_, MM>::prover_second_round(&verifier_first_msg, prover_state).unwrap(); - - // TODO: hardcoding for testing purposes - let alpha = Fr::from_str("22").unwrap(); - let eta_b = Fr::from_str("22").unwrap(); - let eta_c = Fr::from_str("22").unwrap(); - let beta = Fr::from_str("22").unwrap(); - let delta_a = vec![Fr::from_str("22").unwrap()]; - let delta_b = vec![Fr::from_str("22").unwrap()]; - let delta_c = vec![Fr::from_str("22").unwrap()]; - let gamma = Fr::from_str("22").unwrap(); - let verifier_second_msg = verifier::SecondMessage:: { alpha, eta_b, eta_c }; - let (prover_third_message, third_oracles, prover_state) = - AHPForR1CS::<_, MM>::prover_third_round(&verifier_first_msg, &verifier_second_msg, prover_state, rng) - .unwrap(); - - let verifier_third_msg = verifier::ThirdMessage:: { beta }; - - let (prover_fourth_message, fourth_oracles, prover_state) = - AHPForR1CS::<_, MM>::prover_fourth_round(&verifier_second_msg, &verifier_third_msg, prover_state, rng) - .unwrap(); - - let verifier_fourth_msg = verifier::FourthMessage:: { delta_a, delta_b, delta_c }; - - let mut public_inputs = BTreeMap::new(); - let public_input = prover_state.public_inputs(&index_pk.circuit).unwrap(); - public_inputs.insert(index_pk.circuit.id, public_input); - let non_zero_a_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_a).unwrap(); - let non_zero_b_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_b).unwrap(); - let non_zero_c_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_c).unwrap(); - let variable_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_variables).unwrap(); - let constraint_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_constraints).unwrap(); - let input_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_public_inputs).unwrap(); - - let fifth_oracles = - AHPForR1CS::<_, MM>::prover_fifth_round(verifier_fourth_msg.clone(), prover_state, rng).unwrap(); - - use std::marker::PhantomData; - let mut circuit_specific_states = BTreeMap::new(); - let circuit_specific_state = verifier::CircuitSpecificState { - input_domain, - variable_domain, - constraint_domain, - non_zero_a_domain, - non_zero_b_domain, - non_zero_c_domain, - batch_size: 1, - }; - circuit_specific_states.insert(index_pk.circuit.id, circuit_specific_state); - let verifier_state = verifier::State { - circuit_specific_states, - max_constraint_domain: constraint_domain, - max_variable_domain: variable_domain, - max_non_zero_domain: non_zero_domain, // TODO: currently assuming same for three matrices but we should take the max - first_round_message: Some(verifier_first_msg), - second_round_message: Some(verifier_second_msg), - third_round_message: Some(verifier_third_msg), - fourth_round_message: Some(verifier_fourth_msg), - gamma: Some(gamma), - mode: PhantomData, - }; - - let polynomials: Vec<_> = index_pk - .circuit - .iter() - .chain(first_round_oracles.iter()) - .chain(second_oracles.iter()) - .chain(third_oracles.iter()) - .chain(fourth_oracles.iter()) - .chain(fifth_oracles.iter()) - .collect(); - - let lc_s = AHPForR1CS::<_, MM>::construct_linear_combinations( - &public_inputs, - &polynomials, - &prover_third_message, - &prover_fourth_message, - &verifier_state, - ) - .unwrap(); - - // TODO: I can save space by using bytes instead of number characters, and allocating the right amount immediately - let mut h_0 = String::new(); - for coeff in second_oracles.h_0.coeffs() { - println!("adding coeff: {}", coeff.1.to_string()); - h_0 += &coeff.1.to_string(); - h_0 += ","; - } - assert_snapshot("test_rounds", "h_0", h_0); - - // TODO: checks on state. - } -} diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs index 63fce90dba..e986e8d7fc 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs @@ -296,20 +296,9 @@ impl AHPForR1CS { // Instead of calculating L^C_col(κ)(c), we add val(k)*L^R_row(α) where we know L^C_col(k)(X) will be 1 let m_at_alpha_evals_time = start_timer!(|| format!("Compute m_at_alpha_evals parallel for {_label}")); let l_at_alpha = constraint_domain.evaluate_all_lagrange_coefficients(alpha); - let constraint_domain_elements = constraint_domain.elements().collect_vec(); let m_at_alpha_evals: Vec<_> = matrix_transpose .iter() - .map(|col| { - col.iter() - .map(|(val, row_index)| { - println!( - "**{_label} val {:?} row_index {:?}, row(k) {:?}, l_at_alpha[*row_index] {}", - val, row_index, constraint_domain_elements[*row_index], l_at_alpha[*row_index] - ); - *val * l_at_alpha[*row_index] - }) - .sum::() - }) + .map(|col| col.iter().map(|(val, row_index)| *val * l_at_alpha[*row_index]).sum::()) .collect(); end_timer!(m_at_alpha_evals_time); diff --git a/algorithms/src/snark/varuna/mod.rs b/algorithms/src/snark/varuna/mod.rs index 0e16caae80..b59a52921d 100644 --- a/algorithms/src/snark/varuna/mod.rs +++ b/algorithms/src/snark/varuna/mod.rs @@ -29,3 +29,6 @@ pub use mode::*; #[cfg(test)] pub mod tests; + +#[cfg(test)] +pub mod sage_test; diff --git a/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/challenges.input b/algorithms/src/snark/varuna/resources/challenges.input similarity index 100% rename from algorithms/src/snark/marlin/ahp/prover/round_functions/resources/challenges.input rename to algorithms/src/snark/varuna/resources/challenges.input diff --git a/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/second.input b/algorithms/src/snark/varuna/resources/inputs.txt similarity index 100% rename from algorithms/src/snark/marlin/ahp/prover/round_functions/resources/second.input rename to algorithms/src/snark/varuna/resources/inputs.txt diff --git a/algorithms/src/snark/marlin/ahp/prover/round_functions/resources/instance.input b/algorithms/src/snark/varuna/resources/instance.input similarity index 100% rename from algorithms/src/snark/marlin/ahp/prover/round_functions/resources/instance.input rename to algorithms/src/snark/varuna/resources/instance.input diff --git a/algorithms/src/snark/varuna/resources/test_rounds/h_0.test_vector b/algorithms/src/snark/varuna/resources/test_rounds/h_0.test_vector new file mode 100644 index 0000000000..85ad4e8fb6 --- /dev/null +++ b/algorithms/src/snark/varuna/resources/test_rounds/h_0.test_vector @@ -0,0 +1 @@ +"7388904030749824121217721821433853214953911918259805849443329273927733084164,2135176220032946734943829824459106118384054561849250372330716048683975588842,4754990573109988415472033418479071784044875994712276662893248150540227089791,2758334532884618923758430413601802477377254380601541511107093225976782776983,8095203738994452079955122826479915970380729551727226719303332837983196321727,6177424990788360784192413675740409023496996883035955845846493361503576983134,5094286905430846656542049153180259645877255793223574061499131126611824661186," \ No newline at end of file diff --git a/algorithms/src/snark/varuna/sage_test.rs b/algorithms/src/snark/varuna/sage_test.rs new file mode 100644 index 0000000000..c74a13bbc1 --- /dev/null +++ b/algorithms/src/snark/varuna/sage_test.rs @@ -0,0 +1,267 @@ +// Copyright (C) 2019-2023 Aleo Systems Inc. +// This file is part of the snarkVM library. + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#[cfg(test)] +mod tests { + use crate::{ + snark::marlin::{ahp::verifier, MarlinNonHidingMode, MarlinSNARK, TestCircuit}, + traits::snark::SNARK, + }; + use snarkvm_curves::bls12_377::{Bls12_377, Fq, Fr}; + use snarkvm_fields::One; + use std::ops::Deref; + type FS = crate::crypto_hash::PoseidonSponge; + type MM = MarlinNonHidingMode; + type MarlinSonicInst = MarlinSNARK; + use crate::snark::marlin::AHPForR1CS; + use std::{fmt::Debug, fs, str::FromStr}; + + use crate::fft::EvaluationDomain; + use std::{collections::BTreeMap, path::PathBuf, sync::Arc}; + + /// Returns the path to the `resources` folder for this module. + fn resources_path() -> PathBuf { + // Construct the path for the `resources` folder. + let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + path.push("src"); + path.push("snark"); + path.push("marlin"); + path.push("resources"); + + // Create the `resources` folder, if it does not exist. + if !path.exists() { + std::fs::create_dir_all(&path).unwrap_or_else(|_| panic!("Failed to create resources folder: {path:?}")); + } + // Output the path. + path + } + + /// Loads the given `test_folder/test_file` and asserts the given `candidate` matches the expected values. + #[track_caller] + fn assert_snapshot, S2: Into, C: Debug>(test_folder: S1, test_file: S2, candidate: C) { + // Construct the path for the test folder. + let mut path = resources_path(); + path.push(test_folder.into()); + + // Create the test folder, if it does not exist. + if !path.exists() { + std::fs::create_dir(&path).unwrap_or_else(|_| panic!("Failed to create test folder: {path:?}")); + } + + // Construct the path for the test file. + path.push(test_file.into()); + path.set_extension("test_vector"); + + // Create the test file, if it does not exist. + if !path.exists() { + std::fs::File::create(&path).unwrap_or_else(|_| panic!("Failed to create file: {path:?}")); + } + + // Assert the test file is equal to the expected value. + expect_test::expect_file![path].assert_eq(&format!("{candidate:?}")); + } + + // TODO: make macros to use different hiding modes + #[test] + fn test_prover_sage_vectors() { + let input_path = "src/snark/marlin/resources/inputs.txt"; + let test_vectors_file = fs::read_to_string(input_path).expect("Could not read the file"); + let mut test_vectors = Vec::new(); // TODO: preallocate + for line in test_vectors_file.lines() { + test_vectors.push(line.to_string()) + } + + let instance_path = "src/snark/marlin/resources/instance.input"; + let instance_file = fs::read_to_string(instance_path).expect("Could not read the file"); + let mut instance = Vec::new(); // TODO: preallocate + for line in instance_file.lines() { + instance.push(line.to_string()) + } + + let challenges_path = "src/snark/marlin/resources/challenges.input"; + let challenges_file = fs::read_to_string(challenges_path).expect("Could not read the file"); + let mut challenges = Vec::new(); // TODO: preallocate + for line in challenges_file.lines() { + challenges.push(line.to_string()) + } + let circuit_combiner = Fr::one(); + let instance_combiners = vec![Fr::one()]; + + use snarkvm_curves::bls12_377::FrParameters; + use snarkvm_fields::Fp256; + let mut random_state = vec![0u64; 100]; + let add_f_to_state = |s: &mut Vec, f: Fp256| { + // Fp384 field elements sample 6 u64 values in total + for i in 0..f.0.0.len() { + s.push(f.0.0[f.0.0.len() - 1 - i]); + } + }; + for witness in instance[15].split(",") { + println!("witness: {}", witness.trim()); + if witness.trim() == "" { + continue; + } + add_f_to_state(&mut random_state, Fr::from_str(witness.trim()).unwrap()); + } + // let two = Fq::from_str("2").unwrap(); + // add_f_to_state(&mut random_state, 2u64); + // random_state.push(79601084644714804u64); + // random_state.push(11090443381845330384u64); + // random_state.push(17770411857874044427u64); + // random_state.push(4538334656037814244u64); + // random_state.push(11709709805437321058u64); + // random_state.push(404198066556501712u64); + + let rng = &mut snarkvm_utilities::rand::TestMockRng::fixed(random_state); + + // let test = Fq::from_str("8").unwrap(); + // println!("test: {:?}", test.0.0); + + // let a = Fq::rand(rng); + // println!("a: {:?}", a); + // println!("a: {:?}", a.0.0[0]); + // println!("a: {:?}", a.0.0[1]); + // println!("a: {:?}", a.0.0[2]); + // println!("a: {:?}", a.0.0[3]); + // println!("a: {:?}", a.0.0[4]); + // println!("a: {:?}", a.0.0[5]); + // let a = Fq::rand(rng); + // println!("a: {:?}", a); + + let max_degree = AHPForR1CS::::max_degree(100, 25, 300).unwrap(); + let universal_srs = MarlinSonicInst::universal_setup(max_degree).unwrap(); + let mul_depth = 3; + let num_constraints = 7; + let num_variables = 7; + // TODO: pass the right randomness in + let (circ, public_inputs) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); + println!("public_inputs: {:?}", public_inputs); + println!("circ: {:?}", circ); + let (index_pk, _index_vk) = MarlinSonicInst::circuit_setup(&universal_srs, &circ).unwrap(); + let mut keys_to_constraints = BTreeMap::new(); + keys_to_constraints.insert(index_pk.circuit.deref(), std::slice::from_ref(&circ)); + + let prover_state = AHPForR1CS::<_, MM>::init_prover(&keys_to_constraints, rng).unwrap(); + let prover_state = AHPForR1CS::<_, MM>::prover_first_round(prover_state, rng).unwrap(); + let first_round_oracles = Arc::clone(prover_state.first_round_oracles.as_ref().unwrap()); + + let assignments = AHPForR1CS::<_, MM>::calculate_assignments(&prover_state).unwrap(); + let constraint_domain = EvaluationDomain::::new(num_constraints).unwrap(); + println!("assignments: {:?}", assignments); + println!("generator of H: {:?}", constraint_domain.group_gen); + for el in constraint_domain.elements() { + println!("element of H: {:?}", el); + } + let non_zero_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_a).unwrap(); + println!("generator of K: {:?}", non_zero_domain.group_gen); + for el in non_zero_domain.elements() { + println!("element of K: {:?}", el); + } + + let combiners = verifier::BatchCombiners:: { circuit_combiner, instance_combiners }; + let batch_combiners = BTreeMap::from_iter([(index_pk.circuit.id, combiners)]); + let verifier_first_msg = verifier::FirstMessage:: { batch_combiners }; + let (second_oracles, prover_state) = + AHPForR1CS::<_, MM>::prover_second_round(&verifier_first_msg, prover_state).unwrap(); + + // TODO: hardcoding for testing purposes + let alpha = Fr::from_str("22").unwrap(); + let eta_b = Fr::from_str("22").unwrap(); + let eta_c = Fr::from_str("22").unwrap(); + let beta = Fr::from_str("22").unwrap(); + let delta_a = vec![Fr::from_str("22").unwrap()]; + let delta_b = vec![Fr::from_str("22").unwrap()]; + let delta_c = vec![Fr::from_str("22").unwrap()]; + let gamma = Fr::from_str("22").unwrap(); + let verifier_second_msg = verifier::SecondMessage:: { alpha, eta_b, eta_c }; + let (prover_third_message, third_oracles, prover_state) = + AHPForR1CS::<_, MM>::prover_third_round(&verifier_first_msg, &verifier_second_msg, prover_state, rng) + .unwrap(); + + let verifier_third_msg = verifier::ThirdMessage:: { beta }; + + let (prover_fourth_message, fourth_oracles, prover_state) = + AHPForR1CS::<_, MM>::prover_fourth_round(&verifier_second_msg, &verifier_third_msg, prover_state, rng) + .unwrap(); + + let verifier_fourth_msg = verifier::FourthMessage:: { delta_a, delta_b, delta_c }; + + let mut public_inputs = BTreeMap::new(); + let public_input = prover_state.public_inputs(&index_pk.circuit).unwrap(); + public_inputs.insert(index_pk.circuit.id, public_input); + let non_zero_a_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_a).unwrap(); + let non_zero_b_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_b).unwrap(); + let non_zero_c_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_c).unwrap(); + let variable_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_variables).unwrap(); + let constraint_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_constraints).unwrap(); + let input_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_public_inputs).unwrap(); + + let fifth_oracles = + AHPForR1CS::<_, MM>::prover_fifth_round(verifier_fourth_msg.clone(), prover_state, rng).unwrap(); + + use std::marker::PhantomData; + let mut circuit_specific_states = BTreeMap::new(); + let circuit_specific_state = verifier::CircuitSpecificState { + input_domain, + variable_domain, + constraint_domain, + non_zero_a_domain, + non_zero_b_domain, + non_zero_c_domain, + batch_size: 1, + }; + circuit_specific_states.insert(index_pk.circuit.id, circuit_specific_state); + let verifier_state = verifier::State { + circuit_specific_states, + max_constraint_domain: constraint_domain, + max_variable_domain: variable_domain, + max_non_zero_domain: non_zero_domain, // TODO: currently assuming same for three matrices but we should take the max + first_round_message: Some(verifier_first_msg), + second_round_message: Some(verifier_second_msg), + third_round_message: Some(verifier_third_msg), + fourth_round_message: Some(verifier_fourth_msg), + gamma: Some(gamma), + mode: PhantomData, + }; + + let polynomials: Vec<_> = index_pk + .circuit + .iter() + .chain(first_round_oracles.iter()) + .chain(second_oracles.iter()) + .chain(third_oracles.iter()) + .chain(fourth_oracles.iter()) + .chain(fifth_oracles.iter()) + .collect(); + + let lc_s = AHPForR1CS::<_, MM>::construct_linear_combinations( + &public_inputs, + &polynomials, + &prover_third_message, + &prover_fourth_message, + &verifier_state, + ) + .unwrap(); + + // TODO: I can save space by using bytes instead of number characters, and allocating the right amount immediately + let mut h_0 = String::new(); + for coeff in second_oracles.h_0.coeffs() { + h_0 += &coeff.1.to_string(); + h_0 += ","; + } + assert_snapshot("test_rounds", "h_0", h_0); + + // TODO: check all oracles + } +} From b83a3652edec10d174628793310ea2d7878ad474 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Wed, 13 Sep 2023 11:41:00 +0200 Subject: [PATCH 011/339] update to varuna --- .../resources/test_rounds/h_0.test_vector | 1 - algorithms/src/snark/varuna/sage_test.rs | 22 +++++++++---------- utilities/src/rand.rs | 4 ---- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/algorithms/src/snark/varuna/resources/test_rounds/h_0.test_vector b/algorithms/src/snark/varuna/resources/test_rounds/h_0.test_vector index 85ad4e8fb6..e69de29bb2 100644 --- a/algorithms/src/snark/varuna/resources/test_rounds/h_0.test_vector +++ b/algorithms/src/snark/varuna/resources/test_rounds/h_0.test_vector @@ -1 +0,0 @@ -"7388904030749824121217721821433853214953911918259805849443329273927733084164,2135176220032946734943829824459106118384054561849250372330716048683975588842,4754990573109988415472033418479071784044875994712276662893248150540227089791,2758334532884618923758430413601802477377254380601541511107093225976782776983,8095203738994452079955122826479915970380729551727226719303332837983196321727,6177424990788360784192413675740409023496996883035955845846493361503576983134,5094286905430846656542049153180259645877255793223574061499131126611824661186," \ No newline at end of file diff --git a/algorithms/src/snark/varuna/sage_test.rs b/algorithms/src/snark/varuna/sage_test.rs index c74a13bbc1..3ac4738925 100644 --- a/algorithms/src/snark/varuna/sage_test.rs +++ b/algorithms/src/snark/varuna/sage_test.rs @@ -15,16 +15,16 @@ #[cfg(test)] mod tests { use crate::{ - snark::marlin::{ahp::verifier, MarlinNonHidingMode, MarlinSNARK, TestCircuit}, + snark::varuna::{ahp::verifier, TestCircuit, VarunaNonHidingMode, VarunaSNARK}, traits::snark::SNARK, }; use snarkvm_curves::bls12_377::{Bls12_377, Fq, Fr}; use snarkvm_fields::One; use std::ops::Deref; type FS = crate::crypto_hash::PoseidonSponge; - type MM = MarlinNonHidingMode; - type MarlinSonicInst = MarlinSNARK; - use crate::snark::marlin::AHPForR1CS; + type MM = VarunaNonHidingMode; + type VarunaSonicInst = VarunaSNARK; + use crate::snark::varuna::AHPForR1CS; use std::{fmt::Debug, fs, str::FromStr}; use crate::fft::EvaluationDomain; @@ -36,7 +36,7 @@ mod tests { let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); path.push("src"); path.push("snark"); - path.push("marlin"); + path.push("varuna"); path.push("resources"); // Create the `resources` folder, if it does not exist. @@ -75,21 +75,21 @@ mod tests { // TODO: make macros to use different hiding modes #[test] fn test_prover_sage_vectors() { - let input_path = "src/snark/marlin/resources/inputs.txt"; + let input_path = "src/snark/varuna/resources/inputs.txt"; let test_vectors_file = fs::read_to_string(input_path).expect("Could not read the file"); let mut test_vectors = Vec::new(); // TODO: preallocate for line in test_vectors_file.lines() { test_vectors.push(line.to_string()) } - let instance_path = "src/snark/marlin/resources/instance.input"; + let instance_path = "src/snark/varuna/resources/instance.input"; let instance_file = fs::read_to_string(instance_path).expect("Could not read the file"); let mut instance = Vec::new(); // TODO: preallocate for line in instance_file.lines() { instance.push(line.to_string()) } - let challenges_path = "src/snark/marlin/resources/challenges.input"; + let challenges_path = "src/snark/varuna/resources/challenges.input"; let challenges_file = fs::read_to_string(challenges_path).expect("Could not read the file"); let mut challenges = Vec::new(); // TODO: preallocate for line in challenges_file.lines() { @@ -140,7 +140,7 @@ mod tests { // println!("a: {:?}", a); let max_degree = AHPForR1CS::::max_degree(100, 25, 300).unwrap(); - let universal_srs = MarlinSonicInst::universal_setup(max_degree).unwrap(); + let universal_srs = VarunaSonicInst::universal_setup(max_degree).unwrap(); let mul_depth = 3; let num_constraints = 7; let num_variables = 7; @@ -148,7 +148,7 @@ mod tests { let (circ, public_inputs) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); println!("public_inputs: {:?}", public_inputs); println!("circ: {:?}", circ); - let (index_pk, _index_vk) = MarlinSonicInst::circuit_setup(&universal_srs, &circ).unwrap(); + let (index_pk, _index_vk) = VarunaSonicInst::circuit_setup(&universal_srs, &circ).unwrap(); let mut keys_to_constraints = BTreeMap::new(); keys_to_constraints.insert(index_pk.circuit.deref(), std::slice::from_ref(&circ)); @@ -245,7 +245,7 @@ mod tests { .chain(fifth_oracles.iter()) .collect(); - let lc_s = AHPForR1CS::<_, MM>::construct_linear_combinations( + let _lc_s = AHPForR1CS::<_, MM>::construct_linear_combinations( &public_inputs, &polynomials, &prover_third_message, diff --git a/utilities/src/rand.rs b/utilities/src/rand.rs index e30e1f8ee5..40da515cb9 100644 --- a/utilities/src/rand.rs +++ b/utilities/src/rand.rs @@ -154,24 +154,20 @@ impl TestMockRng { impl rand::RngCore for TestMockRng { fn next_u32(&mut self) -> u32 { - println!("next_u32"); self.state.pop().unwrap() as u32 } fn next_u64(&mut self) -> u64 { - println!("next_u64"); self.state.pop().unwrap() } fn fill_bytes(&mut self, dest: &mut [u8]) { - println!("fill_bytes: {:?}", dest.len()); for i in 0..dest.len() { dest[i] = self.state.pop().unwrap() as u8; } } fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand::Error> { - println!("try_fill_bytes: {:?}", dest.len()); for i in 0..dest.len() { dest[i] = self.state.pop().unwrap() as u8; // TODO: use try_from and convert the Error } From a210af86b38e8a4827be41607c7bb8c0a03d9822 Mon Sep 17 00:00:00 2001 From: Michael Turner Date: Thu, 21 Sep 2023 15:21:07 +0100 Subject: [PATCH 012/339] Add test vectors for the remaining round polynomial oracles --- .../src/snark/varuna/ahp/prover/oracles.rs | 4 +- .../varuna/resources/constraint_domain.txt | 2 + .../snark/varuna/resources/non_zero_domain | 2 + .../snark/varuna/resources/padded_inputs.txt | 0 .../snark/varuna/resources/raw_messages.txt | 308 ++++++++++++++++++ .../1st/first_round_oracles.test_vectors | 1 + .../resources/test_rounds/2nd/h_0.test_vector | 1 + .../resources/test_rounds/3rd/g_1.test_vector | 1 + .../resources/test_rounds/3rd/h_1.test_vector | 1 + .../4th/circuit_polynomials.test_vector | 3 + .../varuna/resources/test_rounds/5th/h_1 | 1 + algorithms/src/snark/varuna/sage_test.rs | 33 ++ 12 files changed, 355 insertions(+), 2 deletions(-) create mode 100644 algorithms/src/snark/varuna/resources/constraint_domain.txt create mode 100644 algorithms/src/snark/varuna/resources/non_zero_domain create mode 100644 algorithms/src/snark/varuna/resources/padded_inputs.txt create mode 100644 algorithms/src/snark/varuna/resources/raw_messages.txt create mode 100644 algorithms/src/snark/varuna/resources/test_rounds/1st/first_round_oracles.test_vectors create mode 100644 algorithms/src/snark/varuna/resources/test_rounds/2nd/h_0.test_vector create mode 100644 algorithms/src/snark/varuna/resources/test_rounds/3rd/g_1.test_vector create mode 100644 algorithms/src/snark/varuna/resources/test_rounds/3rd/h_1.test_vector create mode 100644 algorithms/src/snark/varuna/resources/test_rounds/4th/circuit_polynomials.test_vector create mode 100644 algorithms/src/snark/varuna/resources/test_rounds/5th/h_1 diff --git a/algorithms/src/snark/varuna/ahp/prover/oracles.rs b/algorithms/src/snark/varuna/ahp/prover/oracles.rs index b4b645346c..73a52125ca 100644 --- a/algorithms/src/snark/varuna/ahp/prover/oracles.rs +++ b/algorithms/src/snark/varuna/ahp/prover/oracles.rs @@ -112,11 +112,11 @@ impl ThirdOracles { /// The fourth set of prover oracles. #[derive(Debug)] pub struct FourthOracles { - pub(super) gs: BTreeMap>, + pub gs: BTreeMap>, } #[derive(Debug)] -pub(super) struct MatrixGs { +pub struct MatrixGs { /// The polynomial `g_a` resulting from the second sumcheck. pub(super) g_a: LabeledPolynomial, /// The polynomial `g_b` resulting from the second sumcheck. diff --git a/algorithms/src/snark/varuna/resources/constraint_domain.txt b/algorithms/src/snark/varuna/resources/constraint_domain.txt new file mode 100644 index 0000000000..3ec6afc5da --- /dev/null +++ b/algorithms/src/snark/varuna/resources/constraint_domain.txt @@ -0,0 +1,2 @@ +"generator": "3279917132858342911831074864712036382710139745724269329239664300762234227201", +"domain": "1, 3279917132858342911831074864712036382710139745724269329239664300762234227201, 880904806456922042258150504921383618666682042621506879489, 1973030855696769125460623085327505793054673234941098473458474059731617992635, 8444461749428370424248824938781546531375899335154063827935233455917409239040, 5164544616570027512417750074069510148665759589429794498695569155155175011840, 8444461749428370423367920132324624489117748830232680209268551413295902359552, 6471430893731601298788201853454040738321226100212965354476759396185791246406 diff --git a/algorithms/src/snark/varuna/resources/non_zero_domain b/algorithms/src/snark/varuna/resources/non_zero_domain new file mode 100644 index 0000000000..654d3adb97 --- /dev/null +++ b/algorithms/src/snark/varuna/resources/non_zero_domain @@ -0,0 +1,2 @@ +"generator": "3279917132858342911831074864712036382710139745724269329239664300762234227201" +"domain": "3279917132858342911831074864712036382710139745724269329239664300762234227201, 880904806456922042258150504921383618666682042621506879489, "1973030855696769125460623085327505793054673234941098473458474059731617992635, 8444461749428370424248824938781546531375899335154063827935233455917409239040, 5164544616570027512417750074069510148665759589429794498695569155155175011840, 8444461749428370423367920132324624489117748830232680209268551413295902359552, 6471430893731601298788201853454040738321226100212965354476759396185791246406" diff --git a/algorithms/src/snark/varuna/resources/padded_inputs.txt b/algorithms/src/snark/varuna/resources/padded_inputs.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/algorithms/src/snark/varuna/resources/raw_messages.txt b/algorithms/src/snark/varuna/resources/raw_messages.txt new file mode 100644 index 0000000000..0208e2c6c5 --- /dev/null +++ b/algorithms/src/snark/varuna/resources/raw_messages.txt @@ -0,0 +1,308 @@ +witness: 4 +witness: 2 +a: 2 +b: 4 +public_inputs: [8, 32, 128] +circ: TestCircuit { num_constraints: 7, num_variables: 7, mul_depth: 3 } +adding mul_constraint 0 +adding mul_constraint 1 +Number of padded public variables: 4 +Number of private variables: 3 +Number of num_constraints: 7 +Number of non-zero entries in A: 7 +Number of non-zero entries in B: 7 +Number of non-zero entries in C: 7 +a: [[(1, 4)], [(1, 4)], [(1, 4)], [(1, 4)], [(1, 4)], [(1, 1)], [(1, 2)]] +b: [[(1, 5)], [(1, 5)], [(1, 5)], [(1, 5)], [(1, 5)], [(1, 5)], [(1, 5)]] +c: [[(1, 1)], [(1, 1)], [(1, 1)], [(1, 1)], [(1, 1)], [(1, 2)], [(1, 3)]] +adding mul_constraint 0 +adding mul_constraint 1 +Number of padded public variables in Prover::Init: 4 +Number of private variables: 3 +Number of constraints: 7 +Number of non-zero entries in A: 7 +Number of non-zero entries in B: 7 +Number of non-zero entries in C: 7 +padded_public_variables: [1, 8, 32, 128] +private_variables: [2, 4, 2] +assignments: {CircuitId([7, 113, 127, 205, 235, 165, 67, 186, 47, 174, 200, 48, 10, 233, 43, 43, 209, 92, 104, 236, 207, 81, 157, 53, 13, 162, 203, 180, 134, 91, 219, 194]): [ +7388904030749824121217721821433853214953911918259805849443329273927733084183 + +1526714589606467466391344016540892391783149951641393550856111034910514543371 * x + +7388904030749824121217721821433853214953911918259805849443329273927733084148 * x^2 + +2180157728187254333149425712525496418866368059391470418746244876780616275984 * x^3 + +7388904030749824121217721821433853214953911918259805849443329273927733084181 * x^4 + +4806631722464810378222418881252928774493289697365662880095775335672748770572 * x^5 + +7388904030749824121217721821433853214953911918259805849443329273927733084148 * x^6 + +4153188583884023458610048797853002211921041294332568892204718936512234268619 * x^7]} +generator of H: 3279917132858342911831074864712036382710139745724269329239664300762234227201 +element of H: 1 +element of H: 3279917132858342911831074864712036382710139745724269329239664300762234227201 +element of H: 880904806456922042258150504921383618666682042621506879489 +element of H: 1973030855696769125460623085327505793054673234941098473458474059731617992635 +element of H: 8444461749428370424248824938781546531375899335154063827935233455917409239040 +element of H: 5164544616570027512417750074069510148665759589429794498695569155155175011840 +element of H: 8444461749428370423367920132324624489117748830232680209268551413295902359552 +element of H: 6471430893731601298788201853454040738321226100212965354476759396185791246406 +generator of K: 3279917132858342911831074864712036382710139745724269329239664300762234227201 +element of K: 1 +element of K: 3279917132858342911831074864712036382710139745724269329239664300762234227201 +element of K: 880904806456922042258150504921383618666682042621506879489 +element of K: 1973030855696769125460623085327505793054673234941098473458474059731617992635 +element of K: 8444461749428370424248824938781546531375899335154063827935233455917409239040 +element of K: 5164544616570027512417750074069510148665759589429794498695569155155175011840 +element of K: 8444461749428370423367920132324624489117748830232680209268551413295902359552 +element of K: 6471430893731601298788201853454040738321226100212965354476759396185791246406 + + +prover_third_message +:ThirdMessage { sums: [[MatrixSums { sum_a: 3889098981067159610222494931428102902569585578881828045211501849054709103057, sum_b: 5777100289028590399625348536918583066252575503174728532999512311082483211177, sum_c: 7111934174840268016641154786930865078902442980373248352910773940301427173187 }]] } + + +third_oracles +:ThirdOracles { g_1: LabeledPolynomial { info: PolynomialInfo { label: "g_1", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( +5974345914549560103033582308151263484641427037487704144517576121295488858845 + +6423982794560526119074221387953887898954565066933229568346444819937716970457 * x + +2120676002619376729858633786571526313168838229349525391995933228272838676962 * x^2 + +2462614374069317334418967434622878426019913143043627098030446102824115060612 * x^3 + +2696135425592197752662144018877790534094198202759806306540770263373252887607 * x^4 + +6492382208137597381010080854760156942268920954235091389487817023309994519561 * x^5 + +6510132846304178680953376829648066706283820437200619761150059347877950898281 * x^6) }, h_1: LabeledPolynomial { info: PolynomialInfo { label: "h_1", degree_bound: None, hiding_bound: None }, polynomial: Dense( +8351678429524123697744791108744026615650857426644444914264554509840053299068 + +882757904246333115996356909608008750258024036554818968914961788900581058821 * x + +3652509220534331424025659478014673520129280056674528390212639700149995017556 * x^2 + +1113171752746309261273571144571937210400657000760635223960265520546329244022 * x^3 + +5906706731077809711728334099024878652604102381329916177877999445253998950459 * x^4 + +6949417586103650368715438986534204794257789969488785698982971398192494857128 * x^5 + +2112621320437559066535210341919245846284448704668054791300931702512147742786 * x^6) } } + + +third_oracles g1 polynomial +:LabeledPolynomial { info: PolynomialInfo { label: "g_1", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( +5974345914549560103033582308151263484641427037487704144517576121295488858845 + +6423982794560526119074221387953887898954565066933229568346444819937716970457 * x + +2120676002619376729858633786571526313168838229349525391995933228272838676962 * x^2 + +2462614374069317334418967434622878426019913143043627098030446102824115060612 * x^3 + +2696135425592197752662144018877790534094198202759806306540770263373252887607 * x^4 + +6492382208137597381010080854760156942268920954235091389487817023309994519561 * x^5 + +6510132846304178680953376829648066706283820437200619761150059347877950898281 * x^6) } + + +third_oracles h1 polynomial +:LabeledPolynomial { info: PolynomialInfo { label: "h_1", degree_bound: None, hiding_bound: None }, polynomial: Dense( +8351678429524123697744791108744026615650857426644444914264554509840053299068 + +882757904246333115996356909608008750258024036554818968914961788900581058821 * x + +3652509220534331424025659478014673520129280056674528390212639700149995017556 * x^2 + +1113171752746309261273571144571937210400657000760635223960265520546329244022 * x^3 + +5906706731077809711728334099024878652604102381329916177877999445253998950459 * x^4 + +6949417586103650368715438986534204794257789969488785698982971398192494857128 * x^5 + +2112621320437559066535210341919245846284448704668054791300931702512147742786 * x^6) } + + +verifier_third_msg +:ThirdMessage { beta: 22 } + + +prover_fourth_message: FourthMessage { sums: [MatrixSums { sum_a: 1721298923437735657335593929974406213434751524006554489289184451394350953161, sum_b: 8432867445739566471480886263141830255312428121442579117979665603789214130827, sum_c: 4671627821701747919460581452695760901957709017628905975546403109963937334312 }] } + + +fourth_oracles +:FourthOracles { gs: {CircuitId([7, 113, 127, 205, 235, 165, 67, 186, 47, 174, 200, 48, 10, 233, 43, 43, 209, 92, 104, 236, 207, 81, 157, 53, 13, 162, 203, 180, 134, 91, 219, 194]): MatrixGs { g_a: LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_a_00000000", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( +7844304871421823466838270679790440827432596271487276197499864127661846898286 + +7522663449790382766222579422003068930939787648648211906083751707713038811961 * x + +1780748334196356345802500227978801204697882769810441173209564041968587494949 * x^2 + +6877202362108936959696644681497794375039094584195481541308391259545095731671 * x^3 + +7889164524323527432325505889877523994201610684953404629838480882509815561172 * x^4 + +7826819645647699241461445088798664846333198550213357571519093714404658297547 * x^5 + +2673733686020669043862015565486998137544260919904369503747348520072359178613 * x^6) }, g_b: LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_b_00000000", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( +4190670298015087773819237795468172723622055061283114967763066452949593758705 + +2453405048514200725116368280360574217922444867402305833302185151259511193440 * x + +8018576275327694451802901757849011976315643238597500420667276070540917347175 * x^2 + +3173689231106838749558012166220351260675526913076332497211852656456102812277 * x^3 + +6171583627734917391067083923888669361212281851517705587316974743818412286693 * x^4 + +7997424924707964556490712179988382686650633297452534170397638078314154545672 * x^5 + +2436279881870478107836940463454131965518286801350704103424355433251187468924 * x^6) }, g_c: LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_c_00000000", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( +4043240184975125773810976862948473503372729933219551097386320710055097577718 + +1094113377560183698653838457833874020332158073478182568975084510142907263328 * x + +390957378899790921858187433391472829711103504010270521998757588895579512136 * x^2 + +3774780254310905978955693478260378915751756827336175981185540444268128892588 * x^3 + +8270437479517211430609496704059513599371337004018596736110745937723384957706 * x^4 + +3789787397912376427032463452073800854453100239468778710346779045322155222176 * x^5 + +1894921958146356403766806518813427767024082972732426515825228131388264736975 * x^6) } }} } + + +verifier_fourth_msg +:FourthMessage { delta_a: [22], delta_b: [22], delta_c: [22] } + + +fifth_oracles +:FifthOracles { h_2: LabeledPolynomial { info: PolynomialInfo { label: "h_2", degree_bound: None, hiding_bound: None }, polynomial: Dense( +246683914535431654764983727442266421709007221007139999260570684927136644873 + +7223651268159869699273760566653748336609154116540343407063815263531318975522 * x + +2556638500487170876744877949494599083513802937899218475101018920150719720635 * x^2 + +4318784164390785172608441604806503501280518910182710872998498823664704582567 * x^3 + +782199745360017309478759803832686999194112162677328406910612756250829022655 * x^4 + +5580075562519580619301859982355150529935712065449419392415303605654773194396 * x^5 + +3806343777551966164441807871035197664870983201510945893511753490375790831878 * x^6) } } + + +fifth_oracles h_2polynomial +:LabeledPolynomial { info: PolynomialInfo { label: "h_2", degree_bound: None, hiding_bound: None }, polynomial: Dense( +246683914535431654764983727442266421709007221007139999260570684927136644873 + +7223651268159869699273760566653748336609154116540343407063815263531318975522 * x + +2556638500487170876744877949494599083513802937899218475101018920150719720635 * x^2 + +4318784164390785172608441604806503501280518910182710872998498823664704582567 * x^3 + +782199745360017309478759803832686999194112162677328406910612756250829022655 * x^4 + +5580075562519580619301859982355150529935712065449419392415303605654773194396 * x^5 + +3806343777551966164441807871035197664870983201510945893511753490375790831878 * x^6) } +verifier_state: State { circuit_specific_states: {CircuitId([7, 113, 127, 205, 235, 165, 67, 186, 47, 174, 200, 48, 10, 233, 43, 43, 209, 92, 104, 236, 207, 81, 157, 53, 13, 162, 203, 180, 134, 91, 219, 194]): CircuitSpecificState { input_domain: Multiplicative subgroup of size 4, variable_domain: Multiplicative subgroup of size 8, constraint_domain: Multiplicative subgroup of size 8, non_zero_a_domain: Multiplicative subgroup of size 8, non_zero_b_domain: Multiplicative subgroup of size 8, non_zero_c_domain: Multiplicative subgroup of size 8, batch_size: 1 }}, max_constraint_domain: Multiplicative subgroup of size 8, max_variable_domain: Multiplicative subgroup of size 8, max_non_zero_domain: Multiplicative subgroup of size 8, first_round_message: Some(FirstMessage { batch_combiners: {CircuitId([7, 113, 127, 205, 235, 165, 67, 186, 47, 174, 200, 48, 10, 233, 43, 43, 209, 92, 104, 236, 207, 81, 157, 53, 13, 162, 203, 180, 134, 91, 219, 194]): BatchCombiners { circuit_combiner: 1, instance_combiners: [1] }} }), second_round_message: Some(SecondMessage { alpha: 22, eta_b: 22, eta_c: 22 }), third_round_message: Some(ThirdMessage { beta: 22 }), fourth_round_message: Some(FourthMessage { delta_a: [22], delta_b: [22], delta_c: [22] }), gamma: Some(22), mode: PhantomData } +polynomials: [LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_col_a", degree_bound: None, hiding_bound: None }, polynomial: Dense( +4161063645393556926066741125947524627320080987981357240091933807283437061697 + +3975602017752089071221608382110604530991577886979048700118636959836875650569 * x + +4632220516321478076213409928286893068808985948907738532455910020881672257857 * x^2 + +7073232882957566240234352361083974570927426964468459798498352864337413676519 * x^3 + +2521105078964385469930977491977275925400473488888876670805431146246943228224 * x^4 + +3975602017752089071441834583724835041556115513209394604785307470492252370441 * x^5 + +409989641607292863868771257281889292556498655100360713821622782267590918464 * x^6 + +1864486580394996465599854550643678919276678305651224552468169617168276780553 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_col_b", degree_bound: None, hiding_bound: None }, polynomial: Dense( +3837517436091765590840251434356954201766813914361977121259973166244518053316 + +6743335953678570682165503062175164446370691969581081537106383129533336207681 * x + +6743335953678570682275616162982279701652960782696254489439718384861024567617 * x^2 + +4468859731676281352917103455863826745102052635059842175483261240752845228536 * x^3 + +6579975169033373958869196589752098122663758655733185180133734349404509178360 * x^4 + +1701125795749799742083321876606382085005207365572982290828850326384073031360 * x^5 + +1701125795749799741973208775799266829722938552457809338495515071056384671424 * x^6 + +3975602017752089071331721482917719786273846700094221652451972215164564010505 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_col_c", degree_bound: None, hiding_bound: None }, polynomial: Dense( +4222230874714185212564864872619234286817024920037723723300957749269458059265 + +2437837006647486052654819179541519280257841461484308670929105924237006368402 * x + +4222230874714185212564864872619234286817024920037723723300957749269458059265 * x^2 + +2111115437357092606062206234695386632843974833788515956983808363979352309760 * x^3 + +1784393868066699159469593289849253985430108206092723243038510803721698251119 * x^5 + +2111115437357092606062206234695386632843974833788515956983808363979352309760 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_a", degree_bound: None, hiding_bound: None }, polynomial: Dense( +4468859731676281352806990355056711489819783821944669223149925985425156868600 + +409989641607292863978884358089004547838767468215533666154958037595279278401 * x + +8034472107821077560380053681499657238819400680053703114113610673649818320577 * x^2 + +6579975169033373958759083488944982867381489842618012227800399094076820818424 * x^3 + +3975602017752089071441834583724835041556115513209394604785307470492252370441 * x^4 + +8034472107821077560269940580692541983537131866938530161780275418322129960641 * x^5 + +409989641607292863868771257281889292556498655100360713821622782267590918464 * x^6 + +1864486580394996465489741449836563663994409492536051600134834361840588420617 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_b", degree_bound: None, hiding_bound: None }, polynomial: Dense( +4468859731676281352806990355056711489819783821944669223149925985425156868600 + +409989641607292863978884358089004547838767468215533666154958037595279278401 * x + +8034472107821077560380053681499657238819400680053703114113610673649818320577 * x^2 + +6579975169033373958759083488944982867381489842618012227800399094076820818424 * x^3 + +3975602017752089071441834583724835041556115513209394604785307470492252370441 * x^4 + +8034472107821077560269940580692541983537131866938530161780275418322129960641 * x^5 + +409989641607292863868771257281889292556498655100360713821622782267590918464 * x^6 + +1864486580394996465489741449836563663994409492536051600134834361840588420617 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_c", degree_bound: None, hiding_bound: None }, polynomial: Dense( +4468859731676281352806990355056711489819783821944669223149925985425156868600 + +409989641607292863978884358089004547838767468215533666154958037595279278401 * x + +8034472107821077560380053681499657238819400680053703114113610673649818320577 * x^2 + +6579975169033373958759083488944982867381489842618012227800399094076820818424 * x^3 + +3975602017752089071441834583724835041556115513209394604785307470492252370441 * x^4 + +8034472107821077560269940580692541983537131866938530161780275418322129960641 * x^5 + +409989641607292863868771257281889292556498655100360713821622782267590918464 * x^6 + +1864486580394996465489741449836563663994409492536051600134834361840588420617 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_a", degree_bound: None, hiding_bound: None }, polynomial: Dense( +6333346312071277818406844905700390409096462127595893775618095602593433649153 + +4571053287000849790045625484036529175158848456196890906246891844878716340097 * x + +3565612376144796207352837124828715238435079231878687986297014177569284732105 * x^2 + +2767733935926481610723668478450329404814576456371686932321075659041083837240 * x^3 + +2604373151281284887427362006027263081107643142523790575348426878912256807919 * x^4 + +2111115437357092605952093133888271377561706020673343004650473108651663949824 * x^5 + +4385591659359381935310605841006724334112614168309755318606930252759843288905 * x^6 + +2274476222002289329358512707118452956550908147636412313956457144108179339081 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_b", degree_bound: None, hiding_bound: None }, polynomial: Dense( +8444461749428370424138711837974431276093630522038890875601898200589720879105 + +4247507077699058454819135792445958749605581382577510787414931203839797331716 * x + +6333346312071277818296731804893275153814193314480720823284760347265745289217 * x^2 + +4878849373283574216785874713145716037658551290160202889304884023020436147000 * x^3 + +110113100807115255282268813115172952333335255327688359936 * x^4 + +6169985527426081094890312231663093574824991187517651513978776311809229899960 * x^5 + +2111115437357092605952093133888271377561706020673343004650473108651663949824 * x^6 + +3565612376144796207462950225635830493717348044993860938630349432896973092041 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_c", degree_bound: None, hiding_bound: None }, polynomial: Dense( +6579975169033373958869196589752098122663758655733185180133734349404509178360 + +4632220516321478076543749230708238834655792388253257389455915786864737337665 * x + +2027847365040193188786047922259629987701342806383947957107483141969415449938 * x^2 + +2357744294319188747075123422782670622822615427501672123166123387428869638648 * x^3 + +6086717455109181677504040818420221674400090346997910561769115834471604680201 * x^4 + +8034472107821077560269940580692541983537131866938530161780275418322129960641 * x^5 + +2194383509673992023338364547131143277986606861193083956860133585989289169583 * x^6 + +1864486580394996465489741449836563663994409492536051600134834361840588420617 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_val_a", degree_bound: None, hiding_bound: None }, polynomial: Dense( +7388904030749824121437948023048083725518449544490151754109999784583109804033 + +5216621364072103229097844243295217943742068404875615218583837989273113216577 * x + +4621170094823342510273827141369293299574797835657773012455583104231272527049 * x^2 + +5687778235000024379134399944827471129948704552686823558614478947543660052801 * x^3 + +1548815432602738584396258888679569764685655725629532596856522696922580653039 * x^4 + +1465547360285839166899874374629582608978486071994618692313526964257267073344 * x^5 + +3330033940680835632389615824466146272972895564530670292448361326097855493961 * x^6 + +7798893672357116985196606179522857762792679386475339515598287311523012362561 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_val_b", degree_bound: None, hiding_bound: None }, polynomial: Dense( +1055557718678546302920990016540578061139718603779085026158568926661987794944 + +4893075154770311893871354551704647518188801331256235099751877348234194208196 * x + +7388904030749824121217721821433853214953911918259805849443329273927733084161 * x^2 + +7798893672357116985196606179522857762792679386475339515598287311523012362561 * x^3 + +7388904030749824121327834922240968470236180731374978801776664529255421444097 * x^4 + +5524417450354827655838093472404404806241771238838927201641830167414833023480 * x^5 + +1055557718678546303031103117347693316421987416894257978491904181989676154880 * x^6 + +645568077071253439052218759258688768583219948678724312336946144394396876480 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_val_c", degree_bound: None, hiding_bound: None }, polynomial: Dense( +7635532887711920261900299707099791439085746072627443158625638531394185333240 + +5277788593392731515595967989966927603239012336931981701792861931259134214145 * x + +3083405083718739491707037938800208048841061410163032983266052068631403244882 * x^2 + +5277788593392731515485854889159812347956743523816808749459526675931445854209 * x^3 + +5031159736430635374472937701072528357978102930103652583277211652481928525321 * x^4 + +7388904030749824121217721821433853214953911918259805849443329273927733084161 * x^5 + +1138825790995445720417374530590565216846888257413998930701564659327301374639 * x^6 + +7388904030749824121327834922240968470236180731374978801776664529255421444097 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_w_00000000", degree_bound: None, hiding_bound: None }, polynomial: Dense( +7388904030749824121217721821433853214953911918259805849443329273927733084181 + +4806631722464810378222418881252928774493289697365662880095775335672748770572 * x + +7388904030749824121217721821433853214953911918259805849443329273927733084148 * x^2 + +4153188583884023458610048797853002211921041294332568892204718936512234268619 * x^3) }, LabeledPolynomial { info: PolynomialInfo { label: "h_0", degree_bound: None, hiding_bound: None }, polynomial: Dense( +7388904030749824121217721821433853214953911918259805849443329273927733084164 + +2135176220032946734943829824459106118384054561849250372330716048683975588842 * x + +4754990573109988415472033418479071784044875994712276662893248150540227089791 * x^2 + +2758334532884618923758430413601802477377254380601541511107093225976782776983 * x^3 + +8095203738994452079955122826479915970380729551727226719303332837983196321727 * x^4 + +6177424990788360784192413675740409023496996883035955845846493361503576983134 * x^5 + +5094286905430846656542049153180259645877255793223574061499131126611824661186 * x^6) }, LabeledPolynomial { info: PolynomialInfo { label: "g_1", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( +5974345914549560103033582308151263484641427037487704144517576121295488858845 + +6423982794560526119074221387953887898954565066933229568346444819937716970457 * x + +2120676002619376729858633786571526313168838229349525391995933228272838676962 * x^2 + +2462614374069317334418967434622878426019913143043627098030446102824115060612 * x^3 + +2696135425592197752662144018877790534094198202759806306540770263373252887607 * x^4 + +6492382208137597381010080854760156942268920954235091389487817023309994519561 * x^5 + +6510132846304178680953376829648066706283820437200619761150059347877950898281 * x^6) }, LabeledPolynomial { info: PolynomialInfo { label: "h_1", degree_bound: None, hiding_bound: None }, polynomial: Dense( +8351678429524123697744791108744026615650857426644444914264554509840053299068 + +882757904246333115996356909608008750258024036554818968914961788900581058821 * x + +3652509220534331424025659478014673520129280056674528390212639700149995017556 * x^2 + +1113171752746309261273571144571937210400657000760635223960265520546329244022 * x^3 + +5906706731077809711728334099024878652604102381329916177877999445253998950459 * x^4 + +6949417586103650368715438986534204794257789969488785698982971398192494857128 * x^5 + +2112621320437559066535210341919245846284448704668054791300931702512147742786 * x^6) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_a_00000000", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( +7844304871421823466838270679790440827432596271487276197499864127661846898286 + +7522663449790382766222579422003068930939787648648211906083751707713038811961 * x + +1780748334196356345802500227978801204697882769810441173209564041968587494949 * x^2 + +6877202362108936959696644681497794375039094584195481541308391259545095731671 * x^3 + +7889164524323527432325505889877523994201610684953404629838480882509815561172 * x^4 + +7826819645647699241461445088798664846333198550213357571519093714404658297547 * x^5 + +2673733686020669043862015565486998137544260919904369503747348520072359178613 * x^6) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_b_00000000", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( +4190670298015087773819237795468172723622055061283114967763066452949593758705 + +2453405048514200725116368280360574217922444867402305833302185151259511193440 * x + +8018576275327694451802901757849011976315643238597500420667276070540917347175 * x^2 + +3173689231106838749558012166220351260675526913076332497211852656456102812277 * x^3 + +6171583627734917391067083923888669361212281851517705587316974743818412286693 * x^4 + +7997424924707964556490712179988382686650633297452534170397638078314154545672 * x^5 + +2436279881870478107836940463454131965518286801350704103424355433251187468924 * x^6) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_c_00000000", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( +4043240184975125773810976862948473503372729933219551097386320710055097577718 + +1094113377560183698653838457833874020332158073478182568975084510142907263328 * x + +390957378899790921858187433391472829711103504010270521998757588895579512136 * x^2 + +3774780254310905978955693478260378915751756827336175981185540444268128892588 * x^3 + +8270437479517211430609496704059513599371337004018596736110745937723384957706 * x^4 + +3789787397912376427032463452073800854453100239468778710346779045322155222176 * x^5 + +1894921958146356403766806518813427767024082972732426515825228131388264736975 * x^6) }, LabeledPolynomial { info: PolynomialInfo { label: "h_2", degree_bound: None, hiding_bound: None }, polynomial: Dense( +246683914535431654764983727442266421709007221007139999260570684927136644873 + +7223651268159869699273760566653748336609154116540343407063815263531318975522 * x + +2556638500487170876744877949494599083513802937899218475101018920150719720635 * x^2 + +4318784164390785172608441604806503501280518910182710872998498823664704582567 * x^3 + +782199745360017309478759803832686999194112162677328406910612756250829022655 * x^4 + +5580075562519580619301859982355150529935712065449419392415303605654773194396 * x^5 + +3806343777551966164441807871035197664870983201510945893511753490375790831878 * x^6) }] + + +lc_s: {"circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_a_00000000": LinearCombination { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_a_00000000", terms: {circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_a_00000000: 1} }, "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_b_00000000": LinearCombination { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_b_00000000", terms: {circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_b_00000000: 1} }, "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_c_00000000": LinearCombination { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_c_00000000", terms: {circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_c_00000000: 1} }, "g_1": LinearCombination { label: "g_1", terms: {g_1: 1} }, "lineval_sumcheck": LinearCombination { label: "lineval_sumcheck", terms: {1: 1156305802723237075653362114544343316333995182452273842874300912447394619175, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_w_00000000: 6745347808261457907191764172559433261182535450059465541037316307780295086812, h_1: 8444461749428370424248824938781546531375899335154063827935233455862533365506} }, "matrix_sumcheck": LinearCombination { label: "matrix_sumcheck", terms: {1: 5536706007745249928246687487323369248256501388487501452854571704702365856175, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_col_a: 5686931832252555171553737565892221418053682028680052112792433915388780491606, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_col_b: 2840184156326269018820890025459642297781705021694987072933145857032328791514, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_col_c: 2352551498951970917578519487618203564239366555578613066877474705619913538517, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_a: 5686931832252555171553737565892221418053682028680052112792433915388780491606, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_b: 2840184156326269018820890025459642297781705021694987072933145857032328791514, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_c: 2352551498951970917578519487618203564239366555578613066877474705619913538517, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_a: 1276859780248223932974616463146998395793177968724372872679477268558220748389, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_b: 1406257401881236939917018624075751992169176923587330374491263089392604916575, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_c: 276905011385290886666832065961970134869842399071611398229898125013522531842, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_val_a: 66249952917044894716950, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_val_b: 66249952917044894716950, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_val_c: 66249952917044894716950, h_2: 8444461749428370424248824938781546531375899335154063827935233455862533365506} }, "rowcheck_zerocheck": LinearCombination { label: "rowcheck_zerocheck", terms: {1: 8335994047511480706634345235784004385061935445896950039370104976081595277929, h_0: 8444461749428370424248824938781546531375899335154063827935233455862533365506} }} diff --git a/algorithms/src/snark/varuna/resources/test_rounds/1st/first_round_oracles.test_vectors b/algorithms/src/snark/varuna/resources/test_rounds/1st/first_round_oracles.test_vectors new file mode 100644 index 0000000000..8fe38d05e3 --- /dev/null +++ b/algorithms/src/snark/varuna/resources/test_rounds/1st/first_round_oracles.test_vectors @@ -0,0 +1 @@ +"7388904030749824121217721821433853214953911918259805849443329273927733084181, 4806631722464810378222418881252928774493289697365662880095775335672748770572, 7388904030749824121217721821433853214953911918259805849443329273927733084148, 4153188583884023458610048797853002211921041294332568892204718936512234268619" \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/test_rounds/2nd/h_0.test_vector b/algorithms/src/snark/varuna/resources/test_rounds/2nd/h_0.test_vector new file mode 100644 index 0000000000..85ad4e8fb6 --- /dev/null +++ b/algorithms/src/snark/varuna/resources/test_rounds/2nd/h_0.test_vector @@ -0,0 +1 @@ +"7388904030749824121217721821433853214953911918259805849443329273927733084164,2135176220032946734943829824459106118384054561849250372330716048683975588842,4754990573109988415472033418479071784044875994712276662893248150540227089791,2758334532884618923758430413601802477377254380601541511107093225976782776983,8095203738994452079955122826479915970380729551727226719303332837983196321727,6177424990788360784192413675740409023496996883035955845846493361503576983134,5094286905430846656542049153180259645877255793223574061499131126611824661186," \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/test_rounds/3rd/g_1.test_vector b/algorithms/src/snark/varuna/resources/test_rounds/3rd/g_1.test_vector new file mode 100644 index 0000000000..52a0f3ad1a --- /dev/null +++ b/algorithms/src/snark/varuna/resources/test_rounds/3rd/g_1.test_vector @@ -0,0 +1 @@ +“5974345914549560103033582308151263484641427037487704144517576121295488858845, 6423982794560526119074221387953887898954565066933229568346444819937716970457, 2120676002619376729858633786571526313168838229349525391995933228272838676962, 2462614374069317334418967434622878426019913143043627098030446102824115060612, 2696135425592197752662144018877790534094198202759806306540770263373252887607, 6492382208137597381010080854760156942268920954235091389487817023309994519561, 6510132846304178680953376829648066706283820437200619761150059347877950898281” \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/test_rounds/3rd/h_1.test_vector b/algorithms/src/snark/varuna/resources/test_rounds/3rd/h_1.test_vector new file mode 100644 index 0000000000..da7c141791 --- /dev/null +++ b/algorithms/src/snark/varuna/resources/test_rounds/3rd/h_1.test_vector @@ -0,0 +1 @@ +"8351678429524123697744791108744026615650857426644444914264554509840053299068, 882757904246333115996356909608008750258024036554818968914961788900581058821, 3652509220534331424025659478014673520129280056674528390212639700149995017556, 1113171752746309261273571144571937210400657000760635223960265520546329244022, 5906706731077809711728334099024878652604102381329916177877999445253998950459, 6949417586103650368715438986534204794257789969488785698982971398192494857128, 2112621320437559066535210341919245846284448704668054791300931702512147742786" \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/test_rounds/4th/circuit_polynomials.test_vector b/algorithms/src/snark/varuna/resources/test_rounds/4th/circuit_polynomials.test_vector new file mode 100644 index 0000000000..9598a7d621 --- /dev/null +++ b/algorithms/src/snark/varuna/resources/test_rounds/4th/circuit_polynomials.test_vector @@ -0,0 +1,3 @@ +"7844304871421823466838270679790440827432596271487276197499864127661846898286, 7522663449790382766222579422003068930939787648648211906083751707713038811961, 1780748334196356345802500227978801204697882769810441173209564041968587494949, 6877202362108936959696644681497794375039094584195481541308391259545095731671, 7889164524323527432325505889877523994201610684953404629838480882509815561172, 7826819645647699241461445088798664846333198550213357571519093714404658297547, 2673733686020669043862015565486998137544260919904369503747348520072359178613" +"4190670298015087773819237795468172723622055061283114967763066452949593758705, 2453405048514200725116368280360574217922444867402305833302185151259511193440, 8018576275327694451802901757849011976315643238597500420667276070540917347175, 3173689231106838749558012166220351260675526913076332497211852656456102812277, 6171583627734917391067083923888669361212281851517705587316974743818412286693, 7997424924707964556490712179988382686650633297452534170397638078314154545672, 2436279881870478107836940463454131965518286801350704103424355433251187468924" +"4043240184975125773810976862948473503372729933219551097386320710055097577718, 1094113377560183698653838457833874020332158073478182568975084510142907263328, 390957378899790921858187433391472829711103504010270521998757588895579512136, 3774780254310905978955693478260378915751756827336175981185540444268128892588, 8270437479517211430609496704059513599371337004018596736110745937723384957706, 3789787397912376427032463452073800854453100239468778710346779045322155222176, 1894921958146356403766806518813427767024082972732426515825228131388264736975" \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/test_rounds/5th/h_1 b/algorithms/src/snark/varuna/resources/test_rounds/5th/h_1 new file mode 100644 index 0000000000..33b8125233 --- /dev/null +++ b/algorithms/src/snark/varuna/resources/test_rounds/5th/h_1 @@ -0,0 +1 @@ +"246683914535431654764983727442266421709007221007139999260570684927136644873, 7223651268159869699273760566653748336609154116540343407063815263531318975522, 2556638500487170876744877949494599083513802937899218475101018920150719720635, 4318784164390785172608441604806503501280518910182710872998498823664704582567, 782199745360017309478759803832686999194112162677328406910612756250829022655, 5580075562519580619301859982355150529935712065449419392415303605654773194396, 3806343777551966164441807871035197664870983201510945893511753490375790831878" \ No newline at end of file diff --git a/algorithms/src/snark/varuna/sage_test.rs b/algorithms/src/snark/varuna/sage_test.rs index 3ac4738925..ed5022e20d 100644 --- a/algorithms/src/snark/varuna/sage_test.rs +++ b/algorithms/src/snark/varuna/sage_test.rs @@ -155,6 +155,7 @@ mod tests { let prover_state = AHPForR1CS::<_, MM>::init_prover(&keys_to_constraints, rng).unwrap(); let prover_state = AHPForR1CS::<_, MM>::prover_first_round(prover_state, rng).unwrap(); let first_round_oracles = Arc::clone(prover_state.first_round_oracles.as_ref().unwrap()); + println!("first_round_oracles: {:?}", first_round_oracles); let assignments = AHPForR1CS::<_, MM>::calculate_assignments(&prover_state).unwrap(); let constraint_domain = EvaluationDomain::::new(num_constraints).unwrap(); @@ -172,8 +173,11 @@ mod tests { let combiners = verifier::BatchCombiners:: { circuit_combiner, instance_combiners }; let batch_combiners = BTreeMap::from_iter([(index_pk.circuit.id, combiners)]); let verifier_first_msg = verifier::FirstMessage:: { batch_combiners }; + println!("verifier_first_msg: {:?}", verifier_first_msg); + let (second_oracles, prover_state) = AHPForR1CS::<_, MM>::prover_second_round(&verifier_first_msg, prover_state).unwrap(); + println!("second_oracles: {:?}", second_oracles); // TODO: hardcoding for testing purposes let alpha = Fr::from_str("22").unwrap(); @@ -189,13 +193,31 @@ mod tests { AHPForR1CS::<_, MM>::prover_third_round(&verifier_first_msg, &verifier_second_msg, prover_state, rng) .unwrap(); + println!("\n"); + println!("prover_third_message\n:{:?}", prover_third_message); + println!("\n"); + println!("third_oracles g1 polynomial\n:{:?}", third_oracles.g_1); + println!("\n"); + println!("third_oracles h1 polynomial\n:{:?}", third_oracles.h_1); + println!("\n"); + let verifier_third_msg = verifier::ThirdMessage:: { beta }; + println!("verifier_third_msg\n:{:?}", verifier_third_msg); + println!("\n"); + let (prover_fourth_message, fourth_oracles, prover_state) = AHPForR1CS::<_, MM>::prover_fourth_round(&verifier_second_msg, &verifier_third_msg, prover_state, rng) .unwrap(); + println!("prover_fourth_message: {:?}", prover_fourth_message); + println!("\n"); + println!("fourth_oracles\n:{:?}", fourth_oracles); + println!("\n"); + let verifier_fourth_msg = verifier::FourthMessage:: { delta_a, delta_b, delta_c }; + println!("verifier_fourth_msg\n:{:?}", verifier_fourth_msg); + println!("\n"); let mut public_inputs = BTreeMap::new(); let public_input = prover_state.public_inputs(&index_pk.circuit).unwrap(); @@ -210,6 +232,10 @@ mod tests { let fifth_oracles = AHPForR1CS::<_, MM>::prover_fifth_round(verifier_fourth_msg.clone(), prover_state, rng).unwrap(); + println!("fifth_oracles\n:{:?}", fifth_oracles); + println!("\n"); + println!("fifth_oracles h_2polynomial\n:{:?}", fifth_oracles.h_2); + use std::marker::PhantomData; let mut circuit_specific_states = BTreeMap::new(); let circuit_specific_state = verifier::CircuitSpecificState { @@ -234,6 +260,7 @@ mod tests { gamma: Some(gamma), mode: PhantomData, }; + println!("verifier_state: {:?}", verifier_state); let polynomials: Vec<_> = index_pk .circuit @@ -245,6 +272,9 @@ mod tests { .chain(fifth_oracles.iter()) .collect(); + println!("polynomials: {:?}", polynomials); + println!("\n"); + let _lc_s = AHPForR1CS::<_, MM>::construct_linear_combinations( &public_inputs, &polynomials, @@ -254,6 +284,9 @@ mod tests { ) .unwrap(); + println!("lc_s: {:?}", _lc_s); + println!("\n"); + // TODO: I can save space by using bytes instead of number characters, and allocating the right amount immediately let mut h_0 = String::new(); for coeff in second_oracles.h_0.coeffs() { From 903bbd687d560856782e2e8ec61d1afea9a266e8 Mon Sep 17 00:00:00 2001 From: Michael Turner Date: Wed, 27 Sep 2023 19:10:08 +0200 Subject: [PATCH 013/339] Add automated generation of test vectors --- .../src/snark/varuna/ahp/prover/oracles.rs | 6 +- .../varuna/resources/constraint_domain.txt | 2 - .../src/snark/varuna/resources/domain/H.snap | 1 + .../src/snark/varuna/resources/domain/K.snap | 1 + .../src/snark/varuna/resources/inputs.txt | 18 +- .../snark/varuna/resources/non_zero_domain | 2 - .../resources/polynomials/circuit_0_g_C.snap | 1 + .../resources/polynomials/circuit_0_g_a.snap | 1 + .../resources/polynomials/circuit_0_g_b.snap | 1 + .../circuit_0_w_lde_0.snap} | 2 +- .../polynomials/circuit_0_z_lde_0.snap | 1 + .../varuna/resources/polynomials/g_1.snap | 1 + .../varuna/resources/polynomials/h_0.snap | 1 + .../varuna/resources/polynomials/h_1.snap | 1 + .../varuna/resources/polynomials/h_2.snap | 1 + .../polynomials/h_0.snap} | 0 .../snark/varuna/resources/raw_messages.txt | 308 ------------------ .../resources/test_rounds/2nd/h_0.test_vector | 1 - .../resources/test_rounds/3rd/g_1.test_vector | 1 - .../resources/test_rounds/3rd/h_1.test_vector | 1 - .../4th/circuit_polynomials.test_vector | 3 - .../varuna/resources/test_rounds/5th/h_1 | 1 - .../resources/test_rounds/h_0.test_vector | 0 algorithms/src/snark/varuna/sage_test.rs | 231 +++++++------ 24 files changed, 163 insertions(+), 423 deletions(-) delete mode 100644 algorithms/src/snark/varuna/resources/constraint_domain.txt create mode 100644 algorithms/src/snark/varuna/resources/domain/H.snap create mode 100644 algorithms/src/snark/varuna/resources/domain/K.snap delete mode 100644 algorithms/src/snark/varuna/resources/non_zero_domain create mode 100644 algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_C.snap create mode 100644 algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_a.snap create mode 100644 algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_b.snap rename algorithms/src/snark/varuna/resources/{test_rounds/1st/first_round_oracles.test_vectors => polynomials/circuit_0_w_lde_0.snap} (61%) create mode 100644 algorithms/src/snark/varuna/resources/polynomials/circuit_0_z_lde_0.snap create mode 100644 algorithms/src/snark/varuna/resources/polynomials/g_1.snap create mode 100644 algorithms/src/snark/varuna/resources/polynomials/h_0.snap create mode 100644 algorithms/src/snark/varuna/resources/polynomials/h_1.snap create mode 100644 algorithms/src/snark/varuna/resources/polynomials/h_2.snap rename algorithms/src/snark/varuna/resources/{padded_inputs.txt => polynomials/polynomials/h_0.snap} (100%) delete mode 100644 algorithms/src/snark/varuna/resources/raw_messages.txt delete mode 100644 algorithms/src/snark/varuna/resources/test_rounds/2nd/h_0.test_vector delete mode 100644 algorithms/src/snark/varuna/resources/test_rounds/3rd/g_1.test_vector delete mode 100644 algorithms/src/snark/varuna/resources/test_rounds/3rd/h_1.test_vector delete mode 100644 algorithms/src/snark/varuna/resources/test_rounds/4th/circuit_polynomials.test_vector delete mode 100644 algorithms/src/snark/varuna/resources/test_rounds/5th/h_1 delete mode 100644 algorithms/src/snark/varuna/resources/test_rounds/h_0.test_vector diff --git a/algorithms/src/snark/varuna/ahp/prover/oracles.rs b/algorithms/src/snark/varuna/ahp/prover/oracles.rs index 73a52125ca..81746b50f9 100644 --- a/algorithms/src/snark/varuna/ahp/prover/oracles.rs +++ b/algorithms/src/snark/varuna/ahp/prover/oracles.rs @@ -118,11 +118,11 @@ pub struct FourthOracles { #[derive(Debug)] pub struct MatrixGs { /// The polynomial `g_a` resulting from the second sumcheck. - pub(super) g_a: LabeledPolynomial, + pub(crate) g_a: LabeledPolynomial, /// The polynomial `g_b` resulting from the second sumcheck. - pub(super) g_b: LabeledPolynomial, + pub(crate) g_b: LabeledPolynomial, /// The polynomial `g_c` resulting from the second sumcheck. - pub(super) g_c: LabeledPolynomial, + pub(crate) g_c: LabeledPolynomial, } impl MatrixGs { diff --git a/algorithms/src/snark/varuna/resources/constraint_domain.txt b/algorithms/src/snark/varuna/resources/constraint_domain.txt deleted file mode 100644 index 3ec6afc5da..0000000000 --- a/algorithms/src/snark/varuna/resources/constraint_domain.txt +++ /dev/null @@ -1,2 +0,0 @@ -"generator": "3279917132858342911831074864712036382710139745724269329239664300762234227201", -"domain": "1, 3279917132858342911831074864712036382710139745724269329239664300762234227201, 880904806456922042258150504921383618666682042621506879489, 1973030855696769125460623085327505793054673234941098473458474059731617992635, 8444461749428370424248824938781546531375899335154063827935233455917409239040, 5164544616570027512417750074069510148665759589429794498695569155155175011840, 8444461749428370423367920132324624489117748830232680209268551413295902359552, 6471430893731601298788201853454040738321226100212965354476759396185791246406 diff --git a/algorithms/src/snark/varuna/resources/domain/H.snap b/algorithms/src/snark/varuna/resources/domain/H.snap new file mode 100644 index 0000000000..4fee833f10 --- /dev/null +++ b/algorithms/src/snark/varuna/resources/domain/H.snap @@ -0,0 +1 @@ +[1, 3279917132858342911831074864712036382710139745724269329239664300762234227201, 880904806456922042258150504921383618666682042621506879489, 1973030855696769125460623085327505793054673234941098473458474059731617992635, 8444461749428370424248824938781546531375899335154063827935233455917409239040, 5164544616570027512417750074069510148665759589429794498695569155155175011840, 8444461749428370423367920132324624489117748830232680209268551413295902359552, 6471430893731601298788201853454040738321226100212965354476759396185791246406] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/domain/K.snap b/algorithms/src/snark/varuna/resources/domain/K.snap new file mode 100644 index 0000000000..f9ee0021fe --- /dev/null +++ b/algorithms/src/snark/varuna/resources/domain/K.snap @@ -0,0 +1 @@ +[1, 3279917132858342911831074864712036382710139745724269329239664300762234227201, 880904806456922042258150504921383618666682042621506879489, 1973030855696769125460623085327505793054673234941098473458474059731617992635, 8444461749428370424248824938781546531375899335154063827935233455917409239040, 5164544616570027512417750074069510148665759589429794498695569155155175011840, 8444461749428370423367920132324624489117748830232680209268551413295902359552, 6471430893731601298788201853454040738321226100212965354476759396185791246406, 1, 3279917132858342911831074864712036382710139745724269329239664300762234227201, 880904806456922042258150504921383618666682042621506879489, 1973030855696769125460623085327505793054673234941098473458474059731617992635, 8444461749428370424248824938781546531375899335154063827935233455917409239040, 5164544616570027512417750074069510148665759589429794498695569155155175011840, 8444461749428370423367920132324624489117748830232680209268551413295902359552, 6471430893731601298788201853454040738321226100212965354476759396185791246406] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/inputs.txt b/algorithms/src/snark/varuna/resources/inputs.txt index c4d388dfb0..d2181efdc4 100644 --- a/algorithms/src/snark/varuna/resources/inputs.txt +++ b/algorithms/src/snark/varuna/resources/inputs.txt @@ -1,9 +1,9 @@ -43719561533842476373783670372904509453942239614039851160651722575355200513690215676427143818688669409477717356697 -1 -221400395006961780677343786613069247364561322399032182018779372395547677427473563761257898688782138184082453089080 -220857107422062177961310768973448484943348952807551776483013286539337828841179434809386713211789661237952735284503 -93140711900014280323811219767030904360542834646330898824133268751714031953884771421485624661328159718969289922279 -1 -210691428699097896481859553574055160381026932138503481370159927734408364611239823344879652067796513776859977564687 -39291796191041067223251635051890547797734640797759684658651733745713541775929823595418082554573556182974397315204 -16963008194059394677667633670174788960123081977519241438404044904900225908849305375312962047657570434981724274395 +alpha 3848747268438146429751199396409351181775389242768022193485885831738448017147 +eta_A 1 +eta_B 8197944265508088395536605774074305135172727109973647025295290482999689956740 +eta_C 969057258436037177120044092706484307847087860293738150232755543560372962965 +beta 1261454636320080423466301508402274008580035865105120100172548996301504688503 +delta_A 1 +delta_B 4987583518937978349829618221849930643691403053432331091973338029344238378359 +delta_C 5292820491592383411924896857610185298390500160570506754003580089093852949536 +gamma 672738024541753390172108082983901395072703770443783662610485842877496432861 \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/non_zero_domain b/algorithms/src/snark/varuna/resources/non_zero_domain deleted file mode 100644 index 654d3adb97..0000000000 --- a/algorithms/src/snark/varuna/resources/non_zero_domain +++ /dev/null @@ -1,2 +0,0 @@ -"generator": "3279917132858342911831074864712036382710139745724269329239664300762234227201" -"domain": "3279917132858342911831074864712036382710139745724269329239664300762234227201, 880904806456922042258150504921383618666682042621506879489, "1973030855696769125460623085327505793054673234941098473458474059731617992635, 8444461749428370424248824938781546531375899335154063827935233455917409239040, 5164544616570027512417750074069510148665759589429794498695569155155175011840, 8444461749428370423367920132324624489117748830232680209268551413295902359552, 6471430893731601298788201853454040738321226100212965354476759396185791246406" diff --git a/algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_C.snap b/algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_C.snap new file mode 100644 index 0000000000..5f89ae6a1d --- /dev/null +++ b/algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_C.snap @@ -0,0 +1 @@ +[430880258510547293498955878432749658772712640247917521565517069504460623156, 4200473474457187423764559025311252880903424553691876396667558162214558273961, 661445282688702714353833492748236589095252619050348777778477928896317107273, 5175393828487391934966510003107270767899141347257027196219188699521911038989, 2122243699759976117567014203687023024763017215761771680281324936505463399457, 375703067937610614092324366598075959564740793008485371369026715321355794063, 3503617345868455471058115121882953107383505289696645564542071124216162786942] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_a.snap b/algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_a.snap new file mode 100644 index 0000000000..406dfcb42a --- /dev/null +++ b/algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_a.snap @@ -0,0 +1 @@ +[7298426509888201269891881417058316917443386443130089954044569917277532451124, 4513665418379767804370095812278055346820156274660773052289744107232412707613, 4475996609146606675867680993589252805148646238137939055092225188380378102122, 1164867027976035030197277870836287693729511372979478632421748407217397685680, 241156138388132028780023732378805911361134319610119168887483568462409314180, 5388924537180330478887903617303497159805558377912056989902396473207071789448, 4874868009316021445675218576593739719745472140358591754846406994220385278800] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_b.snap b/algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_b.snap new file mode 100644 index 0000000000..5bd1204a5c --- /dev/null +++ b/algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_b.snap @@ -0,0 +1 @@ +[5156102875137215468349822857341787486070810620190600082313993541539039694040, 642243162042132842519243997058576263060505644548708158364282235038668235582, 4232914989795410755789500032792636846277428417456597259068424201075935215723, 5294805659491479092801660967840299543626893059046679165413663075966109761338, 4428888977080738940451109661040008630918481794519438117648033775895551925110, 4353953527706377329056342142048774285909447424786294362569762658050561552035, 3147342381590763655483856523901415730605847626281467108012225760335596205826] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/test_rounds/1st/first_round_oracles.test_vectors b/algorithms/src/snark/varuna/resources/polynomials/circuit_0_w_lde_0.snap similarity index 61% rename from algorithms/src/snark/varuna/resources/test_rounds/1st/first_round_oracles.test_vectors rename to algorithms/src/snark/varuna/resources/polynomials/circuit_0_w_lde_0.snap index 8fe38d05e3..33e90cb354 100644 --- a/algorithms/src/snark/varuna/resources/test_rounds/1st/first_round_oracles.test_vectors +++ b/algorithms/src/snark/varuna/resources/polynomials/circuit_0_w_lde_0.snap @@ -1 +1 @@ -"7388904030749824121217721821433853214953911918259805849443329273927733084181, 4806631722464810378222418881252928774493289697365662880095775335672748770572, 7388904030749824121217721821433853214953911918259805849443329273927733084148, 4153188583884023458610048797853002211921041294332568892204718936512234268619" \ No newline at end of file +[7388904030749824121217721821433853214953911918259805849443329273927733084181, 4806631722464810378222418881252928774493289697365662880095775335672748770572, 7388904030749824121217721821433853214953911918259805849443329273927733084148, 4153188583884023458610048797853002211921041294332568892204718936512234268619] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/polynomials/circuit_0_z_lde_0.snap b/algorithms/src/snark/varuna/resources/polynomials/circuit_0_z_lde_0.snap new file mode 100644 index 0000000000..89b0c81ec5 --- /dev/null +++ b/algorithms/src/snark/varuna/resources/polynomials/circuit_0_z_lde_0.snap @@ -0,0 +1 @@ +[7388904030749824121217721821433853214953911918259805849443329273927733084183, 1526714589606467466391344016540892391783149951641393550856111034910514543371, 7388904030749824121217721821433853214953911918259805849443329273927733084148, 2180157728187254333149425712525496418866368059391470418746244876780616275984, 7388904030749824121217721821433853214953911918259805849443329273927733084181, 4806631722464810378222418881252928774493289697365662880095775335672748770572, 7388904030749824121217721821433853214953911918259805849443329273927733084148, 4153188583884023458610048797853002211921041294332568892204718936512234268619] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/polynomials/g_1.snap b/algorithms/src/snark/varuna/resources/polynomials/g_1.snap new file mode 100644 index 0000000000..66c9b89ece --- /dev/null +++ b/algorithms/src/snark/varuna/resources/polynomials/g_1.snap @@ -0,0 +1 @@ +[6619044933395879708506708233785160900848417926433900807753717609232615537930, 3821893577243645065467553327033258263806878911070937029265276300425404027087, 1076457615332399821357918023630894203218737643598338498309569170592118610105, 4055793519271390007054111087031631384766037777614854573354385584678647572635, 5151025438151686500811984829825775386132972581217168951169837107565191699213, 5451596424008550546888850265776737232625677836482903207071209344567449341848, 3448452754104072214340119903505567632967740660166690880356165129542564717469] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/polynomials/h_0.snap b/algorithms/src/snark/varuna/resources/polynomials/h_0.snap new file mode 100644 index 0000000000..5b5fb13912 --- /dev/null +++ b/algorithms/src/snark/varuna/resources/polynomials/h_0.snap @@ -0,0 +1 @@ +[7388904030749824121217721821433853214953911918259805849443329273927733084164, 2135176220032946734943829824459106118384054561849250372330716048683975588842, 4754990573109988415472033418479071784044875994712276662893248150540227089791, 2758334532884618923758430413601802477377254380601541511107093225976782776983, 8095203738994452079955122826479915970380729551727226719303332837983196321727, 6177424990788360784192413675740409023496996883035955845846493361503576983134, 5094286905430846656542049153180259645877255793223574061499131126611824661186] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/polynomials/h_1.snap b/algorithms/src/snark/varuna/resources/polynomials/h_1.snap new file mode 100644 index 0000000000..b635e6289e --- /dev/null +++ b/algorithms/src/snark/varuna/resources/polynomials/h_1.snap @@ -0,0 +1 @@ +[165474815053007573527603177207806062734264344258107184951357675349729517680, 5801432311648519240757166384710257525281134619669773204356367264314316460174, 5779294849724998706280834835495248447327865373185082571164164495999431007313, 6195154650395302844568965061674617811933630360198179606653410538752273578806, 1424571001001798030720515357589755476564998467791760803818317281629675760920, 644304059262549681272611563429424161652824970479283239535226429205883512483, 1985534495267414125495515420354543072112034540966649759533850695585151887015] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/polynomials/h_2.snap b/algorithms/src/snark/varuna/resources/polynomials/h_2.snap new file mode 100644 index 0000000000..ffe41016e9 --- /dev/null +++ b/algorithms/src/snark/varuna/resources/polynomials/h_2.snap @@ -0,0 +1 @@ +[8290113549992594314646287997621385217684845052221443536793209549506488920846, 4219277537425088937784490235792966206782906842687518132171996608740394894532, 590462121801222593314525094454279217199506852881783863984329676220226405050, 2657750100182903992679485191896472785743422123052387651366434608567501075462, 591064579761258100262799594047186364485022182696204209512789652131850886891, 3322216460403101876331086740648778039637725754343916626810493733358099221767, 8341638249347740785844637855796311718756490590925437333299426275491585624411] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/padded_inputs.txt b/algorithms/src/snark/varuna/resources/polynomials/polynomials/h_0.snap similarity index 100% rename from algorithms/src/snark/varuna/resources/padded_inputs.txt rename to algorithms/src/snark/varuna/resources/polynomials/polynomials/h_0.snap diff --git a/algorithms/src/snark/varuna/resources/raw_messages.txt b/algorithms/src/snark/varuna/resources/raw_messages.txt deleted file mode 100644 index 0208e2c6c5..0000000000 --- a/algorithms/src/snark/varuna/resources/raw_messages.txt +++ /dev/null @@ -1,308 +0,0 @@ -witness: 4 -witness: 2 -a: 2 -b: 4 -public_inputs: [8, 32, 128] -circ: TestCircuit { num_constraints: 7, num_variables: 7, mul_depth: 3 } -adding mul_constraint 0 -adding mul_constraint 1 -Number of padded public variables: 4 -Number of private variables: 3 -Number of num_constraints: 7 -Number of non-zero entries in A: 7 -Number of non-zero entries in B: 7 -Number of non-zero entries in C: 7 -a: [[(1, 4)], [(1, 4)], [(1, 4)], [(1, 4)], [(1, 4)], [(1, 1)], [(1, 2)]] -b: [[(1, 5)], [(1, 5)], [(1, 5)], [(1, 5)], [(1, 5)], [(1, 5)], [(1, 5)]] -c: [[(1, 1)], [(1, 1)], [(1, 1)], [(1, 1)], [(1, 1)], [(1, 2)], [(1, 3)]] -adding mul_constraint 0 -adding mul_constraint 1 -Number of padded public variables in Prover::Init: 4 -Number of private variables: 3 -Number of constraints: 7 -Number of non-zero entries in A: 7 -Number of non-zero entries in B: 7 -Number of non-zero entries in C: 7 -padded_public_variables: [1, 8, 32, 128] -private_variables: [2, 4, 2] -assignments: {CircuitId([7, 113, 127, 205, 235, 165, 67, 186, 47, 174, 200, 48, 10, 233, 43, 43, 209, 92, 104, 236, 207, 81, 157, 53, 13, 162, 203, 180, 134, 91, 219, 194]): [ -7388904030749824121217721821433853214953911918259805849443329273927733084183 + -1526714589606467466391344016540892391783149951641393550856111034910514543371 * x + -7388904030749824121217721821433853214953911918259805849443329273927733084148 * x^2 + -2180157728187254333149425712525496418866368059391470418746244876780616275984 * x^3 + -7388904030749824121217721821433853214953911918259805849443329273927733084181 * x^4 + -4806631722464810378222418881252928774493289697365662880095775335672748770572 * x^5 + -7388904030749824121217721821433853214953911918259805849443329273927733084148 * x^6 + -4153188583884023458610048797853002211921041294332568892204718936512234268619 * x^7]} -generator of H: 3279917132858342911831074864712036382710139745724269329239664300762234227201 -element of H: 1 -element of H: 3279917132858342911831074864712036382710139745724269329239664300762234227201 -element of H: 880904806456922042258150504921383618666682042621506879489 -element of H: 1973030855696769125460623085327505793054673234941098473458474059731617992635 -element of H: 8444461749428370424248824938781546531375899335154063827935233455917409239040 -element of H: 5164544616570027512417750074069510148665759589429794498695569155155175011840 -element of H: 8444461749428370423367920132324624489117748830232680209268551413295902359552 -element of H: 6471430893731601298788201853454040738321226100212965354476759396185791246406 -generator of K: 3279917132858342911831074864712036382710139745724269329239664300762234227201 -element of K: 1 -element of K: 3279917132858342911831074864712036382710139745724269329239664300762234227201 -element of K: 880904806456922042258150504921383618666682042621506879489 -element of K: 1973030855696769125460623085327505793054673234941098473458474059731617992635 -element of K: 8444461749428370424248824938781546531375899335154063827935233455917409239040 -element of K: 5164544616570027512417750074069510148665759589429794498695569155155175011840 -element of K: 8444461749428370423367920132324624489117748830232680209268551413295902359552 -element of K: 6471430893731601298788201853454040738321226100212965354476759396185791246406 - - -prover_third_message -:ThirdMessage { sums: [[MatrixSums { sum_a: 3889098981067159610222494931428102902569585578881828045211501849054709103057, sum_b: 5777100289028590399625348536918583066252575503174728532999512311082483211177, sum_c: 7111934174840268016641154786930865078902442980373248352910773940301427173187 }]] } - - -third_oracles -:ThirdOracles { g_1: LabeledPolynomial { info: PolynomialInfo { label: "g_1", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( -5974345914549560103033582308151263484641427037487704144517576121295488858845 + -6423982794560526119074221387953887898954565066933229568346444819937716970457 * x + -2120676002619376729858633786571526313168838229349525391995933228272838676962 * x^2 + -2462614374069317334418967434622878426019913143043627098030446102824115060612 * x^3 + -2696135425592197752662144018877790534094198202759806306540770263373252887607 * x^4 + -6492382208137597381010080854760156942268920954235091389487817023309994519561 * x^5 + -6510132846304178680953376829648066706283820437200619761150059347877950898281 * x^6) }, h_1: LabeledPolynomial { info: PolynomialInfo { label: "h_1", degree_bound: None, hiding_bound: None }, polynomial: Dense( -8351678429524123697744791108744026615650857426644444914264554509840053299068 + -882757904246333115996356909608008750258024036554818968914961788900581058821 * x + -3652509220534331424025659478014673520129280056674528390212639700149995017556 * x^2 + -1113171752746309261273571144571937210400657000760635223960265520546329244022 * x^3 + -5906706731077809711728334099024878652604102381329916177877999445253998950459 * x^4 + -6949417586103650368715438986534204794257789969488785698982971398192494857128 * x^5 + -2112621320437559066535210341919245846284448704668054791300931702512147742786 * x^6) } } - - -third_oracles g1 polynomial -:LabeledPolynomial { info: PolynomialInfo { label: "g_1", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( -5974345914549560103033582308151263484641427037487704144517576121295488858845 + -6423982794560526119074221387953887898954565066933229568346444819937716970457 * x + -2120676002619376729858633786571526313168838229349525391995933228272838676962 * x^2 + -2462614374069317334418967434622878426019913143043627098030446102824115060612 * x^3 + -2696135425592197752662144018877790534094198202759806306540770263373252887607 * x^4 + -6492382208137597381010080854760156942268920954235091389487817023309994519561 * x^5 + -6510132846304178680953376829648066706283820437200619761150059347877950898281 * x^6) } - - -third_oracles h1 polynomial -:LabeledPolynomial { info: PolynomialInfo { label: "h_1", degree_bound: None, hiding_bound: None }, polynomial: Dense( -8351678429524123697744791108744026615650857426644444914264554509840053299068 + -882757904246333115996356909608008750258024036554818968914961788900581058821 * x + -3652509220534331424025659478014673520129280056674528390212639700149995017556 * x^2 + -1113171752746309261273571144571937210400657000760635223960265520546329244022 * x^3 + -5906706731077809711728334099024878652604102381329916177877999445253998950459 * x^4 + -6949417586103650368715438986534204794257789969488785698982971398192494857128 * x^5 + -2112621320437559066535210341919245846284448704668054791300931702512147742786 * x^6) } - - -verifier_third_msg -:ThirdMessage { beta: 22 } - - -prover_fourth_message: FourthMessage { sums: [MatrixSums { sum_a: 1721298923437735657335593929974406213434751524006554489289184451394350953161, sum_b: 8432867445739566471480886263141830255312428121442579117979665603789214130827, sum_c: 4671627821701747919460581452695760901957709017628905975546403109963937334312 }] } - - -fourth_oracles -:FourthOracles { gs: {CircuitId([7, 113, 127, 205, 235, 165, 67, 186, 47, 174, 200, 48, 10, 233, 43, 43, 209, 92, 104, 236, 207, 81, 157, 53, 13, 162, 203, 180, 134, 91, 219, 194]): MatrixGs { g_a: LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_a_00000000", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( -7844304871421823466838270679790440827432596271487276197499864127661846898286 + -7522663449790382766222579422003068930939787648648211906083751707713038811961 * x + -1780748334196356345802500227978801204697882769810441173209564041968587494949 * x^2 + -6877202362108936959696644681497794375039094584195481541308391259545095731671 * x^3 + -7889164524323527432325505889877523994201610684953404629838480882509815561172 * x^4 + -7826819645647699241461445088798664846333198550213357571519093714404658297547 * x^5 + -2673733686020669043862015565486998137544260919904369503747348520072359178613 * x^6) }, g_b: LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_b_00000000", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( -4190670298015087773819237795468172723622055061283114967763066452949593758705 + -2453405048514200725116368280360574217922444867402305833302185151259511193440 * x + -8018576275327694451802901757849011976315643238597500420667276070540917347175 * x^2 + -3173689231106838749558012166220351260675526913076332497211852656456102812277 * x^3 + -6171583627734917391067083923888669361212281851517705587316974743818412286693 * x^4 + -7997424924707964556490712179988382686650633297452534170397638078314154545672 * x^5 + -2436279881870478107836940463454131965518286801350704103424355433251187468924 * x^6) }, g_c: LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_c_00000000", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( -4043240184975125773810976862948473503372729933219551097386320710055097577718 + -1094113377560183698653838457833874020332158073478182568975084510142907263328 * x + -390957378899790921858187433391472829711103504010270521998757588895579512136 * x^2 + -3774780254310905978955693478260378915751756827336175981185540444268128892588 * x^3 + -8270437479517211430609496704059513599371337004018596736110745937723384957706 * x^4 + -3789787397912376427032463452073800854453100239468778710346779045322155222176 * x^5 + -1894921958146356403766806518813427767024082972732426515825228131388264736975 * x^6) } }} } - - -verifier_fourth_msg -:FourthMessage { delta_a: [22], delta_b: [22], delta_c: [22] } - - -fifth_oracles -:FifthOracles { h_2: LabeledPolynomial { info: PolynomialInfo { label: "h_2", degree_bound: None, hiding_bound: None }, polynomial: Dense( -246683914535431654764983727442266421709007221007139999260570684927136644873 + -7223651268159869699273760566653748336609154116540343407063815263531318975522 * x + -2556638500487170876744877949494599083513802937899218475101018920150719720635 * x^2 + -4318784164390785172608441604806503501280518910182710872998498823664704582567 * x^3 + -782199745360017309478759803832686999194112162677328406910612756250829022655 * x^4 + -5580075562519580619301859982355150529935712065449419392415303605654773194396 * x^5 + -3806343777551966164441807871035197664870983201510945893511753490375790831878 * x^6) } } - - -fifth_oracles h_2polynomial -:LabeledPolynomial { info: PolynomialInfo { label: "h_2", degree_bound: None, hiding_bound: None }, polynomial: Dense( -246683914535431654764983727442266421709007221007139999260570684927136644873 + -7223651268159869699273760566653748336609154116540343407063815263531318975522 * x + -2556638500487170876744877949494599083513802937899218475101018920150719720635 * x^2 + -4318784164390785172608441604806503501280518910182710872998498823664704582567 * x^3 + -782199745360017309478759803832686999194112162677328406910612756250829022655 * x^4 + -5580075562519580619301859982355150529935712065449419392415303605654773194396 * x^5 + -3806343777551966164441807871035197664870983201510945893511753490375790831878 * x^6) } -verifier_state: State { circuit_specific_states: {CircuitId([7, 113, 127, 205, 235, 165, 67, 186, 47, 174, 200, 48, 10, 233, 43, 43, 209, 92, 104, 236, 207, 81, 157, 53, 13, 162, 203, 180, 134, 91, 219, 194]): CircuitSpecificState { input_domain: Multiplicative subgroup of size 4, variable_domain: Multiplicative subgroup of size 8, constraint_domain: Multiplicative subgroup of size 8, non_zero_a_domain: Multiplicative subgroup of size 8, non_zero_b_domain: Multiplicative subgroup of size 8, non_zero_c_domain: Multiplicative subgroup of size 8, batch_size: 1 }}, max_constraint_domain: Multiplicative subgroup of size 8, max_variable_domain: Multiplicative subgroup of size 8, max_non_zero_domain: Multiplicative subgroup of size 8, first_round_message: Some(FirstMessage { batch_combiners: {CircuitId([7, 113, 127, 205, 235, 165, 67, 186, 47, 174, 200, 48, 10, 233, 43, 43, 209, 92, 104, 236, 207, 81, 157, 53, 13, 162, 203, 180, 134, 91, 219, 194]): BatchCombiners { circuit_combiner: 1, instance_combiners: [1] }} }), second_round_message: Some(SecondMessage { alpha: 22, eta_b: 22, eta_c: 22 }), third_round_message: Some(ThirdMessage { beta: 22 }), fourth_round_message: Some(FourthMessage { delta_a: [22], delta_b: [22], delta_c: [22] }), gamma: Some(22), mode: PhantomData } -polynomials: [LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_col_a", degree_bound: None, hiding_bound: None }, polynomial: Dense( -4161063645393556926066741125947524627320080987981357240091933807283437061697 + -3975602017752089071221608382110604530991577886979048700118636959836875650569 * x + -4632220516321478076213409928286893068808985948907738532455910020881672257857 * x^2 + -7073232882957566240234352361083974570927426964468459798498352864337413676519 * x^3 + -2521105078964385469930977491977275925400473488888876670805431146246943228224 * x^4 + -3975602017752089071441834583724835041556115513209394604785307470492252370441 * x^5 + -409989641607292863868771257281889292556498655100360713821622782267590918464 * x^6 + -1864486580394996465599854550643678919276678305651224552468169617168276780553 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_col_b", degree_bound: None, hiding_bound: None }, polynomial: Dense( -3837517436091765590840251434356954201766813914361977121259973166244518053316 + -6743335953678570682165503062175164446370691969581081537106383129533336207681 * x + -6743335953678570682275616162982279701652960782696254489439718384861024567617 * x^2 + -4468859731676281352917103455863826745102052635059842175483261240752845228536 * x^3 + -6579975169033373958869196589752098122663758655733185180133734349404509178360 * x^4 + -1701125795749799742083321876606382085005207365572982290828850326384073031360 * x^5 + -1701125795749799741973208775799266829722938552457809338495515071056384671424 * x^6 + -3975602017752089071331721482917719786273846700094221652451972215164564010505 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_col_c", degree_bound: None, hiding_bound: None }, polynomial: Dense( -4222230874714185212564864872619234286817024920037723723300957749269458059265 + -2437837006647486052654819179541519280257841461484308670929105924237006368402 * x + -4222230874714185212564864872619234286817024920037723723300957749269458059265 * x^2 + -2111115437357092606062206234695386632843974833788515956983808363979352309760 * x^3 + -1784393868066699159469593289849253985430108206092723243038510803721698251119 * x^5 + -2111115437357092606062206234695386632843974833788515956983808363979352309760 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_a", degree_bound: None, hiding_bound: None }, polynomial: Dense( -4468859731676281352806990355056711489819783821944669223149925985425156868600 + -409989641607292863978884358089004547838767468215533666154958037595279278401 * x + -8034472107821077560380053681499657238819400680053703114113610673649818320577 * x^2 + -6579975169033373958759083488944982867381489842618012227800399094076820818424 * x^3 + -3975602017752089071441834583724835041556115513209394604785307470492252370441 * x^4 + -8034472107821077560269940580692541983537131866938530161780275418322129960641 * x^5 + -409989641607292863868771257281889292556498655100360713821622782267590918464 * x^6 + -1864486580394996465489741449836563663994409492536051600134834361840588420617 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_b", degree_bound: None, hiding_bound: None }, polynomial: Dense( -4468859731676281352806990355056711489819783821944669223149925985425156868600 + -409989641607292863978884358089004547838767468215533666154958037595279278401 * x + -8034472107821077560380053681499657238819400680053703114113610673649818320577 * x^2 + -6579975169033373958759083488944982867381489842618012227800399094076820818424 * x^3 + -3975602017752089071441834583724835041556115513209394604785307470492252370441 * x^4 + -8034472107821077560269940580692541983537131866938530161780275418322129960641 * x^5 + -409989641607292863868771257281889292556498655100360713821622782267590918464 * x^6 + -1864486580394996465489741449836563663994409492536051600134834361840588420617 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_c", degree_bound: None, hiding_bound: None }, polynomial: Dense( -4468859731676281352806990355056711489819783821944669223149925985425156868600 + -409989641607292863978884358089004547838767468215533666154958037595279278401 * x + -8034472107821077560380053681499657238819400680053703114113610673649818320577 * x^2 + -6579975169033373958759083488944982867381489842618012227800399094076820818424 * x^3 + -3975602017752089071441834583724835041556115513209394604785307470492252370441 * x^4 + -8034472107821077560269940580692541983537131866938530161780275418322129960641 * x^5 + -409989641607292863868771257281889292556498655100360713821622782267590918464 * x^6 + -1864486580394996465489741449836563663994409492536051600134834361840588420617 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_a", degree_bound: None, hiding_bound: None }, polynomial: Dense( -6333346312071277818406844905700390409096462127595893775618095602593433649153 + -4571053287000849790045625484036529175158848456196890906246891844878716340097 * x + -3565612376144796207352837124828715238435079231878687986297014177569284732105 * x^2 + -2767733935926481610723668478450329404814576456371686932321075659041083837240 * x^3 + -2604373151281284887427362006027263081107643142523790575348426878912256807919 * x^4 + -2111115437357092605952093133888271377561706020673343004650473108651663949824 * x^5 + -4385591659359381935310605841006724334112614168309755318606930252759843288905 * x^6 + -2274476222002289329358512707118452956550908147636412313956457144108179339081 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_b", degree_bound: None, hiding_bound: None }, polynomial: Dense( -8444461749428370424138711837974431276093630522038890875601898200589720879105 + -4247507077699058454819135792445958749605581382577510787414931203839797331716 * x + -6333346312071277818296731804893275153814193314480720823284760347265745289217 * x^2 + -4878849373283574216785874713145716037658551290160202889304884023020436147000 * x^3 + -110113100807115255282268813115172952333335255327688359936 * x^4 + -6169985527426081094890312231663093574824991187517651513978776311809229899960 * x^5 + -2111115437357092605952093133888271377561706020673343004650473108651663949824 * x^6 + -3565612376144796207462950225635830493717348044993860938630349432896973092041 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_c", degree_bound: None, hiding_bound: None }, polynomial: Dense( -6579975169033373958869196589752098122663758655733185180133734349404509178360 + -4632220516321478076543749230708238834655792388253257389455915786864737337665 * x + -2027847365040193188786047922259629987701342806383947957107483141969415449938 * x^2 + -2357744294319188747075123422782670622822615427501672123166123387428869638648 * x^3 + -6086717455109181677504040818420221674400090346997910561769115834471604680201 * x^4 + -8034472107821077560269940580692541983537131866938530161780275418322129960641 * x^5 + -2194383509673992023338364547131143277986606861193083956860133585989289169583 * x^6 + -1864486580394996465489741449836563663994409492536051600134834361840588420617 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_val_a", degree_bound: None, hiding_bound: None }, polynomial: Dense( -7388904030749824121437948023048083725518449544490151754109999784583109804033 + -5216621364072103229097844243295217943742068404875615218583837989273113216577 * x + -4621170094823342510273827141369293299574797835657773012455583104231272527049 * x^2 + -5687778235000024379134399944827471129948704552686823558614478947543660052801 * x^3 + -1548815432602738584396258888679569764685655725629532596856522696922580653039 * x^4 + -1465547360285839166899874374629582608978486071994618692313526964257267073344 * x^5 + -3330033940680835632389615824466146272972895564530670292448361326097855493961 * x^6 + -7798893672357116985196606179522857762792679386475339515598287311523012362561 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_val_b", degree_bound: None, hiding_bound: None }, polynomial: Dense( -1055557718678546302920990016540578061139718603779085026158568926661987794944 + -4893075154770311893871354551704647518188801331256235099751877348234194208196 * x + -7388904030749824121217721821433853214953911918259805849443329273927733084161 * x^2 + -7798893672357116985196606179522857762792679386475339515598287311523012362561 * x^3 + -7388904030749824121327834922240968470236180731374978801776664529255421444097 * x^4 + -5524417450354827655838093472404404806241771238838927201641830167414833023480 * x^5 + -1055557718678546303031103117347693316421987416894257978491904181989676154880 * x^6 + -645568077071253439052218759258688768583219948678724312336946144394396876480 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_val_c", degree_bound: None, hiding_bound: None }, polynomial: Dense( -7635532887711920261900299707099791439085746072627443158625638531394185333240 + -5277788593392731515595967989966927603239012336931981701792861931259134214145 * x + -3083405083718739491707037938800208048841061410163032983266052068631403244882 * x^2 + -5277788593392731515485854889159812347956743523816808749459526675931445854209 * x^3 + -5031159736430635374472937701072528357978102930103652583277211652481928525321 * x^4 + -7388904030749824121217721821433853214953911918259805849443329273927733084161 * x^5 + -1138825790995445720417374530590565216846888257413998930701564659327301374639 * x^6 + -7388904030749824121327834922240968470236180731374978801776664529255421444097 * x^7) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_w_00000000", degree_bound: None, hiding_bound: None }, polynomial: Dense( -7388904030749824121217721821433853214953911918259805849443329273927733084181 + -4806631722464810378222418881252928774493289697365662880095775335672748770572 * x + -7388904030749824121217721821433853214953911918259805849443329273927733084148 * x^2 + -4153188583884023458610048797853002211921041294332568892204718936512234268619 * x^3) }, LabeledPolynomial { info: PolynomialInfo { label: "h_0", degree_bound: None, hiding_bound: None }, polynomial: Dense( -7388904030749824121217721821433853214953911918259805849443329273927733084164 + -2135176220032946734943829824459106118384054561849250372330716048683975588842 * x + -4754990573109988415472033418479071784044875994712276662893248150540227089791 * x^2 + -2758334532884618923758430413601802477377254380601541511107093225976782776983 * x^3 + -8095203738994452079955122826479915970380729551727226719303332837983196321727 * x^4 + -6177424990788360784192413675740409023496996883035955845846493361503576983134 * x^5 + -5094286905430846656542049153180259645877255793223574061499131126611824661186 * x^6) }, LabeledPolynomial { info: PolynomialInfo { label: "g_1", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( -5974345914549560103033582308151263484641427037487704144517576121295488858845 + -6423982794560526119074221387953887898954565066933229568346444819937716970457 * x + -2120676002619376729858633786571526313168838229349525391995933228272838676962 * x^2 + -2462614374069317334418967434622878426019913143043627098030446102824115060612 * x^3 + -2696135425592197752662144018877790534094198202759806306540770263373252887607 * x^4 + -6492382208137597381010080854760156942268920954235091389487817023309994519561 * x^5 + -6510132846304178680953376829648066706283820437200619761150059347877950898281 * x^6) }, LabeledPolynomial { info: PolynomialInfo { label: "h_1", degree_bound: None, hiding_bound: None }, polynomial: Dense( -8351678429524123697744791108744026615650857426644444914264554509840053299068 + -882757904246333115996356909608008750258024036554818968914961788900581058821 * x + -3652509220534331424025659478014673520129280056674528390212639700149995017556 * x^2 + -1113171752746309261273571144571937210400657000760635223960265520546329244022 * x^3 + -5906706731077809711728334099024878652604102381329916177877999445253998950459 * x^4 + -6949417586103650368715438986534204794257789969488785698982971398192494857128 * x^5 + -2112621320437559066535210341919245846284448704668054791300931702512147742786 * x^6) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_a_00000000", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( -7844304871421823466838270679790440827432596271487276197499864127661846898286 + -7522663449790382766222579422003068930939787648648211906083751707713038811961 * x + -1780748334196356345802500227978801204697882769810441173209564041968587494949 * x^2 + -6877202362108936959696644681497794375039094584195481541308391259545095731671 * x^3 + -7889164524323527432325505889877523994201610684953404629838480882509815561172 * x^4 + -7826819645647699241461445088798664846333198550213357571519093714404658297547 * x^5 + -2673733686020669043862015565486998137544260919904369503747348520072359178613 * x^6) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_b_00000000", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( -4190670298015087773819237795468172723622055061283114967763066452949593758705 + -2453405048514200725116368280360574217922444867402305833302185151259511193440 * x + -8018576275327694451802901757849011976315643238597500420667276070540917347175 * x^2 + -3173689231106838749558012166220351260675526913076332497211852656456102812277 * x^3 + -6171583627734917391067083923888669361212281851517705587316974743818412286693 * x^4 + -7997424924707964556490712179988382686650633297452534170397638078314154545672 * x^5 + -2436279881870478107836940463454131965518286801350704103424355433251187468924 * x^6) }, LabeledPolynomial { info: PolynomialInfo { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_c_00000000", degree_bound: Some(6), hiding_bound: None }, polynomial: Dense( -4043240184975125773810976862948473503372729933219551097386320710055097577718 + -1094113377560183698653838457833874020332158073478182568975084510142907263328 * x + -390957378899790921858187433391472829711103504010270521998757588895579512136 * x^2 + -3774780254310905978955693478260378915751756827336175981185540444268128892588 * x^3 + -8270437479517211430609496704059513599371337004018596736110745937723384957706 * x^4 + -3789787397912376427032463452073800854453100239468778710346779045322155222176 * x^5 + -1894921958146356403766806518813427767024082972732426515825228131388264736975 * x^6) }, LabeledPolynomial { info: PolynomialInfo { label: "h_2", degree_bound: None, hiding_bound: None }, polynomial: Dense( -246683914535431654764983727442266421709007221007139999260570684927136644873 + -7223651268159869699273760566653748336609154116540343407063815263531318975522 * x + -2556638500487170876744877949494599083513802937899218475101018920150719720635 * x^2 + -4318784164390785172608441604806503501280518910182710872998498823664704582567 * x^3 + -782199745360017309478759803832686999194112162677328406910612756250829022655 * x^4 + -5580075562519580619301859982355150529935712065449419392415303605654773194396 * x^5 + -3806343777551966164441807871035197664870983201510945893511753490375790831878 * x^6) }] - - -lc_s: {"circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_a_00000000": LinearCombination { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_a_00000000", terms: {circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_a_00000000: 1} }, "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_b_00000000": LinearCombination { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_b_00000000", terms: {circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_b_00000000: 1} }, "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_c_00000000": LinearCombination { label: "circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_c_00000000", terms: {circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_g_c_00000000: 1} }, "g_1": LinearCombination { label: "g_1", terms: {g_1: 1} }, "lineval_sumcheck": LinearCombination { label: "lineval_sumcheck", terms: {1: 1156305802723237075653362114544343316333995182452273842874300912447394619175, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_w_00000000: 6745347808261457907191764172559433261182535450059465541037316307780295086812, h_1: 8444461749428370424248824938781546531375899335154063827935233455862533365506} }, "matrix_sumcheck": LinearCombination { label: "matrix_sumcheck", terms: {1: 5536706007745249928246687487323369248256501388487501452854571704702365856175, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_col_a: 5686931832252555171553737565892221418053682028680052112792433915388780491606, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_col_b: 2840184156326269018820890025459642297781705021694987072933145857032328791514, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_col_c: 2352551498951970917578519487618203564239366555578613066877474705619913538517, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_a: 5686931832252555171553737565892221418053682028680052112792433915388780491606, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_b: 2840184156326269018820890025459642297781705021694987072933145857032328791514, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_c: 2352551498951970917578519487618203564239366555578613066877474705619913538517, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_a: 1276859780248223932974616463146998395793177968724372872679477268558220748389, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_b: 1406257401881236939917018624075751992169176923587330374491263089392604916575, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_c: 276905011385290886666832065961970134869842399071611398229898125013522531842, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_val_a: 66249952917044894716950, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_val_b: 66249952917044894716950, circuit_07717fcdeba543ba2faec8300ae92b2bd15c68eccf519d350da2cbb4865bdbc2_row_col_val_c: 66249952917044894716950, h_2: 8444461749428370424248824938781546531375899335154063827935233455862533365506} }, "rowcheck_zerocheck": LinearCombination { label: "rowcheck_zerocheck", terms: {1: 8335994047511480706634345235784004385061935445896950039370104976081595277929, h_0: 8444461749428370424248824938781546531375899335154063827935233455862533365506} }} diff --git a/algorithms/src/snark/varuna/resources/test_rounds/2nd/h_0.test_vector b/algorithms/src/snark/varuna/resources/test_rounds/2nd/h_0.test_vector deleted file mode 100644 index 85ad4e8fb6..0000000000 --- a/algorithms/src/snark/varuna/resources/test_rounds/2nd/h_0.test_vector +++ /dev/null @@ -1 +0,0 @@ -"7388904030749824121217721821433853214953911918259805849443329273927733084164,2135176220032946734943829824459106118384054561849250372330716048683975588842,4754990573109988415472033418479071784044875994712276662893248150540227089791,2758334532884618923758430413601802477377254380601541511107093225976782776983,8095203738994452079955122826479915970380729551727226719303332837983196321727,6177424990788360784192413675740409023496996883035955845846493361503576983134,5094286905430846656542049153180259645877255793223574061499131126611824661186," \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/test_rounds/3rd/g_1.test_vector b/algorithms/src/snark/varuna/resources/test_rounds/3rd/g_1.test_vector deleted file mode 100644 index 52a0f3ad1a..0000000000 --- a/algorithms/src/snark/varuna/resources/test_rounds/3rd/g_1.test_vector +++ /dev/null @@ -1 +0,0 @@ -“5974345914549560103033582308151263484641427037487704144517576121295488858845, 6423982794560526119074221387953887898954565066933229568346444819937716970457, 2120676002619376729858633786571526313168838229349525391995933228272838676962, 2462614374069317334418967434622878426019913143043627098030446102824115060612, 2696135425592197752662144018877790534094198202759806306540770263373252887607, 6492382208137597381010080854760156942268920954235091389487817023309994519561, 6510132846304178680953376829648066706283820437200619761150059347877950898281” \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/test_rounds/3rd/h_1.test_vector b/algorithms/src/snark/varuna/resources/test_rounds/3rd/h_1.test_vector deleted file mode 100644 index da7c141791..0000000000 --- a/algorithms/src/snark/varuna/resources/test_rounds/3rd/h_1.test_vector +++ /dev/null @@ -1 +0,0 @@ -"8351678429524123697744791108744026615650857426644444914264554509840053299068, 882757904246333115996356909608008750258024036554818968914961788900581058821, 3652509220534331424025659478014673520129280056674528390212639700149995017556, 1113171752746309261273571144571937210400657000760635223960265520546329244022, 5906706731077809711728334099024878652604102381329916177877999445253998950459, 6949417586103650368715438986534204794257789969488785698982971398192494857128, 2112621320437559066535210341919245846284448704668054791300931702512147742786" \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/test_rounds/4th/circuit_polynomials.test_vector b/algorithms/src/snark/varuna/resources/test_rounds/4th/circuit_polynomials.test_vector deleted file mode 100644 index 9598a7d621..0000000000 --- a/algorithms/src/snark/varuna/resources/test_rounds/4th/circuit_polynomials.test_vector +++ /dev/null @@ -1,3 +0,0 @@ -"7844304871421823466838270679790440827432596271487276197499864127661846898286, 7522663449790382766222579422003068930939787648648211906083751707713038811961, 1780748334196356345802500227978801204697882769810441173209564041968587494949, 6877202362108936959696644681497794375039094584195481541308391259545095731671, 7889164524323527432325505889877523994201610684953404629838480882509815561172, 7826819645647699241461445088798664846333198550213357571519093714404658297547, 2673733686020669043862015565486998137544260919904369503747348520072359178613" -"4190670298015087773819237795468172723622055061283114967763066452949593758705, 2453405048514200725116368280360574217922444867402305833302185151259511193440, 8018576275327694451802901757849011976315643238597500420667276070540917347175, 3173689231106838749558012166220351260675526913076332497211852656456102812277, 6171583627734917391067083923888669361212281851517705587316974743818412286693, 7997424924707964556490712179988382686650633297452534170397638078314154545672, 2436279881870478107836940463454131965518286801350704103424355433251187468924" -"4043240184975125773810976862948473503372729933219551097386320710055097577718, 1094113377560183698653838457833874020332158073478182568975084510142907263328, 390957378899790921858187433391472829711103504010270521998757588895579512136, 3774780254310905978955693478260378915751756827336175981185540444268128892588, 8270437479517211430609496704059513599371337004018596736110745937723384957706, 3789787397912376427032463452073800854453100239468778710346779045322155222176, 1894921958146356403766806518813427767024082972732426515825228131388264736975" \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/test_rounds/5th/h_1 b/algorithms/src/snark/varuna/resources/test_rounds/5th/h_1 deleted file mode 100644 index 33b8125233..0000000000 --- a/algorithms/src/snark/varuna/resources/test_rounds/5th/h_1 +++ /dev/null @@ -1 +0,0 @@ -"246683914535431654764983727442266421709007221007139999260570684927136644873, 7223651268159869699273760566653748336609154116540343407063815263531318975522, 2556638500487170876744877949494599083513802937899218475101018920150719720635, 4318784164390785172608441604806503501280518910182710872998498823664704582567, 782199745360017309478759803832686999194112162677328406910612756250829022655, 5580075562519580619301859982355150529935712065449419392415303605654773194396, 3806343777551966164441807871035197664870983201510945893511753490375790831878" \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/test_rounds/h_0.test_vector b/algorithms/src/snark/varuna/resources/test_rounds/h_0.test_vector deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/algorithms/src/snark/varuna/sage_test.rs b/algorithms/src/snark/varuna/sage_test.rs index ed5022e20d..d5d3872a97 100644 --- a/algorithms/src/snark/varuna/sage_test.rs +++ b/algorithms/src/snark/varuna/sage_test.rs @@ -15,20 +15,17 @@ #[cfg(test)] mod tests { use crate::{ - snark::varuna::{ahp::verifier, TestCircuit, VarunaNonHidingMode, VarunaSNARK}, + fft::EvaluationDomain, + snark::varuna::{ahp::verifier, AHPForR1CS, TestCircuit, VarunaNonHidingMode, VarunaSNARK}, traits::snark::SNARK, }; use snarkvm_curves::bls12_377::{Bls12_377, Fq, Fr}; use snarkvm_fields::One; - use std::ops::Deref; + use std::{collections::BTreeMap, fmt::Debug, fs, ops::Deref, path::PathBuf, str::FromStr, sync::Arc}; + type FS = crate::crypto_hash::PoseidonSponge; type MM = VarunaNonHidingMode; type VarunaSonicInst = VarunaSNARK; - use crate::snark::varuna::AHPForR1CS; - use std::{fmt::Debug, fs, str::FromStr}; - - use crate::fft::EvaluationDomain; - use std::{collections::BTreeMap, path::PathBuf, sync::Arc}; /// Returns the path to the `resources` folder for this module. fn resources_path() -> PathBuf { @@ -53,6 +50,7 @@ mod tests { // Construct the path for the test folder. let mut path = resources_path(); path.push(test_folder.into()); + path.push("polynomials"); // Create the test folder, if it does not exist. if !path.exists() { @@ -61,7 +59,7 @@ mod tests { // Construct the path for the test file. path.push(test_file.into()); - path.set_extension("test_vector"); + path.set_extension("snap"); // Create the test file, if it does not exist. if !path.exists() { @@ -72,9 +70,40 @@ mod tests { expect_test::expect_file![path].assert_eq(&format!("{candidate:?}")); } - // TODO: make macros to use different hiding modes + fn create_test_vector(folder: &str, file: &str, data: &str) { + // Construct the path for the test folder. + let mut path = resources_path(); + path.push(folder); + + // Create the test folder, if it does not exist. + if !path.exists() { + std::fs::create_dir(&path).unwrap_or_else(|_| panic!("Failed to create test folder: {path:?}")); + } + + // Construct the path for the test file. + path.push(file); + path.set_extension("snap"); + + // Create the test file, if it does not exist. + if !path.exists() { + std::fs::File::create(&path).unwrap_or_else(|_| panic!("Failed to create file: {path:?}")); + } + + std::fs::write(&path, data).unwrap_or_else(|_| panic!("Failed to write to file: {:?}", path)); + } + + #[test] + fn test_proving_system_with_test_vectors() { + run_prover_sage_vectors(false); + } + #[test] - fn test_prover_sage_vectors() { + fn create_prover_test_vectors() { + run_prover_sage_vectors(true); + } + + // TODO: make macros to use different hiding modes + fn run_prover_sage_vectors(create_test_vectors: bool) { let input_path = "src/snark/varuna/resources/inputs.txt"; let test_vectors_file = fs::read_to_string(input_path).expect("Could not read the file"); let mut test_vectors = Vec::new(); // TODO: preallocate @@ -103,51 +132,28 @@ mod tests { let mut random_state = vec![0u64; 100]; let add_f_to_state = |s: &mut Vec, f: Fp256| { // Fp384 field elements sample 6 u64 values in total - for i in 0..f.0.0.len() { - s.push(f.0.0[f.0.0.len() - 1 - i]); + for i in 0..f.0 .0.len() { + s.push(f.0 .0[f.0 .0.len() - 1 - i]); } }; - for witness in instance[15].split(",") { + for witness in instance[15].split(',') { println!("witness: {}", witness.trim()); if witness.trim() == "" { continue; } add_f_to_state(&mut random_state, Fr::from_str(witness.trim()).unwrap()); } - // let two = Fq::from_str("2").unwrap(); - // add_f_to_state(&mut random_state, 2u64); - // random_state.push(79601084644714804u64); - // random_state.push(11090443381845330384u64); - // random_state.push(17770411857874044427u64); - // random_state.push(4538334656037814244u64); - // random_state.push(11709709805437321058u64); - // random_state.push(404198066556501712u64); let rng = &mut snarkvm_utilities::rand::TestMockRng::fixed(random_state); - // let test = Fq::from_str("8").unwrap(); - // println!("test: {:?}", test.0.0); - - // let a = Fq::rand(rng); - // println!("a: {:?}", a); - // println!("a: {:?}", a.0.0[0]); - // println!("a: {:?}", a.0.0[1]); - // println!("a: {:?}", a.0.0[2]); - // println!("a: {:?}", a.0.0[3]); - // println!("a: {:?}", a.0.0[4]); - // println!("a: {:?}", a.0.0[5]); - // let a = Fq::rand(rng); - // println!("a: {:?}", a); - let max_degree = AHPForR1CS::::max_degree(100, 25, 300).unwrap(); let universal_srs = VarunaSonicInst::universal_setup(max_degree).unwrap(); let mul_depth = 3; let num_constraints = 7; let num_variables = 7; + // TODO: pass the right randomness in - let (circ, public_inputs) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); - println!("public_inputs: {:?}", public_inputs); - println!("circ: {:?}", circ); + let (circ, _) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); let (index_pk, _index_vk) = VarunaSonicInst::circuit_setup(&universal_srs, &circ).unwrap(); let mut keys_to_constraints = BTreeMap::new(); keys_to_constraints.insert(index_pk.circuit.deref(), std::slice::from_ref(&circ)); @@ -155,69 +161,120 @@ mod tests { let prover_state = AHPForR1CS::<_, MM>::init_prover(&keys_to_constraints, rng).unwrap(); let prover_state = AHPForR1CS::<_, MM>::prover_first_round(prover_state, rng).unwrap(); let first_round_oracles = Arc::clone(prover_state.first_round_oracles.as_ref().unwrap()); - println!("first_round_oracles: {:?}", first_round_oracles); - + println!("first_round_oracles: {:?}\n", first_round_oracles); + first_round_oracles.batches.iter().enumerate().for_each(|(circuit_index, (_, w_polys))| { + w_polys.iter().enumerate().for_each(|(witness_index, w_poly)| { + create_test_vector( + "polynomials", + &format!("circuit_{}_w_lde_{}", circuit_index, witness_index), + &format!("{:?}", w_poly.0.coeffs().map(|(_, coeff)| coeff).collect::>()), + ); + }); + }); + + // Generate test vectors from assignments let assignments = AHPForR1CS::<_, MM>::calculate_assignments(&prover_state).unwrap(); + + if create_test_vectors { + assignments.iter().enumerate().for_each(|(circuit_index, (_, z_polys))| { + z_polys.iter().enumerate().for_each(|(witness_index, z_poly)| { + create_test_vector( + "polynomials", + &format!("circuit_{}_z_lde_{}", circuit_index, witness_index), + &format!("{:?}", z_poly.coeffs().iter().collect::>()), + ) + }); + }); + } + let constraint_domain = EvaluationDomain::::new(num_constraints).unwrap(); - println!("assignments: {:?}", assignments); - println!("generator of H: {:?}", constraint_domain.group_gen); - for el in constraint_domain.elements() { - println!("element of H: {:?}", el); + let mut constraint_domain_elements = Vec::with_capacity(constraint_domain.size()); + + if create_test_vectors { + for el in constraint_domain.elements() { + constraint_domain_elements.push(el); + } + create_test_vector("domain", "H", &format!("{:?}", constraint_domain_elements)); } + let non_zero_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_a).unwrap(); - println!("generator of K: {:?}", non_zero_domain.group_gen); - for el in non_zero_domain.elements() { - println!("element of K: {:?}", el); + + if create_test_vectors { + for el in non_zero_domain.elements() { + constraint_domain_elements.push(el); + } + create_test_vector("domain", "K", &format!("{:?}", constraint_domain_elements)); } let combiners = verifier::BatchCombiners:: { circuit_combiner, instance_combiners }; let batch_combiners = BTreeMap::from_iter([(index_pk.circuit.id, combiners)]); let verifier_first_msg = verifier::FirstMessage:: { batch_combiners }; - println!("verifier_first_msg: {:?}", verifier_first_msg); let (second_oracles, prover_state) = AHPForR1CS::<_, MM>::prover_second_round(&verifier_first_msg, prover_state).unwrap(); - println!("second_oracles: {:?}", second_oracles); + + let h_0 = format!("{:?}", second_oracles.h_0.coeffs().map(|(_, coeff)| coeff).collect::>()); + if create_test_vectors { + create_test_vector("polynomials", "h_0", &h_0); + } // TODO: hardcoding for testing purposes - let alpha = Fr::from_str("22").unwrap(); - let eta_b = Fr::from_str("22").unwrap(); - let eta_c = Fr::from_str("22").unwrap(); - let beta = Fr::from_str("22").unwrap(); - let delta_a = vec![Fr::from_str("22").unwrap()]; - let delta_b = vec![Fr::from_str("22").unwrap()]; - let delta_c = vec![Fr::from_str("22").unwrap()]; - let gamma = Fr::from_str("22").unwrap(); + let alpha = + Fr::from_str("3848747268438146429751199396409351181775389242768022193485885831738448017147").unwrap(); + let eta_b = + Fr::from_str("8197944265508088395536605774074305135172727109973647025295290482999689956740").unwrap(); + let eta_c = + Fr::from_str("969057258436037177120044092706484307847087860293738150232755543560372962965").unwrap(); + let beta = + Fr::from_str("1261454636320080423466301508402274008580035865105120100172548996301504688503").unwrap(); + let delta_a = vec![Fr::from_str("1").unwrap()]; + let delta_b = + vec![Fr::from_str("4987583518937978349829618221849930643691403053432331091973338029344238378359").unwrap()]; + let delta_c = + vec![Fr::from_str("5292820491592383411924896857610185298390500160570506754003580089093852949536").unwrap()]; + let gamma = + Fr::from_str("672738024541753390172108082983901395072703770443783662610485842877496432861").unwrap(); let verifier_second_msg = verifier::SecondMessage:: { alpha, eta_b, eta_c }; let (prover_third_message, third_oracles, prover_state) = AHPForR1CS::<_, MM>::prover_third_round(&verifier_first_msg, &verifier_second_msg, prover_state, rng) .unwrap(); - println!("\n"); - println!("prover_third_message\n:{:?}", prover_third_message); - println!("\n"); - println!("third_oracles g1 polynomial\n:{:?}", third_oracles.g_1); - println!("\n"); - println!("third_oracles h1 polynomial\n:{:?}", third_oracles.h_1); - println!("\n"); - - let verifier_third_msg = verifier::ThirdMessage:: { beta }; + let g_1 = format!("{:?}", third_oracles.g_1.coeffs().map(|(_, coeff)| coeff).collect::>()); + if create_test_vectors { + create_test_vector("polynomials", "g_1", &g_1); + } - println!("verifier_third_msg\n:{:?}", verifier_third_msg); - println!("\n"); + let h_1 = format!("{:?}", third_oracles.h_1.coeffs().map(|(_, coeff)| coeff).collect::>()); + if create_test_vectors { + create_test_vector("polynomials", "h_1", &h_1); + } + let verifier_third_msg = verifier::ThirdMessage:: { beta }; let (prover_fourth_message, fourth_oracles, prover_state) = AHPForR1CS::<_, MM>::prover_fourth_round(&verifier_second_msg, &verifier_third_msg, prover_state, rng) .unwrap(); - println!("prover_fourth_message: {:?}", prover_fourth_message); - println!("\n"); - println!("fourth_oracles\n:{:?}", fourth_oracles); - println!("\n"); + if create_test_vectors { + fourth_oracles.gs.iter().enumerate().for_each(|(circuit_index, (_, gm_polys))| { + create_test_vector( + "polynomials", + &format!("circuit_{}_g_a", circuit_index), + &format!("{:?}", gm_polys.g_a.coeffs().map(|(_, coeff)| coeff).collect::>()), + ); + create_test_vector( + "polynomials", + &format!("circuit_{}_g_b", circuit_index), + &format!("{:?}", gm_polys.g_b.coeffs().map(|(_, coeff)| coeff).collect::>()), + ); + create_test_vector( + "polynomials", + &format!("circuit_{}_g_C", circuit_index), + &format!("{:?}", gm_polys.g_c.coeffs().map(|(_, coeff)| coeff).collect::>()), + ); + }); + } let verifier_fourth_msg = verifier::FourthMessage:: { delta_a, delta_b, delta_c }; - println!("verifier_fourth_msg\n:{:?}", verifier_fourth_msg); - println!("\n"); let mut public_inputs = BTreeMap::new(); let public_input = prover_state.public_inputs(&index_pk.circuit).unwrap(); @@ -232,9 +289,10 @@ mod tests { let fifth_oracles = AHPForR1CS::<_, MM>::prover_fifth_round(verifier_fourth_msg.clone(), prover_state, rng).unwrap(); - println!("fifth_oracles\n:{:?}", fifth_oracles); - println!("\n"); - println!("fifth_oracles h_2polynomial\n:{:?}", fifth_oracles.h_2); + let h_2 = format!("{:?}", fifth_oracles.h_2.coeffs().map(|(_, coeff)| coeff).collect::>()); + if create_test_vectors { + create_test_vector("polynomials", "h_2", &h_2); + } use std::marker::PhantomData; let mut circuit_specific_states = BTreeMap::new(); @@ -272,9 +330,6 @@ mod tests { .chain(fifth_oracles.iter()) .collect(); - println!("polynomials: {:?}", polynomials); - println!("\n"); - let _lc_s = AHPForR1CS::<_, MM>::construct_linear_combinations( &public_inputs, &polynomials, @@ -284,17 +339,11 @@ mod tests { ) .unwrap(); - println!("lc_s: {:?}", _lc_s); - println!("\n"); - - // TODO: I can save space by using bytes instead of number characters, and allocating the right amount immediately - let mut h_0 = String::new(); - for coeff in second_oracles.h_0.coeffs() { - h_0 += &coeff.1.to_string(); - h_0 += ","; - } - assert_snapshot("test_rounds", "h_0", h_0); + assert_snapshot("polynomials", "h_0", h_0); + assert_snapshot("polynomials", "h_1", h_1); + assert_snapshot("polynomials", "g_1", g_1); + assert_snapshot("polynomials", "h_2", h_2); - // TODO: check all oracles + // TODO: check round 1 & round 4 oracles } } From 8f8ab14d94d5159e892a2d90454db15b580ef290 Mon Sep 17 00:00:00 2001 From: Michael Turner Date: Wed, 27 Sep 2023 22:40:16 +0200 Subject: [PATCH 014/339] Check all polynomials and domains match the test vectors --- .../varuna/resources/domain/{H.snap => C.txt} | 0 .../src/snark/varuna/resources/domain/K.snap | 1 - .../src/snark/varuna/resources/domain/K.txt | 1 + .../src/snark/varuna/resources/domain/R.txt | 1 + .../resources/polynomials/circuit_0_g_C.snap | 1 - .../polynomials/{g_1.snap => g_1.txt} | 0 .../{circuit_0_g_a.snap => g_a.txt} | 0 .../{circuit_0_g_b.snap => g_b.txt} | 0 .../varuna/resources/polynomials/g_c.txt | 1 + .../polynomials/{h_0.snap => h_0.txt} | 0 .../polynomials/{h_1.snap => h_1.txt} | 0 .../polynomials/{h_2.snap => h_2.txt} | 0 .../polynomials/polynomials/h_0.snap | 0 .../{circuit_0_w_lde_0.snap => w_lde.txt} | 0 .../{circuit_0_z_lde_0.snap => z_lde.txt} | 0 algorithms/src/snark/varuna/sage_test.rs | 167 +++++++++--------- 16 files changed, 90 insertions(+), 82 deletions(-) rename algorithms/src/snark/varuna/resources/domain/{H.snap => C.txt} (100%) delete mode 100644 algorithms/src/snark/varuna/resources/domain/K.snap create mode 100644 algorithms/src/snark/varuna/resources/domain/K.txt create mode 100644 algorithms/src/snark/varuna/resources/domain/R.txt delete mode 100644 algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_C.snap rename algorithms/src/snark/varuna/resources/polynomials/{g_1.snap => g_1.txt} (100%) rename algorithms/src/snark/varuna/resources/polynomials/{circuit_0_g_a.snap => g_a.txt} (100%) rename algorithms/src/snark/varuna/resources/polynomials/{circuit_0_g_b.snap => g_b.txt} (100%) create mode 100644 algorithms/src/snark/varuna/resources/polynomials/g_c.txt rename algorithms/src/snark/varuna/resources/polynomials/{h_0.snap => h_0.txt} (100%) rename algorithms/src/snark/varuna/resources/polynomials/{h_1.snap => h_1.txt} (100%) rename algorithms/src/snark/varuna/resources/polynomials/{h_2.snap => h_2.txt} (100%) delete mode 100644 algorithms/src/snark/varuna/resources/polynomials/polynomials/h_0.snap rename algorithms/src/snark/varuna/resources/polynomials/{circuit_0_w_lde_0.snap => w_lde.txt} (100%) rename algorithms/src/snark/varuna/resources/polynomials/{circuit_0_z_lde_0.snap => z_lde.txt} (100%) diff --git a/algorithms/src/snark/varuna/resources/domain/H.snap b/algorithms/src/snark/varuna/resources/domain/C.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/domain/H.snap rename to algorithms/src/snark/varuna/resources/domain/C.txt diff --git a/algorithms/src/snark/varuna/resources/domain/K.snap b/algorithms/src/snark/varuna/resources/domain/K.snap deleted file mode 100644 index f9ee0021fe..0000000000 --- a/algorithms/src/snark/varuna/resources/domain/K.snap +++ /dev/null @@ -1 +0,0 @@ -[1, 3279917132858342911831074864712036382710139745724269329239664300762234227201, 880904806456922042258150504921383618666682042621506879489, 1973030855696769125460623085327505793054673234941098473458474059731617992635, 8444461749428370424248824938781546531375899335154063827935233455917409239040, 5164544616570027512417750074069510148665759589429794498695569155155175011840, 8444461749428370423367920132324624489117748830232680209268551413295902359552, 6471430893731601298788201853454040738321226100212965354476759396185791246406, 1, 3279917132858342911831074864712036382710139745724269329239664300762234227201, 880904806456922042258150504921383618666682042621506879489, 1973030855696769125460623085327505793054673234941098473458474059731617992635, 8444461749428370424248824938781546531375899335154063827935233455917409239040, 5164544616570027512417750074069510148665759589429794498695569155155175011840, 8444461749428370423367920132324624489117748830232680209268551413295902359552, 6471430893731601298788201853454040738321226100212965354476759396185791246406] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/domain/K.txt b/algorithms/src/snark/varuna/resources/domain/K.txt new file mode 100644 index 0000000000..4fee833f10 --- /dev/null +++ b/algorithms/src/snark/varuna/resources/domain/K.txt @@ -0,0 +1 @@ +[1, 3279917132858342911831074864712036382710139745724269329239664300762234227201, 880904806456922042258150504921383618666682042621506879489, 1973030855696769125460623085327505793054673234941098473458474059731617992635, 8444461749428370424248824938781546531375899335154063827935233455917409239040, 5164544616570027512417750074069510148665759589429794498695569155155175011840, 8444461749428370423367920132324624489117748830232680209268551413295902359552, 6471430893731601298788201853454040738321226100212965354476759396185791246406] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/domain/R.txt b/algorithms/src/snark/varuna/resources/domain/R.txt new file mode 100644 index 0000000000..4fee833f10 --- /dev/null +++ b/algorithms/src/snark/varuna/resources/domain/R.txt @@ -0,0 +1 @@ +[1, 3279917132858342911831074864712036382710139745724269329239664300762234227201, 880904806456922042258150504921383618666682042621506879489, 1973030855696769125460623085327505793054673234941098473458474059731617992635, 8444461749428370424248824938781546531375899335154063827935233455917409239040, 5164544616570027512417750074069510148665759589429794498695569155155175011840, 8444461749428370423367920132324624489117748830232680209268551413295902359552, 6471430893731601298788201853454040738321226100212965354476759396185791246406] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_C.snap b/algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_C.snap deleted file mode 100644 index 5f89ae6a1d..0000000000 --- a/algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_C.snap +++ /dev/null @@ -1 +0,0 @@ -[430880258510547293498955878432749658772712640247917521565517069504460623156, 4200473474457187423764559025311252880903424553691876396667558162214558273961, 661445282688702714353833492748236589095252619050348777778477928896317107273, 5175393828487391934966510003107270767899141347257027196219188699521911038989, 2122243699759976117567014203687023024763017215761771680281324936505463399457, 375703067937610614092324366598075959564740793008485371369026715321355794063, 3503617345868455471058115121882953107383505289696645564542071124216162786942] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/polynomials/g_1.snap b/algorithms/src/snark/varuna/resources/polynomials/g_1.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/g_1.snap rename to algorithms/src/snark/varuna/resources/polynomials/g_1.txt diff --git a/algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_a.snap b/algorithms/src/snark/varuna/resources/polynomials/g_a.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_a.snap rename to algorithms/src/snark/varuna/resources/polynomials/g_a.txt diff --git a/algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_b.snap b/algorithms/src/snark/varuna/resources/polynomials/g_b.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/circuit_0_g_b.snap rename to algorithms/src/snark/varuna/resources/polynomials/g_b.txt diff --git a/algorithms/src/snark/varuna/resources/polynomials/g_c.txt b/algorithms/src/snark/varuna/resources/polynomials/g_c.txt new file mode 100644 index 0000000000..5bd1204a5c --- /dev/null +++ b/algorithms/src/snark/varuna/resources/polynomials/g_c.txt @@ -0,0 +1 @@ +[5156102875137215468349822857341787486070810620190600082313993541539039694040, 642243162042132842519243997058576263060505644548708158364282235038668235582, 4232914989795410755789500032792636846277428417456597259068424201075935215723, 5294805659491479092801660967840299543626893059046679165413663075966109761338, 4428888977080738940451109661040008630918481794519438117648033775895551925110, 4353953527706377329056342142048774285909447424786294362569762658050561552035, 3147342381590763655483856523901415730605847626281467108012225760335596205826] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/polynomials/h_0.snap b/algorithms/src/snark/varuna/resources/polynomials/h_0.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/h_0.snap rename to algorithms/src/snark/varuna/resources/polynomials/h_0.txt diff --git a/algorithms/src/snark/varuna/resources/polynomials/h_1.snap b/algorithms/src/snark/varuna/resources/polynomials/h_1.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/h_1.snap rename to algorithms/src/snark/varuna/resources/polynomials/h_1.txt diff --git a/algorithms/src/snark/varuna/resources/polynomials/h_2.snap b/algorithms/src/snark/varuna/resources/polynomials/h_2.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/h_2.snap rename to algorithms/src/snark/varuna/resources/polynomials/h_2.txt diff --git a/algorithms/src/snark/varuna/resources/polynomials/polynomials/h_0.snap b/algorithms/src/snark/varuna/resources/polynomials/polynomials/h_0.snap deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/algorithms/src/snark/varuna/resources/polynomials/circuit_0_w_lde_0.snap b/algorithms/src/snark/varuna/resources/polynomials/w_lde.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/circuit_0_w_lde_0.snap rename to algorithms/src/snark/varuna/resources/polynomials/w_lde.txt diff --git a/algorithms/src/snark/varuna/resources/polynomials/circuit_0_z_lde_0.snap b/algorithms/src/snark/varuna/resources/polynomials/z_lde.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/circuit_0_z_lde_0.snap rename to algorithms/src/snark/varuna/resources/polynomials/z_lde.txt diff --git a/algorithms/src/snark/varuna/sage_test.rs b/algorithms/src/snark/varuna/sage_test.rs index d5d3872a97..06dc7b2808 100644 --- a/algorithms/src/snark/varuna/sage_test.rs +++ b/algorithms/src/snark/varuna/sage_test.rs @@ -19,9 +19,9 @@ mod tests { snark::varuna::{ahp::verifier, AHPForR1CS, TestCircuit, VarunaNonHidingMode, VarunaSNARK}, traits::snark::SNARK, }; - use snarkvm_curves::bls12_377::{Bls12_377, Fq, Fr}; - use snarkvm_fields::One; - use std::{collections::BTreeMap, fmt::Debug, fs, ops::Deref, path::PathBuf, str::FromStr, sync::Arc}; + use snarkvm_curves::bls12_377::{Bls12_377, Fq, Fr, FrParameters}; + use snarkvm_fields::{Fp256, One}; + use std::{collections::BTreeMap, fs, ops::Deref, path::PathBuf, str::FromStr, sync::Arc}; type FS = crate::crypto_hash::PoseidonSponge; type MM = VarunaNonHidingMode; @@ -46,11 +46,10 @@ mod tests { /// Loads the given `test_folder/test_file` and asserts the given `candidate` matches the expected values. #[track_caller] - fn assert_snapshot, S2: Into, C: Debug>(test_folder: S1, test_file: S2, candidate: C) { + fn assert_snapshot, S2: Into>(test_folder: S1, test_file: S2, candidate: &str) { // Construct the path for the test folder. let mut path = resources_path(); path.push(test_folder.into()); - path.push("polynomials"); // Create the test folder, if it does not exist. if !path.exists() { @@ -59,15 +58,17 @@ mod tests { // Construct the path for the test file. path.push(test_file.into()); - path.set_extension("snap"); + path.set_extension("txt"); // Create the test file, if it does not exist. if !path.exists() { - std::fs::File::create(&path).unwrap_or_else(|_| panic!("Failed to create file: {path:?}")); + panic!("Test file does not exist: {path:?}"); } + println!("Testing path: {:?}", path); + // Assert the test file is equal to the expected value. - expect_test::expect_file![path].assert_eq(&format!("{candidate:?}")); + expect_test::expect_file![path].assert_eq(candidate); } fn create_test_vector(folder: &str, file: &str, data: &str) { @@ -82,7 +83,7 @@ mod tests { // Construct the path for the test file. path.push(file); - path.set_extension("snap"); + path.set_extension("txt"); // Create the test file, if it does not exist. if !path.exists() { @@ -98,6 +99,7 @@ mod tests { } #[test] + #[ignore] fn create_prover_test_vectors() { run_prover_sage_vectors(true); } @@ -127,17 +129,14 @@ mod tests { let circuit_combiner = Fr::one(); let instance_combiners = vec![Fr::one()]; - use snarkvm_curves::bls12_377::FrParameters; - use snarkvm_fields::Fp256; let mut random_state = vec![0u64; 100]; let add_f_to_state = |s: &mut Vec, f: Fp256| { - // Fp384 field elements sample 6 u64 values in total - for i in 0..f.0 .0.len() { - s.push(f.0 .0[f.0 .0.len() - 1 - i]); + // Fp384 field elements sample 6 u64 values in total. + for i in 0..f.0.0.len() { + s.push(f.0.0[f.0.0.len() - 1 - i]); } }; for witness in instance[15].split(',') { - println!("witness: {}", witness.trim()); if witness.trim() == "" { continue; } @@ -161,49 +160,24 @@ mod tests { let prover_state = AHPForR1CS::<_, MM>::init_prover(&keys_to_constraints, rng).unwrap(); let prover_state = AHPForR1CS::<_, MM>::prover_first_round(prover_state, rng).unwrap(); let first_round_oracles = Arc::clone(prover_state.first_round_oracles.as_ref().unwrap()); - println!("first_round_oracles: {:?}\n", first_round_oracles); - first_round_oracles.batches.iter().enumerate().for_each(|(circuit_index, (_, w_polys))| { - w_polys.iter().enumerate().for_each(|(witness_index, w_poly)| { - create_test_vector( - "polynomials", - &format!("circuit_{}_w_lde_{}", circuit_index, witness_index), - &format!("{:?}", w_poly.0.coeffs().map(|(_, coeff)| coeff).collect::>()), - ); - }); - }); - - // Generate test vectors from assignments - let assignments = AHPForR1CS::<_, MM>::calculate_assignments(&prover_state).unwrap(); + // Get private witness polynomial coefficients. + // TODO: Support batched circuits + let (_, w_poly) = first_round_oracles.batches.iter().next().unwrap(); + let w_lde = format!("{:?}", w_poly[0].0.coeffs().map(|(_, coeff)| coeff).collect::>()); if create_test_vectors { - assignments.iter().enumerate().for_each(|(circuit_index, (_, z_polys))| { - z_polys.iter().enumerate().for_each(|(witness_index, z_poly)| { - create_test_vector( - "polynomials", - &format!("circuit_{}_z_lde_{}", circuit_index, witness_index), - &format!("{:?}", z_poly.coeffs().iter().collect::>()), - ) - }); - }); + create_test_vector("polynomials", "w_lde", &w_lde); } - let constraint_domain = EvaluationDomain::::new(num_constraints).unwrap(); - let mut constraint_domain_elements = Vec::with_capacity(constraint_domain.size()); - - if create_test_vectors { - for el in constraint_domain.elements() { - constraint_domain_elements.push(el); - } - create_test_vector("domain", "H", &format!("{:?}", constraint_domain_elements)); - } - - let non_zero_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_a).unwrap(); + // Generate test vectors from assignments. + let assignments = AHPForR1CS::<_, MM>::calculate_assignments(&prover_state).unwrap(); + // Get full witness polynomial coefficients. + // TODO: Support batched circuits + let (_, z_poly) = assignments.iter().next().unwrap(); + let z_lde = format!("{:?}", z_poly[0].coeffs().iter().collect::>()); if create_test_vectors { - for el in non_zero_domain.elements() { - constraint_domain_elements.push(el); - } - create_test_vector("domain", "K", &format!("{:?}", constraint_domain_elements)); + create_test_vector("polynomials", "z_lde", &z_lde); } let combiners = verifier::BatchCombiners:: { circuit_combiner, instance_combiners }; @@ -213,6 +187,7 @@ mod tests { let (second_oracles, prover_state) = AHPForR1CS::<_, MM>::prover_second_round(&verifier_first_msg, prover_state).unwrap(); + // Get round 2 rowcheck polynomial oracle coefficients. let h_0 = format!("{:?}", second_oracles.h_0.coeffs().map(|(_, coeff)| coeff).collect::>()); if create_test_vectors { create_test_vector("polynomials", "h_0", &h_0); @@ -239,11 +214,11 @@ mod tests { AHPForR1CS::<_, MM>::prover_third_round(&verifier_first_msg, &verifier_second_msg, prover_state, rng) .unwrap(); + // Get coefficients round 3 univariate rowcheck polynomial oracles. let g_1 = format!("{:?}", third_oracles.g_1.coeffs().map(|(_, coeff)| coeff).collect::>()); if create_test_vectors { create_test_vector("polynomials", "g_1", &g_1); } - let h_1 = format!("{:?}", third_oracles.h_1.coeffs().map(|(_, coeff)| coeff).collect::>()); if create_test_vectors { create_test_vector("polynomials", "h_1", &h_1); @@ -254,26 +229,19 @@ mod tests { AHPForR1CS::<_, MM>::prover_fourth_round(&verifier_second_msg, &verifier_third_msg, prover_state, rng) .unwrap(); + // Create round 4 rational sumcheck oracle polynomials. + // TODO: Provide support for batched circuits + let (_, gm_polys) = fourth_oracles.gs.iter().next().unwrap(); + let g_a = format!("{:?}", gm_polys.g_a.coeffs().map(|(_, coeff)| coeff).collect::>()); + let g_b = format!("{:?}", gm_polys.g_b.coeffs().map(|(_, coeff)| coeff).collect::>()); + let g_c = format!("{:?}", gm_polys.g_b.coeffs().map(|(_, coeff)| coeff).collect::>()); if create_test_vectors { - fourth_oracles.gs.iter().enumerate().for_each(|(circuit_index, (_, gm_polys))| { - create_test_vector( - "polynomials", - &format!("circuit_{}_g_a", circuit_index), - &format!("{:?}", gm_polys.g_a.coeffs().map(|(_, coeff)| coeff).collect::>()), - ); - create_test_vector( - "polynomials", - &format!("circuit_{}_g_b", circuit_index), - &format!("{:?}", gm_polys.g_b.coeffs().map(|(_, coeff)| coeff).collect::>()), - ); - create_test_vector( - "polynomials", - &format!("circuit_{}_g_C", circuit_index), - &format!("{:?}", gm_polys.g_c.coeffs().map(|(_, coeff)| coeff).collect::>()), - ); - }); + create_test_vector("polynomials", "g_a", &g_a); + create_test_vector("polynomials", "g_b", &g_b); + create_test_vector("polynomials", "g_c", &g_c); } + // Create the verifier's fourth message. let verifier_fourth_msg = verifier::FourthMessage:: { delta_a, delta_b, delta_c }; let mut public_inputs = BTreeMap::new(); @@ -286,15 +254,46 @@ mod tests { let constraint_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_constraints).unwrap(); let input_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_public_inputs).unwrap(); + // Get constraint domain elements. + let mut constraint_domain_elements = Vec::with_capacity(constraint_domain.size()); + for el in constraint_domain.elements() { + constraint_domain_elements.push(el); + } + if create_test_vectors { + create_test_vector("domain", "R", &format!("{:?}", constraint_domain_elements)); + } + + // Get non_zero_domain elements. + let non_zero_domain = *[&non_zero_a_domain, &non_zero_b_domain, &non_zero_c_domain] + .iter() + .max_by_key(|domain| domain.size) + .unwrap(); + let mut non_zero_domain_elements = Vec::with_capacity(non_zero_domain.size()); + for el in non_zero_domain.elements() { + non_zero_domain_elements.push(el); + } + if create_test_vectors { + create_test_vector("domain", "K", &format!("{:?}", constraint_domain_elements)); + } + + // Get variable domain elements. + let mut variable_domain_elements = Vec::with_capacity(input_domain.size()); + for el in variable_domain.elements() { + variable_domain_elements.push(el); + } + if create_test_vectors { + create_test_vector("domain", "C", &format!("{:?}", constraint_domain_elements)); + } + let fifth_oracles = AHPForR1CS::<_, MM>::prover_fifth_round(verifier_fourth_msg.clone(), prover_state, rng).unwrap(); + // Get coefficients of final oracle polynomial from round 5. let h_2 = format!("{:?}", fifth_oracles.h_2.coeffs().map(|(_, coeff)| coeff).collect::>()); if create_test_vectors { create_test_vector("polynomials", "h_2", &h_2); } - use std::marker::PhantomData; let mut circuit_specific_states = BTreeMap::new(); let circuit_specific_state = verifier::CircuitSpecificState { input_domain, @@ -310,15 +309,14 @@ mod tests { circuit_specific_states, max_constraint_domain: constraint_domain, max_variable_domain: variable_domain, - max_non_zero_domain: non_zero_domain, // TODO: currently assuming same for three matrices but we should take the max + max_non_zero_domain: *non_zero_domain, first_round_message: Some(verifier_first_msg), second_round_message: Some(verifier_second_msg), third_round_message: Some(verifier_third_msg), fourth_round_message: Some(verifier_fourth_msg), gamma: Some(gamma), - mode: PhantomData, + mode: std::marker::PhantomData, }; - println!("verifier_state: {:?}", verifier_state); let polynomials: Vec<_> = index_pk .circuit @@ -339,11 +337,20 @@ mod tests { ) .unwrap(); - assert_snapshot("polynomials", "h_0", h_0); - assert_snapshot("polynomials", "h_1", h_1); - assert_snapshot("polynomials", "g_1", g_1); - assert_snapshot("polynomials", "h_2", h_2); - - // TODO: check round 1 & round 4 oracles + // Check the intermediate oracle polynomials against the test vectors. + assert_snapshot("polynomials", "w_lde", &w_lde); + assert_snapshot("polynomials", "z_lde", &z_lde); + assert_snapshot("polynomials", "h_0", &h_0); + assert_snapshot("polynomials", "h_1", &h_1); + assert_snapshot("polynomials", "g_1", &g_1); + assert_snapshot("polynomials", "h_2", &h_2); + assert_snapshot("polynomials", "g_a", &g_a); + assert_snapshot("polynomials", "g_b", &g_b); + assert_snapshot("polynomials", "g_c", &g_c); + + // Check that the domains match the test vectors. + assert_snapshot("domain", "R", &format!("{:?}", constraint_domain_elements)); + assert_snapshot("domain", "K", &format!("{:?}", non_zero_domain_elements)); + assert_snapshot("domain", "C", &format!("{:?}", variable_domain_elements)); } } From d217ec83d959d7402cc417d4183ecf53d2c756c4 Mon Sep 17 00:00:00 2001 From: Michael Turner Date: Wed, 27 Sep 2023 23:02:07 +0200 Subject: [PATCH 015/339] Get challenges from file --- .../snark/varuna/resources/challenges.input | 14 ++--- .../src/snark/varuna/resources/inputs.txt | 9 ---- algorithms/src/snark/varuna/sage_test.rs | 53 ++++++++----------- 3 files changed, 29 insertions(+), 47 deletions(-) delete mode 100644 algorithms/src/snark/varuna/resources/inputs.txt diff --git a/algorithms/src/snark/varuna/resources/challenges.input b/algorithms/src/snark/varuna/resources/challenges.input index 7b5623000f..c452bb9bab 100644 --- a/algorithms/src/snark/varuna/resources/challenges.input +++ b/algorithms/src/snark/varuna/resources/challenges.input @@ -1,9 +1,9 @@ -192227052363656631588532416871623144703550161931839758861584664328510563277497755573976602426207185410738608382385 +3848747268438146429751199396409351181775389242768022193485885831738448017147 1 -142964935874847288293053714326875850636452886309576462057129885229184368029665262252640373066545420958268146190542 -130772004358781065335697536908031061362482993289814161322663091108024422360727168867592409548570893432602044910287 -94159178481698625866834292426194288892481000237055817778450407880911966894586090114426703377102521778272596259403 +8197944265508088395536605774074305135172727109973647025295290482999689956740 +969057258436037177120044092706484307847087860293738150232755543560372962965 +1261454636320080423466301508402274008580035865105120100172548996301504688503 1 -150212484332755645283716251559763892624630250900657735003603251789435633969818132856394958909583079564826956379484 -5995267943708997134860198278542428639233119910412849290681720175671154580110616714403050309227204634155015022534 -220865766116593916805661529740669880775903272671194615565235895783143237414690739939323324369572382485430460237939 +4987583518937978349829618221849930643691403053432331091973338029344238378359 +5292820491592383411924896857610185298390500160570506754003580089093852949536 +672738024541753390172108082983901395072703770443783662610485842877496432861 \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/inputs.txt b/algorithms/src/snark/varuna/resources/inputs.txt deleted file mode 100644 index d2181efdc4..0000000000 --- a/algorithms/src/snark/varuna/resources/inputs.txt +++ /dev/null @@ -1,9 +0,0 @@ -alpha 3848747268438146429751199396409351181775389242768022193485885831738448017147 -eta_A 1 -eta_B 8197944265508088395536605774074305135172727109973647025295290482999689956740 -eta_C 969057258436037177120044092706484307847087860293738150232755543560372962965 -beta 1261454636320080423466301508402274008580035865105120100172548996301504688503 -delta_A 1 -delta_B 4987583518937978349829618221849930643691403053432331091973338029344238378359 -delta_C 5292820491592383411924896857610185298390500160570506754003580089093852949536 -gamma 672738024541753390172108082983901395072703770443783662610485842877496432861 \ No newline at end of file diff --git a/algorithms/src/snark/varuna/sage_test.rs b/algorithms/src/snark/varuna/sage_test.rs index 06dc7b2808..3af0fdbdf7 100644 --- a/algorithms/src/snark/varuna/sage_test.rs +++ b/algorithms/src/snark/varuna/sage_test.rs @@ -38,7 +38,7 @@ mod tests { // Create the `resources` folder, if it does not exist. if !path.exists() { - std::fs::create_dir_all(&path).unwrap_or_else(|_| panic!("Failed to create resources folder: {path:?}")); + fs::create_dir_all(&path).unwrap_or_else(|_| panic!("Failed to create resources folder: {path:?}")); } // Output the path. path @@ -53,7 +53,7 @@ mod tests { // Create the test folder, if it does not exist. if !path.exists() { - std::fs::create_dir(&path).unwrap_or_else(|_| panic!("Failed to create test folder: {path:?}")); + fs::create_dir(&path).unwrap_or_else(|_| panic!("Failed to create test folder: {path:?}")); } // Construct the path for the test file. @@ -71,6 +71,7 @@ mod tests { expect_test::expect_file![path].assert_eq(candidate); } + // In the case that we're creating a test vectors from a trusted branch fn create_test_vector(folder: &str, file: &str, data: &str) { // Construct the path for the test folder. let mut path = resources_path(); @@ -78,7 +79,7 @@ mod tests { // Create the test folder, if it does not exist. if !path.exists() { - std::fs::create_dir(&path).unwrap_or_else(|_| panic!("Failed to create test folder: {path:?}")); + fs::create_dir(&path).unwrap_or_else(|_| panic!("Failed to create test folder: {path:?}")); } // Construct the path for the test file. @@ -87,10 +88,10 @@ mod tests { // Create the test file, if it does not exist. if !path.exists() { - std::fs::File::create(&path).unwrap_or_else(|_| panic!("Failed to create file: {path:?}")); + fs::File::create(&path).unwrap_or_else(|_| panic!("Failed to create file: {path:?}")); } - std::fs::write(&path, data).unwrap_or_else(|_| panic!("Failed to write to file: {:?}", path)); + fs::write(&path, data).unwrap_or_else(|_| panic!("Failed to write to file: {:?}", path)); } #[test] @@ -106,26 +107,32 @@ mod tests { // TODO: make macros to use different hiding modes fn run_prover_sage_vectors(create_test_vectors: bool) { - let input_path = "src/snark/varuna/resources/inputs.txt"; - let test_vectors_file = fs::read_to_string(input_path).expect("Could not read the file"); - let mut test_vectors = Vec::new(); // TODO: preallocate - for line in test_vectors_file.lines() { - test_vectors.push(line.to_string()) - } - + // Get the circuit instance from the test vector. let instance_path = "src/snark/varuna/resources/instance.input"; let instance_file = fs::read_to_string(instance_path).expect("Could not read the file"); - let mut instance = Vec::new(); // TODO: preallocate + let mut instance = Vec::new(); for line in instance_file.lines() { instance.push(line.to_string()) } + // Initialize challenges from file. let challenges_path = "src/snark/varuna/resources/challenges.input"; let challenges_file = fs::read_to_string(challenges_path).expect("Could not read the file"); - let mut challenges = Vec::new(); // TODO: preallocate + let mut challenges = Vec::new(); for line in challenges_file.lines() { - challenges.push(line.to_string()) + challenges.push(line) } + let (alpha, _eta_a, eta_b, eta_c, beta, delta_a, delta_b, delta_c, gamma) = ( + Fr::from_str(challenges[0]).unwrap(), + Fr::from_str(challenges[1]).unwrap(), + Fr::from_str(challenges[2]).unwrap(), + Fr::from_str(challenges[3]).unwrap(), + Fr::from_str(challenges[4]).unwrap(), + vec![Fr::from_str(challenges[5]).unwrap()], + vec![Fr::from_str(challenges[6]).unwrap()], + vec![Fr::from_str(challenges[7]).unwrap()], + Fr::from_str(challenges[8]).unwrap(), + ); let circuit_combiner = Fr::one(); let instance_combiners = vec![Fr::one()]; @@ -193,22 +200,6 @@ mod tests { create_test_vector("polynomials", "h_0", &h_0); } - // TODO: hardcoding for testing purposes - let alpha = - Fr::from_str("3848747268438146429751199396409351181775389242768022193485885831738448017147").unwrap(); - let eta_b = - Fr::from_str("8197944265508088395536605774074305135172727109973647025295290482999689956740").unwrap(); - let eta_c = - Fr::from_str("969057258436037177120044092706484307847087860293738150232755543560372962965").unwrap(); - let beta = - Fr::from_str("1261454636320080423466301508402274008580035865105120100172548996301504688503").unwrap(); - let delta_a = vec![Fr::from_str("1").unwrap()]; - let delta_b = - vec![Fr::from_str("4987583518937978349829618221849930643691403053432331091973338029344238378359").unwrap()]; - let delta_c = - vec![Fr::from_str("5292820491592383411924896857610185298390500160570506754003580089093852949536").unwrap()]; - let gamma = - Fr::from_str("672738024541753390172108082983901395072703770443783662610485842877496432861").unwrap(); let verifier_second_msg = verifier::SecondMessage:: { alpha, eta_b, eta_c }; let (prover_third_message, third_oracles, prover_state) = AHPForR1CS::<_, MM>::prover_third_round(&verifier_first_msg, &verifier_second_msg, prover_state, rng) From cc16bc52ce8b6e5b7800d8fdab01aad7ad206825 Mon Sep 17 00:00:00 2001 From: Michael Turner Date: Thu, 28 Sep 2023 06:51:30 +0200 Subject: [PATCH 016/339] Rebase and move tests into the main Varuna tests module --- .../src/snark/varuna/ahp/indexer/indexer.rs | 13 +- .../varuna/ahp/prover/round_functions/mod.rs | 2 - .../ahp/prover/round_functions/second.rs | 3 +- .../ahp/prover/round_functions/third.rs | 7 +- algorithms/src/snark/varuna/mod.rs | 3 - algorithms/src/snark/varuna/sage_test.rs | 347 ------------------ algorithms/src/snark/varuna/tests.rs | 290 +++++++++++++++ algorithms/src/snark/varuna/varuna.rs | 21 +- utilities/src/rand.rs | 8 +- 9 files changed, 322 insertions(+), 372 deletions(-) delete mode 100644 algorithms/src/snark/varuna/sage_test.rs diff --git a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs index 00b0e432e9..b762e1b8da 100644 --- a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs +++ b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs @@ -19,10 +19,12 @@ use crate::{ snark::varuna::{ ahp::{ indexer::{Circuit, CircuitId, CircuitInfo, ConstraintSystem as IndexerConstraintSystem}, - AHPError, AHPForR1CS, + AHPError, + AHPForR1CS, }, matrices::{matrix_evals, MatrixEvals}, - num_non_zero, SNARKMode, + num_non_zero, + SNARKMode, }, }; use snarkvm_fields::PrimeField; @@ -64,13 +66,6 @@ impl AHPForR1CS { let joint_arithmetization_time = start_timer!(|| format!("Arithmetizing A,B,C {id}")); - let [a_arith, b_arith, c_arith]: [_; 3] = [("a", a_evals), ("b", b_evals), ("c", c_evals)] - .into_iter() - .map(|(label, evals)| arithmetize_matrix(&id, label, evals)) - .collect::, _>>()? - .try_into() - .unwrap(); - end_timer!(joint_arithmetization_time); let fft_precomp_time = start_timer!(|| format!("Precomputing roots of unity {id}")); diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/mod.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/mod.rs index 9d374e67ed..9251aa91fc 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/mod.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/mod.rs @@ -128,8 +128,6 @@ impl AHPForR1CS { Self::formatted_public_input_is_admissible(&padded_public_variables)?; - println!("padded_public_variables: {:?}", padded_public_variables); - println!("private_variables: {:?}", private_variables); let eval_z_a_time = start_timer!(|| format!("For {:?}, evaluating z_A_{_i}", circuit.id)); let z_a = cfg_iter!(circuit.a) .map(|row| { diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs index 7826a1cea7..a598fb79f0 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs @@ -25,6 +25,7 @@ use crate::{ }, }; use anyhow::Result; +use rand_core::RngCore; use snarkvm_fields::PrimeField; use snarkvm_utilities::{cfg_into_iter, cfg_iter_mut, cfg_reduce, ExecutionPool}; @@ -43,7 +44,7 @@ impl AHPForR1CS { } /// Output the second round message and the next state. - pub fn prover_second_round<'a>( + pub fn prover_second_round<'a, R: RngCore>( verifier_message: &verifier::FirstMessage, mut state: prover::State<'a, F, SM>, _r: &mut R, diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs index e986e8d7fc..f1d011ead8 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs @@ -214,7 +214,9 @@ impl AHPForR1CS { Ok((h_1_sum, xg_1_sum, msg)) } - fn calculate_assignments(state: &mut prover::State) -> Result>>> { + pub(in crate::snark::varuna) fn calculate_assignments( + state: &mut prover::State, + ) -> Result>>> { let assignments_time = start_timer!(|| "Calculate assignments"); let assignments: BTreeMap<_, _> = state .circuit_specific_states @@ -296,8 +298,7 @@ impl AHPForR1CS { // Instead of calculating L^C_col(κ)(c), we add val(k)*L^R_row(α) where we know L^C_col(k)(X) will be 1 let m_at_alpha_evals_time = start_timer!(|| format!("Compute m_at_alpha_evals parallel for {_label}")); let l_at_alpha = constraint_domain.evaluate_all_lagrange_coefficients(alpha); - let m_at_alpha_evals: Vec<_> = matrix_transpose - .iter() + let m_at_alpha_evals: Vec<_> = cfg_iter!(matrix_transpose) .map(|col| col.iter().map(|(val, row_index)| *val * l_at_alpha[*row_index]).sum::()) .collect(); end_timer!(m_at_alpha_evals_time); diff --git a/algorithms/src/snark/varuna/mod.rs b/algorithms/src/snark/varuna/mod.rs index b59a52921d..0e16caae80 100644 --- a/algorithms/src/snark/varuna/mod.rs +++ b/algorithms/src/snark/varuna/mod.rs @@ -29,6 +29,3 @@ pub use mode::*; #[cfg(test)] pub mod tests; - -#[cfg(test)] -pub mod sage_test; diff --git a/algorithms/src/snark/varuna/sage_test.rs b/algorithms/src/snark/varuna/sage_test.rs deleted file mode 100644 index 3af0fdbdf7..0000000000 --- a/algorithms/src/snark/varuna/sage_test.rs +++ /dev/null @@ -1,347 +0,0 @@ -// Copyright (C) 2019-2023 Aleo Systems Inc. -// This file is part of the snarkVM library. - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at: -// http://www.apache.org/licenses/LICENSE-2.0 - -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#[cfg(test)] -mod tests { - use crate::{ - fft::EvaluationDomain, - snark::varuna::{ahp::verifier, AHPForR1CS, TestCircuit, VarunaNonHidingMode, VarunaSNARK}, - traits::snark::SNARK, - }; - use snarkvm_curves::bls12_377::{Bls12_377, Fq, Fr, FrParameters}; - use snarkvm_fields::{Fp256, One}; - use std::{collections::BTreeMap, fs, ops::Deref, path::PathBuf, str::FromStr, sync::Arc}; - - type FS = crate::crypto_hash::PoseidonSponge; - type MM = VarunaNonHidingMode; - type VarunaSonicInst = VarunaSNARK; - - /// Returns the path to the `resources` folder for this module. - fn resources_path() -> PathBuf { - // Construct the path for the `resources` folder. - let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - path.push("src"); - path.push("snark"); - path.push("varuna"); - path.push("resources"); - - // Create the `resources` folder, if it does not exist. - if !path.exists() { - fs::create_dir_all(&path).unwrap_or_else(|_| panic!("Failed to create resources folder: {path:?}")); - } - // Output the path. - path - } - - /// Loads the given `test_folder/test_file` and asserts the given `candidate` matches the expected values. - #[track_caller] - fn assert_snapshot, S2: Into>(test_folder: S1, test_file: S2, candidate: &str) { - // Construct the path for the test folder. - let mut path = resources_path(); - path.push(test_folder.into()); - - // Create the test folder, if it does not exist. - if !path.exists() { - fs::create_dir(&path).unwrap_or_else(|_| panic!("Failed to create test folder: {path:?}")); - } - - // Construct the path for the test file. - path.push(test_file.into()); - path.set_extension("txt"); - - // Create the test file, if it does not exist. - if !path.exists() { - panic!("Test file does not exist: {path:?}"); - } - - println!("Testing path: {:?}", path); - - // Assert the test file is equal to the expected value. - expect_test::expect_file![path].assert_eq(candidate); - } - - // In the case that we're creating a test vectors from a trusted branch - fn create_test_vector(folder: &str, file: &str, data: &str) { - // Construct the path for the test folder. - let mut path = resources_path(); - path.push(folder); - - // Create the test folder, if it does not exist. - if !path.exists() { - fs::create_dir(&path).unwrap_or_else(|_| panic!("Failed to create test folder: {path:?}")); - } - - // Construct the path for the test file. - path.push(file); - path.set_extension("txt"); - - // Create the test file, if it does not exist. - if !path.exists() { - fs::File::create(&path).unwrap_or_else(|_| panic!("Failed to create file: {path:?}")); - } - - fs::write(&path, data).unwrap_or_else(|_| panic!("Failed to write to file: {:?}", path)); - } - - #[test] - fn test_proving_system_with_test_vectors() { - run_prover_sage_vectors(false); - } - - #[test] - #[ignore] - fn create_prover_test_vectors() { - run_prover_sage_vectors(true); - } - - // TODO: make macros to use different hiding modes - fn run_prover_sage_vectors(create_test_vectors: bool) { - // Get the circuit instance from the test vector. - let instance_path = "src/snark/varuna/resources/instance.input"; - let instance_file = fs::read_to_string(instance_path).expect("Could not read the file"); - let mut instance = Vec::new(); - for line in instance_file.lines() { - instance.push(line.to_string()) - } - - // Initialize challenges from file. - let challenges_path = "src/snark/varuna/resources/challenges.input"; - let challenges_file = fs::read_to_string(challenges_path).expect("Could not read the file"); - let mut challenges = Vec::new(); - for line in challenges_file.lines() { - challenges.push(line) - } - let (alpha, _eta_a, eta_b, eta_c, beta, delta_a, delta_b, delta_c, gamma) = ( - Fr::from_str(challenges[0]).unwrap(), - Fr::from_str(challenges[1]).unwrap(), - Fr::from_str(challenges[2]).unwrap(), - Fr::from_str(challenges[3]).unwrap(), - Fr::from_str(challenges[4]).unwrap(), - vec![Fr::from_str(challenges[5]).unwrap()], - vec![Fr::from_str(challenges[6]).unwrap()], - vec![Fr::from_str(challenges[7]).unwrap()], - Fr::from_str(challenges[8]).unwrap(), - ); - let circuit_combiner = Fr::one(); - let instance_combiners = vec![Fr::one()]; - - let mut random_state = vec![0u64; 100]; - let add_f_to_state = |s: &mut Vec, f: Fp256| { - // Fp384 field elements sample 6 u64 values in total. - for i in 0..f.0.0.len() { - s.push(f.0.0[f.0.0.len() - 1 - i]); - } - }; - for witness in instance[15].split(',') { - if witness.trim() == "" { - continue; - } - add_f_to_state(&mut random_state, Fr::from_str(witness.trim()).unwrap()); - } - - let rng = &mut snarkvm_utilities::rand::TestMockRng::fixed(random_state); - - let max_degree = AHPForR1CS::::max_degree(100, 25, 300).unwrap(); - let universal_srs = VarunaSonicInst::universal_setup(max_degree).unwrap(); - let mul_depth = 3; - let num_constraints = 7; - let num_variables = 7; - - // TODO: pass the right randomness in - let (circ, _) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); - let (index_pk, _index_vk) = VarunaSonicInst::circuit_setup(&universal_srs, &circ).unwrap(); - let mut keys_to_constraints = BTreeMap::new(); - keys_to_constraints.insert(index_pk.circuit.deref(), std::slice::from_ref(&circ)); - - let prover_state = AHPForR1CS::<_, MM>::init_prover(&keys_to_constraints, rng).unwrap(); - let prover_state = AHPForR1CS::<_, MM>::prover_first_round(prover_state, rng).unwrap(); - let first_round_oracles = Arc::clone(prover_state.first_round_oracles.as_ref().unwrap()); - - // Get private witness polynomial coefficients. - // TODO: Support batched circuits - let (_, w_poly) = first_round_oracles.batches.iter().next().unwrap(); - let w_lde = format!("{:?}", w_poly[0].0.coeffs().map(|(_, coeff)| coeff).collect::>()); - if create_test_vectors { - create_test_vector("polynomials", "w_lde", &w_lde); - } - - // Generate test vectors from assignments. - let assignments = AHPForR1CS::<_, MM>::calculate_assignments(&prover_state).unwrap(); - - // Get full witness polynomial coefficients. - // TODO: Support batched circuits - let (_, z_poly) = assignments.iter().next().unwrap(); - let z_lde = format!("{:?}", z_poly[0].coeffs().iter().collect::>()); - if create_test_vectors { - create_test_vector("polynomials", "z_lde", &z_lde); - } - - let combiners = verifier::BatchCombiners:: { circuit_combiner, instance_combiners }; - let batch_combiners = BTreeMap::from_iter([(index_pk.circuit.id, combiners)]); - let verifier_first_msg = verifier::FirstMessage:: { batch_combiners }; - - let (second_oracles, prover_state) = - AHPForR1CS::<_, MM>::prover_second_round(&verifier_first_msg, prover_state).unwrap(); - - // Get round 2 rowcheck polynomial oracle coefficients. - let h_0 = format!("{:?}", second_oracles.h_0.coeffs().map(|(_, coeff)| coeff).collect::>()); - if create_test_vectors { - create_test_vector("polynomials", "h_0", &h_0); - } - - let verifier_second_msg = verifier::SecondMessage:: { alpha, eta_b, eta_c }; - let (prover_third_message, third_oracles, prover_state) = - AHPForR1CS::<_, MM>::prover_third_round(&verifier_first_msg, &verifier_second_msg, prover_state, rng) - .unwrap(); - - // Get coefficients round 3 univariate rowcheck polynomial oracles. - let g_1 = format!("{:?}", third_oracles.g_1.coeffs().map(|(_, coeff)| coeff).collect::>()); - if create_test_vectors { - create_test_vector("polynomials", "g_1", &g_1); - } - let h_1 = format!("{:?}", third_oracles.h_1.coeffs().map(|(_, coeff)| coeff).collect::>()); - if create_test_vectors { - create_test_vector("polynomials", "h_1", &h_1); - } - - let verifier_third_msg = verifier::ThirdMessage:: { beta }; - let (prover_fourth_message, fourth_oracles, prover_state) = - AHPForR1CS::<_, MM>::prover_fourth_round(&verifier_second_msg, &verifier_third_msg, prover_state, rng) - .unwrap(); - - // Create round 4 rational sumcheck oracle polynomials. - // TODO: Provide support for batched circuits - let (_, gm_polys) = fourth_oracles.gs.iter().next().unwrap(); - let g_a = format!("{:?}", gm_polys.g_a.coeffs().map(|(_, coeff)| coeff).collect::>()); - let g_b = format!("{:?}", gm_polys.g_b.coeffs().map(|(_, coeff)| coeff).collect::>()); - let g_c = format!("{:?}", gm_polys.g_b.coeffs().map(|(_, coeff)| coeff).collect::>()); - if create_test_vectors { - create_test_vector("polynomials", "g_a", &g_a); - create_test_vector("polynomials", "g_b", &g_b); - create_test_vector("polynomials", "g_c", &g_c); - } - - // Create the verifier's fourth message. - let verifier_fourth_msg = verifier::FourthMessage:: { delta_a, delta_b, delta_c }; - - let mut public_inputs = BTreeMap::new(); - let public_input = prover_state.public_inputs(&index_pk.circuit).unwrap(); - public_inputs.insert(index_pk.circuit.id, public_input); - let non_zero_a_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_a).unwrap(); - let non_zero_b_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_b).unwrap(); - let non_zero_c_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_c).unwrap(); - let variable_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_variables).unwrap(); - let constraint_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_constraints).unwrap(); - let input_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_public_inputs).unwrap(); - - // Get constraint domain elements. - let mut constraint_domain_elements = Vec::with_capacity(constraint_domain.size()); - for el in constraint_domain.elements() { - constraint_domain_elements.push(el); - } - if create_test_vectors { - create_test_vector("domain", "R", &format!("{:?}", constraint_domain_elements)); - } - - // Get non_zero_domain elements. - let non_zero_domain = *[&non_zero_a_domain, &non_zero_b_domain, &non_zero_c_domain] - .iter() - .max_by_key(|domain| domain.size) - .unwrap(); - let mut non_zero_domain_elements = Vec::with_capacity(non_zero_domain.size()); - for el in non_zero_domain.elements() { - non_zero_domain_elements.push(el); - } - if create_test_vectors { - create_test_vector("domain", "K", &format!("{:?}", constraint_domain_elements)); - } - - // Get variable domain elements. - let mut variable_domain_elements = Vec::with_capacity(input_domain.size()); - for el in variable_domain.elements() { - variable_domain_elements.push(el); - } - if create_test_vectors { - create_test_vector("domain", "C", &format!("{:?}", constraint_domain_elements)); - } - - let fifth_oracles = - AHPForR1CS::<_, MM>::prover_fifth_round(verifier_fourth_msg.clone(), prover_state, rng).unwrap(); - - // Get coefficients of final oracle polynomial from round 5. - let h_2 = format!("{:?}", fifth_oracles.h_2.coeffs().map(|(_, coeff)| coeff).collect::>()); - if create_test_vectors { - create_test_vector("polynomials", "h_2", &h_2); - } - - let mut circuit_specific_states = BTreeMap::new(); - let circuit_specific_state = verifier::CircuitSpecificState { - input_domain, - variable_domain, - constraint_domain, - non_zero_a_domain, - non_zero_b_domain, - non_zero_c_domain, - batch_size: 1, - }; - circuit_specific_states.insert(index_pk.circuit.id, circuit_specific_state); - let verifier_state = verifier::State { - circuit_specific_states, - max_constraint_domain: constraint_domain, - max_variable_domain: variable_domain, - max_non_zero_domain: *non_zero_domain, - first_round_message: Some(verifier_first_msg), - second_round_message: Some(verifier_second_msg), - third_round_message: Some(verifier_third_msg), - fourth_round_message: Some(verifier_fourth_msg), - gamma: Some(gamma), - mode: std::marker::PhantomData, - }; - - let polynomials: Vec<_> = index_pk - .circuit - .iter() - .chain(first_round_oracles.iter()) - .chain(second_oracles.iter()) - .chain(third_oracles.iter()) - .chain(fourth_oracles.iter()) - .chain(fifth_oracles.iter()) - .collect(); - - let _lc_s = AHPForR1CS::<_, MM>::construct_linear_combinations( - &public_inputs, - &polynomials, - &prover_third_message, - &prover_fourth_message, - &verifier_state, - ) - .unwrap(); - - // Check the intermediate oracle polynomials against the test vectors. - assert_snapshot("polynomials", "w_lde", &w_lde); - assert_snapshot("polynomials", "z_lde", &z_lde); - assert_snapshot("polynomials", "h_0", &h_0); - assert_snapshot("polynomials", "h_1", &h_1); - assert_snapshot("polynomials", "g_1", &g_1); - assert_snapshot("polynomials", "h_2", &h_2); - assert_snapshot("polynomials", "g_a", &g_a); - assert_snapshot("polynomials", "g_b", &g_b); - assert_snapshot("polynomials", "g_c", &g_c); - - // Check that the domains match the test vectors. - assert_snapshot("domain", "R", &format!("{:?}", constraint_domain_elements)); - assert_snapshot("domain", "K", &format!("{:?}", non_zero_domain_elements)); - assert_snapshot("domain", "C", &format!("{:?}", variable_domain_elements)); - } -} diff --git a/algorithms/src/snark/varuna/tests.rs b/algorithms/src/snark/varuna/tests.rs index 8c7edaa3b8..3f579c2556 100644 --- a/algorithms/src/snark/varuna/tests.rs +++ b/algorithms/src/snark/varuna/tests.rs @@ -531,3 +531,293 @@ mod varuna_hiding { assert!(VarunaInst::verify(universal_verifier, &fs_parameters, &vk1, public_inputs1, &proof1).unwrap()); } } + +mod varuna_test_vectors { + use crate::{ + fft::EvaluationDomain, + snark::varuna::{ahp::verifier, AHPForR1CS, TestCircuit, VarunaNonHidingMode, VarunaSNARK}, + traits::snark::SNARK, + }; + use snarkvm_curves::bls12_377::{Bls12_377, Fq, Fr, FrParameters}; + use snarkvm_fields::{Fp256, One}; + use std::{collections::BTreeMap, fs, ops::Deref, path::PathBuf, str::FromStr, sync::Arc}; + + type FS = crate::crypto_hash::PoseidonSponge; + type MM = VarunaNonHidingMode; + type VarunaSonicInst = VarunaSNARK; + + /// Returns the path to the `resources` folder for this module. + fn resources_path() -> PathBuf { + // Construct the path for the `resources` folder. + let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + path.push("src"); + path.push("snark"); + path.push("varuna"); + path.push("resources"); + + // Create the `resources` folder, if it does not exist. + if !path.exists() { + fs::create_dir_all(&path).unwrap_or_else(|_| panic!("Failed to create resources folder: {path:?}")); + } + // Output the path. + path + } + + /// Loads the given `test_folder/test_file` and asserts the given `candidate` matches the expected values. + #[track_caller] + fn assert_snapshot, S2: Into>(test_folder: S1, test_file: S2, candidate: &str) { + // Construct the path for the test folder. + let mut path = resources_path(); + path.push(test_folder.into()); + + // Create the test folder, if it does not exist. + if !path.exists() { + fs::create_dir(&path).unwrap_or_else(|_| panic!("Failed to create test folder: {path:?}")); + } + + // Construct the path for the test file. + path.push(test_file.into()); + path.set_extension("txt"); + + // Create the test file, if it does not exist. + if !path.exists() { + panic!("Test file does not exist: {path:?}"); + } + + println!("Testing path: {:?}", path); + + // Assert the test file is equal to the expected value. + expect_test::expect_file![path].assert_eq(candidate); + } + + // In the case that we're creating a test vectors from a trusted branch + fn create_test_vector(folder: &str, file: &str, data: &str) { + // Construct the path for the test folder. + let mut path = resources_path(); + path.push(folder); + + // Create the test folder, if it does not exist. + if !path.exists() { + fs::create_dir(&path).unwrap_or_else(|_| panic!("Failed to create test folder: {path:?}")); + } + + // Construct the path for the test file. + path.push(file); + path.set_extension("txt"); + + // Create the test file, if it does not exist. + if !path.exists() { + fs::File::create(&path).unwrap_or_else(|_| panic!("Failed to create file: {path:?}")); + } + + fs::write(&path, data).unwrap_or_else(|_| panic!("Failed to write to file: {:?}", path)); + } + + #[test] + fn test_proving_system_with_test_vectors() { + run_prover_sage_vectors(false); + } + + #[test] + #[ignore] + fn create_prover_test_vectors() { + run_prover_sage_vectors(true); + } + + // TODO: make macros to use different hiding modes + fn run_prover_sage_vectors(create_test_vectors: bool) { + // Get the circuit instance from the test vector. + let instance_path = "src/snark/varuna/resources/instance.input"; + let instance_file = fs::read_to_string(instance_path).expect("Could not read the file"); + let mut instance = Vec::new(); + for line in instance_file.lines() { + instance.push(line.to_string()) + } + + // Initialize challenges from file. + let challenges_path = "src/snark/varuna/resources/challenges.input"; + let challenges_file = fs::read_to_string(challenges_path).expect("Could not read the file"); + let mut challenges = Vec::new(); + for line in challenges_file.lines() { + challenges.push(line) + } + let (alpha, _eta_a, eta_b, eta_c, beta, delta_a, delta_b, delta_c, _gamma) = ( + Fr::from_str(challenges[0]).unwrap(), + Fr::from_str(challenges[1]).unwrap(), + Fr::from_str(challenges[2]).unwrap(), + Fr::from_str(challenges[3]).unwrap(), + Fr::from_str(challenges[4]).unwrap(), + vec![Fr::from_str(challenges[5]).unwrap()], + vec![Fr::from_str(challenges[6]).unwrap()], + vec![Fr::from_str(challenges[7]).unwrap()], + Fr::from_str(challenges[8]).unwrap(), + ); + let circuit_combiner = Fr::one(); + let instance_combiners = vec![Fr::one()]; + + let mut random_state = vec![0u64; 100]; + let add_f_to_state = |s: &mut Vec, f: Fp256| { + // Fp384 field elements sample 6 u64 values in total. + for i in 0..f.0.0.len() { + s.push(f.0.0[f.0.0.len() - 1 - i]); + } + }; + for witness in instance[15].split(',') { + if witness.trim() == "" { + continue; + } + add_f_to_state(&mut random_state, Fr::from_str(witness.trim()).unwrap()); + } + + let rng = &mut snarkvm_utilities::rand::TestMockRng::fixed(random_state); + + let max_degree = AHPForR1CS::::max_degree(100, 25, 300).unwrap(); + let universal_srs = VarunaSonicInst::universal_setup(max_degree).unwrap(); + let mul_depth = 3; + let num_constraints = 7; + let num_variables = 7; + + // TODO: pass the right randomness in + let (circ, _) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); + let (index_pk, _index_vk) = VarunaSonicInst::circuit_setup(&universal_srs, &circ).unwrap(); + let mut keys_to_constraints = BTreeMap::new(); + keys_to_constraints.insert(index_pk.circuit.deref(), std::slice::from_ref(&circ)); + + let prover_state = AHPForR1CS::<_, MM>::init_prover(&keys_to_constraints, rng).unwrap(); + let mut prover_state = AHPForR1CS::<_, MM>::prover_first_round(prover_state, rng).unwrap(); + let first_round_oracles = Arc::new(prover_state.first_round_oracles.as_ref().unwrap()); + + // Get private witness polynomial coefficients. + // TODO: Support batched circuits + let (_, w_poly) = first_round_oracles.batches.iter().next().unwrap(); + let w_lde = format!("{:?}", w_poly[0].0.coeffs().map(|(_, coeff)| coeff).collect::>()); + if create_test_vectors { + create_test_vector("polynomials", "w_lde", &w_lde); + } + + // Generate test vectors from assignments. + let assignments = AHPForR1CS::<_, MM>::calculate_assignments(&mut prover_state).unwrap(); + + // Get full witness polynomial coefficients. + // TODO: Support batched circuits + let (_, z_poly) = assignments.iter().next().unwrap(); + let z_lde = format!("{:?}", z_poly[0].coeffs().iter().collect::>()); + if create_test_vectors { + create_test_vector("polynomials", "z_lde", &z_lde); + } + + let combiners = verifier::BatchCombiners:: { circuit_combiner, instance_combiners }; + let batch_combiners = BTreeMap::from_iter([(index_pk.circuit.id, combiners)]); + let verifier_first_msg = verifier::FirstMessage:: { batch_combiners }; + + let (second_oracles, prover_state) = + AHPForR1CS::<_, MM>::prover_second_round::<_>(&verifier_first_msg, prover_state, rng).unwrap(); + + // Get round 2 rowcheck polynomial oracle coefficients. + let h_0 = format!("{:?}", second_oracles.h_0.coeffs().map(|(_, coeff)| coeff).collect::>()); + if create_test_vectors { + create_test_vector("polynomials", "h_0", &h_0); + } + + let verifier_second_msg = verifier::SecondMessage:: { alpha, eta_b, eta_c }; + let (_prover_third_message, third_oracles, prover_state) = + AHPForR1CS::<_, MM>::prover_third_round(&verifier_first_msg, &verifier_second_msg, prover_state, rng) + .unwrap(); + + // Get coefficients round 3 univariate rowcheck polynomial oracles. + let g_1 = format!("{:?}", third_oracles.g_1.coeffs().map(|(_, coeff)| coeff).collect::>()); + if create_test_vectors { + create_test_vector("polynomials", "g_1", &g_1); + } + let h_1 = format!("{:?}", third_oracles.h_1.coeffs().map(|(_, coeff)| coeff).collect::>()); + if create_test_vectors { + create_test_vector("polynomials", "h_1", &h_1); + } + + let verifier_third_msg = verifier::ThirdMessage:: { beta }; + let (_prover_fourth_message, fourth_oracles, prover_state) = + AHPForR1CS::<_, MM>::prover_fourth_round(&verifier_second_msg, &verifier_third_msg, prover_state, rng) + .unwrap(); + + // Create round 4 rational sumcheck oracle polynomials. + // TODO: Provide support for batched circuits + let (_, gm_polys) = fourth_oracles.gs.iter().next().unwrap(); + let g_a = format!("{:?}", gm_polys.g_a.coeffs().map(|(_, coeff)| coeff).collect::>()); + let g_b = format!("{:?}", gm_polys.g_b.coeffs().map(|(_, coeff)| coeff).collect::>()); + let g_c = format!("{:?}", gm_polys.g_b.coeffs().map(|(_, coeff)| coeff).collect::>()); + if create_test_vectors { + create_test_vector("polynomials", "g_a", &g_a); + create_test_vector("polynomials", "g_b", &g_b); + create_test_vector("polynomials", "g_c", &g_c); + } + + // Create the verifier's fourth message. + let verifier_fourth_msg = verifier::FourthMessage:: { delta_a, delta_b, delta_c }; + + let mut public_inputs = BTreeMap::new(); + let public_input = prover_state.public_inputs(&index_pk.circuit).unwrap(); + public_inputs.insert(index_pk.circuit.id, public_input); + let non_zero_a_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_a).unwrap(); + let non_zero_b_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_b).unwrap(); + let non_zero_c_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_non_zero_c).unwrap(); + let variable_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_variables).unwrap(); + let constraint_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_constraints).unwrap(); + let input_domain = EvaluationDomain::::new(index_pk.circuit.index_info.num_public_inputs).unwrap(); + + // Get constraint domain elements. + let mut constraint_domain_elements = Vec::with_capacity(constraint_domain.size()); + for el in constraint_domain.elements() { + constraint_domain_elements.push(el); + } + if create_test_vectors { + create_test_vector("domain", "R", &format!("{:?}", constraint_domain_elements)); + } + + // Get non_zero_domain elements. + let non_zero_domain = *[&non_zero_a_domain, &non_zero_b_domain, &non_zero_c_domain] + .iter() + .max_by_key(|domain| domain.size) + .unwrap(); + let mut non_zero_domain_elements = Vec::with_capacity(non_zero_domain.size()); + for el in non_zero_domain.elements() { + non_zero_domain_elements.push(el); + } + if create_test_vectors { + create_test_vector("domain", "K", &format!("{:?}", constraint_domain_elements)); + } + + // Get variable domain elements. + let mut variable_domain_elements = Vec::with_capacity(input_domain.size()); + for el in variable_domain.elements() { + variable_domain_elements.push(el); + } + if create_test_vectors { + create_test_vector("domain", "C", &format!("{:?}", constraint_domain_elements)); + } + + let fifth_oracles = + AHPForR1CS::<_, MM>::prover_fifth_round(verifier_fourth_msg.clone(), prover_state, rng).unwrap(); + + // Get coefficients of final oracle polynomial from round 5. + let h_2 = format!("{:?}", fifth_oracles.h_2.coeffs().map(|(_, coeff)| coeff).collect::>()); + if create_test_vectors { + create_test_vector("polynomials", "h_2", &h_2); + } + + // Check the intermediate oracle polynomials against the test vectors. + assert_snapshot("polynomials", "w_lde", &w_lde); + assert_snapshot("polynomials", "z_lde", &z_lde); + assert_snapshot("polynomials", "h_0", &h_0); + assert_snapshot("polynomials", "h_1", &h_1); + assert_snapshot("polynomials", "g_1", &g_1); + assert_snapshot("polynomials", "h_2", &h_2); + assert_snapshot("polynomials", "g_a", &g_a); + assert_snapshot("polynomials", "g_b", &g_b); + assert_snapshot("polynomials", "g_c", &g_c); + + // Check that the domains match the test vectors. + assert_snapshot("domain", "R", &format!("{:?}", constraint_domain_elements)); + assert_snapshot("domain", "K", &format!("{:?}", non_zero_domain_elements)); + assert_snapshot("domain", "C", &format!("{:?}", variable_domain_elements)); + } +} diff --git a/algorithms/src/snark/varuna/varuna.rs b/algorithms/src/snark/varuna/varuna.rs index cca9765627..0e03daf918 100644 --- a/algorithms/src/snark/varuna/varuna.rs +++ b/algorithms/src/snark/varuna/varuna.rs @@ -16,15 +16,30 @@ use super::Certificate; use crate::{ fft::EvaluationDomain, polycommit::sonic_pc::{ - Commitment, CommitterUnionKey, Evaluations, LabeledCommitment, QuerySet, Randomness, SonicKZG10, + Commitment, + CommitterUnionKey, + Evaluations, + LabeledCommitment, + QuerySet, + Randomness, + SonicKZG10, }, r1cs::{ConstraintSynthesizer, SynthesisError}, snark::varuna::{ ahp::{AHPError, AHPForR1CS, CircuitId, EvaluationsProvider}, - proof, prover, witness_label, CircuitProvingKey, CircuitVerifyingKey, Proof, SNARKMode, UniversalSRS, + proof, + prover, + witness_label, + CircuitProvingKey, + CircuitVerifyingKey, + Proof, + SNARKMode, + UniversalSRS, }, srs::UniversalVerifier, - AlgebraicSponge, SNARKError, SNARK, + AlgebraicSponge, + SNARKError, + SNARK, }; use rand::RngCore; use snarkvm_curves::PairingEngine; diff --git a/utilities/src/rand.rs b/utilities/src/rand.rs index 40da515cb9..af60e8a583 100644 --- a/utilities/src/rand.rs +++ b/utilities/src/rand.rs @@ -162,14 +162,14 @@ impl rand::RngCore for TestMockRng { } fn fill_bytes(&mut self, dest: &mut [u8]) { - for i in 0..dest.len() { - dest[i] = self.state.pop().unwrap() as u8; + for byte in dest.iter_mut() { + *byte = self.state.pop().unwrap() as u8; } } fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand::Error> { - for i in 0..dest.len() { - dest[i] = self.state.pop().unwrap() as u8; // TODO: use try_from and convert the Error + for byte in dest.iter_mut() { + *byte = self.state.pop().unwrap() as u8; // TODO: use try_from and convert the Error } Ok(()) } From 60ee9db8e70daf87f598e86af9a1f60c1b37baed Mon Sep 17 00:00:00 2001 From: Michael Turner Date: Thu, 28 Sep 2023 15:37:06 +0200 Subject: [PATCH 017/339] Add support for multiple circuit tests --- .../varuna/data_structures/test_circuit.rs | 4 - .../{ => circuit_0}/challenges.input | 0 .../resources/{ => circuit_0}/domain/C.txt | 0 .../resources/{ => circuit_0}/domain/K.txt | 0 .../resources/{ => circuit_0}/domain/R.txt | 0 .../resources/{ => circuit_0}/instance.input | 0 .../{ => circuit_0}/polynomials/g_1.txt | 0 .../{ => circuit_0}/polynomials/g_a.txt | 0 .../{ => circuit_0}/polynomials/g_b.txt | 0 .../{ => circuit_0}/polynomials/g_c.txt | 0 .../{ => circuit_0}/polynomials/h_0.txt | 0 .../{ => circuit_0}/polynomials/h_1.txt | 0 .../{ => circuit_0}/polynomials/h_2.txt | 0 .../{ => circuit_0}/polynomials/w_lde.txt | 0 .../{ => circuit_0}/polynomials/z_lde.txt | 0 algorithms/src/snark/varuna/tests.rs | 101 ++++++++++-------- 16 files changed, 57 insertions(+), 48 deletions(-) rename algorithms/src/snark/varuna/resources/{ => circuit_0}/challenges.input (100%) rename algorithms/src/snark/varuna/resources/{ => circuit_0}/domain/C.txt (100%) rename algorithms/src/snark/varuna/resources/{ => circuit_0}/domain/K.txt (100%) rename algorithms/src/snark/varuna/resources/{ => circuit_0}/domain/R.txt (100%) rename algorithms/src/snark/varuna/resources/{ => circuit_0}/instance.input (100%) rename algorithms/src/snark/varuna/resources/{ => circuit_0}/polynomials/g_1.txt (100%) rename algorithms/src/snark/varuna/resources/{ => circuit_0}/polynomials/g_a.txt (100%) rename algorithms/src/snark/varuna/resources/{ => circuit_0}/polynomials/g_b.txt (100%) rename algorithms/src/snark/varuna/resources/{ => circuit_0}/polynomials/g_c.txt (100%) rename algorithms/src/snark/varuna/resources/{ => circuit_0}/polynomials/h_0.txt (100%) rename algorithms/src/snark/varuna/resources/{ => circuit_0}/polynomials/h_1.txt (100%) rename algorithms/src/snark/varuna/resources/{ => circuit_0}/polynomials/h_2.txt (100%) rename algorithms/src/snark/varuna/resources/{ => circuit_0}/polynomials/w_lde.txt (100%) rename algorithms/src/snark/varuna/resources/{ => circuit_0}/polynomials/z_lde.txt (100%) diff --git a/algorithms/src/snark/varuna/data_structures/test_circuit.rs b/algorithms/src/snark/varuna/data_structures/test_circuit.rs index 80bed30011..8e66d71f03 100644 --- a/algorithms/src/snark/varuna/data_structures/test_circuit.rs +++ b/algorithms/src/snark/varuna/data_structures/test_circuit.rs @@ -73,7 +73,6 @@ impl ConstraintSynthesizer for TestCircuit TestCircuit { public_inputs.push(new_var); } - println!("a: {}", a); - println!("b: {}", b); - (TestCircuit { a: Some(a), b: Some(b), num_constraints, num_variables, mul_depth }, public_inputs) } } diff --git a/algorithms/src/snark/varuna/resources/challenges.input b/algorithms/src/snark/varuna/resources/circuit_0/challenges.input similarity index 100% rename from algorithms/src/snark/varuna/resources/challenges.input rename to algorithms/src/snark/varuna/resources/circuit_0/challenges.input diff --git a/algorithms/src/snark/varuna/resources/domain/C.txt b/algorithms/src/snark/varuna/resources/circuit_0/domain/C.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/domain/C.txt rename to algorithms/src/snark/varuna/resources/circuit_0/domain/C.txt diff --git a/algorithms/src/snark/varuna/resources/domain/K.txt b/algorithms/src/snark/varuna/resources/circuit_0/domain/K.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/domain/K.txt rename to algorithms/src/snark/varuna/resources/circuit_0/domain/K.txt diff --git a/algorithms/src/snark/varuna/resources/domain/R.txt b/algorithms/src/snark/varuna/resources/circuit_0/domain/R.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/domain/R.txt rename to algorithms/src/snark/varuna/resources/circuit_0/domain/R.txt diff --git a/algorithms/src/snark/varuna/resources/instance.input b/algorithms/src/snark/varuna/resources/circuit_0/instance.input similarity index 100% rename from algorithms/src/snark/varuna/resources/instance.input rename to algorithms/src/snark/varuna/resources/circuit_0/instance.input diff --git a/algorithms/src/snark/varuna/resources/polynomials/g_1.txt b/algorithms/src/snark/varuna/resources/circuit_0/polynomials/g_1.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/g_1.txt rename to algorithms/src/snark/varuna/resources/circuit_0/polynomials/g_1.txt diff --git a/algorithms/src/snark/varuna/resources/polynomials/g_a.txt b/algorithms/src/snark/varuna/resources/circuit_0/polynomials/g_a.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/g_a.txt rename to algorithms/src/snark/varuna/resources/circuit_0/polynomials/g_a.txt diff --git a/algorithms/src/snark/varuna/resources/polynomials/g_b.txt b/algorithms/src/snark/varuna/resources/circuit_0/polynomials/g_b.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/g_b.txt rename to algorithms/src/snark/varuna/resources/circuit_0/polynomials/g_b.txt diff --git a/algorithms/src/snark/varuna/resources/polynomials/g_c.txt b/algorithms/src/snark/varuna/resources/circuit_0/polynomials/g_c.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/g_c.txt rename to algorithms/src/snark/varuna/resources/circuit_0/polynomials/g_c.txt diff --git a/algorithms/src/snark/varuna/resources/polynomials/h_0.txt b/algorithms/src/snark/varuna/resources/circuit_0/polynomials/h_0.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/h_0.txt rename to algorithms/src/snark/varuna/resources/circuit_0/polynomials/h_0.txt diff --git a/algorithms/src/snark/varuna/resources/polynomials/h_1.txt b/algorithms/src/snark/varuna/resources/circuit_0/polynomials/h_1.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/h_1.txt rename to algorithms/src/snark/varuna/resources/circuit_0/polynomials/h_1.txt diff --git a/algorithms/src/snark/varuna/resources/polynomials/h_2.txt b/algorithms/src/snark/varuna/resources/circuit_0/polynomials/h_2.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/h_2.txt rename to algorithms/src/snark/varuna/resources/circuit_0/polynomials/h_2.txt diff --git a/algorithms/src/snark/varuna/resources/polynomials/w_lde.txt b/algorithms/src/snark/varuna/resources/circuit_0/polynomials/w_lde.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/w_lde.txt rename to algorithms/src/snark/varuna/resources/circuit_0/polynomials/w_lde.txt diff --git a/algorithms/src/snark/varuna/resources/polynomials/z_lde.txt b/algorithms/src/snark/varuna/resources/circuit_0/polynomials/z_lde.txt similarity index 100% rename from algorithms/src/snark/varuna/resources/polynomials/z_lde.txt rename to algorithms/src/snark/varuna/resources/circuit_0/polynomials/z_lde.txt diff --git a/algorithms/src/snark/varuna/tests.rs b/algorithms/src/snark/varuna/tests.rs index 3f579c2556..de351a46ac 100644 --- a/algorithms/src/snark/varuna/tests.rs +++ b/algorithms/src/snark/varuna/tests.rs @@ -565,9 +565,15 @@ mod varuna_test_vectors { /// Loads the given `test_folder/test_file` and asserts the given `candidate` matches the expected values. #[track_caller] - fn assert_snapshot, S2: Into>(test_folder: S1, test_file: S2, candidate: &str) { + fn assert_test_vector_equality, S2: Into>( + test_folder: S1, + test_file: S2, + candidate: &str, + circuit: &str, + ) { // Construct the path for the test folder. let mut path = resources_path(); + path.push(circuit); path.push(test_folder.into()); // Create the test folder, if it does not exist. @@ -584,16 +590,15 @@ mod varuna_test_vectors { panic!("Test file does not exist: {path:?}"); } - println!("Testing path: {:?}", path); - // Assert the test file is equal to the expected value. expect_test::expect_file![path].assert_eq(candidate); } // In the case that we're creating a test vectors from a trusted branch - fn create_test_vector(folder: &str, file: &str, data: &str) { + fn create_test_vector(folder: &str, file: &str, data: &str, circuit: &str) { // Construct the path for the test folder. let mut path = resources_path(); + path.push(circuit); path.push(folder); // Create the test folder, if it does not exist. @@ -613,21 +618,32 @@ mod varuna_test_vectors { fs::write(&path, data).unwrap_or_else(|_| panic!("Failed to write to file: {:?}", path)); } - #[test] - fn test_proving_system_with_test_vectors() { - run_prover_sage_vectors(false); + // Tests varuna against the test vectors in all circuits in the resources folder. + fn test_varuna_with_all_circuits(create_test_vectors: bool) { + let entries = fs::read_dir(resources_path()).expect("Failed to read resources folder"); + entries.into_iter().for_each(|entry| { + let path = entry.unwrap().path(); + if path.is_dir() { + let circuit = path.file_name().unwrap().to_str().unwrap(); + test_circuit_with_test_vectors(create_test_vectors, circuit); + } + }); } + // Create test vectors for all circuits in the resources folder. #[test] - #[ignore] fn create_prover_test_vectors() { - run_prover_sage_vectors(true); + test_varuna_with_all_circuits(true); } - // TODO: make macros to use different hiding modes - fn run_prover_sage_vectors(create_test_vectors: bool) { + #[test] + fn test_varuna_with_prover_test_vectors() { + test_varuna_with_all_circuits(false); + } + + fn test_circuit_with_test_vectors(create_test_vectors: bool, circuit: &str) { // Get the circuit instance from the test vector. - let instance_path = "src/snark/varuna/resources/instance.input"; + let instance_path = format!("src/snark/varuna/resources/{}/instance.input", circuit); let instance_file = fs::read_to_string(instance_path).expect("Could not read the file"); let mut instance = Vec::new(); for line in instance_file.lines() { @@ -635,12 +651,13 @@ mod varuna_test_vectors { } // Initialize challenges from file. - let challenges_path = "src/snark/varuna/resources/challenges.input"; + let challenges_path = format!("src/snark/varuna/resources/{}/challenges.input", circuit); let challenges_file = fs::read_to_string(challenges_path).expect("Could not read the file"); let mut challenges = Vec::new(); for line in challenges_file.lines() { challenges.push(line) } + let (alpha, _eta_a, eta_b, eta_c, beta, delta_a, delta_b, delta_c, _gamma) = ( Fr::from_str(challenges[0]).unwrap(), Fr::from_str(challenges[1]).unwrap(), @@ -655,7 +672,7 @@ mod varuna_test_vectors { let circuit_combiner = Fr::one(); let instance_combiners = vec![Fr::one()]; - let mut random_state = vec![0u64; 100]; + let mut rng_state = vec![0u64; 100]; let add_f_to_state = |s: &mut Vec, f: Fp256| { // Fp384 field elements sample 6 u64 values in total. for i in 0..f.0.0.len() { @@ -666,10 +683,10 @@ mod varuna_test_vectors { if witness.trim() == "" { continue; } - add_f_to_state(&mut random_state, Fr::from_str(witness.trim()).unwrap()); + add_f_to_state(&mut rng_state, Fr::from_str(witness.trim()).unwrap()); } - let rng = &mut snarkvm_utilities::rand::TestMockRng::fixed(random_state); + let rng = &mut snarkvm_utilities::rand::TestMockRng::fixed(rng_state); let max_degree = AHPForR1CS::::max_degree(100, 25, 300).unwrap(); let universal_srs = VarunaSonicInst::universal_setup(max_degree).unwrap(); @@ -677,7 +694,6 @@ mod varuna_test_vectors { let num_constraints = 7; let num_variables = 7; - // TODO: pass the right randomness in let (circ, _) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); let (index_pk, _index_vk) = VarunaSonicInst::circuit_setup(&universal_srs, &circ).unwrap(); let mut keys_to_constraints = BTreeMap::new(); @@ -688,22 +704,20 @@ mod varuna_test_vectors { let first_round_oracles = Arc::new(prover_state.first_round_oracles.as_ref().unwrap()); // Get private witness polynomial coefficients. - // TODO: Support batched circuits let (_, w_poly) = first_round_oracles.batches.iter().next().unwrap(); let w_lde = format!("{:?}", w_poly[0].0.coeffs().map(|(_, coeff)| coeff).collect::>()); if create_test_vectors { - create_test_vector("polynomials", "w_lde", &w_lde); + create_test_vector("polynomials", "w_lde", &w_lde, circuit); } // Generate test vectors from assignments. let assignments = AHPForR1CS::<_, MM>::calculate_assignments(&mut prover_state).unwrap(); // Get full witness polynomial coefficients. - // TODO: Support batched circuits let (_, z_poly) = assignments.iter().next().unwrap(); let z_lde = format!("{:?}", z_poly[0].coeffs().iter().collect::>()); if create_test_vectors { - create_test_vector("polynomials", "z_lde", &z_lde); + create_test_vector("polynomials", "z_lde", &z_lde, circuit); } let combiners = verifier::BatchCombiners:: { circuit_combiner, instance_combiners }; @@ -716,7 +730,7 @@ mod varuna_test_vectors { // Get round 2 rowcheck polynomial oracle coefficients. let h_0 = format!("{:?}", second_oracles.h_0.coeffs().map(|(_, coeff)| coeff).collect::>()); if create_test_vectors { - create_test_vector("polynomials", "h_0", &h_0); + create_test_vector("polynomials", "h_0", &h_0, circuit); } let verifier_second_msg = verifier::SecondMessage:: { alpha, eta_b, eta_c }; @@ -727,11 +741,11 @@ mod varuna_test_vectors { // Get coefficients round 3 univariate rowcheck polynomial oracles. let g_1 = format!("{:?}", third_oracles.g_1.coeffs().map(|(_, coeff)| coeff).collect::>()); if create_test_vectors { - create_test_vector("polynomials", "g_1", &g_1); + create_test_vector("polynomials", "g_1", &g_1, circuit); } let h_1 = format!("{:?}", third_oracles.h_1.coeffs().map(|(_, coeff)| coeff).collect::>()); if create_test_vectors { - create_test_vector("polynomials", "h_1", &h_1); + create_test_vector("polynomials", "h_1", &h_1, circuit); } let verifier_third_msg = verifier::ThirdMessage:: { beta }; @@ -740,15 +754,14 @@ mod varuna_test_vectors { .unwrap(); // Create round 4 rational sumcheck oracle polynomials. - // TODO: Provide support for batched circuits let (_, gm_polys) = fourth_oracles.gs.iter().next().unwrap(); let g_a = format!("{:?}", gm_polys.g_a.coeffs().map(|(_, coeff)| coeff).collect::>()); let g_b = format!("{:?}", gm_polys.g_b.coeffs().map(|(_, coeff)| coeff).collect::>()); let g_c = format!("{:?}", gm_polys.g_b.coeffs().map(|(_, coeff)| coeff).collect::>()); if create_test_vectors { - create_test_vector("polynomials", "g_a", &g_a); - create_test_vector("polynomials", "g_b", &g_b); - create_test_vector("polynomials", "g_c", &g_c); + create_test_vector("polynomials", "g_a", &g_a, circuit); + create_test_vector("polynomials", "g_b", &g_b, circuit); + create_test_vector("polynomials", "g_c", &g_c, circuit); } // Create the verifier's fourth message. @@ -770,7 +783,7 @@ mod varuna_test_vectors { constraint_domain_elements.push(el); } if create_test_vectors { - create_test_vector("domain", "R", &format!("{:?}", constraint_domain_elements)); + create_test_vector("domain", "R", &format!("{:?}", constraint_domain_elements), circuit); } // Get non_zero_domain elements. @@ -783,7 +796,7 @@ mod varuna_test_vectors { non_zero_domain_elements.push(el); } if create_test_vectors { - create_test_vector("domain", "K", &format!("{:?}", constraint_domain_elements)); + create_test_vector("domain", "K", &format!("{:?}", non_zero_domain_elements), circuit); } // Get variable domain elements. @@ -792,7 +805,7 @@ mod varuna_test_vectors { variable_domain_elements.push(el); } if create_test_vectors { - create_test_vector("domain", "C", &format!("{:?}", constraint_domain_elements)); + create_test_vector("domain", "C", &format!("{:?}", variable_domain_elements), circuit); } let fifth_oracles = @@ -801,23 +814,23 @@ mod varuna_test_vectors { // Get coefficients of final oracle polynomial from round 5. let h_2 = format!("{:?}", fifth_oracles.h_2.coeffs().map(|(_, coeff)| coeff).collect::>()); if create_test_vectors { - create_test_vector("polynomials", "h_2", &h_2); + create_test_vector("polynomials", "h_2", &h_2, circuit); } // Check the intermediate oracle polynomials against the test vectors. - assert_snapshot("polynomials", "w_lde", &w_lde); - assert_snapshot("polynomials", "z_lde", &z_lde); - assert_snapshot("polynomials", "h_0", &h_0); - assert_snapshot("polynomials", "h_1", &h_1); - assert_snapshot("polynomials", "g_1", &g_1); - assert_snapshot("polynomials", "h_2", &h_2); - assert_snapshot("polynomials", "g_a", &g_a); - assert_snapshot("polynomials", "g_b", &g_b); - assert_snapshot("polynomials", "g_c", &g_c); + assert_test_vector_equality("polynomials", "w_lde", &w_lde, circuit); + assert_test_vector_equality("polynomials", "z_lde", &z_lde, circuit); + assert_test_vector_equality("polynomials", "h_0", &h_0, circuit); + assert_test_vector_equality("polynomials", "h_1", &h_1, circuit); + assert_test_vector_equality("polynomials", "g_1", &g_1, circuit); + assert_test_vector_equality("polynomials", "h_2", &h_2, circuit); + assert_test_vector_equality("polynomials", "g_a", &g_a, circuit); + assert_test_vector_equality("polynomials", "g_b", &g_b, circuit); + assert_test_vector_equality("polynomials", "g_c", &g_c, circuit); // Check that the domains match the test vectors. - assert_snapshot("domain", "R", &format!("{:?}", constraint_domain_elements)); - assert_snapshot("domain", "K", &format!("{:?}", non_zero_domain_elements)); - assert_snapshot("domain", "C", &format!("{:?}", variable_domain_elements)); + assert_test_vector_equality("domain", "R", &format!("{:?}", constraint_domain_elements), circuit); + assert_test_vector_equality("domain", "K", &format!("{:?}", non_zero_domain_elements), circuit); + assert_test_vector_equality("domain", "C", &format!("{:?}", variable_domain_elements), circuit); } } From e5739cc38805c5563f263e6dd1442d7fd9b4be3d Mon Sep 17 00:00:00 2001 From: Michael Turner Date: Thu, 28 Sep 2023 19:13:58 +0200 Subject: [PATCH 018/339] Estimate degree based on circuit index information --- .../varuna/resources/circuit_0/instance.input | 41 +++--- .../varuna/resources/circuit_0/witness.input | 2 + algorithms/src/snark/varuna/tests.rs | 117 ++++++++---------- utilities/src/rand.rs | 3 +- 4 files changed, 80 insertions(+), 83 deletions(-) create mode 100644 algorithms/src/snark/varuna/resources/circuit_0/witness.input diff --git a/algorithms/src/snark/varuna/resources/circuit_0/instance.input b/algorithms/src/snark/varuna/resources/circuit_0/instance.input index 27ce595664..57534290ae 100644 --- a/algorithms/src/snark/varuna/resources/circuit_0/instance.input +++ b/algorithms/src/snark/varuna/resources/circuit_0/instance.input @@ -1,17 +1,24 @@ -0, 1, 0, 0, 0, -0, 1, 0, 0, 0, -0, 1, 0, 0, 0, -0, 1, 0, 0, 0, -0, 1, 0, 0, 0, -0, 0, 1, 0, 0, -0, 0, 1, 0, 0, -0, 0, 1, 0, 0, -0, 0, 1, 0, 0, -0, 0, 1, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -4, 2 -8, 4, 2, 16, 32, +A +0, 0, 0, 0, 1, 0, 0, +0, 0, 0, 0, 1, 0, 0, +0, 0, 0, 0, 1, 0, 0, +0, 0, 0, 0, 1, 0, 0, +0, 0, 0, 0, 1, 0, 0, +0, 1, 0, 0, 0, 0, 0, +0, 0, 1, 0, 0, 0, 0, +B +0, 0, 0, 0, 0, 1, 0, +0, 0, 0, 0, 0, 1, 0, +0, 0, 0, 0, 0, 1, 0, +0, 0, 0, 0, 0, 1, 0, +0, 0, 0, 0, 0, 1, 0, +0, 0, 0, 0, 0, 1, 0, +0, 0, 0, 0, 0, 1, 0, +C +0, 1, 0, 0, 0, 0, 0, +0, 1, 0, 0, 0, 0, 0, +0, 1, 0, 0, 0, 0, 0, +0, 1, 0, 0, 0, 0, 0, +0, 1, 0, 0, 0, 0, 0, +0, 0, 1, 0, 0, 0, 0, +0, 0, 0, 1, 0, 0, 0, \ No newline at end of file diff --git a/algorithms/src/snark/varuna/resources/circuit_0/witness.input b/algorithms/src/snark/varuna/resources/circuit_0/witness.input new file mode 100644 index 0000000000..a93494e178 --- /dev/null +++ b/algorithms/src/snark/varuna/resources/circuit_0/witness.input @@ -0,0 +1,2 @@ +4, 2 +8, 4, 2, 16, 32, \ No newline at end of file diff --git a/algorithms/src/snark/varuna/tests.rs b/algorithms/src/snark/varuna/tests.rs index de351a46ac..8327b680bf 100644 --- a/algorithms/src/snark/varuna/tests.rs +++ b/algorithms/src/snark/varuna/tests.rs @@ -546,9 +546,8 @@ mod varuna_test_vectors { type MM = VarunaNonHidingMode; type VarunaSonicInst = VarunaSNARK; - /// Returns the path to the `resources` folder for this module. - fn resources_path() -> PathBuf { - // Construct the path for the `resources` folder. + // Create the path for the `resources` folder. + fn resources_path(create_dir: bool) -> PathBuf { let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); path.push("src"); path.push("snark"); @@ -557,70 +556,62 @@ mod varuna_test_vectors { // Create the `resources` folder, if it does not exist. if !path.exists() { - fs::create_dir_all(&path).unwrap_or_else(|_| panic!("Failed to create resources folder: {path:?}")); + if create_dir { + fs::create_dir(&path).unwrap_or_else(|_| panic!("Failed to create resources folder: {path:?}")); + } else { + panic!("Resources folder does not exist: {path:?}"); + } } - // Output the path. + path } - /// Loads the given `test_folder/test_file` and asserts the given `candidate` matches the expected values. - #[track_caller] - fn assert_test_vector_equality, S2: Into>( - test_folder: S1, - test_file: S2, - candidate: &str, - circuit: &str, - ) { - // Construct the path for the test folder. - let mut path = resources_path(); + // Create the file path. + fn test_vector_path(folder: &str, file: &str, circuit: &str, create_dir: bool) -> PathBuf { + let mut path = resources_path(create_dir); + + // Construct the path where the test data lives. path.push(circuit); - path.push(test_folder.into()); + path.push(folder); - // Create the test folder, if it does not exist. + // Create the test folder if it does not exist if specified, otherwise panic. if !path.exists() { - fs::create_dir(&path).unwrap_or_else(|_| panic!("Failed to create test folder: {path:?}")); + if create_dir { + fs::create_dir(&path).unwrap_or_else(|_| panic!("Failed to create resources folder: {path:?}")); + } else { + panic!("Resources folder does not exist: {path:?}"); + } } // Construct the path for the test file. - path.push(test_file.into()); + path.push(file); path.set_extension("txt"); - // Create the test file, if it does not exist. - if !path.exists() { - panic!("Test file does not exist: {path:?}"); - } + path + } + + // Loads the given `test_folder/test_file` and asserts the given `candidate` matches the expected values. + #[track_caller] + fn assert_test_vector_equality(test_folder: &str, test_file: &str, candidate: &str, circuit: &str) { + // Get the path to the test file. + let path = test_vector_path(test_folder, test_file, circuit, false); // Assert the test file is equal to the expected value. expect_test::expect_file![path].assert_eq(candidate); } - // In the case that we're creating a test vectors from a trusted branch + // Create a test vector from a trusted revision of Varuna. fn create_test_vector(folder: &str, file: &str, data: &str, circuit: &str) { - // Construct the path for the test folder. - let mut path = resources_path(); - path.push(circuit); - path.push(folder); - - // Create the test folder, if it does not exist. - if !path.exists() { - fs::create_dir(&path).unwrap_or_else(|_| panic!("Failed to create test folder: {path:?}")); - } - - // Construct the path for the test file. - path.push(file); - path.set_extension("txt"); - - // Create the test file, if it does not exist. - if !path.exists() { - fs::File::create(&path).unwrap_or_else(|_| panic!("Failed to create file: {path:?}")); - } + // Get the path to the test file. + let path = test_vector_path(folder, file, circuit, true); + // Write the test vector to file. fs::write(&path, data).unwrap_or_else(|_| panic!("Failed to write to file: {:?}", path)); } // Tests varuna against the test vectors in all circuits in the resources folder. fn test_varuna_with_all_circuits(create_test_vectors: bool) { - let entries = fs::read_dir(resources_path()).expect("Failed to read resources folder"); + let entries = fs::read_dir(resources_path(create_test_vectors)).expect("Failed to read resources folder"); entries.into_iter().for_each(|entry| { let path = entry.unwrap().path(); if path.is_dir() { @@ -630,24 +621,14 @@ mod varuna_test_vectors { }); } - // Create test vectors for all circuits in the resources folder. - #[test] - fn create_prover_test_vectors() { - test_varuna_with_all_circuits(true); - } - - #[test] - fn test_varuna_with_prover_test_vectors() { - test_varuna_with_all_circuits(false); - } - + // Test Varuna against test vectors for a specific circuit. fn test_circuit_with_test_vectors(create_test_vectors: bool, circuit: &str) { // Get the circuit instance from the test vector. - let instance_path = format!("src/snark/varuna/resources/{}/instance.input", circuit); - let instance_file = fs::read_to_string(instance_path).expect("Could not read the file"); - let mut instance = Vec::new(); + let witness_path = format!("src/snark/varuna/resources/{}/witness.input", circuit); + let instance_file = fs::read_to_string(witness_path).expect("Could not read the file"); + let mut witness_vector = Vec::new(); for line in instance_file.lines() { - instance.push(line.to_string()) + witness_vector.push(line.to_string()) } // Initialize challenges from file. @@ -657,7 +638,6 @@ mod varuna_test_vectors { for line in challenges_file.lines() { challenges.push(line) } - let (alpha, _eta_a, eta_b, eta_c, beta, delta_a, delta_b, delta_c, _gamma) = ( Fr::from_str(challenges[0]).unwrap(), Fr::from_str(challenges[1]).unwrap(), @@ -669,6 +649,7 @@ mod varuna_test_vectors { vec![Fr::from_str(challenges[7]).unwrap()], Fr::from_str(challenges[8]).unwrap(), ); + let circuit_combiner = Fr::one(); let instance_combiners = vec![Fr::one()]; @@ -679,26 +660,27 @@ mod varuna_test_vectors { s.push(f.0.0[f.0.0.len() - 1 - i]); } }; - for witness in instance[15].split(',') { + for witness in witness_vector[0].split(',') { if witness.trim() == "" { continue; } add_f_to_state(&mut rng_state, Fr::from_str(witness.trim()).unwrap()); } - let rng = &mut snarkvm_utilities::rand::TestMockRng::fixed(rng_state); - - let max_degree = AHPForR1CS::::max_degree(100, 25, 300).unwrap(); - let universal_srs = VarunaSonicInst::universal_setup(max_degree).unwrap(); + // Create sample circuit which corresponds to instance.input file. let mul_depth = 3; let num_constraints = 7; let num_variables = 7; - + let rng = &mut snarkvm_utilities::rand::TestMockRng::fixed(rng_state); + let max_degree = + AHPForR1CS::::max_degree(num_constraints, num_variables, num_variables * num_constraints).unwrap(); + let universal_srs = VarunaSonicInst::universal_setup(max_degree).unwrap(); let (circ, _) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); let (index_pk, _index_vk) = VarunaSonicInst::circuit_setup(&universal_srs, &circ).unwrap(); let mut keys_to_constraints = BTreeMap::new(); keys_to_constraints.insert(index_pk.circuit.deref(), std::slice::from_ref(&circ)); + // Begin the Varuna protocol execution. let prover_state = AHPForR1CS::<_, MM>::init_prover(&keys_to_constraints, rng).unwrap(); let mut prover_state = AHPForR1CS::<_, MM>::prover_first_round(prover_state, rng).unwrap(); let first_round_oracles = Arc::new(prover_state.first_round_oracles.as_ref().unwrap()); @@ -833,4 +815,9 @@ mod varuna_test_vectors { assert_test_vector_equality("domain", "K", &format!("{:?}", non_zero_domain_elements), circuit); assert_test_vector_equality("domain", "C", &format!("{:?}", variable_domain_elements), circuit); } + + #[test] + fn test_varuna_with_prover_test_vectors() { + test_varuna_with_all_circuits(false); + } } diff --git a/utilities/src/rand.rs b/utilities/src/rand.rs index af60e8a583..e3db207b47 100644 --- a/utilities/src/rand.rs +++ b/utilities/src/rand.rs @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +use anyhow::anyhow; use rand::{ distributions::{Distribution, Standard}, rngs::StdRng, @@ -169,7 +170,7 @@ impl rand::RngCore for TestMockRng { fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand::Error> { for byte in dest.iter_mut() { - *byte = self.state.pop().unwrap() as u8; // TODO: use try_from and convert the Error + *byte = self.state.pop().ok_or(rand::Error::new(anyhow!("Exceeded available internal randomness")))? as u8; } Ok(()) } From 8d79b74aa2b80279eeeb056fc11a3881810fb6a7 Mon Sep 17 00:00:00 2001 From: Michael Turner Date: Thu, 28 Sep 2023 19:39:39 +0200 Subject: [PATCH 019/339] Revise try_fill_bytes Error handling --- utilities/src/rand.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/utilities/src/rand.rs b/utilities/src/rand.rs index e3db207b47..fe85db8ae2 100644 --- a/utilities/src/rand.rs +++ b/utilities/src/rand.rs @@ -12,14 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -use anyhow::anyhow; use rand::{ distributions::{Distribution, Standard}, rngs::StdRng, - Rng, - SeedableRng, + Rng, SeedableRng, }; use rand_xorshift::XorShiftRng; +use std::num::NonZeroU32; /// A trait for a uniform random number generator. pub trait Uniform: Sized { @@ -110,7 +109,11 @@ impl TestRng { /// to do that, we would need to reify the possible elements of strings, /// namely characters and escapes, and randomly generate such elements. fn adjust_backslash_and_doublequote(ch: char) -> char { - if ch == '\\' || ch == '\"' { '0' } else { ch } + if ch == '\\' || ch == '\"' { + '0' + } else { + ch + } } let range = match is_fixed_size { @@ -170,7 +173,7 @@ impl rand::RngCore for TestMockRng { fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand::Error> { for byte in dest.iter_mut() { - *byte = self.state.pop().ok_or(rand::Error::new(anyhow!("Exceeded available internal randomness")))? as u8; + *byte = self.state.pop().ok_or(NonZeroU32::new(rand::Error::CUSTOM_START).unwrap())? as u8; } Ok(()) } From 12bb75946af3c75ec358848a7d89cf62666f7e2c Mon Sep 17 00:00:00 2001 From: Michael Turner Date: Thu, 28 Sep 2023 19:44:37 +0200 Subject: [PATCH 020/339] Revise try_fill_bytes Error handling --- utilities/src/rand.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/utilities/src/rand.rs b/utilities/src/rand.rs index fe85db8ae2..e0fd3453a5 100644 --- a/utilities/src/rand.rs +++ b/utilities/src/rand.rs @@ -15,7 +15,8 @@ use rand::{ distributions::{Distribution, Standard}, rngs::StdRng, - Rng, SeedableRng, + Rng, + SeedableRng, }; use rand_xorshift::XorShiftRng; use std::num::NonZeroU32; @@ -109,11 +110,7 @@ impl TestRng { /// to do that, we would need to reify the possible elements of strings, /// namely characters and escapes, and randomly generate such elements. fn adjust_backslash_and_doublequote(ch: char) -> char { - if ch == '\\' || ch == '\"' { - '0' - } else { - ch - } + if ch == '\\' || ch == '\"' { '0' } else { ch } } let range = match is_fixed_size { From 1a93a87dd83f43201ba366334b34a4fea129d7ea Mon Sep 17 00:00:00 2001 From: Michael Turner Date: Tue, 10 Oct 2023 14:38:00 +0200 Subject: [PATCH 021/339] Remove TestMockRng --- .../ahp/prover/round_functions/second.rs | 5 ++- .../ahp/prover/round_functions/third.rs | 8 +++- .../varuna/data_structures/test_circuit.rs | 23 ++++++++++++ .../varuna/resources/circuit_0/witness.input | 4 +- algorithms/src/snark/varuna/tests.rs | 34 ++++++----------- utilities/src/rand.rs | 37 ------------------- 6 files changed, 46 insertions(+), 65 deletions(-) diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs index a598fb79f0..9060e7746e 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/second.rs @@ -21,7 +21,10 @@ use crate::{ ahp::{verifier, AHPForR1CS}, prover, selectors::apply_randomized_selector, - witness_label, Circuit, CircuitId, SNARKMode, + witness_label, + Circuit, + CircuitId, + SNARKMode, }, }; use anyhow::Result; diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs index f1d011ead8..bccfedfaac 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/third.rs @@ -16,7 +16,9 @@ use crate::{ fft::{ domain::{FFTPrecomputation, IFFTPrecomputation}, polynomial::PolyMultiplier, - DensePolynomial, EvaluationDomain, Evaluations, + DensePolynomial, + EvaluationDomain, + Evaluations, }, polycommit::sonic_pc::{LabeledPolynomial, PolynomialInfo, PolynomialLabel}, snark::varuna::{ @@ -24,7 +26,9 @@ use crate::{ matrices::transpose, prover::{self, MatrixSums, ThirdMessage}, selectors::apply_randomized_selector, - AHPError, Matrix, SNARKMode, + AHPError, + Matrix, + SNARKMode, }, }; use snarkvm_fields::PrimeField; diff --git a/algorithms/src/snark/varuna/data_structures/test_circuit.rs b/algorithms/src/snark/varuna/data_structures/test_circuit.rs index 8e66d71f03..e269ef7d46 100644 --- a/algorithms/src/snark/varuna/data_structures/test_circuit.rs +++ b/algorithms/src/snark/varuna/data_structures/test_circuit.rs @@ -84,6 +84,7 @@ impl ConstraintSynthesizer for TestCircuit TestCircuit { + // Generate a test circuit with a random witness. pub fn gen_rand( mul_depth: usize, num_constraints: usize, @@ -104,4 +105,26 @@ impl TestCircuit { (TestCircuit { a: Some(a), b: Some(b), num_constraints, num_variables, mul_depth }, public_inputs) } + + // Generate a test circuit with a fixed witness. + pub fn generate_circuit_with_fixed_witness( + a: u128, + b: u128, + mul_depth: usize, + num_constraints: usize, + num_variables: usize, + ) -> (Self, Vec) { + let mut public_inputs: Vec = Vec::with_capacity(mul_depth); + let a = F::from(a); + let b = F::from(b); + for j in 1..(mul_depth + 1) { + let mut new_var = a; + for _ in 0..j { + new_var.mul_assign(&b); + } + public_inputs.push(new_var); + } + + (TestCircuit { a: Some(a), b: Some(b), num_constraints, num_variables, mul_depth }, public_inputs) + } } diff --git a/algorithms/src/snark/varuna/resources/circuit_0/witness.input b/algorithms/src/snark/varuna/resources/circuit_0/witness.input index a93494e178..4e9e621149 100644 --- a/algorithms/src/snark/varuna/resources/circuit_0/witness.input +++ b/algorithms/src/snark/varuna/resources/circuit_0/witness.input @@ -1,2 +1,2 @@ -4, 2 -8, 4, 2, 16, 32, \ No newline at end of file +[2, 4] +[1, 8, 32, 128, 2, 4, 2] \ No newline at end of file diff --git a/algorithms/src/snark/varuna/tests.rs b/algorithms/src/snark/varuna/tests.rs index 8327b680bf..70eeb548e7 100644 --- a/algorithms/src/snark/varuna/tests.rs +++ b/algorithms/src/snark/varuna/tests.rs @@ -538,8 +538,8 @@ mod varuna_test_vectors { snark::varuna::{ahp::verifier, AHPForR1CS, TestCircuit, VarunaNonHidingMode, VarunaSNARK}, traits::snark::SNARK, }; - use snarkvm_curves::bls12_377::{Bls12_377, Fq, Fr, FrParameters}; - use snarkvm_fields::{Fp256, One}; + use snarkvm_curves::bls12_377::{Bls12_377, Fq, Fr}; + use snarkvm_fields::One; use std::{collections::BTreeMap, fs, ops::Deref, path::PathBuf, str::FromStr, sync::Arc}; type FS = crate::crypto_hash::PoseidonSponge; @@ -623,13 +623,11 @@ mod varuna_test_vectors { // Test Varuna against test vectors for a specific circuit. fn test_circuit_with_test_vectors(create_test_vectors: bool, circuit: &str) { - // Get the circuit instance from the test vector. + // Initialize the parts of the witness used in the multiplicative constraints. let witness_path = format!("src/snark/varuna/resources/{}/witness.input", circuit); let instance_file = fs::read_to_string(witness_path).expect("Could not read the file"); - let mut witness_vector = Vec::new(); - for line in instance_file.lines() { - witness_vector.push(line.to_string()) - } + let witness: Vec = serde_json::from_str(instance_file.lines().next().unwrap()).unwrap(); + let (a, b) = (witness[0], witness[1]); // Initialize challenges from file. let challenges_path = format!("src/snark/varuna/resources/{}/challenges.input", circuit); @@ -653,29 +651,19 @@ mod varuna_test_vectors { let circuit_combiner = Fr::one(); let instance_combiners = vec![Fr::one()]; - let mut rng_state = vec![0u64; 100]; - let add_f_to_state = |s: &mut Vec, f: Fp256| { - // Fp384 field elements sample 6 u64 values in total. - for i in 0..f.0.0.len() { - s.push(f.0.0[f.0.0.len() - 1 - i]); - } - }; - for witness in witness_vector[0].split(',') { - if witness.trim() == "" { - continue; - } - add_f_to_state(&mut rng_state, Fr::from_str(witness.trim()).unwrap()); - } - // Create sample circuit which corresponds to instance.input file. let mul_depth = 3; let num_constraints = 7; let num_variables = 7; - let rng = &mut snarkvm_utilities::rand::TestMockRng::fixed(rng_state); + + // Create a fixed seed rng that matches those the test vectors were generated with. + let rng = &mut snarkvm_utilities::rand::TestRng::fixed(4730); let max_degree = AHPForR1CS::::max_degree(num_constraints, num_variables, num_variables * num_constraints).unwrap(); let universal_srs = VarunaSonicInst::universal_setup(max_degree).unwrap(); - let (circ, _) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); + let (circ, _) = + TestCircuit::generate_circuit_with_fixed_witness(a, b, mul_depth, num_constraints, num_variables); + println!("Circuit: {:?}", circ); let (index_pk, _index_vk) = VarunaSonicInst::circuit_setup(&universal_srs, &circ).unwrap(); let mut keys_to_constraints = BTreeMap::new(); keys_to_constraints.insert(index_pk.circuit.deref(), std::slice::from_ref(&circ)); diff --git a/utilities/src/rand.rs b/utilities/src/rand.rs index e0fd3453a5..818aa969fe 100644 --- a/utilities/src/rand.rs +++ b/utilities/src/rand.rs @@ -19,7 +19,6 @@ use rand::{ SeedableRng, }; use rand_xorshift::XorShiftRng; -use std::num::NonZeroU32; /// A trait for a uniform random number generator. pub trait Uniform: Sized { @@ -141,39 +140,3 @@ impl rand::RngCore for TestRng { } impl rand::CryptoRng for TestRng {} - -/// A cache of numbers LARPing as an RNG used **solely** for testing and benchmarking, **not** for any real world purposes. -pub struct TestMockRng { - state: Vec, -} - -impl TestMockRng { - pub fn fixed(state: Vec) -> Self { - TestMockRng { state } - } -} - -impl rand::RngCore for TestMockRng { - fn next_u32(&mut self) -> u32 { - self.state.pop().unwrap() as u32 - } - - fn next_u64(&mut self) -> u64 { - self.state.pop().unwrap() - } - - fn fill_bytes(&mut self, dest: &mut [u8]) { - for byte in dest.iter_mut() { - *byte = self.state.pop().unwrap() as u8; - } - } - - fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand::Error> { - for byte in dest.iter_mut() { - *byte = self.state.pop().ok_or(NonZeroU32::new(rand::Error::CUSTOM_START).unwrap())? as u8; - } - Ok(()) - } -} - -impl rand::CryptoRng for TestMockRng {} From 55941409659893592cc710628d17c382a6168131 Mon Sep 17 00:00:00 2001 From: Michael Turner Date: Tue, 10 Oct 2023 15:22:24 +0200 Subject: [PATCH 022/339] Limit visibility to crate::snark::varuna --- algorithms/src/snark/varuna/ahp/indexer/indexer.rs | 4 ---- algorithms/src/snark/varuna/ahp/prover/oracles.rs | 10 +++++----- algorithms/src/snark/varuna/varuna.rs | 1 + 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs index b762e1b8da..c38e4a9970 100644 --- a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs +++ b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs @@ -64,10 +64,6 @@ impl AHPForR1CS { id, } = Self::index_helper(c).map_err(|e| anyhow!("{e:?}"))?; - let joint_arithmetization_time = start_timer!(|| format!("Arithmetizing A,B,C {id}")); - - end_timer!(joint_arithmetization_time); - let fft_precomp_time = start_timer!(|| format!("Precomputing roots of unity {id}")); let (fft_precomputation, ifft_precomputation) = Self::fft_precomputation( diff --git a/algorithms/src/snark/varuna/ahp/prover/oracles.rs b/algorithms/src/snark/varuna/ahp/prover/oracles.rs index 81746b50f9..725b6a291d 100644 --- a/algorithms/src/snark/varuna/ahp/prover/oracles.rs +++ b/algorithms/src/snark/varuna/ahp/prover/oracles.rs @@ -112,17 +112,17 @@ impl ThirdOracles { /// The fourth set of prover oracles. #[derive(Debug)] pub struct FourthOracles { - pub gs: BTreeMap>, + pub(in crate::snark::varuna) gs: BTreeMap>, } #[derive(Debug)] -pub struct MatrixGs { +pub(in crate::snark::varuna) struct MatrixGs { /// The polynomial `g_a` resulting from the second sumcheck. - pub(crate) g_a: LabeledPolynomial, + pub(in crate::snark::varuna) g_a: LabeledPolynomial, /// The polynomial `g_b` resulting from the second sumcheck. - pub(crate) g_b: LabeledPolynomial, + pub(in crate::snark::varuna) g_b: LabeledPolynomial, /// The polynomial `g_c` resulting from the second sumcheck. - pub(crate) g_c: LabeledPolynomial, + pub(in crate::snark::varuna) g_c: LabeledPolynomial, } impl MatrixGs { diff --git a/algorithms/src/snark/varuna/varuna.rs b/algorithms/src/snark/varuna/varuna.rs index 0e03daf918..ac07edcee3 100644 --- a/algorithms/src/snark/varuna/varuna.rs +++ b/algorithms/src/snark/varuna/varuna.rs @@ -421,6 +421,7 @@ where let (second_oracles, prover_state) = AHPForR1CS::<_, SM>::prover_second_round(&verifier_first_message, prover_state, zk_rng)?; + let second_round_comm_time = start_timer!(|| "Committing to second round polys"); let (second_commitments, second_commitment_randomnesses) = SonicKZG10::::commit( universal_prover, From 72192cfdfb4f9e42f253afae919d5b5541a9ff25 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Wed, 25 Oct 2023 12:28:57 +0200 Subject: [PATCH 023/339] fix: avoid indexing out of range in skip_leading_zeros_and_convert_to_bigints Signed-off-by: ljedrz --- algorithms/src/polycommit/kzg10/mod.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/algorithms/src/polycommit/kzg10/mod.rs b/algorithms/src/polycommit/kzg10/mod.rs index 8ddaf0f79c..6213924ff8 100644 --- a/algorithms/src/polycommit/kzg10/mod.rs +++ b/algorithms/src/polycommit/kzg10/mod.rs @@ -451,11 +451,12 @@ fn skip_leading_zeros_and_convert_to_bigints(p: &DensePolynomial< if p.coeffs.is_empty() { (0, vec![]) } else { - let mut num_leading_zeros = 0; - while p.coeffs[num_leading_zeros].is_zero() && num_leading_zeros < p.coeffs.len() { - num_leading_zeros += 1; - } - let coeffs = convert_to_bigints(&p.coeffs[num_leading_zeros..]); + let num_leading_zeros = p.coeffs.iter().take_while(|c| c.is_zero()).count(); + let coeffs = if num_leading_zeros == p.coeffs.len() { + vec![] + } else { + convert_to_bigints(&p.coeffs[num_leading_zeros..]) + }; (num_leading_zeros, coeffs) } } From c2da66e75ceac4ec76dc8b4b9dc7f2e13ef04122 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu Date: Wed, 25 Oct 2023 11:35:39 -0400 Subject: [PATCH 024/339] Add tests --- .../async_without_finalize_fail.aleo | 17 ++++++++ .../call_after_async_fail.aleo | 37 ++++++++++++++++++ .../future_out_of_order_fail.aleo | 39 +++++++++++++++++++ .../ignore_finalize_fail.aleo | 33 ++++++++++++++++ .../last_reg_is_not_future_fail.aleo | 25 ++++++++++++ .../multiple_async_fail.aleo | 38 ++++++++++++++++++ .../out_of_order_await_fail.aleo | 39 +++++++++++++++++++ .../output_child_without_async_fail.aleo | 32 +++++++++++++++ .../unawaited_future_fail.aleo | 38 ++++++++++++++++++ .../unused_future_fail.aleo | 37 ++++++++++++++++++ 10 files changed, 335 insertions(+) create mode 100644 synthesizer/tests/tests/vm/execute_and_finalize/async_without_finalize_fail.aleo create mode 100644 synthesizer/tests/tests/vm/execute_and_finalize/call_after_async_fail.aleo create mode 100644 synthesizer/tests/tests/vm/execute_and_finalize/future_out_of_order_fail.aleo create mode 100644 synthesizer/tests/tests/vm/execute_and_finalize/ignore_finalize_fail.aleo create mode 100644 synthesizer/tests/tests/vm/execute_and_finalize/last_reg_is_not_future_fail.aleo create mode 100644 synthesizer/tests/tests/vm/execute_and_finalize/multiple_async_fail.aleo create mode 100644 synthesizer/tests/tests/vm/execute_and_finalize/out_of_order_await_fail.aleo create mode 100644 synthesizer/tests/tests/vm/execute_and_finalize/output_child_without_async_fail.aleo create mode 100644 synthesizer/tests/tests/vm/execute_and_finalize/unawaited_future_fail.aleo create mode 100644 synthesizer/tests/tests/vm/execute_and_finalize/unused_future_fail.aleo diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/async_without_finalize_fail.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/async_without_finalize_fail.aleo new file mode 100644 index 0000000000..caf9ff0c22 --- /dev/null +++ b/synthesizer/tests/tests/vm/execute_and_finalize/async_without_finalize_fail.aleo @@ -0,0 +1,17 @@ +/* +randomness: 45791624 +cases: [] +*/ + +program child.aleo; + +function foo: + input r0 as field.private; + input r1 as field.private; + async foo self.caller into r2; + add r0 r1 into r3; + output r3 as field.private; + + + + diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/call_after_async_fail.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/call_after_async_fail.aleo new file mode 100644 index 0000000000..272bc951e0 --- /dev/null +++ b/synthesizer/tests/tests/vm/execute_and_finalize/call_after_async_fail.aleo @@ -0,0 +1,37 @@ +/* +randomness: 45791624 +cases: [] +*/ + +program child.aleo; + +mapping count: + key as address.public; + value as field.public; + +function foo: + async foo self.caller into r0; + output r0 as child.aleo/foo.future; + +finalize foo: + input r0 as address.public; + get.or_use count[r0] 0field into r1; + add r1 1field into r2; + set r2 into count[r0]; + +///////////////////////////////////////////////// + +import child.aleo; + +program parent.aleo; + +function foo: + call child.aleo/foo into r0; + async foo r0 into r1; + call child.aleo/foo into r2; + output r1 as parent.aleo/foo.future; + +finalize foo: + input r0 as child.aleo/foo.future; + await r0; + diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/future_out_of_order_fail.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/future_out_of_order_fail.aleo new file mode 100644 index 0000000000..f2b6225a55 --- /dev/null +++ b/synthesizer/tests/tests/vm/execute_and_finalize/future_out_of_order_fail.aleo @@ -0,0 +1,39 @@ +/* +randomness: 45791624 +cases: [] +*/ + +program child.aleo; + +mapping count: + key as address.public; + value as field.public; + +function foo: + async foo self.caller into r0; + output r0 as child.aleo/foo.future; + +finalize foo: + input r0 as address.public; + get.or_use count[r0] 0field into r1; + add r1 1field into r2; + set r2 into count[r0]; + +///////////////////////////////////////////////// + +import child.aleo; + +program parent.aleo; + +function foo: + call child.aleo/foo into r0; + call child.aleo/foo into r1; + async foo r1 r0 into r2; + output r2 as parent.aleo/foo.future; + +finalize foo: + input r0 as child.aleo/foo.future; + input r1 as child.aleo/foo.future; + await r0; + await r1; + diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/ignore_finalize_fail.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/ignore_finalize_fail.aleo new file mode 100644 index 0000000000..7514c7773c --- /dev/null +++ b/synthesizer/tests/tests/vm/execute_and_finalize/ignore_finalize_fail.aleo @@ -0,0 +1,33 @@ +/* +randomness: 45791624 +cases: [] +*/ + +program child.aleo; + +mapping count: + key as address.public; + value as field.public; + +function foo: + async foo self.caller into r0; + output r0 as child.aleo/foo.future; + +finalize foo: + input r0 as address.public; + get.or_use count[r0] 0field into r1; + add r1 1field into r2; + set r2 into count[r0]; + +///////////////////////////////////////////////// + +import child.aleo; + +program parent.aleo; + +function foo: + input r0 as field.private; + input r1 as field.private; + call child.aleo/foo into r2; + add r0 r1 into r3; + output r3 as field.private; diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/last_reg_is_not_future_fail.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/last_reg_is_not_future_fail.aleo new file mode 100644 index 0000000000..0a0f2ea01b --- /dev/null +++ b/synthesizer/tests/tests/vm/execute_and_finalize/last_reg_is_not_future_fail.aleo @@ -0,0 +1,25 @@ +/* +randomness: 45791624 +cases: [] +*/ + +program child.aleo; + +mapping count: + key as address.public; + value as field.public; + +function foo: + input r0 as field.private; + input r1 as field.private; + async foo self.caller into r2; + add r0 r1 into r3; + output r2 as child.aleo/foo.future; + output r3 as field.private; + +finalize foo: + input r0 as address.public; + get.or_use count[r0] 0field into r1; + add r1 1field into r2; + set r2 into count[r0]; + diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/multiple_async_fail.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/multiple_async_fail.aleo new file mode 100644 index 0000000000..7a186c0f02 --- /dev/null +++ b/synthesizer/tests/tests/vm/execute_and_finalize/multiple_async_fail.aleo @@ -0,0 +1,38 @@ +/* +randomness: 45791624 +cases: [] +*/ + +program child.aleo; + +mapping count: + key as address.public; + value as field.public; + +function foo: + async foo self.caller into r0; + output r0 as child.aleo/foo.future; + +finalize foo: + input r0 as address.public; + get.or_use count[r0] 0field into r1; + add r1 1field into r2; + set r2 into count[r0]; + +///////////////////////////////////////////////// + +import child.aleo; + +program parent.aleo; + +function foo: + call child.aleo/foo into r0; + call child.aleo/foo into r1; + async foo r0 into r2; + async foo r1 into r3; + output r2 as parent.aleo/foo.future; + +finalize foo: + input r0 as child.aleo/foo.future; + await r0; + diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/out_of_order_await_fail.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/out_of_order_await_fail.aleo new file mode 100644 index 0000000000..b86f29b8b5 --- /dev/null +++ b/synthesizer/tests/tests/vm/execute_and_finalize/out_of_order_await_fail.aleo @@ -0,0 +1,39 @@ +/* +randomness: 45791624 +cases: [] +*/ + +program child.aleo; + +mapping count: + key as address.public; + value as field.public; + +function foo: + async foo self.caller into r0; + output r0 as child.aleo/foo.future; + +finalize foo: + input r0 as address.public; + get.or_use count[r0] 0field into r1; + add r1 1field into r2; + set r2 into count[r0]; + +///////////////////////////////////////////////// + +import child.aleo; + +program parent.aleo; + +function foo: + call child.aleo/foo into r0; + call child.aleo/foo into r1; + async foo r0 r1 into r2; + output r2 as parent.aleo/foo.future; + +finalize foo: + input r0 as child.aleo/foo.future; + input r1 as child.aleo/foo.future; + await r1; + await r0; + diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/output_child_without_async_fail.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/output_child_without_async_fail.aleo new file mode 100644 index 0000000000..7d34f0c060 --- /dev/null +++ b/synthesizer/tests/tests/vm/execute_and_finalize/output_child_without_async_fail.aleo @@ -0,0 +1,32 @@ +/* +randomness: 45791624 +cases: [] +*/ + +program child.aleo; + +mapping count: + key as address.public; + value as field.public; + +function foo: + async foo self.caller into r0; + output r0 as child.aleo/foo.future; + +finalize foo: + input r0 as address.public; + get.or_use count[r0] 0field into r1; + add r1 1field into r2; + set r2 into count[r0]; + +///////////////////////////////////////////////// + +import child.aleo; + +program parent.aleo; + +function foo: + call child.aleo/foo into r0; + output r2 as child.aleo/foo.future; + + diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/unawaited_future_fail.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/unawaited_future_fail.aleo new file mode 100644 index 0000000000..26736dca73 --- /dev/null +++ b/synthesizer/tests/tests/vm/execute_and_finalize/unawaited_future_fail.aleo @@ -0,0 +1,38 @@ +/* +randomness: 45791624 +cases: [] +*/ + +program child.aleo; + +mapping count: + key as address.public; + value as field.public; + +function foo: + async foo self.caller into r0; + output r0 as child.aleo/foo.future; + +finalize foo: + input r0 as address.public; + get.or_use count[r0] 0field into r1; + add r1 1field into r2; + set r2 into count[r0]; + +///////////////////////////////////////////////// + +import child.aleo; + +program parent.aleo; + +function foo: + call child.aleo/foo into r0; + call child.aleo/foo into r1; + async foo r0 r1 into r2; + output r2 as parent.aleo/foo.future; + +finalize foo: + input r0 as child.aleo/foo.future; + input r1 as child.aleo/foo.future; + await r0; + diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/unused_future_fail.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/unused_future_fail.aleo new file mode 100644 index 0000000000..9277b9a3dd --- /dev/null +++ b/synthesizer/tests/tests/vm/execute_and_finalize/unused_future_fail.aleo @@ -0,0 +1,37 @@ +/* +randomness: 45791624 +cases: [] +*/ + +program child.aleo; + +mapping count: + key as address.public; + value as field.public; + +function foo: + async foo self.caller into r0; + output r0 as child.aleo/foo.future; + +finalize foo: + input r0 as address.public; + get.or_use count[r0] 0field into r1; + add r1 1field into r2; + set r2 into count[r0]; + +///////////////////////////////////////////////// + +import child.aleo; + +program parent.aleo; + +function foo: + call child.aleo/foo into r0; + call child.aleo/foo into r1; + async foo r0 into r2; + output r2 as parent.aleo/foo.future; + +finalize foo: + input r0 as child.aleo/foo.future; + await r0; + From d18bed2e4ba6d0bb31044f64e07cdff30dfea09a Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu Date: Wed, 25 Oct 2023 11:36:01 -0400 Subject: [PATCH 025/339] Implement fix --- .../src/stack/finalize_types/initialize.rs | 30 ++++++++++++++++++- .../src/stack/register_types/initialize.rs | 24 +++++++++++---- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/synthesizer/process/src/stack/finalize_types/initialize.rs b/synthesizer/process/src/stack/finalize_types/initialize.rs index 9a7bc33440..0981ee9fe7 100644 --- a/synthesizer/process/src/stack/finalize_types/initialize.rs +++ b/synthesizer/process/src/stack/finalize_types/initialize.rs @@ -39,16 +39,44 @@ impl FinalizeTypes { let mut finalize_types = Self { inputs: IndexMap::new(), destinations: IndexMap::new() }; // Step 1. Check the inputs are well-formed. + let mut input_futures = vec![]; for input in finalize.inputs() { // Check the input register type. - finalize_types.check_input(stack, input.register(), input.finalize_type())?; + let register = input.register().clone(); + let finalize_type = input.finalize_type(); + + // Check the input register. + finalize_types.check_input(stack, ®ister, finalize_type)?; + + // If the input is a future, add it to the list of input futures. + if let FinalizeType::Future(locator) = finalize_type { + input_futures.push((register, *locator)); + } } // Step 2. Check the commands are well-formed. + let mut consumed_futures = vec![]; for command in finalize.commands() { // Check the command opcode, operands, and destinations. finalize_types.check_command(stack, finalize, command)?; + + // If the command is an `await`, add the future to the list of consumed futures. + if let Command::Await(await_) = command { + let register = await_.register().clone(); + // Note that `check_command` ensures that the register is a future. This is an additional check. + let locator = match finalize_types.get_type(stack, ®ister)? { + FinalizeType::Future(locator) => locator, + FinalizeType::Plaintext(..) => bail!("Expected a future"), + }; + consumed_futures.push((register, locator)); + } } + // Check that the input futures are consumed in the order they are passed in. + ensure!( + input_futures == consumed_futures, + "Futures in finalize '{}' are not awaited in the order they are passed in.", + finalize.name() + ); Ok(finalize_types) } diff --git a/synthesizer/process/src/stack/register_types/initialize.rs b/synthesizer/process/src/stack/register_types/initialize.rs index 387f0e0d2e..3f34d5f89d 100644 --- a/synthesizer/process/src/stack/register_types/initialize.rs +++ b/synthesizer/process/src/stack/register_types/initialize.rs @@ -164,8 +164,8 @@ impl RegisterTypes { let mut future_registers = register_types .destinations .iter() - .filter_map(|(_, register_type)| match register_type { - RegisterType::Future(locator) => Some(*locator), + .filter_map(|(index, register_type)| match register_type { + RegisterType::Future(locator) => Some((Register::Locator(*index), *locator)), _ => None, }) .collect::>(); @@ -190,7 +190,7 @@ impl RegisterTypes { .iter() .filter_map(|operand| match operand { Operand::Register(register) => match register_types.get_type(stack, register).ok() { - Some(RegisterType::Future(locator)) => Some(locator), + Some(RegisterType::Future(locator)) => Some((register.clone(), locator)), _ => None, }, _ => None, @@ -461,8 +461,22 @@ impl RegisterTypes { // Retrieve the program. let external = stack.get_external_program(program_id)?; - // Ensure the function or closure exists in the program. - if !external.contains_function(resource) && !external.contains_closure(resource) { + // Check that function exists in the program. + if let Ok(child_function) = external.get_function(resource) { + // If the child function contains a finalize block, then the parent function must also contain a finalize block. + let child_contains_finalize = child_function.finalize_logic().is_some(); + let parent_contains_finalize = + stack.get_function(closure_or_function_name)?.finalize_logic().is_some(); + if child_contains_finalize && !parent_contains_finalize { + bail!( + "Function '{}/{closure_or_function_name}' must contain a finalize block, since it calls '{}/{resource}'.", + stack.program_id(), + program_id + ) + } + } + // Otherwise, ensure the closure exists in the program. + else if !external.contains_closure(resource) { bail!("'{resource}' is not defined in '{}'.", external.id()) } } From d50d161c19dbf24e496cb35911715da715c5ab32 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu Date: Wed, 25 Oct 2023 11:36:15 -0400 Subject: [PATCH 026/339] Regen expectations --- .../vm/execute_and_finalize/async_without_finalize_fail.out | 3 +++ .../vm/execute_and_finalize/call_after_async_fail.out | 3 +++ .../vm/execute_and_finalize/future_out_of_order_fail.out | 3 +++ .../vm/execute_and_finalize/ignore_finalize_fail.out | 3 +++ .../vm/execute_and_finalize/last_reg_is_not_future_fail.out | 3 +++ .../vm/execute_and_finalize/multiple_async_fail.out | 3 +++ .../vm/execute_and_finalize/out_of_order_await_fail.out | 3 +++ .../execute_and_finalize/output_child_without_async_fail.out | 3 +++ .../vm/execute_and_finalize/unawaited_future_fail.out | 3 +++ .../vm/execute_and_finalize/unused_future_fail.out | 3 +++ 10 files changed, 30 insertions(+) create mode 100644 synthesizer/tests/expectations/vm/execute_and_finalize/async_without_finalize_fail.out create mode 100644 synthesizer/tests/expectations/vm/execute_and_finalize/call_after_async_fail.out create mode 100644 synthesizer/tests/expectations/vm/execute_and_finalize/future_out_of_order_fail.out create mode 100644 synthesizer/tests/expectations/vm/execute_and_finalize/ignore_finalize_fail.out create mode 100644 synthesizer/tests/expectations/vm/execute_and_finalize/last_reg_is_not_future_fail.out create mode 100644 synthesizer/tests/expectations/vm/execute_and_finalize/multiple_async_fail.out create mode 100644 synthesizer/tests/expectations/vm/execute_and_finalize/out_of_order_await_fail.out create mode 100644 synthesizer/tests/expectations/vm/execute_and_finalize/output_child_without_async_fail.out create mode 100644 synthesizer/tests/expectations/vm/execute_and_finalize/unawaited_future_fail.out create mode 100644 synthesizer/tests/expectations/vm/execute_and_finalize/unused_future_fail.out diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/async_without_finalize_fail.out b/synthesizer/tests/expectations/vm/execute_and_finalize/async_without_finalize_fail.out new file mode 100644 index 0000000000..e12989bca9 --- /dev/null +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/async_without_finalize_fail.out @@ -0,0 +1,3 @@ +errors: +- 'Failed to run `VM::deploy for program child.aleo: ''child.aleo/foo'' does not have a finalize block' +outputs: [] diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/call_after_async_fail.out b/synthesizer/tests/expectations/vm/execute_and_finalize/call_after_async_fail.out new file mode 100644 index 0000000000..cf7e6921fd --- /dev/null +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/call_after_async_fail.out @@ -0,0 +1,3 @@ +errors: +- 'Failed to run `VM::deploy for program parent.aleo: The ''call'' can only be invoked before an ''async'' instruction' +outputs: [] diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/future_out_of_order_fail.out b/synthesizer/tests/expectations/vm/execute_and_finalize/future_out_of_order_fail.out new file mode 100644 index 0000000000..0cea7546f1 --- /dev/null +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/future_out_of_order_fail.out @@ -0,0 +1,3 @@ +errors: +- 'Failed to run `VM::deploy for program parent.aleo: Function ''foo'' contains futures, but the ''async'' instruction does not consume all of them in the order they were produced' +outputs: [] diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/ignore_finalize_fail.out b/synthesizer/tests/expectations/vm/execute_and_finalize/ignore_finalize_fail.out new file mode 100644 index 0000000000..1afb6b4e21 --- /dev/null +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/ignore_finalize_fail.out @@ -0,0 +1,3 @@ +errors: +- 'Failed to run `VM::deploy for program parent.aleo: Function ''parent.aleo/foo'' must contain a finalize block, since it calls ''child.aleo/foo''.' +outputs: [] diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/last_reg_is_not_future_fail.out b/synthesizer/tests/expectations/vm/execute_and_finalize/last_reg_is_not_future_fail.out new file mode 100644 index 0000000000..2195cccd79 --- /dev/null +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/last_reg_is_not_future_fail.out @@ -0,0 +1,3 @@ +errors: +- 'Failed to run `VM::deploy for program child.aleo: The last output of function ''foo'' must be a future associated with itself' +outputs: [] diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/multiple_async_fail.out b/synthesizer/tests/expectations/vm/execute_and_finalize/multiple_async_fail.out new file mode 100644 index 0000000000..2c841f10f6 --- /dev/null +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/multiple_async_fail.out @@ -0,0 +1,3 @@ +errors: +- 'Failed to run `VM::deploy for program parent.aleo: Function ''foo'' can contain at most one ''async'' instruction' +outputs: [] diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/out_of_order_await_fail.out b/synthesizer/tests/expectations/vm/execute_and_finalize/out_of_order_await_fail.out new file mode 100644 index 0000000000..7d4109cee6 --- /dev/null +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/out_of_order_await_fail.out @@ -0,0 +1,3 @@ +errors: +- 'Failed to run `VM::deploy for program parent.aleo: Futures in finalize ''foo'' are not awaited in the order they are passed in.' +outputs: [] diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/output_child_without_async_fail.out b/synthesizer/tests/expectations/vm/execute_and_finalize/output_child_without_async_fail.out new file mode 100644 index 0000000000..1afb6b4e21 --- /dev/null +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/output_child_without_async_fail.out @@ -0,0 +1,3 @@ +errors: +- 'Failed to run `VM::deploy for program parent.aleo: Function ''parent.aleo/foo'' must contain a finalize block, since it calls ''child.aleo/foo''.' +outputs: [] diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/unawaited_future_fail.out b/synthesizer/tests/expectations/vm/execute_and_finalize/unawaited_future_fail.out new file mode 100644 index 0000000000..7d4109cee6 --- /dev/null +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/unawaited_future_fail.out @@ -0,0 +1,3 @@ +errors: +- 'Failed to run `VM::deploy for program parent.aleo: Futures in finalize ''foo'' are not awaited in the order they are passed in.' +outputs: [] diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/unused_future_fail.out b/synthesizer/tests/expectations/vm/execute_and_finalize/unused_future_fail.out new file mode 100644 index 0000000000..0cea7546f1 --- /dev/null +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/unused_future_fail.out @@ -0,0 +1,3 @@ +errors: +- 'Failed to run `VM::deploy for program parent.aleo: Function ''foo'' contains futures, but the ''async'' instruction does not consume all of them in the order they were produced' +outputs: [] From 0481d6aad934e06852a86ed60e672630a5a61327 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu Date: Wed, 25 Oct 2023 11:52:31 -0400 Subject: [PATCH 027/339] Cleanup --- synthesizer/process/src/stack/finalize_types/initialize.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/synthesizer/process/src/stack/finalize_types/initialize.rs b/synthesizer/process/src/stack/finalize_types/initialize.rs index 0981ee9fe7..4d52b7150f 100644 --- a/synthesizer/process/src/stack/finalize_types/initialize.rs +++ b/synthesizer/process/src/stack/finalize_types/initialize.rs @@ -44,8 +44,6 @@ impl FinalizeTypes { // Check the input register type. let register = input.register().clone(); let finalize_type = input.finalize_type(); - - // Check the input register. finalize_types.check_input(stack, ®ister, finalize_type)?; // If the input is a future, add it to the list of input futures. From 1b575af7f78ca15d0c73838d53ce98aabfdeff2b Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu Date: Wed, 25 Oct 2023 18:33:32 -0400 Subject: [PATCH 028/339] Address feedback --- .../src/stack/finalize_types/initialize.rs | 16 ++++++++-------- .../src/stack/register_types/initialize.rs | 19 +++++++++---------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/synthesizer/process/src/stack/finalize_types/initialize.rs b/synthesizer/process/src/stack/finalize_types/initialize.rs index 4d52b7150f..243113ef85 100644 --- a/synthesizer/process/src/stack/finalize_types/initialize.rs +++ b/synthesizer/process/src/stack/finalize_types/initialize.rs @@ -38,13 +38,13 @@ impl FinalizeTypes { // Initialize a map of registers to their types. let mut finalize_types = Self { inputs: IndexMap::new(), destinations: IndexMap::new() }; - // Step 1. Check the inputs are well-formed. - let mut input_futures = vec![]; + // Step 1. Check the inputs are well-formed. Store the input futures. + let mut input_futures = Vec::new(); for input in finalize.inputs() { // Check the input register type. - let register = input.register().clone(); + let register = input.register(); let finalize_type = input.finalize_type(); - finalize_types.check_input(stack, ®ister, finalize_type)?; + finalize_types.check_input(stack, register, finalize_type)?; // If the input is a future, add it to the list of input futures. if let FinalizeType::Future(locator) = finalize_type { @@ -52,17 +52,17 @@ impl FinalizeTypes { } } - // Step 2. Check the commands are well-formed. - let mut consumed_futures = vec![]; + // Step 2. Check the commands are well-formed. Store the futures consumed by the `await` commands. + let mut consumed_futures = Vec::new(); for command in finalize.commands() { // Check the command opcode, operands, and destinations. finalize_types.check_command(stack, finalize, command)?; // If the command is an `await`, add the future to the list of consumed futures. if let Command::Await(await_) = command { - let register = await_.register().clone(); + let register = await_.register(); // Note that `check_command` ensures that the register is a future. This is an additional check. - let locator = match finalize_types.get_type(stack, ®ister)? { + let locator = match finalize_types.get_type(stack, register)? { FinalizeType::Future(locator) => locator, FinalizeType::Plaintext(..) => bail!("Expected a future"), }; diff --git a/synthesizer/process/src/stack/register_types/initialize.rs b/synthesizer/process/src/stack/register_types/initialize.rs index 3f34d5f89d..075e216b46 100644 --- a/synthesizer/process/src/stack/register_types/initialize.rs +++ b/synthesizer/process/src/stack/register_types/initialize.rs @@ -170,20 +170,19 @@ impl RegisterTypes { }) .collect::>(); - // Remove the last locator, since this is the future created by the `async` call. - future_registers.pop(); - - // Check that all the registers were consumed by the `async` call, in order. match async_ { + // If no `async` instruction exists, then there should not be any future registers. None => { - if !future_registers.is_empty() { - bail!( - "Function '{}' contains futures, but does not contain an 'async' instruction", - function.name() - ) - } + ensure!( + future_registers.is_empty(), + "Function '{}' contains futures, but does not contain an 'async' instruction", + function.name() + ) } + // Otherwise, check that all the registers were consumed by the `async` call, in order. Some(async_) => { + // Remove the last future, since this is the future created by the `async` call. + future_registers.pop(); // Get the register operands that are `future` types. let async_future_operands = async_ .operands() From 7f35b0f074100aec5512976cfb8210b8c89d62a5 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu Date: Wed, 25 Oct 2023 19:23:50 -0400 Subject: [PATCH 029/339] Use get_function_ref --- synthesizer/process/src/stack/register_types/initialize.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/synthesizer/process/src/stack/register_types/initialize.rs b/synthesizer/process/src/stack/register_types/initialize.rs index 075e216b46..173e71d319 100644 --- a/synthesizer/process/src/stack/register_types/initialize.rs +++ b/synthesizer/process/src/stack/register_types/initialize.rs @@ -461,11 +461,11 @@ impl RegisterTypes { // Retrieve the program. let external = stack.get_external_program(program_id)?; // Check that function exists in the program. - if let Ok(child_function) = external.get_function(resource) { + if let Ok(child_function) = external.get_function_ref(resource) { // If the child function contains a finalize block, then the parent function must also contain a finalize block. let child_contains_finalize = child_function.finalize_logic().is_some(); let parent_contains_finalize = - stack.get_function(closure_or_function_name)?.finalize_logic().is_some(); + stack.get_function_ref(closure_or_function_name)?.finalize_logic().is_some(); if child_contains_finalize && !parent_contains_finalize { bail!( "Function '{}/{closure_or_function_name}' must contain a finalize block, since it calls '{}/{resource}'.", From 3034009f41e58636cafbfd3b82f633f7d4389f42 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Wed, 25 Oct 2023 16:25:10 -0700 Subject: [PATCH 030/339] nits --- .../src/stack/finalize_types/initialize.rs | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/synthesizer/process/src/stack/finalize_types/initialize.rs b/synthesizer/process/src/stack/finalize_types/initialize.rs index 243113ef85..77c1ee2893 100644 --- a/synthesizer/process/src/stack/finalize_types/initialize.rs +++ b/synthesizer/process/src/stack/finalize_types/initialize.rs @@ -38,37 +38,39 @@ impl FinalizeTypes { // Initialize a map of registers to their types. let mut finalize_types = Self { inputs: IndexMap::new(), destinations: IndexMap::new() }; - // Step 1. Check the inputs are well-formed. Store the input futures. + // Initialize a list of input futures. let mut input_futures = Vec::new(); + + // Step 1. Check the inputs are well-formed. Store the input futures. for input in finalize.inputs() { // Check the input register type. - let register = input.register(); - let finalize_type = input.finalize_type(); - finalize_types.check_input(stack, register, finalize_type)?; + finalize_types.check_input(stack, input.register(), input.finalize_type())?; // If the input is a future, add it to the list of input futures. - if let FinalizeType::Future(locator) = finalize_type { - input_futures.push((register, *locator)); + if let FinalizeType::Future(locator) = input.finalize_type() { + input_futures.push((input.register(), *locator)); } } - // Step 2. Check the commands are well-formed. Store the futures consumed by the `await` commands. + // Initialize a list of consumed futures. let mut consumed_futures = Vec::new(); + + // Step 2. Check the commands are well-formed. Store the futures consumed by the `await` commands. for command in finalize.commands() { // Check the command opcode, operands, and destinations. finalize_types.check_command(stack, finalize, command)?; // If the command is an `await`, add the future to the list of consumed futures. if let Command::Await(await_) = command { - let register = await_.register(); - // Note that `check_command` ensures that the register is a future. This is an additional check. - let locator = match finalize_types.get_type(stack, register)? { + // Note: `check_command` ensures that the register is a future. This is an additional check. + let locator = match finalize_types.get_type(stack, await_.register())? { FinalizeType::Future(locator) => locator, - FinalizeType::Plaintext(..) => bail!("Expected a future"), + FinalizeType::Plaintext(..) => bail!("Expected a future in '{await_}'"), }; - consumed_futures.push((register, locator)); + consumed_futures.push((await_.register(), locator)); } } + // Check that the input futures are consumed in the order they are passed in. ensure!( input_futures == consumed_futures, From f0e332f939e7b8c590d65f8551dbde43d7614a21 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Wed, 25 Oct 2023 16:36:10 -0700 Subject: [PATCH 031/339] chore(snarkvm): bump version for new release --- .cargo/release-version | 2 +- Cargo.lock | 118 ++++++++++---------- Cargo.toml | 22 ++-- algorithms/Cargo.toml | 12 +- algorithms/cuda/Cargo.toml | 2 +- circuit/Cargo.toml | 16 +-- circuit/account/Cargo.toml | 10 +- circuit/algorithms/Cargo.toml | 8 +- circuit/collections/Cargo.toml | 8 +- circuit/environment/Cargo.toml | 14 +-- circuit/environment/witness/Cargo.toml | 2 +- circuit/network/Cargo.toml | 10 +- circuit/program/Cargo.toml | 16 +-- circuit/types/Cargo.toml | 18 +-- circuit/types/address/Cargo.toml | 14 +-- circuit/types/boolean/Cargo.toml | 6 +- circuit/types/field/Cargo.toml | 8 +- circuit/types/group/Cargo.toml | 12 +- circuit/types/integers/Cargo.toml | 12 +- circuit/types/scalar/Cargo.toml | 10 +- circuit/types/string/Cargo.toml | 12 +- console/Cargo.toml | 14 +-- console/account/Cargo.toml | 6 +- console/algorithms/Cargo.toml | 8 +- console/collections/Cargo.toml | 6 +- console/network/Cargo.toml | 20 ++-- console/network/environment/Cargo.toml | 8 +- console/program/Cargo.toml | 14 +-- console/types/Cargo.toml | 18 +-- console/types/address/Cargo.toml | 10 +- console/types/boolean/Cargo.toml | 4 +- console/types/field/Cargo.toml | 6 +- console/types/group/Cargo.toml | 10 +- console/types/integers/Cargo.toml | 10 +- console/types/scalar/Cargo.toml | 8 +- console/types/string/Cargo.toml | 10 +- curves/Cargo.toml | 6 +- fields/Cargo.toml | 4 +- ledger/Cargo.toml | 22 ++-- ledger/authority/Cargo.toml | 6 +- ledger/block/Cargo.toml | 18 +-- ledger/coinbase/Cargo.toml | 14 +-- ledger/committee/Cargo.toml | 4 +- ledger/narwhal/Cargo.toml | 14 +-- ledger/narwhal/batch-certificate/Cargo.toml | 8 +- ledger/narwhal/batch-header/Cargo.toml | 6 +- ledger/narwhal/data/Cargo.toml | 4 +- ledger/narwhal/subdag/Cargo.toml | 8 +- ledger/narwhal/transmission-id/Cargo.toml | 6 +- ledger/narwhal/transmission/Cargo.toml | 10 +- ledger/query/Cargo.toml | 8 +- ledger/store/Cargo.toml | 18 +-- ledger/test-helpers/Cargo.toml | 16 +-- parameters/Cargo.toml | 6 +- synthesizer/Cargo.toml | 24 ++-- synthesizer/process/Cargo.toml | 16 +-- synthesizer/program/Cargo.toml | 6 +- synthesizer/snark/Cargo.toml | 8 +- utilities/Cargo.toml | 4 +- utilities/derives/Cargo.toml | 2 +- wasm/Cargo.toml | 12 +- 61 files changed, 367 insertions(+), 367 deletions(-) diff --git a/.cargo/release-version b/.cargo/release-version index 90787b183e..0e9f8f8334 100644 --- a/.cargo/release-version +++ b/.cargo/release-version @@ -1 +1 @@ -v0.16.3 \ No newline at end of file +v0.16.4 \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 40342afae2..b2eac13d2c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2473,7 +2473,7 @@ dependencies = [ [[package]] name = "snarkvm" -version = "0.16.3" +version = "0.16.4" dependencies = [ "anstyle", "anyhow", @@ -2508,7 +2508,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms" -version = "0.16.3" +version = "0.16.4" dependencies = [ "aleo-std", "anyhow", @@ -2547,7 +2547,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms-cuda" -version = "0.16.3" +version = "0.16.4" dependencies = [ "blst", "cc", @@ -2557,7 +2557,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit" -version = "0.16.3" +version = "0.16.4" dependencies = [ "snarkvm-circuit-account", "snarkvm-circuit-algorithms", @@ -2570,7 +2570,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-account" -version = "0.16.3" +version = "0.16.4" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2582,7 +2582,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-algorithms" -version = "0.16.3" +version = "0.16.4" dependencies = [ "anyhow", "snarkvm-circuit-types", @@ -2594,7 +2594,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-collections" -version = "0.16.3" +version = "0.16.4" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2608,7 +2608,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment" -version = "0.16.3" +version = "0.16.4" dependencies = [ "criterion", "indexmap 2.0.2", @@ -2629,11 +2629,11 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment-witness" -version = "0.16.3" +version = "0.16.4" [[package]] name = "snarkvm-circuit-network" -version = "0.16.3" +version = "0.16.4" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-collections", @@ -2644,7 +2644,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-program" -version = "0.16.3" +version = "0.16.4" dependencies = [ "anyhow", "paste", @@ -2662,7 +2662,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types" -version = "0.16.3" +version = "0.16.4" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-address", @@ -2677,7 +2677,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-address" -version = "0.16.3" +version = "0.16.4" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2689,7 +2689,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-boolean" -version = "0.16.3" +version = "0.16.4" dependencies = [ "criterion", "snarkvm-circuit-environment", @@ -2698,7 +2698,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-field" -version = "0.16.3" +version = "0.16.4" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2707,7 +2707,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-group" -version = "0.16.3" +version = "0.16.4" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2719,7 +2719,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-integers" -version = "0.16.3" +version = "0.16.4" dependencies = [ "paste", "snarkvm-circuit-environment", @@ -2732,7 +2732,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-scalar" -version = "0.16.3" +version = "0.16.4" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2742,7 +2742,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-string" -version = "0.16.3" +version = "0.16.4" dependencies = [ "rand", "snarkvm-circuit-environment", @@ -2755,7 +2755,7 @@ dependencies = [ [[package]] name = "snarkvm-console" -version = "0.16.3" +version = "0.16.4" dependencies = [ "snarkvm-console-account", "snarkvm-console-algorithms", @@ -2767,7 +2767,7 @@ dependencies = [ [[package]] name = "snarkvm-console-account" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "bs58", @@ -2780,7 +2780,7 @@ dependencies = [ [[package]] name = "snarkvm-console-algorithms" -version = "0.16.3" +version = "0.16.4" dependencies = [ "blake2s_simd", "criterion", @@ -2798,7 +2798,7 @@ dependencies = [ [[package]] name = "snarkvm-console-collections" -version = "0.16.3" +version = "0.16.4" dependencies = [ "aleo-std", "criterion", @@ -2811,7 +2811,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network" -version = "0.16.3" +version = "0.16.4" dependencies = [ "anyhow", "indexmap 2.0.2", @@ -2833,7 +2833,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network-environment" -version = "0.16.3" +version = "0.16.4" dependencies = [ "anyhow", "bech32", @@ -2850,7 +2850,7 @@ dependencies = [ [[package]] name = "snarkvm-console-program" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "enum_index", @@ -2871,7 +2871,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types" -version = "0.16.3" +version = "0.16.4" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-address", @@ -2885,7 +2885,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-address" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "serde_json", @@ -2897,7 +2897,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-boolean" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "serde_json", @@ -2906,7 +2906,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-field" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "serde_json", @@ -2917,7 +2917,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-group" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "serde_json", @@ -2929,7 +2929,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-integers" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "serde_json", @@ -2941,7 +2941,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-scalar" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "serde_json", @@ -2953,7 +2953,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-string" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "serde_json", @@ -2965,7 +2965,7 @@ dependencies = [ [[package]] name = "snarkvm-curves" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "criterion", @@ -2980,7 +2980,7 @@ dependencies = [ [[package]] name = "snarkvm-fields" -version = "0.16.3" +version = "0.16.4" dependencies = [ "aleo-std", "anyhow", @@ -2997,7 +2997,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger" -version = "0.16.3" +version = "0.16.4" dependencies = [ "aleo-std", "anyhow", @@ -3024,7 +3024,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-authority" -version = "0.16.3" +version = "0.16.4" dependencies = [ "anyhow", "bincode", @@ -3037,7 +3037,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-block" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3060,7 +3060,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-coinbase" -version = "0.16.3" +version = "0.16.4" dependencies = [ "aleo-std", "anyhow", @@ -3081,7 +3081,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-committee" -version = "0.16.3" +version = "0.16.4" dependencies = [ "anyhow", "bincode", @@ -3100,7 +3100,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal" -version = "0.16.3" +version = "0.16.4" dependencies = [ "snarkvm-ledger-narwhal", "snarkvm-ledger-narwhal-batch-certificate", @@ -3113,7 +3113,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3127,7 +3127,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3140,7 +3140,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-data" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bytes", "serde_json", @@ -3150,7 +3150,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3164,7 +3164,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "bytes", @@ -3177,7 +3177,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "serde_json", @@ -3187,7 +3187,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-query" -version = "0.16.3" +version = "0.16.4" dependencies = [ "async-trait", "reqwest", @@ -3199,7 +3199,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-store" -version = "0.16.3" +version = "0.16.4" dependencies = [ "aleo-std", "anyhow", @@ -3227,7 +3227,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-test-helpers" -version = "0.16.3" +version = "0.16.4" dependencies = [ "once_cell", "snarkvm-circuit", @@ -3241,7 +3241,7 @@ dependencies = [ [[package]] name = "snarkvm-parameters" -version = "0.16.3" +version = "0.16.4" dependencies = [ "aleo-std", "anyhow", @@ -3273,7 +3273,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer" -version = "0.16.3" +version = "0.16.4" dependencies = [ "aleo-std", "anyhow", @@ -3304,7 +3304,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-process" -version = "0.16.3" +version = "0.16.4" dependencies = [ "aleo-std", "bincode", @@ -3329,7 +3329,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-program" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "criterion", @@ -3345,7 +3345,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-snark" -version = "0.16.3" +version = "0.16.4" dependencies = [ "bincode", "colored", @@ -3358,7 +3358,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities" -version = "0.16.3" +version = "0.16.4" dependencies = [ "aleo-std", "anyhow", @@ -3378,7 +3378,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities-derives" -version = "0.16.3" +version = "0.16.4" dependencies = [ "proc-macro2", "quote 1.0.33", @@ -3387,7 +3387,7 @@ dependencies = [ [[package]] name = "snarkvm-wasm" -version = "0.16.3" +version = "0.16.4" dependencies = [ "getrandom", "rand", diff --git a/Cargo.toml b/Cargo.toml index da49a99dd2..4ac1dab8a6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "A decentralized virtual machine" homepage = "https://aleo.org" @@ -146,53 +146,53 @@ wasm = [ "snarkvm-wasm" ] [dependencies.snarkvm-algorithms] path = "./algorithms" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-circuit] path = "./circuit" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-console] path = "./console" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-curves] path = "./curves" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-fields] path = "./fields" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-ledger] path = "./ledger" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-parameters] path = "./parameters" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-synthesizer] path = "./synthesizer" -version = "=0.16.3" +version = "=0.16.4" default-features = false optional = true [dependencies.snarkvm-utilities] path = "./utilities" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-wasm] path = "./wasm" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.anstyle] diff --git a/algorithms/Cargo.toml b/algorithms/Cargo.toml index d6cdf4e8e9..6fb80b834a 100644 --- a/algorithms/Cargo.toml +++ b/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Algorithms for a decentralized virtual machine" homepage = "https://aleo.org" @@ -47,27 +47,27 @@ required-features = [ "test" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.snarkvm-parameters] path = "../parameters" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.snarkvm-algorithms-cuda] path = "./cuda" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.aleo-std] diff --git a/algorithms/cuda/Cargo.toml b/algorithms/cuda/Cargo.toml index 1e79a92768..8998073548 100644 --- a/algorithms/cuda/Cargo.toml +++ b/algorithms/cuda/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms-cuda" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Cuda optimizations for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/circuit/Cargo.toml b/circuit/Cargo.toml index 459911dd14..62e45b0e88 100644 --- a/circuit/Cargo.toml +++ b/circuit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Circuits for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,28 +25,28 @@ edition = "2021" [dependencies.snarkvm-circuit-account] path = "./account" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-algorithms] path = "./algorithms" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-collections] path = "./collections" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-environment] path = "./environment" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-network] path = "./network" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-program] path = "./program" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types] path = "./types" -version = "=0.16.3" +version = "=0.16.4" diff --git a/circuit/account/Cargo.toml b/circuit/account/Cargo.toml index 57fff57d3f..de893c3312 100644 --- a/circuit/account/Cargo.toml +++ b/circuit/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-account" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Account circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-account" path = "../../console/account" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.3" +version = "=0.16.4" [dev-dependencies.snarkvm-utilities] path = "../../utilities" diff --git a/circuit/algorithms/Cargo.toml b/circuit/algorithms/Cargo.toml index f8490154d2..e7f513efc4 100644 --- a/circuit/algorithms/Cargo.toml +++ b/circuit/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-algorithms" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Algorithm circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-algorithms" path = "../../console/algorithms" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dev-dependencies.anyhow] diff --git a/circuit/collections/Cargo.toml b/circuit/collections/Cargo.toml index 66358e7124..c78060e191 100644 --- a/circuit/collections/Cargo.toml +++ b/circuit/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-collections" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Collections circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-collections" path = "../../console/collections" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.3" +version = "=0.16.4" [dev-dependencies.snarkvm-circuit-network] path = "../network" diff --git a/circuit/environment/Cargo.toml b/circuit/environment/Cargo.toml index 60d66a8794..539a6e2ed9 100644 --- a/circuit/environment/Cargo.toml +++ b/circuit/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Circuit environment for a decentralized virtual machine" license = "Apache-2.0" @@ -14,32 +14,32 @@ harness = false [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.3" +version = "=0.16.4" default-features = false features = [ "r1cs" ] [dependencies.snarkvm-circuit-environment-witness] path = "./witness" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.indexmap] diff --git a/circuit/environment/witness/Cargo.toml b/circuit/environment/witness/Cargo.toml index b5f6d04202..d3904618ae 100644 --- a/circuit/environment/witness/Cargo.toml +++ b/circuit/environment/witness/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment-witness" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "A procedural macro to construct a witness in an environment" license = "Apache-2.0" diff --git a/circuit/network/Cargo.toml b/circuit/network/Cargo.toml index 10d0a9e6b7..aa7973b8f6 100644 --- a/circuit/network/Cargo.toml +++ b/circuit/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-network" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Network circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.3" +version = "=0.16.4" [dev-dependencies.snarkvm-console-types] path = "../../console/types" diff --git a/circuit/program/Cargo.toml b/circuit/program/Cargo.toml index 62bffe63c0..213d54b863 100644 --- a/circuit/program/Cargo.toml +++ b/circuit/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-program" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Program circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,32 +9,32 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-program" path = "../../console/program" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-circuit-account] path = "../account" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.3" +version = "=0.16.4" [dependencies.paste] version = "1.0" diff --git a/circuit/types/Cargo.toml b/circuit/types/Cargo.toml index fa86c8adf7..3bdc112b7d 100644 --- a/circuit/types/Cargo.toml +++ b/circuit/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Primitive circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -8,35 +8,35 @@ edition = "2021" [dependencies.snarkvm-circuit-environment] path = "../environment" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-address] path = "./address" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-boolean] path = "./boolean" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-field] path = "./field" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-group] path = "./group" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-integers] path = "./integers" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-scalar] path = "./scalar" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-string] path = "./string" -version = "=0.16.3" +version = "=0.16.4" [dev-dependencies.console] package = "snarkvm-console" diff --git a/circuit/types/address/Cargo.toml b/circuit/types/address/Cargo.toml index 25c795f6a2..4d4d845b35 100644 --- a/circuit/types/address/Cargo.toml +++ b/circuit/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-address" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Address circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,28 +9,28 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-address" path = "../../../console/types/address" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-group] path = "../group" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.3" +version = "=0.16.4" [features] default = [ "enable_console" ] diff --git a/circuit/types/boolean/Cargo.toml b/circuit/types/boolean/Cargo.toml index ecd072252e..5d16034f64 100644 --- a/circuit/types/boolean/Cargo.toml +++ b/circuit/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-boolean" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Boolean circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -14,12 +14,12 @@ harness = false [dependencies.console] package = "snarkvm-console-types-boolean" path = "../../../console/types/boolean" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.3" +version = "=0.16.4" [dev-dependencies.criterion] version = "0.5" diff --git a/circuit/types/field/Cargo.toml b/circuit/types/field/Cargo.toml index 8c434fe7ab..eb8bdc4cdf 100644 --- a/circuit/types/field/Cargo.toml +++ b/circuit/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-field" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Field circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-field" path = "../../../console/types/field" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.3" +version = "=0.16.4" [features] default = [ "enable_console" ] diff --git a/circuit/types/group/Cargo.toml b/circuit/types/group/Cargo.toml index 2390463118..99788ae4da 100644 --- a/circuit/types/group/Cargo.toml +++ b/circuit/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-group" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Group circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-group" path = "../../../console/types/group" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.3" +version = "=0.16.4" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/integers/Cargo.toml b/circuit/types/integers/Cargo.toml index 36315b8dea..fb26c09b88 100644 --- a/circuit/types/integers/Cargo.toml +++ b/circuit/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-integers" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Integer circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-integers" path = "../../../console/types/integers" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.3" +version = "=0.16.4" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/scalar/Cargo.toml b/circuit/types/scalar/Cargo.toml index 514c76becf..64e57a6e6b 100644 --- a/circuit/types/scalar/Cargo.toml +++ b/circuit/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-scalar" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Scalar circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-scalar" path = "../../../console/types/scalar" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.3" +version = "=0.16.4" [features] default = [ "enable_console" ] diff --git a/circuit/types/string/Cargo.toml b/circuit/types/string/Cargo.toml index a76085470a..c7e2e3bebc 100644 --- a/circuit/types/string/Cargo.toml +++ b/circuit/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-string" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "String circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-string" path = "../../../console/types/string" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-circuit-types-integers] path = "../integers" -version = "=0.16.3" +version = "=0.16.4" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/console/Cargo.toml b/console/Cargo.toml index 17e5c68c1d..a26fee779c 100644 --- a/console/Cargo.toml +++ b/console/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Console environment for a decentralized virtual machine" license = "Apache-2.0" @@ -8,32 +8,32 @@ edition = "2021" [dependencies.snarkvm-console-account] path = "./account" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-console-algorithms] path = "./algorithms" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-console-collections] path = "./collections" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-console-network] path = "./network" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-console-program] path = "./program" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-console-types] path = "./types" -version = "=0.16.3" +version = "=0.16.4" optional = true [features] diff --git a/console/account/Cargo.toml b/console/account/Cargo.toml index e2874e0f50..9c72f4d28d 100644 --- a/console/account/Cargo.toml +++ b/console/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-account" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Account operations for a decentralized virtual machine" license = "Apache-2.0" @@ -13,11 +13,11 @@ harness = false [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.3" +version = "=0.16.4" default-features = false features = [ "address", "boolean", "field", "group", "scalar" ] diff --git a/console/algorithms/Cargo.toml b/console/algorithms/Cargo.toml index b2829c49ff..1c9c2d3d99 100644 --- a/console/algorithms/Cargo.toml +++ b/console/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-algorithms" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Console algorithms for a decentralized virtual machine" license = "Apache-2.0" @@ -23,18 +23,18 @@ harness = false [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.3" +version = "=0.16.4" default-features = false features = [ "field", "group", "integers", "scalar" ] [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.3" +version = "=0.16.4" [dependencies.blake2s_simd] version = "1.0" diff --git a/console/collections/Cargo.toml b/console/collections/Cargo.toml index 117f53d72e..934b9888f7 100644 --- a/console/collections/Cargo.toml +++ b/console/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-collections" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Collections for a decentralized virtual machine" license = "Apache-2.0" @@ -18,11 +18,11 @@ harness = false [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.3" +version = "=0.16.4" default-features = false features = [ "field", "integers" ] diff --git a/console/network/Cargo.toml b/console/network/Cargo.toml index 66f3d3869d..18ffdd4427 100644 --- a/console/network/Cargo.toml +++ b/console/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Network console library for a decentralized virtual machine" license = "Apache-2.0" @@ -15,45 +15,45 @@ wasm = [ [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.3" +version = "=0.16.4" default-features = false features = [ "snark" ] [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-network-environment] path = "./environment" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.3" +version = "=0.16.4" default-features = false features = [ "field", "group", "scalar" ] [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.snarkvm-parameters] path = "../../parameters" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.3" +version = "=0.16.4" [dependencies.anyhow] version = "1.0.73" diff --git a/console/network/environment/Cargo.toml b/console/network/environment/Cargo.toml index d23c0f2e37..9205f7198f 100644 --- a/console/network/environment/Cargo.toml +++ b/console/network/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network-environment" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Environment console library for a decentralized virtual machine" license = "Apache-2.0" @@ -8,17 +8,17 @@ edition = "2021" [dependencies.snarkvm-curves] path = "../../../curves" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.snarkvm-fields] path = "../../../fields" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.snarkvm-utilities] path = "../../../utilities" -version = "=0.16.3" +version = "=0.16.4" [dependencies.anyhow] version = "1.0.73" diff --git a/console/program/Cargo.toml b/console/program/Cargo.toml index 16e5cd3923..a8f21498be 100644 --- a/console/program/Cargo.toml +++ b/console/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-program" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Program operations for a decentralized virtual machine" license = "Apache-2.0" @@ -12,27 +12,27 @@ test = [ ] [dependencies.snarkvm-console-account] path = "../account" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.3" +version = "=0.16.4" [dependencies.enum_index] version = "0.2" diff --git a/console/types/Cargo.toml b/console/types/Cargo.toml index a86ac4c7a7..ba5deb6c15 100644 --- a/console/types/Cargo.toml +++ b/console/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Console types for a decentralized virtual machine" license = "Apache-2.0" @@ -8,41 +8,41 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../network/environment" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types-address] path = "./address" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-console-types-boolean] path = "./boolean" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-console-types-field] path = "./field" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-console-types-group] path = "./group" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-console-types-integers] path = "./integers" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-console-types-scalar] path = "./scalar" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-console-types-string] path = "./string" -version = "=0.16.3" +version = "=0.16.4" optional = true [features] diff --git a/console/types/address/Cargo.toml b/console/types/address/Cargo.toml index 20f753d0c3..66f8d982d6 100644 --- a/console/types/address/Cargo.toml +++ b/console/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-address" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types-group] path = "../group" -version = "=0.16.3" +version = "=0.16.4" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/boolean/Cargo.toml b/console/types/boolean/Cargo.toml index 66ef99cc09..a4a9373413 100644 --- a/console/types/boolean/Cargo.toml +++ b/console/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-boolean" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,7 +8,7 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.3" +version = "=0.16.4" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/field/Cargo.toml b/console/types/field/Cargo.toml index 28f964f61d..bf8d52d051 100644 --- a/console/types/field/Cargo.toml +++ b/console/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-field" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,11 +8,11 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.3" +version = "=0.16.4" [dependencies.zeroize] version = "1" diff --git a/console/types/group/Cargo.toml b/console/types/group/Cargo.toml index b4b66705bf..970d413bcf 100644 --- a/console/types/group/Cargo.toml +++ b/console/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-group" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.3" +version = "=0.16.4" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/integers/Cargo.toml b/console/types/integers/Cargo.toml index d65bc5d143..9e01d5aa87 100644 --- a/console/types/integers/Cargo.toml +++ b/console/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-integers" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.3" +version = "=0.16.4" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/scalar/Cargo.toml b/console/types/scalar/Cargo.toml index 905263266f..bb76144f9c 100644 --- a/console/types/scalar/Cargo.toml +++ b/console/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-scalar" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,15 +8,15 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.3" +version = "=0.16.4" [dependencies.zeroize] version = "1" diff --git a/console/types/string/Cargo.toml b/console/types/string/Cargo.toml index ccebdec9c6..37885d6d9c 100644 --- a/console/types/string/Cargo.toml +++ b/console/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-string" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-console-types-integers] path = "../integers" -version = "=0.16.3" +version = "=0.16.4" [dev-dependencies.bincode] version = "1.3" diff --git a/curves/Cargo.toml b/curves/Cargo.toml index 7492d77a8f..e7dc585413 100644 --- a/curves/Cargo.toml +++ b/curves/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-curves" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Curves for a decentralized virtual machine" homepage = "https://aleo.org" @@ -36,12 +36,12 @@ harness = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.rand] diff --git a/fields/Cargo.toml b/fields/Cargo.toml index f0deb47d5b..eaee6f9cf8 100644 --- a/fields/Cargo.toml +++ b/fields/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-fields" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Fields for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.aleo-std] diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index a175b2c95c..caf5757715 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "A node ledger for a decentralized virtual machine" homepage = "https://aleo.org" @@ -56,54 +56,54 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "./authority" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "./block" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "./coinbase" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "./committee" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-narwhal] package = "snarkvm-ledger-narwhal" path = "./narwhal" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "./query" -version = "=0.16.3" +version = "=0.16.4" features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "./store" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-test-helpers] package = "snarkvm-ledger-test-helpers" path = "./test-helpers" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.synthesizer] package = "snarkvm-synthesizer" path = "../synthesizer" -version = "=0.16.3" +version = "=0.16.4" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/authority/Cargo.toml b/ledger/authority/Cargo.toml index 5dcfd955f1..8b010920b3 100644 --- a/ledger/authority/Cargo.toml +++ b/ledger/authority/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-authority" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Data structures for a block authority in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-subdag/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.3" +version = "=0.16.4" [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.3" +version = "=0.16.4" [dependencies.anyhow] version = "1" diff --git a/ledger/block/Cargo.toml b/ledger/block/Cargo.toml index 5741edcd3a..7d40f87f55 100644 --- a/ledger/block/Cargo.toml +++ b/ledger/block/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-block" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "A block for a decentralized virtual machine" homepage = "https://aleo.org" @@ -39,42 +39,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../ledger/coinbase" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../../ledger/committee" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../narwhal/transmission-id" -version = "=0.16.3" +version = "=0.16.4" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.3" +version = "=0.16.4" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.3" +version = "=0.16.4" [dependencies.indexmap] version = "2.0" diff --git a/ledger/coinbase/Cargo.toml b/ledger/coinbase/Cargo.toml index ba32e58a4f..d7425406a7 100644 --- a/ledger/coinbase/Cargo.toml +++ b/ledger/coinbase/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-coinbase" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Coinbase puzzle for a decentralized virtual machine" homepage = "https://aleo.org" @@ -50,27 +50,27 @@ wasm = [ [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-synthesizer-snark] path = "../../synthesizer/snark" -version = "=0.16.3" +version = "=0.16.4" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.aleo-std] diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index 5b92ac673e..f92f139796 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-committee" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "A committee for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,7 +33,7 @@ test-helpers = [ "prop-tests", "rand_distr" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.3" +version = "=0.16.4" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/Cargo.toml b/ledger/narwhal/Cargo.toml index 08f2fea265..245e723528 100644 --- a/ledger/narwhal/Cargo.toml +++ b/ledger/narwhal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Data structures for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -64,37 +64,37 @@ transmission-id = [ "narwhal-transmission-id" ] [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "./batch-certificate" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "./batch-header" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "./data" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "./subdag" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.narwhal-transmission] package = "snarkvm-ledger-narwhal-transmission" path = "./transmission" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "./transmission-id" -version = "=0.16.3" +version = "=0.16.4" optional = true [dev-dependencies.snarkvm-ledger-narwhal] diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index f494ee91e5..9e69628783 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-header/test-helpers", "time" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.3" +version = "=0.16.4" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.3" +version = "=0.16.4" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.3" +version = "=0.16.4" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/batch-header/Cargo.toml b/ledger/narwhal/batch-header/Cargo.toml index cd382be768..d1b6be3610 100644 --- a/ledger/narwhal/batch-header/Cargo.toml +++ b/ledger/narwhal/batch-header/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "A batch header for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-transmission-id/test-helpers", "time" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.3" +version = "=0.16.4" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.3" +version = "=0.16.4" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/data/Cargo.toml b/ledger/narwhal/data/Cargo.toml index bc1b03c985..81c9870450 100644 --- a/ledger/narwhal/data/Cargo.toml +++ b/ledger/narwhal/data/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-data" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -29,7 +29,7 @@ async = [ "tokio" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.3" +version = "=0.16.4" [dependencies.bytes] version = "1" diff --git a/ledger/narwhal/subdag/Cargo.toml b/ledger/narwhal/subdag/Cargo.toml index fb8e24576d..c8bbfccaa9 100644 --- a/ledger/narwhal/subdag/Cargo.toml +++ b/ledger/narwhal/subdag/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "A subdag for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-certificate/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.3" +version = "=0.16.4" [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../batch-certificate" -version = "=0.16.3" +version = "=0.16.4" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.3" +version = "=0.16.4" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/transmission-id/Cargo.toml b/ledger/narwhal/transmission-id/Cargo.toml index 6b105746ca..4e71e1238e 100644 --- a/ledger/narwhal/transmission-id/Cargo.toml +++ b/ledger/narwhal/transmission-id/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "A transmission ID for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.3" +version = "=0.16.4" [dev-dependencies.bincode] version = "1.3" diff --git a/ledger/narwhal/transmission/Cargo.toml b/ledger/narwhal/transmission/Cargo.toml index d4fdffa89d..d714a55458 100644 --- a/ledger/narwhal/transmission/Cargo.toml +++ b/ledger/narwhal/transmission/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "A transmission for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../block" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "../data" -version = "=0.16.3" +version = "=0.16.4" [dependencies.bytes] version = "1" diff --git a/ledger/query/Cargo.toml b/ledger/query/Cargo.toml index 5b7e129e01..bd7dabe242 100644 --- a/ledger/query/Cargo.toml +++ b/ledger/query/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-query" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "A query for a decentralized virtual machine" homepage = "https://aleo.org" @@ -30,18 +30,18 @@ query = [ "ledger-store", "synthesizer-program", "ureq" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.async-trait] diff --git a/ledger/store/Cargo.toml b/ledger/store/Cargo.toml index fea8ba949f..beeb7e2846 100644 --- a/ledger/store/Cargo.toml +++ b/ledger/store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-store" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "A data store for a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,42 +32,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../coinbase" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../committee" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../narwhal/batch-certificate" -version = "=0.16.3" +version = "=0.16.4" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.3" +version = "=0.16.4" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.3" +version = "=0.16.4" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/test-helpers/Cargo.toml b/ledger/test-helpers/Cargo.toml index 487f73f0a9..fb386df5c3 100644 --- a/ledger/test-helpers/Cargo.toml +++ b/ledger/test-helpers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-test-helpers" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Test helpers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -19,39 +19,39 @@ edition = "2021" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.3" +version = "=0.16.4" [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../query" -version = "=0.16.3" +version = "=0.16.4" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.3" +version = "=0.16.4" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.3" +version = "=0.16.4" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "../../synthesizer/process" -version = "=0.16.3" +version = "=0.16.4" [dependencies.once_cell] version = "1.18" diff --git a/parameters/Cargo.toml b/parameters/Cargo.toml index 4b3e2e7a80..5cb534475b 100644 --- a/parameters/Cargo.toml +++ b/parameters/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-parameters" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Parameters for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "encoding", "js-sys", "web-sys" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.3" +version = "=0.16.4" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/Cargo.toml b/synthesizer/Cargo.toml index 2f9d10ddd7..98d3690150 100644 --- a/synthesizer/Cargo.toml +++ b/synthesizer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Synthesizer for a decentralized virtual machine" homepage = "https://aleo.org" @@ -68,61 +68,61 @@ harness = false [dependencies.algorithms] package = "snarkvm-algorithms" path = "../algorithms" -version = "=0.16.3" +version = "=0.16.4" [dependencies.circuit] package = "snarkvm-circuit" path = "../circuit" -version = "=0.16.3" +version = "=0.16.4" [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../ledger/block" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../ledger/coinbase" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../ledger/committee" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../ledger/query" -version = "=0.16.3" +version = "=0.16.4" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../ledger/store" -version = "=0.16.3" +version = "=0.16.4" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "./process" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "./program" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "./snark" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.aleo-std] diff --git a/synthesizer/process/Cargo.toml b/synthesizer/process/Cargo.toml index 742079dd72..0337c998ef 100644 --- a/synthesizer/process/Cargo.toml +++ b/synthesizer/process/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-process" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "A process for a decentralized virtual machine" homepage = "https://aleo.org" @@ -48,40 +48,40 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.3" +version = "=0.16.4" default-features = false features = [ "network", "program", "types" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../ledger/block" -version = "=0.16.3" +version = "=0.16.4" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../../ledger/query" -version = "=0.16.3" +version = "=0.16.4" default-features = false [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../../ledger/store" -version = "=0.16.3" +version = "=0.16.4" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.3" +version = "=0.16.4" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.3" +version = "=0.16.4" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/program/Cargo.toml b/synthesizer/program/Cargo.toml index 08178f34c3..d24353cf03 100644 --- a/synthesizer/program/Cargo.toml +++ b/synthesizer/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-program" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Program for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "console/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.3" +version = "=0.16.4" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.3" +version = "=0.16.4" default-features = false features = [ "account", "network", "program", "types" ] diff --git a/synthesizer/snark/Cargo.toml b/synthesizer/snark/Cargo.toml index f5caaf5b46..216c654231 100644 --- a/synthesizer/snark/Cargo.toml +++ b/synthesizer/snark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-snark" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "SNARK wrappers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,18 +33,18 @@ wasm = [ "console/wasm", "snarkvm-algorithms/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.3" +version = "=0.16.4" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.3" +version = "=0.16.4" default-features = false features = [ "network" ] [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.3" +version = "=0.16.4" [dependencies.bincode] version = "1" diff --git a/utilities/Cargo.toml b/utilities/Cargo.toml index a0e48fee79..b38edc8bf2 100644 --- a/utilities/Cargo.toml +++ b/utilities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Utilities for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities-derives] path = "./derives" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.aleo-std] diff --git a/utilities/derives/Cargo.toml b/utilities/derives/Cargo.toml index 707bebc048..58cfbf1c75 100644 --- a/utilities/derives/Cargo.toml +++ b/utilities/derives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities-derives" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "Canonical serialization for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index e5ed286abf..a5c40929dc 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-wasm" -version = "0.16.3" +version = "0.16.4" authors = [ "The Aleo Team " ] description = "WASM for a decentralized virtual machine" homepage = "https://aleo.org" @@ -28,30 +28,30 @@ crate-type = [ "cdylib", "rlib" ] [dependencies.snarkvm-console] path = "../console" -version = "=0.16.3" +version = "=0.16.4" features = [ "wasm" ] optional = true [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.3" +version = "=0.16.4" optional = true [dependencies.snarkvm-synthesizer] path = "../synthesizer" -version = "=0.16.3" +version = "=0.16.4" default-features = false features = [ "wasm" ] optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.3" +version = "=0.16.4" features = [ "wasm" ] optional = true From 68063e9d26ec75fbd31695d9d7a3ecd50908e2f0 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Wed, 25 Oct 2023 20:48:08 -0400 Subject: [PATCH 032/339] Add contains_transaction_id to BlockStore --- ledger/store/src/block/mod.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ledger/store/src/block/mod.rs b/ledger/store/src/block/mod.rs index f44dd30f14..335b934526 100644 --- a/ledger/store/src/block/mod.rs +++ b/ledger/store/src/block/mod.rs @@ -1238,6 +1238,12 @@ impl> BlockStore { self.storage.reverse_id_map().contains_key_confirmed(block_hash) } + /// Returns `true` if the given transaction ID exists. + pub fn contains_transaction_id(&self, transaction_id: &N::TransactionID) -> Result { + Ok(self.transaction_store().contains_transaction_id(transaction_id)? + || self.contains_rejected_or_aborted_transaction_id(transaction_id)?) + } + /// Returns `true` if the given rejected or aborted transaction ID exists. pub fn contains_rejected_or_aborted_transaction_id(&self, transaction_id: &N::TransactionID) -> Result { self.storage.rejected_or_aborted_transaction_id_map().contains_key_confirmed(transaction_id) From 2b4c8d38f6c4ed1f7839d207ab103b70c4367780 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Wed, 25 Oct 2023 20:48:47 -0400 Subject: [PATCH 033/339] Update Ledger::contains_transaction_id --- ledger/src/contains.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ledger/src/contains.rs b/ledger/src/contains.rs index d7d5310c87..64a52bbda5 100644 --- a/ledger/src/contains.rs +++ b/ledger/src/contains.rs @@ -58,10 +58,7 @@ impl> Ledger { /// Returns `true` if the given transaction ID exists. pub fn contains_transaction_id(&self, transaction_id: &N::TransactionID) -> Result { - self.vm - .transaction_store() - .contains_transaction_id(transaction_id) - .or(self.vm.block_store().contains_rejected_or_aborted_transaction_id(transaction_id)) + self.vm.block_store().contains_transaction_id(transaction_id) } /* Transition */ From c25392d367d4000d5ccbe4a4e7a84f669fca7a2d Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Wed, 25 Oct 2023 20:51:00 -0400 Subject: [PATCH 034/339] Update check_transaction --- synthesizer/src/vm/verify.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/synthesizer/src/vm/verify.rs b/synthesizer/src/vm/verify.rs index 2a40dfbdb4..d94be9addc 100644 --- a/synthesizer/src/vm/verify.rs +++ b/synthesizer/src/vm/verify.rs @@ -40,9 +40,7 @@ impl> VM { /* Transaction */ // Ensure the transaction ID is unique. - if self.transaction_store().contains_transaction_id(&transaction.id())? - || self.block_store().contains_rejected_or_aborted_transaction_id(&transaction.id())? - { + if self.block_store().contains_transaction_id(&transaction.id())? { bail!("Transaction '{}' already exists in the ledger", transaction.id()) } From 18fdfd8bcc1b382920c499fcf29c6fdc8cb9476d Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Wed, 25 Oct 2023 18:02:57 -0700 Subject: [PATCH 035/339] chore(snarkvm): bump version for new release --- .cargo/release-version | 2 +- Cargo.lock | 118 ++++++++++---------- Cargo.toml | 22 ++-- algorithms/Cargo.toml | 12 +- algorithms/cuda/Cargo.toml | 2 +- circuit/Cargo.toml | 16 +-- circuit/account/Cargo.toml | 10 +- circuit/algorithms/Cargo.toml | 8 +- circuit/collections/Cargo.toml | 8 +- circuit/environment/Cargo.toml | 14 +-- circuit/environment/witness/Cargo.toml | 2 +- circuit/network/Cargo.toml | 10 +- circuit/program/Cargo.toml | 16 +-- circuit/types/Cargo.toml | 18 +-- circuit/types/address/Cargo.toml | 14 +-- circuit/types/boolean/Cargo.toml | 6 +- circuit/types/field/Cargo.toml | 8 +- circuit/types/group/Cargo.toml | 12 +- circuit/types/integers/Cargo.toml | 12 +- circuit/types/scalar/Cargo.toml | 10 +- circuit/types/string/Cargo.toml | 12 +- console/Cargo.toml | 14 +-- console/account/Cargo.toml | 6 +- console/algorithms/Cargo.toml | 8 +- console/collections/Cargo.toml | 6 +- console/network/Cargo.toml | 20 ++-- console/network/environment/Cargo.toml | 8 +- console/program/Cargo.toml | 14 +-- console/types/Cargo.toml | 18 +-- console/types/address/Cargo.toml | 10 +- console/types/boolean/Cargo.toml | 4 +- console/types/field/Cargo.toml | 6 +- console/types/group/Cargo.toml | 10 +- console/types/integers/Cargo.toml | 10 +- console/types/scalar/Cargo.toml | 8 +- console/types/string/Cargo.toml | 10 +- curves/Cargo.toml | 6 +- fields/Cargo.toml | 4 +- ledger/Cargo.toml | 22 ++-- ledger/authority/Cargo.toml | 6 +- ledger/block/Cargo.toml | 18 +-- ledger/coinbase/Cargo.toml | 14 +-- ledger/committee/Cargo.toml | 4 +- ledger/narwhal/Cargo.toml | 14 +-- ledger/narwhal/batch-certificate/Cargo.toml | 8 +- ledger/narwhal/batch-header/Cargo.toml | 6 +- ledger/narwhal/data/Cargo.toml | 4 +- ledger/narwhal/subdag/Cargo.toml | 8 +- ledger/narwhal/transmission-id/Cargo.toml | 6 +- ledger/narwhal/transmission/Cargo.toml | 10 +- ledger/query/Cargo.toml | 8 +- ledger/store/Cargo.toml | 18 +-- ledger/test-helpers/Cargo.toml | 16 +-- parameters/Cargo.toml | 6 +- synthesizer/Cargo.toml | 24 ++-- synthesizer/process/Cargo.toml | 16 +-- synthesizer/program/Cargo.toml | 6 +- synthesizer/snark/Cargo.toml | 8 +- utilities/Cargo.toml | 4 +- utilities/derives/Cargo.toml | 2 +- wasm/Cargo.toml | 12 +- 61 files changed, 367 insertions(+), 367 deletions(-) diff --git a/.cargo/release-version b/.cargo/release-version index 0e9f8f8334..b346bd2f8a 100644 --- a/.cargo/release-version +++ b/.cargo/release-version @@ -1 +1 @@ -v0.16.4 \ No newline at end of file +v0.16.5 \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index b2eac13d2c..c74328f70e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2473,7 +2473,7 @@ dependencies = [ [[package]] name = "snarkvm" -version = "0.16.4" +version = "0.16.5" dependencies = [ "anstyle", "anyhow", @@ -2508,7 +2508,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms" -version = "0.16.4" +version = "0.16.5" dependencies = [ "aleo-std", "anyhow", @@ -2547,7 +2547,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms-cuda" -version = "0.16.4" +version = "0.16.5" dependencies = [ "blst", "cc", @@ -2557,7 +2557,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit" -version = "0.16.4" +version = "0.16.5" dependencies = [ "snarkvm-circuit-account", "snarkvm-circuit-algorithms", @@ -2570,7 +2570,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-account" -version = "0.16.4" +version = "0.16.5" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2582,7 +2582,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-algorithms" -version = "0.16.4" +version = "0.16.5" dependencies = [ "anyhow", "snarkvm-circuit-types", @@ -2594,7 +2594,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-collections" -version = "0.16.4" +version = "0.16.5" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2608,7 +2608,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment" -version = "0.16.4" +version = "0.16.5" dependencies = [ "criterion", "indexmap 2.0.2", @@ -2629,11 +2629,11 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment-witness" -version = "0.16.4" +version = "0.16.5" [[package]] name = "snarkvm-circuit-network" -version = "0.16.4" +version = "0.16.5" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-collections", @@ -2644,7 +2644,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-program" -version = "0.16.4" +version = "0.16.5" dependencies = [ "anyhow", "paste", @@ -2662,7 +2662,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types" -version = "0.16.4" +version = "0.16.5" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-address", @@ -2677,7 +2677,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-address" -version = "0.16.4" +version = "0.16.5" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2689,7 +2689,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-boolean" -version = "0.16.4" +version = "0.16.5" dependencies = [ "criterion", "snarkvm-circuit-environment", @@ -2698,7 +2698,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-field" -version = "0.16.4" +version = "0.16.5" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2707,7 +2707,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-group" -version = "0.16.4" +version = "0.16.5" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2719,7 +2719,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-integers" -version = "0.16.4" +version = "0.16.5" dependencies = [ "paste", "snarkvm-circuit-environment", @@ -2732,7 +2732,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-scalar" -version = "0.16.4" +version = "0.16.5" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2742,7 +2742,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-string" -version = "0.16.4" +version = "0.16.5" dependencies = [ "rand", "snarkvm-circuit-environment", @@ -2755,7 +2755,7 @@ dependencies = [ [[package]] name = "snarkvm-console" -version = "0.16.4" +version = "0.16.5" dependencies = [ "snarkvm-console-account", "snarkvm-console-algorithms", @@ -2767,7 +2767,7 @@ dependencies = [ [[package]] name = "snarkvm-console-account" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "bs58", @@ -2780,7 +2780,7 @@ dependencies = [ [[package]] name = "snarkvm-console-algorithms" -version = "0.16.4" +version = "0.16.5" dependencies = [ "blake2s_simd", "criterion", @@ -2798,7 +2798,7 @@ dependencies = [ [[package]] name = "snarkvm-console-collections" -version = "0.16.4" +version = "0.16.5" dependencies = [ "aleo-std", "criterion", @@ -2811,7 +2811,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network" -version = "0.16.4" +version = "0.16.5" dependencies = [ "anyhow", "indexmap 2.0.2", @@ -2833,7 +2833,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network-environment" -version = "0.16.4" +version = "0.16.5" dependencies = [ "anyhow", "bech32", @@ -2850,7 +2850,7 @@ dependencies = [ [[package]] name = "snarkvm-console-program" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "enum_index", @@ -2871,7 +2871,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types" -version = "0.16.4" +version = "0.16.5" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-address", @@ -2885,7 +2885,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-address" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "serde_json", @@ -2897,7 +2897,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-boolean" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "serde_json", @@ -2906,7 +2906,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-field" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "serde_json", @@ -2917,7 +2917,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-group" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "serde_json", @@ -2929,7 +2929,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-integers" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "serde_json", @@ -2941,7 +2941,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-scalar" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "serde_json", @@ -2953,7 +2953,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-string" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "serde_json", @@ -2965,7 +2965,7 @@ dependencies = [ [[package]] name = "snarkvm-curves" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "criterion", @@ -2980,7 +2980,7 @@ dependencies = [ [[package]] name = "snarkvm-fields" -version = "0.16.4" +version = "0.16.5" dependencies = [ "aleo-std", "anyhow", @@ -2997,7 +2997,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger" -version = "0.16.4" +version = "0.16.5" dependencies = [ "aleo-std", "anyhow", @@ -3024,7 +3024,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-authority" -version = "0.16.4" +version = "0.16.5" dependencies = [ "anyhow", "bincode", @@ -3037,7 +3037,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-block" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3060,7 +3060,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-coinbase" -version = "0.16.4" +version = "0.16.5" dependencies = [ "aleo-std", "anyhow", @@ -3081,7 +3081,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-committee" -version = "0.16.4" +version = "0.16.5" dependencies = [ "anyhow", "bincode", @@ -3100,7 +3100,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal" -version = "0.16.4" +version = "0.16.5" dependencies = [ "snarkvm-ledger-narwhal", "snarkvm-ledger-narwhal-batch-certificate", @@ -3113,7 +3113,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3127,7 +3127,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3140,7 +3140,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-data" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bytes", "serde_json", @@ -3150,7 +3150,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3164,7 +3164,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "bytes", @@ -3177,7 +3177,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "serde_json", @@ -3187,7 +3187,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-query" -version = "0.16.4" +version = "0.16.5" dependencies = [ "async-trait", "reqwest", @@ -3199,7 +3199,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-store" -version = "0.16.4" +version = "0.16.5" dependencies = [ "aleo-std", "anyhow", @@ -3227,7 +3227,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-test-helpers" -version = "0.16.4" +version = "0.16.5" dependencies = [ "once_cell", "snarkvm-circuit", @@ -3241,7 +3241,7 @@ dependencies = [ [[package]] name = "snarkvm-parameters" -version = "0.16.4" +version = "0.16.5" dependencies = [ "aleo-std", "anyhow", @@ -3273,7 +3273,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer" -version = "0.16.4" +version = "0.16.5" dependencies = [ "aleo-std", "anyhow", @@ -3304,7 +3304,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-process" -version = "0.16.4" +version = "0.16.5" dependencies = [ "aleo-std", "bincode", @@ -3329,7 +3329,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-program" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "criterion", @@ -3345,7 +3345,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-snark" -version = "0.16.4" +version = "0.16.5" dependencies = [ "bincode", "colored", @@ -3358,7 +3358,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities" -version = "0.16.4" +version = "0.16.5" dependencies = [ "aleo-std", "anyhow", @@ -3378,7 +3378,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities-derives" -version = "0.16.4" +version = "0.16.5" dependencies = [ "proc-macro2", "quote 1.0.33", @@ -3387,7 +3387,7 @@ dependencies = [ [[package]] name = "snarkvm-wasm" -version = "0.16.4" +version = "0.16.5" dependencies = [ "getrandom", "rand", diff --git a/Cargo.toml b/Cargo.toml index 4ac1dab8a6..954ec8f058 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "A decentralized virtual machine" homepage = "https://aleo.org" @@ -146,53 +146,53 @@ wasm = [ "snarkvm-wasm" ] [dependencies.snarkvm-algorithms] path = "./algorithms" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-circuit] path = "./circuit" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-console] path = "./console" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-curves] path = "./curves" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-fields] path = "./fields" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-ledger] path = "./ledger" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-parameters] path = "./parameters" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-synthesizer] path = "./synthesizer" -version = "=0.16.4" +version = "=0.16.5" default-features = false optional = true [dependencies.snarkvm-utilities] path = "./utilities" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-wasm] path = "./wasm" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.anstyle] diff --git a/algorithms/Cargo.toml b/algorithms/Cargo.toml index 6fb80b834a..b9cac86589 100644 --- a/algorithms/Cargo.toml +++ b/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Algorithms for a decentralized virtual machine" homepage = "https://aleo.org" @@ -47,27 +47,27 @@ required-features = [ "test" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.snarkvm-parameters] path = "../parameters" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.snarkvm-algorithms-cuda] path = "./cuda" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.aleo-std] diff --git a/algorithms/cuda/Cargo.toml b/algorithms/cuda/Cargo.toml index 8998073548..f840c261ed 100644 --- a/algorithms/cuda/Cargo.toml +++ b/algorithms/cuda/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms-cuda" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Cuda optimizations for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/circuit/Cargo.toml b/circuit/Cargo.toml index 62e45b0e88..885e827cb4 100644 --- a/circuit/Cargo.toml +++ b/circuit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Circuits for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,28 +25,28 @@ edition = "2021" [dependencies.snarkvm-circuit-account] path = "./account" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-algorithms] path = "./algorithms" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-collections] path = "./collections" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-environment] path = "./environment" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-network] path = "./network" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-program] path = "./program" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types] path = "./types" -version = "=0.16.4" +version = "=0.16.5" diff --git a/circuit/account/Cargo.toml b/circuit/account/Cargo.toml index de893c3312..959c79a38e 100644 --- a/circuit/account/Cargo.toml +++ b/circuit/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-account" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Account circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-account" path = "../../console/account" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.4" +version = "=0.16.5" [dev-dependencies.snarkvm-utilities] path = "../../utilities" diff --git a/circuit/algorithms/Cargo.toml b/circuit/algorithms/Cargo.toml index e7f513efc4..4c4ab4b285 100644 --- a/circuit/algorithms/Cargo.toml +++ b/circuit/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-algorithms" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Algorithm circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-algorithms" path = "../../console/algorithms" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dev-dependencies.anyhow] diff --git a/circuit/collections/Cargo.toml b/circuit/collections/Cargo.toml index c78060e191..720c442e19 100644 --- a/circuit/collections/Cargo.toml +++ b/circuit/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-collections" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Collections circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-collections" path = "../../console/collections" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.4" +version = "=0.16.5" [dev-dependencies.snarkvm-circuit-network] path = "../network" diff --git a/circuit/environment/Cargo.toml b/circuit/environment/Cargo.toml index 539a6e2ed9..7c055e5861 100644 --- a/circuit/environment/Cargo.toml +++ b/circuit/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Circuit environment for a decentralized virtual machine" license = "Apache-2.0" @@ -14,32 +14,32 @@ harness = false [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.4" +version = "=0.16.5" default-features = false features = [ "r1cs" ] [dependencies.snarkvm-circuit-environment-witness] path = "./witness" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.indexmap] diff --git a/circuit/environment/witness/Cargo.toml b/circuit/environment/witness/Cargo.toml index d3904618ae..5cc96a46ee 100644 --- a/circuit/environment/witness/Cargo.toml +++ b/circuit/environment/witness/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment-witness" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "A procedural macro to construct a witness in an environment" license = "Apache-2.0" diff --git a/circuit/network/Cargo.toml b/circuit/network/Cargo.toml index aa7973b8f6..c64a9cb243 100644 --- a/circuit/network/Cargo.toml +++ b/circuit/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-network" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Network circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.4" +version = "=0.16.5" [dev-dependencies.snarkvm-console-types] path = "../../console/types" diff --git a/circuit/program/Cargo.toml b/circuit/program/Cargo.toml index 213d54b863..612553ff24 100644 --- a/circuit/program/Cargo.toml +++ b/circuit/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-program" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Program circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,32 +9,32 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-program" path = "../../console/program" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-circuit-account] path = "../account" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.4" +version = "=0.16.5" [dependencies.paste] version = "1.0" diff --git a/circuit/types/Cargo.toml b/circuit/types/Cargo.toml index 3bdc112b7d..019be22e8d 100644 --- a/circuit/types/Cargo.toml +++ b/circuit/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Primitive circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -8,35 +8,35 @@ edition = "2021" [dependencies.snarkvm-circuit-environment] path = "../environment" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-address] path = "./address" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-boolean] path = "./boolean" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-field] path = "./field" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-group] path = "./group" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-integers] path = "./integers" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-scalar] path = "./scalar" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-string] path = "./string" -version = "=0.16.4" +version = "=0.16.5" [dev-dependencies.console] package = "snarkvm-console" diff --git a/circuit/types/address/Cargo.toml b/circuit/types/address/Cargo.toml index 4d4d845b35..1822a1faf6 100644 --- a/circuit/types/address/Cargo.toml +++ b/circuit/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-address" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Address circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,28 +9,28 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-address" path = "../../../console/types/address" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-group] path = "../group" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.4" +version = "=0.16.5" [features] default = [ "enable_console" ] diff --git a/circuit/types/boolean/Cargo.toml b/circuit/types/boolean/Cargo.toml index 5d16034f64..39f0fff794 100644 --- a/circuit/types/boolean/Cargo.toml +++ b/circuit/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-boolean" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Boolean circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -14,12 +14,12 @@ harness = false [dependencies.console] package = "snarkvm-console-types-boolean" path = "../../../console/types/boolean" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.4" +version = "=0.16.5" [dev-dependencies.criterion] version = "0.5" diff --git a/circuit/types/field/Cargo.toml b/circuit/types/field/Cargo.toml index eb8bdc4cdf..9241bc5ebf 100644 --- a/circuit/types/field/Cargo.toml +++ b/circuit/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-field" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Field circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-field" path = "../../../console/types/field" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.4" +version = "=0.16.5" [features] default = [ "enable_console" ] diff --git a/circuit/types/group/Cargo.toml b/circuit/types/group/Cargo.toml index 99788ae4da..836f2ed92d 100644 --- a/circuit/types/group/Cargo.toml +++ b/circuit/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-group" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Group circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-group" path = "../../../console/types/group" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.4" +version = "=0.16.5" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/integers/Cargo.toml b/circuit/types/integers/Cargo.toml index fb26c09b88..1369f3de47 100644 --- a/circuit/types/integers/Cargo.toml +++ b/circuit/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-integers" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Integer circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-integers" path = "../../../console/types/integers" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.4" +version = "=0.16.5" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/scalar/Cargo.toml b/circuit/types/scalar/Cargo.toml index 64e57a6e6b..ec835400a9 100644 --- a/circuit/types/scalar/Cargo.toml +++ b/circuit/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-scalar" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Scalar circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-scalar" path = "../../../console/types/scalar" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.4" +version = "=0.16.5" [features] default = [ "enable_console" ] diff --git a/circuit/types/string/Cargo.toml b/circuit/types/string/Cargo.toml index c7e2e3bebc..5144f5f94a 100644 --- a/circuit/types/string/Cargo.toml +++ b/circuit/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-string" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "String circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-string" path = "../../../console/types/string" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-circuit-types-integers] path = "../integers" -version = "=0.16.4" +version = "=0.16.5" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/console/Cargo.toml b/console/Cargo.toml index a26fee779c..1507d2ee8b 100644 --- a/console/Cargo.toml +++ b/console/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Console environment for a decentralized virtual machine" license = "Apache-2.0" @@ -8,32 +8,32 @@ edition = "2021" [dependencies.snarkvm-console-account] path = "./account" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-console-algorithms] path = "./algorithms" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-console-collections] path = "./collections" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-console-network] path = "./network" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-console-program] path = "./program" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-console-types] path = "./types" -version = "=0.16.4" +version = "=0.16.5" optional = true [features] diff --git a/console/account/Cargo.toml b/console/account/Cargo.toml index 9c72f4d28d..3cf67399dc 100644 --- a/console/account/Cargo.toml +++ b/console/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-account" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Account operations for a decentralized virtual machine" license = "Apache-2.0" @@ -13,11 +13,11 @@ harness = false [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.4" +version = "=0.16.5" default-features = false features = [ "address", "boolean", "field", "group", "scalar" ] diff --git a/console/algorithms/Cargo.toml b/console/algorithms/Cargo.toml index 1c9c2d3d99..3d8fbc6d79 100644 --- a/console/algorithms/Cargo.toml +++ b/console/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-algorithms" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Console algorithms for a decentralized virtual machine" license = "Apache-2.0" @@ -23,18 +23,18 @@ harness = false [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.4" +version = "=0.16.5" default-features = false features = [ "field", "group", "integers", "scalar" ] [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.4" +version = "=0.16.5" [dependencies.blake2s_simd] version = "1.0" diff --git a/console/collections/Cargo.toml b/console/collections/Cargo.toml index 934b9888f7..9fcb849088 100644 --- a/console/collections/Cargo.toml +++ b/console/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-collections" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Collections for a decentralized virtual machine" license = "Apache-2.0" @@ -18,11 +18,11 @@ harness = false [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.4" +version = "=0.16.5" default-features = false features = [ "field", "integers" ] diff --git a/console/network/Cargo.toml b/console/network/Cargo.toml index 18ffdd4427..e611efe2d1 100644 --- a/console/network/Cargo.toml +++ b/console/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Network console library for a decentralized virtual machine" license = "Apache-2.0" @@ -15,45 +15,45 @@ wasm = [ [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.4" +version = "=0.16.5" default-features = false features = [ "snark" ] [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-network-environment] path = "./environment" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.4" +version = "=0.16.5" default-features = false features = [ "field", "group", "scalar" ] [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.snarkvm-parameters] path = "../../parameters" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.4" +version = "=0.16.5" [dependencies.anyhow] version = "1.0.73" diff --git a/console/network/environment/Cargo.toml b/console/network/environment/Cargo.toml index 9205f7198f..0844a65738 100644 --- a/console/network/environment/Cargo.toml +++ b/console/network/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network-environment" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Environment console library for a decentralized virtual machine" license = "Apache-2.0" @@ -8,17 +8,17 @@ edition = "2021" [dependencies.snarkvm-curves] path = "../../../curves" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.snarkvm-fields] path = "../../../fields" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.snarkvm-utilities] path = "../../../utilities" -version = "=0.16.4" +version = "=0.16.5" [dependencies.anyhow] version = "1.0.73" diff --git a/console/program/Cargo.toml b/console/program/Cargo.toml index a8f21498be..9413e5535a 100644 --- a/console/program/Cargo.toml +++ b/console/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-program" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Program operations for a decentralized virtual machine" license = "Apache-2.0" @@ -12,27 +12,27 @@ test = [ ] [dependencies.snarkvm-console-account] path = "../account" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.4" +version = "=0.16.5" [dependencies.enum_index] version = "0.2" diff --git a/console/types/Cargo.toml b/console/types/Cargo.toml index ba5deb6c15..b1adc1f393 100644 --- a/console/types/Cargo.toml +++ b/console/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Console types for a decentralized virtual machine" license = "Apache-2.0" @@ -8,41 +8,41 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../network/environment" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types-address] path = "./address" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-console-types-boolean] path = "./boolean" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-console-types-field] path = "./field" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-console-types-group] path = "./group" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-console-types-integers] path = "./integers" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-console-types-scalar] path = "./scalar" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-console-types-string] path = "./string" -version = "=0.16.4" +version = "=0.16.5" optional = true [features] diff --git a/console/types/address/Cargo.toml b/console/types/address/Cargo.toml index 66f8d982d6..791ae4d5bc 100644 --- a/console/types/address/Cargo.toml +++ b/console/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-address" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types-group] path = "../group" -version = "=0.16.4" +version = "=0.16.5" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/boolean/Cargo.toml b/console/types/boolean/Cargo.toml index a4a9373413..54e95da632 100644 --- a/console/types/boolean/Cargo.toml +++ b/console/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-boolean" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,7 +8,7 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.4" +version = "=0.16.5" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/field/Cargo.toml b/console/types/field/Cargo.toml index bf8d52d051..2b7700d6bf 100644 --- a/console/types/field/Cargo.toml +++ b/console/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-field" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,11 +8,11 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.4" +version = "=0.16.5" [dependencies.zeroize] version = "1" diff --git a/console/types/group/Cargo.toml b/console/types/group/Cargo.toml index 970d413bcf..0a6dc49d1f 100644 --- a/console/types/group/Cargo.toml +++ b/console/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-group" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.4" +version = "=0.16.5" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/integers/Cargo.toml b/console/types/integers/Cargo.toml index 9e01d5aa87..a3361984ae 100644 --- a/console/types/integers/Cargo.toml +++ b/console/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-integers" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.4" +version = "=0.16.5" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/scalar/Cargo.toml b/console/types/scalar/Cargo.toml index bb76144f9c..133893e51c 100644 --- a/console/types/scalar/Cargo.toml +++ b/console/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-scalar" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,15 +8,15 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.4" +version = "=0.16.5" [dependencies.zeroize] version = "1" diff --git a/console/types/string/Cargo.toml b/console/types/string/Cargo.toml index 37885d6d9c..ea5593e97a 100644 --- a/console/types/string/Cargo.toml +++ b/console/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-string" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-console-types-integers] path = "../integers" -version = "=0.16.4" +version = "=0.16.5" [dev-dependencies.bincode] version = "1.3" diff --git a/curves/Cargo.toml b/curves/Cargo.toml index e7dc585413..84ecbb55c4 100644 --- a/curves/Cargo.toml +++ b/curves/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-curves" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Curves for a decentralized virtual machine" homepage = "https://aleo.org" @@ -36,12 +36,12 @@ harness = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.rand] diff --git a/fields/Cargo.toml b/fields/Cargo.toml index eaee6f9cf8..a2e89b842e 100644 --- a/fields/Cargo.toml +++ b/fields/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-fields" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Fields for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.aleo-std] diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index caf5757715..57adb8e2b7 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "A node ledger for a decentralized virtual machine" homepage = "https://aleo.org" @@ -56,54 +56,54 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "./authority" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "./block" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "./coinbase" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "./committee" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-narwhal] package = "snarkvm-ledger-narwhal" path = "./narwhal" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "./query" -version = "=0.16.4" +version = "=0.16.5" features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "./store" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-test-helpers] package = "snarkvm-ledger-test-helpers" path = "./test-helpers" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.synthesizer] package = "snarkvm-synthesizer" path = "../synthesizer" -version = "=0.16.4" +version = "=0.16.5" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/authority/Cargo.toml b/ledger/authority/Cargo.toml index 8b010920b3..ce6eb19f00 100644 --- a/ledger/authority/Cargo.toml +++ b/ledger/authority/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-authority" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Data structures for a block authority in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-subdag/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.4" +version = "=0.16.5" [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.4" +version = "=0.16.5" [dependencies.anyhow] version = "1" diff --git a/ledger/block/Cargo.toml b/ledger/block/Cargo.toml index 7d40f87f55..71c42ba694 100644 --- a/ledger/block/Cargo.toml +++ b/ledger/block/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-block" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "A block for a decentralized virtual machine" homepage = "https://aleo.org" @@ -39,42 +39,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../ledger/coinbase" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../../ledger/committee" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../narwhal/transmission-id" -version = "=0.16.4" +version = "=0.16.5" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.4" +version = "=0.16.5" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.4" +version = "=0.16.5" [dependencies.indexmap] version = "2.0" diff --git a/ledger/coinbase/Cargo.toml b/ledger/coinbase/Cargo.toml index d7425406a7..1460446f63 100644 --- a/ledger/coinbase/Cargo.toml +++ b/ledger/coinbase/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-coinbase" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Coinbase puzzle for a decentralized virtual machine" homepage = "https://aleo.org" @@ -50,27 +50,27 @@ wasm = [ [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-synthesizer-snark] path = "../../synthesizer/snark" -version = "=0.16.4" +version = "=0.16.5" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.aleo-std] diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index f92f139796..946b1c7be4 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-committee" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "A committee for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,7 +33,7 @@ test-helpers = [ "prop-tests", "rand_distr" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.4" +version = "=0.16.5" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/Cargo.toml b/ledger/narwhal/Cargo.toml index 245e723528..afa0bf5f1a 100644 --- a/ledger/narwhal/Cargo.toml +++ b/ledger/narwhal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Data structures for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -64,37 +64,37 @@ transmission-id = [ "narwhal-transmission-id" ] [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "./batch-certificate" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "./batch-header" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "./data" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "./subdag" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.narwhal-transmission] package = "snarkvm-ledger-narwhal-transmission" path = "./transmission" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "./transmission-id" -version = "=0.16.4" +version = "=0.16.5" optional = true [dev-dependencies.snarkvm-ledger-narwhal] diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index 9e69628783..dd5433357b 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-header/test-helpers", "time" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.4" +version = "=0.16.5" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.4" +version = "=0.16.5" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.4" +version = "=0.16.5" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/batch-header/Cargo.toml b/ledger/narwhal/batch-header/Cargo.toml index d1b6be3610..dc961ceed8 100644 --- a/ledger/narwhal/batch-header/Cargo.toml +++ b/ledger/narwhal/batch-header/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "A batch header for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-transmission-id/test-helpers", "time" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.4" +version = "=0.16.5" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.4" +version = "=0.16.5" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/data/Cargo.toml b/ledger/narwhal/data/Cargo.toml index 81c9870450..38ac80f2ae 100644 --- a/ledger/narwhal/data/Cargo.toml +++ b/ledger/narwhal/data/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-data" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -29,7 +29,7 @@ async = [ "tokio" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.4" +version = "=0.16.5" [dependencies.bytes] version = "1" diff --git a/ledger/narwhal/subdag/Cargo.toml b/ledger/narwhal/subdag/Cargo.toml index c8bbfccaa9..46391b7e83 100644 --- a/ledger/narwhal/subdag/Cargo.toml +++ b/ledger/narwhal/subdag/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "A subdag for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-certificate/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.4" +version = "=0.16.5" [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../batch-certificate" -version = "=0.16.4" +version = "=0.16.5" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.4" +version = "=0.16.5" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/transmission-id/Cargo.toml b/ledger/narwhal/transmission-id/Cargo.toml index 4e71e1238e..ae00ee4d14 100644 --- a/ledger/narwhal/transmission-id/Cargo.toml +++ b/ledger/narwhal/transmission-id/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "A transmission ID for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.4" +version = "=0.16.5" [dev-dependencies.bincode] version = "1.3" diff --git a/ledger/narwhal/transmission/Cargo.toml b/ledger/narwhal/transmission/Cargo.toml index d714a55458..687fe08605 100644 --- a/ledger/narwhal/transmission/Cargo.toml +++ b/ledger/narwhal/transmission/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "A transmission for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../block" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "../data" -version = "=0.16.4" +version = "=0.16.5" [dependencies.bytes] version = "1" diff --git a/ledger/query/Cargo.toml b/ledger/query/Cargo.toml index bd7dabe242..f5820502ca 100644 --- a/ledger/query/Cargo.toml +++ b/ledger/query/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-query" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "A query for a decentralized virtual machine" homepage = "https://aleo.org" @@ -30,18 +30,18 @@ query = [ "ledger-store", "synthesizer-program", "ureq" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.async-trait] diff --git a/ledger/store/Cargo.toml b/ledger/store/Cargo.toml index beeb7e2846..31e9f3a3d0 100644 --- a/ledger/store/Cargo.toml +++ b/ledger/store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-store" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "A data store for a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,42 +32,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../coinbase" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../committee" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../narwhal/batch-certificate" -version = "=0.16.4" +version = "=0.16.5" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.4" +version = "=0.16.5" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.4" +version = "=0.16.5" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/test-helpers/Cargo.toml b/ledger/test-helpers/Cargo.toml index fb386df5c3..453af9e379 100644 --- a/ledger/test-helpers/Cargo.toml +++ b/ledger/test-helpers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-test-helpers" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Test helpers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -19,39 +19,39 @@ edition = "2021" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.4" +version = "=0.16.5" [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../query" -version = "=0.16.4" +version = "=0.16.5" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.4" +version = "=0.16.5" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.4" +version = "=0.16.5" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "../../synthesizer/process" -version = "=0.16.4" +version = "=0.16.5" [dependencies.once_cell] version = "1.18" diff --git a/parameters/Cargo.toml b/parameters/Cargo.toml index 5cb534475b..6693e58680 100644 --- a/parameters/Cargo.toml +++ b/parameters/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-parameters" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Parameters for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "encoding", "js-sys", "web-sys" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.4" +version = "=0.16.5" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/Cargo.toml b/synthesizer/Cargo.toml index 98d3690150..0c611cc031 100644 --- a/synthesizer/Cargo.toml +++ b/synthesizer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Synthesizer for a decentralized virtual machine" homepage = "https://aleo.org" @@ -68,61 +68,61 @@ harness = false [dependencies.algorithms] package = "snarkvm-algorithms" path = "../algorithms" -version = "=0.16.4" +version = "=0.16.5" [dependencies.circuit] package = "snarkvm-circuit" path = "../circuit" -version = "=0.16.4" +version = "=0.16.5" [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../ledger/block" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../ledger/coinbase" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../ledger/committee" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../ledger/query" -version = "=0.16.4" +version = "=0.16.5" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../ledger/store" -version = "=0.16.4" +version = "=0.16.5" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "./process" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "./program" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "./snark" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.aleo-std] diff --git a/synthesizer/process/Cargo.toml b/synthesizer/process/Cargo.toml index 0337c998ef..670fccd178 100644 --- a/synthesizer/process/Cargo.toml +++ b/synthesizer/process/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-process" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "A process for a decentralized virtual machine" homepage = "https://aleo.org" @@ -48,40 +48,40 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.4" +version = "=0.16.5" default-features = false features = [ "network", "program", "types" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../ledger/block" -version = "=0.16.4" +version = "=0.16.5" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../../ledger/query" -version = "=0.16.4" +version = "=0.16.5" default-features = false [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../../ledger/store" -version = "=0.16.4" +version = "=0.16.5" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.4" +version = "=0.16.5" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.4" +version = "=0.16.5" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/program/Cargo.toml b/synthesizer/program/Cargo.toml index d24353cf03..4d92256002 100644 --- a/synthesizer/program/Cargo.toml +++ b/synthesizer/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-program" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Program for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "console/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.4" +version = "=0.16.5" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.4" +version = "=0.16.5" default-features = false features = [ "account", "network", "program", "types" ] diff --git a/synthesizer/snark/Cargo.toml b/synthesizer/snark/Cargo.toml index 216c654231..7ed5cdd480 100644 --- a/synthesizer/snark/Cargo.toml +++ b/synthesizer/snark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-snark" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "SNARK wrappers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,18 +33,18 @@ wasm = [ "console/wasm", "snarkvm-algorithms/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.4" +version = "=0.16.5" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.4" +version = "=0.16.5" default-features = false features = [ "network" ] [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.4" +version = "=0.16.5" [dependencies.bincode] version = "1" diff --git a/utilities/Cargo.toml b/utilities/Cargo.toml index b38edc8bf2..208c90eb68 100644 --- a/utilities/Cargo.toml +++ b/utilities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Utilities for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities-derives] path = "./derives" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.aleo-std] diff --git a/utilities/derives/Cargo.toml b/utilities/derives/Cargo.toml index 58cfbf1c75..89a3159471 100644 --- a/utilities/derives/Cargo.toml +++ b/utilities/derives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities-derives" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "Canonical serialization for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index a5c40929dc..c5c844d547 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-wasm" -version = "0.16.4" +version = "0.16.5" authors = [ "The Aleo Team " ] description = "WASM for a decentralized virtual machine" homepage = "https://aleo.org" @@ -28,30 +28,30 @@ crate-type = [ "cdylib", "rlib" ] [dependencies.snarkvm-console] path = "../console" -version = "=0.16.4" +version = "=0.16.5" features = [ "wasm" ] optional = true [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.4" +version = "=0.16.5" optional = true [dependencies.snarkvm-synthesizer] path = "../synthesizer" -version = "=0.16.4" +version = "=0.16.5" default-features = false features = [ "wasm" ] optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.4" +version = "=0.16.5" features = [ "wasm" ] optional = true From 4559a6e907817bea82ab4a4f8238a6f8b67e5b2f Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Wed, 25 Oct 2023 19:36:06 -0700 Subject: [PATCH 036/339] Adds replay prevention on rejected executions --- ledger/store/src/block/mod.rs | 73 +++++++++++++++---- ledger/store/src/helpers/memory/block.rs | 15 +++- ledger/store/src/helpers/rocksdb/block.rs | 13 +++- .../store/src/helpers/rocksdb/internal/id.rs | 4 + .../program/src/resources/credits.aleo | 8 +- synthesizer/src/vm/verify.rs | 19 ++++- 6 files changed, 106 insertions(+), 26 deletions(-) diff --git a/ledger/store/src/block/mod.rs b/ledger/store/src/block/mod.rs index 335b934526..603b44d4be 100644 --- a/ledger/store/src/block/mod.rs +++ b/ledger/store/src/block/mod.rs @@ -62,21 +62,22 @@ pub enum ConfirmedTxType { } /// Separates the confirmed transaction into a tuple. +#[allow(clippy::type_complexity)] fn to_confirmed_tuple( confirmed: ConfirmedTransaction, -) -> Result<(ConfirmedTxType, Transaction, Vec)> { +) -> Result<(ConfirmedTxType, Transaction, Vec, Option>)> { match confirmed { ConfirmedTransaction::AcceptedDeploy(index, tx, finalize) => { // Retrieve the number of finalize operations. let num_finalize = NumFinalizeSize::try_from(finalize.len())?; // Return the confirmed tuple. - Ok((ConfirmedTxType::AcceptedDeploy(index), tx, (num_finalize, finalize).to_bytes_le()?)) + Ok((ConfirmedTxType::AcceptedDeploy(index), tx, (num_finalize, finalize).to_bytes_le()?, None)) } ConfirmedTransaction::AcceptedExecute(index, tx, finalize) => { // Retrieve the number of finalize operations. let num_finalize = NumFinalizeSize::try_from(finalize.len())?; // Return the confirmed tuple. - Ok((ConfirmedTxType::AcceptedExecute(index), tx, (num_finalize, finalize).to_bytes_le()?)) + Ok((ConfirmedTxType::AcceptedExecute(index), tx, (num_finalize, finalize).to_bytes_le()?, None)) } ConfirmedTransaction::RejectedDeploy(index, tx, rejected, finalize) => { // Retrieve the number of finalize operations. @@ -92,7 +93,7 @@ fn to_confirmed_tuple( finalize.write_le(&mut blob)?; // Return the confirmed tuple. - Ok((ConfirmedTxType::RejectedDeploy(index), tx, blob)) + Ok((ConfirmedTxType::RejectedDeploy(index), tx, blob, Some(rejected))) } ConfirmedTransaction::RejectedExecute(index, tx, rejected, finalize) => { // Retrieve the number of finalize operations. @@ -108,7 +109,7 @@ fn to_confirmed_tuple( finalize.write_le(&mut blob)?; // Return the confirmed tuple. - Ok((ConfirmedTxType::RejectedExecute(index), tx, blob)) + Ok((ConfirmedTxType::RejectedExecute(index), tx, blob, Some(rejected))) } } } @@ -195,7 +196,11 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { /// The mapping of rejected or aborted `transaction ID` to `block hash`. type RejectedOrAbortedTransactionIDMap: for<'a> Map<'a, N::TransactionID, N::BlockHash>; /// The mapping of `transaction ID` to `(block hash, confirmed tx type, confirmed blob)`. + /// TODO (howardwu): For mainnet - With recent DB changes, to prevent breaking compatibility, + /// include rejected (d or e) ID into `ConfirmedTxType`, and change from `Vec` to `Vec`. type ConfirmedTransactionsMap: for<'a> Map<'a, N::TransactionID, (N::BlockHash, ConfirmedTxType, Vec)>; + /// The rejected deployment or execution map. + type RejectedDeploymentOrExecutionMap: for<'a> Map<'a, Field, Rejected>; /// The transaction storage. type TransactionStorage: TransactionStorage; /// The transition storage. @@ -232,6 +237,8 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { fn rejected_or_aborted_transaction_id_map(&self) -> &Self::RejectedOrAbortedTransactionIDMap; /// Returns the confirmed transactions map. fn confirmed_transactions_map(&self) -> &Self::ConfirmedTransactionsMap; + /// Returns the rejected deployment or execution map. + fn rejected_deployment_or_execution_map(&self) -> &Self::RejectedDeploymentOrExecutionMap; /// Returns the transaction store. fn transaction_store(&self) -> &TransactionStore; @@ -261,6 +268,7 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { self.aborted_transaction_ids_map().start_atomic(); self.rejected_or_aborted_transaction_id_map().start_atomic(); self.confirmed_transactions_map().start_atomic(); + self.rejected_deployment_or_execution_map().start_atomic(); self.transaction_store().start_atomic(); } @@ -280,6 +288,7 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { || self.aborted_transaction_ids_map().is_atomic_in_progress() || self.rejected_or_aborted_transaction_id_map().is_atomic_in_progress() || self.confirmed_transactions_map().is_atomic_in_progress() + || self.rejected_deployment_or_execution_map().is_atomic_in_progress() || self.transaction_store().is_atomic_in_progress() } @@ -299,6 +308,7 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { self.aborted_transaction_ids_map().atomic_checkpoint(); self.rejected_or_aborted_transaction_id_map().atomic_checkpoint(); self.confirmed_transactions_map().atomic_checkpoint(); + self.rejected_deployment_or_execution_map().atomic_checkpoint(); self.transaction_store().atomic_checkpoint(); } @@ -318,6 +328,7 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { self.aborted_transaction_ids_map().clear_latest_checkpoint(); self.rejected_or_aborted_transaction_id_map().clear_latest_checkpoint(); self.confirmed_transactions_map().clear_latest_checkpoint(); + self.rejected_deployment_or_execution_map().clear_latest_checkpoint(); self.transaction_store().clear_latest_checkpoint(); } @@ -337,6 +348,7 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { self.aborted_transaction_ids_map().atomic_rewind(); self.rejected_or_aborted_transaction_id_map().atomic_rewind(); self.confirmed_transactions_map().atomic_rewind(); + self.rejected_deployment_or_execution_map().atomic_rewind(); self.transaction_store().atomic_rewind(); } @@ -356,6 +368,7 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { self.aborted_transaction_ids_map().abort_atomic(); self.rejected_or_aborted_transaction_id_map().abort_atomic(); self.confirmed_transactions_map().abort_atomic(); + self.rejected_deployment_or_execution_map().abort_atomic(); self.transaction_store().abort_atomic(); } @@ -375,6 +388,7 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { self.aborted_transaction_ids_map().finish_atomic()?; self.rejected_or_aborted_transaction_id_map().finish_atomic()?; self.confirmed_transactions_map().finish_atomic()?; + self.rejected_deployment_or_execution_map().finish_atomic()?; self.transaction_store().finish_atomic() } @@ -454,9 +468,13 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { } // Store the confirmed transactions. - for (confirmed_type, transaction, blob) in confirmed { + for (confirmed_type, transaction, blob, rejected) in confirmed { // Store the block hash and confirmed transaction data. self.confirmed_transactions_map().insert(transaction.id(), (block.hash(), confirmed_type, blob))?; + // Store the rejected deployment or execution. + if let Some(rejected) = rejected { + self.rejected_deployment_or_execution_map().insert(rejected.to_id()?, rejected)?; + } // Store the transaction. self.transaction_store().insert(&transaction)?; } @@ -496,12 +514,12 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { None => Vec::new(), }; - // Retrieve the rejected transaction IDs. - let rejected_transaction_ids = match self.get_block_transactions(block_hash)? { + // Retrieve the rejected transaction IDs, and deployment or execution. + let rejected_transaction_ids_and_deployment_or_execution = match self.get_block_transactions(block_hash)? { Some(transactions) => transactions .iter() .filter(|tx| tx.is_rejected()) - .map(|tx| tx.to_unconfirmed_transaction_id()) + .map(|tx| Ok((tx.to_unconfirmed_transaction_id()?, tx.to_rejected_id()?))) .collect::>>()?, None => Vec::new(), }; @@ -560,9 +578,14 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { self.rejected_or_aborted_transaction_id_map().remove(&aborted_transaction_id)?; } - // Remove the rejected transaction IDs. - for rejected_transaction_id in rejected_transaction_ids { + // Remove the rejected state. + for (rejected_transaction_id, rejected_id) in rejected_transaction_ids_and_deployment_or_execution { + // Remove the rejected transaction ID. self.rejected_or_aborted_transaction_id_map().remove(&rejected_transaction_id)?; + // Remove the rejected deployment or execution. + if let Some(rejected_id) = rejected_id { + self.rejected_deployment_or_execution_map().remove(&rejected_id)?; + } } // Remove the block transactions. @@ -577,6 +600,22 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { }) } + /// Returns `true` if the given transaction ID exists. + fn contains_transaction_id(&self, transaction_id: &N::TransactionID) -> Result { + Ok(self.transaction_store().contains_transaction_id(transaction_id)? + || self.contains_rejected_or_aborted_transaction_id(transaction_id)?) + } + + /// Returns `true` if the given rejected transaction ID or aborted transaction ID exists. + fn contains_rejected_or_aborted_transaction_id(&self, transaction_id: &N::TransactionID) -> Result { + self.rejected_or_aborted_transaction_id_map().contains_key_confirmed(transaction_id) + } + + /// Returns `true` if the given rejected deployment or execution ID. + fn contains_rejected_deployment_or_execution_id(&self, rejected_id: &Field) -> Result { + self.rejected_deployment_or_execution_map().contains_key_confirmed(rejected_id) + } + /// Returns the block height that contains the given `state root`. fn find_block_height_from_state_root(&self, state_root: N::StateRoot) -> Result> { match self.reverse_state_root_map().get_confirmed(&state_root)? { @@ -1240,13 +1279,17 @@ impl> BlockStore { /// Returns `true` if the given transaction ID exists. pub fn contains_transaction_id(&self, transaction_id: &N::TransactionID) -> Result { - Ok(self.transaction_store().contains_transaction_id(transaction_id)? - || self.contains_rejected_or_aborted_transaction_id(transaction_id)?) + self.storage.contains_transaction_id(transaction_id) } - /// Returns `true` if the given rejected or aborted transaction ID exists. + /// Returns `true` if the given rejected transaction ID or aborted transaction ID exists. pub fn contains_rejected_or_aborted_transaction_id(&self, transaction_id: &N::TransactionID) -> Result { - self.storage.rejected_or_aborted_transaction_id_map().contains_key_confirmed(transaction_id) + self.storage.contains_rejected_or_aborted_transaction_id(transaction_id) + } + + /// Returns `true` if the given rejected deployment or execution ID. + pub fn contains_rejected_deployment_or_execution_id(&self, rejected_id: &Field) -> Result { + self.storage.contains_rejected_deployment_or_execution_id(rejected_id) } /// Returns `true` if the given certificate ID exists. diff --git a/ledger/store/src/helpers/memory/block.rs b/ledger/store/src/helpers/memory/block.rs index b64af3a484..c09fa09f2e 100644 --- a/ledger/store/src/helpers/memory/block.rs +++ b/ledger/store/src/helpers/memory/block.rs @@ -21,7 +21,7 @@ use crate::{ }; use console::{prelude::*, types::Field}; use ledger_authority::Authority; -use ledger_block::{Header, Ratifications}; +use ledger_block::{Header, Ratifications, Rejected}; use ledger_coinbase::{CoinbaseSolution, PuzzleCommitment}; /// An in-memory block storage. @@ -51,10 +51,12 @@ pub struct BlockMemory { transactions_map: MemoryMap>, /// The aborted transaction IDs map. aborted_transaction_ids_map: MemoryMap>, - /// The rejected or aborted transaction ID map. + /// The rejected transaction ID or aborted transaction ID map. rejected_or_aborted_transaction_id_map: MemoryMap, /// The confirmed transactions map. confirmed_transactions_map: MemoryMap)>, + /// The rejected deployment or execution map. + rejected_deployment_or_execution_map: MemoryMap, Rejected>, /// The transaction store. transaction_store: TransactionStore>, } @@ -75,6 +77,7 @@ impl BlockStorage for BlockMemory { type AbortedTransactionIDsMap = MemoryMap>; type RejectedOrAbortedTransactionIDMap = MemoryMap; type ConfirmedTransactionsMap = MemoryMap)>; + type RejectedDeploymentOrExecutionMap = MemoryMap, Rejected>; type TransactionStorage = TransactionMemory; type TransitionStorage = TransitionMemory; @@ -100,6 +103,7 @@ impl BlockStorage for BlockMemory { aborted_transaction_ids_map: MemoryMap::default(), rejected_or_aborted_transaction_id_map: MemoryMap::default(), confirmed_transactions_map: MemoryMap::default(), + rejected_deployment_or_execution_map: MemoryMap::default(), transaction_store, }) } @@ -164,7 +168,7 @@ impl BlockStorage for BlockMemory { &self.aborted_transaction_ids_map } - /// Returns the rejected or aborted transaction ID map. + /// Returns the rejected transaction ID or aborted transaction ID map. fn rejected_or_aborted_transaction_id_map(&self) -> &Self::RejectedOrAbortedTransactionIDMap { &self.rejected_or_aborted_transaction_id_map } @@ -174,6 +178,11 @@ impl BlockStorage for BlockMemory { &self.confirmed_transactions_map } + /// Returns the rejected deployment or execution map. + fn rejected_deployment_or_execution_map(&self) -> &Self::RejectedDeploymentOrExecutionMap { + &self.rejected_deployment_or_execution_map + } + /// Returns the transaction store. fn transaction_store(&self) -> &TransactionStore { &self.transaction_store diff --git a/ledger/store/src/helpers/rocksdb/block.rs b/ledger/store/src/helpers/rocksdb/block.rs index dbf9975755..121ae2a994 100644 --- a/ledger/store/src/helpers/rocksdb/block.rs +++ b/ledger/store/src/helpers/rocksdb/block.rs @@ -27,7 +27,7 @@ use crate::{ }; use console::{prelude::*, types::Field}; use ledger_authority::Authority; -use ledger_block::{Header, Ratifications}; +use ledger_block::{Header, Ratifications, Rejected}; use ledger_coinbase::{CoinbaseSolution, PuzzleCommitment}; /// A RocksDB block storage. @@ -61,6 +61,8 @@ pub struct BlockDB { rejected_or_aborted_transaction_id_map: DataMap, /// The confirmed transactions map. confirmed_transactions_map: DataMap)>, + /// The rejected deployment or execution map. + rejected_deployment_or_execution_map: DataMap, Rejected>, /// The transaction store. transaction_store: TransactionStore>, } @@ -81,6 +83,7 @@ impl BlockStorage for BlockDB { type AbortedTransactionIDsMap = DataMap>; type RejectedOrAbortedTransactionIDMap = DataMap; type ConfirmedTransactionsMap = DataMap)>; + type RejectedDeploymentOrExecutionMap = DataMap, Rejected>; type TransactionStorage = TransactionDB; type TransitionStorage = TransitionDB; @@ -106,6 +109,7 @@ impl BlockStorage for BlockDB { aborted_transaction_ids_map: internal::RocksDB::open_map(N::ID, dev, MapID::Block(BlockMap::AbortedTransactionIDs))?, rejected_or_aborted_transaction_id_map: internal::RocksDB::open_map(N::ID, dev, MapID::Block(BlockMap::RejectedOrAbortedTransactionID))?, confirmed_transactions_map: internal::RocksDB::open_map(N::ID, dev, MapID::Block(BlockMap::ConfirmedTransactions))?, + rejected_deployment_or_execution_map: internal::RocksDB::open_map(N::ID, dev, MapID::Block(BlockMap::RejectedDeploymentOrExecution))?, transaction_store, }) } @@ -170,7 +174,7 @@ impl BlockStorage for BlockDB { &self.aborted_transaction_ids_map } - /// Returns the rejected or aborted transaction ID map. + /// Returns the rejected transaction ID or aborted transaction ID map. fn rejected_or_aborted_transaction_id_map(&self) -> &Self::RejectedOrAbortedTransactionIDMap { &self.rejected_or_aborted_transaction_id_map } @@ -180,6 +184,11 @@ impl BlockStorage for BlockDB { &self.confirmed_transactions_map } + /// Returns the rejected deployment or execution map. + fn rejected_deployment_or_execution_map(&self) -> &Self::RejectedDeploymentOrExecutionMap { + &self.rejected_deployment_or_execution_map + } + /// Returns the transaction store. fn transaction_store(&self) -> &TransactionStore { &self.transaction_store diff --git a/ledger/store/src/helpers/rocksdb/internal/id.rs b/ledger/store/src/helpers/rocksdb/internal/id.rs index c8562c6cc7..3091895661 100644 --- a/ledger/store/src/helpers/rocksdb/internal/id.rs +++ b/ledger/store/src/helpers/rocksdb/internal/id.rs @@ -70,6 +70,7 @@ pub enum BlockMap { AbortedTransactionIDs = DataID::BlockAbortedTransactionIDsMap as u16, RejectedOrAbortedTransactionID = DataID::BlockRejectedOrAbortedTransactionIDMap as u16, ConfirmedTransactions = DataID::BlockConfirmedTransactionsMap as u16, + RejectedDeploymentOrExecution = DataID::BlockRejectedDeploymentOrExecutionMap as u16, } /// The RocksDB map prefix for committee-related entries. @@ -269,6 +270,9 @@ enum DataID { ProgramIDMap, KeyValueMap, + // TODO (howardwu): For mainnet - Reorder this up above. + BlockRejectedDeploymentOrExecutionMap, + // Testing #[cfg(test)] Test, diff --git a/synthesizer/program/src/resources/credits.aleo b/synthesizer/program/src/resources/credits.aleo index 8e8c279dc1..534bb4ce86 100644 --- a/synthesizer/program/src/resources/credits.aleo +++ b/synthesizer/program/src/resources/credits.aleo @@ -789,11 +789,11 @@ function fee_private: input r1 as u64.public; // Input the priority fee amount. input r2 as u64.public; - // Input the deployment or execution root. + // Input the deployment or execution ID. input r3 as field.public; // Ensure the amount is nonzero. assert.neq r1 0u64; - // Ensure the deployment or execution root is nonzero. + // Ensure the deployment or execution ID is nonzero. assert.neq r3 0field; // Add the fee and priority fee amounts. add r1 r2 into r4; @@ -815,11 +815,11 @@ function fee_public: input r0 as u64.public; // Input the priority fee amount. input r1 as u64.public; - // Input the deployment or execution root. + // Input the deployment or execution ID. input r2 as field.public; // Ensure the amount is nonzero. assert.neq r0 0u64; - // Ensure the deployment or execution root is nonzero. + // Ensure the deployment or execution ID is nonzero. assert.neq r2 0field; // Add the fee and priority fee amounts. add r0 r1 into r3; diff --git a/synthesizer/src/vm/verify.rs b/synthesizer/src/vm/verify.rs index d94be9addc..5d2ac228b6 100644 --- a/synthesizer/src/vm/verify.rs +++ b/synthesizer/src/vm/verify.rs @@ -44,6 +44,13 @@ impl> VM { bail!("Transaction '{}' already exists in the ledger", transaction.id()) } + // Ensure the rejected ID is unique. + if let Some(rejected_id) = rejected_id { + if self.block_store().contains_rejected_deployment_or_execution_id(&rejected_id)? { + bail!("Transaction '{}' already exists in the ledger", rejected_id) + } + } + // Compute the Merkle root of the transaction. match transaction.to_root() { // Ensure the transaction ID is correct. @@ -95,7 +102,7 @@ impl> VM { Transaction::Deploy(id, owner, deployment, _) => { // Compute the deployment ID. let Ok(deployment_id) = deployment.to_deployment_id() else { - bail!("Failed to compute the Merkle root for deployment transaction '{id}'") + bail!("Failed to compute the Merkle root for a deployment transaction '{id}'") }; // Verify the signature corresponds to the transaction ID. ensure!(owner.verify(deployment_id), "Invalid owner signature for deployment transaction '{id}'"); @@ -110,7 +117,15 @@ impl> VM { // Verify the deployment. self.check_deployment_internal(deployment)?; } - Transaction::Execute(_, execution, _) => { + Transaction::Execute(id, execution, _) => { + // Compute the execution ID. + let Ok(execution_id) = execution.to_execution_id() else { + bail!("Failed to compute the Merkle root for an execution transaction '{id}'") + }; + // Ensure the execution was not previously rejected (replay attack prevention). + if self.block_store().contains_rejected_deployment_or_execution_id(&execution_id)? { + bail!("Transaction '{id}' contains a previously rejected execution") + } // Verify the execution. self.check_execution_internal(execution)?; } From 26a93fb68e406a2ec28b5ca3b175d487ab1df420 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Wed, 25 Oct 2023 19:46:54 -0700 Subject: [PATCH 037/339] Minor nit --- ledger/block/src/transaction/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ledger/block/src/transaction/mod.rs b/ledger/block/src/transaction/mod.rs index 10fa27de2e..fe1ace4c76 100644 --- a/ledger/block/src/transaction/mod.rs +++ b/ledger/block/src/transaction/mod.rs @@ -82,19 +82,19 @@ impl Transaction { impl Transaction { /// Returns `true` if the transaction is a deploy transaction. #[inline] - pub fn is_deploy(&self) -> bool { + pub const fn is_deploy(&self) -> bool { matches!(self, Self::Deploy(..)) } /// Returns `true` if the transaction is an execute transaction. #[inline] - pub fn is_execute(&self) -> bool { + pub const fn is_execute(&self) -> bool { matches!(self, Self::Execute(..)) } /// Returns `true` if the transaction is a fee transaction. #[inline] - pub fn is_fee(&self) -> bool { + pub const fn is_fee(&self) -> bool { matches!(self, Self::Fee(..)) } } From 1d621e8e2cc05549224467a38e67d60400e3c484 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Wed, 25 Oct 2023 19:48:48 -0700 Subject: [PATCH 038/339] nit --- ledger/store/src/block/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ledger/store/src/block/mod.rs b/ledger/store/src/block/mod.rs index 603b44d4be..eeee7c684d 100644 --- a/ledger/store/src/block/mod.rs +++ b/ledger/store/src/block/mod.rs @@ -514,8 +514,8 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { None => Vec::new(), }; - // Retrieve the rejected transaction IDs, and deployment or execution. - let rejected_transaction_ids_and_deployment_or_execution = match self.get_block_transactions(block_hash)? { + // Retrieve the rejected transaction IDs, and the deployment or execution ID. + let rejected_transaction_ids_and_deployment_or_execution_id = match self.get_block_transactions(block_hash)? { Some(transactions) => transactions .iter() .filter(|tx| tx.is_rejected()) @@ -579,7 +579,7 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { } // Remove the rejected state. - for (rejected_transaction_id, rejected_id) in rejected_transaction_ids_and_deployment_or_execution { + for (rejected_transaction_id, rejected_id) in rejected_transaction_ids_and_deployment_or_execution_id { // Remove the rejected transaction ID. self.rejected_or_aborted_transaction_id_map().remove(&rejected_transaction_id)?; // Remove the rejected deployment or execution. From 301573b0eef2764d4a90944193dedff6d408180a Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Wed, 25 Oct 2023 20:12:04 -0700 Subject: [PATCH 039/339] Remove unnecessary check --- synthesizer/src/vm/verify.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/synthesizer/src/vm/verify.rs b/synthesizer/src/vm/verify.rs index 5d2ac228b6..99c921dec7 100644 --- a/synthesizer/src/vm/verify.rs +++ b/synthesizer/src/vm/verify.rs @@ -44,13 +44,6 @@ impl> VM { bail!("Transaction '{}' already exists in the ledger", transaction.id()) } - // Ensure the rejected ID is unique. - if let Some(rejected_id) = rejected_id { - if self.block_store().contains_rejected_deployment_or_execution_id(&rejected_id)? { - bail!("Transaction '{}' already exists in the ledger", rejected_id) - } - } - // Compute the Merkle root of the transaction. match transaction.to_root() { // Ensure the transaction ID is correct. From 6528130cd63920eb85f09a7a6a1ab15cdc559362 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Wed, 25 Oct 2023 20:29:50 -0700 Subject: [PATCH 040/339] chore(snarkvm): bump version for new release --- .cargo/release-version | 2 +- Cargo.lock | 118 ++++++++++---------- Cargo.toml | 22 ++-- algorithms/Cargo.toml | 12 +- algorithms/cuda/Cargo.toml | 2 +- circuit/Cargo.toml | 16 +-- circuit/account/Cargo.toml | 10 +- circuit/algorithms/Cargo.toml | 8 +- circuit/collections/Cargo.toml | 8 +- circuit/environment/Cargo.toml | 14 +-- circuit/environment/witness/Cargo.toml | 2 +- circuit/network/Cargo.toml | 10 +- circuit/program/Cargo.toml | 16 +-- circuit/types/Cargo.toml | 18 +-- circuit/types/address/Cargo.toml | 14 +-- circuit/types/boolean/Cargo.toml | 6 +- circuit/types/field/Cargo.toml | 8 +- circuit/types/group/Cargo.toml | 12 +- circuit/types/integers/Cargo.toml | 12 +- circuit/types/scalar/Cargo.toml | 10 +- circuit/types/string/Cargo.toml | 12 +- console/Cargo.toml | 14 +-- console/account/Cargo.toml | 6 +- console/algorithms/Cargo.toml | 8 +- console/collections/Cargo.toml | 6 +- console/network/Cargo.toml | 20 ++-- console/network/environment/Cargo.toml | 8 +- console/program/Cargo.toml | 14 +-- console/types/Cargo.toml | 18 +-- console/types/address/Cargo.toml | 10 +- console/types/boolean/Cargo.toml | 4 +- console/types/field/Cargo.toml | 6 +- console/types/group/Cargo.toml | 10 +- console/types/integers/Cargo.toml | 10 +- console/types/scalar/Cargo.toml | 8 +- console/types/string/Cargo.toml | 10 +- curves/Cargo.toml | 6 +- fields/Cargo.toml | 4 +- ledger/Cargo.toml | 22 ++-- ledger/authority/Cargo.toml | 6 +- ledger/block/Cargo.toml | 18 +-- ledger/coinbase/Cargo.toml | 14 +-- ledger/committee/Cargo.toml | 4 +- ledger/narwhal/Cargo.toml | 14 +-- ledger/narwhal/batch-certificate/Cargo.toml | 8 +- ledger/narwhal/batch-header/Cargo.toml | 6 +- ledger/narwhal/data/Cargo.toml | 4 +- ledger/narwhal/subdag/Cargo.toml | 8 +- ledger/narwhal/transmission-id/Cargo.toml | 6 +- ledger/narwhal/transmission/Cargo.toml | 10 +- ledger/query/Cargo.toml | 8 +- ledger/store/Cargo.toml | 18 +-- ledger/test-helpers/Cargo.toml | 16 +-- parameters/Cargo.toml | 6 +- synthesizer/Cargo.toml | 24 ++-- synthesizer/process/Cargo.toml | 16 +-- synthesizer/program/Cargo.toml | 6 +- synthesizer/snark/Cargo.toml | 8 +- utilities/Cargo.toml | 4 +- utilities/derives/Cargo.toml | 2 +- wasm/Cargo.toml | 12 +- 61 files changed, 367 insertions(+), 367 deletions(-) diff --git a/.cargo/release-version b/.cargo/release-version index b346bd2f8a..caec9a71d6 100644 --- a/.cargo/release-version +++ b/.cargo/release-version @@ -1 +1 @@ -v0.16.5 \ No newline at end of file +v0.16.6 \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index c74328f70e..1f289e9d17 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2473,7 +2473,7 @@ dependencies = [ [[package]] name = "snarkvm" -version = "0.16.5" +version = "0.16.6" dependencies = [ "anstyle", "anyhow", @@ -2508,7 +2508,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms" -version = "0.16.5" +version = "0.16.6" dependencies = [ "aleo-std", "anyhow", @@ -2547,7 +2547,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms-cuda" -version = "0.16.5" +version = "0.16.6" dependencies = [ "blst", "cc", @@ -2557,7 +2557,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit" -version = "0.16.5" +version = "0.16.6" dependencies = [ "snarkvm-circuit-account", "snarkvm-circuit-algorithms", @@ -2570,7 +2570,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-account" -version = "0.16.5" +version = "0.16.6" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2582,7 +2582,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-algorithms" -version = "0.16.5" +version = "0.16.6" dependencies = [ "anyhow", "snarkvm-circuit-types", @@ -2594,7 +2594,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-collections" -version = "0.16.5" +version = "0.16.6" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2608,7 +2608,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment" -version = "0.16.5" +version = "0.16.6" dependencies = [ "criterion", "indexmap 2.0.2", @@ -2629,11 +2629,11 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment-witness" -version = "0.16.5" +version = "0.16.6" [[package]] name = "snarkvm-circuit-network" -version = "0.16.5" +version = "0.16.6" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-collections", @@ -2644,7 +2644,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-program" -version = "0.16.5" +version = "0.16.6" dependencies = [ "anyhow", "paste", @@ -2662,7 +2662,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types" -version = "0.16.5" +version = "0.16.6" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-address", @@ -2677,7 +2677,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-address" -version = "0.16.5" +version = "0.16.6" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2689,7 +2689,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-boolean" -version = "0.16.5" +version = "0.16.6" dependencies = [ "criterion", "snarkvm-circuit-environment", @@ -2698,7 +2698,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-field" -version = "0.16.5" +version = "0.16.6" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2707,7 +2707,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-group" -version = "0.16.5" +version = "0.16.6" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2719,7 +2719,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-integers" -version = "0.16.5" +version = "0.16.6" dependencies = [ "paste", "snarkvm-circuit-environment", @@ -2732,7 +2732,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-scalar" -version = "0.16.5" +version = "0.16.6" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2742,7 +2742,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-string" -version = "0.16.5" +version = "0.16.6" dependencies = [ "rand", "snarkvm-circuit-environment", @@ -2755,7 +2755,7 @@ dependencies = [ [[package]] name = "snarkvm-console" -version = "0.16.5" +version = "0.16.6" dependencies = [ "snarkvm-console-account", "snarkvm-console-algorithms", @@ -2767,7 +2767,7 @@ dependencies = [ [[package]] name = "snarkvm-console-account" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "bs58", @@ -2780,7 +2780,7 @@ dependencies = [ [[package]] name = "snarkvm-console-algorithms" -version = "0.16.5" +version = "0.16.6" dependencies = [ "blake2s_simd", "criterion", @@ -2798,7 +2798,7 @@ dependencies = [ [[package]] name = "snarkvm-console-collections" -version = "0.16.5" +version = "0.16.6" dependencies = [ "aleo-std", "criterion", @@ -2811,7 +2811,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network" -version = "0.16.5" +version = "0.16.6" dependencies = [ "anyhow", "indexmap 2.0.2", @@ -2833,7 +2833,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network-environment" -version = "0.16.5" +version = "0.16.6" dependencies = [ "anyhow", "bech32", @@ -2850,7 +2850,7 @@ dependencies = [ [[package]] name = "snarkvm-console-program" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "enum_index", @@ -2871,7 +2871,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types" -version = "0.16.5" +version = "0.16.6" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-address", @@ -2885,7 +2885,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-address" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "serde_json", @@ -2897,7 +2897,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-boolean" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "serde_json", @@ -2906,7 +2906,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-field" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "serde_json", @@ -2917,7 +2917,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-group" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "serde_json", @@ -2929,7 +2929,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-integers" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "serde_json", @@ -2941,7 +2941,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-scalar" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "serde_json", @@ -2953,7 +2953,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-string" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "serde_json", @@ -2965,7 +2965,7 @@ dependencies = [ [[package]] name = "snarkvm-curves" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "criterion", @@ -2980,7 +2980,7 @@ dependencies = [ [[package]] name = "snarkvm-fields" -version = "0.16.5" +version = "0.16.6" dependencies = [ "aleo-std", "anyhow", @@ -2997,7 +2997,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger" -version = "0.16.5" +version = "0.16.6" dependencies = [ "aleo-std", "anyhow", @@ -3024,7 +3024,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-authority" -version = "0.16.5" +version = "0.16.6" dependencies = [ "anyhow", "bincode", @@ -3037,7 +3037,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-block" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3060,7 +3060,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-coinbase" -version = "0.16.5" +version = "0.16.6" dependencies = [ "aleo-std", "anyhow", @@ -3081,7 +3081,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-committee" -version = "0.16.5" +version = "0.16.6" dependencies = [ "anyhow", "bincode", @@ -3100,7 +3100,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal" -version = "0.16.5" +version = "0.16.6" dependencies = [ "snarkvm-ledger-narwhal", "snarkvm-ledger-narwhal-batch-certificate", @@ -3113,7 +3113,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3127,7 +3127,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3140,7 +3140,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-data" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bytes", "serde_json", @@ -3150,7 +3150,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3164,7 +3164,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "bytes", @@ -3177,7 +3177,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "serde_json", @@ -3187,7 +3187,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-query" -version = "0.16.5" +version = "0.16.6" dependencies = [ "async-trait", "reqwest", @@ -3199,7 +3199,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-store" -version = "0.16.5" +version = "0.16.6" dependencies = [ "aleo-std", "anyhow", @@ -3227,7 +3227,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-test-helpers" -version = "0.16.5" +version = "0.16.6" dependencies = [ "once_cell", "snarkvm-circuit", @@ -3241,7 +3241,7 @@ dependencies = [ [[package]] name = "snarkvm-parameters" -version = "0.16.5" +version = "0.16.6" dependencies = [ "aleo-std", "anyhow", @@ -3273,7 +3273,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer" -version = "0.16.5" +version = "0.16.6" dependencies = [ "aleo-std", "anyhow", @@ -3304,7 +3304,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-process" -version = "0.16.5" +version = "0.16.6" dependencies = [ "aleo-std", "bincode", @@ -3329,7 +3329,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-program" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "criterion", @@ -3345,7 +3345,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-snark" -version = "0.16.5" +version = "0.16.6" dependencies = [ "bincode", "colored", @@ -3358,7 +3358,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities" -version = "0.16.5" +version = "0.16.6" dependencies = [ "aleo-std", "anyhow", @@ -3378,7 +3378,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities-derives" -version = "0.16.5" +version = "0.16.6" dependencies = [ "proc-macro2", "quote 1.0.33", @@ -3387,7 +3387,7 @@ dependencies = [ [[package]] name = "snarkvm-wasm" -version = "0.16.5" +version = "0.16.6" dependencies = [ "getrandom", "rand", diff --git a/Cargo.toml b/Cargo.toml index 954ec8f058..526033a74c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "A decentralized virtual machine" homepage = "https://aleo.org" @@ -146,53 +146,53 @@ wasm = [ "snarkvm-wasm" ] [dependencies.snarkvm-algorithms] path = "./algorithms" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-circuit] path = "./circuit" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-console] path = "./console" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-curves] path = "./curves" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-fields] path = "./fields" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-ledger] path = "./ledger" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-parameters] path = "./parameters" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-synthesizer] path = "./synthesizer" -version = "=0.16.5" +version = "=0.16.6" default-features = false optional = true [dependencies.snarkvm-utilities] path = "./utilities" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-wasm] path = "./wasm" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.anstyle] diff --git a/algorithms/Cargo.toml b/algorithms/Cargo.toml index b9cac86589..7f239d4e13 100644 --- a/algorithms/Cargo.toml +++ b/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Algorithms for a decentralized virtual machine" homepage = "https://aleo.org" @@ -47,27 +47,27 @@ required-features = [ "test" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.snarkvm-parameters] path = "../parameters" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.snarkvm-algorithms-cuda] path = "./cuda" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.aleo-std] diff --git a/algorithms/cuda/Cargo.toml b/algorithms/cuda/Cargo.toml index f840c261ed..7a1f1e235d 100644 --- a/algorithms/cuda/Cargo.toml +++ b/algorithms/cuda/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms-cuda" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Cuda optimizations for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/circuit/Cargo.toml b/circuit/Cargo.toml index 885e827cb4..9d49fb0840 100644 --- a/circuit/Cargo.toml +++ b/circuit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Circuits for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,28 +25,28 @@ edition = "2021" [dependencies.snarkvm-circuit-account] path = "./account" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-algorithms] path = "./algorithms" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-collections] path = "./collections" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-environment] path = "./environment" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-network] path = "./network" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-program] path = "./program" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types] path = "./types" -version = "=0.16.5" +version = "=0.16.6" diff --git a/circuit/account/Cargo.toml b/circuit/account/Cargo.toml index 959c79a38e..cfb581b4a2 100644 --- a/circuit/account/Cargo.toml +++ b/circuit/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-account" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Account circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-account" path = "../../console/account" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.5" +version = "=0.16.6" [dev-dependencies.snarkvm-utilities] path = "../../utilities" diff --git a/circuit/algorithms/Cargo.toml b/circuit/algorithms/Cargo.toml index 4c4ab4b285..3102b0c51b 100644 --- a/circuit/algorithms/Cargo.toml +++ b/circuit/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-algorithms" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Algorithm circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-algorithms" path = "../../console/algorithms" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dev-dependencies.anyhow] diff --git a/circuit/collections/Cargo.toml b/circuit/collections/Cargo.toml index 720c442e19..9b0c94bfa2 100644 --- a/circuit/collections/Cargo.toml +++ b/circuit/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-collections" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Collections circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-collections" path = "../../console/collections" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.5" +version = "=0.16.6" [dev-dependencies.snarkvm-circuit-network] path = "../network" diff --git a/circuit/environment/Cargo.toml b/circuit/environment/Cargo.toml index 7c055e5861..2e5d380086 100644 --- a/circuit/environment/Cargo.toml +++ b/circuit/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Circuit environment for a decentralized virtual machine" license = "Apache-2.0" @@ -14,32 +14,32 @@ harness = false [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.5" +version = "=0.16.6" default-features = false features = [ "r1cs" ] [dependencies.snarkvm-circuit-environment-witness] path = "./witness" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.indexmap] diff --git a/circuit/environment/witness/Cargo.toml b/circuit/environment/witness/Cargo.toml index 5cc96a46ee..58be181598 100644 --- a/circuit/environment/witness/Cargo.toml +++ b/circuit/environment/witness/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment-witness" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "A procedural macro to construct a witness in an environment" license = "Apache-2.0" diff --git a/circuit/network/Cargo.toml b/circuit/network/Cargo.toml index c64a9cb243..313d59d631 100644 --- a/circuit/network/Cargo.toml +++ b/circuit/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-network" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Network circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.5" +version = "=0.16.6" [dev-dependencies.snarkvm-console-types] path = "../../console/types" diff --git a/circuit/program/Cargo.toml b/circuit/program/Cargo.toml index 612553ff24..cd4736db3e 100644 --- a/circuit/program/Cargo.toml +++ b/circuit/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-program" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Program circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,32 +9,32 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-program" path = "../../console/program" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-circuit-account] path = "../account" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.5" +version = "=0.16.6" [dependencies.paste] version = "1.0" diff --git a/circuit/types/Cargo.toml b/circuit/types/Cargo.toml index 019be22e8d..4b13cd4823 100644 --- a/circuit/types/Cargo.toml +++ b/circuit/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Primitive circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -8,35 +8,35 @@ edition = "2021" [dependencies.snarkvm-circuit-environment] path = "../environment" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-address] path = "./address" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-boolean] path = "./boolean" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-field] path = "./field" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-group] path = "./group" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-integers] path = "./integers" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-scalar] path = "./scalar" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-string] path = "./string" -version = "=0.16.5" +version = "=0.16.6" [dev-dependencies.console] package = "snarkvm-console" diff --git a/circuit/types/address/Cargo.toml b/circuit/types/address/Cargo.toml index 1822a1faf6..9a2556eb55 100644 --- a/circuit/types/address/Cargo.toml +++ b/circuit/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-address" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Address circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,28 +9,28 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-address" path = "../../../console/types/address" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-group] path = "../group" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.5" +version = "=0.16.6" [features] default = [ "enable_console" ] diff --git a/circuit/types/boolean/Cargo.toml b/circuit/types/boolean/Cargo.toml index 39f0fff794..f877b09dd1 100644 --- a/circuit/types/boolean/Cargo.toml +++ b/circuit/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-boolean" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Boolean circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -14,12 +14,12 @@ harness = false [dependencies.console] package = "snarkvm-console-types-boolean" path = "../../../console/types/boolean" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.5" +version = "=0.16.6" [dev-dependencies.criterion] version = "0.5" diff --git a/circuit/types/field/Cargo.toml b/circuit/types/field/Cargo.toml index 9241bc5ebf..3a2642b94b 100644 --- a/circuit/types/field/Cargo.toml +++ b/circuit/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-field" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Field circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-field" path = "../../../console/types/field" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.5" +version = "=0.16.6" [features] default = [ "enable_console" ] diff --git a/circuit/types/group/Cargo.toml b/circuit/types/group/Cargo.toml index 836f2ed92d..031e184582 100644 --- a/circuit/types/group/Cargo.toml +++ b/circuit/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-group" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Group circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-group" path = "../../../console/types/group" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.5" +version = "=0.16.6" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/integers/Cargo.toml b/circuit/types/integers/Cargo.toml index 1369f3de47..a6e63d6297 100644 --- a/circuit/types/integers/Cargo.toml +++ b/circuit/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-integers" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Integer circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-integers" path = "../../../console/types/integers" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.5" +version = "=0.16.6" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/scalar/Cargo.toml b/circuit/types/scalar/Cargo.toml index ec835400a9..8af904f1bb 100644 --- a/circuit/types/scalar/Cargo.toml +++ b/circuit/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-scalar" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Scalar circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-scalar" path = "../../../console/types/scalar" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.5" +version = "=0.16.6" [features] default = [ "enable_console" ] diff --git a/circuit/types/string/Cargo.toml b/circuit/types/string/Cargo.toml index 5144f5f94a..112a9e4610 100644 --- a/circuit/types/string/Cargo.toml +++ b/circuit/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-string" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "String circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-string" path = "../../../console/types/string" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-circuit-types-integers] path = "../integers" -version = "=0.16.5" +version = "=0.16.6" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/console/Cargo.toml b/console/Cargo.toml index 1507d2ee8b..11193f0314 100644 --- a/console/Cargo.toml +++ b/console/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Console environment for a decentralized virtual machine" license = "Apache-2.0" @@ -8,32 +8,32 @@ edition = "2021" [dependencies.snarkvm-console-account] path = "./account" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-console-algorithms] path = "./algorithms" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-console-collections] path = "./collections" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-console-network] path = "./network" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-console-program] path = "./program" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-console-types] path = "./types" -version = "=0.16.5" +version = "=0.16.6" optional = true [features] diff --git a/console/account/Cargo.toml b/console/account/Cargo.toml index 3cf67399dc..a97b7167ca 100644 --- a/console/account/Cargo.toml +++ b/console/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-account" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Account operations for a decentralized virtual machine" license = "Apache-2.0" @@ -13,11 +13,11 @@ harness = false [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.5" +version = "=0.16.6" default-features = false features = [ "address", "boolean", "field", "group", "scalar" ] diff --git a/console/algorithms/Cargo.toml b/console/algorithms/Cargo.toml index 3d8fbc6d79..c6e3dcbd71 100644 --- a/console/algorithms/Cargo.toml +++ b/console/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-algorithms" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Console algorithms for a decentralized virtual machine" license = "Apache-2.0" @@ -23,18 +23,18 @@ harness = false [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.5" +version = "=0.16.6" default-features = false features = [ "field", "group", "integers", "scalar" ] [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.5" +version = "=0.16.6" [dependencies.blake2s_simd] version = "1.0" diff --git a/console/collections/Cargo.toml b/console/collections/Cargo.toml index 9fcb849088..daf4de21f1 100644 --- a/console/collections/Cargo.toml +++ b/console/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-collections" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Collections for a decentralized virtual machine" license = "Apache-2.0" @@ -18,11 +18,11 @@ harness = false [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.5" +version = "=0.16.6" default-features = false features = [ "field", "integers" ] diff --git a/console/network/Cargo.toml b/console/network/Cargo.toml index e611efe2d1..5d097f6b10 100644 --- a/console/network/Cargo.toml +++ b/console/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Network console library for a decentralized virtual machine" license = "Apache-2.0" @@ -15,45 +15,45 @@ wasm = [ [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.5" +version = "=0.16.6" default-features = false features = [ "snark" ] [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-network-environment] path = "./environment" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.5" +version = "=0.16.6" default-features = false features = [ "field", "group", "scalar" ] [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.snarkvm-parameters] path = "../../parameters" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.5" +version = "=0.16.6" [dependencies.anyhow] version = "1.0.73" diff --git a/console/network/environment/Cargo.toml b/console/network/environment/Cargo.toml index 0844a65738..665049bc96 100644 --- a/console/network/environment/Cargo.toml +++ b/console/network/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network-environment" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Environment console library for a decentralized virtual machine" license = "Apache-2.0" @@ -8,17 +8,17 @@ edition = "2021" [dependencies.snarkvm-curves] path = "../../../curves" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.snarkvm-fields] path = "../../../fields" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.snarkvm-utilities] path = "../../../utilities" -version = "=0.16.5" +version = "=0.16.6" [dependencies.anyhow] version = "1.0.73" diff --git a/console/program/Cargo.toml b/console/program/Cargo.toml index 9413e5535a..a4cf2efec3 100644 --- a/console/program/Cargo.toml +++ b/console/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-program" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Program operations for a decentralized virtual machine" license = "Apache-2.0" @@ -12,27 +12,27 @@ test = [ ] [dependencies.snarkvm-console-account] path = "../account" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.5" +version = "=0.16.6" [dependencies.enum_index] version = "0.2" diff --git a/console/types/Cargo.toml b/console/types/Cargo.toml index b1adc1f393..c156954dcb 100644 --- a/console/types/Cargo.toml +++ b/console/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Console types for a decentralized virtual machine" license = "Apache-2.0" @@ -8,41 +8,41 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../network/environment" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types-address] path = "./address" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-console-types-boolean] path = "./boolean" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-console-types-field] path = "./field" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-console-types-group] path = "./group" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-console-types-integers] path = "./integers" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-console-types-scalar] path = "./scalar" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-console-types-string] path = "./string" -version = "=0.16.5" +version = "=0.16.6" optional = true [features] diff --git a/console/types/address/Cargo.toml b/console/types/address/Cargo.toml index 791ae4d5bc..6252df5196 100644 --- a/console/types/address/Cargo.toml +++ b/console/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-address" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types-group] path = "../group" -version = "=0.16.5" +version = "=0.16.6" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/boolean/Cargo.toml b/console/types/boolean/Cargo.toml index 54e95da632..c458f1a0ab 100644 --- a/console/types/boolean/Cargo.toml +++ b/console/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-boolean" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,7 +8,7 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.5" +version = "=0.16.6" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/field/Cargo.toml b/console/types/field/Cargo.toml index 2b7700d6bf..3835c1c0ae 100644 --- a/console/types/field/Cargo.toml +++ b/console/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-field" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,11 +8,11 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.5" +version = "=0.16.6" [dependencies.zeroize] version = "1" diff --git a/console/types/group/Cargo.toml b/console/types/group/Cargo.toml index 0a6dc49d1f..11a3531df0 100644 --- a/console/types/group/Cargo.toml +++ b/console/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-group" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.5" +version = "=0.16.6" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/integers/Cargo.toml b/console/types/integers/Cargo.toml index a3361984ae..6c7a8cb911 100644 --- a/console/types/integers/Cargo.toml +++ b/console/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-integers" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.5" +version = "=0.16.6" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/scalar/Cargo.toml b/console/types/scalar/Cargo.toml index 133893e51c..9deb088e73 100644 --- a/console/types/scalar/Cargo.toml +++ b/console/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-scalar" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,15 +8,15 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.5" +version = "=0.16.6" [dependencies.zeroize] version = "1" diff --git a/console/types/string/Cargo.toml b/console/types/string/Cargo.toml index ea5593e97a..fcc90d2bc7 100644 --- a/console/types/string/Cargo.toml +++ b/console/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-string" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-console-types-integers] path = "../integers" -version = "=0.16.5" +version = "=0.16.6" [dev-dependencies.bincode] version = "1.3" diff --git a/curves/Cargo.toml b/curves/Cargo.toml index 84ecbb55c4..454f66a38c 100644 --- a/curves/Cargo.toml +++ b/curves/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-curves" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Curves for a decentralized virtual machine" homepage = "https://aleo.org" @@ -36,12 +36,12 @@ harness = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.rand] diff --git a/fields/Cargo.toml b/fields/Cargo.toml index a2e89b842e..92cc14e921 100644 --- a/fields/Cargo.toml +++ b/fields/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-fields" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Fields for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.aleo-std] diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index 57adb8e2b7..a1f841415f 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "A node ledger for a decentralized virtual machine" homepage = "https://aleo.org" @@ -56,54 +56,54 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "./authority" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "./block" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "./coinbase" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "./committee" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-narwhal] package = "snarkvm-ledger-narwhal" path = "./narwhal" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "./query" -version = "=0.16.5" +version = "=0.16.6" features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "./store" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-test-helpers] package = "snarkvm-ledger-test-helpers" path = "./test-helpers" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.synthesizer] package = "snarkvm-synthesizer" path = "../synthesizer" -version = "=0.16.5" +version = "=0.16.6" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/authority/Cargo.toml b/ledger/authority/Cargo.toml index ce6eb19f00..ecaca7550a 100644 --- a/ledger/authority/Cargo.toml +++ b/ledger/authority/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-authority" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Data structures for a block authority in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-subdag/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.5" +version = "=0.16.6" [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.5" +version = "=0.16.6" [dependencies.anyhow] version = "1" diff --git a/ledger/block/Cargo.toml b/ledger/block/Cargo.toml index 71c42ba694..3865b71e52 100644 --- a/ledger/block/Cargo.toml +++ b/ledger/block/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-block" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "A block for a decentralized virtual machine" homepage = "https://aleo.org" @@ -39,42 +39,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../ledger/coinbase" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../../ledger/committee" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../narwhal/transmission-id" -version = "=0.16.5" +version = "=0.16.6" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.5" +version = "=0.16.6" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.5" +version = "=0.16.6" [dependencies.indexmap] version = "2.0" diff --git a/ledger/coinbase/Cargo.toml b/ledger/coinbase/Cargo.toml index 1460446f63..eadff83dd0 100644 --- a/ledger/coinbase/Cargo.toml +++ b/ledger/coinbase/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-coinbase" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Coinbase puzzle for a decentralized virtual machine" homepage = "https://aleo.org" @@ -50,27 +50,27 @@ wasm = [ [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-synthesizer-snark] path = "../../synthesizer/snark" -version = "=0.16.5" +version = "=0.16.6" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.aleo-std] diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index 946b1c7be4..2d6df01202 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-committee" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "A committee for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,7 +33,7 @@ test-helpers = [ "prop-tests", "rand_distr" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.5" +version = "=0.16.6" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/Cargo.toml b/ledger/narwhal/Cargo.toml index afa0bf5f1a..42f98b1de4 100644 --- a/ledger/narwhal/Cargo.toml +++ b/ledger/narwhal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Data structures for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -64,37 +64,37 @@ transmission-id = [ "narwhal-transmission-id" ] [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "./batch-certificate" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "./batch-header" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "./data" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "./subdag" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.narwhal-transmission] package = "snarkvm-ledger-narwhal-transmission" path = "./transmission" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "./transmission-id" -version = "=0.16.5" +version = "=0.16.6" optional = true [dev-dependencies.snarkvm-ledger-narwhal] diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index dd5433357b..56c613d919 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-header/test-helpers", "time" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.5" +version = "=0.16.6" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.5" +version = "=0.16.6" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.5" +version = "=0.16.6" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/batch-header/Cargo.toml b/ledger/narwhal/batch-header/Cargo.toml index dc961ceed8..738901ffeb 100644 --- a/ledger/narwhal/batch-header/Cargo.toml +++ b/ledger/narwhal/batch-header/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "A batch header for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-transmission-id/test-helpers", "time" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.5" +version = "=0.16.6" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.5" +version = "=0.16.6" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/data/Cargo.toml b/ledger/narwhal/data/Cargo.toml index 38ac80f2ae..da836b541c 100644 --- a/ledger/narwhal/data/Cargo.toml +++ b/ledger/narwhal/data/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-data" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -29,7 +29,7 @@ async = [ "tokio" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.5" +version = "=0.16.6" [dependencies.bytes] version = "1" diff --git a/ledger/narwhal/subdag/Cargo.toml b/ledger/narwhal/subdag/Cargo.toml index 46391b7e83..ee4ed2bbe0 100644 --- a/ledger/narwhal/subdag/Cargo.toml +++ b/ledger/narwhal/subdag/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "A subdag for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-certificate/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.5" +version = "=0.16.6" [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../batch-certificate" -version = "=0.16.5" +version = "=0.16.6" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.5" +version = "=0.16.6" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/transmission-id/Cargo.toml b/ledger/narwhal/transmission-id/Cargo.toml index ae00ee4d14..e811fc29b8 100644 --- a/ledger/narwhal/transmission-id/Cargo.toml +++ b/ledger/narwhal/transmission-id/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "A transmission ID for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.5" +version = "=0.16.6" [dev-dependencies.bincode] version = "1.3" diff --git a/ledger/narwhal/transmission/Cargo.toml b/ledger/narwhal/transmission/Cargo.toml index 687fe08605..0e5c5d5f6a 100644 --- a/ledger/narwhal/transmission/Cargo.toml +++ b/ledger/narwhal/transmission/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "A transmission for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../block" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "../data" -version = "=0.16.5" +version = "=0.16.6" [dependencies.bytes] version = "1" diff --git a/ledger/query/Cargo.toml b/ledger/query/Cargo.toml index f5820502ca..bcdac183df 100644 --- a/ledger/query/Cargo.toml +++ b/ledger/query/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-query" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "A query for a decentralized virtual machine" homepage = "https://aleo.org" @@ -30,18 +30,18 @@ query = [ "ledger-store", "synthesizer-program", "ureq" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.async-trait] diff --git a/ledger/store/Cargo.toml b/ledger/store/Cargo.toml index 31e9f3a3d0..882af3fb6e 100644 --- a/ledger/store/Cargo.toml +++ b/ledger/store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-store" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "A data store for a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,42 +32,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../coinbase" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../committee" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../narwhal/batch-certificate" -version = "=0.16.5" +version = "=0.16.6" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.5" +version = "=0.16.6" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.5" +version = "=0.16.6" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/test-helpers/Cargo.toml b/ledger/test-helpers/Cargo.toml index 453af9e379..6e913c66cb 100644 --- a/ledger/test-helpers/Cargo.toml +++ b/ledger/test-helpers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-test-helpers" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Test helpers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -19,39 +19,39 @@ edition = "2021" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.5" +version = "=0.16.6" [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../query" -version = "=0.16.5" +version = "=0.16.6" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.5" +version = "=0.16.6" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.5" +version = "=0.16.6" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "../../synthesizer/process" -version = "=0.16.5" +version = "=0.16.6" [dependencies.once_cell] version = "1.18" diff --git a/parameters/Cargo.toml b/parameters/Cargo.toml index 6693e58680..d621d201e3 100644 --- a/parameters/Cargo.toml +++ b/parameters/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-parameters" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Parameters for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "encoding", "js-sys", "web-sys" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.5" +version = "=0.16.6" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/Cargo.toml b/synthesizer/Cargo.toml index 0c611cc031..60c3ac2930 100644 --- a/synthesizer/Cargo.toml +++ b/synthesizer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Synthesizer for a decentralized virtual machine" homepage = "https://aleo.org" @@ -68,61 +68,61 @@ harness = false [dependencies.algorithms] package = "snarkvm-algorithms" path = "../algorithms" -version = "=0.16.5" +version = "=0.16.6" [dependencies.circuit] package = "snarkvm-circuit" path = "../circuit" -version = "=0.16.5" +version = "=0.16.6" [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../ledger/block" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../ledger/coinbase" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../ledger/committee" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../ledger/query" -version = "=0.16.5" +version = "=0.16.6" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../ledger/store" -version = "=0.16.5" +version = "=0.16.6" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "./process" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "./program" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "./snark" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.aleo-std] diff --git a/synthesizer/process/Cargo.toml b/synthesizer/process/Cargo.toml index 670fccd178..65d5efb813 100644 --- a/synthesizer/process/Cargo.toml +++ b/synthesizer/process/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-process" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "A process for a decentralized virtual machine" homepage = "https://aleo.org" @@ -48,40 +48,40 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.5" +version = "=0.16.6" default-features = false features = [ "network", "program", "types" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../ledger/block" -version = "=0.16.5" +version = "=0.16.6" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../../ledger/query" -version = "=0.16.5" +version = "=0.16.6" default-features = false [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../../ledger/store" -version = "=0.16.5" +version = "=0.16.6" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.5" +version = "=0.16.6" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.5" +version = "=0.16.6" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/program/Cargo.toml b/synthesizer/program/Cargo.toml index 4d92256002..f3f046ade1 100644 --- a/synthesizer/program/Cargo.toml +++ b/synthesizer/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-program" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Program for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "console/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.5" +version = "=0.16.6" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.5" +version = "=0.16.6" default-features = false features = [ "account", "network", "program", "types" ] diff --git a/synthesizer/snark/Cargo.toml b/synthesizer/snark/Cargo.toml index 7ed5cdd480..42f866a84c 100644 --- a/synthesizer/snark/Cargo.toml +++ b/synthesizer/snark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-snark" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "SNARK wrappers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,18 +33,18 @@ wasm = [ "console/wasm", "snarkvm-algorithms/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.5" +version = "=0.16.6" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.5" +version = "=0.16.6" default-features = false features = [ "network" ] [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.5" +version = "=0.16.6" [dependencies.bincode] version = "1" diff --git a/utilities/Cargo.toml b/utilities/Cargo.toml index 208c90eb68..b1ca174233 100644 --- a/utilities/Cargo.toml +++ b/utilities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Utilities for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities-derives] path = "./derives" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.aleo-std] diff --git a/utilities/derives/Cargo.toml b/utilities/derives/Cargo.toml index 89a3159471..3950775d69 100644 --- a/utilities/derives/Cargo.toml +++ b/utilities/derives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities-derives" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "Canonical serialization for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index c5c844d547..7e5c58d4a8 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-wasm" -version = "0.16.5" +version = "0.16.6" authors = [ "The Aleo Team " ] description = "WASM for a decentralized virtual machine" homepage = "https://aleo.org" @@ -28,30 +28,30 @@ crate-type = [ "cdylib", "rlib" ] [dependencies.snarkvm-console] path = "../console" -version = "=0.16.5" +version = "=0.16.6" features = [ "wasm" ] optional = true [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.5" +version = "=0.16.6" optional = true [dependencies.snarkvm-synthesizer] path = "../synthesizer" -version = "=0.16.5" +version = "=0.16.6" default-features = false features = [ "wasm" ] optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.5" +version = "=0.16.6" features = [ "wasm" ] optional = true From 8ace3471176fc232ada1be3b75576232384d18a9 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Wed, 25 Oct 2023 12:50:18 +0200 Subject: [PATCH 041/339] tests: remove flakiness caused by subslice assertions Signed-off-by: ljedrz --- console/program/src/data/ciphertext/bytes.rs | 1 - console/program/src/data/future/bytes.rs | 1 - console/program/src/data/identifier/bytes.rs | 1 - console/program/src/data/literal/bytes.rs | 2 -- console/program/src/data/plaintext/bytes.rs | 5 ----- console/program/src/data/record/bytes.rs | 1 - console/program/src/data/value/bytes.rs | 2 -- console/program/src/request/bytes.rs | 4 ---- console/program/src/state_path/header_leaf/bytes.rs | 4 ---- console/program/src/state_path/transaction_leaf/bytes.rs | 4 ---- console/program/src/state_path/transition_leaf/bytes.rs | 4 ---- console/types/string/src/bytes.rs | 1 - ledger/authority/src/bytes.rs | 5 +---- ledger/block/src/bytes.rs | 2 -- ledger/block/src/ratifications/bytes.rs | 4 ---- ledger/block/src/ratify/bytes.rs | 4 ---- ledger/block/src/transaction/bytes.rs | 4 ---- ledger/block/src/transaction/deployment/bytes.rs | 4 ---- ledger/block/src/transaction/execution/bytes.rs | 4 ---- ledger/block/src/transaction/fee/bytes.rs | 5 ----- ledger/block/src/transactions/bytes.rs | 4 ---- ledger/block/src/transactions/confirmed/bytes.rs | 4 ---- ledger/block/src/transactions/rejected/bytes.rs | 4 ---- ledger/block/src/transition/bytes.rs | 4 ---- ledger/block/src/transition/input/bytes.rs | 4 ---- ledger/block/src/transition/output/bytes.rs | 4 ---- ledger/committee/src/bytes.rs | 4 ---- ledger/narwhal/batch-certificate/src/bytes.rs | 4 ---- ledger/narwhal/batch-header/src/bytes.rs | 4 ---- ledger/narwhal/subdag/src/bytes.rs | 4 ---- ledger/narwhal/transmission/src/bytes.rs | 4 ---- synthesizer/process/src/stack/authorization/bytes.rs | 4 ---- synthesizer/program/src/logic/instruction/operation/call.rs | 1 - synthesizer/snark/src/certificate/bytes.rs | 4 ---- synthesizer/snark/src/proof/bytes.rs | 4 ---- 35 files changed, 1 insertion(+), 118 deletions(-) diff --git a/console/program/src/data/ciphertext/bytes.rs b/console/program/src/data/ciphertext/bytes.rs index 212a6e84d5..d983d9bb71 100644 --- a/console/program/src/data/ciphertext/bytes.rs +++ b/console/program/src/data/ciphertext/bytes.rs @@ -66,7 +66,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Ciphertext::read_le(&expected_bytes[..])?); - // assert!(Ciphertext::::read_le(&expected_bytes[1..]).is_err()); } Ok(()) } diff --git a/console/program/src/data/future/bytes.rs b/console/program/src/data/future/bytes.rs index f4e492bdd8..95878055f1 100644 --- a/console/program/src/data/future/bytes.rs +++ b/console/program/src/data/future/bytes.rs @@ -84,7 +84,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Future::read_le(&expected_bytes[..])?); - assert!(Future::::read_le(&expected_bytes[1..]).is_err()); Ok(()) } diff --git a/console/program/src/data/identifier/bytes.rs b/console/program/src/data/identifier/bytes.rs index e90d7fbae3..7342dd07ab 100644 --- a/console/program/src/data/identifier/bytes.rs +++ b/console/program/src/data/identifier/bytes.rs @@ -72,7 +72,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Identifier::read_le(&expected_bytes[..])?); - assert!(Identifier::::read_le(&expected_bytes[1..]).is_err()); } Ok(()) } diff --git a/console/program/src/data/literal/bytes.rs b/console/program/src/data/literal/bytes.rs index d52f43045b..1f77bf3430 100644 --- a/console/program/src/data/literal/bytes.rs +++ b/console/program/src/data/literal/bytes.rs @@ -132,8 +132,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Literal::read_le(&expected_bytes[..])?); - assert!(Literal::::read_le(&expected_bytes[1..]).is_err()); - // assert!(Literal::::read_le(&expected_bytes[2..]).is_err()); Ok(()) } diff --git a/console/program/src/data/plaintext/bytes.rs b/console/program/src/data/plaintext/bytes.rs index a6c4867bc4..99cdd82ed4 100644 --- a/console/program/src/data/plaintext/bytes.rs +++ b/console/program/src/data/plaintext/bytes.rs @@ -131,9 +131,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Plaintext::read_le(&expected_bytes[..])?); - // assert!(Plaintext::::read_le(&expected_bytes[1..]).is_err()); - // assert!(Plaintext::::read_le(&expected_bytes[2..]).is_err()); - // assert!(Plaintext::::read_le(&expected_bytes[3..]).is_err()); Ok(()) } @@ -225,7 +222,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Plaintext::read_le(&expected_bytes[..])?); - assert!(Plaintext::::read_le(&expected_bytes[1..]).is_err()); // Check the array manually. let expected = Plaintext::::from_str("[ 1u8, 2u8, 3u8, 4u8, 5u8, 6u8, 7u8, 8u8, 9u8, 10u8 ]")?; @@ -233,7 +229,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Plaintext::read_le(&expected_bytes[..])?); - assert!(Plaintext::::read_le(&expected_bytes[1..]).is_err()); Ok(()) } diff --git a/console/program/src/data/record/bytes.rs b/console/program/src/data/record/bytes.rs index 6c74f0b1ad..a787040499 100644 --- a/console/program/src/data/record/bytes.rs +++ b/console/program/src/data/record/bytes.rs @@ -95,7 +95,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Record::read_le(&expected_bytes[..])?); - assert!(Record::>::read_le(&expected_bytes[1..]).is_err()); Ok(()) } } diff --git a/console/program/src/data/value/bytes.rs b/console/program/src/data/value/bytes.rs index 8bfa9fcade..50e8567f05 100644 --- a/console/program/src/data/value/bytes.rs +++ b/console/program/src/data/value/bytes.rs @@ -67,7 +67,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Value::read_le(&expected_bytes[..])?); - assert!(Value::::read_le(&expected_bytes[1..]).is_err()); Ok(()) } @@ -81,7 +80,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Value::read_le(&expected_bytes[..])?); - assert!(Value::::read_le(&expected_bytes[1..]).is_err()); Ok(()) } } diff --git a/console/program/src/request/bytes.rs b/console/program/src/request/bytes.rs index 761b6b1340..ec664b9c48 100644 --- a/console/program/src/request/bytes.rs +++ b/console/program/src/request/bytes.rs @@ -100,9 +100,6 @@ impl ToBytes for Request { #[cfg(test)] mod tests { use super::*; - use snarkvm_console_network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() { @@ -112,7 +109,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le().unwrap(); assert_eq!(expected, Request::read_le(&expected_bytes[..]).unwrap()); - assert!(Request::::read_le(&expected_bytes[1..]).is_err()); } } } diff --git a/console/program/src/state_path/header_leaf/bytes.rs b/console/program/src/state_path/header_leaf/bytes.rs index cde4608989..16f2b03bca 100644 --- a/console/program/src/state_path/header_leaf/bytes.rs +++ b/console/program/src/state_path/header_leaf/bytes.rs @@ -39,9 +39,6 @@ impl ToBytes for HeaderLeaf { #[cfg(test)] mod tests { use super::*; - use snarkvm_console_network::Testnet3; - - type CurrentNetwork = Testnet3; const ITERATIONS: u64 = 1000; @@ -56,7 +53,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, HeaderLeaf::read_le(&expected_bytes[..])?); - assert!(HeaderLeaf::::read_le(&expected_bytes[1..]).is_err()); } Ok(()) } diff --git a/console/program/src/state_path/transaction_leaf/bytes.rs b/console/program/src/state_path/transaction_leaf/bytes.rs index 602c66689c..db10cf1f90 100644 --- a/console/program/src/state_path/transaction_leaf/bytes.rs +++ b/console/program/src/state_path/transaction_leaf/bytes.rs @@ -43,9 +43,6 @@ impl ToBytes for TransactionLeaf { #[cfg(test)] mod tests { use super::*; - use snarkvm_console_network::Testnet3; - - type CurrentNetwork = Testnet3; const ITERATIONS: u64 = 1000; @@ -60,7 +57,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, TransactionLeaf::read_le(&expected_bytes[..])?); - assert!(TransactionLeaf::::read_le(&expected_bytes[1..]).is_err()); } Ok(()) } diff --git a/console/program/src/state_path/transition_leaf/bytes.rs b/console/program/src/state_path/transition_leaf/bytes.rs index 90a6ac9beb..b06f9def4e 100644 --- a/console/program/src/state_path/transition_leaf/bytes.rs +++ b/console/program/src/state_path/transition_leaf/bytes.rs @@ -51,9 +51,6 @@ impl ToBytes for TransitionLeaf { #[cfg(test)] mod tests { use super::*; - use snarkvm_console_network::Testnet3; - - type CurrentNetwork = Testnet3; const ITERATIONS: u64 = 1000; @@ -68,7 +65,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, TransitionLeaf::read_le(&expected_bytes[..])?); - assert!(TransitionLeaf::::read_le(&expected_bytes[1..]).is_err()); } Ok(()) } diff --git a/console/types/string/src/bytes.rs b/console/types/string/src/bytes.rs index 137dd5f0ac..46fd7fcf33 100644 --- a/console/types/string/src/bytes.rs +++ b/console/types/string/src/bytes.rs @@ -67,7 +67,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, StringType::read_le(&expected_bytes[..])?); - assert!(StringType::::read_le(&expected_bytes[1..]).is_err()); } Ok(()) } diff --git a/ledger/authority/src/bytes.rs b/ledger/authority/src/bytes.rs index 45ccbe65b4..1d710be1c6 100644 --- a/ledger/authority/src/bytes.rs +++ b/ledger/authority/src/bytes.rs @@ -52,9 +52,7 @@ impl ToBytes for Authority { #[cfg(test)] mod tests { use super::*; - use console::{network::Testnet3, prelude::TestRng}; - - type CurrentNetwork = Testnet3; + use console::prelude::TestRng; #[test] fn test_bytes() { @@ -64,7 +62,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le().unwrap(); assert_eq!(expected, Authority::read_le(&expected_bytes[..]).unwrap()); - assert!(Authority::::read_le(&expected_bytes[1..]).is_err()); } } } diff --git a/ledger/block/src/bytes.rs b/ledger/block/src/bytes.rs index 7c72e849f3..448c24cc3d 100644 --- a/ledger/block/src/bytes.rs +++ b/ledger/block/src/bytes.rs @@ -134,7 +134,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Block::read_le(&expected_bytes[..])?); - assert!(Block::::read_le(&expected_bytes[1..]).is_err()); } Ok(()) } @@ -147,7 +146,6 @@ mod tests { // Check the byte representation. let expected_bytes = genesis_block.to_bytes_le()?; assert_eq!(genesis_block, Block::read_le(&expected_bytes[..])?); - assert!(Block::::read_le(&expected_bytes[1..]).is_err()); Ok(()) } diff --git a/ledger/block/src/ratifications/bytes.rs b/ledger/block/src/ratifications/bytes.rs index 0db7fd3311..aa8d6f4a9a 100644 --- a/ledger/block/src/ratifications/bytes.rs +++ b/ledger/block/src/ratifications/bytes.rs @@ -53,9 +53,6 @@ impl ToBytes for Ratifications { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; const ITERATIONS: u32 = 100; @@ -68,7 +65,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Ratifications::read_le(&expected_bytes[..])?); - assert!(Ratifications::::read_le(&expected_bytes[1..]).is_err()); } Ok(()) } diff --git a/ledger/block/src/ratify/bytes.rs b/ledger/block/src/ratify/bytes.rs index 2cd5cad850..bab8503907 100644 --- a/ledger/block/src/ratify/bytes.rs +++ b/ledger/block/src/ratify/bytes.rs @@ -94,9 +94,6 @@ impl ToBytes for Ratify { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() { @@ -106,7 +103,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le().unwrap(); assert_eq!(expected, Ratify::read_le(&expected_bytes[..]).unwrap()); - assert!(Ratify::::read_le(&expected_bytes[1..]).is_err()); } } } diff --git a/ledger/block/src/transaction/bytes.rs b/ledger/block/src/transaction/bytes.rs index ee6c194dcc..299c27be99 100644 --- a/ledger/block/src/transaction/bytes.rs +++ b/ledger/block/src/transaction/bytes.rs @@ -139,9 +139,6 @@ impl ToBytes for Transaction { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() -> Result<()> { @@ -158,7 +155,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Transaction::read_le(&expected_bytes[..])?); - assert!(Transaction::::read_le(&expected_bytes[1..]).is_err()); } Ok(()) } diff --git a/ledger/block/src/transaction/deployment/bytes.rs b/ledger/block/src/transaction/deployment/bytes.rs index 09a8e90966..e8e97757a6 100644 --- a/ledger/block/src/transaction/deployment/bytes.rs +++ b/ledger/block/src/transaction/deployment/bytes.rs @@ -76,9 +76,6 @@ impl ToBytes for Deployment { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() -> Result<()> { @@ -90,7 +87,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Deployment::read_le(&expected_bytes[..])?); - assert!(Deployment::::read_le(&expected_bytes[1..]).is_err()); Ok(()) } } diff --git a/ledger/block/src/transaction/execution/bytes.rs b/ledger/block/src/transaction/execution/bytes.rs index 417530360b..c10a8c8fda 100644 --- a/ledger/block/src/transaction/execution/bytes.rs +++ b/ledger/block/src/transaction/execution/bytes.rs @@ -75,9 +75,6 @@ impl ToBytes for Execution { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() -> Result<()> { @@ -89,7 +86,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Execution::read_le(&expected_bytes[..])?); - assert!(Execution::::read_le(&expected_bytes[1..]).is_err()); Ok(()) } } diff --git a/ledger/block/src/transaction/fee/bytes.rs b/ledger/block/src/transaction/fee/bytes.rs index 42443a9981..1f156f622f 100644 --- a/ledger/block/src/transaction/fee/bytes.rs +++ b/ledger/block/src/transaction/fee/bytes.rs @@ -64,9 +64,6 @@ impl ToBytes for Fee { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() -> Result<()> { @@ -78,7 +75,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Fee::read_le(&expected_bytes[..])?); - assert!(Fee::::read_le(&expected_bytes[1..]).is_err()); // Construct a new public fee. let expected = crate::transaction::fee::test_helpers::sample_fee_public_hardcoded(rng); @@ -86,7 +82,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Fee::read_le(&expected_bytes[..])?); - assert!(Fee::::read_le(&expected_bytes[1..]).is_err()); Ok(()) } diff --git a/ledger/block/src/transactions/bytes.rs b/ledger/block/src/transactions/bytes.rs index 99df0668db..d76e8625ba 100644 --- a/ledger/block/src/transactions/bytes.rs +++ b/ledger/block/src/transactions/bytes.rs @@ -53,9 +53,6 @@ impl ToBytes for Transactions { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() -> Result<()> { @@ -65,7 +62,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Transactions::read_le(&expected_bytes[..])?); - assert!(Transactions::::read_le(&expected_bytes[1..]).is_err()); } Ok(()) } diff --git a/ledger/block/src/transactions/confirmed/bytes.rs b/ledger/block/src/transactions/confirmed/bytes.rs index ff7ceb4772..16f929215c 100644 --- a/ledger/block/src/transactions/confirmed/bytes.rs +++ b/ledger/block/src/transactions/confirmed/bytes.rs @@ -143,9 +143,6 @@ impl ToBytes for ConfirmedTransaction { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() { @@ -153,7 +150,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le().unwrap(); assert_eq!(expected, ConfirmedTransaction::read_le(&expected_bytes[..]).unwrap()); - assert!(ConfirmedTransaction::::read_le(&expected_bytes[1..]).is_err()); } } } diff --git a/ledger/block/src/transactions/rejected/bytes.rs b/ledger/block/src/transactions/rejected/bytes.rs index 402b2daeff..c5cff5fe43 100644 --- a/ledger/block/src/transactions/rejected/bytes.rs +++ b/ledger/block/src/transactions/rejected/bytes.rs @@ -63,9 +63,6 @@ impl ToBytes for Rejected { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() { @@ -73,7 +70,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le().unwrap(); assert_eq!(expected, Rejected::read_le(&expected_bytes[..]).unwrap()); - assert!(Rejected::::read_le(&expected_bytes[1..]).is_err()); } } } diff --git a/ledger/block/src/transition/bytes.rs b/ledger/block/src/transition/bytes.rs index e59403fead..dacc875df8 100644 --- a/ledger/block/src/transition/bytes.rs +++ b/ledger/block/src/transition/bytes.rs @@ -98,9 +98,6 @@ impl ToBytes for Transition { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() -> Result<()> { @@ -112,7 +109,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Transition::read_le(&expected_bytes[..])?); - assert!(Transition::::read_le(&expected_bytes[1..]).is_err()); Ok(()) } diff --git a/ledger/block/src/transition/input/bytes.rs b/ledger/block/src/transition/input/bytes.rs index e5d53ba277..faceae3a05 100644 --- a/ledger/block/src/transition/input/bytes.rs +++ b/ledger/block/src/transition/input/bytes.rs @@ -115,9 +115,6 @@ impl ToBytes for Input { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() { @@ -125,7 +122,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le().unwrap(); assert_eq!(expected, Input::read_le(&expected_bytes[..]).unwrap()); - assert!(Input::::read_le(&expected_bytes[1..]).is_err()); } } } diff --git a/ledger/block/src/transition/output/bytes.rs b/ledger/block/src/transition/output/bytes.rs index 0ef6003f7e..867b6600d6 100644 --- a/ledger/block/src/transition/output/bytes.rs +++ b/ledger/block/src/transition/output/bytes.rs @@ -148,9 +148,6 @@ impl ToBytes for Output { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() { @@ -158,7 +155,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le().unwrap(); assert_eq!(expected, Output::read_le(&expected_bytes[..]).unwrap()); - assert!(Output::::read_le(&expected_bytes[1..]).is_err()); } } } diff --git a/ledger/committee/src/bytes.rs b/ledger/committee/src/bytes.rs index 9ae159af1f..d55a80ab41 100644 --- a/ledger/committee/src/bytes.rs +++ b/ledger/committee/src/bytes.rs @@ -78,9 +78,6 @@ impl ToBytes for Committee { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() { @@ -90,7 +87,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le().unwrap(); assert_eq!(expected, Committee::read_le(&expected_bytes[..]).unwrap()); - assert!(Committee::::read_le(&expected_bytes[1..]).is_err()); } } } diff --git a/ledger/narwhal/batch-certificate/src/bytes.rs b/ledger/narwhal/batch-certificate/src/bytes.rs index d7dbd25dc2..aa204b010c 100644 --- a/ledger/narwhal/batch-certificate/src/bytes.rs +++ b/ledger/narwhal/batch-certificate/src/bytes.rs @@ -70,9 +70,6 @@ impl ToBytes for BatchCertificate { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() { @@ -82,7 +79,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le().unwrap(); assert_eq!(expected, BatchCertificate::read_le(&expected_bytes[..]).unwrap()); - assert!(BatchCertificate::::read_le(&expected_bytes[1..]).is_err()); } } } diff --git a/ledger/narwhal/batch-header/src/bytes.rs b/ledger/narwhal/batch-header/src/bytes.rs index 30f7a2cb83..f564e58c19 100644 --- a/ledger/narwhal/batch-header/src/bytes.rs +++ b/ledger/narwhal/batch-header/src/bytes.rs @@ -101,9 +101,6 @@ impl ToBytes for BatchHeader { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() { @@ -113,7 +110,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le().unwrap(); assert_eq!(expected, BatchHeader::read_le(&expected_bytes[..]).unwrap()); - assert!(BatchHeader::::read_le(&expected_bytes[1..]).is_err()); } } } diff --git a/ledger/narwhal/subdag/src/bytes.rs b/ledger/narwhal/subdag/src/bytes.rs index a5cc0e5dc9..c5435663e0 100644 --- a/ledger/narwhal/subdag/src/bytes.rs +++ b/ledger/narwhal/subdag/src/bytes.rs @@ -73,9 +73,6 @@ impl ToBytes for Subdag { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() { @@ -85,7 +82,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le().unwrap(); assert_eq!(expected, Subdag::read_le(&expected_bytes[..]).unwrap()); - assert!(Subdag::::read_le(&expected_bytes[1..]).is_err()); } } } diff --git a/ledger/narwhal/transmission/src/bytes.rs b/ledger/narwhal/transmission/src/bytes.rs index f7349fbac3..7d06ef6077 100644 --- a/ledger/narwhal/transmission/src/bytes.rs +++ b/ledger/narwhal/transmission/src/bytes.rs @@ -59,9 +59,6 @@ impl ToBytes for Transmission { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() { @@ -71,7 +68,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le().unwrap(); assert_eq!(expected, Transmission::read_le(&expected_bytes[..]).unwrap()); - assert!(Transmission::::read_le(&expected_bytes[1..]).is_err()); } } } diff --git a/synthesizer/process/src/stack/authorization/bytes.rs b/synthesizer/process/src/stack/authorization/bytes.rs index f2aa2ee130..d9caf4dfea 100644 --- a/synthesizer/process/src/stack/authorization/bytes.rs +++ b/synthesizer/process/src/stack/authorization/bytes.rs @@ -71,9 +71,6 @@ impl ToBytes for Authorization { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() -> Result<()> { @@ -85,7 +82,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Authorization::read_le(&expected_bytes[..])?); - assert!(Authorization::::read_le(&expected_bytes[1..]).is_err()); Ok(()) } } diff --git a/synthesizer/program/src/logic/instruction/operation/call.rs b/synthesizer/program/src/logic/instruction/operation/call.rs index aa489f5ea8..12cc42168d 100644 --- a/synthesizer/program/src/logic/instruction/operation/call.rs +++ b/synthesizer/program/src/logic/instruction/operation/call.rs @@ -544,7 +544,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le().unwrap(); assert_eq!(expected, Call::read_le(&expected_bytes[..]).unwrap()); - assert!(Call::::read_le(&expected_bytes[1..]).is_err()); } } } diff --git a/synthesizer/snark/src/certificate/bytes.rs b/synthesizer/snark/src/certificate/bytes.rs index 3d21b0ad83..df0ebfecef 100644 --- a/synthesizer/snark/src/certificate/bytes.rs +++ b/synthesizer/snark/src/certificate/bytes.rs @@ -43,9 +43,6 @@ impl ToBytes for Certificate { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() -> Result<()> { @@ -55,7 +52,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Certificate::read_le(&expected_bytes[..])?); - assert!(Certificate::::read_le(&expected_bytes[1..]).is_err()); Ok(()) } diff --git a/synthesizer/snark/src/proof/bytes.rs b/synthesizer/snark/src/proof/bytes.rs index 88bc0f922a..e343178603 100644 --- a/synthesizer/snark/src/proof/bytes.rs +++ b/synthesizer/snark/src/proof/bytes.rs @@ -43,9 +43,6 @@ impl ToBytes for Proof { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() -> Result<()> { @@ -55,7 +52,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le()?; assert_eq!(expected, Proof::read_le(&expected_bytes[..])?); - assert!(Proof::::read_le(&expected_bytes[1..]).is_err()); Ok(()) } From 31661bd3047f2820a2c49d074b18349f3e70fec7 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Fri, 27 Oct 2023 10:24:47 +0200 Subject: [PATCH 042/339] tests: remove confirmed flakiness caused by subslice assertions Signed-off-by: ljedrz --- ledger/narwhal/transmission-id/src/bytes.rs | 4 ---- synthesizer/program/src/logic/finalize_operation/bytes.rs | 4 ---- 2 files changed, 8 deletions(-) diff --git a/ledger/narwhal/transmission-id/src/bytes.rs b/ledger/narwhal/transmission-id/src/bytes.rs index ed46201b1f..a8a49a3d7b 100644 --- a/ledger/narwhal/transmission-id/src/bytes.rs +++ b/ledger/narwhal/transmission-id/src/bytes.rs @@ -50,9 +50,6 @@ impl ToBytes for TransmissionID { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() { @@ -62,7 +59,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le().unwrap(); assert_eq!(expected, TransmissionID::read_le(&expected_bytes[..]).unwrap()); - assert!(TransmissionID::::read_le(&expected_bytes[1..]).is_err()); } } } diff --git a/synthesizer/program/src/logic/finalize_operation/bytes.rs b/synthesizer/program/src/logic/finalize_operation/bytes.rs index 907fa3d750..a88e65a10c 100644 --- a/synthesizer/program/src/logic/finalize_operation/bytes.rs +++ b/synthesizer/program/src/logic/finalize_operation/bytes.rs @@ -134,9 +134,6 @@ impl ToBytes for FinalizeOperation { #[cfg(test)] mod tests { use super::*; - use console::network::Testnet3; - - type CurrentNetwork = Testnet3; #[test] fn test_bytes() { @@ -144,7 +141,6 @@ mod tests { // Check the byte representation. let expected_bytes = expected.to_bytes_le().unwrap(); assert_eq!(expected, FinalizeOperation::read_le(&expected_bytes[..]).unwrap()); - assert!(FinalizeOperation::::read_le(&expected_bytes[1..]).is_err()); } } } From e6b0021128cfd15c3212e894c9c7374210f0d867 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Thu, 26 Oct 2023 13:59:18 +0200 Subject: [PATCH 043/339] perf: reduce the size of Variable Signed-off-by: ljedrz --- circuit/environment/src/helpers/assignment.rs | 10 +++++-- circuit/environment/src/helpers/converter.rs | 18 ++++++++---- .../src/helpers/linear_combination.rs | 2 +- circuit/environment/src/helpers/r1cs.rs | 6 ++-- circuit/environment/src/helpers/variable.rs | 28 +++++++++++++------ circuit/types/boolean/src/not.rs | 2 +- 6 files changed, 44 insertions(+), 22 deletions(-) diff --git a/circuit/environment/src/helpers/assignment.rs b/circuit/environment/src/helpers/assignment.rs index ec69502eec..0615dc95dc 100644 --- a/circuit/environment/src/helpers/assignment.rs +++ b/circuit/environment/src/helpers/assignment.rs @@ -29,8 +29,14 @@ impl From<&crate::Variable> for AssignmentVariable { fn from(variable: &crate::Variable) -> Self { match variable { crate::Variable::Constant(value) => Self::Constant(**value), - crate::Variable::Public(index, _) => Self::Public(*index), - crate::Variable::Private(index, _) => Self::Private(*index), + crate::Variable::Public(index_value) => { + let (index, _value) = index_value.as_ref(); + Self::Public(*index) + } + crate::Variable::Private(index_value) => { + let (index, _value) = index_value.as_ref(); + Self::Private(*index) + } } } } diff --git a/circuit/environment/src/helpers/converter.rs b/circuit/environment/src/helpers/converter.rs index 30e75b8601..665f67974e 100644 --- a/circuit/environment/src/helpers/converter.rs +++ b/circuit/environment/src/helpers/converter.rs @@ -50,13 +50,15 @@ impl R1CS { // Allocate the public variables. for (i, public) in self.to_public_variables().iter().enumerate() { match public { - Variable::Public(index, value) => { + Variable::Public(index_value) => { + let (index, value) = index_value.as_ref(); + assert_eq!( i as u64, *index, "Public variables in first system must be processed in lexicographic order" ); - let gadget = cs.alloc_input(|| format!("Public {i}"), || Ok(**value))?; + let gadget = cs.alloc_input(|| format!("Public {i}"), || Ok(*value))?; assert_eq!( snarkvm_algorithms::r1cs::Index::Public((index + 1) as usize), @@ -75,13 +77,15 @@ impl R1CS { // Allocate the private variables. for (i, private) in self.to_private_variables().iter().enumerate() { match private { - Variable::Private(index, value) => { + Variable::Private(index_value) => { + let (index, value) = index_value.as_ref(); + assert_eq!( i as u64, *index, "Private variables in first system must be processed in lexicographic order" ); - let gadget = cs.alloc(|| format!("Private {i}"), || Ok(**value))?; + let gadget = cs.alloc(|| format!("Private {i}"), || Ok(*value))?; assert_eq!( snarkvm_algorithms::r1cs::Index::Private(i), @@ -113,7 +117,8 @@ impl R1CS { "Failed during constraint translation. The first system by definition cannot have constant variables in the terms" ) } - Variable::Public(index, _) => { + Variable::Public(index_value) => { + let (index, _value) = index_value.as_ref(); let gadget = converter.public.get(index).unwrap(); assert_eq!( snarkvm_algorithms::r1cs::Index::Public((index + 1) as usize), @@ -122,7 +127,8 @@ impl R1CS { ); linear_combination += (*coefficient, *gadget); } - Variable::Private(index, _) => { + Variable::Private(index_value) => { + let (index, _value) = index_value.as_ref(); let gadget = converter.private.get(index).unwrap(); assert_eq!( snarkvm_algorithms::r1cs::Index::Private(*index as usize), diff --git a/circuit/environment/src/helpers/linear_combination.rs b/circuit/environment/src/helpers/linear_combination.rs index 27f23a7513..94b7b2eca2 100644 --- a/circuit/environment/src/helpers/linear_combination.rs +++ b/circuit/environment/src/helpers/linear_combination.rs @@ -549,7 +549,7 @@ mod tests { let two = one + one; let four = two + two; - let start = LinearCombination::from(Variable::Public(1, Rc::new(one))); + let start = LinearCombination::from(Variable::Public(Rc::new((1, one)))); assert!(!start.is_constant()); assert_eq!(one, start.value()); diff --git a/circuit/environment/src/helpers/r1cs.rs b/circuit/environment/src/helpers/r1cs.rs index 7dc324b14a..1c033986ae 100644 --- a/circuit/environment/src/helpers/r1cs.rs +++ b/circuit/environment/src/helpers/r1cs.rs @@ -37,7 +37,7 @@ impl R1CS { pub(crate) fn new() -> Self { Self { constants: Default::default(), - public: vec![Variable::Public(0u64, Rc::new(F::one()))], + public: vec![Variable::Public(Rc::new((0u64, F::one())))], private: Default::default(), constraints: Default::default(), counter: Default::default(), @@ -65,7 +65,7 @@ impl R1CS { /// Returns a new public variable with the given value and scope. pub(crate) fn new_public(&mut self, value: F) -> Variable { - let variable = Variable::Public(self.public.len() as u64, Rc::new(value)); + let variable = Variable::Public(Rc::new((self.public.len() as u64, value))); self.public.push(variable.clone()); self.counter.increment_public(); variable @@ -73,7 +73,7 @@ impl R1CS { /// Returns a new private variable with the given value and scope. pub(crate) fn new_private(&mut self, value: F) -> Variable { - let variable = Variable::Private(self.private.len() as u64, Rc::new(value)); + let variable = Variable::Private(Rc::new((self.private.len() as u64, value))); self.private.push(variable.clone()); self.counter.increment_private(); variable diff --git a/circuit/environment/src/helpers/variable.rs b/circuit/environment/src/helpers/variable.rs index 6b130303a7..6dd7012af4 100644 --- a/circuit/environment/src/helpers/variable.rs +++ b/circuit/environment/src/helpers/variable.rs @@ -27,8 +27,8 @@ pub type Index = u64; #[derive(Clone, PartialEq, Eq, Hash)] pub enum Variable { Constant(Rc), - Public(Index, Rc), - Private(Index, Rc), + Public(Rc<(Index, F)>), + Private(Rc<(Index, F)>), } impl Variable { @@ -70,8 +70,10 @@ impl Variable { pub fn index(&self) -> Index { match self { Self::Constant(..) => 0, - Self::Public(index, ..) => *index, - Self::Private(index, ..) => *index, + Self::Public(index_value) | Self::Private(index_value) => { + let (index, _value) = index_value.as_ref(); + *index + } } } @@ -81,8 +83,10 @@ impl Variable { pub fn value(&self) -> F { match self { Self::Constant(value) => **value, - Self::Public(_, value) => **value, - Self::Private(_, value) => **value, + Self::Public(index_value) | Self::Private(index_value) => { + let (_index, value) = index_value.as_ref(); + *value + } } } } @@ -259,8 +263,14 @@ impl fmt::Debug for Variable { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", match self { Self::Constant(value) => format!("Constant({value})"), - Self::Public(index, value) => format!("Public({index}, {value})"), - Self::Private(index, value) => format!("Private({index}, {value})"), + Self::Public(index_value) => { + let (index, value) = index_value.as_ref(); + format!("Public({index}, {value})") + } + Self::Private(index_value) => { + let (index, value) = index_value.as_ref(); + format!("Private({index}, {value})") + } }) } } @@ -277,6 +287,6 @@ mod tests { #[test] fn test_size() { - assert_eq!(24, std::mem::size_of::::BaseField>>()); + assert_eq!(16, std::mem::size_of::::BaseField>>()); } } diff --git a/circuit/types/boolean/src/not.rs b/circuit/types/boolean/src/not.rs index 491f7d1de2..b4aec24f37 100644 --- a/circuit/types/boolean/src/not.rs +++ b/circuit/types/boolean/src/not.rs @@ -38,7 +38,7 @@ impl Not for &Boolean { // Public and private cases. // Note: We directly instantiate a public variable to correctly represent a boolean in a linear combination. // For more information, see `LinearCombination::is_boolean_type`. - false => Boolean(Variable::Public(0, Rc::new(E::BaseField::one())) - &self.0), + false => Boolean(Variable::Public(Rc::new((0, E::BaseField::one()))) - &self.0), } } } From f836d363eac20a0b579bbc41ed7835316ede18c5 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Fri, 6 Oct 2023 14:56:10 +0200 Subject: [PATCH 044/339] benches: enhance the Varuna benchmarks Signed-off-by: ljedrz --- algorithms/benches/snark/varuna.rs | 46 ++++++++++++++++-------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/algorithms/benches/snark/varuna.rs b/algorithms/benches/snark/varuna.rs index da095e49eb..ea23d8d4ed 100644 --- a/algorithms/benches/snark/varuna.rs +++ b/algorithms/benches/snark/varuna.rs @@ -25,7 +25,7 @@ use snarkvm_curves::bls12_377::{Bls12_377, Fq, Fr}; use snarkvm_utilities::{CanonicalDeserialize, CanonicalSerialize, TestRng}; use criterion::Criterion; -use std::collections::BTreeMap; +use std::{collections::BTreeMap, time::Duration}; type VarunaInst = VarunaSNARK; type FS = PoseidonSponge; @@ -58,11 +58,12 @@ fn snark_circuit_setup(c: &mut Criterion) { } fn snark_prove(c: &mut Criterion) { + let rng = &mut TestRng::default(); + c.bench_function("snark_prove", move |b| { let num_constraints = 100; let num_variables = 25; let mul_depth = 1; - let rng = &mut TestRng::default(); let max_degree = AHPForR1CS::::max_degree(1000, 1000, 1000).unwrap(); let universal_srs = VarunaInst::universal_setup(max_degree).unwrap(); @@ -77,11 +78,12 @@ fn snark_prove(c: &mut Criterion) { } fn snark_batch_prove(c: &mut Criterion) { + let rng = &mut TestRng::default(); + c.bench_function("snark_batch_prove", move |b| { let num_constraints_base = 100; let num_variables_base = 25; let mul_depth_base = 1; - let rng = &mut TestRng::default(); let max_degree = AHPForR1CS::::max_degree(1000000, 1000000, 1000000).unwrap(); let universal_srs = VarunaInst::universal_setup(max_degree).unwrap(); @@ -119,11 +121,12 @@ fn snark_batch_prove(c: &mut Criterion) { } fn snark_verify(c: &mut Criterion) { + let rng = &mut TestRng::default(); + c.bench_function("snark_verify", move |b| { let num_constraints = 100; let num_variables = 25; let mul_depth = 1; - let rng = &mut TestRng::default(); let max_degree = AHPForR1CS::::max_degree(100, 100, 100).unwrap(); let universal_srs = VarunaInst::universal_setup(max_degree).unwrap(); @@ -145,10 +148,11 @@ fn snark_verify(c: &mut Criterion) { } fn snark_batch_verify(c: &mut Criterion) { + let rng = &mut TestRng::default(); + c.bench_function("snark_batch_verify", move |b| { let num_constraints_base = 100; let num_variables_base = 25; - let rng = &mut TestRng::default(); let max_degree = AHPForR1CS::::max_degree(1000, 1000, 100).unwrap(); let universal_srs = VarunaInst::universal_setup(max_degree).unwrap(); @@ -200,6 +204,7 @@ fn snark_batch_verify(c: &mut Criterion) { fn snark_vk_serialize(c: &mut Criterion) { use snarkvm_utilities::serialize::Compress; let mut group = c.benchmark_group("snark_vk_serialize"); + let rng = &mut TestRng::default(); for mode in [Compress::Yes, Compress::No] { let name = match mode { Compress::No => "uncompressed", @@ -208,7 +213,6 @@ fn snark_vk_serialize(c: &mut Criterion) { let num_constraints = 100; let num_variables = 25; let mul_depth = 1; - let rng = &mut TestRng::default(); let max_degree = AHPForR1CS::::max_degree(100, 100, 100).unwrap(); let universal_srs = VarunaInst::universal_setup(max_degree).unwrap(); @@ -229,6 +233,7 @@ fn snark_vk_serialize(c: &mut Criterion) { fn snark_vk_deserialize(c: &mut Criterion) { use snarkvm_utilities::serialize::{Compress, Validate}; let mut group = c.benchmark_group("snark_vk_deserialize"); + let rng = &mut TestRng::default(); for compress in [Compress::Yes, Compress::No] { let compress_name = match compress { Compress::No => "uncompressed", @@ -243,7 +248,6 @@ fn snark_vk_deserialize(c: &mut Criterion) { let num_constraints = 100; let num_variables = 25; let mul_depth = 1; - let rng = &mut TestRng::default(); let max_degree = AHPForR1CS::::max_degree(100, 100, 100).unwrap(); let universal_srs = VarunaInst::universal_setup(max_degree).unwrap(); @@ -273,13 +277,13 @@ fn snark_certificate_prove(c: &mut Criterion) { let fs_p = &fs_parameters; for size in [100, 1_000, 10_000, 100_000] { - c.bench_function(&format!("snark_certificate_prove_{size}"), |b| { - let num_constraints = size; - let num_variables = size; - let mul_depth = 1; - let (circuit, _) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); - let (pk, vk) = VarunaInst::circuit_setup(&universal_srs, &circuit).unwrap(); + let num_constraints = size; + let num_variables = size; + let mul_depth = 1; + let (circuit, _) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); + let (pk, vk) = VarunaInst::circuit_setup(&universal_srs, &circuit).unwrap(); + c.bench_function(&format!("snark_certificate_prove_{size}"), |b| { b.iter(|| VarunaInst::prove_vk(universal_prover, fs_p, &vk, &pk).unwrap()) }); } @@ -296,14 +300,14 @@ fn snark_certificate_verify(c: &mut Criterion) { let fs_p = &fs_parameters; for size in [100, 1_000, 10_000, 100_000] { - c.bench_function(&format!("snark_certificate_verify_{size}"), |b| { - let num_constraints = size; - let num_variables = size; - let mul_depth = 1; - let (circuit, _) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); - let (pk, vk) = VarunaInst::circuit_setup(&universal_srs, &circuit).unwrap(); - let certificate = VarunaInst::prove_vk(universal_prover, fs_p, &vk, &pk).unwrap(); + let num_constraints = size; + let num_variables = size; + let mul_depth = 1; + let (circuit, _) = TestCircuit::gen_rand(mul_depth, num_constraints, num_variables, rng); + let (pk, vk) = VarunaInst::circuit_setup(&universal_srs, &circuit).unwrap(); + let certificate = VarunaInst::prove_vk(universal_prover, fs_p, &vk, &pk).unwrap(); + c.bench_function(&format!("snark_certificate_verify_{size}"), |b| { b.iter(|| VarunaInst::verify_vk(universal_verifier, fs_p, &circuit, &vk, &certificate).unwrap()) }); } @@ -311,7 +315,7 @@ fn snark_certificate_verify(c: &mut Criterion) { criterion_group! { name = varuna_snark; - config = Criterion::default().sample_size(10); + config = Criterion::default().measurement_time(Duration::from_secs(10)); targets = snark_universal_setup, snark_circuit_setup, snark_prove, snark_verify, snark_batch_prove, snark_batch_verify, snark_vk_serialize, snark_vk_deserialize, snark_certificate_prove, snark_certificate_verify, } From 8e16e5751f73a01a3f6cff079df7a25f6f5d96b8 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 27 Oct 2023 23:34:06 -0700 Subject: [PATCH 045/339] Updates batch certificate to V2 --- Cargo.lock | 1 - ledger/narwhal/batch-certificate/Cargo.toml | 6 +- ledger/narwhal/batch-certificate/src/bytes.rs | 102 +++++++--- ledger/narwhal/batch-certificate/src/lib.rs | 188 +++++++++++------- .../batch-certificate/src/serialize.rs | 50 +++-- ledger/narwhal/subdag/src/lib.rs | 5 +- 6 files changed, 220 insertions(+), 132 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1f289e9d17..4ba8707ebb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3122,7 +3122,6 @@ dependencies = [ "snarkvm-ledger-narwhal-batch-certificate", "snarkvm-ledger-narwhal-batch-header", "snarkvm-ledger-narwhal-transmission-id", - "time", ] [[package]] diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index 56c613d919..7d1650cfb6 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -27,7 +27,7 @@ edition = "2021" default = [ ] serial = [ "console/serial" ] wasm = [ "console/wasm" ] -test-helpers = [ "narwhal-batch-header/test-helpers", "time" ] +test-helpers = [ "narwhal-batch-header/test-helpers" ] [dependencies.console] package = "snarkvm-console" @@ -52,10 +52,6 @@ features = [ "serde" ] version = "1.0" features = [ "preserve_order" ] -[dependencies.time] -version = "0.3" -optional = true - [dev-dependencies.bincode] version = "1.3" diff --git a/ledger/narwhal/batch-certificate/src/bytes.rs b/ledger/narwhal/batch-certificate/src/bytes.rs index d7dbd25dc2..b2638fa557 100644 --- a/ledger/narwhal/batch-certificate/src/bytes.rs +++ b/ledger/narwhal/batch-certificate/src/bytes.rs @@ -20,48 +20,84 @@ impl FromBytes for BatchCertificate { // Read the version. let version = u8::read_le(&mut reader)?; // Ensure the version is valid. - if version != 1 { - return Err(error("Invalid batch version")); + if version != 1 && version != 2 { + return Err(error("Invalid batch certificate version")); } - // Read the certificate ID. - let certificate_id = Field::read_le(&mut reader)?; - // Read the batch header. - let batch_header = BatchHeader::read_le(&mut reader)?; - // Read the number of signatures. - let num_signatures = u32::read_le(&mut reader)?; - // Read the signatures. - let mut signatures = IndexMap::with_capacity(num_signatures as usize); - for _ in 0..num_signatures { - // Read the signature. - let signature = Signature::read_le(&mut reader)?; - // Read the timestamp. - let timestamp = i64::read_le(&mut reader)?; - // Insert the signature and timestamp. - signatures.insert(signature, timestamp); + if version == 1 { + // Read the certificate ID. + let certificate_id = Field::read_le(&mut reader)?; + // Read the batch header. + let batch_header = BatchHeader::read_le(&mut reader)?; + // Read the number of signatures. + let num_signatures = u32::read_le(&mut reader)?; + // Read the signatures. + let mut signatures = IndexMap::with_capacity(num_signatures as usize); + for _ in 0..num_signatures { + // Read the signature. + let signature = Signature::read_le(&mut reader)?; + // Read the timestamp. + let timestamp = i64::read_le(&mut reader)?; + // Insert the signature and timestamp. + signatures.insert(signature, timestamp); + } + // Return the batch certificate. + Self::from_v1_deprecated(certificate_id, batch_header, signatures).map_err(error) + } else if version == 2 { + // Read the batch header. + let batch_header = BatchHeader::read_le(&mut reader)?; + // Read the number of signatures. + let num_signatures = u16::read_le(&mut reader)?; + // Read the signatures. + let mut signatures = IndexSet::with_capacity(num_signatures as usize); + for _ in 0..num_signatures { + // Read the signature. + let signature = Signature::read_le(&mut reader)?; + // Insert the signature. + signatures.insert(signature); + } + // Return the batch certificate. + Self::from(batch_header, signatures).map_err(error) + } else { + unreachable!("Invalid batch certificate version") } - // Return the batch certificate. - Self::from(certificate_id, batch_header, signatures).map_err(|e| error(e.to_string())) } } impl ToBytes for BatchCertificate { /// Writes the batch certificate to the buffer. fn write_le(&self, mut writer: W) -> IoResult<()> { - // Write the version. - 1u8.write_le(&mut writer)?; - // Write the certificate ID. - self.certificate_id.write_le(&mut writer)?; - // Write the batch header. - self.batch_header.write_le(&mut writer)?; - // Write the number of signatures. - u32::try_from(self.signatures.len()).map_err(|e| error(e.to_string()))?.write_le(&mut writer)?; - // Write the signatures. - for (signature, timestamp) in &self.signatures { - // Write the signature. - signature.write_le(&mut writer)?; - // Write the timestamp. - timestamp.write_le(&mut writer)?; + match self { + Self::V1 { certificate_id, batch_header, signatures } => { + // Write the version. + 1u8.write_le(&mut writer)?; + // Write the certificate ID. + certificate_id.write_le(&mut writer)?; + // Write the batch header. + batch_header.write_le(&mut writer)?; + // Write the number of signatures. + u32::try_from(signatures.len()).map_err(error)?.write_le(&mut writer)?; + // Write the signatures. + for (signature, timestamp) in signatures.iter() { + // Write the signature. + signature.write_le(&mut writer)?; + // Write the timestamp. + timestamp.write_le(&mut writer)?; + } + } + Self::V2 { batch_header, signatures } => { + // Write the version. + 2u8.write_le(&mut writer)?; + // Write the batch header. + batch_header.write_le(&mut writer)?; + // Write the number of signatures. + u16::try_from(signatures.len()).map_err(error)?.write_le(&mut writer)?; + // Write the signatures. + for signature in signatures.iter() { + // Write the signature. + signature.write_le(&mut writer)?; + } + } } Ok(()) } diff --git a/ledger/narwhal/batch-certificate/src/lib.rs b/ledger/narwhal/batch-certificate/src/lib.rs index a71f640ce0..bcb2f51e06 100644 --- a/ledger/narwhal/batch-certificate/src/lib.rs +++ b/ledger/narwhal/batch-certificate/src/lib.rs @@ -30,33 +30,53 @@ use narwhal_transmission_id::TransmissionID; use core::hash::{Hash, Hasher}; use indexmap::{IndexMap, IndexSet}; -#[derive(Clone, PartialEq, Eq)] -pub struct BatchCertificate { - /// The certificate ID. - certificate_id: Field, - /// The batch header. - batch_header: BatchHeader, - /// The `(signature, timestamp)` pairs for the batch ID from the committee. - signatures: IndexMap, i64>, +#[derive(Clone)] +pub enum BatchCertificate { + // TODO (howardwu): For mainnet - Delete V1 and switch everyone to V2 as the default. + V1 { + /// The certificate ID. + certificate_id: Field, + /// The batch header. + batch_header: BatchHeader, + /// The `(signature, timestamp)` pairs for the batch ID from the committee. + signatures: IndexMap, i64>, + }, + V2 { + /// The batch header. + batch_header: BatchHeader, + /// The signatures for the batch ID from the committee. + signatures: IndexSet>, + }, } impl BatchCertificate { - /// Initializes a new batch certificate. - pub fn new(batch_header: BatchHeader, signatures: IndexMap, i64>) -> Result { - // Compute the certificate ID. - let certificate_id = Self::compute_certificate_id(batch_header.batch_id(), &signatures)?; - // Return the batch certificate. - Self::from(certificate_id, batch_header, signatures) - } - - /// Initializes a new batch certificate. - pub fn from( + // TODO (howardwu): For mainnet - Delete V1 and switch everyone to V2 as the default. + /// Initializes a (deprecated) V1 batch certificate. + pub fn from_v1_deprecated( certificate_id: Field, batch_header: BatchHeader, signatures: IndexMap, i64>, ) -> Result { + /// Returns the certificate ID. + fn compute_certificate_id( + batch_id: Field, + signatures: &IndexMap, i64>, + ) -> Result> { + let mut preimage = Vec::new(); + // Insert the batch ID. + batch_id.write_le(&mut preimage)?; + // Insert the signatures. + for (signature, timestamp) in signatures { + // Insert the signature. + signature.write_le(&mut preimage)?; + // Insert the timestamp. + timestamp.write_le(&mut preimage)?; + } + // Hash the preimage. + N::hash_bhp1024(&preimage.to_bits_le()) + } // Compute the certificate ID. - if certificate_id != Self::compute_certificate_id(batch_header.batch_id(), &signatures)? { + if certificate_id != compute_certificate_id(batch_header.batch_id(), &signatures)? { bail!("Invalid batch certificate ID") } // Verify the signatures are valid. @@ -66,102 +86,118 @@ impl BatchCertificate { bail!("Invalid batch certificate signature") } } + // Return the V1 batch certificate. + Ok(Self::V1 { certificate_id, batch_header, signatures }) + } + + /// Initializes a new batch certificate. + pub fn from(batch_header: BatchHeader, signatures: IndexSet>) -> Result { + // Verify the signatures are valid. + for signature in &signatures { + if !signature.verify(&signature.to_address(), &[batch_header.batch_id()]) { + bail!("Invalid batch certificate signature") + } + } // Return the batch certificate. - Self::from_unchecked(certificate_id, batch_header, signatures) + Self::from_unchecked(batch_header, signatures) } /// Initializes a new batch certificate. - pub fn from_unchecked( - certificate_id: Field, - batch_header: BatchHeader, - signatures: IndexMap, i64>, - ) -> Result { + pub fn from_unchecked(batch_header: BatchHeader, signatures: IndexSet>) -> Result { // Ensure the signatures are not empty. ensure!(!signatures.is_empty(), "Batch certificate must contain signatures"); // Return the batch certificate. - Ok(Self { certificate_id, batch_header, signatures }) + Ok(Self::V2 { batch_header, signatures }) + } +} + +impl PartialEq for BatchCertificate { + fn eq(&self, other: &Self) -> bool { + self.batch_id() == other.batch_id() + } +} + +impl Eq for BatchCertificate {} + +impl Hash for BatchCertificate { + fn hash(&self, state: &mut H) { + match self { + Self::V1 { batch_header, signatures, .. } => { + batch_header.batch_id().hash(state); + (signatures.len() as u64).hash(state); + for signature in signatures.iter() { + signature.hash(state); + } + } + Self::V2 { batch_header, .. } => { + batch_header.batch_id().hash(state); + } + } } } impl BatchCertificate { /// Returns the certificate ID. pub const fn certificate_id(&self) -> Field { - self.certificate_id + match self { + Self::V1 { certificate_id, .. } => *certificate_id, + Self::V2 { batch_header, .. } => batch_header.batch_id(), + } } /// Returns the batch header. pub const fn batch_header(&self) -> &BatchHeader { - &self.batch_header + match self { + Self::V1 { batch_header, .. } => batch_header, + Self::V2 { batch_header, .. } => batch_header, + } } /// Returns the batch ID. pub const fn batch_id(&self) -> Field { - self.batch_header.batch_id() + self.batch_header().batch_id() } /// Returns the author. pub const fn author(&self) -> Address { - self.batch_header.author() + self.batch_header().author() } /// Returns the round. pub const fn round(&self) -> u64 { - self.batch_header.round() + self.batch_header().round() } /// Returns the transmission IDs. pub const fn transmission_ids(&self) -> &IndexSet> { - self.batch_header.transmission_ids() + self.batch_header().transmission_ids() } /// Returns the batch certificate IDs for the previous round. pub const fn previous_certificate_ids(&self) -> &IndexSet> { - self.batch_header.previous_certificate_ids() - } - - /// Returns the median timestamp of the batch ID from the committee. - pub fn median_timestamp(&self) -> i64 { - let mut timestamps = self.timestamps().chain([self.batch_header.timestamp()].into_iter()).collect::>(); - timestamps.sort_unstable(); - timestamps[timestamps.len() / 2] + self.batch_header().previous_certificate_ids() } - /// Returns the timestamps of the batch ID from the committee. - pub fn timestamps(&self) -> impl '_ + ExactSizeIterator { - self.signatures.values().copied() - } - - /// Returns the signatures of the batch ID from the committee. - pub fn signatures(&self) -> impl ExactSizeIterator> { - self.signatures.keys() - } -} - -impl Hash for BatchCertificate { - fn hash(&self, state: &mut H) { - self.batch_header.batch_id().hash(state); - (self.signatures.len() as u64).hash(state); - for signature in &self.signatures { - signature.hash(state); + /// Returns the timestamp of the batch header. + pub fn timestamp(&self) -> i64 { + match self { + Self::V1 { batch_header, signatures, .. } => { + // Return the median timestamp. + let mut timestamps = + signatures.values().copied().chain([batch_header.timestamp()].into_iter()).collect::>(); + timestamps.sort_unstable(); + timestamps[timestamps.len() / 2] + } + Self::V2 { batch_header, .. } => batch_header.timestamp(), } } -} -impl BatchCertificate { - /// Returns the certificate ID. - pub fn compute_certificate_id(batch_id: Field, signatures: &IndexMap, i64>) -> Result> { - let mut preimage = Vec::new(); - // Insert the batch ID. - batch_id.write_le(&mut preimage)?; - // Insert the signatures. - for (signature, timestamp) in signatures { - // Insert the signature. - signature.write_le(&mut preimage)?; - // Insert the timestamp. - timestamp.write_le(&mut preimage)?; + /// Returns the signatures of the batch ID from the committee. + pub fn signatures(&self) -> Box>> { + match self { + Self::V1 { signatures, .. } => Box::new(signatures.keys()), + Self::V2 { signatures, .. } => Box::new(signatures.iter()), } - // Hash the preimage. - N::hash_bhp1024(&preimage.to_bits_le()) } } @@ -201,15 +237,13 @@ pub mod test_helpers { rng, ); // Sample a list of signatures. - let mut signatures = IndexMap::with_capacity(5); + let mut signatures = IndexSet::with_capacity(5); for _ in 0..5 { let private_key = PrivateKey::new(rng).unwrap(); - let timestamp = time::OffsetDateTime::now_utc().unix_timestamp(); - let timestamp_field = Field::from_u64(timestamp as u64); - signatures.insert(private_key.sign(&[batch_header.batch_id(), timestamp_field], rng).unwrap(), timestamp); + signatures.insert(private_key.sign(&[batch_header.batch_id()], rng).unwrap()); } // Return the batch certificate. - BatchCertificate::new(batch_header, signatures).unwrap() + BatchCertificate::from(batch_header, signatures).unwrap() } /// Returns a list of sample batch certificates, sampled at random. diff --git a/ledger/narwhal/batch-certificate/src/serialize.rs b/ledger/narwhal/batch-certificate/src/serialize.rs index 9035b4330b..1e06e50823 100644 --- a/ledger/narwhal/batch-certificate/src/serialize.rs +++ b/ledger/narwhal/batch-certificate/src/serialize.rs @@ -18,13 +18,21 @@ impl Serialize for BatchCertificate { /// Serializes the batch certificate to a JSON-string or buffer. fn serialize(&self, serializer: S) -> Result { match serializer.is_human_readable() { - true => { - let mut certificate = serializer.serialize_struct("BatchCertificate", 3)?; - certificate.serialize_field("certificate_id", &self.certificate_id)?; - certificate.serialize_field("batch_header", &self.batch_header)?; - certificate.serialize_field("signatures", &self.signatures)?; - certificate.end() - } + true => match self { + Self::V1 { certificate_id, batch_header, signatures } => { + let mut state = serializer.serialize_struct("BatchCertificate", 3)?; + state.serialize_field("certificate_id", certificate_id)?; + state.serialize_field("batch_header", batch_header)?; + state.serialize_field("signatures", signatures)?; + state.end() + } + Self::V2 { batch_header, signatures } => { + let mut state = serializer.serialize_struct("BatchCertificate", 2)?; + state.serialize_field("batch_header", batch_header)?; + state.serialize_field("signatures", signatures)?; + state.end() + } + }, false => ToBytesSerializer::serialize_with_size_encoding(self, serializer), } } @@ -36,12 +44,28 @@ impl<'de, N: Network> Deserialize<'de> for BatchCertificate { match deserializer.is_human_readable() { true => { let mut value = serde_json::Value::deserialize(deserializer)?; - Ok(Self::from( - DeserializeExt::take_from_value::(&mut value, "certificate_id")?, - DeserializeExt::take_from_value::(&mut value, "batch_header")?, - DeserializeExt::take_from_value::(&mut value, "signatures")?, - ) - .map_err(de::Error::custom)?) + + // Check if a certificate ID field is present. + let certificate_id = match value.get("certificate_id") { + Some(..) => Some(DeserializeExt::take_from_value::(&mut value, "certificate_id")?), + None => None, + }; + + // Parse for V1 and V2 batch certificates. + if let Some(certificate_id) = certificate_id { + Self::from_v1_deprecated( + certificate_id, + DeserializeExt::take_from_value::(&mut value, "batch_header")?, + DeserializeExt::take_from_value::(&mut value, "signatures")?, + ) + .map_err(de::Error::custom) + } else { + Self::from( + DeserializeExt::take_from_value::(&mut value, "batch_header")?, + DeserializeExt::take_from_value::(&mut value, "signatures")?, + ) + .map_err(de::Error::custom) + } } false => FromBytesDeserializer::::deserialize_with_size_encoding(deserializer, "batch certificate"), } diff --git a/ledger/narwhal/subdag/src/lib.rs b/ledger/narwhal/subdag/src/lib.rs index a5f46e2914..f11d2070df 100644 --- a/ledger/narwhal/subdag/src/lib.rs +++ b/ledger/narwhal/subdag/src/lib.rs @@ -134,10 +134,9 @@ impl Subdag { self.values().flatten().flat_map(BatchCertificate::transmission_ids) } - /// Returns the timestamp of the anchor round, defined as the median timestamp of the leader certificate. + /// Returns the timestamp of the anchor round, defined as the median timestamp of the subdag. pub fn timestamp(&self) -> i64 { - // Retrieve the median timestamp from the leader certificate. - self.leader_certificate().median_timestamp() + self.leader_certificate().timestamp() } /// Returns the subdag root of the transactions. From 2fa0fed0e3d2f7cfd6f4c74807a042f65bea13ef Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 27 Oct 2023 23:47:34 -0700 Subject: [PATCH 046/339] Update the subdag timestamp mechanic --- ledger/narwhal/subdag/src/lib.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/ledger/narwhal/subdag/src/lib.rs b/ledger/narwhal/subdag/src/lib.rs index f11d2070df..992050a56c 100644 --- a/ledger/narwhal/subdag/src/lib.rs +++ b/ledger/narwhal/subdag/src/lib.rs @@ -136,7 +136,20 @@ impl Subdag { /// Returns the timestamp of the anchor round, defined as the median timestamp of the subdag. pub fn timestamp(&self) -> i64 { - self.leader_certificate().timestamp() + match self.leader_certificate() { + BatchCertificate::V1 { .. } => self.leader_certificate().timestamp(), + BatchCertificate::V2 { .. } => { + // Retrieve the timestamps of the certificates. + let mut timestamps = self.values().flatten().map(BatchCertificate::timestamp).collect::>(); + // Sort the timestamps. + #[cfg(not(feature = "serial"))] + timestamps.par_sort_unstable(); + #[cfg(feature = "serial")] + timestamps.sort_unstable(); + // Return the median timestamp. + timestamps[timestamps.len() / 2] + } + } } /// Returns the subdag root of the transactions. From 2e245e30b9b53c1dd6ca27aa9f8efca209815bec Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 27 Oct 2023 23:59:29 -0700 Subject: [PATCH 047/339] Rename to id() --- ledger/narwhal/batch-certificate/src/lib.rs | 4 ++-- ledger/narwhal/subdag/src/lib.rs | 20 +++++++++----------- ledger/store/src/block/mod.rs | 11 +++++------ 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/ledger/narwhal/batch-certificate/src/lib.rs b/ledger/narwhal/batch-certificate/src/lib.rs index bcb2f51e06..bfdc385016 100644 --- a/ledger/narwhal/batch-certificate/src/lib.rs +++ b/ledger/narwhal/batch-certificate/src/lib.rs @@ -138,7 +138,7 @@ impl Hash for BatchCertificate { impl BatchCertificate { /// Returns the certificate ID. - pub const fn certificate_id(&self) -> Field { + pub const fn id(&self) -> Field { match self { Self::V1 { certificate_id, .. } => *certificate_id, Self::V2 { batch_header, .. } => batch_header.batch_id(), @@ -279,7 +279,7 @@ pub mod test_helpers { sample_batch_certificate_for_round(previous_round, rng), ]; // Construct the previous certificate IDs. - let previous_certificate_ids: IndexSet<_> = previous_certificates.iter().map(|c| c.certificate_id()).collect(); + let previous_certificate_ids: IndexSet<_> = previous_certificates.iter().map(|c| c.id()).collect(); // Sample the leader certificate. let certificate = sample_batch_certificate_for_round_with_previous_certificate_ids( current_round, diff --git a/ledger/narwhal/subdag/src/lib.rs b/ledger/narwhal/subdag/src/lib.rs index 992050a56c..beafc19639 100644 --- a/ledger/narwhal/subdag/src/lib.rs +++ b/ledger/narwhal/subdag/src/lib.rs @@ -57,14 +57,15 @@ fn sanity_check_subdag_with_dfs(subdag: &BTreeMap Subdag { /// Returns the certificate IDs of the subdag (from earliest round to latest round). pub fn certificate_ids(&self) -> impl Iterator> + '_ { - self.values().flatten().map(BatchCertificate::certificate_id) + self.values().flatten().map(BatchCertificate::id) } /// Returns the leader certificate. @@ -157,10 +158,7 @@ impl Subdag { // Prepare the leaves. let leaves = cfg_iter!(self.subdag) .map(|(_, certificates)| { - certificates - .iter() - .flat_map(|certificate| certificate.certificate_id().to_bits_le()) - .collect::>() + certificates.iter().flat_map(|certificate| certificate.id().to_bits_le()).collect::>() }) .collect::>(); @@ -213,7 +211,7 @@ pub mod test_helpers { for _ in 0..AVAILABILITY_THRESHOLD { let certificate = narwhal_batch_certificate::test_helpers::sample_batch_certificate_for_round(starting_round, rng); - previous_certificate_ids.insert(certificate.certificate_id()); + previous_certificate_ids.insert(certificate.id()); subdag.entry(starting_round).or_default().insert(certificate); } @@ -222,7 +220,7 @@ pub mod test_helpers { for _ in 0..QUORUM_THRESHOLD { let certificate = narwhal_batch_certificate::test_helpers::sample_batch_certificate_for_round_with_previous_certificate_ids(starting_round + 1, previous_certificate_ids.clone(), rng); - previous_certificate_ids_2.insert(certificate.certificate_id()); + previous_certificate_ids_2.insert(certificate.id()); subdag.entry(starting_round + 1).or_default().insert(certificate); } diff --git a/ledger/store/src/block/mod.rs b/ledger/store/src/block/mod.rs index eeee7c684d..2f6fcc1e9d 100644 --- a/ledger/store/src/block/mod.rs +++ b/ledger/store/src/block/mod.rs @@ -405,10 +405,9 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { // Retrieve the certificate IDs to store. let certificates_to_store = match block.authority() { Authority::Beacon(_) => Vec::new(), - Authority::Quorum(subdag) => subdag - .iter() - .flat_map(|(round, certificates)| certificates.iter().map(|c| (c.certificate_id(), *round))) - .collect(), + Authority::Quorum(subdag) => { + subdag.iter().flat_map(|(round, certificates)| certificates.iter().map(|c| (c.id(), *round))).collect() + } }; // Prepare the rejected transaction IDs and their corresponding unconfirmed transaction IDs. @@ -529,7 +528,7 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { Some(authority) => match authority { Cow::Owned(Authority::Beacon(_)) | Cow::Borrowed(Authority::Beacon(_)) => Vec::new(), Cow::Owned(Authority::Quorum(ref subdag)) | Cow::Borrowed(Authority::Quorum(ref subdag)) => { - subdag.values().flatten().map(|c| c.certificate_id()).collect() + subdag.values().flatten().map(|c| c.id()).collect() } }, None => bail!("Failed to remove block: missing authority for block '{block_height}' ('{block_hash}')"), @@ -798,7 +797,7 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { match subdag.get(&round) { Some(certificates) => { // Retrieve the certificate for the given certificate ID. - match certificates.iter().find(|certificate| &certificate.certificate_id() == certificate_id) { + match certificates.iter().find(|certificate| &certificate.id() == certificate_id) { Some(certificate) => Ok(Some(certificate.clone())), None => bail!("The certificate '{certificate_id}' is missing in block storage"), } From 4ae1043a6acb65aef435bf57df29f04d96043b5d Mon Sep 17 00:00:00 2001 From: Sukey <35202440+sukey2008@users.noreply.github.com> Date: Sat, 28 Oct 2023 22:46:16 +0200 Subject: [PATCH 048/339] fix minor typo Signed-off-by: Sukey <35202440+sukey2008@users.noreply.github.com> --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9dda0af373..b0233c6c71 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,7 +20,7 @@ snarkVM is a big project, so (non-)adherence to best practices related to perfor ### Memory handling - if the final size is known, pre-allocate the collections (`Vec`, `HashMap` etc.) using `with_capacity` or `reserve` - this ensures that there are both fewer allocations (which involve system calls) and that the final allocated capacity is as close to the required size as possible - create the collections right before they are populated/used, as opposed to e.g. creating a few big ones at the beginning of a function and only using them later on; this reduces the amount of time they occupy memory -- if an intermediate vector is avoidable, use an `Iterator` instead; most of the time this just amounts to omitting the call to `.collect()` if a single-pass iteraton follows afterwards, or returning an `impl Iterator` from a function when the caller only needs to iterate over that result once +- if an intermediate vector is avoidable, use an `Iterator` instead; most of the time this just amounts to omitting the call to `.collect()` if a single-pass iteration follows afterwards, or returning an `impl Iterator` from a function when the caller only needs to iterate over that result once - when possible, fill/resize collections "in bulk" instead of pushing a single element in a loop; this is usually (but not always) detected by `clippy`, suggesting to create vectors containing a repeated value with `vec![x; N]` or extending them with `.resize(N, x)` - when a value is to eventually be consumed in a chain of function calls, pass it by value instead of by reference; this has the following benefits: * it makes the fact that the value is needed by value clear to the caller, who can then potentially reclaim it from the object afterwards if it is "heavy", limiting allocations From dc2f4ba0d3bcdbdc4accf91bc238d86b29806b65 Mon Sep 17 00:00:00 2001 From: Alessandro Coglio Date: Sat, 28 Oct 2023 14:11:07 -0700 Subject: [PATCH 049/339] Fix variable name and comments. --- console/types/scalar/src/from_bits.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/console/types/scalar/src/from_bits.rs b/console/types/scalar/src/from_bits.rs index 7384a5c481..25b98715b7 100644 --- a/console/types/scalar/src/from_bits.rs +++ b/console/types/scalar/src/from_bits.rs @@ -34,9 +34,8 @@ impl FromBits for Scalar { // If `num_bits` is greater than `size_in_data_bits`, check it is less than `Scalar::MODULUS`. if num_bits > size_in_data_bits { - // Retrieve the modulus & subtract by 1 as we'll check `bits_le` is less than or *equal* to this value. - // (For advanced users) Scalar::MODULUS - 1 is equivalent to -1 in the field. - let modulus_minus_one = E::Scalar::modulus(); + // Retrieve the modulus as we'll check `bits_le` is less than this value. + let modulus = E::Scalar::modulus(); // Recover the scalar as a `BigInteger` for comparison. // As `bits_le[size_in_bits..]` is guaranteed to be zero from the above logic, @@ -44,7 +43,7 @@ impl FromBits for Scalar { let scalar = E::BigInteger::from_bits_le(&bits_le[..size_in_bits])?; // Ensure the scalar is less than `Scalar::MODULUS`. - ensure!(scalar < modulus_minus_one, "The scalar is greater than or equal to the modulus."); + ensure!(scalar < modulus, "The scalar is greater than or equal to the modulus."); // Return the scalar. Ok(Scalar { scalar: E::Scalar::from_bigint(scalar).ok_or_else(|| anyhow!("Invalid scalar from bits"))? }) From 32f49653f41a8a5e9f04b1c84e83c06e8a8ca3c4 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu Date: Mon, 23 Oct 2023 21:08:02 -0400 Subject: [PATCH 050/339] WIP --- .../src/stack/finalize_types/initialize.rs | 98 +++++++++++++++---- synthesizer/program/src/logic/command/get.rs | 36 ++++--- .../program/src/logic/command/get_or_use.rs | 36 +++++-- 3 files changed, 128 insertions(+), 42 deletions(-) diff --git a/synthesizer/process/src/stack/finalize_types/initialize.rs b/synthesizer/process/src/stack/finalize_types/initialize.rs index 77c1ee2893..bab87294a9 100644 --- a/synthesizer/process/src/stack/finalize_types/initialize.rs +++ b/synthesizer/process/src/stack/finalize_types/initialize.rs @@ -17,6 +17,7 @@ use crate::RegisterTypes; use synthesizer_program::{ Await, Branch, + CallOperator, CastType, Contains, Get, @@ -174,7 +175,7 @@ impl FinalizeTypes { Command::Instruction(instruction) => self.check_instruction(stack, finalize.name(), instruction)?, Command::Await(await_) => self.check_await(stack, await_)?, Command::Contains(contains) => self.check_contains(stack, finalize.name(), contains)?, - Command::Get(get) => self.check_get(stack, finalize.name(), get)?, + Command::Get(get) => self.check_get(stack, get)?, Command::GetOrUse(get_or_use) => self.check_get_or_use(stack, finalize.name(), get_or_use)?, Command::RandChaCha(rand_chacha) => self.check_rand_chacha(stack, finalize.name(), rand_chacha)?, Command::Remove(remove) => self.check_remove(stack, finalize.name(), remove)?, @@ -287,19 +288,44 @@ impl FinalizeTypes { /// Ensures the given `get` command is well-formed. #[inline] - fn check_get( - &mut self, - stack: &(impl StackMatches + StackProgram), - finalize_name: &Identifier, - get: &Get, - ) -> Result<()> { - // Ensure the declared mapping in `get` is defined in the program. - if !stack.program().contains_mapping(get.mapping_name()) { - bail!("Mapping '{}' in '{}/{finalize_name}' is not defined.", get.mapping_name(), stack.program_id()) - } - // Retrieve the mapping from the program. - // Note that the unwrap is safe, as we have already checked the mapping exists. - let mapping = stack.program().get_mapping(get.mapping_name()).unwrap(); + fn check_get(&mut self, stack: &(impl StackMatches + StackProgram), get: &Get) -> Result<()> { + // Retrieve the mapping. + let mapping = match get.mapping() { + CallOperator::Locator(locator) => { + // Retrieve the program ID. + let program_id = locator.program_id(); + // Retrieve the mapping_name. + let mapping_name = locator.resource(); + + // Ensure the locator does not reference the current program. + if stack.program_id() == program_id { + bail!("Locator '{locator}' does not reference an external program."); + } + // Ensure the current program contains an import for this external program. + if !stack.program().imports().keys().contains(program_id) { + bail!("External program '{locator}' is not imported by '{program_id}'."); + } + // Retrieve the program. + let external = stack.get_external_program(program_id)?; + // Ensure the mapping exists in the program. + if !external.contains_mapping(mapping_name) { + bail!("Mapping '{mapping_name}' in '{program_id}' is not defined.") + } + // Retrieve the mapping from the program. + // Note that the unwrap is safe, as we have already checked the mapping exists. + external.get_mapping(mapping_name).unwrap() + } + CallOperator::Resource(mapping_name) => { + // Ensure the declared mapping in `get` is defined in the current program. + if !stack.program().contains_mapping(mapping_name) { + bail!("Mapping '{mapping_name}' in '{}' is not defined.", stack.program_id()) + } + // Retrieve the mapping from the program. + // Note that the unwrap is safe, as we have already checked the mapping exists. + stack.program().get_mapping(mapping_name).unwrap() + } + }; + // Get the mapping key type. let mapping_key_type = mapping.key().plaintext_type(); // Get the mapping value type. @@ -332,13 +358,43 @@ impl FinalizeTypes { finalize_name: &Identifier, get_or_use: &GetOrUse, ) -> Result<()> { - // Ensure the declared mapping in `get.or_use` is defined in the program. - if !stack.program().contains_mapping(get_or_use.mapping_name()) { - bail!("Mapping '{}' in '{}/{finalize_name}' is not defined.", get_or_use.mapping_name(), stack.program_id()) - } - // Retrieve the mapping from the program. - // Note that the unwrap is safe, as we have already checked the mapping exists. - let mapping = stack.program().get_mapping(get_or_use.mapping_name()).unwrap(); + // Retrieve the mapping. + let mapping = match get_or_use.mapping() { + CallOperator::Locator(locator) => { + // Retrieve the program ID. + let program_id = locator.program_id(); + // Retrieve the mapping_name. + let mapping_name = locator.resource(); + + // Ensure the locator does not reference the current program. + if stack.program_id() == program_id { + bail!("Locator '{locator}' does not reference an external program."); + } + // Ensure the current program contains an import for this external program. + if !stack.program().imports().keys().contains(program_id) { + bail!("External program '{locator}' is not imported by '{program_id}'."); + } + // Retrieve the program. + let external = stack.get_external_program(program_id)?; + // Ensure the mapping exists in the program. + if !external.contains_mapping(mapping_name) { + bail!("Mapping '{mapping_name}' in '{program_id}' is not defined.") + } + // Retrieve the mapping from the program. + // Note that the unwrap is safe, as we have already checked the mapping exists. + external.get_mapping(mapping_name).unwrap() + } + CallOperator::Resource(mapping_name) => { + // Ensure the declared mapping in `get` is defined in the current program. + if !stack.program().contains_mapping(mapping_name) { + bail!("Mapping '{mapping_name}' in '{}' is not defined.", stack.program_id()) + } + // Retrieve the mapping from the program. + // Note that the unwrap is safe, as we have already checked the mapping exists. + stack.program().get_mapping(mapping_name).unwrap() + } + }; + // Get the mapping key type. let mapping_key_type = mapping.key().plaintext_type(); // Get the mapping value type. diff --git a/synthesizer/program/src/logic/command/get.rs b/synthesizer/program/src/logic/command/get.rs index fc698a0969..2af220ab64 100644 --- a/synthesizer/program/src/logic/command/get.rs +++ b/synthesizer/program/src/logic/command/get.rs @@ -14,12 +14,13 @@ use crate::{ traits::{FinalizeStoreTrait, RegistersLoad, RegistersStore, StackMatches, StackProgram}, + CallOperator, Opcode, Operand, }; use console::{ network::prelude::*, - program::{Identifier, Register, Value}, + program::{Register, Value}, }; /// A get command, e.g. `get accounts[r0] into r1;`. @@ -27,7 +28,7 @@ use console::{ #[derive(Clone, PartialEq, Eq, Hash)] pub struct Get { /// The mapping name. - mapping: Identifier, + mapping: CallOperator, /// The key to access the mapping. key: Operand, /// The destination register. @@ -47,9 +48,9 @@ impl Get { vec![self.key.clone()] } - /// Returns the mapping name. + /// Returns the mapping. #[inline] - pub const fn mapping_name(&self) -> &Identifier { + pub const fn mapping(&self) -> &CallOperator { &self.mapping } @@ -75,21 +76,27 @@ impl Get { store: &impl FinalizeStoreTrait, registers: &mut (impl RegistersLoad + RegistersStore), ) -> Result<()> { + // Determine the program ID and mapping name. + let (program_id, mapping_name) = match self.mapping { + CallOperator::Locator(locator) => (*locator.program_id(), *locator.resource()), + CallOperator::Resource(mapping_name) => (*stack.program_id(), mapping_name), + }; + // Ensure the mapping exists in storage. - if !store.contains_mapping_confirmed(stack.program_id(), &self.mapping)? { - bail!("Mapping '{}/{}' does not exist in storage", stack.program_id(), self.mapping); + if !store.contains_mapping_confirmed(&program_id, &mapping_name)? { + bail!("Mapping '{program_id}/{mapping_name}' does not exist in storage"); } // Load the operand as a plaintext. let key = registers.load_plaintext(stack, &self.key)?; // Retrieve the value from storage as a literal. - let value = match store.get_value_speculative(*stack.program_id(), self.mapping, &key)? { + let value = match store.get_value_speculative(program_id, mapping_name, &key)? { Some(Value::Plaintext(plaintext)) => Value::Plaintext(plaintext), Some(Value::Record(..)) => bail!("Cannot 'get' a 'record'"), Some(Value::Future(..)) => bail!("Cannot 'get' a 'future'",), // If a key does not exist, then bail. - None => bail!("Key '{}' does not exist in mapping '{}/{}'", key, stack.program_id(), self.mapping), + None => bail!("Key '{key}' does not exist in mapping '{program_id}/{mapping_name}'"), }; // Assign the value to the destination register. @@ -111,7 +118,7 @@ impl Parser for Get { let (string, _) = Sanitizer::parse_whitespaces(string)?; // Parse the mapping name from the string. - let (string, mapping) = Identifier::parse(string)?; + let (string, mapping) = CallOperator::parse(string)?; // Parse the "[" from the string. let (string, _) = tag("[")(string)?; // Parse the whitespace from the string. @@ -182,7 +189,7 @@ impl FromBytes for Get { /// Reads the command from a buffer. fn read_le(mut reader: R) -> IoResult { // Read the mapping name. - let mapping = Identifier::read_le(&mut reader)?; + let mapping = CallOperator::read_le(&mut reader)?; // Read the key operand. let key = Operand::read_le(&mut reader)?; // Read the destination register. @@ -215,7 +222,14 @@ mod tests { fn test_parse() { let (string, get) = Get::::parse("get account[r0] into r1;").unwrap(); assert!(string.is_empty(), "Parser did not consume all of the string: '{string}'"); - assert_eq!(get.mapping, Identifier::from_str("account").unwrap()); + assert_eq!(get.mapping, CallOperator::from_str("account").unwrap()); + assert_eq!(get.operands().len(), 1, "The number of operands is incorrect"); + assert_eq!(get.key, Operand::Register(Register::Locator(0)), "The first operand is incorrect"); + assert_eq!(get.destination, Register::Locator(1), "The second operand is incorrect"); + + let (string, get) = Get::::parse("get token.aleo/balances[r0] into r1;").unwrap(); + assert!(string.is_empty(), "Parser did not consume all of the string: '{string}'"); + assert_eq!(get.mapping, CallOperator::from_str("token.aleo/balances").unwrap()); assert_eq!(get.operands().len(), 1, "The number of operands is incorrect"); assert_eq!(get.key, Operand::Register(Register::Locator(0)), "The first operand is incorrect"); assert_eq!(get.destination, Register::Locator(1), "The second operand is incorrect"); diff --git a/synthesizer/program/src/logic/command/get_or_use.rs b/synthesizer/program/src/logic/command/get_or_use.rs index 27c0e6faec..15ed3365f4 100644 --- a/synthesizer/program/src/logic/command/get_or_use.rs +++ b/synthesizer/program/src/logic/command/get_or_use.rs @@ -14,12 +14,13 @@ use crate::{ traits::{FinalizeStoreTrait, RegistersLoad, RegistersStore, StackMatches, StackProgram}, + CallOperator, Opcode, Operand, }; use console::{ network::prelude::*, - program::{Identifier, Register, Value}, + program::{Register, Value}, }; /// A get command that uses the provided default in case of failure, e.g. `get.or_use accounts[r0] r1 into r2;`. @@ -28,7 +29,7 @@ use console::{ #[derive(Clone, PartialEq, Eq, Hash)] pub struct GetOrUse { /// The mapping name. - mapping: Identifier, + mapping: CallOperator, /// The key to access the mapping. key: Operand, /// The default value. @@ -50,9 +51,9 @@ impl GetOrUse { vec![self.key.clone(), self.default.clone()] } - /// Returns the mapping name. + /// Returns the mapping. #[inline] - pub const fn mapping_name(&self) -> &Identifier { + pub const fn mapping(&self) -> &CallOperator { &self.mapping } @@ -84,16 +85,22 @@ impl GetOrUse { store: &impl FinalizeStoreTrait, registers: &mut (impl RegistersLoad + RegistersStore), ) -> Result<()> { + // Determine the program ID and mapping name. + let (program_id, mapping_name) = match self.mapping { + CallOperator::Locator(locator) => (*locator.program_id(), *locator.resource()), + CallOperator::Resource(mapping_name) => (*stack.program_id(), mapping_name), + }; + // Ensure the mapping exists in storage. - if !store.contains_mapping_confirmed(stack.program_id(), &self.mapping)? { - bail!("Mapping '{}/{}' does not exist in storage", stack.program_id(), self.mapping); + if !store.contains_mapping_confirmed(&program_id, &mapping_name)? { + bail!("Mapping '{program_id}/{mapping_name}' does not exist in storage"); } // Load the operand as a plaintext. let key = registers.load_plaintext(stack, &self.key)?; // Retrieve the value from storage as a literal. - let value = match store.get_value_speculative(*stack.program_id(), self.mapping, &key)? { + let value = match store.get_value_speculative(program_id, mapping_name, &key)? { Some(Value::Plaintext(plaintext)) => Value::Plaintext(plaintext), Some(Value::Record(..)) => bail!("Cannot 'get.or_use' a 'record'"), Some(Value::Future(..)) => bail!("Cannot 'get.or_use' a 'future'"), @@ -121,7 +128,7 @@ impl Parser for GetOrUse { let (string, _) = Sanitizer::parse_whitespaces(string)?; // Parse the mapping name from the string. - let (string, mapping) = Identifier::parse(string)?; + let (string, mapping) = CallOperator::parse(string)?; // Parse the "[" from the string. let (string, _) = tag("[")(string)?; // Parse the whitespace from the string. @@ -196,7 +203,7 @@ impl FromBytes for GetOrUse { /// Reads the command from a buffer. fn read_le(mut reader: R) -> IoResult { // Read the mapping name. - let mapping = Identifier::read_le(&mut reader)?; + let mapping = CallOperator::read_le(&mut reader)?; // Read the key operand. let key = Operand::read_le(&mut reader)?; // Read the default value. @@ -233,7 +240,16 @@ mod tests { fn test_parse() { let (string, get_or_use) = GetOrUse::::parse("get.or_use account[r0] r1 into r2;").unwrap(); assert!(string.is_empty(), "Parser did not consume all of the string: '{string}'"); - assert_eq!(get_or_use.mapping, Identifier::from_str("account").unwrap()); + assert_eq!(get_or_use.mapping, CallOperator::from_str("account").unwrap()); + assert_eq!(get_or_use.operands().len(), 2, "The number of operands is incorrect"); + assert_eq!(get_or_use.key, Operand::Register(Register::Locator(0)), "The first operand is incorrect"); + assert_eq!(get_or_use.default, Operand::Register(Register::Locator(1)), "The second operand is incorrect"); + assert_eq!(get_or_use.destination, Register::Locator(2), "The second operand is incorrect"); + + let (string, get_or_use) = + GetOrUse::::parse("get.or_use token.aleo/balances[r0] r1 into r2;").unwrap(); + assert!(string.is_empty(), "Parser did not consume all of the string: '{string}'"); + assert_eq!(get_or_use.mapping, CallOperator::from_str("token.aleo/balances").unwrap()); assert_eq!(get_or_use.operands().len(), 2, "The number of operands is incorrect"); assert_eq!(get_or_use.key, Operand::Register(Register::Locator(0)), "The first operand is incorrect"); assert_eq!(get_or_use.default, Operand::Register(Register::Locator(1)), "The second operand is incorrect"); From 884507837ddff5c86ae4bac00574fa166186b967 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu Date: Thu, 26 Oct 2023 19:26:01 -0400 Subject: [PATCH 051/339] Use public fees in integration tests; fund user defined private keys --- .../tests/test_vm_execute_and_finalize.rs | 110 +++++++++++------- .../tests/utilities/tests/program_test.rs | 26 ++++- 2 files changed, 90 insertions(+), 46 deletions(-) diff --git a/synthesizer/tests/test_vm_execute_and_finalize.rs b/synthesizer/tests/test_vm_execute_and_finalize.rs index ce7ff4a93e..23b760cbb2 100644 --- a/synthesizer/tests/test_vm_execute_and_finalize.rs +++ b/synthesizer/tests/test_vm_execute_and_finalize.rs @@ -35,6 +35,7 @@ use snarkvm_synthesizer::{program::FinalizeOperation, VM}; use synthesizer_program::FinalizeGlobalState; use anyhow::Result; +use console::account::Address; use indexmap::IndexMap; use rayon::prelude::*; use std::borrow::Borrow; @@ -69,34 +70,61 @@ fn run_test(test: &ProgramTest) -> serde_yaml::Mapping { let genesis_private_key = PrivateKey::::new(rng).unwrap(); // Initialize the VM. - let (vm, records) = initialize_vm(&genesis_private_key, rng); + let (vm, _) = initialize_vm(&genesis_private_key, rng); + + // Fund the additional keys. + for key in test.keys() { + // Transfer 1_000_000_000_000 + let transaction = vm + .execute( + &genesis_private_key, + ("credits.aleo", "transfer_public"), + vec![ + Value::Plaintext(Plaintext::from(Literal::Address(Address::try_from(key).unwrap()))), + Value::Plaintext(Plaintext::from(Literal::U64(U64::new(1_000_000_000_000)))), + ] + .iter(), + None, + 0, + None, + rng, + ) + .unwrap(); + let (ratifications, transactions, aborted_transaction_ids, ratified_finalize_operations) = + vm.speculate(construct_finalize_global_state(&vm), Some(0u64), vec![], None, [transaction].iter()).unwrap(); + assert!(aborted_transaction_ids.is_empty()); - // Pre-construct the necessary fee records. - let num_fee_records = test.programs().len() + test.cases().len(); - let mut fee_records = construct_fee_records(&vm, &genesis_private_key, records, num_fee_records, rng); + let block = construct_next_block( + &vm, + &genesis_private_key, + ratifications, + transactions, + aborted_transaction_ids, + ratified_finalize_operations, + rng, + ); + vm.add_next_block(&block.unwrap()).unwrap(); + } // Deploy the programs. for program in test.programs() { - let transaction = - match vm.deploy(&genesis_private_key, program, Some(fee_records.pop().unwrap().0), 0, None, rng) { - Ok(transaction) => transaction, - Err(error) => { - let mut output = serde_yaml::Mapping::new(); - output.insert( - serde_yaml::Value::String("errors".to_string()), - serde_yaml::Value::Sequence(vec![serde_yaml::Value::String(format!( - "Failed to run `VM::deploy for program {}: {}", - program.id(), - error - ))]), - ); - output.insert( - serde_yaml::Value::String("outputs".to_string()), - serde_yaml::Value::Sequence(Vec::new()), - ); - return output; - } - }; + let transaction = match vm.deploy(&genesis_private_key, program, None, 0, None, rng) { + Ok(transaction) => transaction, + Err(error) => { + let mut output = serde_yaml::Mapping::new(); + output.insert( + serde_yaml::Value::String("errors".to_string()), + serde_yaml::Value::Sequence(vec![serde_yaml::Value::String(format!( + "Failed to run `VM::deploy for program {}: {}", + program.id(), + error + ))]), + ); + output + .insert(serde_yaml::Value::String("outputs".to_string()), serde_yaml::Value::Sequence(Vec::new())); + return output; + } + }; let (ratifications, transactions, aborted_transaction_ids, ratified_finalize_operations) = vm.speculate(construct_finalize_global_state(&vm), Some(0u64), vec![], None, [transaction].iter()).unwrap(); @@ -168,25 +196,18 @@ fn run_test(test: &ProgramTest) -> serde_yaml::Mapping { let mut other = serde_yaml::Mapping::new(); // Execute the function, extracting the transaction. - let transaction = match vm.execute( - &private_key, - (program_id, function_name), - inputs.iter(), - Some(fee_records.pop().unwrap().0), - 0u64, - None, - rng, - ) { - Ok(transaction) => transaction, - // If the execution fails, return the error. - Err(err) => { - result.insert( - serde_yaml::Value::String("execute".to_string()), - serde_yaml::Value::String(err.to_string()), - ); - return (serde_yaml::Value::Mapping(result), serde_yaml::Value::Mapping(Default::default())); - } - }; + let transaction = + match vm.execute(&private_key, (program_id, function_name), inputs.iter(), None, 0u64, None, rng) { + Ok(transaction) => transaction, + // If the execution fails, return the error. + Err(err) => { + result.insert( + serde_yaml::Value::String("execute".to_string()), + serde_yaml::Value::String(err.to_string()), + ); + return (serde_yaml::Value::Mapping(result), serde_yaml::Value::Mapping(Default::default())); + } + }; // Attempt to verify the transaction. let verified = vm.check_transaction(&transaction, None).is_ok(); @@ -333,6 +354,7 @@ fn initialize_vm( } // A helper function construct the desired number of fee records from an initial record, all owned by the same key. +#[allow(unused)] fn construct_fee_records, R: Rng + CryptoRng>( vm: &VM, private_key: &PrivateKey, @@ -454,7 +476,7 @@ fn construct_next_block, R: Rng + CryptoRng> } // A helper function to invoke `credits.aleo/split`. -#[allow(clippy::type_complexity)] +#[allow(clippy::type_complexity, unused)] fn split, R: Rng + CryptoRng>( vm: &VM, private_key: &PrivateKey, diff --git a/synthesizer/tests/utilities/tests/program_test.rs b/synthesizer/tests/utilities/tests/program_test.rs index 77a031aa92..64607f26f3 100644 --- a/synthesizer/tests/utilities/tests/program_test.rs +++ b/synthesizer/tests/utilities/tests/program_test.rs @@ -43,6 +43,8 @@ pub struct ProgramTest { rewrite: bool, /// The seed for the RNG. randomness: Option, + /// Additional keys for the test. + keys: Vec>, } impl ProgramTest { @@ -60,6 +62,11 @@ impl ProgramTest { pub fn randomness(&self) -> Option { self.randomness } + + /// Returns the additional keys for the test. + pub fn keys(&self) -> &[PrivateKey] { + &self.keys + } } impl ExpectedTest for ProgramTest { @@ -79,12 +86,27 @@ impl ExpectedTest for ProgramTest { let comment = &source[first_comment_start + 2..first_comment_start + 2 + end_first_comment]; // Parse the comment into the test configuration. - println!("comment: {}", comment); let test_config = serde_yaml::from_str::(comment).expect("invalid test configuration"); // If the `randomness` field is present in the config, parse it as a `u64`. let randomness = test_config.get("randomness").map(|value| value.as_u64().expect("`randomness` must be a u64")); + // If the `keys` field is present in the config, parse it as a sequence of `PrivateKey`s. + let keys = match test_config.get("keys") { + None => Vec::new(), + Some(value) => { + value + .as_sequence() + .expect("`keys` must be a sequence") + .iter() + .map(|value| { + PrivateKey::::from_str(value.as_str().expect("private key must be a string")) + .expect("invalid private key") + }) + .collect::>() + } + }; + // Extract the test cases from the config. let cases = test_config .get("cases") @@ -110,7 +132,7 @@ impl ExpectedTest for ProgramTest { } }; - Self { programs, cases, expected, path, rewrite, randomness } + Self { programs, cases, expected, path, rewrite, randomness, keys } } fn check(&self, output: &Self::Output) -> Result<()> { From aa925ab1f1d897ffefc9fc58e70f3f8819bf272b Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu Date: Thu, 26 Oct 2023 19:26:41 -0400 Subject: [PATCH 052/339] Add tests using external mappings --- .../execute_and_finalize/mint_and_split.aleo | 3 + .../read_external_mapping.aleo | 68 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 synthesizer/tests/tests/vm/execute_and_finalize/read_external_mapping.aleo diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/mint_and_split.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/mint_and_split.aleo index 3d69f3c955..c8163d2990 100644 --- a/synthesizer/tests/tests/vm/execute_and_finalize/mint_and_split.aleo +++ b/synthesizer/tests/tests/vm/execute_and_finalize/mint_and_split.aleo @@ -1,5 +1,8 @@ /* randomness: 1337 +keys: + - APrivateKey1zkpFbGDx4znwxo1zrxfUscfGn1Vy3My3ia5gRHx3XwaLtCR + - APrivateKey1zkpJhviKDvvm7yu7SZuhSudVR7zjCRG2HznuAHwuGYc1xqN cases: - program: mint_and_split.aleo function: mint diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/read_external_mapping.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/read_external_mapping.aleo new file mode 100644 index 0000000000..a8c5185d59 --- /dev/null +++ b/synthesizer/tests/tests/vm/execute_and_finalize/read_external_mapping.aleo @@ -0,0 +1,68 @@ +/* +randomness: 9086185409 +keys: + - APrivateKey1zkpABon5degxuW8JnBniSXgN1C4eAGKfDH8qRPZe1geHpWp +cases: + - program: relay.aleo + function: send + inputs: [aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm, 0u8] + - program: registry.aleo + function: register + inputs: [] + private_key: APrivateKey1zkpABon5degxuW8JnBniSXgN1C4eAGKfDH8qRPZe1geHpWp + - program: relay.aleo + function: send + inputs: [aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm, 1u8] + - program: registry.aleo + function: unregister + inputs: [] + private_key: APrivateKey1zkpABon5degxuW8JnBniSXgN1C4eAGKfDH8qRPZe1geHpWp + - program: relay.aleo + function: send + inputs: [aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm, 2u8] +*/ + +program registry.aleo; + +mapping users: + key as address.public; + value as boolean.public; + +function register: + async register self.caller into r0; + output r0 as registry.aleo/register.future; + +finalize register: + input r0 as address.public; + set true into users[r0]; + +function unregister: + async unregister self.caller into r0; + output r0 as registry.aleo/unregister.future; + +finalize unregister: + input r0 as address.public; + set false into users[r0]; + +///////////////////////////////////////////////// + +import registry.aleo; + +program relay.aleo; + +record message: + owner as address.private; + data as u8.private; + +function send: + input r0 as address.public; + input r1 as u8.public; + cast r0 r1 into r2 as message.record; + async send r0 into r3; + output r2 as message.record; + output r3 as relay.aleo/send.future; + +finalize send: + input r0 as address.public; + get registry.aleo/users[r0] into r1; + assert.eq r1 true; From f226eb56746df23ffeeca1f5ab5ec7c6cdc0ec95 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu Date: Thu, 26 Oct 2023 19:42:48 -0400 Subject: [PATCH 053/339] Add negative tests --- .../src/stack/finalize_types/initialize.rs | 3 +- .../read_external_mapping.out | 61 +++++++++++++++++++ .../no_import_external_read_fail.aleo | 32 ++++++++++ .../unknown_external_mapping_fail.aleo | 34 +++++++++++ .../unknown_mapping_fail.aleo | 18 ++++++ .../tests/utilities/tests/program_test.rs | 20 +++--- 6 files changed, 155 insertions(+), 13 deletions(-) create mode 100644 synthesizer/tests/expectations/vm/execute_and_finalize/read_external_mapping.out create mode 100644 synthesizer/tests/tests/vm/execute_and_finalize/no_import_external_read_fail.aleo create mode 100644 synthesizer/tests/tests/vm/execute_and_finalize/unknown_external_mapping_fail.aleo create mode 100644 synthesizer/tests/tests/vm/execute_and_finalize/unknown_mapping_fail.aleo diff --git a/synthesizer/process/src/stack/finalize_types/initialize.rs b/synthesizer/process/src/stack/finalize_types/initialize.rs index bab87294a9..eae60281de 100644 --- a/synthesizer/process/src/stack/finalize_types/initialize.rs +++ b/synthesizer/process/src/stack/finalize_types/initialize.rs @@ -176,7 +176,7 @@ impl FinalizeTypes { Command::Await(await_) => self.check_await(stack, await_)?, Command::Contains(contains) => self.check_contains(stack, finalize.name(), contains)?, Command::Get(get) => self.check_get(stack, get)?, - Command::GetOrUse(get_or_use) => self.check_get_or_use(stack, finalize.name(), get_or_use)?, + Command::GetOrUse(get_or_use) => self.check_get_or_use(stack, get_or_use)?, Command::RandChaCha(rand_chacha) => self.check_rand_chacha(stack, finalize.name(), rand_chacha)?, Command::Remove(remove) => self.check_remove(stack, finalize.name(), remove)?, Command::Set(set) => self.check_set(stack, finalize.name(), set)?, @@ -355,7 +355,6 @@ impl FinalizeTypes { fn check_get_or_use( &mut self, stack: &(impl StackMatches + StackProgram), - finalize_name: &Identifier, get_or_use: &GetOrUse, ) -> Result<()> { // Retrieve the mapping. diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/read_external_mapping.out b/synthesizer/tests/expectations/vm/execute_and_finalize/read_external_mapping.out new file mode 100644 index 0000000000..277a2e1bcd --- /dev/null +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/read_external_mapping.out @@ -0,0 +1,61 @@ +errors: [] +outputs: +- verified: true + execute: + relay.aleo/send: + outputs: + - '{"type":"record","id":"2317537586898875003527911595881250652314627769570172347256550518017872557697field","checksum":"5016557145498331574642320031968331291285347334593139541782766783223318670648field","value":"record1qyqsp8ch07pqnhwum52l685x8yelm2xhwevs9lh9gfmx2zpz26kff5g0qyzxgct5vy3sqqspqz337ysk89zjy89u65led0e7y0wj7p5ejdwhatq68zcdagqkwl9sdnqms8z3y6lnck4kzukmh5769mg0933thnfetskqguycewflh4qflw82vn"}' + - '{"type":"future","id":"6060171713510534514143443306903785915198276713047207513053052324882806972526field","value":"{\n program_id: relay.aleo,\n function_name: send,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm\n ]\n}"}' + speculate: the execution was rejected + add_next_block: succeeded. +- verified: true + execute: + registry.aleo/register: + outputs: + - '{"type":"future","id":"4912027766578041258717763414531570075203769145029783107169756543671526859063field","value":"{\n program_id: registry.aleo,\n function_name: register,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm\n ]\n}"}' + speculate: the execution was accepted + add_next_block: succeeded. +- verified: true + execute: + relay.aleo/send: + outputs: + - '{"type":"record","id":"7570363776723556048515317606603820932475200424645714329992113285075479807481field","checksum":"2640827483033329518607665013126665825734877898317823925445957258899070118927field","value":"record1qyqsqhp6suzyvpvf5cqtf8k5lj7j6vgljvn83knvx6z429zhxp5fgmqdqyzxgct5vy3sqqspqqj9pn534vyqvqvfk5lygrc7cqj6rx8tcmgdkmus0kfw9y5csygqdmx09zv7xawh9s9e7d2x5l6j20wfxuk4r9z6vtrg7gh7q6pv3tg8xfuuru"}' + - '{"type":"future","id":"8396346733807272095051892936411848657999314439834335427243101849411797227479field","value":"{\n program_id: relay.aleo,\n function_name: send,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm\n ]\n}"}' + speculate: the execution was accepted + add_next_block: succeeded. +- verified: true + execute: + registry.aleo/unregister: + outputs: + - '{"type":"future","id":"4916621928718597326453327850342432807913183863515286820927876893411281241764field","value":"{\n program_id: registry.aleo,\n function_name: unregister,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm\n ]\n}"}' + speculate: the execution was accepted + add_next_block: succeeded. +- verified: true + execute: + relay.aleo/send: + outputs: + - '{"type":"record","id":"5530328758191127651605502960961789058994029742872360714815774182797261982763field","checksum":"2945321521037774393869829376179129152338156532812236337422211831315443690211field","value":"record1qyqsqel2rux546nzp57eh38k24xfflptvpyzegcxxwugj097vkvjukstqyzxgct5vy3sqqspqzhhjatdt09f8lxsaukt4njxeql4my8p86fw2r4jxc3scdez8asqs3hpuh9taf46gyltxxh22qp9x4xzjtmaq0ung8adtumsw94cecs0x0xqkl"}' + - '{"type":"future","id":"6830445503994857147753329697934978051706269651779887682757924869644027854312field","value":"{\n program_id: relay.aleo,\n function_name: send,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm\n ]\n}"}' + speculate: the execution was rejected + add_next_block: succeeded. +additional: +- child_outputs: + credits.aleo/fee_public: + outputs: + - '{"type":"future","id":"4960890695745452772232908991619728704202417459002410486474521601906731342806field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1xe2fps8f9xpdas2q0fqy22uraenk84tvvzetrsyxgnwy6445h59s6wv78x,\n 28479u64\n ]\n}"}' +- child_outputs: + credits.aleo/fee_public: + outputs: + - '{"type":"future","id":"8430479447748956098157716177872888769234364744387596392617360355542856164660field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm,\n 101210u64\n ]\n}"}' +- child_outputs: + credits.aleo/fee_public: + outputs: + - '{"type":"future","id":"4502206432380012456604755847468214248986763931949891558228458881027814975027field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1xe2fps8f9xpdas2q0fqy22uraenk84tvvzetrsyxgnwy6445h59s6wv78x,\n 28479u64\n ]\n}"}' +- child_outputs: + credits.aleo/fee_public: + outputs: + - '{"type":"future","id":"3161662896320756371352352358177196789819155276370479628395808356491575243730field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm,\n 101214u64\n ]\n}"}' +- child_outputs: + credits.aleo/fee_public: + outputs: + - '{"type":"future","id":"7835046846960912856976978166201827944679821834273867346502722712552318601688field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1xe2fps8f9xpdas2q0fqy22uraenk84tvvzetrsyxgnwy6445h59s6wv78x,\n 28479u64\n ]\n}"}' diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/no_import_external_read_fail.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/no_import_external_read_fail.aleo new file mode 100644 index 0000000000..3a64c123d1 --- /dev/null +++ b/synthesizer/tests/tests/vm/execute_and_finalize/no_import_external_read_fail.aleo @@ -0,0 +1,32 @@ +/* +cases: [] +*/ + +program registry.aleo; + +mapping users: + key as address.public; + value as boolean.public; + +function register: + async register self.caller into r0; + output r0 as registry.aleo/register.future; + +finalize register: + input r0 as address.public; + set true into users[r0]; + + +///////////////////////////////////////////////// + +program relay.aleo; + +function send: + input r0 as address.public; + async send r0 into r1; + output r1 as relay.aleo/send.future; + +finalize send: + input r0 as address.public; + get registry.aleo/users[r0] into r1; + assert.eq r1 true; diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/unknown_external_mapping_fail.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/unknown_external_mapping_fail.aleo new file mode 100644 index 0000000000..05397274d7 --- /dev/null +++ b/synthesizer/tests/tests/vm/execute_and_finalize/unknown_external_mapping_fail.aleo @@ -0,0 +1,34 @@ +/* +cases: [] +*/ + +program registry.aleo; + +mapping users: + key as address.public; + value as boolean.public; + +function register: + async register self.caller into r0; + output r0 as registry.aleo/register.future; + +finalize register: + input r0 as address.public; + set true into users[r0]; + + +///////////////////////////////////////////////// + +import registry.aleo; + +program relay.aleo; + +function send: + input r0 as address.public; + async send r0 into r1; + output r1 as relay.aleo/send.future; + +finalize send: + input r0 as address.public; + get registry.aleo/foo[r0] into r1; + assert.eq r1 true; diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/unknown_mapping_fail.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/unknown_mapping_fail.aleo new file mode 100644 index 0000000000..f344a08a36 --- /dev/null +++ b/synthesizer/tests/tests/vm/execute_and_finalize/unknown_mapping_fail.aleo @@ -0,0 +1,18 @@ +/* +cases: [] +*/ + +program registry.aleo; + +mapping users: + key as address.public; + value as boolean.public; + +function register: + async register self.caller into r0; + output r0 as registry.aleo/register.future; + +finalize register: + input r0 as address.public; + set true into foo[r0]; + diff --git a/synthesizer/tests/utilities/tests/program_test.rs b/synthesizer/tests/utilities/tests/program_test.rs index 64607f26f3..71290b0a0b 100644 --- a/synthesizer/tests/utilities/tests/program_test.rs +++ b/synthesizer/tests/utilities/tests/program_test.rs @@ -94,17 +94,15 @@ impl ExpectedTest for ProgramTest { // If the `keys` field is present in the config, parse it as a sequence of `PrivateKey`s. let keys = match test_config.get("keys") { None => Vec::new(), - Some(value) => { - value - .as_sequence() - .expect("`keys` must be a sequence") - .iter() - .map(|value| { - PrivateKey::::from_str(value.as_str().expect("private key must be a string")) - .expect("invalid private key") - }) - .collect::>() - } + Some(value) => value + .as_sequence() + .expect("`keys` must be a sequence") + .iter() + .map(|value| { + PrivateKey::::from_str(value.as_str().expect("private key must be a string")) + .expect("invalid private key") + }) + .collect::>(), }; // Extract the test cases from the config. From 47355a52b95345e9a3df75adbdf97bee8b17bc47 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu Date: Thu, 26 Oct 2023 19:59:36 -0400 Subject: [PATCH 054/339] Regen expectations --- .../src/stack/finalize_types/initialize.rs | 2 +- .../arrays_in_finalize.out | 14 +++++----- .../execute_and_finalize/child_and_parent.out | 24 ++++++++-------- .../complex_finalization.out | 14 +++++----- .../vm/execute_and_finalize/count_usages.out | 16 +++++------ .../vm/execute_and_finalize/hello.out | 28 +++++++++---------- .../mapping_operations.out | 24 ++++++++-------- .../execute_and_finalize/mint_and_split.out | 6 ++-- .../no_import_external_read_fail.out | 3 ++ .../execute_and_finalize/program_callable.out | 16 +++++------ .../vm/execute_and_finalize/public_wallet.out | 8 +++--- .../vm/execute_and_finalize/test_branch.out | 18 ++++++------ .../vm/execute_and_finalize/test_rand.out | 26 ++++++++--------- .../vm/execute_and_finalize/timelock.out | 12 ++++---- .../unknown_external_mapping_fail.out | 3 ++ .../unknown_mapping_fail.out | 3 ++ .../execute_and_finalize/unused_position.out | 6 ++-- .../vm/execute_and_finalize/user_callable.out | 8 +++--- 18 files changed, 120 insertions(+), 111 deletions(-) create mode 100644 synthesizer/tests/expectations/vm/execute_and_finalize/no_import_external_read_fail.out create mode 100644 synthesizer/tests/expectations/vm/execute_and_finalize/unknown_external_mapping_fail.out create mode 100644 synthesizer/tests/expectations/vm/execute_and_finalize/unknown_mapping_fail.out diff --git a/synthesizer/process/src/stack/finalize_types/initialize.rs b/synthesizer/process/src/stack/finalize_types/initialize.rs index eae60281de..db664b0a0d 100644 --- a/synthesizer/process/src/stack/finalize_types/initialize.rs +++ b/synthesizer/process/src/stack/finalize_types/initialize.rs @@ -303,7 +303,7 @@ impl FinalizeTypes { } // Ensure the current program contains an import for this external program. if !stack.program().imports().keys().contains(program_id) { - bail!("External program '{locator}' is not imported by '{program_id}'."); + bail!("External program '{program_id}' is not imported by '{}'.", stack.program_id()); } // Retrieve the program. let external = stack.get_external_program(program_id)?; diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/arrays_in_finalize.out b/synthesizer/tests/expectations/vm/execute_and_finalize/arrays_in_finalize.out index 24082f1b13..2f99747752 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/arrays_in_finalize.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/arrays_in_finalize.out @@ -4,15 +4,15 @@ outputs: execute: arrays_in_finalize.aleo/test_arrays: outputs: - - '{"type":"public","id":"7478840637674867348334152936830348927618689666735497694442760373406118031677field","value":"[\n [\n true,\n false,\n true,\n false\n ]\n]"}' - - '{"type":"public","id":"5497626638973564164115408441431072571251727387638555124557359358862572601150field","value":"[\n [\n false,\n true,\n false,\n true\n ]\n]"}' - - '{"type":"public","id":"6826141182633851685078476561830773249264254215146313720362967764421378578986field","value":"[\n [\n false,\n false,\n false,\n false\n ]\n]"}' - - '{"type":"private","id":"8090041184628455649123912475425661970245522643231603870408821235652148265153field","value":"ciphertext1qvq9rlleav6excsnqaep0h3cztdzpergd8pdrhnrhapvr49kfrws6zwarcw9rxh9q3g0v8e5dutwyw34qslkjeqx6jzexjt2qrthnnazqerfvaxj939casntsm62yke9djhnked6nv4mufg8rmh27macnejpzdgpy4a"}' - - '{"type":"future","id":"3563270012340942054693097512832513108146970497297480667692085200645102263926field","value":"{\n program_id: arrays_in_finalize.aleo,\n function_name: test_arrays,\n arguments: [\n [\n [\n true,\n false,\n true,\n false\n ]\n],\n [\n [\n false,\n true,\n false,\n true\n ]\n]\n ]\n}"}' + - '{"type":"public","id":"8423501051492945494142580898503776230777967039101310769883569628562838106961field","value":"[\n [\n true,\n false,\n true,\n false\n ]\n]"}' + - '{"type":"public","id":"6373810658910535946682884531888342268371302467625666065790785860646654788892field","value":"[\n [\n false,\n true,\n false,\n true\n ]\n]"}' + - '{"type":"public","id":"3091501445020687319877822274133758457934608796618645756988915091755405157586field","value":"[\n [\n false,\n false,\n false,\n false\n ]\n]"}' + - '{"type":"private","id":"6526736422839961003683955650152924988761580233649162767954364194151255194053field","value":"ciphertext1qvqr73dv3clq8jtx7trf8k9l3eshmh0tyvvp2ta7a0y3pedjj99eczrpwk6045wektcw7mmjzdrm8f67x7egd4dfch3slf4q6ag3lxn0p6cryuecunyl2d9ffr8ntj57dvmv9rg7fhlrtc995w2ruju7j20qgndw85u"}' + - '{"type":"future","id":"5831343183208330086568343850686282945376722092994016952161543991067519254136field","value":"{\n program_id: arrays_in_finalize.aleo,\n function_name: test_arrays,\n arguments: [\n [\n [\n true,\n false,\n true,\n false\n ]\n],\n [\n [\n false,\n true,\n false,\n true\n ]\n]\n ]\n}"}' speculate: the execution was accepted add_next_block: succeeded. additional: - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"2876640636542307658613598456059435130048160510932350003072343205416101435931field","checksum":"5890120327829713381983131988174812000986785644250446148915207626096694862906field","value":"record1qyqspqjnxve39nks4yt3u86vm4xek0q865ggt2x8c8k3at2heq5h9aq9qyxx66trwfhkxun9v35hguerqqpqzqyand8c8jqhkwckph93y0px07mp29ntdxa39egxwxg7rh8p6dcsq83r778w0c6vrawc9c46ueepj7l6793xm98xu82fjfnd2hfsc6ususdswdj"}' + - '{"type":"future","id":"611935698929626281656171069026748974326705967123466685855354594539166326131field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1y9t0y4lvhm43qdzlfjmfzh8985vfnx9ms368p07x5lsemet5ey8qt0ssjn,\n 21758u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/child_and_parent.out b/synthesizer/tests/expectations/vm/execute_and_finalize/child_and_parent.out index a33be90307..919b9291a5 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/child_and_parent.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/child_and_parent.out @@ -4,30 +4,30 @@ outputs: execute: child.aleo/foo: outputs: - - '{"type":"public","id":"4279509780486643035080626777023973066084837379094817161797996960689084569794field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' - - '{"type":"public","id":"4408001848080504344165436121252640202617322612254005793329268580869751931263field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"389051587023874025297792889573178986947322645231926608183742711950919559411field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"764027935495423951991221261588244508770271800988614802602832277026356994499field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' speculate: the execution was accepted add_next_block: succeeded. - verified: true execute: parent.aleo/foo: outputs: - - '{"type":"public","id":"2289465818952696893871478441544321507584149448701746210208386693335929733331field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' - - '{"type":"public","id":"7559709455224489102027191317638535668729648748642786204592894303802312565285field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' - - '{"type":"public","id":"3386671048315419571612162210626560184351583831974432673683170066362200712484field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' - - '{"type":"public","id":"377315782189483434546519951474821036179425135984541742851362035377982852007field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"1750346614465839730584856482412734170916382156473722062953642664481181629739field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' + - '{"type":"public","id":"5344219132331075098560420486516441520509044320380266746188928734352154985147field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"1573682489501842474093724226520469727912427938089152276506875941161556613092field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"5522952276718822387440091782615844704170996655370860689760310532706413315373field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' speculate: the execution was accepted add_next_block: succeeded. additional: - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"7306036686667087636279947507997825407084203811048562802739660291735242744444field","checksum":"7132981897182131254956763451386939918007763262893522220397577775796699535598field","value":"record1qyqsqx586v4tjhcdgtvpat2cmz7ztzd7drzm5c04gyeaxqmujgv7ucq3qyxx66trwfhkxun9v35hguerqqpqzqx4pcwh0jc37snpu02y8ujwh2u327ghc6yaeeyc4k74e56uvuhqp0tpta5q5eppwa48pq9eepyuln9ct5qth57klqzf67ewyqn9hresxwalp5l"}' + - '{"type":"future","id":"6557860754730668406004469054379794576334242764827542178306889009454484547032field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx,\n 1244u64\n ]\n}"}' - child_outputs: child.aleo/foo: outputs: - - '{"type":"public","id":"994990058621570799386345097567825463488929977263218477287025824851872546446field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' - - '{"type":"public","id":"2256104170911230762284986427287133867149405204422634231010917189963141359010field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' - credits.aleo/fee_private: + - '{"type":"public","id":"2459501703788162014390032218062615187041680109741533589876416940768900522799field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' + - '{"type":"public","id":"4059102611680484817772932189626681723346184344473090391520905329315796272971field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"3845927395044855364546905308732895913294823927145229411137666358260055754822field","checksum":"1584433976273241291707799637296934525591046977180320555626848307441674321598field","value":"record1qyqsp3c590shnra6j8rc3ezq5k229gcd8srjpxpf2vn7drkccmrq8tqrqyxx66trwfhkxun9v35hguerqqpqzq9m2h242d3v2sm53yzkqkuu6v2cwaz0jpq7nseh2uxqedph6gz9pmsvcdfnpn0htvu2lvx9cpvs6sssvhj972rpakkdzjmj4n7fhwhs6fjpcap"}' + - '{"type":"future","id":"6934683053495529076879804638371439764251999038469408002617655045734104381794field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx,\n 2123u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/complex_finalization.out b/synthesizer/tests/expectations/vm/execute_and_finalize/complex_finalization.out index 62b00223bd..16fed64edf 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/complex_finalization.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/complex_finalization.out @@ -4,23 +4,23 @@ outputs: execute: four_program.aleo/a: outputs: - - '{"type":"future","id":"6974972465287288859193039603112863165703788123799484516917687492504306829310field","value":"{\n program_id: four_program.aleo,\n function_name: a,\n arguments: [\n {\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: three_program.aleo,\n function_name: e,\n arguments: [\n {\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' + - '{"type":"future","id":"7070877344843470845071680218340128414876561588663484899722739079133777261690field","value":"{\n program_id: four_program.aleo,\n function_name: a,\n arguments: [\n {\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: three_program.aleo,\n function_name: e,\n arguments: [\n {\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' speculate: the execution was accepted add_next_block: succeeded. additional: - child_outputs: zero_program.aleo/c: outputs: - - '{"type":"future","id":"6952696836717992189844193836164206763601783392883300349164619423689411832957field","value":"{\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' + - '{"type":"future","id":"868980695576387061465481340013995581415399669646103119988420471982198353684field","value":"{\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' one_program.aleo/d: outputs: - - '{"type":"future","id":"3375358791246667464469024643039205630228640255715459354259647324302115771724field","value":"{\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' + - '{"type":"future","id":"7019513656735375987781202584670889731433817481734857255379784812609399295012field","value":"{\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' two_program.aleo/b: outputs: - - '{"type":"future","id":"364582187421035500339943835636532028870700065252111564274460853535036892560field","value":"{\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' + - '{"type":"future","id":"3159380222510695027024010240323042120907966737357325980281186387999863524975field","value":"{\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' three_program.aleo/e: outputs: - - '{"type":"future","id":"5353639949292491626228591653810953466693160316414035702266036019526362677427field","value":"{\n program_id: three_program.aleo,\n function_name: e,\n arguments: [\n {\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' - credits.aleo/fee_private: + - '{"type":"future","id":"2107445810553019850887004032370986179841471500877564050507038295661575797827field","value":"{\n program_id: three_program.aleo,\n function_name: e,\n arguments: [\n {\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"5283229445241909733017633528975572727346436141849413233403355092851851760389field","checksum":"799210811176292053431285281723859450131511292642705172333396010564735450437field","value":"record1qyqsqkme4g74y49w7v70p63ywtq5nate5r75dk8m05ss5zmer5zeqrggqyxx66trwfhkxun9v35hguerqqpqzqx2jzxmtf2rksjtwnl4xz5uu33vh0hdl5gys60lw5tdywm6w864qpzvzv6t35yczkzxqpeh7ckc5wtmt5sxynlcz9fy5ellqapnz8squlrzfgw"}' + - '{"type":"future","id":"1237672223493374809326586125815613616482431271830981051687054520069740484800field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8,\n 1312883u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/count_usages.out b/synthesizer/tests/expectations/vm/execute_and_finalize/count_usages.out index 3a80e7786a..7933b15076 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/count_usages.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/count_usages.out @@ -4,20 +4,20 @@ outputs: execute: count_usages.aleo/add_and_subtract: outputs: - - '{"type":"private","id":"5938418890955443794463293173052677473396802601178583117662009125510762112385field","value":"ciphertext1qyqwvmg8ce9sq5ewccjlade56hhmxk4d4j9ec48up7d3mk9q4gwtqzc5kd8jk"}' - - '{"type":"future","id":"5461514865984769926527447907140509355062580300320347542454721592100955559616field","value":"{\n program_id: count_usages.aleo,\n function_name: add_and_subtract,\n arguments: [\n {\n program_id: basic_math.aleo,\n function_name: add_and_count,\n arguments: [\n aleo1mrughg5ssadd9fc2uwve7l6u24xn76kyz24zsjtzta03vgkq4vpqggl6fg\n ]\n },\n {\n program_id: basic_math.aleo,\n function_name: sub_and_count,\n arguments: [\n aleo1mrughg5ssadd9fc2uwve7l6u24xn76kyz24zsjtzta03vgkq4vpqggl6fg\n ]\n }\n \n ]\n}"}' + - '{"type":"private","id":"3123182017432916757124403751790889348245620410758014315114714729237515860473field","value":"ciphertext1qyqwsyyjjx85zuu3rh9ujc7lt33dgqj28xcpxa5vz0uscttkelcm2yglca4ja"}' + - '{"type":"future","id":"3075184327471252279705776826446991266718083739660015565935642091055852740382field","value":"{\n program_id: count_usages.aleo,\n function_name: add_and_subtract,\n arguments: [\n {\n program_id: basic_math.aleo,\n function_name: add_and_count,\n arguments: [\n aleo1mrughg5ssadd9fc2uwve7l6u24xn76kyz24zsjtzta03vgkq4vpqggl6fg\n ]\n },\n {\n program_id: basic_math.aleo,\n function_name: sub_and_count,\n arguments: [\n aleo1mrughg5ssadd9fc2uwve7l6u24xn76kyz24zsjtzta03vgkq4vpqggl6fg\n ]\n }\n \n ]\n}"}' speculate: the execution was accepted add_next_block: succeeded. additional: - child_outputs: basic_math.aleo/add_and_count: outputs: - - '{"type":"private","id":"2189963205002380951731804610675645921799015755766185151265166514396381689207field","value":"ciphertext1qyqwpu5p92d4lrcfhthx0emqpj6cldsty3ghv6mhztl69wyk7j42cpqpq2uaz"}' - - '{"type":"future","id":"1762068320811124981245699286589805951610339834807816585249322967070273785765field","value":"{\n program_id: basic_math.aleo,\n function_name: add_and_count,\n arguments: [\n aleo1mrughg5ssadd9fc2uwve7l6u24xn76kyz24zsjtzta03vgkq4vpqggl6fg\n ]\n}"}' + - '{"type":"private","id":"2687119938526671223430712275520099287526474990567687943355031309835685603554field","value":"ciphertext1qyqp0gkmren9kcflhxpg3v9e2cw97um7lu4tfwuh7w5h5nk4mpvjjpquaydnu"}' + - '{"type":"future","id":"4247717008565083288734190529633596823232122291180671236322823911170152094500field","value":"{\n program_id: basic_math.aleo,\n function_name: add_and_count,\n arguments: [\n aleo1mrughg5ssadd9fc2uwve7l6u24xn76kyz24zsjtzta03vgkq4vpqggl6fg\n ]\n}"}' basic_math.aleo/sub_and_count: outputs: - - '{"type":"private","id":"3237068809383979468892967123729721371250496145349751597456577370896562797315field","value":"ciphertext1qyqrqc0329zggejxfkdju3e5ng8cahudh6gmmwcu9kvhp2x784lrqqgfua69p"}' - - '{"type":"future","id":"4237975671848212071086918441612015189870459327089330453971374309755212325698field","value":"{\n program_id: basic_math.aleo,\n function_name: sub_and_count,\n arguments: [\n aleo1mrughg5ssadd9fc2uwve7l6u24xn76kyz24zsjtzta03vgkq4vpqggl6fg\n ]\n}"}' - credits.aleo/fee_private: + - '{"type":"private","id":"7992464697490466293984943598604231412571016633865588345761260178196099457747field","value":"ciphertext1qyqxeag0ujtnn39yp0x9qryt77fkcklyc466cp3l7g8wgt4524jngzqz5ask9"}' + - '{"type":"future","id":"6594089907002769296322737141374301940875927088813929000246625002187630516842field","value":"{\n program_id: basic_math.aleo,\n function_name: sub_and_count,\n arguments: [\n aleo1mrughg5ssadd9fc2uwve7l6u24xn76kyz24zsjtzta03vgkq4vpqggl6fg\n ]\n}"}' + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"3873686337596264307426391445386469102660995373532676522475799639542084414660field","checksum":"2174613677640073315115047311154070353095418041185484773007639715599946288810field","value":"record1qyqsq758xfnepvvywvf4tjnve5qkfr0hur7gttevq66hpvl97ulxzkgyqyxx66trwfhkxun9v35hguerqqpqzq85ufcypfdv6unklsc9m066e86drkzx32yzj9kwx7enflqv7j6xqz5v6hx0r0qp5r564yuanadwjkhvx4tj3xp407hh058jl7u0v9qq2z6nqqz"}' + - '{"type":"future","id":"1724410343181243501519372165830316719575121816257937877011429517054089311771field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8,\n 263392u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/hello.out b/synthesizer/tests/expectations/vm/execute_and_finalize/hello.out index 7c1f6e99ba..4ee4b5c467 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/hello.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/hello.out @@ -4,46 +4,46 @@ outputs: execute: hello.aleo/hello: outputs: - - '{"type":"private","id":"8125348741943322686009907907811782653304283628858249042666480861925372544888field","value":"ciphertext1qyqzh0ww4d529sp24xw2c0ek9p3mlh5amc8rlzhudhw6u4e6h9ffuzc4xu63n"}' + - '{"type":"private","id":"6254379462913920094060616443827416926361791013133233839133894947200598009041field","value":"ciphertext1qyqpmnatnq3sjej6qves695qtxu5r6lqnfnx8ck87ce3pez28x90qzgzeh4qh"}' speculate: the execution was accepted add_next_block: succeeded. - verified: true execute: hello.aleo/hello: outputs: - - '{"type":"private","id":"4190523942746941151788535679482167833023294290248250731893857652327309412596field","value":"ciphertext1qyqg0dpeew6mjk7zgcw423k99k74k5nnqpshnjsjvjezfqsfel7q6pq9k0ny2"}' + - '{"type":"private","id":"4161183151518570414349285932182760288961689691043823886807644299644687930091field","value":"ciphertext1qyqreg8a27jzsgm7m5umh98nr9nwyxhkv3aus5htm6vepdkr67zh5zqc4uzpd"}' speculate: the execution was accepted add_next_block: succeeded. - verified: true execute: hello.aleo/goodbye: outputs: - - '{"type":"public","id":"6479967549102698786501355579286201653159194507767944415639092049192937228124field","value":"1u32"}' - - '{"type":"future","id":"3413333273447015937668991532824129740236214843152627847347248311711336145614field","value":"{\n program_id: hello.aleo,\n function_name: goodbye,\n arguments: [\n 1u32,\n 1u32\n ]\n}"}' + - '{"type":"public","id":"5242826180235740795678885917758843199455932502638973701040836238216490364326field","value":"1u32"}' + - '{"type":"future","id":"5032744372214352919665806641360511690042524830912111693095233654380228978511field","value":"{\n program_id: hello.aleo,\n function_name: goodbye,\n arguments: [\n 1u32,\n 1u32\n ]\n}"}' speculate: the execution was accepted add_next_block: succeeded. - verified: true execute: hello.aleo/goodbye: outputs: - - '{"type":"public","id":"626299501033028507774181248923989773544577830656010087029558433445349806993field","value":"1u32"}' - - '{"type":"future","id":"3565307659242500881563819123626548100763518079205528385426399960688796421686field","value":"{\n program_id: hello.aleo,\n function_name: goodbye,\n arguments: [\n 0u32,\n 1u32\n ]\n}"}' + - '{"type":"public","id":"5954748469306089505201665920330448486455515953532955699388262149494774760375field","value":"1u32"}' + - '{"type":"future","id":"4063241715105271542572794266017703704121932214929814829482077839560118863776field","value":"{\n program_id: hello.aleo,\n function_name: goodbye,\n arguments: [\n 0u32,\n 1u32\n ]\n}"}' speculate: the execution was rejected add_next_block: succeeded. additional: - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"1563962924137405178742221846132647984424532842613103093908307558260562727180field","checksum":"5823248983705197503554751176880028590763810324036946942686008195006386919883field","value":"record1qyqsqxplm7g9hnkv0kecp0qyzpcmqssafmu3l63n3rasf5tqn9mg95qxqyxx66trwfhkxun9v35hguerqqpqzqq6096l6jlnt6yw20wxxh5vz8hnau7v7zh0lhgg58t7330fzx2jzqucjp2scympk3qapejn5adphf7vcznjr0h3ar76peu3f74d8jess2usmfv"}' + - '{"type":"future","id":"5633762070565015506869877991983247311752566772551740661334199093127666173285field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo10knkelvnd55fsaarm25wch7p9suf2tqlgwy5k4nxwms6d262xyfqm2tccr,\n 1285u64\n ]\n}"}' - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"7418640687872332228724490929058573679078624012230582886849419189302370026910field","checksum":"2288322295066553762968656723772741917161404143341855080238665799645378480682field","value":"record1qyqsq2qp0m80sqnsgn4fdmpwfx7tgwh4cr9nvlejg2arkrn2u43qhpq0qyxx66trwfhkxun9v35hguerqqpqzqx7606fvtdu7h2zqjjxpmn9lhux5ys0hqqlltf2w62p7ukkddhyzpflcm4xfrg65m6y0c6g3xyg5ax25zq7kl5ea269mzpd9m86fz5qk6fhd5c"}' + - '{"type":"future","id":"4168535226825329132770722118865464284070271653060849404506023921600553004505field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo10knkelvnd55fsaarm25wch7p9suf2tqlgwy5k4nxwms6d262xyfqm2tccr,\n 1285u64\n ]\n}"}' - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"3460880420858965334724667101702159478601299033919299770846136229938204873952field","checksum":"889185695775021282240580382339319659491334542311157511499897352194166769728field","value":"record1qyqsqgg555pvesq2ss8kth990hv0qsfd7d4k9td00tufe3qzufxdsmsgqyxx66trwfhkxun9v35hguerqqpqzqr95x0pv0jygxkd7txgx8h34sfeducq4vjwvcsfjvn2xe55vht8zzxn40ssvl4eyvd9y3wj2qy47alyc69m0tkftmeuzrvnh6jqupkq20gsf5e"}' + - '{"type":"future","id":"7264507997475302694771209211625280132862970630053323876707987175500028146955field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo10knkelvnd55fsaarm25wch7p9suf2tqlgwy5k4nxwms6d262xyfqm2tccr,\n 5334u64\n ]\n}"}' - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"1053040319405423319885581476153506668871260904872026627338166884076666293995field","checksum":"3137133192027913702130513124530902338448032734519979527965593396128027839095field","value":"record1qyqsphyrpqq85txdn28cakkhasnrc5nfw5devjsmmhj3jdgm3eg80nqyqyxx66trwfhkxun9v35hguerqqpqzqyfnegh56dljl46e5p06q86e8fv844xepww7c9rldherdj9l6r0zgvu7qj26zt906m3htewsu4plawunfac2e7vjpre58sqte2n29rs7zaue0v"}' + - '{"type":"future","id":"2296589459402270097535149680764663519350069575816165257148428557434644368237field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo10knkelvnd55fsaarm25wch7p9suf2tqlgwy5k4nxwms6d262xyfqm2tccr,\n 5334u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/mapping_operations.out b/synthesizer/tests/expectations/vm/execute_and_finalize/mapping_operations.out index 4bdf331e05..6b2773e6cf 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/mapping_operations.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/mapping_operations.out @@ -4,44 +4,44 @@ outputs: execute: mapping_operations.aleo/empty_remove: outputs: - - '{"type":"future","id":"7291478973311998196889109284965727070006803821552839308760042614138648979276field","value":"{\n program_id: mapping_operations.aleo,\n function_name: empty_remove,\n arguments: [\n 10u8\n ]\n}"}' + - '{"type":"future","id":"7635640739633293853436744163909014640199975942090334368682977334784204769011field","value":"{\n program_id: mapping_operations.aleo,\n function_name: empty_remove,\n arguments: [\n 10u8\n ]\n}"}' speculate: the execution was accepted add_next_block: succeeded. - verified: true execute: mapping_operations.aleo/insert_contains_remove: outputs: - - '{"type":"future","id":"8125199181008624196820150111927204421834678204873633176936287270742730215646field","value":"{\n program_id: mapping_operations.aleo,\n function_name: insert_contains_remove,\n arguments: [\n 0u8,\n 0u8\n ]\n}"}' + - '{"type":"future","id":"2222820579352641087756930842916349134795974577897148450258189134473958563715field","value":"{\n program_id: mapping_operations.aleo,\n function_name: insert_contains_remove,\n arguments: [\n 0u8,\n 0u8\n ]\n}"}' speculate: the execution was accepted add_next_block: succeeded. - verified: true execute: mapping_operations.aleo/insert_contains_remove: outputs: - - '{"type":"future","id":"564988137123189827911719500643390438805066632168511094429444048054438194661field","value":"{\n program_id: mapping_operations.aleo,\n function_name: insert_contains_remove,\n arguments: [\n 0u8,\n 0u8\n ]\n}"}' + - '{"type":"future","id":"7976126249407457464284575267611007374057326939931567034459595303517614384513field","value":"{\n program_id: mapping_operations.aleo,\n function_name: insert_contains_remove,\n arguments: [\n 0u8,\n 0u8\n ]\n}"}' speculate: the execution was accepted add_next_block: succeeded. - verified: true execute: mapping_operations.aleo/insert_contains_remove: outputs: - - '{"type":"future","id":"1504983850261979002191664940947948558038660291110914628083356222450379989621field","value":"{\n program_id: mapping_operations.aleo,\n function_name: insert_contains_remove,\n arguments: [\n 0u8,\n 1u8\n ]\n}"}' + - '{"type":"future","id":"7584999017838461056060100707559452462656710499900127442904227073384510302747field","value":"{\n program_id: mapping_operations.aleo,\n function_name: insert_contains_remove,\n arguments: [\n 0u8,\n 1u8\n ]\n}"}' speculate: the execution was accepted add_next_block: succeeded. additional: - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"2982975415914840620507158319258878944269906877410766878798891082463802016242field","checksum":"3862090753639563234029083871874631115872354449378325601192947833837837297501field","value":"record1qyqsp3p5w845k0nmwmlwau7zavphxns6rh9nw8tg83ds0cjx2hnmj6qdqyxx66trwfhkxun9v35hguerqqpqzqzfd6xh2zdl25cwy9evykj9s6p90xys775fwzrqws8qn9g44lzfqn3e4cam6huahmz49k20vnssfjs25f4v0huxlpklc0wnyvredep3y4w6r94"}' + - '{"type":"future","id":"3701652920213282423281084685169254121653756184853703028504071363673532942725field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1eakarna6a70pg9r0l9qal20faejwctgur5xt7lnc2a42wj2yssfqc89rk8,\n 11245u64\n ]\n}"}' - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"48072890610857571956763071582832119607215592326496047104336441787173630868field","checksum":"7467290380261150018279273531628821954702770589524221500078644428102363349374field","value":"record1qyqsqh45sake5ld7mknnvq6gqz4fnpx5trzu6lmhsfxejf69pm8hfaqpqyxx66trwfhkxun9v35hguerqqpqzqxdhy98teyfl6uz9j434zhapesfd8s9zggu6wmcw8cjuyscgnq9px7a3r4uf4udc98zwvfksj4nqv8ckf0wv8lj6l35zdtm0l7gx6vswyvq76a"}' + - '{"type":"future","id":"767852843394263062723803642109980847781175859546892255347263461730875281315field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1eakarna6a70pg9r0l9qal20faejwctgur5xt7lnc2a42wj2yssfqc89rk8,\n 154810u64\n ]\n}"}' - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"4110917071309386297883198571995053247696762203282665069271948556795502494816field","checksum":"5208736060122533898058377411292933064659147009969289502970426241558725961052field","value":"record1qyqspe5yr7j2nej3pg4jr9gd6fn9uzu27gfy29aj3g5spc32tr2dqksqqyxx66trwfhkxun9v35hguerqqpqzq8tq90g30z3r0ll9ffn36cwtwvwmugnh4yak6afr264lzzw3lg4p7dfeqfwzqzuuw084ym2km0um206l4s9lkmw29w4499r422uvy3q6dvnd32"}' + - '{"type":"future","id":"5831877738131393412656336446760308055442933218729238434398743654782252530700field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1eakarna6a70pg9r0l9qal20faejwctgur5xt7lnc2a42wj2yssfqc89rk8,\n 154810u64\n ]\n}"}' - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"127003451731600147843337554003537999361398270748193639437833213734975434703field","checksum":"6199041391391566355775171236268799936285239125918398783413624959865612791864field","value":"record1qyqsq3cmtcjcws6hmecvz7wswnhgulm8clv7tjvsnjdrgncamj4sqcqpqyxx66trwfhkxun9v35hguerqqpqzq993fr433kwql98qu7wh083fwed69wt9pk5ftg9cldvymz2eyk9pg8366sccu0as9vjnt0y4nxuw6mzm3g3f4ckjf2q2mkaasy0w0cs634pjhl"}' + - '{"type":"future","id":"3924911723698610328779426182874581891939297874519691347932588542992608923909field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1eakarna6a70pg9r0l9qal20faejwctgur5xt7lnc2a42wj2yssfqc89rk8,\n 154810u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/mint_and_split.out b/synthesizer/tests/expectations/vm/execute_and_finalize/mint_and_split.out index 91264a79a7..bd63f8cfca 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/mint_and_split.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/mint_and_split.out @@ -4,15 +4,15 @@ outputs: execute: mint_and_split.aleo/mint: outputs: - - '{"type":"record","id":"7636508513753843688255477046613755926717864376364314808857555307422986366583field","checksum":"2724303349197854838397688958932042996013299317300510410551052639216931686578field","value":"record1qyqspznunw4usdtcqwznvpm3f73dlfxcmg07emews5rxsvfp8jelaqs3qyxx66trwfhkxun9v35hguerqqpqzqqjmj4kl3w0fh0dhqy67c47xgw7ftfdkhplztykwwr7mgnn8cm3q50aufvdjh84e3325vgsq98uzgdxyscfrymgz6j5p6txj0u06ngskkug8kd"}' + - '{"type":"record","id":"7334558502140616765536611609313499148179717945955456292257315684677266501449field","checksum":"281154250604636828435706866945909260040573817788279288153963030037316744168field","value":"record1qyqsp9pr7qlgedcywvyk5lsnpuqpepyuv9hseec63eacjpn8d0rpmwgsqyxx66trwfhkxun9v35hguerqqpqzq9ql0hu0da6wuzrm0a7ms3kfvj5279e43rulstm9plhzs0z0xe6p52cn7pdz7x5hkwhz905kp56f4fuq08k9maf57qteekdv9yddk8sqxq4d98"}' speculate: the execution was accepted add_next_block: succeeded. - execute: Commitment '1266307482263846358970326041806201638141701138269282465033372005968041137990field' does not exist - execute: Input record for 'mint_and_split.aleo' must belong to the signer additional: - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"6034384869866160676195114971378149013303703779101829835678240523345757814679field","checksum":"685010203971891455492083289280654319079811728620135209391715861377156619685field","value":"record1qyqspmum93lsptda6cxy2934329jud5j5d2w974qj980uzacuurkteq0qyxx66trwfhkxun9v35hguerqqpqzq95n3clh78n7alksrkrcwvf0kc5qeej4mmudqf57t7mqt08jd97p4nq3txxlzvtf3hsf093raynhzylqxz8vscq22pc2qaryw7r3qms7wmxm6s"}' + - '{"type":"future","id":"2224596965693604846363254284152512550549945382876106932610187515185636813504field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo19e6k5ferx3k8a9k79xtj4uuaztt2jl4eza7k43pygsu977yazypqqwdmw6,\n 1414u64\n ]\n}"}' - {} - {} diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/no_import_external_read_fail.out b/synthesizer/tests/expectations/vm/execute_and_finalize/no_import_external_read_fail.out new file mode 100644 index 0000000000..817f9c7e2f --- /dev/null +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/no_import_external_read_fail.out @@ -0,0 +1,3 @@ +errors: +- 'Failed to run `VM::deploy for program relay.aleo: External program ''registry.aleo'' is not imported by ''relay.aleo''.' +outputs: [] diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/program_callable.out b/synthesizer/tests/expectations/vm/execute_and_finalize/program_callable.out index 150420a0fa..17a70a1d39 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/program_callable.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/program_callable.out @@ -5,10 +5,10 @@ outputs: execute: parent.aleo/foo: outputs: - - '{"type":"public","id":"232678181145630788399983360361981778077854318297598920122679715355556018707field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' - - '{"type":"public","id":"307885753616111794499278513815755325774421253222438014088047291626146246158field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' - - '{"type":"public","id":"1260075966251215032940540134753397347255605556303289668063307322367655594483field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' - - '{"type":"public","id":"6132019643538827223159216821616255691562939708927702036224235366852272625285field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"2113639263284598783237184890483589485263377586770518008730201564727239039871field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' + - '{"type":"public","id":"7678040084911633492076681690048450077835769459926508481383981892807233674714field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"4672581957597248464578193953626136889647685708065995338030805320939951875503field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"5713124416526318631344949557472532527559170952243278345561593407764623253620field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' speculate: the execution was accepted add_next_block: succeeded. additional: @@ -16,8 +16,8 @@ additional: - child_outputs: child.aleo/foo: outputs: - - '{"type":"public","id":"5601132905719769837487481041811167147031721408864816226961174115045250639394field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' - - '{"type":"public","id":"4866955403610457225216600968672882719581841491915839063024906456611968828355field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' - credits.aleo/fee_private: + - '{"type":"public","id":"6570086835149819439219303224003492878705751026121012692011734299993965867007field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' + - '{"type":"public","id":"2866009676898789345591427281882170655806617413858789892357234972821058149651field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"3405674025766329369434309421947987188809020226610822755338621799001328840366field","checksum":"2290293865028149494249499535633241867489656506924610383724277827943521435010field","value":"record1qyqsq8u5n9rn77xzqqemfr60lr5gd0kl3kmcr8y4kvf34rtxkn5jzhsyqyxx66trwfhkxun9v35hguerqqpqzqyhetu9jy8vsyeaqsq5thyrj7nldd626s0fgatwpffv5j3hecq6p7pkx5xqz4xfcrlu8u2tz8hew0wuagx3cc0wgzlq7uhr2lrc35nqy7dgy47"}' + - '{"type":"future","id":"2015747658045377273535220569098051012671760616560705166778921345457847058512field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx,\n 2123u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/public_wallet.out b/synthesizer/tests/expectations/vm/execute_and_finalize/public_wallet.out index 83bd95ab4c..1276dd48c4 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/public_wallet.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/public_wallet.out @@ -4,14 +4,14 @@ outputs: execute: public_wallet.aleo/init: outputs: - - '{"type":"future","id":"643313357591837098160410683436104757275790983408765054797072865390269356548field","value":"{\n program_id: public_wallet.aleo,\n function_name: init,\n arguments: [\n {\n program_id: token.aleo,\n function_name: mint_public,\n arguments: [\n aleo1sry3pke49ykrf0aeshf889tr98r4c86p5f4ms766795ssdwfdyqq9jdg0j,\n 10u64\n ]\n }\n \n ]\n}"}' + - '{"type":"future","id":"2740109864087873652477151933781698204925175410187376817867987810696050546048field","value":"{\n program_id: public_wallet.aleo,\n function_name: init,\n arguments: [\n {\n program_id: token.aleo,\n function_name: mint_public,\n arguments: [\n aleo1sry3pke49ykrf0aeshf889tr98r4c86p5f4ms766795ssdwfdyqq9jdg0j,\n 10u64\n ]\n }\n \n ]\n}"}' speculate: the execution was accepted add_next_block: succeeded. additional: - child_outputs: token.aleo/mint_public: outputs: - - '{"type":"future","id":"4537627763763327286502315223758961709385837795977680378235435937164895010454field","value":"{\n program_id: token.aleo,\n function_name: mint_public,\n arguments: [\n aleo1sry3pke49ykrf0aeshf889tr98r4c86p5f4ms766795ssdwfdyqq9jdg0j,\n 10u64\n ]\n}"}' - credits.aleo/fee_private: + - '{"type":"future","id":"3687815127788961249655268422309693065088885703875160126919606715756865244929field","value":"{\n program_id: token.aleo,\n function_name: mint_public,\n arguments: [\n aleo1sry3pke49ykrf0aeshf889tr98r4c86p5f4ms766795ssdwfdyqq9jdg0j,\n 10u64\n ]\n}"}' + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"5907104904483017944370886525724321520913422122645092211228240860024172441663field","checksum":"5028009166132212399635589181092346921835371600420834084268447856042439491field","value":"record1qyqspshxjatwcdkrde0m2rspsm338q8p7s4eru9m8ftjqzf0ttxpkag0qyxx66trwfhkxun9v35hguerqqpqzqqzvfyzxfn5qlq5aewnafp8z576qvqjjx9pup92f6dxywga9qdupchalpjgkqrwva74ssnqjqgewu8xwj285f0c08t6czss5lcftjhqjuazgdk"}' + - '{"type":"future","id":"4373249435479943424484888940718424132561120812144078253060284512525421799293field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1d3e2je2m2hsxwdsvntvf4jnnlj459ywfry6ch2qwrpy6l6r6yvpq8e88h5,\n 131201u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/test_branch.out b/synthesizer/tests/expectations/vm/execute_and_finalize/test_branch.out index a41aa6a4f5..7c414c0ce3 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/test_branch.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/test_branch.out @@ -4,33 +4,33 @@ outputs: execute: test_branch.aleo/run_test: outputs: - - '{"type":"future","id":"4807227403819588684031853679423924290019569164203178974904495218971849247520field","value":"{\n program_id: test_branch.aleo,\n function_name: run_test,\n arguments: [\n 1u8,\n 1u8\n ]\n}"}' + - '{"type":"future","id":"6853588955800014673009987953241306389090845327747907984198222141108269232573field","value":"{\n program_id: test_branch.aleo,\n function_name: run_test,\n arguments: [\n 1u8,\n 1u8\n ]\n}"}' speculate: the execution was rejected add_next_block: succeeded. - verified: true execute: test_branch.aleo/run_test: outputs: - - '{"type":"future","id":"6578563227874053328775488720373016284038873634029366303301076699226711812107field","value":"{\n program_id: test_branch.aleo,\n function_name: run_test,\n arguments: [\n 0u8,\n 1u8\n ]\n}"}' + - '{"type":"future","id":"7316910653703512796159979382480893246542312648132879967453276886284034879075field","value":"{\n program_id: test_branch.aleo,\n function_name: run_test,\n arguments: [\n 0u8,\n 1u8\n ]\n}"}' speculate: the execution was rejected add_next_block: succeeded. - verified: true execute: test_branch.aleo/run_test: outputs: - - '{"type":"future","id":"7508008554951635493629769098645178330945961002302110561994738513868095644109field","value":"{\n program_id: test_branch.aleo,\n function_name: run_test,\n arguments: [\n 0u8,\n 0u8\n ]\n}"}' + - '{"type":"future","id":"6402417637041760480107523094357167265585878714433227566435547816691472198663field","value":"{\n program_id: test_branch.aleo,\n function_name: run_test,\n arguments: [\n 0u8,\n 0u8\n ]\n}"}' speculate: the execution was accepted add_next_block: succeeded. additional: - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"1798938114974546684903209797369438296308320213665197846673649863916852114678field","checksum":"934572607592461135140890365283940117058051001959725525910576582297797621269field","value":"record1qyqspa9fxepth5l9c2u7gj6quuvfpq8wqc9q73p4xqcrmj2nurd7cfq3qyxx66trwfhkxun9v35hguerqqpqzqx9w072uwlffgvu0he36lya458pluymlds8kpv3shjc4asc3wy2zp3rk0fv9mhq6ja45tux30ps2x433ekqdsx967z8ysqp9fk37epqvu520r9"}' + - '{"type":"future","id":"8176559465483810586872674176090912007328770812617215482809916166686904238834field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1x3r205zqql5ywy0cqqt74k0r0htuusn0d037ycxe8ftt9ep8hyzsmqz4dh,\n 17268u64\n ]\n}"}' - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"1039543979177875951661037350337722240996003141461618829150227721443832233782field","checksum":"4293043628731843171082705656149326581514713699817730020543476948781408422008field","value":"record1qyqsqaarvryvc8vfqer4jcngz5k9wd6m4dfvwsr4tc43v8ynmc5ny2q0qyxx66trwfhkxun9v35hguerqqpqzqx2mm3lh6vu0f9pmpne0qz5rkr7g26s3et0trj673gff8klmlpqq0r5sjjjncqlvgazec63a0enrf5dfr3n7jczarf0eshvu6d0hx3sztrtu4z"}' + - '{"type":"future","id":"885516194992930770292437059317184478627651975125735363573325083543887608918field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1x3r205zqql5ywy0cqqt74k0r0htuusn0d037ycxe8ftt9ep8hyzsmqz4dh,\n 17268u64\n ]\n}"}' - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"145788756097299829231591915301155878379901156732628535292899269362119878286field","checksum":"2449429819506214589213294593178366793060498781467568604016514039430651546570field","value":"record1qyqspttnaxurc3z4pdve7697588gxr5lvrj04m93shwzhr4znh49k9gwqyxx66trwfhkxun9v35hguerqqpqzqrc35k4y2kzu7kvhksvv2yu4t5m680w5u6ykv8cnrprtvfrda27qqt3y37y87fw5crd0efl8elqad36xdqekqr3w020krmj00enuy5pzqylmsv"}' + - '{"type":"future","id":"6884773732489674095657820682011451719106395760464004244662697484163781295818field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1x3r205zqql5ywy0cqqt74k0r0htuusn0d037ycxe8ftt9ep8hyzsmqz4dh,\n 17268u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/test_rand.out b/synthesizer/tests/expectations/vm/execute_and_finalize/test_rand.out index f31addd98f..d1a041cc47 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/test_rand.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/test_rand.out @@ -4,44 +4,44 @@ outputs: execute: test_rand.aleo/rand_chacha_with_literals: outputs: - - '{"type":"future","id":"856859213363286889141859059264203066675648340843625883729021378909143418037field","value":"{\n program_id: test_rand.aleo,\n function_name: rand_chacha_with_literals,\n arguments: [\n 0scalar,\n 0group,\n 0u8,\n 2i16,\n 4u32,\n 7i64,\n 8u128,\n 10field\n ]\n}"}' + - '{"type":"future","id":"859791478012828215720348494076914719205244104520150752280307504054509554398field","value":"{\n program_id: test_rand.aleo,\n function_name: rand_chacha_with_literals,\n arguments: [\n 0scalar,\n 0group,\n 0u8,\n 2i16,\n 4u32,\n 7i64,\n 8u128,\n 10field\n ]\n}"}' speculate: the execution was accepted add_next_block: succeeded. - verified: true execute: test_rand.aleo/rand_chacha_with_struct: outputs: - - '{"type":"future","id":"2863690152286397600239869811553134445139434415556812678934084238826545926808field","value":"{\n program_id: test_rand.aleo,\n function_name: rand_chacha_with_struct,\n arguments: [\n {\n first: 0field,\n second: 0field,\n third: 0field,\n fourth: 0field,\n fifth: 0field\n}\n ]\n}"}' + - '{"type":"future","id":"1067916594854496467910772380664552622025523070198727493475463622599909707249field","value":"{\n program_id: test_rand.aleo,\n function_name: rand_chacha_with_struct,\n arguments: [\n {\n first: 0field,\n second: 0field,\n third: 0field,\n fourth: 0field,\n fifth: 0field\n}\n ]\n}"}' speculate: the execution was accepted add_next_block: succeeded. - verified: true execute: test_rand.aleo/rand_chacha_check: outputs: - - '{"type":"future","id":"5111075340000719619409954898038080805237607157543987731445343150082162501419field","value":"{\n program_id: test_rand.aleo,\n function_name: rand_chacha_check,\n arguments: [\n 0field,\n false\n ]\n}"}' - speculate: the execution was rejected + - '{"type":"future","id":"3721325135151760660773959530505944451747681933722462808964783147996869797702field","value":"{\n program_id: test_rand.aleo,\n function_name: rand_chacha_check,\n arguments: [\n 0field,\n false\n ]\n}"}' + speculate: the execution was accepted add_next_block: succeeded. - verified: true execute: test_rand.aleo/rand_chacha_check: outputs: - - '{"type":"future","id":"6632578043065250671900699630486713707508511783056688582055933257632278653469field","value":"{\n program_id: test_rand.aleo,\n function_name: rand_chacha_check,\n arguments: [\n 1field,\n true\n ]\n}"}' + - '{"type":"future","id":"887371549615679800380522845098080464570119184210350810479392117984911457950field","value":"{\n program_id: test_rand.aleo,\n function_name: rand_chacha_check,\n arguments: [\n 1field,\n true\n ]\n}"}' speculate: the execution was rejected add_next_block: succeeded. additional: - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"4381229306463692442497149670614588062764798743790588146804215330229884792339field","checksum":"2138639167265992670566199833999883133869484105738196279078647847384925584310field","value":"record1qyqsq96nqu434vyta43jksy548fdck37rc7kc34494ndwd9xfg9l7zsfqyxx66trwfhkxun9v35hguerqqpqzqp47n5hcfmt2twwyz0wm37mh898yfhr6rw79z026vpnc4v6h5sap3wxhvupx7k4p2jhrwtx5zw6r5t3vuarmsq8n4c4p987z586n6yqzjd7p7w"}' + - '{"type":"future","id":"6314628133780265670801554258125814886017405269745792760682853845340140460175field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1uchf7kruskpp8thlnfeya9qeklcjss27j6rtu74zz7ch559neqystgslsp,\n 601806u64\n ]\n}"}' - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"6586316285692512365232256556210792622636286450707813931421762885414931353832field","checksum":"1586190359159798393415585130912439326237257065208437997708789530351085560464field","value":"record1qyqsq4tq08wj70zje3dth93xhcaac25nc7szhtt8egu4h42tln3nh0crqyxx66trwfhkxun9v35hguerqqpqzq96k0cukn8schvjlnjdyf0z0r28yvnlnmpuuj4qhxpwqc8qktc8z9e93akjxefm88vhqxpv7ppqrxp6q8hpvzee72az4mx6k4553tmss23hwgr"}' + - '{"type":"future","id":"3725939744341267737290273038160661629630343114766507174134842826652488781816field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1uchf7kruskpp8thlnfeya9qeklcjss27j6rtu74zz7ch559neqystgslsp,\n 26679u64\n ]\n}"}' - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"70907903135321440406346995966772705528708353149493963813138922918859409499field","checksum":"1758155264387920852695791077636953465936690916033386407170194003924917340917field","value":"record1qyqspxy8g4khtakgjt7dk7p3ych5zhqysfp78uh7740jyr4j2q4xu3qxqyxx66trwfhkxun9v35hguerqqpqzqqfgux5pw80dc9xzk0vzklz8v7kt3szhr2h70tt8tj9c2ddgyptppsgj9uj7g0spx3uvw5l7c4ue7qgp948gjcwen4ql5u8fhj3333qjccs5hk"}' + - '{"type":"future","id":"5227003534986816857285932061757797688706802206018964764622184983760566708322field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1uchf7kruskpp8thlnfeya9qeklcjss27j6rtu74zz7ch559neqystgslsp,\n 28344u64\n ]\n}"}' - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"5402941757199163131329664269602668871633752908147903083826863058623466909547field","checksum":"6299858438509874984288393356100492859126380436511534635530655092194846486258field","value":"record1qyqsparxz7rjgu5qwj29fp5xspylvxuxumjzpjwp7yahvn09szx0l6g3qyxx66trwfhkxun9v35hguerqqpqzq9vq9pcmuhpxvvrax2n3nht8f9jgdpzt9h9l7w7k5geycwqtypupsuh2lrxq4l7ts96haxgvxkdjvwd42cqpt2l96j9xhw5zlxuu2ssx0gfq8x"}' + - '{"type":"future","id":"5806769723479332130567002952494928256138310337461654699762319212831997850826field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1uchf7kruskpp8thlnfeya9qeklcjss27j6rtu74zz7ch559neqystgslsp,\n 28344u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/timelock.out b/synthesizer/tests/expectations/vm/execute_and_finalize/timelock.out index ade542ee2f..425f80af2e 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/timelock.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/timelock.out @@ -4,22 +4,22 @@ outputs: execute: timelock.aleo/lock: outputs: - - '{"type":"future","id":"578152375660960413620944529176838111130558819753119775638549496005056051167field","value":"{\n program_id: timelock.aleo,\n function_name: lock,\n arguments: []\n}"}' + - '{"type":"future","id":"5726101227699718662507291026879175619949633046158707589853378418659241463316field","value":"{\n program_id: timelock.aleo,\n function_name: lock,\n arguments: []\n}"}' speculate: the execution was rejected add_next_block: succeeded. - verified: true execute: timelock.aleo/lock: outputs: - - '{"type":"future","id":"1153321566575392305875708931221831574430034867281515788213221373067783340857field","value":"{\n program_id: timelock.aleo,\n function_name: lock,\n arguments: []\n}"}' + - '{"type":"future","id":"5825781590715337627504208073275179158827587281138872289977731167576414664969field","value":"{\n program_id: timelock.aleo,\n function_name: lock,\n arguments: []\n}"}' speculate: the execution was rejected add_next_block: succeeded. additional: - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"5473322261890369096710391500775021877134453013698547035599192539986067358037field","checksum":"6980374149233505129565181437471791515647159093892921261741246653396495143051field","value":"record1qyqsq40tapm7w0zll08x28yu8ufzs3jqk53ec0pen7vfaeppl2n84jcyqyxx66trwfhkxun9v35hguerqqpqzqzc6xphegrmzxkw8clqe5fsxs7xnqp9f57usrmmyv3gu4ey5d3aplsdq2hkpwzylgwne67j769p77754yqdcam28mh68huzlz74npxsqjwwdtx"}' + - '{"type":"future","id":"2868527388214006275127069563021857572887489216649877337285946162120321568912field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo12tksdptp7hvxly8tkm3um08fvf53qpehsgdgqfvy9pe3sewcq5ysjg5myy,\n 5164u64\n ]\n}"}' - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"3500478305510861468600974780645788091574034938191756692997832413371764035285field","checksum":"5270087208881412083504176599993145162545711447694009649032440534082007001776field","value":"record1qyqsqk3tweyvy3x4rsk06umpl3j6ucy7fpk5n8ypafp4vga25asnf0grqyxx66trwfhkxun9v35hguerqqpqzqx0kky3nlgn23x8m0khjmsgh8hmye9m0mpre68zgvysvlz82szuq3vy0ualeusvypmafl9gp97gwv067ljhn9we058mvua74ych7hgqvnj9lc4"}' + - '{"type":"future","id":"3666380379303443004933801395245329857516145915761366182794264005536589963556field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo12tksdptp7hvxly8tkm3um08fvf53qpehsgdgqfvy9pe3sewcq5ysjg5myy,\n 5164u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/unknown_external_mapping_fail.out b/synthesizer/tests/expectations/vm/execute_and_finalize/unknown_external_mapping_fail.out new file mode 100644 index 0000000000..65ce813937 --- /dev/null +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/unknown_external_mapping_fail.out @@ -0,0 +1,3 @@ +errors: +- 'Failed to run `VM::deploy for program relay.aleo: Mapping ''foo'' in ''registry.aleo'' is not defined.' +outputs: [] diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/unknown_mapping_fail.out b/synthesizer/tests/expectations/vm/execute_and_finalize/unknown_mapping_fail.out new file mode 100644 index 0000000000..eb8a147f5c --- /dev/null +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/unknown_mapping_fail.out @@ -0,0 +1,3 @@ +errors: +- 'Failed to run `VM::deploy for program registry.aleo: Mapping ''foo'' in ''registry.aleo/register'' is not defined.' +outputs: [] diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/unused_position.out b/synthesizer/tests/expectations/vm/execute_and_finalize/unused_position.out index eb604e54d4..c5e300b026 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/unused_position.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/unused_position.out @@ -4,11 +4,11 @@ outputs: execute: unused_position.aleo/foo: outputs: - - '{"type":"future","id":"754819646549188005033265189873387370723612282538036088693249266044696644507field","value":"{\n program_id: unused_position.aleo,\n function_name: foo,\n arguments: []\n}"}' + - '{"type":"future","id":"4435915382452600913825742955271157728527943603774006701552876898718102875463field","value":"{\n program_id: unused_position.aleo,\n function_name: foo,\n arguments: []\n}"}' speculate: the execution was accepted add_next_block: succeeded. additional: - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"3540562477020683716064470691350628391302941512915750897951711495334005821133field","checksum":"7993988099268814368872113132611442146154220017865766620056128915944022458704field","value":"record1qyqsq40tapm7w0zll08x28yu8ufzs3jqk53ec0pen7vfaeppl2n84jcyqyxx66trwfhkxun9v35hguerqqpqzqzc6xpjenmmzxkw8clqe5fsxs7xnqp9f57usrmmyv3gu4ey5d3aplsdq2hkpwzylgwne67j769p77754yqdcam28mh68huzlz74npxsqylrxra"}' + - '{"type":"future","id":"5889749875317192883762347751185109427367185401929794748301981981444845203330field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo12tksdptp7hvxly8tkm3um08fvf53qpehsgdgqfvy9pe3sewcq5ysjg5myy,\n 2176u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/user_callable.out b/synthesizer/tests/expectations/vm/execute_and_finalize/user_callable.out index 58f4be97a8..77e6a29dd6 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/user_callable.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/user_callable.out @@ -4,14 +4,14 @@ outputs: execute: child.aleo/foo: outputs: - - '{"type":"public","id":"4279509780486643035080626777023973066084837379094817161797996960689084569794field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' - - '{"type":"public","id":"4408001848080504344165436121252640202617322612254005793329268580869751931263field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"389051587023874025297792889573178986947322645231926608183742711950919559411field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"764027935495423951991221261588244508770271800988614802602832277026356994499field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' speculate: the execution was accepted add_next_block: succeeded. - execute: 'Failed to evaluate instruction (call child.aleo/foo into r0 r1;): Failed to evaluate instruction (assert.eq self.caller self.signer ;): ''assert.eq'' failed: ''aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy'' is not equal to ''aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx'' (should be equal)' additional: - child_outputs: - credits.aleo/fee_private: + credits.aleo/fee_public: outputs: - - '{"type":"record","id":"7306036686667087636279947507997825407084203811048562802739660291735242744444field","checksum":"7132981897182131254956763451386939918007763262893522220397577775796699535598field","value":"record1qyqsqx586v4tjhcdgtvpat2cmz7ztzd7drzm5c04gyeaxqmujgv7ucq3qyxx66trwfhkxun9v35hguerqqpqzqx4pcwh0jc37snpu02y8ujwh2u327ghc6yaeeyc4k74e56uvuhqp0tpta5q5eppwa48pq9eepyuln9ct5qth57klqzf67ewyqn9hresxwalp5l"}' + - '{"type":"future","id":"6557860754730668406004469054379794576334242764827542178306889009454484547032field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx,\n 1244u64\n ]\n}"}' - {} From 7c8fa073bf4e753ba63623b0ab6d3b80bac01269 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu Date: Thu, 26 Oct 2023 20:13:50 -0400 Subject: [PATCH 055/339] Improve test --- .../read_external_mapping.out | 38 ++++++++++++------- .../read_external_mapping.aleo | 16 ++++++++ 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/read_external_mapping.out b/synthesizer/tests/expectations/vm/execute_and_finalize/read_external_mapping.out index 277a2e1bcd..a729b3163e 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/read_external_mapping.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/read_external_mapping.out @@ -4,58 +4,70 @@ outputs: execute: relay.aleo/send: outputs: - - '{"type":"record","id":"2317537586898875003527911595881250652314627769570172347256550518017872557697field","checksum":"5016557145498331574642320031968331291285347334593139541782766783223318670648field","value":"record1qyqsp8ch07pqnhwum52l685x8yelm2xhwevs9lh9gfmx2zpz26kff5g0qyzxgct5vy3sqqspqz337ysk89zjy89u65led0e7y0wj7p5ejdwhatq68zcdagqkwl9sdnqms8z3y6lnck4kzukmh5769mg0933thnfetskqguycewflh4qflw82vn"}' - - '{"type":"future","id":"6060171713510534514143443306903785915198276713047207513053052324882806972526field","value":"{\n program_id: relay.aleo,\n function_name: send,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm\n ]\n}"}' + - '{"type":"record","id":"5505341694097720023583674648027312667621444458172921945164834002648638744768field","checksum":"4170712463954366904268628656227022271867279479485549214633981747772705648157field","value":"record1qyqsp358e054av498aavwel28wr36tg0ay27k4fc539ffmwz2nddl8gqqyzxgct5vy3sqqspqpfgwnp3rnwprhd2q3h8gmxcnldlczrvszade4vzxlu7dmfeg6j3rd8mwuzysqtgl6603ey2zzry8hjwmn3pt3twclpkkvssc4l4jzsvd6lxar"}' + - '{"type":"future","id":"5336913895922947334887041593466841136470735988519588898509306662059714980450field","value":"{\n program_id: relay.aleo,\n function_name: send,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm\n ]\n}"}' speculate: the execution was rejected add_next_block: succeeded. +- verified: true + execute: + relay.aleo/send_without_check: + outputs: + - '{"type":"record","id":"4755207731349921544198839760105069860415948248486655350742993041864954064196field","checksum":"7848435433502532569425287419063381736913355859517668180377091558079541996646field","value":"record1qyqsp83ncqrtrev57v03h3j8qcysfgef256zh7pmh7zgj83h6g7tfkq0qyzxgct5vy3sqqspqzx4ww05zz3grf6hxgr46csu2vmzr2lgq0f48kxp4j383l68ufqsq45f8wqk6jxfnkm6v92cq48xea0tfrg0fwwr249m95t4eka6jkgv0c5y7k"}' + - '{"type":"future","id":"1027044606530325120447980237911983680107621060206232306337126914234987187002field","value":"{\n program_id: relay.aleo,\n function_name: send_without_check,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm\n ]\n}"}' + speculate: the execution was accepted + add_next_block: succeeded. - verified: true execute: registry.aleo/register: outputs: - - '{"type":"future","id":"4912027766578041258717763414531570075203769145029783107169756543671526859063field","value":"{\n program_id: registry.aleo,\n function_name: register,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm\n ]\n}"}' + - '{"type":"future","id":"4059159583881077685368973757192878822018897618745592372395499886263264340961field","value":"{\n program_id: registry.aleo,\n function_name: register,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm\n ]\n}"}' speculate: the execution was accepted add_next_block: succeeded. - verified: true execute: relay.aleo/send: outputs: - - '{"type":"record","id":"7570363776723556048515317606603820932475200424645714329992113285075479807481field","checksum":"2640827483033329518607665013126665825734877898317823925445957258899070118927field","value":"record1qyqsqhp6suzyvpvf5cqtf8k5lj7j6vgljvn83knvx6z429zhxp5fgmqdqyzxgct5vy3sqqspqqj9pn534vyqvqvfk5lygrc7cqj6rx8tcmgdkmus0kfw9y5csygqdmx09zv7xawh9s9e7d2x5l6j20wfxuk4r9z6vtrg7gh7q6pv3tg8xfuuru"}' - - '{"type":"future","id":"8396346733807272095051892936411848657999314439834335427243101849411797227479field","value":"{\n program_id: relay.aleo,\n function_name: send,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm\n ]\n}"}' + - '{"type":"record","id":"2277384653342632398532359071690090462344215994043547853708800775056671259572field","checksum":"3071210942562837171924171313096615835242397071199450951002063969440885822680field","value":"record1qyqspfwaru0f2lj0s2k6p9jfmmkzyvkzl5qpagt00edyuf9qn3gnu5g9qyzxgct5vy3sqqspqrncgctd3wfmz2ggx0v7l5cggxxad49wcmtlyrjnk8fqulmkg3h3rleuqh8nmwn5d9z8cpf6z75sy880xenua6hu9wk6ptzwh9vnzps3l7743a"}' + - '{"type":"future","id":"6015012441862221318333000102440691156905727650418067306609473392233853855381field","value":"{\n program_id: relay.aleo,\n function_name: send,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm\n ]\n}"}' speculate: the execution was accepted add_next_block: succeeded. - verified: true execute: registry.aleo/unregister: outputs: - - '{"type":"future","id":"4916621928718597326453327850342432807913183863515286820927876893411281241764field","value":"{\n program_id: registry.aleo,\n function_name: unregister,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm\n ]\n}"}' + - '{"type":"future","id":"621057053984946494815874859056940220465065220086041076777338967969133345871field","value":"{\n program_id: registry.aleo,\n function_name: unregister,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm\n ]\n}"}' speculate: the execution was accepted add_next_block: succeeded. - verified: true execute: relay.aleo/send: outputs: - - '{"type":"record","id":"5530328758191127651605502960961789058994029742872360714815774182797261982763field","checksum":"2945321521037774393869829376179129152338156532812236337422211831315443690211field","value":"record1qyqsqel2rux546nzp57eh38k24xfflptvpyzegcxxwugj097vkvjukstqyzxgct5vy3sqqspqzhhjatdt09f8lxsaukt4njxeql4my8p86fw2r4jxc3scdez8asqs3hpuh9taf46gyltxxh22qp9x4xzjtmaq0ung8adtumsw94cecs0x0xqkl"}' - - '{"type":"future","id":"6830445503994857147753329697934978051706269651779887682757924869644027854312field","value":"{\n program_id: relay.aleo,\n function_name: send,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm\n ]\n}"}' + - '{"type":"record","id":"6497977440830787207175874226764101265608813002804421333613230199582364410758field","checksum":"319323911748946858530605909565888788506340329996151513367076865761846915611field","value":"record1qyqsqnajqear5neee3l8fykp4vcq35sgwreyz7hz3png3cn2yyljdscfqyzxgct5vy3sqqspqzu6lezptk9xjpx35xdrv5tztz0v9qs9xx803pyqury2j47x2d5seymhf3xa2wefz7mkas7r7m3uf4kte7fdwm00ral53q2mhclx95qte8mpvc"}' + - '{"type":"future","id":"2216932771373637316148105432054544027092193801977530259105019952220093166242field","value":"{\n program_id: relay.aleo,\n function_name: send,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm\n ]\n}"}' speculate: the execution was rejected add_next_block: succeeded. additional: - child_outputs: credits.aleo/fee_public: outputs: - - '{"type":"future","id":"4960890695745452772232908991619728704202417459002410486474521601906731342806field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1xe2fps8f9xpdas2q0fqy22uraenk84tvvzetrsyxgnwy6445h59s6wv78x,\n 28479u64\n ]\n}"}' + - '{"type":"future","id":"2373837014611692049497129045871775574464197133932453792739782919776486496194field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1xe2fps8f9xpdas2q0fqy22uraenk84tvvzetrsyxgnwy6445h59s6wv78x,\n 28479u64\n ]\n}"}' +- child_outputs: + credits.aleo/fee_public: + outputs: + - '{"type":"future","id":"6963949699870804211203514659901328830518734684604845622658837353595728006898field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1xe2fps8f9xpdas2q0fqy22uraenk84tvvzetrsyxgnwy6445h59s6wv78x,\n 28507u64\n ]\n}"}' - child_outputs: credits.aleo/fee_public: outputs: - - '{"type":"future","id":"8430479447748956098157716177872888769234364744387596392617360355542856164660field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm,\n 101210u64\n ]\n}"}' + - '{"type":"future","id":"786151097471386478439918490898626420968604200995134718973623517242949574field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm,\n 101210u64\n ]\n}"}' - child_outputs: credits.aleo/fee_public: outputs: - - '{"type":"future","id":"4502206432380012456604755847468214248986763931949891558228458881027814975027field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1xe2fps8f9xpdas2q0fqy22uraenk84tvvzetrsyxgnwy6445h59s6wv78x,\n 28479u64\n ]\n}"}' + - '{"type":"future","id":"7962216909726487379370954492051267200961073450060603523391007597642835489177field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1xe2fps8f9xpdas2q0fqy22uraenk84tvvzetrsyxgnwy6445h59s6wv78x,\n 28479u64\n ]\n}"}' - child_outputs: credits.aleo/fee_public: outputs: - - '{"type":"future","id":"3161662896320756371352352358177196789819155276370479628395808356491575243730field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm,\n 101214u64\n ]\n}"}' + - '{"type":"future","id":"5340444358291789813118792762028331134214990505407681376089964565359528622453field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm,\n 101214u64\n ]\n}"}' - child_outputs: credits.aleo/fee_public: outputs: - - '{"type":"future","id":"7835046846960912856976978166201827944679821834273867346502722712552318601688field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1xe2fps8f9xpdas2q0fqy22uraenk84tvvzetrsyxgnwy6445h59s6wv78x,\n 28479u64\n ]\n}"}' + - '{"type":"future","id":"7708776674386621879381619680665250794376507748822342974632850445134733330595field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1xe2fps8f9xpdas2q0fqy22uraenk84tvvzetrsyxgnwy6445h59s6wv78x,\n 28479u64\n ]\n}"}' diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/read_external_mapping.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/read_external_mapping.aleo index a8c5185d59..20ad427064 100644 --- a/synthesizer/tests/tests/vm/execute_and_finalize/read_external_mapping.aleo +++ b/synthesizer/tests/tests/vm/execute_and_finalize/read_external_mapping.aleo @@ -6,6 +6,9 @@ cases: - program: relay.aleo function: send inputs: [aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm, 0u8] + - program: relay.aleo + function: send_without_check + inputs: [aleo1f6eg623knp66cwx0926w3plgdgzcmfpgyrzgnjz90mucgs3z7s9qls4upm, 0u8] - program: registry.aleo function: register inputs: [] @@ -66,3 +69,16 @@ finalize send: input r0 as address.public; get registry.aleo/users[r0] into r1; assert.eq r1 true; + +function send_without_check: + input r0 as address.public; + input r1 as u8.public; + cast r0 r1 into r2 as message.record; + async send_without_check r0 into r3; + output r2 as message.record; + output r3 as relay.aleo/send_without_check.future; + +finalize send_without_check: + input r0 as address.public; + get.or_use registry.aleo/users[r0] true into r1; + assert.eq r1 true; From d7ee8692d1c3adac2260bc5b5db9486c3a903463 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu Date: Thu, 26 Oct 2023 20:36:04 -0400 Subject: [PATCH 056/339] Add negative test --- .../src/stack/finalize_types/initialize.rs | 4 +- synthesizer/program/src/logic/command/get.rs | 2 +- .../program/src/logic/command/get_or_use.rs | 2 +- .../external_read_with_local_fail.out | 3 ++ .../external_read_with_local_fail.aleo | 38 +++++++++++++++++++ 5 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 synthesizer/tests/expectations/vm/execute_and_finalize/external_read_with_local_fail.out create mode 100644 synthesizer/tests/tests/vm/execute_and_finalize/external_read_with_local_fail.aleo diff --git a/synthesizer/process/src/stack/finalize_types/initialize.rs b/synthesizer/process/src/stack/finalize_types/initialize.rs index db664b0a0d..ce6ccb0ee7 100644 --- a/synthesizer/process/src/stack/finalize_types/initialize.rs +++ b/synthesizer/process/src/stack/finalize_types/initialize.rs @@ -299,7 +299,7 @@ impl FinalizeTypes { // Ensure the locator does not reference the current program. if stack.program_id() == program_id { - bail!("Locator '{locator}' does not reference an external program."); + bail!("Locator '{locator}' does not reference an external mapping."); } // Ensure the current program contains an import for this external program. if !stack.program().imports().keys().contains(program_id) { @@ -367,7 +367,7 @@ impl FinalizeTypes { // Ensure the locator does not reference the current program. if stack.program_id() == program_id { - bail!("Locator '{locator}' does not reference an external program."); + bail!("Locator '{locator}' does not reference an external mapping."); } // Ensure the current program contains an import for this external program. if !stack.program().imports().keys().contains(program_id) { diff --git a/synthesizer/program/src/logic/command/get.rs b/synthesizer/program/src/logic/command/get.rs index 2af220ab64..8122d7998c 100644 --- a/synthesizer/program/src/logic/command/get.rs +++ b/synthesizer/program/src/logic/command/get.rs @@ -48,7 +48,7 @@ impl Get { vec![self.key.clone()] } - /// Returns the mapping. + /// Returns the mapping name. #[inline] pub const fn mapping(&self) -> &CallOperator { &self.mapping diff --git a/synthesizer/program/src/logic/command/get_or_use.rs b/synthesizer/program/src/logic/command/get_or_use.rs index 15ed3365f4..26c74ff5c0 100644 --- a/synthesizer/program/src/logic/command/get_or_use.rs +++ b/synthesizer/program/src/logic/command/get_or_use.rs @@ -51,7 +51,7 @@ impl GetOrUse { vec![self.key.clone(), self.default.clone()] } - /// Returns the mapping. + /// Returns the mapping name. #[inline] pub const fn mapping(&self) -> &CallOperator { &self.mapping diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/external_read_with_local_fail.out b/synthesizer/tests/expectations/vm/execute_and_finalize/external_read_with_local_fail.out new file mode 100644 index 0000000000..8c5e3e1a9f --- /dev/null +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/external_read_with_local_fail.out @@ -0,0 +1,3 @@ +errors: +- 'Failed to run `VM::deploy for program relay.aleo: Locator ''relay.aleo/users'' does not reference an external mapping.' +outputs: [] diff --git a/synthesizer/tests/tests/vm/execute_and_finalize/external_read_with_local_fail.aleo b/synthesizer/tests/tests/vm/execute_and_finalize/external_read_with_local_fail.aleo new file mode 100644 index 0000000000..56a3c02c9b --- /dev/null +++ b/synthesizer/tests/tests/vm/execute_and_finalize/external_read_with_local_fail.aleo @@ -0,0 +1,38 @@ +/* +cases: [] +*/ + +program registry.aleo; + +mapping users: + key as address.public; + value as boolean.public; + +function register: + async register self.caller into r0; + output r0 as registry.aleo/register.future; + +finalize register: + input r0 as address.public; + set true into users[r0]; + + +///////////////////////////////////////////////// + +import registry.aleo; + +program relay.aleo; + +mapping users: + key as address.public; + value as boolean.public; + +function send: + input r0 as address.public; + async send r0 into r1; + output r1 as relay.aleo/send.future; + +finalize send: + input r0 as address.public; + get relay.aleo/users[r0] into r1; + assert.eq r1 true; From 33c19135a045744991a7b618ea33abd14fd81f40 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu Date: Thu, 26 Oct 2023 20:42:57 -0400 Subject: [PATCH 057/339] Cleanup --- synthesizer/process/src/stack/finalize_types/initialize.rs | 2 +- synthesizer/program/src/logic/command/get.rs | 4 ++-- synthesizer/program/src/logic/command/get_or_use.rs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/synthesizer/process/src/stack/finalize_types/initialize.rs b/synthesizer/process/src/stack/finalize_types/initialize.rs index ce6ccb0ee7..e12b45f527 100644 --- a/synthesizer/process/src/stack/finalize_types/initialize.rs +++ b/synthesizer/process/src/stack/finalize_types/initialize.rs @@ -384,7 +384,7 @@ impl FinalizeTypes { external.get_mapping(mapping_name).unwrap() } CallOperator::Resource(mapping_name) => { - // Ensure the declared mapping in `get` is defined in the current program. + // Ensure the declared mapping in `get.or_use` is defined in the current program. if !stack.program().contains_mapping(mapping_name) { bail!("Mapping '{mapping_name}' in '{}' is not defined.", stack.program_id()) } diff --git a/synthesizer/program/src/logic/command/get.rs b/synthesizer/program/src/logic/command/get.rs index 8122d7998c..ef33b4c608 100644 --- a/synthesizer/program/src/logic/command/get.rs +++ b/synthesizer/program/src/logic/command/get.rs @@ -27,7 +27,7 @@ use console::{ /// Gets the value stored at `operand` in `mapping` and stores the result in `destination`. #[derive(Clone, PartialEq, Eq, Hash)] pub struct Get { - /// The mapping name. + /// The mapping. mapping: CallOperator, /// The key to access the mapping. key: Operand, @@ -48,7 +48,7 @@ impl Get { vec![self.key.clone()] } - /// Returns the mapping name. + /// Returns the mapping. #[inline] pub const fn mapping(&self) -> &CallOperator { &self.mapping diff --git a/synthesizer/program/src/logic/command/get_or_use.rs b/synthesizer/program/src/logic/command/get_or_use.rs index 26c74ff5c0..de7a2b729a 100644 --- a/synthesizer/program/src/logic/command/get_or_use.rs +++ b/synthesizer/program/src/logic/command/get_or_use.rs @@ -28,7 +28,7 @@ use console::{ /// If the key is not present, `default` is stored in `destination`. #[derive(Clone, PartialEq, Eq, Hash)] pub struct GetOrUse { - /// The mapping name. + /// The mapping. mapping: CallOperator, /// The key to access the mapping. key: Operand, @@ -51,7 +51,7 @@ impl GetOrUse { vec![self.key.clone(), self.default.clone()] } - /// Returns the mapping name. + /// Returns the mapping. #[inline] pub const fn mapping(&self) -> &CallOperator { &self.mapping From cc68bb0d4093a06899605bba857a84a393125925 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Mon, 30 Oct 2023 12:16:38 -0400 Subject: [PATCH 058/339] Introduce MappingLocator; update serialization --- .../src/stack/finalize_types/initialize.rs | 10 +- synthesizer/program/src/logic/command/get.rs | 137 ++++++++++++++++-- .../program/src/logic/command/get_or_use.rs | 37 +++-- 3 files changed, 156 insertions(+), 28 deletions(-) diff --git a/synthesizer/process/src/stack/finalize_types/initialize.rs b/synthesizer/process/src/stack/finalize_types/initialize.rs index e12b45f527..ae17caf484 100644 --- a/synthesizer/process/src/stack/finalize_types/initialize.rs +++ b/synthesizer/process/src/stack/finalize_types/initialize.rs @@ -17,11 +17,11 @@ use crate::RegisterTypes; use synthesizer_program::{ Await, Branch, - CallOperator, CastType, Contains, Get, GetOrUse, + MappingLocator, RandChaCha, Remove, Set, @@ -291,7 +291,7 @@ impl FinalizeTypes { fn check_get(&mut self, stack: &(impl StackMatches + StackProgram), get: &Get) -> Result<()> { // Retrieve the mapping. let mapping = match get.mapping() { - CallOperator::Locator(locator) => { + MappingLocator::Locator(locator) => { // Retrieve the program ID. let program_id = locator.program_id(); // Retrieve the mapping_name. @@ -315,7 +315,7 @@ impl FinalizeTypes { // Note that the unwrap is safe, as we have already checked the mapping exists. external.get_mapping(mapping_name).unwrap() } - CallOperator::Resource(mapping_name) => { + MappingLocator::Resource(mapping_name) => { // Ensure the declared mapping in `get` is defined in the current program. if !stack.program().contains_mapping(mapping_name) { bail!("Mapping '{mapping_name}' in '{}' is not defined.", stack.program_id()) @@ -359,7 +359,7 @@ impl FinalizeTypes { ) -> Result<()> { // Retrieve the mapping. let mapping = match get_or_use.mapping() { - CallOperator::Locator(locator) => { + MappingLocator::Locator(locator) => { // Retrieve the program ID. let program_id = locator.program_id(); // Retrieve the mapping_name. @@ -383,7 +383,7 @@ impl FinalizeTypes { // Note that the unwrap is safe, as we have already checked the mapping exists. external.get_mapping(mapping_name).unwrap() } - CallOperator::Resource(mapping_name) => { + MappingLocator::Resource(mapping_name) => { // Ensure the declared mapping in `get.or_use` is defined in the current program. if !stack.program().contains_mapping(mapping_name) { bail!("Mapping '{mapping_name}' in '{}' is not defined.", stack.program_id()) diff --git a/synthesizer/program/src/logic/command/get.rs b/synthesizer/program/src/logic/command/get.rs index ef33b4c608..f51423ab61 100644 --- a/synthesizer/program/src/logic/command/get.rs +++ b/synthesizer/program/src/logic/command/get.rs @@ -14,21 +14,122 @@ use crate::{ traits::{FinalizeStoreTrait, RegistersLoad, RegistersStore, StackMatches, StackProgram}, - CallOperator, Opcode, Operand, }; use console::{ network::prelude::*, - program::{Register, Value}, + program::{Identifier, Locator, Register, Value}, }; +use std::io::{BufRead, BufReader}; + +/// The operator references a local or external mapping name. +#[derive(Clone, PartialEq, Eq, Hash)] +pub enum MappingLocator { + /// The reference to a non-local mapping name. + Locator(Locator), + /// The reference to a local mapping name. + Resource(Identifier), +} + +impl Parser for MappingLocator { + /// Parses a string into an operator. + #[inline] + fn parse(string: &str) -> ParserResult { + alt(( + map(Locator::parse, |locator| MappingLocator::Locator(locator)), + map(Identifier::parse, |identifier| MappingLocator::Resource(identifier)), + ))(string) + } +} + +impl FromStr for MappingLocator { + type Err = Error; + + /// Parses a string into an operator. + #[inline] + fn from_str(string: &str) -> Result { + match Self::parse(string) { + Ok((remainder, object)) => { + // Ensure the remainder is empty. + ensure!(remainder.is_empty(), "Failed to parse string. Found invalid character in: \"{remainder}\""); + // Return the object. + Ok(object) + } + Err(error) => bail!("Failed to parse string. {error}"), + } + } +} + +impl Debug for MappingLocator { + /// Prints the operator as a string. + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + Display::fmt(self, f) + } +} + +impl Display for MappingLocator { + /// Prints the operator to a string. + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + match self { + MappingLocator::Locator(locator) => Display::fmt(locator, f), + MappingLocator::Resource(resource) => Display::fmt(resource, f), + } + } +} + +impl FromBytes for MappingLocator { + /// Reads the operation from a buffer. + fn read_le(mut reader: R) -> IoResult { + // Read the version. + let version = u8::read_le(&mut reader)?; + // Ensure the version is valid. + if version != 0 { + return Err(error("Failed to read MappingLocator. Invalid version.")); + } + // Read the variant. + let variant = u8::read_le(&mut reader)?; + // Match the variant. + match variant { + 0 => Ok(MappingLocator::Locator(Locator::read_le(&mut reader)?)), + 1 => Ok(MappingLocator::Resource(Identifier::read_le(&mut reader)?)), + _ => Err(error("Failed to read MappingLocator. Invalid variant.")), + } + } +} + +impl ToBytes for MappingLocator { + /// Writes the operation to a buffer. + fn write_le(&self, mut writer: W) -> IoResult<()> { + match self { + MappingLocator::Locator(locator) => { + // Write the version. + 0u8.write_le(&mut writer)?; + // Write the variant. + 0u8.write_le(&mut writer)?; + // Write the locator. + locator.write_le(&mut writer) + } + MappingLocator::Resource(resource) => { + // Write the version. + 0u8.write_le(&mut writer)?; + // Write the variant. + 1u8.write_le(&mut writer)?; + // Write the resource. + resource.write_le(&mut writer) + } + } + } +} + /// A get command, e.g. `get accounts[r0] into r1;`. /// Gets the value stored at `operand` in `mapping` and stores the result in `destination`. #[derive(Clone, PartialEq, Eq, Hash)] pub struct Get { /// The mapping. - mapping: CallOperator, + // TODO (howardwu): For mainnet - Use `CallOperator`, delete the above `MappingLocator`. + mapping: MappingLocator, /// The key to access the mapping. key: Operand, /// The destination register. @@ -50,7 +151,7 @@ impl Get { /// Returns the mapping. #[inline] - pub const fn mapping(&self) -> &CallOperator { + pub const fn mapping(&self) -> &MappingLocator { &self.mapping } @@ -78,8 +179,8 @@ impl Get { ) -> Result<()> { // Determine the program ID and mapping name. let (program_id, mapping_name) = match self.mapping { - CallOperator::Locator(locator) => (*locator.program_id(), *locator.resource()), - CallOperator::Resource(mapping_name) => (*stack.program_id(), mapping_name), + MappingLocator::Locator(locator) => (*locator.program_id(), *locator.resource()), + MappingLocator::Resource(mapping_name) => (*stack.program_id(), mapping_name), }; // Ensure the mapping exists in storage. @@ -118,7 +219,7 @@ impl Parser for Get { let (string, _) = Sanitizer::parse_whitespaces(string)?; // Parse the mapping name from the string. - let (string, mapping) = CallOperator::parse(string)?; + let (string, mapping) = MappingLocator::parse(string)?; // Parse the "[" from the string. let (string, _) = tag("[")(string)?; // Parse the whitespace from the string. @@ -187,9 +288,21 @@ impl Display for Get { impl FromBytes for Get { /// Reads the command from a buffer. - fn read_le(mut reader: R) -> IoResult { - // Read the mapping name. - let mapping = CallOperator::read_le(&mut reader)?; + fn read_le(reader: R) -> IoResult { + // Peek at the first byte. + // TODO (howardwu): For mainnet - Read a `MappingLocator`. + let mut buffered = BufReader::new(reader); + let first_byte = { + let buffer = buffered.fill_buf()?; + buffer.first().copied() + }; + let mut reader = buffered.into_inner(); + // If the first byte is zero, then read a `MappingLocator`, otherwise read an `Identifier`. + let mapping = match first_byte { + Some(0u8) => MappingLocator::read_le(&mut reader)?, + Some(_) => MappingLocator::Resource(Identifier::read_le(&mut reader)?), + None => return Err(error("Failed to read `get`. Expected byte.")), + }; // Read the key operand. let key = Operand::read_le(&mut reader)?; // Read the destination register. @@ -222,14 +335,14 @@ mod tests { fn test_parse() { let (string, get) = Get::::parse("get account[r0] into r1;").unwrap(); assert!(string.is_empty(), "Parser did not consume all of the string: '{string}'"); - assert_eq!(get.mapping, CallOperator::from_str("account").unwrap()); + assert_eq!(get.mapping, MappingLocator::from_str("account").unwrap()); assert_eq!(get.operands().len(), 1, "The number of operands is incorrect"); assert_eq!(get.key, Operand::Register(Register::Locator(0)), "The first operand is incorrect"); assert_eq!(get.destination, Register::Locator(1), "The second operand is incorrect"); let (string, get) = Get::::parse("get token.aleo/balances[r0] into r1;").unwrap(); assert!(string.is_empty(), "Parser did not consume all of the string: '{string}'"); - assert_eq!(get.mapping, CallOperator::from_str("token.aleo/balances").unwrap()); + assert_eq!(get.mapping, MappingLocator::from_str("token.aleo/balances").unwrap()); assert_eq!(get.operands().len(), 1, "The number of operands is incorrect"); assert_eq!(get.key, Operand::Register(Register::Locator(0)), "The first operand is incorrect"); assert_eq!(get.destination, Register::Locator(1), "The second operand is incorrect"); diff --git a/synthesizer/program/src/logic/command/get_or_use.rs b/synthesizer/program/src/logic/command/get_or_use.rs index de7a2b729a..593d95ef7a 100644 --- a/synthesizer/program/src/logic/command/get_or_use.rs +++ b/synthesizer/program/src/logic/command/get_or_use.rs @@ -14,7 +14,7 @@ use crate::{ traits::{FinalizeStoreTrait, RegistersLoad, RegistersStore, StackMatches, StackProgram}, - CallOperator, + MappingLocator, Opcode, Operand, }; @@ -23,13 +23,16 @@ use console::{ program::{Register, Value}, }; +use console::program::Identifier; +use std::io::{BufRead, BufReader}; + /// A get command that uses the provided default in case of failure, e.g. `get.or_use accounts[r0] r1 into r2;`. /// Gets the value stored at `operand` in `mapping` and stores the result in `destination`. /// If the key is not present, `default` is stored in `destination`. #[derive(Clone, PartialEq, Eq, Hash)] pub struct GetOrUse { /// The mapping. - mapping: CallOperator, + mapping: MappingLocator, /// The key to access the mapping. key: Operand, /// The default value. @@ -53,7 +56,7 @@ impl GetOrUse { /// Returns the mapping. #[inline] - pub const fn mapping(&self) -> &CallOperator { + pub const fn mapping(&self) -> &MappingLocator { &self.mapping } @@ -87,8 +90,8 @@ impl GetOrUse { ) -> Result<()> { // Determine the program ID and mapping name. let (program_id, mapping_name) = match self.mapping { - CallOperator::Locator(locator) => (*locator.program_id(), *locator.resource()), - CallOperator::Resource(mapping_name) => (*stack.program_id(), mapping_name), + MappingLocator::Locator(locator) => (*locator.program_id(), *locator.resource()), + MappingLocator::Resource(mapping_name) => (*stack.program_id(), mapping_name), }; // Ensure the mapping exists in storage. @@ -128,7 +131,7 @@ impl Parser for GetOrUse { let (string, _) = Sanitizer::parse_whitespaces(string)?; // Parse the mapping name from the string. - let (string, mapping) = CallOperator::parse(string)?; + let (string, mapping) = MappingLocator::parse(string)?; // Parse the "[" from the string. let (string, _) = tag("[")(string)?; // Parse the whitespace from the string. @@ -201,9 +204,21 @@ impl Display for GetOrUse { impl FromBytes for GetOrUse { /// Reads the command from a buffer. - fn read_le(mut reader: R) -> IoResult { - // Read the mapping name. - let mapping = CallOperator::read_le(&mut reader)?; + fn read_le(reader: R) -> IoResult { + // Peek at the first byte. + // TODO (howardwu): For mainnet - Read a `MappingLocator`. + let mut buffered = BufReader::new(reader); + let first_byte = { + let buffer = buffered.fill_buf()?; + buffer.first().copied() + }; + let mut reader = buffered.into_inner(); + // If the first byte is zero, then read a `MappingLocator`, otherwise read an `Identifier`. + let mapping = match first_byte { + Some(0u8) => MappingLocator::read_le(&mut reader)?, + Some(_) => MappingLocator::Resource(Identifier::read_le(&mut reader)?), + None => return Err(error("Failed to read `get.or_use`. Expected byte.")), + }; // Read the key operand. let key = Operand::read_le(&mut reader)?; // Read the default value. @@ -240,7 +255,7 @@ mod tests { fn test_parse() { let (string, get_or_use) = GetOrUse::::parse("get.or_use account[r0] r1 into r2;").unwrap(); assert!(string.is_empty(), "Parser did not consume all of the string: '{string}'"); - assert_eq!(get_or_use.mapping, CallOperator::from_str("account").unwrap()); + assert_eq!(get_or_use.mapping, MappingLocator::from_str("account").unwrap()); assert_eq!(get_or_use.operands().len(), 2, "The number of operands is incorrect"); assert_eq!(get_or_use.key, Operand::Register(Register::Locator(0)), "The first operand is incorrect"); assert_eq!(get_or_use.default, Operand::Register(Register::Locator(1)), "The second operand is incorrect"); @@ -249,7 +264,7 @@ mod tests { let (string, get_or_use) = GetOrUse::::parse("get.or_use token.aleo/balances[r0] r1 into r2;").unwrap(); assert!(string.is_empty(), "Parser did not consume all of the string: '{string}'"); - assert_eq!(get_or_use.mapping, CallOperator::from_str("token.aleo/balances").unwrap()); + assert_eq!(get_or_use.mapping, MappingLocator::from_str("token.aleo/balances").unwrap()); assert_eq!(get_or_use.operands().len(), 2, "The number of operands is incorrect"); assert_eq!(get_or_use.key, Operand::Register(Register::Locator(0)), "The first operand is incorrect"); assert_eq!(get_or_use.default, Operand::Register(Register::Locator(1)), "The second operand is incorrect"); From 54d70975326a89d3d754563f6d555746ab860c24 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Mon, 30 Oct 2023 12:58:13 -0400 Subject: [PATCH 059/339] Add test --- synthesizer/program/src/logic/command/get.rs | 112 +++++++++++++++- .../program/src/logic/command/get_or_use.rs | 123 +++++++++++++++++- 2 files changed, 229 insertions(+), 6 deletions(-) diff --git a/synthesizer/program/src/logic/command/get.rs b/synthesizer/program/src/logic/command/get.rs index f51423ab61..38a2a304d0 100644 --- a/synthesizer/program/src/logic/command/get.rs +++ b/synthesizer/program/src/logic/command/get.rs @@ -291,12 +291,11 @@ impl FromBytes for Get { fn read_le(reader: R) -> IoResult { // Peek at the first byte. // TODO (howardwu): For mainnet - Read a `MappingLocator`. - let mut buffered = BufReader::new(reader); + let mut reader = BufReader::new(reader); let first_byte = { - let buffer = buffered.fill_buf()?; + let buffer = reader.fill_buf()?; buffer.first().copied() }; - let mut reader = buffered.into_inner(); // If the first byte is zero, then read a `MappingLocator`, otherwise read an `Identifier`. let mapping = match first_byte { Some(0u8) => MappingLocator::read_le(&mut reader)?, @@ -331,6 +330,98 @@ mod tests { type CurrentNetwork = Testnet3; + struct OldGet { + mapping: Identifier, + key: Operand, + destination: Register, + } + + impl Parser for OldGet { + #[inline] + fn parse(string: &str) -> ParserResult { + // Parse the whitespace and comments from the string. + let (string, _) = Sanitizer::parse(string)?; + // Parse the opcode from the string. + let (string, _) = tag("get")(string)?; + // Parse the whitespace from the string. + let (string, _) = Sanitizer::parse_whitespaces(string)?; + + // Parse the mapping name from the string. + let (string, mapping) = Identifier::parse(string)?; + // Parse the "[" from the string. + let (string, _) = tag("[")(string)?; + // Parse the whitespace from the string. + let (string, _) = Sanitizer::parse_whitespaces(string)?; + // Parse the key operand from the string. + let (string, key) = Operand::parse(string)?; + // Parse the whitespace from the string. + let (string, _) = Sanitizer::parse_whitespaces(string)?; + // Parse the "]" from the string. + let (string, _) = tag("]")(string)?; + + // Parse the whitespace from the string. + let (string, _) = Sanitizer::parse_whitespaces(string)?; + // Parse the "into" keyword from the string. + let (string, _) = tag("into")(string)?; + // Parse the whitespace from the string. + let (string, _) = Sanitizer::parse_whitespaces(string)?; + // Parse the destination register from the string. + let (string, destination) = Register::parse(string)?; + + // Parse the whitespace from the string. + let (string, _) = Sanitizer::parse_whitespaces(string)?; + // Parse the ";" from the string. + let (string, _) = tag(";")(string)?; + + Ok((string, Self { mapping, key, destination })) + } + } + + impl FromStr for OldGet { + type Err = Error; + + #[inline] + fn from_str(string: &str) -> Result { + match Self::parse(string) { + Ok((remainder, object)) => { + // Ensure the remainder is empty. + ensure!( + remainder.is_empty(), + "Failed to parse string. Found invalid character in: \"{remainder}\"" + ); + // Return the object. + Ok(object) + } + Err(error) => bail!("Failed to parse string. {error}"), + } + } + } + + impl Display for OldGet { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + // Print the command. + write!(f, "get ")?; + // Print the mapping and key operand. + write!(f, "{}[{}] into ", self.mapping, self.key)?; + // Print the destination register. + write!(f, "{};", self.destination) + } + } + + impl ToBytes for OldGet { + fn write_le(&self, mut writer: W) -> IoResult<()> + where + Self: Sized, + { + // Write the mapping name. + self.mapping.write_le(&mut writer)?; + // Write the key operand. + self.key.write_le(&mut writer)?; + // Write the destination register. + self.destination.write_le(&mut writer) + } + } + #[test] fn test_parse() { let (string, get) = Get::::parse("get account[r0] into r1;").unwrap(); @@ -347,4 +438,19 @@ mod tests { assert_eq!(get.key, Operand::Register(Register::Locator(0)), "The first operand is incorrect"); assert_eq!(get.destination, Register::Locator(1), "The second operand is incorrect"); } + + #[test] + fn test_from_bytes() { + let (string, get) = Get::::parse("get account[r0] into r1;").unwrap(); + assert!(string.is_empty()); + let (string, old_get) = OldGet::::parse("get account[r0] into r1;").unwrap(); + assert!(string.is_empty()); + + let get_bytes = get.to_bytes_le().unwrap(); + let old_get_bytes = old_get.to_bytes_le().unwrap(); + + let first = Get::::from_bytes_le(&get_bytes[..]).unwrap(); + let second = Get::::from_bytes_le(&old_get_bytes[..]).unwrap(); + assert_eq!(first, second); + } } diff --git a/synthesizer/program/src/logic/command/get_or_use.rs b/synthesizer/program/src/logic/command/get_or_use.rs index 593d95ef7a..9d59675e7a 100644 --- a/synthesizer/program/src/logic/command/get_or_use.rs +++ b/synthesizer/program/src/logic/command/get_or_use.rs @@ -207,12 +207,11 @@ impl FromBytes for GetOrUse { fn read_le(reader: R) -> IoResult { // Peek at the first byte. // TODO (howardwu): For mainnet - Read a `MappingLocator`. - let mut buffered = BufReader::new(reader); + let mut reader = BufReader::new(reader); let first_byte = { - let buffer = buffered.fill_buf()?; + let buffer = reader.fill_buf()?; buffer.first().copied() }; - let mut reader = buffered.into_inner(); // If the first byte is zero, then read a `MappingLocator`, otherwise read an `Identifier`. let mapping = match first_byte { Some(0u8) => MappingLocator::read_le(&mut reader)?, @@ -251,6 +250,108 @@ mod tests { type CurrentNetwork = Testnet3; + pub struct OldGetOrUse { + mapping: Identifier, + key: Operand, + default: Operand, + destination: Register, + } + + impl Parser for OldGetOrUse { + #[inline] + fn parse(string: &str) -> ParserResult { + // Parse the whitespace and comments from the string. + let (string, _) = Sanitizer::parse(string)?; + // Parse the opcode from the string. + let (string, _) = tag("get.or_use")(string)?; + // Parse the whitespace from the string. + let (string, _) = Sanitizer::parse_whitespaces(string)?; + + // Parse the mapping name from the string. + let (string, mapping) = Identifier::parse(string)?; + // Parse the "[" from the string. + let (string, _) = tag("[")(string)?; + // Parse the whitespace from the string. + let (string, _) = Sanitizer::parse_whitespaces(string)?; + // Parse the key operand from the string. + let (string, key) = Operand::parse(string)?; + // Parse the whitespace from the string. + let (string, _) = Sanitizer::parse_whitespaces(string)?; + // Parse the "]" from the string. + let (string, _) = tag("]")(string)?; + // Parse the whitespace from the string. + let (string, _) = Sanitizer::parse_whitespaces(string)?; + // Parse the default value from the string. + let (string, default) = Operand::parse(string)?; + + // Parse the whitespace from the string. + let (string, _) = Sanitizer::parse_whitespaces(string)?; + // Parse the "into" keyword from the string. + let (string, _) = tag("into")(string)?; + // Parse the whitespace from the string. + let (string, _) = Sanitizer::parse_whitespaces(string)?; + // Parse the destination register from the string. + let (string, destination) = Register::parse(string)?; + + // Parse the whitespace from the string. + let (string, _) = Sanitizer::parse_whitespaces(string)?; + // Parse the ";" from the string. + let (string, _) = tag(";")(string)?; + + Ok((string, Self { mapping, key, default, destination })) + } + } + + impl FromStr for OldGetOrUse { + type Err = Error; + + #[inline] + fn from_str(string: &str) -> Result { + match Self::parse(string) { + Ok((remainder, object)) => { + // Ensure the remainder is empty. + ensure!( + remainder.is_empty(), + "Failed to parse string. Found invalid character in: \"{remainder}\"" + ); + // Return the object. + Ok(object) + } + Err(error) => bail!("Failed to parse string. {error}"), + } + } + } + + impl Debug for OldGetOrUse { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + Display::fmt(self, f) + } + } + + impl Display for OldGetOrUse { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + // Print the command. + write!(f, "get.or_use ")?; + // Print the mapping and key operand. + write!(f, "{}[{}] {} into ", self.mapping, self.key, self.default)?; + // Print the destination register. + write!(f, "{};", self.destination) + } + } + + impl ToBytes for OldGetOrUse { + fn write_le(&self, mut writer: W) -> IoResult<()> { + // Write the mapping name. + self.mapping.write_le(&mut writer)?; + // Write the key operand. + self.key.write_le(&mut writer)?; + // Write the default value. + self.default.write_le(&mut writer)?; + // Write the destination register. + self.destination.write_le(&mut writer) + } + } + #[test] fn test_parse() { let (string, get_or_use) = GetOrUse::::parse("get.or_use account[r0] r1 into r2;").unwrap(); @@ -270,4 +371,20 @@ mod tests { assert_eq!(get_or_use.default, Operand::Register(Register::Locator(1)), "The second operand is incorrect"); assert_eq!(get_or_use.destination, Register::Locator(2), "The second operand is incorrect"); } + + #[test] + fn test_from_bytes() { + let (string, get_or_use) = GetOrUse::::parse("get.or_use account[r0] r1 into r2;").unwrap(); + assert!(string.is_empty()); + let (string, old_get_or_use) = + OldGetOrUse::::parse("get.or_use account[r0] r1 into r2;").unwrap(); + assert!(string.is_empty()); + + let get_or_use_bytes = get_or_use.to_bytes_le().unwrap(); + let old_get_or_use_bytes = old_get_or_use.to_bytes_le().unwrap(); + + let first = GetOrUse::::from_bytes_le(&get_or_use_bytes[..]).unwrap(); + let second = GetOrUse::::from_bytes_le(&old_get_or_use_bytes[..]).unwrap(); + assert_eq!(first, second); + } } From fa3dbfbf4584f41f104c3c4e4cf07191b0ba01ca Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Mon, 30 Oct 2023 13:01:02 -0400 Subject: [PATCH 060/339] Update test --- synthesizer/program/src/logic/command/get.rs | 80 ++------------ .../program/src/logic/command/get_or_use.rs | 100 ++---------------- 2 files changed, 17 insertions(+), 163 deletions(-) diff --git a/synthesizer/program/src/logic/command/get.rs b/synthesizer/program/src/logic/command/get.rs index 38a2a304d0..e0173487bd 100644 --- a/synthesizer/program/src/logic/command/get.rs +++ b/synthesizer/program/src/logic/command/get.rs @@ -336,78 +336,6 @@ mod tests { destination: Register, } - impl Parser for OldGet { - #[inline] - fn parse(string: &str) -> ParserResult { - // Parse the whitespace and comments from the string. - let (string, _) = Sanitizer::parse(string)?; - // Parse the opcode from the string. - let (string, _) = tag("get")(string)?; - // Parse the whitespace from the string. - let (string, _) = Sanitizer::parse_whitespaces(string)?; - - // Parse the mapping name from the string. - let (string, mapping) = Identifier::parse(string)?; - // Parse the "[" from the string. - let (string, _) = tag("[")(string)?; - // Parse the whitespace from the string. - let (string, _) = Sanitizer::parse_whitespaces(string)?; - // Parse the key operand from the string. - let (string, key) = Operand::parse(string)?; - // Parse the whitespace from the string. - let (string, _) = Sanitizer::parse_whitespaces(string)?; - // Parse the "]" from the string. - let (string, _) = tag("]")(string)?; - - // Parse the whitespace from the string. - let (string, _) = Sanitizer::parse_whitespaces(string)?; - // Parse the "into" keyword from the string. - let (string, _) = tag("into")(string)?; - // Parse the whitespace from the string. - let (string, _) = Sanitizer::parse_whitespaces(string)?; - // Parse the destination register from the string. - let (string, destination) = Register::parse(string)?; - - // Parse the whitespace from the string. - let (string, _) = Sanitizer::parse_whitespaces(string)?; - // Parse the ";" from the string. - let (string, _) = tag(";")(string)?; - - Ok((string, Self { mapping, key, destination })) - } - } - - impl FromStr for OldGet { - type Err = Error; - - #[inline] - fn from_str(string: &str) -> Result { - match Self::parse(string) { - Ok((remainder, object)) => { - // Ensure the remainder is empty. - ensure!( - remainder.is_empty(), - "Failed to parse string. Found invalid character in: \"{remainder}\"" - ); - // Return the object. - Ok(object) - } - Err(error) => bail!("Failed to parse string. {error}"), - } - } - } - - impl Display for OldGet { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - // Print the command. - write!(f, "get ")?; - // Print the mapping and key operand. - write!(f, "{}[{}] into ", self.mapping, self.key)?; - // Print the destination register. - write!(f, "{};", self.destination) - } - } - impl ToBytes for OldGet { fn write_le(&self, mut writer: W) -> IoResult<()> where @@ -443,8 +371,12 @@ mod tests { fn test_from_bytes() { let (string, get) = Get::::parse("get account[r0] into r1;").unwrap(); assert!(string.is_empty()); - let (string, old_get) = OldGet::::parse("get account[r0] into r1;").unwrap(); - assert!(string.is_empty()); + + let old_get = OldGet:: { + mapping: Identifier::from_str("account").unwrap(), + key: Operand::Register(Register::Locator(0)), + destination: Register::Locator(1), + }; let get_bytes = get.to_bytes_le().unwrap(); let old_get_bytes = old_get.to_bytes_le().unwrap(); diff --git a/synthesizer/program/src/logic/command/get_or_use.rs b/synthesizer/program/src/logic/command/get_or_use.rs index 9d59675e7a..7900b79eeb 100644 --- a/synthesizer/program/src/logic/command/get_or_use.rs +++ b/synthesizer/program/src/logic/command/get_or_use.rs @@ -251,92 +251,10 @@ mod tests { type CurrentNetwork = Testnet3; pub struct OldGetOrUse { - mapping: Identifier, - key: Operand, - default: Operand, - destination: Register, - } - - impl Parser for OldGetOrUse { - #[inline] - fn parse(string: &str) -> ParserResult { - // Parse the whitespace and comments from the string. - let (string, _) = Sanitizer::parse(string)?; - // Parse the opcode from the string. - let (string, _) = tag("get.or_use")(string)?; - // Parse the whitespace from the string. - let (string, _) = Sanitizer::parse_whitespaces(string)?; - - // Parse the mapping name from the string. - let (string, mapping) = Identifier::parse(string)?; - // Parse the "[" from the string. - let (string, _) = tag("[")(string)?; - // Parse the whitespace from the string. - let (string, _) = Sanitizer::parse_whitespaces(string)?; - // Parse the key operand from the string. - let (string, key) = Operand::parse(string)?; - // Parse the whitespace from the string. - let (string, _) = Sanitizer::parse_whitespaces(string)?; - // Parse the "]" from the string. - let (string, _) = tag("]")(string)?; - // Parse the whitespace from the string. - let (string, _) = Sanitizer::parse_whitespaces(string)?; - // Parse the default value from the string. - let (string, default) = Operand::parse(string)?; - - // Parse the whitespace from the string. - let (string, _) = Sanitizer::parse_whitespaces(string)?; - // Parse the "into" keyword from the string. - let (string, _) = tag("into")(string)?; - // Parse the whitespace from the string. - let (string, _) = Sanitizer::parse_whitespaces(string)?; - // Parse the destination register from the string. - let (string, destination) = Register::parse(string)?; - - // Parse the whitespace from the string. - let (string, _) = Sanitizer::parse_whitespaces(string)?; - // Parse the ";" from the string. - let (string, _) = tag(";")(string)?; - - Ok((string, Self { mapping, key, default, destination })) - } - } - - impl FromStr for OldGetOrUse { - type Err = Error; - - #[inline] - fn from_str(string: &str) -> Result { - match Self::parse(string) { - Ok((remainder, object)) => { - // Ensure the remainder is empty. - ensure!( - remainder.is_empty(), - "Failed to parse string. Found invalid character in: \"{remainder}\"" - ); - // Return the object. - Ok(object) - } - Err(error) => bail!("Failed to parse string. {error}"), - } - } - } - - impl Debug for OldGetOrUse { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - Display::fmt(self, f) - } - } - - impl Display for OldGetOrUse { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - // Print the command. - write!(f, "get.or_use ")?; - // Print the mapping and key operand. - write!(f, "{}[{}] {} into ", self.mapping, self.key, self.default)?; - // Print the destination register. - write!(f, "{};", self.destination) - } + pub mapping: Identifier, + pub key: Operand, + pub default: Operand, + pub destination: Register, } impl ToBytes for OldGetOrUse { @@ -376,9 +294,13 @@ mod tests { fn test_from_bytes() { let (string, get_or_use) = GetOrUse::::parse("get.or_use account[r0] r1 into r2;").unwrap(); assert!(string.is_empty()); - let (string, old_get_or_use) = - OldGetOrUse::::parse("get.or_use account[r0] r1 into r2;").unwrap(); - assert!(string.is_empty()); + + let old_get_or_use = OldGetOrUse:: { + mapping: Identifier::from_str("account").unwrap(), + key: Operand::Register(Register::Locator(0)), + default: Operand::Register(Register::Locator(1)), + destination: Register::Locator(2), + }; let get_or_use_bytes = get_or_use.to_bytes_le().unwrap(); let old_get_or_use_bytes = old_get_or_use.to_bytes_le().unwrap(); From fc202d94402d9c2e53979f246ce5afded436040d Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Mon, 30 Oct 2023 18:03:33 -0400 Subject: [PATCH 061/339] Fix --- console/program/src/data/identifier/bytes.rs | 7 +++++++ synthesizer/program/src/finalize/bytes.rs | 4 +++- synthesizer/program/src/logic/command/get.rs | 2 +- synthesizer/program/src/logic/command/get_or_use.rs | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/console/program/src/data/identifier/bytes.rs b/console/program/src/data/identifier/bytes.rs index e90d7fbae3..05f1fb0dc4 100644 --- a/console/program/src/data/identifier/bytes.rs +++ b/console/program/src/data/identifier/bytes.rs @@ -22,9 +22,11 @@ impl FromBytes for Identifier { // Read the identifier bytes. let mut buffer = vec![0u8; size as usize]; + reader.read_exact(&mut buffer)?; // from_str the identifier. + // Note: `Self::from_str` ensures that the identifier string is not empty. Self::from_str(&String::from_utf8(buffer).map_err(|e| error(format!("Failed to decode identifier: {e}")))?) .map_err(|e| error(format!("{e}"))) } @@ -76,4 +78,9 @@ mod tests { } Ok(()) } + + #[test] + fn test_zero_identifier_fails() { + assert!(Identifier::::read_le(&[0u8; 1][..]).is_err()) + } } diff --git a/synthesizer/program/src/finalize/bytes.rs b/synthesizer/program/src/finalize/bytes.rs index b61eee31f2..df2f1094ce 100644 --- a/synthesizer/program/src/finalize/bytes.rs +++ b/synthesizer/program/src/finalize/bytes.rs @@ -108,7 +108,9 @@ finalize main: add r0 r1 into r8; add r0 r1 into r9; add r0 r1 into r10; - add r0 r1 into r11;"; + add r0 r1 into r11; + get accounts[r0] into r12; + get accounts[r1] into r13;"; let expected = Finalize::::from_str(finalize_string)?; let expected_bytes = expected.to_bytes_le()?; diff --git a/synthesizer/program/src/logic/command/get.rs b/synthesizer/program/src/logic/command/get.rs index e0173487bd..f2d0dda5a1 100644 --- a/synthesizer/program/src/logic/command/get.rs +++ b/synthesizer/program/src/logic/command/get.rs @@ -291,7 +291,7 @@ impl FromBytes for Get { fn read_le(reader: R) -> IoResult { // Peek at the first byte. // TODO (howardwu): For mainnet - Read a `MappingLocator`. - let mut reader = BufReader::new(reader); + let mut reader = BufReader::with_capacity(1, reader); let first_byte = { let buffer = reader.fill_buf()?; buffer.first().copied() diff --git a/synthesizer/program/src/logic/command/get_or_use.rs b/synthesizer/program/src/logic/command/get_or_use.rs index 7900b79eeb..466c9949c8 100644 --- a/synthesizer/program/src/logic/command/get_or_use.rs +++ b/synthesizer/program/src/logic/command/get_or_use.rs @@ -207,7 +207,7 @@ impl FromBytes for GetOrUse { fn read_le(reader: R) -> IoResult { // Peek at the first byte. // TODO (howardwu): For mainnet - Read a `MappingLocator`. - let mut reader = BufReader::new(reader); + let mut reader = BufReader::with_capacity(1, reader); let first_byte = { let buffer = reader.fill_buf()?; buffer.first().copied() From c1cfaa19cee8849fdd2f49d2b5de498c60d1d45a Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 31 Oct 2023 13:50:52 -0700 Subject: [PATCH 062/339] Fix get_map_and_key indexing --- .../src/helpers/rocksdb/internal/nested_map.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/ledger/store/src/helpers/rocksdb/internal/nested_map.rs b/ledger/store/src/helpers/rocksdb/internal/nested_map.rs index 73bf49bee0..84be7c9096 100644 --- a/ledger/store/src/helpers/rocksdb/internal/nested_map.rs +++ b/ledger/store/src/helpers/rocksdb/internal/nested_map.rs @@ -16,7 +16,7 @@ use super::*; use crate::helpers::{NestedMap, NestedMapRead}; -use console::prelude::FromBytes; +use console::prelude::{anyhow, FromBytes}; use core::{fmt, fmt::Debug, hash::Hash, mem}; use std::{borrow::Cow, sync::atomic::Ordering}; @@ -80,10 +80,20 @@ impl Result<(&[u8], &[u8])> { - let map_len = u32::from_bytes_le(&map_key[PREFIX_LEN..][..4])? as usize; - let map = &map_key[PREFIX_LEN + 4..][..map_len]; - let key = &map_key[PREFIX_LEN + 4 + map_len..]; + // Retrieve the map length. + let map_len = u32::from_bytes_le( + map_key.get(PREFIX_LEN..PREFIX_LEN + 4).ok_or_else(|| anyhow!("NestedMap map_len index out of range"))?, + )? as usize; + // Retrieve the map bytes. + let map = map_key + .get(PREFIX_LEN + 4..PREFIX_LEN + 4 + map_len) + .ok_or_else(|| anyhow!("NestedMap map index out of range"))?; + + // Retrieve the key bytes. + let key = map_key.get(PREFIX_LEN + 4 + map_len..).ok_or_else(|| anyhow!("NestedMap key index out of range"))?; + + // Return the map and key bytes. Ok((map, key)) } From 59e3ec535fde17114734740c202a6c15c36f6b0f Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 31 Oct 2023 13:55:22 -0700 Subject: [PATCH 063/339] Update console/program/src/data/identifier/bytes.rs Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- console/program/src/data/identifier/bytes.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/console/program/src/data/identifier/bytes.rs b/console/program/src/data/identifier/bytes.rs index 05f1fb0dc4..b286e5ec5a 100644 --- a/console/program/src/data/identifier/bytes.rs +++ b/console/program/src/data/identifier/bytes.rs @@ -22,7 +22,6 @@ impl FromBytes for Identifier { // Read the identifier bytes. let mut buffer = vec![0u8; size as usize]; - reader.read_exact(&mut buffer)?; // from_str the identifier. From 6d34d6e6355562c62da427b1d3b74a26f5b008f4 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 31 Oct 2023 17:11:02 -0400 Subject: [PATCH 064/339] Remove kary benchmarks in CB --- .github/workflows/benchmarks.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index f33dfcd481..bd6e7ad390 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -60,7 +60,6 @@ jobs: run: | cd console/collections cargo bench --bench merkle_tree -- --output-format bencher | tee -a ../../output.txt - cargo bench --bench kary_merkle_tree -- --output-format bencher | tee -a ../../output.txt cd ../.. - name: Benchmark curves From aa473471f8b42133ee9958a676f6e241591add57 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Tue, 31 Oct 2023 18:10:31 -0400 Subject: [PATCH 065/339] Remove unwrap --- .../process/src/stack/finalize_types/initialize.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/synthesizer/process/src/stack/finalize_types/initialize.rs b/synthesizer/process/src/stack/finalize_types/initialize.rs index ae17caf484..e36fe3d552 100644 --- a/synthesizer/process/src/stack/finalize_types/initialize.rs +++ b/synthesizer/process/src/stack/finalize_types/initialize.rs @@ -312,8 +312,7 @@ impl FinalizeTypes { bail!("Mapping '{mapping_name}' in '{program_id}' is not defined.") } // Retrieve the mapping from the program. - // Note that the unwrap is safe, as we have already checked the mapping exists. - external.get_mapping(mapping_name).unwrap() + external.get_mapping(mapping_name)? } MappingLocator::Resource(mapping_name) => { // Ensure the declared mapping in `get` is defined in the current program. @@ -321,8 +320,7 @@ impl FinalizeTypes { bail!("Mapping '{mapping_name}' in '{}' is not defined.", stack.program_id()) } // Retrieve the mapping from the program. - // Note that the unwrap is safe, as we have already checked the mapping exists. - stack.program().get_mapping(mapping_name).unwrap() + stack.program().get_mapping(mapping_name)? } }; @@ -380,8 +378,7 @@ impl FinalizeTypes { bail!("Mapping '{mapping_name}' in '{program_id}' is not defined.") } // Retrieve the mapping from the program. - // Note that the unwrap is safe, as we have already checked the mapping exists. - external.get_mapping(mapping_name).unwrap() + external.get_mapping(mapping_name)? } MappingLocator::Resource(mapping_name) => { // Ensure the declared mapping in `get.or_use` is defined in the current program. @@ -389,8 +386,7 @@ impl FinalizeTypes { bail!("Mapping '{mapping_name}' in '{}' is not defined.", stack.program_id()) } // Retrieve the mapping from the program. - // Note that the unwrap is safe, as we have already checked the mapping exists. - stack.program().get_mapping(mapping_name).unwrap() + stack.program().get_mapping(mapping_name)? } }; From cee951cf2c07ee93553d389cd4d996162068c472 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Tue, 31 Oct 2023 18:52:57 -0400 Subject: [PATCH 066/339] Implement fix --- synthesizer/program/src/logic/command/get.rs | 48 ++++++++++++++--- .../program/src/logic/command/get_or_use.rs | 51 ++++++++++++++++--- 2 files changed, 83 insertions(+), 16 deletions(-) diff --git a/synthesizer/program/src/logic/command/get.rs b/synthesizer/program/src/logic/command/get.rs index f2d0dda5a1..3537877ff3 100644 --- a/synthesizer/program/src/logic/command/get.rs +++ b/synthesizer/program/src/logic/command/get.rs @@ -125,7 +125,7 @@ impl ToBytes for MappingLocator { /// A get command, e.g. `get accounts[r0] into r1;`. /// Gets the value stored at `operand` in `mapping` and stores the result in `destination`. -#[derive(Clone, PartialEq, Eq, Hash)] +#[derive(Clone)] pub struct Get { /// The mapping. // TODO (howardwu): For mainnet - Use `CallOperator`, delete the above `MappingLocator`. @@ -134,6 +134,28 @@ pub struct Get { key: Operand, /// The destination register. destination: Register, + // TODO (howardwu): For mainnet - remove `is_old`. + is_old: bool, +} + +impl PartialEq for Get { + /// Returns true if the two objects are equal. + #[inline] + fn eq(&self, other: &Self) -> bool { + self.mapping == other.mapping && self.key == other.key && self.destination == other.destination + } +} + +impl Eq for Get {} + +impl std::hash::Hash for Get { + /// Returns the hash of the object. + #[inline] + fn hash(&self, state: &mut H) { + self.mapping.hash(state); + self.key.hash(state); + self.destination.hash(state); + } } impl Get { @@ -245,7 +267,7 @@ impl Parser for Get { // Parse the ";" from the string. let (string, _) = tag(";")(string)?; - Ok((string, Self { mapping, key, destination })) + Ok((string, Self { mapping, key, destination, is_old: false })) } } @@ -294,20 +316,22 @@ impl FromBytes for Get { let mut reader = BufReader::with_capacity(1, reader); let first_byte = { let buffer = reader.fill_buf()?; - buffer.first().copied() + match buffer.first() { + Some(byte) => *byte, + None => return Err(error("Failed to read `get`. Expected byte.")), + } }; // If the first byte is zero, then read a `MappingLocator`, otherwise read an `Identifier`. let mapping = match first_byte { - Some(0u8) => MappingLocator::read_le(&mut reader)?, - Some(_) => MappingLocator::Resource(Identifier::read_le(&mut reader)?), - None => return Err(error("Failed to read `get`. Expected byte.")), + 0u8 => MappingLocator::read_le(&mut reader)?, + _ => MappingLocator::Resource(Identifier::read_le(&mut reader)?), }; // Read the key operand. let key = Operand::read_le(&mut reader)?; // Read the destination register. let destination = Register::read_le(&mut reader)?; // Return the command. - Ok(Self { mapping, key, destination }) + Ok(Self { mapping, key, destination, is_old: !first_byte.is_zero() }) } } @@ -315,7 +339,15 @@ impl ToBytes for Get { /// Writes the operation to a buffer. fn write_le(&self, mut writer: W) -> IoResult<()> { // Write the mapping name. - self.mapping.write_le(&mut writer)?; + match self.is_old { + false => self.mapping.write_le(&mut writer)?, + true => match self.mapping { + MappingLocator::Resource(identifier) => identifier.write_le(&mut writer)?, + MappingLocator::Locator(_) => { + return Err(error("Expected `MappingLocator::Resource` for `get`.")); + } + }, + } // Write the key operand. self.key.write_le(&mut writer)?; // Write the destination register. diff --git a/synthesizer/program/src/logic/command/get_or_use.rs b/synthesizer/program/src/logic/command/get_or_use.rs index 466c9949c8..a78deaa1c5 100644 --- a/synthesizer/program/src/logic/command/get_or_use.rs +++ b/synthesizer/program/src/logic/command/get_or_use.rs @@ -29,9 +29,10 @@ use std::io::{BufRead, BufReader}; /// A get command that uses the provided default in case of failure, e.g. `get.or_use accounts[r0] r1 into r2;`. /// Gets the value stored at `operand` in `mapping` and stores the result in `destination`. /// If the key is not present, `default` is stored in `destination`. -#[derive(Clone, PartialEq, Eq, Hash)] +#[derive(Clone)] pub struct GetOrUse { /// The mapping. + // TODO (howardwu): For mainnet - Use `CallOperator`, delete the above `MappingLocator`. mapping: MappingLocator, /// The key to access the mapping. key: Operand, @@ -39,6 +40,30 @@ pub struct GetOrUse { default: Operand, /// The destination register. destination: Register, + // TODO (howardwu): For mainnet - remove `is_old`. + is_old: bool, +} + +impl PartialEq for GetOrUse { + #[inline] + fn eq(&self, other: &Self) -> bool { + self.mapping == other.mapping + && self.key == other.key + && self.default == other.default + && self.destination == other.destination + } +} + +impl Eq for GetOrUse {} + +impl std::hash::Hash for GetOrUse { + #[inline] + fn hash(&self, state: &mut H) { + self.mapping.hash(state); + self.key.hash(state); + self.default.hash(state); + self.destination.hash(state); + } } impl GetOrUse { @@ -161,7 +186,7 @@ impl Parser for GetOrUse { // Parse the ";" from the string. let (string, _) = tag(";")(string)?; - Ok((string, Self { mapping, key, default, destination })) + Ok((string, Self { mapping, key, default, destination, is_old: false })) } } @@ -210,13 +235,15 @@ impl FromBytes for GetOrUse { let mut reader = BufReader::with_capacity(1, reader); let first_byte = { let buffer = reader.fill_buf()?; - buffer.first().copied() + match buffer.first() { + Some(byte) => *byte, + None => return Err(error("Failed to read `get.or_use`. Expected byte.")), + } }; // If the first byte is zero, then read a `MappingLocator`, otherwise read an `Identifier`. let mapping = match first_byte { - Some(0u8) => MappingLocator::read_le(&mut reader)?, - Some(_) => MappingLocator::Resource(Identifier::read_le(&mut reader)?), - None => return Err(error("Failed to read `get.or_use`. Expected byte.")), + 0u8 => MappingLocator::read_le(&mut reader)?, + _ => MappingLocator::Resource(Identifier::read_le(&mut reader)?), }; // Read the key operand. let key = Operand::read_le(&mut reader)?; @@ -225,7 +252,7 @@ impl FromBytes for GetOrUse { // Read the destination register. let destination = Register::read_le(&mut reader)?; // Return the command. - Ok(Self { mapping, key, default, destination }) + Ok(Self { mapping, key, default, destination, is_old: !first_byte.is_zero() }) } } @@ -233,7 +260,15 @@ impl ToBytes for GetOrUse { /// Writes the operation to a buffer. fn write_le(&self, mut writer: W) -> IoResult<()> { // Write the mapping name. - self.mapping.write_le(&mut writer)?; + match self.is_old { + false => self.mapping.write_le(&mut writer)?, + true => match self.mapping { + MappingLocator::Resource(identifier) => identifier.write_le(&mut writer)?, + MappingLocator::Locator(_) => { + return Err(error("Expected `MappingLocator::Resource` for `get.or_use`.")); + } + }, + } // Write the key operand. self.key.write_le(&mut writer)?; // Write the default value. From d7c4e8121e9295f083db03bebae26b93b9aa062f Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 31 Oct 2023 21:08:18 -0700 Subject: [PATCH 067/339] Adds in test case --- .circleci/config.yml | 12 +++++++ ledger/src/lib.rs | 18 ++++++++-- ledger/src/tests.rs | 52 ++++++++++++++++++++++++++- ledger/store/src/program/committee.rs | 5 ++- synthesizer/src/vm/mod.rs | 18 +++++++--- 5 files changed, 95 insertions(+), 10 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c78cf5f13b..2402f7faa9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -480,6 +480,16 @@ jobs: workspace_member: ledger cache_key: snarkvm-ledger-cache + ledger-with-rocksdb: + docker: + - image: cimg/rust:1.71.1 + resource_class: 2xlarge + steps: + - run_serial: + flags: --features=rocks + workspace_member: ledger + cache_key: snarkvm-ledger-with-rocksdb-cache + ledger-authority: docker: - image: cimg/rust:1.71.1 @@ -854,6 +864,8 @@ workflows: - curves - fields - ledger +# TODO (howardwu) - Implement `open_testing` on all storage, update to `CurrentConsensusStore::open_testing`, then re-enable. +# - ledger-with-rocksdb - ledger-authority - ledger-block - ledger-coinbase diff --git a/ledger/src/lib.rs b/ledger/src/lib.rs index 568d501ac2..0e5511b798 100644 --- a/ledger/src/lib.rs +++ b/ledger/src/lib.rs @@ -392,11 +392,23 @@ pub(crate) mod test_helpers { prelude::*, }; use ledger_block::Block; - use ledger_store::{helpers::memory::ConsensusMemory, ConsensusStore}; + use ledger_store::ConsensusStore; use synthesizer::vm::VM; pub(crate) type CurrentNetwork = Testnet3; - pub(crate) type CurrentLedger = Ledger>; + + #[cfg(not(feature = "rocks"))] + pub(crate) type CurrentLedger = + Ledger>; + #[cfg(feature = "rocks")] + pub(crate) type CurrentLedger = Ledger>; + + #[cfg(not(feature = "rocks"))] + pub(crate) type CurrentConsensusStore = + ConsensusStore>; + #[cfg(feature = "rocks")] + pub(crate) type CurrentConsensusStore = + ConsensusStore>; #[allow(dead_code)] pub(crate) struct TestEnv { @@ -426,7 +438,7 @@ pub(crate) mod test_helpers { rng: &mut (impl Rng + CryptoRng), ) -> CurrentLedger { // Initialize the store. - let store = ConsensusStore::<_, ConsensusMemory<_>>::open(None).unwrap(); + let store = CurrentConsensusStore::open(None).unwrap(); // Create a genesis block. let genesis = VM::from(store).unwrap().genesis_beacon(&private_key, rng).unwrap(); // Initialize the ledger with the genesis block. diff --git a/ledger/src/tests.rs b/ledger/src/tests.rs index d033edef82..93fd576793 100644 --- a/ledger/src/tests.rs +++ b/ledger/src/tests.rs @@ -81,7 +81,7 @@ fn test_state_path() { } #[test] -fn test_insufficient_fees() { +fn test_insufficient_private_fees() { let rng = &mut TestRng::default(); // Initialize the test environment. @@ -190,6 +190,56 @@ finalize foo: } } +#[test] +fn test_insufficient_public_fees() { + let rng = &mut TestRng::default(); + + // Initialize the test environment. + let crate::test_helpers::TestEnv { ledger, private_key, address, .. } = crate::test_helpers::sample_test_env(rng); + + // Sample recipient. + let recipient_private_key = PrivateKey::new(rng).unwrap(); + let recipient_address = Address::try_from(&recipient_private_key).unwrap(); + + // Fund the recipient with 1 million credits. + { + let inputs = + [Value::from_str(&format!("{recipient_address}")).unwrap(), Value::from_str("1000000000000u64").unwrap()]; + let transaction = ledger + .vm + .execute(&private_key, ("credits.aleo", "transfer_public"), inputs.into_iter(), None, 0, None, rng) + .unwrap(); + + let block = + ledger.prepare_advance_to_next_beacon_block(&private_key, vec![], vec![], vec![transaction], rng).unwrap(); + + // Check that the next block is valid. + ledger.check_next_block(&block).unwrap(); + // Add the deployment block to the ledger. + ledger.advance_to_next_block(&block).unwrap(); + } + + println!("-----------"); + + // Attempt to bond the node with insufficient public fees. + { + let inputs = + [Value::from_str(&format!("{recipient_address}")).unwrap(), Value::from_str("1000000000000u64").unwrap()]; + let transaction = ledger + .vm + .execute(&recipient_private_key, ("credits.aleo", "bond_public"), inputs.into_iter(), None, 0, None, rng) + .unwrap(); + + let block = + ledger.prepare_advance_to_next_beacon_block(&private_key, vec![], vec![], vec![transaction], rng).unwrap(); + + // Check that the next block is valid. + ledger.check_next_block(&block).unwrap(); + // Add the deployment block to the ledger. + ledger.advance_to_next_block(&block).unwrap(); + } +} + #[test] fn test_insufficient_finalize_fees() { let rng = &mut TestRng::default(); diff --git a/ledger/store/src/program/committee.rs b/ledger/store/src/program/committee.rs index 71c764d51a..62cd6e0bbb 100644 --- a/ledger/store/src/program/committee.rs +++ b/ledger/store/src/program/committee.rs @@ -114,7 +114,10 @@ pub trait CommitteeStorage: 'static + Clone + Send + Sync { // If the current round is 0, ensure the next round is 0. Err(..) => ensure!(next_round == 0, "Next round must be block round 0"), // Otherwise, ensure the next round sequentially follows the current round. - Ok(current_round) => ensure!(next_round > current_round, "Next round must be greater than current round"), + Ok(current_round) => ensure!( + next_round > current_round, + "Next round {next_round} must be greater than current round {current_round}" + ), } // Check the next height. diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index bfcc0b6d5e..baa491b906 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -187,18 +187,26 @@ impl> VM { impl> VM { /// Returns a new genesis block for a beacon chain. pub fn genesis_beacon(&self, private_key: &PrivateKey, rng: &mut R) -> Result> { + let private_keys = [*private_key, PrivateKey::new(rng)?, PrivateKey::new(rng)?, PrivateKey::new(rng)?]; + // Construct the committee members. let members = indexmap::indexmap! { - Address::try_from(private_key)? => (ledger_committee::MIN_VALIDATOR_STAKE, true), - Address::try_from(PrivateKey::new(rng)?)? => (ledger_committee::MIN_VALIDATOR_STAKE, true), - Address::try_from(PrivateKey::new(rng)?)? => (ledger_committee::MIN_VALIDATOR_STAKE, true), - Address::try_from(PrivateKey::new(rng)?)? => (ledger_committee::MIN_VALIDATOR_STAKE, true), + Address::try_from(private_keys[0])? => (ledger_committee::MIN_VALIDATOR_STAKE, true), + Address::try_from(private_keys[1])? => (ledger_committee::MIN_VALIDATOR_STAKE, true), + Address::try_from(private_keys[2])? => (ledger_committee::MIN_VALIDATOR_STAKE, true), + Address::try_from(private_keys[3])? => (ledger_committee::MIN_VALIDATOR_STAKE, true), }; // Construct the committee. let committee = Committee::::new_genesis(members)?; + + // Compute the remaining supply. + let remaining_supply = N::STARTING_SUPPLY - (ledger_committee::MIN_VALIDATOR_STAKE * 4); // Construct the public balances. let public_balances = indexmap::indexmap! { - Address::try_from(private_key)? => N::STARTING_SUPPLY - (ledger_committee::MIN_VALIDATOR_STAKE * 4), + Address::try_from(private_keys[0])? => remaining_supply / 4, + Address::try_from(private_keys[1])? => remaining_supply / 4, + Address::try_from(private_keys[2])? => remaining_supply / 4, + Address::try_from(private_keys[3])? => remaining_supply / 4, }; // Return the genesis block. self.genesis_quorum(private_key, committee, public_balances, rng) From 536956862d8091e333f9a1e6bb75d560077c245b Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 31 Oct 2023 21:17:44 -0700 Subject: [PATCH 068/339] Add breaks in db iterators --- ledger/src/tests.rs | 2 +- .../store/src/helpers/rocksdb/internal/nested_map.rs | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/ledger/src/tests.rs b/ledger/src/tests.rs index 93fd576793..af95102191 100644 --- a/ledger/src/tests.rs +++ b/ledger/src/tests.rs @@ -195,7 +195,7 @@ fn test_insufficient_public_fees() { let rng = &mut TestRng::default(); // Initialize the test environment. - let crate::test_helpers::TestEnv { ledger, private_key, address, .. } = crate::test_helpers::sample_test_env(rng); + let crate::test_helpers::TestEnv { ledger, private_key, .. } = crate::test_helpers::sample_test_env(rng); // Sample recipient. let recipient_private_key = PrivateKey::new(rng).unwrap(); diff --git a/ledger/store/src/helpers/rocksdb/internal/nested_map.rs b/ledger/store/src/helpers/rocksdb/internal/nested_map.rs index 84be7c9096..43ddc457e7 100644 --- a/ledger/store/src/helpers/rocksdb/internal/nested_map.rs +++ b/ledger/store/src/helpers/rocksdb/internal/nested_map.rs @@ -150,7 +150,9 @@ impl< let (map_key, _) = entry?; // Extract the bytes belonging to the map and the key. - let (entry_map, _) = get_map_and_key(&map_key)?; + let Ok((entry_map, _)) = get_map_and_key(&map_key) else { + break; + }; // If the 'entry_map' matches 'serialized_map', delete the key. if entry_map == serialized_map { @@ -292,7 +294,9 @@ impl< let (map_key, _) = entry?; // Extract the bytes belonging to the map and the key. - let (entry_map, _) = get_map_and_key(&map_key)?; + let Ok((entry_map, _)) = get_map_and_key(&map_key) else { + break; + }; // If the 'entry_map' matches 'serialized_map', delete the key. if entry_map == serialized_map { @@ -407,7 +411,9 @@ impl< let (map_key, value) = entry?; // Extract the bytes belonging to the map and the key. - let (entry_map, entry_key) = get_map_and_key(&map_key)?; + let Ok((entry_map, entry_key)) = get_map_and_key(&map_key) else { + break; + }; // If the 'entry_map' matches 'serialized_map', deserialize the key and value. if entry_map == serialized_map { From 06e80aa2dddd770fe2e711bb8e80b3e6b793d73e Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 31 Oct 2023 10:47:50 +0100 Subject: [PATCH 069/339] tests: add a case for a mixed map storage Signed-off-by: ljedrz --- .../store/src/helpers/rocksdb/internal/id.rs | 3 + .../helpers/rocksdb/internal/nested_map.rs | 68 +++++++++++++++++-- 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/ledger/store/src/helpers/rocksdb/internal/id.rs b/ledger/store/src/helpers/rocksdb/internal/id.rs index 3091895661..0d47eecd83 100644 --- a/ledger/store/src/helpers/rocksdb/internal/id.rs +++ b/ledger/store/src/helpers/rocksdb/internal/id.rs @@ -195,6 +195,7 @@ pub enum TestMap { Test2 = DataID::Test2 as u16, Test3 = DataID::Test3 as u16, Test4 = DataID::Test4 as u16, + Test5 = DataID::Test5 as u16, } /// The RocksDB map prefix. @@ -282,4 +283,6 @@ enum DataID { Test3, #[cfg(test)] Test4, + #[cfg(test)] + Test5, } diff --git a/ledger/store/src/helpers/rocksdb/internal/nested_map.rs b/ledger/store/src/helpers/rocksdb/internal/nested_map.rs index 43ddc457e7..ff20f34319 100644 --- a/ledger/store/src/helpers/rocksdb/internal/nested_map.rs +++ b/ledger/store/src/helpers/rocksdb/internal/nested_map.rs @@ -724,7 +724,10 @@ mod tests { use crate::{ atomic_batch_scope, atomic_finalize, - helpers::rocksdb::{internal::tests::temp_dir, MapID, TestMap}, + helpers::{ + rocksdb::{internal::tests::temp_dir, MapID, TestMap}, + traits::Map, + }, FinalizeMode, }; use console::{ @@ -764,6 +767,28 @@ mod tests { } } + fn open_non_nested_map_testing_from_db< + K: Serialize + DeserializeOwned, + V: Serialize + DeserializeOwned, + T: Into, + >( + database: RocksDB, + map_id: T, + ) -> DataMap { + // Combine contexts to create a new scope. + let mut context = database.network_id.to_le_bytes().to_vec(); + context.extend_from_slice(&(map_id.into()).to_le_bytes()); + + // Return the DataMap. + DataMap(Arc::new(InnerDataMap { + database, + context, + atomic_batch: Default::default(), + batch_in_progress: Default::default(), + checkpoints: Default::default(), + })) + } + struct TestStorage { own_map: NestedDataMap, extra_maps: TestStorage2, @@ -872,35 +897,44 @@ mod tests { struct TestStorage3 { own_map: NestedDataMap, + own_non_nested_map: DataMap, } impl TestStorage3 { fn open(database: RocksDB) -> Self { - Self { own_map: open_map_testing_from_db(database, MapID::Test(TestMap::Test4)) } + Self { + own_map: open_map_testing_from_db(database.clone(), MapID::Test(TestMap::Test4)), + own_non_nested_map: open_non_nested_map_testing_from_db(database, MapID::Test(TestMap::Test5)), + } } fn start_atomic(&self) { self.own_map.start_atomic(); + self.own_non_nested_map.start_atomic(); } fn is_atomic_in_progress(&self) -> bool { - self.own_map.is_atomic_in_progress() + self.own_map.is_atomic_in_progress() || self.own_non_nested_map.is_atomic_in_progress() } fn atomic_checkpoint(&self) { self.own_map.atomic_checkpoint(); + self.own_non_nested_map.atomic_checkpoint(); } fn clear_latest_checkpoint(&self) { self.own_map.clear_latest_checkpoint(); + self.own_non_nested_map.clear_latest_checkpoint(); } fn atomic_rewind(&self) { self.own_map.atomic_rewind(); + self.own_non_nested_map.atomic_rewind(); } fn finish_atomic(&self) -> Result<()> { - self.own_map.finish_atomic() + self.own_map.finish_atomic()?; + self.own_non_nested_map.finish_atomic() } } @@ -982,6 +1016,32 @@ mod tests { crate::helpers::test_helpers::nested_map::check_iterators_match(map); } + #[test] + #[serial] + #[traced_test] + fn test_iter_from_nested_to_non_nested() { + // Open a storage with a DataMap right after a NestedDataMap. + let database = RocksDB::open_testing(temp_dir(), None).expect("Failed to open a test database"); + let test_storage = TestStorage3::open(database); + + // Insert 5 (confirmed) records into a nested map 77. + for i in 0..5 { + test_storage.own_map.insert(77, i, i.to_string()).expect("Failed to insert"); + } + + // Insert 5 (confirmed) records into the neighboring data map; the keys are large on purpose. + for i in 0..5 { + test_storage + .own_non_nested_map + .insert(usize::MAX - i, (usize::MAX - i).to_string()) + .expect("Failed to insert"); + } + + // We should be able to collect the 5 records from the nested data map. + let confirmed = test_storage.own_map.get_map_confirmed(&77).unwrap(); + assert_eq!(confirmed.len(), 5); + } + #[test] #[serial] #[traced_test] From de4ae987db12c2f0a1b2affe9ba1cca50ae07337 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 31 Oct 2023 21:35:41 -0700 Subject: [PATCH 070/339] Rename test variables --- .../helpers/rocksdb/internal/nested_map.rs | 51 +++++++++---------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/ledger/store/src/helpers/rocksdb/internal/nested_map.rs b/ledger/store/src/helpers/rocksdb/internal/nested_map.rs index ff20f34319..b168b3591a 100644 --- a/ledger/store/src/helpers/rocksdb/internal/nested_map.rs +++ b/ledger/store/src/helpers/rocksdb/internal/nested_map.rs @@ -839,7 +839,7 @@ mod tests { self.own_map.is_atomic_in_progress() && self.extra_maps.own_map1.is_atomic_in_progress() && self.extra_maps.own_map1.is_atomic_in_progress() - && self.extra_maps.extra_maps.own_map.is_atomic_in_progress() + && self.extra_maps.extra_maps.own_nested_map.is_atomic_in_progress() } } @@ -896,45 +896,45 @@ mod tests { } struct TestStorage3 { - own_map: NestedDataMap, - own_non_nested_map: DataMap, + own_nested_map: NestedDataMap, + own_map: DataMap, } impl TestStorage3 { fn open(database: RocksDB) -> Self { Self { - own_map: open_map_testing_from_db(database.clone(), MapID::Test(TestMap::Test4)), - own_non_nested_map: open_non_nested_map_testing_from_db(database, MapID::Test(TestMap::Test5)), + own_nested_map: open_map_testing_from_db(database.clone(), MapID::Test(TestMap::Test4)), + own_map: open_non_nested_map_testing_from_db(database, MapID::Test(TestMap::Test5)), } } fn start_atomic(&self) { + self.own_nested_map.start_atomic(); self.own_map.start_atomic(); - self.own_non_nested_map.start_atomic(); } fn is_atomic_in_progress(&self) -> bool { - self.own_map.is_atomic_in_progress() || self.own_non_nested_map.is_atomic_in_progress() + self.own_nested_map.is_atomic_in_progress() || self.own_map.is_atomic_in_progress() } fn atomic_checkpoint(&self) { + self.own_nested_map.atomic_checkpoint(); self.own_map.atomic_checkpoint(); - self.own_non_nested_map.atomic_checkpoint(); } fn clear_latest_checkpoint(&self) { + self.own_nested_map.clear_latest_checkpoint(); self.own_map.clear_latest_checkpoint(); - self.own_non_nested_map.clear_latest_checkpoint(); } fn atomic_rewind(&self) { + self.own_nested_map.atomic_rewind(); self.own_map.atomic_rewind(); - self.own_non_nested_map.atomic_rewind(); } fn finish_atomic(&self) -> Result<()> { - self.own_map.finish_atomic()?; - self.own_non_nested_map.finish_atomic() + self.own_nested_map.finish_atomic()?; + self.own_map.finish_atomic() } } @@ -1026,19 +1026,16 @@ mod tests { // Insert 5 (confirmed) records into a nested map 77. for i in 0..5 { - test_storage.own_map.insert(77, i, i.to_string()).expect("Failed to insert"); + test_storage.own_nested_map.insert(77, i, i.to_string()).expect("Failed to insert"); } // Insert 5 (confirmed) records into the neighboring data map; the keys are large on purpose. for i in 0..5 { - test_storage - .own_non_nested_map - .insert(usize::MAX - i, (usize::MAX - i).to_string()) - .expect("Failed to insert"); + test_storage.own_map.insert(usize::MAX - i, (usize::MAX - i).to_string()).expect("Failed to insert"); } // We should be able to collect the 5 records from the nested data map. - let confirmed = test_storage.own_map.get_map_confirmed(&77).unwrap(); + let confirmed = test_storage.own_nested_map.get_map_confirmed(&77).unwrap(); assert_eq!(confirmed.len(), 5); } @@ -1650,7 +1647,7 @@ mod tests { assert!(test_storage.own_map.iter_confirmed().next().is_none()); assert!(test_storage.extra_maps.own_map1.iter_confirmed().next().is_none()); assert!(test_storage.extra_maps.own_map2.iter_confirmed().next().is_none()); - assert!(test_storage.extra_maps.extra_maps.own_map.iter_confirmed().next().is_none()); + assert!(test_storage.extra_maps.extra_maps.own_nested_map.iter_confirmed().next().is_none()); assert_eq!(test_storage.own_map.checkpoints.lock().last(), None); @@ -1679,11 +1676,11 @@ mod tests { test_storage.extra_maps.own_map2.insert(2, 2, 2.to_string()).unwrap(); // Start another atomic write batch. - atomic_batch_scope!(test_storage.extra_maps.extra_maps.own_map, { - assert!(test_storage.extra_maps.extra_maps.own_map.is_atomic_in_progress()); + atomic_batch_scope!(test_storage.extra_maps.extra_maps.own_nested_map, { + assert!(test_storage.extra_maps.extra_maps.own_nested_map.is_atomic_in_progress()); // Write an item into the fourth map. - test_storage.extra_maps.extra_maps.own_map.insert(3, 3, 3.to_string()).unwrap(); + test_storage.extra_maps.extra_maps.own_nested_map.insert(3, 3, 3.to_string()).unwrap(); Ok(()) })?; @@ -1704,7 +1701,7 @@ mod tests { assert_eq!(test_storage.own_map.iter_confirmed().count(), 1); assert_eq!(test_storage.extra_maps.own_map1.iter_confirmed().count(), 1); assert_eq!(test_storage.extra_maps.own_map2.iter_confirmed().count(), 1); - assert_eq!(test_storage.extra_maps.extra_maps.own_map.iter_confirmed().count(), 1); + assert_eq!(test_storage.extra_maps.extra_maps.own_nested_map.iter_confirmed().count(), 1); // The atomic_write_batch macro uses ?, so the test returns a Result for simplicity. Ok(()) @@ -1735,11 +1732,11 @@ mod tests { test_storage.extra_maps.own_map2.insert(2, 2, 2.to_string()).unwrap(); // Start another atomic write batch. - let result: Result<()> = atomic_batch_scope!(test_storage.extra_maps.extra_maps.own_map, { + let result: Result<()> = atomic_batch_scope!(test_storage.extra_maps.extra_maps.own_nested_map, { assert!(test_storage.is_atomic_in_progress_everywhere()); // Write an item into the fourth map. - test_storage.extra_maps.extra_maps.own_map.insert(3, 3, 3.to_string()).unwrap(); + test_storage.extra_maps.extra_maps.own_nested_map.insert(3, 3, 3.to_string()).unwrap(); // Rewind the atomic batch via a simulated error. bail!("An error that will trigger a single rewind."); @@ -1766,7 +1763,7 @@ mod tests { assert!(test_storage.own_map.iter_confirmed().next().is_none()); assert!(test_storage.extra_maps.own_map1.iter_confirmed().next().is_none()); assert!(test_storage.extra_maps.own_map2.iter_confirmed().next().is_none()); - assert!(test_storage.extra_maps.extra_maps.own_map.iter_confirmed().next().is_none()); + assert!(test_storage.extra_maps.extra_maps.own_nested_map.iter_confirmed().next().is_none()); // Note: all the checks going through .database can be performed on any one // of the objects, as all of them share the same instance of the database. @@ -1782,6 +1779,6 @@ mod tests { assert_eq!(test_storage.own_map.iter_confirmed().count(), 1); assert_eq!(test_storage.extra_maps.own_map1.iter_confirmed().count(), 1); assert_eq!(test_storage.extra_maps.own_map2.iter_confirmed().count(), 1); - assert_eq!(test_storage.extra_maps.extra_maps.own_map.iter_confirmed().count(), 0); + assert_eq!(test_storage.extra_maps.extra_maps.own_nested_map.iter_confirmed().count(), 0); } } From 21325b63f17f3281c5b53f0e2f4b2dce81bfdd6d Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Wed, 1 Nov 2023 01:01:22 -0400 Subject: [PATCH 071/339] Regenerate expectations --- .../vm/execute_and_finalize/child_and_parent.out | 4 ++-- .../vm/execute_and_finalize/complex_finalization.out | 8 ++++---- .../expectations/vm/execute_and_finalize/count_usages.out | 8 ++++---- .../vm/execute_and_finalize/program_callable.out | 4 ++-- .../vm/execute_and_finalize/public_wallet.out | 2 +- .../expectations/vm/execute_and_finalize/test_rand.out | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/child_and_parent.out b/synthesizer/tests/expectations/vm/execute_and_finalize/child_and_parent.out index a33be90307..46e5687c00 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/child_and_parent.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/child_and_parent.out @@ -26,8 +26,8 @@ additional: - child_outputs: child.aleo/foo: outputs: - - '{"type":"public","id":"994990058621570799386345097567825463488929977263218477287025824851872546446field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' - - '{"type":"public","id":"2256104170911230762284986427287133867149405204422634231010917189963141359010field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"5247898905227353609778507804894201830213116355942129794185831563892847697904field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' + - '{"type":"public","id":"5696731482704228331490606142901378912648054832970914942122047737341299330880field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' credits.aleo/fee_private: outputs: - '{"type":"record","id":"3845927395044855364546905308732895913294823927145229411137666358260055754822field","checksum":"1584433976273241291707799637296934525591046977180320555626848307441674321598field","value":"record1qyqsp3c590shnra6j8rc3ezq5k229gcd8srjpxpf2vn7drkccmrq8tqrqyxx66trwfhkxun9v35hguerqqpqzq9m2h242d3v2sm53yzkqkuu6v2cwaz0jpq7nseh2uxqedph6gz9pmsvcdfnpn0htvu2lvx9cpvs6sssvhj972rpakkdzjmj4n7fhwhs6fjpcap"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/complex_finalization.out b/synthesizer/tests/expectations/vm/execute_and_finalize/complex_finalization.out index 62b00223bd..efb5cc2e49 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/complex_finalization.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/complex_finalization.out @@ -11,16 +11,16 @@ additional: - child_outputs: zero_program.aleo/c: outputs: - - '{"type":"future","id":"6952696836717992189844193836164206763601783392883300349164619423689411832957field","value":"{\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' + - '{"type":"future","id":"1905462962689695038453701745598203401537060599092388120411862554545031055970field","value":"{\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' one_program.aleo/d: outputs: - - '{"type":"future","id":"3375358791246667464469024643039205630228640255715459354259647324302115771724field","value":"{\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' + - '{"type":"future","id":"6693143058720846069430783074439454880228662860018405276072484028873963650423field","value":"{\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' two_program.aleo/b: outputs: - - '{"type":"future","id":"364582187421035500339943835636532028870700065252111564274460853535036892560field","value":"{\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' + - '{"type":"future","id":"491254750407294442708769751402250675930358534067257210689773980657773666656field","value":"{\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' three_program.aleo/e: outputs: - - '{"type":"future","id":"5353639949292491626228591653810953466693160316414035702266036019526362677427field","value":"{\n program_id: three_program.aleo,\n function_name: e,\n arguments: [\n {\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' + - '{"type":"future","id":"3726717185600495415803494559204677788759912659186157220182093722580745931290field","value":"{\n program_id: three_program.aleo,\n function_name: e,\n arguments: [\n {\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' credits.aleo/fee_private: outputs: - '{"type":"record","id":"5283229445241909733017633528975572727346436141849413233403355092851851760389field","checksum":"799210811176292053431285281723859450131511292642705172333396010564735450437field","value":"record1qyqsqkme4g74y49w7v70p63ywtq5nate5r75dk8m05ss5zmer5zeqrggqyxx66trwfhkxun9v35hguerqqpqzqx2jzxmtf2rksjtwnl4xz5uu33vh0hdl5gys60lw5tdywm6w864qpzvzv6t35yczkzxqpeh7ckc5wtmt5sxynlcz9fy5ellqapnz8squlrzfgw"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/count_usages.out b/synthesizer/tests/expectations/vm/execute_and_finalize/count_usages.out index 3a80e7786a..ca1856b203 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/count_usages.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/count_usages.out @@ -12,12 +12,12 @@ additional: - child_outputs: basic_math.aleo/add_and_count: outputs: - - '{"type":"private","id":"2189963205002380951731804610675645921799015755766185151265166514396381689207field","value":"ciphertext1qyqwpu5p92d4lrcfhthx0emqpj6cldsty3ghv6mhztl69wyk7j42cpqpq2uaz"}' - - '{"type":"future","id":"1762068320811124981245699286589805951610339834807816585249322967070273785765field","value":"{\n program_id: basic_math.aleo,\n function_name: add_and_count,\n arguments: [\n aleo1mrughg5ssadd9fc2uwve7l6u24xn76kyz24zsjtzta03vgkq4vpqggl6fg\n ]\n}"}' + - '{"type":"private","id":"1772315556078612939485167533472365297291684867177607257721621802696977947575field","value":"ciphertext1qyqgcklg8azjw9cvg8ctguretgpwhf6s2wqfy9kcpat8fez58s8zkrsxh67uj"}' + - '{"type":"future","id":"7119746076995582562745785454448389581684828092421379752708247448276937401483field","value":"{\n program_id: basic_math.aleo,\n function_name: add_and_count,\n arguments: [\n aleo1mrughg5ssadd9fc2uwve7l6u24xn76kyz24zsjtzta03vgkq4vpqggl6fg\n ]\n}"}' basic_math.aleo/sub_and_count: outputs: - - '{"type":"private","id":"3237068809383979468892967123729721371250496145349751597456577370896562797315field","value":"ciphertext1qyqrqc0329zggejxfkdju3e5ng8cahudh6gmmwcu9kvhp2x784lrqqgfua69p"}' - - '{"type":"future","id":"4237975671848212071086918441612015189870459327089330453971374309755212325698field","value":"{\n program_id: basic_math.aleo,\n function_name: sub_and_count,\n arguments: [\n aleo1mrughg5ssadd9fc2uwve7l6u24xn76kyz24zsjtzta03vgkq4vpqggl6fg\n ]\n}"}' + - '{"type":"private","id":"4385798570457226847447139993266058099729895220721504161659868031463911613327field","value":"ciphertext1qyqdtuhzwzdqd0ezjqv0qakjqcwjgnve7u2q0mttr9fhmrfk8lppgrgns3l5x"}' + - '{"type":"future","id":"1481600775514027453204849289042631419545525289712332246758716884227294896058field","value":"{\n program_id: basic_math.aleo,\n function_name: sub_and_count,\n arguments: [\n aleo1mrughg5ssadd9fc2uwve7l6u24xn76kyz24zsjtzta03vgkq4vpqggl6fg\n ]\n}"}' credits.aleo/fee_private: outputs: - '{"type":"record","id":"3873686337596264307426391445386469102660995373532676522475799639542084414660field","checksum":"2174613677640073315115047311154070353095418041185484773007639715599946288810field","value":"record1qyqsq758xfnepvvywvf4tjnve5qkfr0hur7gttevq66hpvl97ulxzkgyqyxx66trwfhkxun9v35hguerqqpqzq85ufcypfdv6unklsc9m066e86drkzx32yzj9kwx7enflqv7j6xqz5v6hx0r0qp5r564yuanadwjkhvx4tj3xp407hh058jl7u0v9qq2z6nqqz"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/program_callable.out b/synthesizer/tests/expectations/vm/execute_and_finalize/program_callable.out index 150420a0fa..aefc6c15e6 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/program_callable.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/program_callable.out @@ -16,8 +16,8 @@ additional: - child_outputs: child.aleo/foo: outputs: - - '{"type":"public","id":"5601132905719769837487481041811167147031721408864816226961174115045250639394field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' - - '{"type":"public","id":"4866955403610457225216600968672882719581841491915839063024906456611968828355field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"5334867623218595534708726257738756067611806976563813684130095277315778727015field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' + - '{"type":"public","id":"1727089994158808720293796677503877381843056781736540181516614343299100979544field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' credits.aleo/fee_private: outputs: - '{"type":"record","id":"3405674025766329369434309421947987188809020226610822755338621799001328840366field","checksum":"2290293865028149494249499535633241867489656506924610383724277827943521435010field","value":"record1qyqsq8u5n9rn77xzqqemfr60lr5gd0kl3kmcr8y4kvf34rtxkn5jzhsyqyxx66trwfhkxun9v35hguerqqpqzqyhetu9jy8vsyeaqsq5thyrj7nldd626s0fgatwpffv5j3hecq6p7pkx5xqz4xfcrlu8u2tz8hew0wuagx3cc0wgzlq7uhr2lrc35nqy7dgy47"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/public_wallet.out b/synthesizer/tests/expectations/vm/execute_and_finalize/public_wallet.out index 83bd95ab4c..3ac28d5188 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/public_wallet.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/public_wallet.out @@ -11,7 +11,7 @@ additional: - child_outputs: token.aleo/mint_public: outputs: - - '{"type":"future","id":"4537627763763327286502315223758961709385837795977680378235435937164895010454field","value":"{\n program_id: token.aleo,\n function_name: mint_public,\n arguments: [\n aleo1sry3pke49ykrf0aeshf889tr98r4c86p5f4ms766795ssdwfdyqq9jdg0j,\n 10u64\n ]\n}"}' + - '{"type":"future","id":"4427917061221785896976649017270098343030953189539524433709150411558826004395field","value":"{\n program_id: token.aleo,\n function_name: mint_public,\n arguments: [\n aleo1sry3pke49ykrf0aeshf889tr98r4c86p5f4ms766795ssdwfdyqq9jdg0j,\n 10u64\n ]\n}"}' credits.aleo/fee_private: outputs: - '{"type":"record","id":"5907104904483017944370886525724321520913422122645092211228240860024172441663field","checksum":"5028009166132212399635589181092346921835371600420834084268447856042439491field","value":"record1qyqspshxjatwcdkrde0m2rspsm338q8p7s4eru9m8ftjqzf0ttxpkag0qyxx66trwfhkxun9v35hguerqqpqzqqzvfyzxfn5qlq5aewnafp8z576qvqjjx9pup92f6dxywga9qdupchalpjgkqrwva74ssnqjqgewu8xwj285f0c08t6czss5lcftjhqjuazgdk"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/test_rand.out b/synthesizer/tests/expectations/vm/execute_and_finalize/test_rand.out index f31addd98f..c5c06ec684 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/test_rand.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/test_rand.out @@ -19,7 +19,7 @@ outputs: test_rand.aleo/rand_chacha_check: outputs: - '{"type":"future","id":"5111075340000719619409954898038080805237607157543987731445343150082162501419field","value":"{\n program_id: test_rand.aleo,\n function_name: rand_chacha_check,\n arguments: [\n 0field,\n false\n ]\n}"}' - speculate: the execution was rejected + speculate: the execution was accepted add_next_block: succeeded. - verified: true execute: From 8f5d92ca4bc00f3b069750bd827f508bfced4921 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Wed, 1 Nov 2023 01:12:06 -0700 Subject: [PATCH 072/339] chore(snarkvm): bump version for new release --- .cargo/release-version | 2 +- Cargo.lock | 118 ++++++++++---------- Cargo.toml | 22 ++-- algorithms/Cargo.toml | 12 +- algorithms/cuda/Cargo.toml | 2 +- circuit/Cargo.toml | 16 +-- circuit/account/Cargo.toml | 10 +- circuit/algorithms/Cargo.toml | 8 +- circuit/collections/Cargo.toml | 8 +- circuit/environment/Cargo.toml | 14 +-- circuit/environment/witness/Cargo.toml | 2 +- circuit/network/Cargo.toml | 10 +- circuit/program/Cargo.toml | 16 +-- circuit/types/Cargo.toml | 18 +-- circuit/types/address/Cargo.toml | 14 +-- circuit/types/boolean/Cargo.toml | 6 +- circuit/types/field/Cargo.toml | 8 +- circuit/types/group/Cargo.toml | 12 +- circuit/types/integers/Cargo.toml | 12 +- circuit/types/scalar/Cargo.toml | 10 +- circuit/types/string/Cargo.toml | 12 +- console/Cargo.toml | 14 +-- console/account/Cargo.toml | 6 +- console/algorithms/Cargo.toml | 8 +- console/collections/Cargo.toml | 6 +- console/network/Cargo.toml | 20 ++-- console/network/environment/Cargo.toml | 8 +- console/program/Cargo.toml | 14 +-- console/types/Cargo.toml | 18 +-- console/types/address/Cargo.toml | 10 +- console/types/boolean/Cargo.toml | 4 +- console/types/field/Cargo.toml | 6 +- console/types/group/Cargo.toml | 10 +- console/types/integers/Cargo.toml | 10 +- console/types/scalar/Cargo.toml | 8 +- console/types/string/Cargo.toml | 10 +- curves/Cargo.toml | 6 +- fields/Cargo.toml | 4 +- ledger/Cargo.toml | 22 ++-- ledger/authority/Cargo.toml | 6 +- ledger/block/Cargo.toml | 18 +-- ledger/coinbase/Cargo.toml | 14 +-- ledger/committee/Cargo.toml | 4 +- ledger/narwhal/Cargo.toml | 14 +-- ledger/narwhal/batch-certificate/Cargo.toml | 8 +- ledger/narwhal/batch-header/Cargo.toml | 6 +- ledger/narwhal/data/Cargo.toml | 4 +- ledger/narwhal/subdag/Cargo.toml | 8 +- ledger/narwhal/transmission-id/Cargo.toml | 6 +- ledger/narwhal/transmission/Cargo.toml | 10 +- ledger/query/Cargo.toml | 8 +- ledger/store/Cargo.toml | 18 +-- ledger/test-helpers/Cargo.toml | 16 +-- parameters/Cargo.toml | 6 +- synthesizer/Cargo.toml | 24 ++-- synthesizer/process/Cargo.toml | 16 +-- synthesizer/program/Cargo.toml | 6 +- synthesizer/snark/Cargo.toml | 8 +- utilities/Cargo.toml | 4 +- utilities/derives/Cargo.toml | 2 +- wasm/Cargo.toml | 12 +- 61 files changed, 367 insertions(+), 367 deletions(-) diff --git a/.cargo/release-version b/.cargo/release-version index caec9a71d6..9534715702 100644 --- a/.cargo/release-version +++ b/.cargo/release-version @@ -1 +1 @@ -v0.16.6 \ No newline at end of file +v0.16.7 \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 4ba8707ebb..761cad564f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2473,7 +2473,7 @@ dependencies = [ [[package]] name = "snarkvm" -version = "0.16.6" +version = "0.16.7" dependencies = [ "anstyle", "anyhow", @@ -2508,7 +2508,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms" -version = "0.16.6" +version = "0.16.7" dependencies = [ "aleo-std", "anyhow", @@ -2547,7 +2547,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms-cuda" -version = "0.16.6" +version = "0.16.7" dependencies = [ "blst", "cc", @@ -2557,7 +2557,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit" -version = "0.16.6" +version = "0.16.7" dependencies = [ "snarkvm-circuit-account", "snarkvm-circuit-algorithms", @@ -2570,7 +2570,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-account" -version = "0.16.6" +version = "0.16.7" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2582,7 +2582,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-algorithms" -version = "0.16.6" +version = "0.16.7" dependencies = [ "anyhow", "snarkvm-circuit-types", @@ -2594,7 +2594,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-collections" -version = "0.16.6" +version = "0.16.7" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2608,7 +2608,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment" -version = "0.16.6" +version = "0.16.7" dependencies = [ "criterion", "indexmap 2.0.2", @@ -2629,11 +2629,11 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment-witness" -version = "0.16.6" +version = "0.16.7" [[package]] name = "snarkvm-circuit-network" -version = "0.16.6" +version = "0.16.7" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-collections", @@ -2644,7 +2644,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-program" -version = "0.16.6" +version = "0.16.7" dependencies = [ "anyhow", "paste", @@ -2662,7 +2662,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types" -version = "0.16.6" +version = "0.16.7" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-address", @@ -2677,7 +2677,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-address" -version = "0.16.6" +version = "0.16.7" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2689,7 +2689,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-boolean" -version = "0.16.6" +version = "0.16.7" dependencies = [ "criterion", "snarkvm-circuit-environment", @@ -2698,7 +2698,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-field" -version = "0.16.6" +version = "0.16.7" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2707,7 +2707,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-group" -version = "0.16.6" +version = "0.16.7" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2719,7 +2719,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-integers" -version = "0.16.6" +version = "0.16.7" dependencies = [ "paste", "snarkvm-circuit-environment", @@ -2732,7 +2732,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-scalar" -version = "0.16.6" +version = "0.16.7" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2742,7 +2742,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-string" -version = "0.16.6" +version = "0.16.7" dependencies = [ "rand", "snarkvm-circuit-environment", @@ -2755,7 +2755,7 @@ dependencies = [ [[package]] name = "snarkvm-console" -version = "0.16.6" +version = "0.16.7" dependencies = [ "snarkvm-console-account", "snarkvm-console-algorithms", @@ -2767,7 +2767,7 @@ dependencies = [ [[package]] name = "snarkvm-console-account" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "bs58", @@ -2780,7 +2780,7 @@ dependencies = [ [[package]] name = "snarkvm-console-algorithms" -version = "0.16.6" +version = "0.16.7" dependencies = [ "blake2s_simd", "criterion", @@ -2798,7 +2798,7 @@ dependencies = [ [[package]] name = "snarkvm-console-collections" -version = "0.16.6" +version = "0.16.7" dependencies = [ "aleo-std", "criterion", @@ -2811,7 +2811,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network" -version = "0.16.6" +version = "0.16.7" dependencies = [ "anyhow", "indexmap 2.0.2", @@ -2833,7 +2833,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network-environment" -version = "0.16.6" +version = "0.16.7" dependencies = [ "anyhow", "bech32", @@ -2850,7 +2850,7 @@ dependencies = [ [[package]] name = "snarkvm-console-program" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "enum_index", @@ -2871,7 +2871,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types" -version = "0.16.6" +version = "0.16.7" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-address", @@ -2885,7 +2885,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-address" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "serde_json", @@ -2897,7 +2897,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-boolean" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "serde_json", @@ -2906,7 +2906,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-field" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "serde_json", @@ -2917,7 +2917,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-group" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "serde_json", @@ -2929,7 +2929,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-integers" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "serde_json", @@ -2941,7 +2941,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-scalar" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "serde_json", @@ -2953,7 +2953,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-string" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "serde_json", @@ -2965,7 +2965,7 @@ dependencies = [ [[package]] name = "snarkvm-curves" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "criterion", @@ -2980,7 +2980,7 @@ dependencies = [ [[package]] name = "snarkvm-fields" -version = "0.16.6" +version = "0.16.7" dependencies = [ "aleo-std", "anyhow", @@ -2997,7 +2997,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger" -version = "0.16.6" +version = "0.16.7" dependencies = [ "aleo-std", "anyhow", @@ -3024,7 +3024,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-authority" -version = "0.16.6" +version = "0.16.7" dependencies = [ "anyhow", "bincode", @@ -3037,7 +3037,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-block" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3060,7 +3060,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-coinbase" -version = "0.16.6" +version = "0.16.7" dependencies = [ "aleo-std", "anyhow", @@ -3081,7 +3081,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-committee" -version = "0.16.6" +version = "0.16.7" dependencies = [ "anyhow", "bincode", @@ -3100,7 +3100,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal" -version = "0.16.6" +version = "0.16.7" dependencies = [ "snarkvm-ledger-narwhal", "snarkvm-ledger-narwhal-batch-certificate", @@ -3113,7 +3113,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3126,7 +3126,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3139,7 +3139,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-data" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bytes", "serde_json", @@ -3149,7 +3149,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3163,7 +3163,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "bytes", @@ -3176,7 +3176,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "serde_json", @@ -3186,7 +3186,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-query" -version = "0.16.6" +version = "0.16.7" dependencies = [ "async-trait", "reqwest", @@ -3198,7 +3198,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-store" -version = "0.16.6" +version = "0.16.7" dependencies = [ "aleo-std", "anyhow", @@ -3226,7 +3226,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-test-helpers" -version = "0.16.6" +version = "0.16.7" dependencies = [ "once_cell", "snarkvm-circuit", @@ -3240,7 +3240,7 @@ dependencies = [ [[package]] name = "snarkvm-parameters" -version = "0.16.6" +version = "0.16.7" dependencies = [ "aleo-std", "anyhow", @@ -3272,7 +3272,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer" -version = "0.16.6" +version = "0.16.7" dependencies = [ "aleo-std", "anyhow", @@ -3303,7 +3303,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-process" -version = "0.16.6" +version = "0.16.7" dependencies = [ "aleo-std", "bincode", @@ -3328,7 +3328,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-program" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "criterion", @@ -3344,7 +3344,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-snark" -version = "0.16.6" +version = "0.16.7" dependencies = [ "bincode", "colored", @@ -3357,7 +3357,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities" -version = "0.16.6" +version = "0.16.7" dependencies = [ "aleo-std", "anyhow", @@ -3377,7 +3377,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities-derives" -version = "0.16.6" +version = "0.16.7" dependencies = [ "proc-macro2", "quote 1.0.33", @@ -3386,7 +3386,7 @@ dependencies = [ [[package]] name = "snarkvm-wasm" -version = "0.16.6" +version = "0.16.7" dependencies = [ "getrandom", "rand", diff --git a/Cargo.toml b/Cargo.toml index 526033a74c..dd27708a4e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "A decentralized virtual machine" homepage = "https://aleo.org" @@ -146,53 +146,53 @@ wasm = [ "snarkvm-wasm" ] [dependencies.snarkvm-algorithms] path = "./algorithms" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-circuit] path = "./circuit" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-console] path = "./console" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-curves] path = "./curves" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-fields] path = "./fields" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-ledger] path = "./ledger" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-parameters] path = "./parameters" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-synthesizer] path = "./synthesizer" -version = "=0.16.6" +version = "=0.16.7" default-features = false optional = true [dependencies.snarkvm-utilities] path = "./utilities" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-wasm] path = "./wasm" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.anstyle] diff --git a/algorithms/Cargo.toml b/algorithms/Cargo.toml index 7f239d4e13..fc1ef69780 100644 --- a/algorithms/Cargo.toml +++ b/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Algorithms for a decentralized virtual machine" homepage = "https://aleo.org" @@ -47,27 +47,27 @@ required-features = [ "test" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.snarkvm-parameters] path = "../parameters" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.snarkvm-algorithms-cuda] path = "./cuda" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.aleo-std] diff --git a/algorithms/cuda/Cargo.toml b/algorithms/cuda/Cargo.toml index 7a1f1e235d..a1aace906c 100644 --- a/algorithms/cuda/Cargo.toml +++ b/algorithms/cuda/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms-cuda" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Cuda optimizations for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/circuit/Cargo.toml b/circuit/Cargo.toml index 9d49fb0840..fda13d5b9f 100644 --- a/circuit/Cargo.toml +++ b/circuit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Circuits for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,28 +25,28 @@ edition = "2021" [dependencies.snarkvm-circuit-account] path = "./account" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-algorithms] path = "./algorithms" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-collections] path = "./collections" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-environment] path = "./environment" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-network] path = "./network" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-program] path = "./program" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types] path = "./types" -version = "=0.16.6" +version = "=0.16.7" diff --git a/circuit/account/Cargo.toml b/circuit/account/Cargo.toml index cfb581b4a2..2f61c11c89 100644 --- a/circuit/account/Cargo.toml +++ b/circuit/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-account" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Account circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-account" path = "../../console/account" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.6" +version = "=0.16.7" [dev-dependencies.snarkvm-utilities] path = "../../utilities" diff --git a/circuit/algorithms/Cargo.toml b/circuit/algorithms/Cargo.toml index 3102b0c51b..c236a4d568 100644 --- a/circuit/algorithms/Cargo.toml +++ b/circuit/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-algorithms" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Algorithm circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-algorithms" path = "../../console/algorithms" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dev-dependencies.anyhow] diff --git a/circuit/collections/Cargo.toml b/circuit/collections/Cargo.toml index 9b0c94bfa2..98493ff3f0 100644 --- a/circuit/collections/Cargo.toml +++ b/circuit/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-collections" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Collections circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-collections" path = "../../console/collections" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.6" +version = "=0.16.7" [dev-dependencies.snarkvm-circuit-network] path = "../network" diff --git a/circuit/environment/Cargo.toml b/circuit/environment/Cargo.toml index 2e5d380086..adeb296f77 100644 --- a/circuit/environment/Cargo.toml +++ b/circuit/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Circuit environment for a decentralized virtual machine" license = "Apache-2.0" @@ -14,32 +14,32 @@ harness = false [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.6" +version = "=0.16.7" default-features = false features = [ "r1cs" ] [dependencies.snarkvm-circuit-environment-witness] path = "./witness" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.indexmap] diff --git a/circuit/environment/witness/Cargo.toml b/circuit/environment/witness/Cargo.toml index 58be181598..ff5da00b15 100644 --- a/circuit/environment/witness/Cargo.toml +++ b/circuit/environment/witness/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment-witness" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "A procedural macro to construct a witness in an environment" license = "Apache-2.0" diff --git a/circuit/network/Cargo.toml b/circuit/network/Cargo.toml index 313d59d631..ddfc9a8638 100644 --- a/circuit/network/Cargo.toml +++ b/circuit/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-network" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Network circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.6" +version = "=0.16.7" [dev-dependencies.snarkvm-console-types] path = "../../console/types" diff --git a/circuit/program/Cargo.toml b/circuit/program/Cargo.toml index cd4736db3e..629b71a094 100644 --- a/circuit/program/Cargo.toml +++ b/circuit/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-program" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Program circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,32 +9,32 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-program" path = "../../console/program" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-circuit-account] path = "../account" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.6" +version = "=0.16.7" [dependencies.paste] version = "1.0" diff --git a/circuit/types/Cargo.toml b/circuit/types/Cargo.toml index 4b13cd4823..77c954c2fb 100644 --- a/circuit/types/Cargo.toml +++ b/circuit/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Primitive circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -8,35 +8,35 @@ edition = "2021" [dependencies.snarkvm-circuit-environment] path = "../environment" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-address] path = "./address" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-boolean] path = "./boolean" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-field] path = "./field" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-group] path = "./group" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-integers] path = "./integers" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-scalar] path = "./scalar" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-string] path = "./string" -version = "=0.16.6" +version = "=0.16.7" [dev-dependencies.console] package = "snarkvm-console" diff --git a/circuit/types/address/Cargo.toml b/circuit/types/address/Cargo.toml index 9a2556eb55..1274c0ff03 100644 --- a/circuit/types/address/Cargo.toml +++ b/circuit/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-address" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Address circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,28 +9,28 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-address" path = "../../../console/types/address" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-group] path = "../group" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.6" +version = "=0.16.7" [features] default = [ "enable_console" ] diff --git a/circuit/types/boolean/Cargo.toml b/circuit/types/boolean/Cargo.toml index f877b09dd1..bf6cece171 100644 --- a/circuit/types/boolean/Cargo.toml +++ b/circuit/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-boolean" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Boolean circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -14,12 +14,12 @@ harness = false [dependencies.console] package = "snarkvm-console-types-boolean" path = "../../../console/types/boolean" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.6" +version = "=0.16.7" [dev-dependencies.criterion] version = "0.5" diff --git a/circuit/types/field/Cargo.toml b/circuit/types/field/Cargo.toml index 3a2642b94b..3a63575ca7 100644 --- a/circuit/types/field/Cargo.toml +++ b/circuit/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-field" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Field circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-field" path = "../../../console/types/field" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.6" +version = "=0.16.7" [features] default = [ "enable_console" ] diff --git a/circuit/types/group/Cargo.toml b/circuit/types/group/Cargo.toml index 031e184582..0f64a8ed66 100644 --- a/circuit/types/group/Cargo.toml +++ b/circuit/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-group" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Group circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-group" path = "../../../console/types/group" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.6" +version = "=0.16.7" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/integers/Cargo.toml b/circuit/types/integers/Cargo.toml index a6e63d6297..d86482e477 100644 --- a/circuit/types/integers/Cargo.toml +++ b/circuit/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-integers" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Integer circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-integers" path = "../../../console/types/integers" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.6" +version = "=0.16.7" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/scalar/Cargo.toml b/circuit/types/scalar/Cargo.toml index 8af904f1bb..9490193e1f 100644 --- a/circuit/types/scalar/Cargo.toml +++ b/circuit/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-scalar" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Scalar circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-scalar" path = "../../../console/types/scalar" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.6" +version = "=0.16.7" [features] default = [ "enable_console" ] diff --git a/circuit/types/string/Cargo.toml b/circuit/types/string/Cargo.toml index 112a9e4610..253d263d71 100644 --- a/circuit/types/string/Cargo.toml +++ b/circuit/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-string" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "String circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-string" path = "../../../console/types/string" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-circuit-types-integers] path = "../integers" -version = "=0.16.6" +version = "=0.16.7" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/console/Cargo.toml b/console/Cargo.toml index 11193f0314..9e6beca364 100644 --- a/console/Cargo.toml +++ b/console/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Console environment for a decentralized virtual machine" license = "Apache-2.0" @@ -8,32 +8,32 @@ edition = "2021" [dependencies.snarkvm-console-account] path = "./account" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-console-algorithms] path = "./algorithms" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-console-collections] path = "./collections" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-console-network] path = "./network" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-console-program] path = "./program" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-console-types] path = "./types" -version = "=0.16.6" +version = "=0.16.7" optional = true [features] diff --git a/console/account/Cargo.toml b/console/account/Cargo.toml index a97b7167ca..e0de41ce98 100644 --- a/console/account/Cargo.toml +++ b/console/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-account" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Account operations for a decentralized virtual machine" license = "Apache-2.0" @@ -13,11 +13,11 @@ harness = false [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.6" +version = "=0.16.7" default-features = false features = [ "address", "boolean", "field", "group", "scalar" ] diff --git a/console/algorithms/Cargo.toml b/console/algorithms/Cargo.toml index c6e3dcbd71..1e56422d95 100644 --- a/console/algorithms/Cargo.toml +++ b/console/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-algorithms" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Console algorithms for a decentralized virtual machine" license = "Apache-2.0" @@ -23,18 +23,18 @@ harness = false [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.6" +version = "=0.16.7" default-features = false features = [ "field", "group", "integers", "scalar" ] [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.6" +version = "=0.16.7" [dependencies.blake2s_simd] version = "1.0" diff --git a/console/collections/Cargo.toml b/console/collections/Cargo.toml index daf4de21f1..f3861ec6ce 100644 --- a/console/collections/Cargo.toml +++ b/console/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-collections" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Collections for a decentralized virtual machine" license = "Apache-2.0" @@ -18,11 +18,11 @@ harness = false [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.6" +version = "=0.16.7" default-features = false features = [ "field", "integers" ] diff --git a/console/network/Cargo.toml b/console/network/Cargo.toml index 5d097f6b10..c20869aad7 100644 --- a/console/network/Cargo.toml +++ b/console/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Network console library for a decentralized virtual machine" license = "Apache-2.0" @@ -15,45 +15,45 @@ wasm = [ [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.6" +version = "=0.16.7" default-features = false features = [ "snark" ] [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-network-environment] path = "./environment" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.6" +version = "=0.16.7" default-features = false features = [ "field", "group", "scalar" ] [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.snarkvm-parameters] path = "../../parameters" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.6" +version = "=0.16.7" [dependencies.anyhow] version = "1.0.73" diff --git a/console/network/environment/Cargo.toml b/console/network/environment/Cargo.toml index 665049bc96..7e85e232e3 100644 --- a/console/network/environment/Cargo.toml +++ b/console/network/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network-environment" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Environment console library for a decentralized virtual machine" license = "Apache-2.0" @@ -8,17 +8,17 @@ edition = "2021" [dependencies.snarkvm-curves] path = "../../../curves" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.snarkvm-fields] path = "../../../fields" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.snarkvm-utilities] path = "../../../utilities" -version = "=0.16.6" +version = "=0.16.7" [dependencies.anyhow] version = "1.0.73" diff --git a/console/program/Cargo.toml b/console/program/Cargo.toml index a4cf2efec3..4c574d4974 100644 --- a/console/program/Cargo.toml +++ b/console/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-program" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Program operations for a decentralized virtual machine" license = "Apache-2.0" @@ -12,27 +12,27 @@ test = [ ] [dependencies.snarkvm-console-account] path = "../account" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.6" +version = "=0.16.7" [dependencies.enum_index] version = "0.2" diff --git a/console/types/Cargo.toml b/console/types/Cargo.toml index c156954dcb..b178469ebb 100644 --- a/console/types/Cargo.toml +++ b/console/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Console types for a decentralized virtual machine" license = "Apache-2.0" @@ -8,41 +8,41 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../network/environment" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types-address] path = "./address" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-console-types-boolean] path = "./boolean" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-console-types-field] path = "./field" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-console-types-group] path = "./group" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-console-types-integers] path = "./integers" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-console-types-scalar] path = "./scalar" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-console-types-string] path = "./string" -version = "=0.16.6" +version = "=0.16.7" optional = true [features] diff --git a/console/types/address/Cargo.toml b/console/types/address/Cargo.toml index 6252df5196..d3818ea07b 100644 --- a/console/types/address/Cargo.toml +++ b/console/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-address" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types-group] path = "../group" -version = "=0.16.6" +version = "=0.16.7" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/boolean/Cargo.toml b/console/types/boolean/Cargo.toml index c458f1a0ab..e871c1a0fd 100644 --- a/console/types/boolean/Cargo.toml +++ b/console/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-boolean" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,7 +8,7 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.6" +version = "=0.16.7" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/field/Cargo.toml b/console/types/field/Cargo.toml index 3835c1c0ae..bb8e5fcd3e 100644 --- a/console/types/field/Cargo.toml +++ b/console/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-field" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,11 +8,11 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.6" +version = "=0.16.7" [dependencies.zeroize] version = "1" diff --git a/console/types/group/Cargo.toml b/console/types/group/Cargo.toml index 11a3531df0..c68d1ac8a6 100644 --- a/console/types/group/Cargo.toml +++ b/console/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-group" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.6" +version = "=0.16.7" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/integers/Cargo.toml b/console/types/integers/Cargo.toml index 6c7a8cb911..2804c8edad 100644 --- a/console/types/integers/Cargo.toml +++ b/console/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-integers" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.6" +version = "=0.16.7" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/scalar/Cargo.toml b/console/types/scalar/Cargo.toml index 9deb088e73..10e98a5264 100644 --- a/console/types/scalar/Cargo.toml +++ b/console/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-scalar" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,15 +8,15 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.6" +version = "=0.16.7" [dependencies.zeroize] version = "1" diff --git a/console/types/string/Cargo.toml b/console/types/string/Cargo.toml index fcc90d2bc7..348b16ae28 100644 --- a/console/types/string/Cargo.toml +++ b/console/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-string" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-console-types-integers] path = "../integers" -version = "=0.16.6" +version = "=0.16.7" [dev-dependencies.bincode] version = "1.3" diff --git a/curves/Cargo.toml b/curves/Cargo.toml index 454f66a38c..439b9bd6dd 100644 --- a/curves/Cargo.toml +++ b/curves/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-curves" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Curves for a decentralized virtual machine" homepage = "https://aleo.org" @@ -36,12 +36,12 @@ harness = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.rand] diff --git a/fields/Cargo.toml b/fields/Cargo.toml index 92cc14e921..ca1fd3daf2 100644 --- a/fields/Cargo.toml +++ b/fields/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-fields" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Fields for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.aleo-std] diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index a1f841415f..300df56563 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "A node ledger for a decentralized virtual machine" homepage = "https://aleo.org" @@ -56,54 +56,54 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "./authority" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "./block" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "./coinbase" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "./committee" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-narwhal] package = "snarkvm-ledger-narwhal" path = "./narwhal" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "./query" -version = "=0.16.6" +version = "=0.16.7" features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "./store" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-test-helpers] package = "snarkvm-ledger-test-helpers" path = "./test-helpers" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.synthesizer] package = "snarkvm-synthesizer" path = "../synthesizer" -version = "=0.16.6" +version = "=0.16.7" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/authority/Cargo.toml b/ledger/authority/Cargo.toml index ecaca7550a..68970ca81e 100644 --- a/ledger/authority/Cargo.toml +++ b/ledger/authority/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-authority" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Data structures for a block authority in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-subdag/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.6" +version = "=0.16.7" [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.6" +version = "=0.16.7" [dependencies.anyhow] version = "1" diff --git a/ledger/block/Cargo.toml b/ledger/block/Cargo.toml index 3865b71e52..52c998e3d8 100644 --- a/ledger/block/Cargo.toml +++ b/ledger/block/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-block" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "A block for a decentralized virtual machine" homepage = "https://aleo.org" @@ -39,42 +39,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../ledger/coinbase" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../../ledger/committee" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../narwhal/transmission-id" -version = "=0.16.6" +version = "=0.16.7" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.6" +version = "=0.16.7" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.6" +version = "=0.16.7" [dependencies.indexmap] version = "2.0" diff --git a/ledger/coinbase/Cargo.toml b/ledger/coinbase/Cargo.toml index eadff83dd0..48ca50d7ac 100644 --- a/ledger/coinbase/Cargo.toml +++ b/ledger/coinbase/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-coinbase" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Coinbase puzzle for a decentralized virtual machine" homepage = "https://aleo.org" @@ -50,27 +50,27 @@ wasm = [ [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-synthesizer-snark] path = "../../synthesizer/snark" -version = "=0.16.6" +version = "=0.16.7" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.aleo-std] diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index 2d6df01202..107e431672 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-committee" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "A committee for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,7 +33,7 @@ test-helpers = [ "prop-tests", "rand_distr" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.6" +version = "=0.16.7" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/Cargo.toml b/ledger/narwhal/Cargo.toml index 42f98b1de4..95537f7e44 100644 --- a/ledger/narwhal/Cargo.toml +++ b/ledger/narwhal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Data structures for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -64,37 +64,37 @@ transmission-id = [ "narwhal-transmission-id" ] [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "./batch-certificate" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "./batch-header" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "./data" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "./subdag" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.narwhal-transmission] package = "snarkvm-ledger-narwhal-transmission" path = "./transmission" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "./transmission-id" -version = "=0.16.6" +version = "=0.16.7" optional = true [dev-dependencies.snarkvm-ledger-narwhal] diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index 7d1650cfb6..804750d903 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-header/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.6" +version = "=0.16.7" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.6" +version = "=0.16.7" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.6" +version = "=0.16.7" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/batch-header/Cargo.toml b/ledger/narwhal/batch-header/Cargo.toml index 738901ffeb..7cc1ed9ec1 100644 --- a/ledger/narwhal/batch-header/Cargo.toml +++ b/ledger/narwhal/batch-header/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "A batch header for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-transmission-id/test-helpers", "time" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.6" +version = "=0.16.7" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.6" +version = "=0.16.7" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/data/Cargo.toml b/ledger/narwhal/data/Cargo.toml index da836b541c..d8fafe6892 100644 --- a/ledger/narwhal/data/Cargo.toml +++ b/ledger/narwhal/data/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-data" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -29,7 +29,7 @@ async = [ "tokio" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.6" +version = "=0.16.7" [dependencies.bytes] version = "1" diff --git a/ledger/narwhal/subdag/Cargo.toml b/ledger/narwhal/subdag/Cargo.toml index ee4ed2bbe0..534b1cd141 100644 --- a/ledger/narwhal/subdag/Cargo.toml +++ b/ledger/narwhal/subdag/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "A subdag for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-certificate/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.6" +version = "=0.16.7" [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../batch-certificate" -version = "=0.16.6" +version = "=0.16.7" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.6" +version = "=0.16.7" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/transmission-id/Cargo.toml b/ledger/narwhal/transmission-id/Cargo.toml index e811fc29b8..35b988ff7b 100644 --- a/ledger/narwhal/transmission-id/Cargo.toml +++ b/ledger/narwhal/transmission-id/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "A transmission ID for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.6" +version = "=0.16.7" [dev-dependencies.bincode] version = "1.3" diff --git a/ledger/narwhal/transmission/Cargo.toml b/ledger/narwhal/transmission/Cargo.toml index 0e5c5d5f6a..eefbe6f976 100644 --- a/ledger/narwhal/transmission/Cargo.toml +++ b/ledger/narwhal/transmission/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "A transmission for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../block" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "../data" -version = "=0.16.6" +version = "=0.16.7" [dependencies.bytes] version = "1" diff --git a/ledger/query/Cargo.toml b/ledger/query/Cargo.toml index bcdac183df..672608e808 100644 --- a/ledger/query/Cargo.toml +++ b/ledger/query/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-query" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "A query for a decentralized virtual machine" homepage = "https://aleo.org" @@ -30,18 +30,18 @@ query = [ "ledger-store", "synthesizer-program", "ureq" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.async-trait] diff --git a/ledger/store/Cargo.toml b/ledger/store/Cargo.toml index 882af3fb6e..692a8d9e87 100644 --- a/ledger/store/Cargo.toml +++ b/ledger/store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-store" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "A data store for a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,42 +32,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../coinbase" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../committee" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../narwhal/batch-certificate" -version = "=0.16.6" +version = "=0.16.7" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.6" +version = "=0.16.7" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.6" +version = "=0.16.7" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/test-helpers/Cargo.toml b/ledger/test-helpers/Cargo.toml index 6e913c66cb..24d42d2df5 100644 --- a/ledger/test-helpers/Cargo.toml +++ b/ledger/test-helpers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-test-helpers" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Test helpers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -19,39 +19,39 @@ edition = "2021" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.6" +version = "=0.16.7" [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../query" -version = "=0.16.6" +version = "=0.16.7" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.6" +version = "=0.16.7" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.6" +version = "=0.16.7" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "../../synthesizer/process" -version = "=0.16.6" +version = "=0.16.7" [dependencies.once_cell] version = "1.18" diff --git a/parameters/Cargo.toml b/parameters/Cargo.toml index d621d201e3..205beececc 100644 --- a/parameters/Cargo.toml +++ b/parameters/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-parameters" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Parameters for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "encoding", "js-sys", "web-sys" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.6" +version = "=0.16.7" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/Cargo.toml b/synthesizer/Cargo.toml index 60c3ac2930..21e116c46b 100644 --- a/synthesizer/Cargo.toml +++ b/synthesizer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Synthesizer for a decentralized virtual machine" homepage = "https://aleo.org" @@ -68,61 +68,61 @@ harness = false [dependencies.algorithms] package = "snarkvm-algorithms" path = "../algorithms" -version = "=0.16.6" +version = "=0.16.7" [dependencies.circuit] package = "snarkvm-circuit" path = "../circuit" -version = "=0.16.6" +version = "=0.16.7" [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../ledger/block" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../ledger/coinbase" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../ledger/committee" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../ledger/query" -version = "=0.16.6" +version = "=0.16.7" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../ledger/store" -version = "=0.16.6" +version = "=0.16.7" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "./process" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "./program" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "./snark" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.aleo-std] diff --git a/synthesizer/process/Cargo.toml b/synthesizer/process/Cargo.toml index 65d5efb813..2532100faf 100644 --- a/synthesizer/process/Cargo.toml +++ b/synthesizer/process/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-process" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "A process for a decentralized virtual machine" homepage = "https://aleo.org" @@ -48,40 +48,40 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.6" +version = "=0.16.7" default-features = false features = [ "network", "program", "types" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../ledger/block" -version = "=0.16.6" +version = "=0.16.7" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../../ledger/query" -version = "=0.16.6" +version = "=0.16.7" default-features = false [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../../ledger/store" -version = "=0.16.6" +version = "=0.16.7" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.6" +version = "=0.16.7" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.6" +version = "=0.16.7" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/program/Cargo.toml b/synthesizer/program/Cargo.toml index f3f046ade1..23fb2ca720 100644 --- a/synthesizer/program/Cargo.toml +++ b/synthesizer/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-program" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Program for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "console/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.6" +version = "=0.16.7" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.6" +version = "=0.16.7" default-features = false features = [ "account", "network", "program", "types" ] diff --git a/synthesizer/snark/Cargo.toml b/synthesizer/snark/Cargo.toml index 42f866a84c..f323a71da9 100644 --- a/synthesizer/snark/Cargo.toml +++ b/synthesizer/snark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-snark" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "SNARK wrappers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,18 +33,18 @@ wasm = [ "console/wasm", "snarkvm-algorithms/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.6" +version = "=0.16.7" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.6" +version = "=0.16.7" default-features = false features = [ "network" ] [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.6" +version = "=0.16.7" [dependencies.bincode] version = "1" diff --git a/utilities/Cargo.toml b/utilities/Cargo.toml index b1ca174233..a937e6e38e 100644 --- a/utilities/Cargo.toml +++ b/utilities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Utilities for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities-derives] path = "./derives" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.aleo-std] diff --git a/utilities/derives/Cargo.toml b/utilities/derives/Cargo.toml index 3950775d69..a243c4da44 100644 --- a/utilities/derives/Cargo.toml +++ b/utilities/derives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities-derives" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "Canonical serialization for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 7e5c58d4a8..dd7eea53e8 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-wasm" -version = "0.16.6" +version = "0.16.7" authors = [ "The Aleo Team " ] description = "WASM for a decentralized virtual machine" homepage = "https://aleo.org" @@ -28,30 +28,30 @@ crate-type = [ "cdylib", "rlib" ] [dependencies.snarkvm-console] path = "../console" -version = "=0.16.6" +version = "=0.16.7" features = [ "wasm" ] optional = true [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.6" +version = "=0.16.7" optional = true [dependencies.snarkvm-synthesizer] path = "../synthesizer" -version = "=0.16.6" +version = "=0.16.7" default-features = false features = [ "wasm" ] optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.6" +version = "=0.16.7" features = [ "wasm" ] optional = true From ea999fb26e48deb41254e026715f078c5037e139 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Wed, 1 Nov 2023 13:54:38 -0400 Subject: [PATCH 073/339] Implement fix --- synthesizer/program/src/logic/command/get.rs | 4 ++-- synthesizer/program/src/logic/command/get_or_use.rs | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/synthesizer/program/src/logic/command/get.rs b/synthesizer/program/src/logic/command/get.rs index 3537877ff3..d241a32d2a 100644 --- a/synthesizer/program/src/logic/command/get.rs +++ b/synthesizer/program/src/logic/command/get.rs @@ -267,7 +267,7 @@ impl Parser for Get { // Parse the ";" from the string. let (string, _) = tag(";")(string)?; - Ok((string, Self { mapping, key, destination, is_old: false })) + Ok((string, Self { is_old: matches!(mapping, MappingLocator::Resource(_)), mapping, key, destination })) } } @@ -331,7 +331,7 @@ impl FromBytes for Get { // Read the destination register. let destination = Register::read_le(&mut reader)?; // Return the command. - Ok(Self { mapping, key, destination, is_old: !first_byte.is_zero() }) + Ok(Self { is_old: matches!(mapping, MappingLocator::Resource(_)), mapping, key, destination }) } } diff --git a/synthesizer/program/src/logic/command/get_or_use.rs b/synthesizer/program/src/logic/command/get_or_use.rs index a78deaa1c5..7d693cf4c0 100644 --- a/synthesizer/program/src/logic/command/get_or_use.rs +++ b/synthesizer/program/src/logic/command/get_or_use.rs @@ -186,7 +186,13 @@ impl Parser for GetOrUse { // Parse the ";" from the string. let (string, _) = tag(";")(string)?; - Ok((string, Self { mapping, key, default, destination, is_old: false })) + Ok((string, Self { + is_old: matches!(mapping, MappingLocator::Resource(_)), + mapping, + key, + default, + destination, + })) } } @@ -252,7 +258,7 @@ impl FromBytes for GetOrUse { // Read the destination register. let destination = Register::read_le(&mut reader)?; // Return the command. - Ok(Self { mapping, key, default, destination, is_old: !first_byte.is_zero() }) + Ok(Self { is_old: matches!(mapping, MappingLocator::Resource(_)), mapping, key, default, destination }) } } From 5636ee983d4903d4d66fd80cb8f9b5de0ccbd4ab Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Wed, 1 Nov 2023 14:06:40 -0400 Subject: [PATCH 074/339] Remove is_old flag --- synthesizer/program/src/logic/command/get.rs | 18 +++++--------- .../program/src/logic/command/get_or_use.rs | 24 +++++-------------- 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/synthesizer/program/src/logic/command/get.rs b/synthesizer/program/src/logic/command/get.rs index d241a32d2a..ac56eb92c0 100644 --- a/synthesizer/program/src/logic/command/get.rs +++ b/synthesizer/program/src/logic/command/get.rs @@ -134,8 +134,6 @@ pub struct Get { key: Operand, /// The destination register. destination: Register, - // TODO (howardwu): For mainnet - remove `is_old`. - is_old: bool, } impl PartialEq for Get { @@ -267,7 +265,7 @@ impl Parser for Get { // Parse the ";" from the string. let (string, _) = tag(";")(string)?; - Ok((string, Self { is_old: matches!(mapping, MappingLocator::Resource(_)), mapping, key, destination })) + Ok((string, Self { mapping, key, destination })) } } @@ -331,7 +329,7 @@ impl FromBytes for Get { // Read the destination register. let destination = Register::read_le(&mut reader)?; // Return the command. - Ok(Self { is_old: matches!(mapping, MappingLocator::Resource(_)), mapping, key, destination }) + Ok(Self { mapping, key, destination }) } } @@ -339,14 +337,10 @@ impl ToBytes for Get { /// Writes the operation to a buffer. fn write_le(&self, mut writer: W) -> IoResult<()> { // Write the mapping name. - match self.is_old { - false => self.mapping.write_le(&mut writer)?, - true => match self.mapping { - MappingLocator::Resource(identifier) => identifier.write_le(&mut writer)?, - MappingLocator::Locator(_) => { - return Err(error("Expected `MappingLocator::Resource` for `get`.")); - } - }, + // TODO (howardwu): For mainnet - Write `self.mapping` directly, instead of matching on the identifier case. + match &self.mapping { + MappingLocator::Locator(_) => self.mapping.write_le(&mut writer)?, + MappingLocator::Resource(identifier) => identifier.write_le(&mut writer)?, } // Write the key operand. self.key.write_le(&mut writer)?; diff --git a/synthesizer/program/src/logic/command/get_or_use.rs b/synthesizer/program/src/logic/command/get_or_use.rs index 7d693cf4c0..7c2ef6d7d7 100644 --- a/synthesizer/program/src/logic/command/get_or_use.rs +++ b/synthesizer/program/src/logic/command/get_or_use.rs @@ -40,8 +40,6 @@ pub struct GetOrUse { default: Operand, /// The destination register. destination: Register, - // TODO (howardwu): For mainnet - remove `is_old`. - is_old: bool, } impl PartialEq for GetOrUse { @@ -186,13 +184,7 @@ impl Parser for GetOrUse { // Parse the ";" from the string. let (string, _) = tag(";")(string)?; - Ok((string, Self { - is_old: matches!(mapping, MappingLocator::Resource(_)), - mapping, - key, - default, - destination, - })) + Ok((string, Self { mapping, key, default, destination })) } } @@ -258,7 +250,7 @@ impl FromBytes for GetOrUse { // Read the destination register. let destination = Register::read_le(&mut reader)?; // Return the command. - Ok(Self { is_old: matches!(mapping, MappingLocator::Resource(_)), mapping, key, default, destination }) + Ok(Self { mapping, key, default, destination }) } } @@ -266,14 +258,10 @@ impl ToBytes for GetOrUse { /// Writes the operation to a buffer. fn write_le(&self, mut writer: W) -> IoResult<()> { // Write the mapping name. - match self.is_old { - false => self.mapping.write_le(&mut writer)?, - true => match self.mapping { - MappingLocator::Resource(identifier) => identifier.write_le(&mut writer)?, - MappingLocator::Locator(_) => { - return Err(error("Expected `MappingLocator::Resource` for `get.or_use`.")); - } - }, + // TODO (howardwu): For mainnet - Write the `self.mapping` directly, instead of matching on the identifier case. + match &self.mapping { + MappingLocator::Locator(_) => self.mapping.write_le(&mut writer)?, + MappingLocator::Resource(identifier) => identifier.write_le(&mut writer)?, } // Write the key operand. self.key.write_le(&mut writer)?; From 732462864de425d9a98dfef320557a0504269307 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Wed, 1 Nov 2023 14:25:39 -0400 Subject: [PATCH 075/339] chore(snarkvm): bump version for new release --- .cargo/release-version | 2 +- Cargo.lock | 118 ++++++++++---------- Cargo.toml | 22 ++-- algorithms/Cargo.toml | 12 +- algorithms/cuda/Cargo.toml | 2 +- circuit/Cargo.toml | 16 +-- circuit/account/Cargo.toml | 10 +- circuit/algorithms/Cargo.toml | 8 +- circuit/collections/Cargo.toml | 8 +- circuit/environment/Cargo.toml | 14 +-- circuit/environment/witness/Cargo.toml | 2 +- circuit/network/Cargo.toml | 10 +- circuit/program/Cargo.toml | 16 +-- circuit/types/Cargo.toml | 18 +-- circuit/types/address/Cargo.toml | 14 +-- circuit/types/boolean/Cargo.toml | 6 +- circuit/types/field/Cargo.toml | 8 +- circuit/types/group/Cargo.toml | 12 +- circuit/types/integers/Cargo.toml | 12 +- circuit/types/scalar/Cargo.toml | 10 +- circuit/types/string/Cargo.toml | 12 +- console/Cargo.toml | 14 +-- console/account/Cargo.toml | 6 +- console/algorithms/Cargo.toml | 8 +- console/collections/Cargo.toml | 6 +- console/network/Cargo.toml | 20 ++-- console/network/environment/Cargo.toml | 8 +- console/program/Cargo.toml | 14 +-- console/types/Cargo.toml | 18 +-- console/types/address/Cargo.toml | 10 +- console/types/boolean/Cargo.toml | 4 +- console/types/field/Cargo.toml | 6 +- console/types/group/Cargo.toml | 10 +- console/types/integers/Cargo.toml | 10 +- console/types/scalar/Cargo.toml | 8 +- console/types/string/Cargo.toml | 10 +- curves/Cargo.toml | 6 +- fields/Cargo.toml | 4 +- ledger/Cargo.toml | 22 ++-- ledger/authority/Cargo.toml | 6 +- ledger/block/Cargo.toml | 18 +-- ledger/coinbase/Cargo.toml | 14 +-- ledger/committee/Cargo.toml | 4 +- ledger/narwhal/Cargo.toml | 14 +-- ledger/narwhal/batch-certificate/Cargo.toml | 8 +- ledger/narwhal/batch-header/Cargo.toml | 6 +- ledger/narwhal/data/Cargo.toml | 4 +- ledger/narwhal/subdag/Cargo.toml | 8 +- ledger/narwhal/transmission-id/Cargo.toml | 6 +- ledger/narwhal/transmission/Cargo.toml | 10 +- ledger/query/Cargo.toml | 8 +- ledger/store/Cargo.toml | 18 +-- ledger/test-helpers/Cargo.toml | 16 +-- parameters/Cargo.toml | 6 +- synthesizer/Cargo.toml | 24 ++-- synthesizer/process/Cargo.toml | 16 +-- synthesizer/program/Cargo.toml | 6 +- synthesizer/snark/Cargo.toml | 8 +- utilities/Cargo.toml | 4 +- utilities/derives/Cargo.toml | 2 +- wasm/Cargo.toml | 12 +- 61 files changed, 367 insertions(+), 367 deletions(-) diff --git a/.cargo/release-version b/.cargo/release-version index 9534715702..056027557e 100644 --- a/.cargo/release-version +++ b/.cargo/release-version @@ -1 +1 @@ -v0.16.7 \ No newline at end of file +v0.16.8 \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 761cad564f..24f17f9b00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2473,7 +2473,7 @@ dependencies = [ [[package]] name = "snarkvm" -version = "0.16.7" +version = "0.16.8" dependencies = [ "anstyle", "anyhow", @@ -2508,7 +2508,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms" -version = "0.16.7" +version = "0.16.8" dependencies = [ "aleo-std", "anyhow", @@ -2547,7 +2547,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms-cuda" -version = "0.16.7" +version = "0.16.8" dependencies = [ "blst", "cc", @@ -2557,7 +2557,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit" -version = "0.16.7" +version = "0.16.8" dependencies = [ "snarkvm-circuit-account", "snarkvm-circuit-algorithms", @@ -2570,7 +2570,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-account" -version = "0.16.7" +version = "0.16.8" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2582,7 +2582,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-algorithms" -version = "0.16.7" +version = "0.16.8" dependencies = [ "anyhow", "snarkvm-circuit-types", @@ -2594,7 +2594,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-collections" -version = "0.16.7" +version = "0.16.8" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2608,7 +2608,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment" -version = "0.16.7" +version = "0.16.8" dependencies = [ "criterion", "indexmap 2.0.2", @@ -2629,11 +2629,11 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment-witness" -version = "0.16.7" +version = "0.16.8" [[package]] name = "snarkvm-circuit-network" -version = "0.16.7" +version = "0.16.8" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-collections", @@ -2644,7 +2644,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-program" -version = "0.16.7" +version = "0.16.8" dependencies = [ "anyhow", "paste", @@ -2662,7 +2662,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types" -version = "0.16.7" +version = "0.16.8" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-address", @@ -2677,7 +2677,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-address" -version = "0.16.7" +version = "0.16.8" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2689,7 +2689,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-boolean" -version = "0.16.7" +version = "0.16.8" dependencies = [ "criterion", "snarkvm-circuit-environment", @@ -2698,7 +2698,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-field" -version = "0.16.7" +version = "0.16.8" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2707,7 +2707,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-group" -version = "0.16.7" +version = "0.16.8" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2719,7 +2719,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-integers" -version = "0.16.7" +version = "0.16.8" dependencies = [ "paste", "snarkvm-circuit-environment", @@ -2732,7 +2732,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-scalar" -version = "0.16.7" +version = "0.16.8" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2742,7 +2742,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-string" -version = "0.16.7" +version = "0.16.8" dependencies = [ "rand", "snarkvm-circuit-environment", @@ -2755,7 +2755,7 @@ dependencies = [ [[package]] name = "snarkvm-console" -version = "0.16.7" +version = "0.16.8" dependencies = [ "snarkvm-console-account", "snarkvm-console-algorithms", @@ -2767,7 +2767,7 @@ dependencies = [ [[package]] name = "snarkvm-console-account" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "bs58", @@ -2780,7 +2780,7 @@ dependencies = [ [[package]] name = "snarkvm-console-algorithms" -version = "0.16.7" +version = "0.16.8" dependencies = [ "blake2s_simd", "criterion", @@ -2798,7 +2798,7 @@ dependencies = [ [[package]] name = "snarkvm-console-collections" -version = "0.16.7" +version = "0.16.8" dependencies = [ "aleo-std", "criterion", @@ -2811,7 +2811,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network" -version = "0.16.7" +version = "0.16.8" dependencies = [ "anyhow", "indexmap 2.0.2", @@ -2833,7 +2833,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network-environment" -version = "0.16.7" +version = "0.16.8" dependencies = [ "anyhow", "bech32", @@ -2850,7 +2850,7 @@ dependencies = [ [[package]] name = "snarkvm-console-program" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "enum_index", @@ -2871,7 +2871,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types" -version = "0.16.7" +version = "0.16.8" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-address", @@ -2885,7 +2885,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-address" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "serde_json", @@ -2897,7 +2897,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-boolean" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "serde_json", @@ -2906,7 +2906,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-field" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "serde_json", @@ -2917,7 +2917,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-group" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "serde_json", @@ -2929,7 +2929,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-integers" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "serde_json", @@ -2941,7 +2941,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-scalar" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "serde_json", @@ -2953,7 +2953,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-string" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "serde_json", @@ -2965,7 +2965,7 @@ dependencies = [ [[package]] name = "snarkvm-curves" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "criterion", @@ -2980,7 +2980,7 @@ dependencies = [ [[package]] name = "snarkvm-fields" -version = "0.16.7" +version = "0.16.8" dependencies = [ "aleo-std", "anyhow", @@ -2997,7 +2997,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger" -version = "0.16.7" +version = "0.16.8" dependencies = [ "aleo-std", "anyhow", @@ -3024,7 +3024,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-authority" -version = "0.16.7" +version = "0.16.8" dependencies = [ "anyhow", "bincode", @@ -3037,7 +3037,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-block" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3060,7 +3060,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-coinbase" -version = "0.16.7" +version = "0.16.8" dependencies = [ "aleo-std", "anyhow", @@ -3081,7 +3081,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-committee" -version = "0.16.7" +version = "0.16.8" dependencies = [ "anyhow", "bincode", @@ -3100,7 +3100,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal" -version = "0.16.7" +version = "0.16.8" dependencies = [ "snarkvm-ledger-narwhal", "snarkvm-ledger-narwhal-batch-certificate", @@ -3113,7 +3113,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3126,7 +3126,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3139,7 +3139,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-data" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bytes", "serde_json", @@ -3149,7 +3149,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3163,7 +3163,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "bytes", @@ -3176,7 +3176,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "serde_json", @@ -3186,7 +3186,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-query" -version = "0.16.7" +version = "0.16.8" dependencies = [ "async-trait", "reqwest", @@ -3198,7 +3198,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-store" -version = "0.16.7" +version = "0.16.8" dependencies = [ "aleo-std", "anyhow", @@ -3226,7 +3226,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-test-helpers" -version = "0.16.7" +version = "0.16.8" dependencies = [ "once_cell", "snarkvm-circuit", @@ -3240,7 +3240,7 @@ dependencies = [ [[package]] name = "snarkvm-parameters" -version = "0.16.7" +version = "0.16.8" dependencies = [ "aleo-std", "anyhow", @@ -3272,7 +3272,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer" -version = "0.16.7" +version = "0.16.8" dependencies = [ "aleo-std", "anyhow", @@ -3303,7 +3303,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-process" -version = "0.16.7" +version = "0.16.8" dependencies = [ "aleo-std", "bincode", @@ -3328,7 +3328,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-program" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "criterion", @@ -3344,7 +3344,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-snark" -version = "0.16.7" +version = "0.16.8" dependencies = [ "bincode", "colored", @@ -3357,7 +3357,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities" -version = "0.16.7" +version = "0.16.8" dependencies = [ "aleo-std", "anyhow", @@ -3377,7 +3377,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities-derives" -version = "0.16.7" +version = "0.16.8" dependencies = [ "proc-macro2", "quote 1.0.33", @@ -3386,7 +3386,7 @@ dependencies = [ [[package]] name = "snarkvm-wasm" -version = "0.16.7" +version = "0.16.8" dependencies = [ "getrandom", "rand", diff --git a/Cargo.toml b/Cargo.toml index dd27708a4e..8210374213 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "A decentralized virtual machine" homepage = "https://aleo.org" @@ -146,53 +146,53 @@ wasm = [ "snarkvm-wasm" ] [dependencies.snarkvm-algorithms] path = "./algorithms" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-circuit] path = "./circuit" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-console] path = "./console" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-curves] path = "./curves" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-fields] path = "./fields" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-ledger] path = "./ledger" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-parameters] path = "./parameters" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-synthesizer] path = "./synthesizer" -version = "=0.16.7" +version = "=0.16.8" default-features = false optional = true [dependencies.snarkvm-utilities] path = "./utilities" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-wasm] path = "./wasm" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.anstyle] diff --git a/algorithms/Cargo.toml b/algorithms/Cargo.toml index fc1ef69780..c1ad71b00f 100644 --- a/algorithms/Cargo.toml +++ b/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Algorithms for a decentralized virtual machine" homepage = "https://aleo.org" @@ -47,27 +47,27 @@ required-features = [ "test" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.snarkvm-parameters] path = "../parameters" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.snarkvm-algorithms-cuda] path = "./cuda" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.aleo-std] diff --git a/algorithms/cuda/Cargo.toml b/algorithms/cuda/Cargo.toml index a1aace906c..209412674e 100644 --- a/algorithms/cuda/Cargo.toml +++ b/algorithms/cuda/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms-cuda" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Cuda optimizations for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/circuit/Cargo.toml b/circuit/Cargo.toml index fda13d5b9f..019db086bd 100644 --- a/circuit/Cargo.toml +++ b/circuit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Circuits for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,28 +25,28 @@ edition = "2021" [dependencies.snarkvm-circuit-account] path = "./account" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-algorithms] path = "./algorithms" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-collections] path = "./collections" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-environment] path = "./environment" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-network] path = "./network" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-program] path = "./program" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types] path = "./types" -version = "=0.16.7" +version = "=0.16.8" diff --git a/circuit/account/Cargo.toml b/circuit/account/Cargo.toml index 2f61c11c89..fde3b8e055 100644 --- a/circuit/account/Cargo.toml +++ b/circuit/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-account" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Account circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-account" path = "../../console/account" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.7" +version = "=0.16.8" [dev-dependencies.snarkvm-utilities] path = "../../utilities" diff --git a/circuit/algorithms/Cargo.toml b/circuit/algorithms/Cargo.toml index c236a4d568..dd0a870a8c 100644 --- a/circuit/algorithms/Cargo.toml +++ b/circuit/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-algorithms" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Algorithm circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-algorithms" path = "../../console/algorithms" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dev-dependencies.anyhow] diff --git a/circuit/collections/Cargo.toml b/circuit/collections/Cargo.toml index 98493ff3f0..f1c386810f 100644 --- a/circuit/collections/Cargo.toml +++ b/circuit/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-collections" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Collections circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-collections" path = "../../console/collections" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.7" +version = "=0.16.8" [dev-dependencies.snarkvm-circuit-network] path = "../network" diff --git a/circuit/environment/Cargo.toml b/circuit/environment/Cargo.toml index adeb296f77..2e17789ae1 100644 --- a/circuit/environment/Cargo.toml +++ b/circuit/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Circuit environment for a decentralized virtual machine" license = "Apache-2.0" @@ -14,32 +14,32 @@ harness = false [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.7" +version = "=0.16.8" default-features = false features = [ "r1cs" ] [dependencies.snarkvm-circuit-environment-witness] path = "./witness" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.indexmap] diff --git a/circuit/environment/witness/Cargo.toml b/circuit/environment/witness/Cargo.toml index ff5da00b15..a17d88385e 100644 --- a/circuit/environment/witness/Cargo.toml +++ b/circuit/environment/witness/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment-witness" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "A procedural macro to construct a witness in an environment" license = "Apache-2.0" diff --git a/circuit/network/Cargo.toml b/circuit/network/Cargo.toml index ddfc9a8638..60d20ef5bf 100644 --- a/circuit/network/Cargo.toml +++ b/circuit/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-network" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Network circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.7" +version = "=0.16.8" [dev-dependencies.snarkvm-console-types] path = "../../console/types" diff --git a/circuit/program/Cargo.toml b/circuit/program/Cargo.toml index 629b71a094..093b4e3f81 100644 --- a/circuit/program/Cargo.toml +++ b/circuit/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-program" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Program circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,32 +9,32 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-program" path = "../../console/program" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-circuit-account] path = "../account" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.7" +version = "=0.16.8" [dependencies.paste] version = "1.0" diff --git a/circuit/types/Cargo.toml b/circuit/types/Cargo.toml index 77c954c2fb..21e12f72d7 100644 --- a/circuit/types/Cargo.toml +++ b/circuit/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Primitive circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -8,35 +8,35 @@ edition = "2021" [dependencies.snarkvm-circuit-environment] path = "../environment" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-address] path = "./address" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-boolean] path = "./boolean" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-field] path = "./field" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-group] path = "./group" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-integers] path = "./integers" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-scalar] path = "./scalar" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-string] path = "./string" -version = "=0.16.7" +version = "=0.16.8" [dev-dependencies.console] package = "snarkvm-console" diff --git a/circuit/types/address/Cargo.toml b/circuit/types/address/Cargo.toml index 1274c0ff03..9ada56377e 100644 --- a/circuit/types/address/Cargo.toml +++ b/circuit/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-address" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Address circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,28 +9,28 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-address" path = "../../../console/types/address" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-group] path = "../group" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.7" +version = "=0.16.8" [features] default = [ "enable_console" ] diff --git a/circuit/types/boolean/Cargo.toml b/circuit/types/boolean/Cargo.toml index bf6cece171..ae4efa8db7 100644 --- a/circuit/types/boolean/Cargo.toml +++ b/circuit/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-boolean" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Boolean circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -14,12 +14,12 @@ harness = false [dependencies.console] package = "snarkvm-console-types-boolean" path = "../../../console/types/boolean" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.7" +version = "=0.16.8" [dev-dependencies.criterion] version = "0.5" diff --git a/circuit/types/field/Cargo.toml b/circuit/types/field/Cargo.toml index 3a63575ca7..a945013c23 100644 --- a/circuit/types/field/Cargo.toml +++ b/circuit/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-field" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Field circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-field" path = "../../../console/types/field" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.7" +version = "=0.16.8" [features] default = [ "enable_console" ] diff --git a/circuit/types/group/Cargo.toml b/circuit/types/group/Cargo.toml index 0f64a8ed66..61b1443b9c 100644 --- a/circuit/types/group/Cargo.toml +++ b/circuit/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-group" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Group circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-group" path = "../../../console/types/group" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.7" +version = "=0.16.8" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/integers/Cargo.toml b/circuit/types/integers/Cargo.toml index d86482e477..df75835a08 100644 --- a/circuit/types/integers/Cargo.toml +++ b/circuit/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-integers" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Integer circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-integers" path = "../../../console/types/integers" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.7" +version = "=0.16.8" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/scalar/Cargo.toml b/circuit/types/scalar/Cargo.toml index 9490193e1f..d9e6fa669e 100644 --- a/circuit/types/scalar/Cargo.toml +++ b/circuit/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-scalar" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Scalar circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-scalar" path = "../../../console/types/scalar" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.7" +version = "=0.16.8" [features] default = [ "enable_console" ] diff --git a/circuit/types/string/Cargo.toml b/circuit/types/string/Cargo.toml index 253d263d71..ec4473d42f 100644 --- a/circuit/types/string/Cargo.toml +++ b/circuit/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-string" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "String circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-string" path = "../../../console/types/string" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-circuit-types-integers] path = "../integers" -version = "=0.16.7" +version = "=0.16.8" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/console/Cargo.toml b/console/Cargo.toml index 9e6beca364..593f82ae99 100644 --- a/console/Cargo.toml +++ b/console/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Console environment for a decentralized virtual machine" license = "Apache-2.0" @@ -8,32 +8,32 @@ edition = "2021" [dependencies.snarkvm-console-account] path = "./account" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-console-algorithms] path = "./algorithms" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-console-collections] path = "./collections" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-console-network] path = "./network" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-console-program] path = "./program" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-console-types] path = "./types" -version = "=0.16.7" +version = "=0.16.8" optional = true [features] diff --git a/console/account/Cargo.toml b/console/account/Cargo.toml index e0de41ce98..8da6d89973 100644 --- a/console/account/Cargo.toml +++ b/console/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-account" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Account operations for a decentralized virtual machine" license = "Apache-2.0" @@ -13,11 +13,11 @@ harness = false [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.7" +version = "=0.16.8" default-features = false features = [ "address", "boolean", "field", "group", "scalar" ] diff --git a/console/algorithms/Cargo.toml b/console/algorithms/Cargo.toml index 1e56422d95..821e2dc48a 100644 --- a/console/algorithms/Cargo.toml +++ b/console/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-algorithms" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Console algorithms for a decentralized virtual machine" license = "Apache-2.0" @@ -23,18 +23,18 @@ harness = false [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.7" +version = "=0.16.8" default-features = false features = [ "field", "group", "integers", "scalar" ] [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.7" +version = "=0.16.8" [dependencies.blake2s_simd] version = "1.0" diff --git a/console/collections/Cargo.toml b/console/collections/Cargo.toml index f3861ec6ce..62823110bb 100644 --- a/console/collections/Cargo.toml +++ b/console/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-collections" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Collections for a decentralized virtual machine" license = "Apache-2.0" @@ -18,11 +18,11 @@ harness = false [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.7" +version = "=0.16.8" default-features = false features = [ "field", "integers" ] diff --git a/console/network/Cargo.toml b/console/network/Cargo.toml index c20869aad7..7cab8763c6 100644 --- a/console/network/Cargo.toml +++ b/console/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Network console library for a decentralized virtual machine" license = "Apache-2.0" @@ -15,45 +15,45 @@ wasm = [ [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.7" +version = "=0.16.8" default-features = false features = [ "snark" ] [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-network-environment] path = "./environment" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.7" +version = "=0.16.8" default-features = false features = [ "field", "group", "scalar" ] [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.snarkvm-parameters] path = "../../parameters" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.7" +version = "=0.16.8" [dependencies.anyhow] version = "1.0.73" diff --git a/console/network/environment/Cargo.toml b/console/network/environment/Cargo.toml index 7e85e232e3..b89109bf47 100644 --- a/console/network/environment/Cargo.toml +++ b/console/network/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network-environment" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Environment console library for a decentralized virtual machine" license = "Apache-2.0" @@ -8,17 +8,17 @@ edition = "2021" [dependencies.snarkvm-curves] path = "../../../curves" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.snarkvm-fields] path = "../../../fields" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.snarkvm-utilities] path = "../../../utilities" -version = "=0.16.7" +version = "=0.16.8" [dependencies.anyhow] version = "1.0.73" diff --git a/console/program/Cargo.toml b/console/program/Cargo.toml index 4c574d4974..57128a1a01 100644 --- a/console/program/Cargo.toml +++ b/console/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-program" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Program operations for a decentralized virtual machine" license = "Apache-2.0" @@ -12,27 +12,27 @@ test = [ ] [dependencies.snarkvm-console-account] path = "../account" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.7" +version = "=0.16.8" [dependencies.enum_index] version = "0.2" diff --git a/console/types/Cargo.toml b/console/types/Cargo.toml index b178469ebb..fc06b06d37 100644 --- a/console/types/Cargo.toml +++ b/console/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Console types for a decentralized virtual machine" license = "Apache-2.0" @@ -8,41 +8,41 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../network/environment" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types-address] path = "./address" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-console-types-boolean] path = "./boolean" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-console-types-field] path = "./field" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-console-types-group] path = "./group" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-console-types-integers] path = "./integers" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-console-types-scalar] path = "./scalar" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-console-types-string] path = "./string" -version = "=0.16.7" +version = "=0.16.8" optional = true [features] diff --git a/console/types/address/Cargo.toml b/console/types/address/Cargo.toml index d3818ea07b..d9cc0fa324 100644 --- a/console/types/address/Cargo.toml +++ b/console/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-address" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types-group] path = "../group" -version = "=0.16.7" +version = "=0.16.8" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/boolean/Cargo.toml b/console/types/boolean/Cargo.toml index e871c1a0fd..aea50019d9 100644 --- a/console/types/boolean/Cargo.toml +++ b/console/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-boolean" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,7 +8,7 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.7" +version = "=0.16.8" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/field/Cargo.toml b/console/types/field/Cargo.toml index bb8e5fcd3e..b1ccbb03c6 100644 --- a/console/types/field/Cargo.toml +++ b/console/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-field" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,11 +8,11 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.7" +version = "=0.16.8" [dependencies.zeroize] version = "1" diff --git a/console/types/group/Cargo.toml b/console/types/group/Cargo.toml index c68d1ac8a6..1861f13d6b 100644 --- a/console/types/group/Cargo.toml +++ b/console/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-group" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.7" +version = "=0.16.8" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/integers/Cargo.toml b/console/types/integers/Cargo.toml index 2804c8edad..342a4cb6f7 100644 --- a/console/types/integers/Cargo.toml +++ b/console/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-integers" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.7" +version = "=0.16.8" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/scalar/Cargo.toml b/console/types/scalar/Cargo.toml index 10e98a5264..441ddf2602 100644 --- a/console/types/scalar/Cargo.toml +++ b/console/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-scalar" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,15 +8,15 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.7" +version = "=0.16.8" [dependencies.zeroize] version = "1" diff --git a/console/types/string/Cargo.toml b/console/types/string/Cargo.toml index 348b16ae28..4cd84c31de 100644 --- a/console/types/string/Cargo.toml +++ b/console/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-string" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-console-types-integers] path = "../integers" -version = "=0.16.7" +version = "=0.16.8" [dev-dependencies.bincode] version = "1.3" diff --git a/curves/Cargo.toml b/curves/Cargo.toml index 439b9bd6dd..a324ae8bda 100644 --- a/curves/Cargo.toml +++ b/curves/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-curves" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Curves for a decentralized virtual machine" homepage = "https://aleo.org" @@ -36,12 +36,12 @@ harness = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.rand] diff --git a/fields/Cargo.toml b/fields/Cargo.toml index ca1fd3daf2..68fe8366e0 100644 --- a/fields/Cargo.toml +++ b/fields/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-fields" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Fields for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.aleo-std] diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index 300df56563..53a67ce1c7 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "A node ledger for a decentralized virtual machine" homepage = "https://aleo.org" @@ -56,54 +56,54 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "./authority" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "./block" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "./coinbase" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "./committee" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-narwhal] package = "snarkvm-ledger-narwhal" path = "./narwhal" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "./query" -version = "=0.16.7" +version = "=0.16.8" features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "./store" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-test-helpers] package = "snarkvm-ledger-test-helpers" path = "./test-helpers" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.synthesizer] package = "snarkvm-synthesizer" path = "../synthesizer" -version = "=0.16.7" +version = "=0.16.8" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/authority/Cargo.toml b/ledger/authority/Cargo.toml index 68970ca81e..8402685070 100644 --- a/ledger/authority/Cargo.toml +++ b/ledger/authority/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-authority" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Data structures for a block authority in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-subdag/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.7" +version = "=0.16.8" [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.7" +version = "=0.16.8" [dependencies.anyhow] version = "1" diff --git a/ledger/block/Cargo.toml b/ledger/block/Cargo.toml index 52c998e3d8..41c9017a07 100644 --- a/ledger/block/Cargo.toml +++ b/ledger/block/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-block" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "A block for a decentralized virtual machine" homepage = "https://aleo.org" @@ -39,42 +39,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../ledger/coinbase" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../../ledger/committee" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../narwhal/transmission-id" -version = "=0.16.7" +version = "=0.16.8" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.7" +version = "=0.16.8" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.7" +version = "=0.16.8" [dependencies.indexmap] version = "2.0" diff --git a/ledger/coinbase/Cargo.toml b/ledger/coinbase/Cargo.toml index 48ca50d7ac..294b9aa1d1 100644 --- a/ledger/coinbase/Cargo.toml +++ b/ledger/coinbase/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-coinbase" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Coinbase puzzle for a decentralized virtual machine" homepage = "https://aleo.org" @@ -50,27 +50,27 @@ wasm = [ [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-synthesizer-snark] path = "../../synthesizer/snark" -version = "=0.16.7" +version = "=0.16.8" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.aleo-std] diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index 107e431672..6e01316f0a 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-committee" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "A committee for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,7 +33,7 @@ test-helpers = [ "prop-tests", "rand_distr" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.7" +version = "=0.16.8" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/Cargo.toml b/ledger/narwhal/Cargo.toml index 95537f7e44..44ea8eb833 100644 --- a/ledger/narwhal/Cargo.toml +++ b/ledger/narwhal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Data structures for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -64,37 +64,37 @@ transmission-id = [ "narwhal-transmission-id" ] [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "./batch-certificate" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "./batch-header" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "./data" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "./subdag" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.narwhal-transmission] package = "snarkvm-ledger-narwhal-transmission" path = "./transmission" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "./transmission-id" -version = "=0.16.7" +version = "=0.16.8" optional = true [dev-dependencies.snarkvm-ledger-narwhal] diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index 804750d903..4588f263fe 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-header/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.7" +version = "=0.16.8" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.7" +version = "=0.16.8" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.7" +version = "=0.16.8" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/batch-header/Cargo.toml b/ledger/narwhal/batch-header/Cargo.toml index 7cc1ed9ec1..e314b41cb2 100644 --- a/ledger/narwhal/batch-header/Cargo.toml +++ b/ledger/narwhal/batch-header/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "A batch header for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-transmission-id/test-helpers", "time" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.7" +version = "=0.16.8" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.7" +version = "=0.16.8" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/data/Cargo.toml b/ledger/narwhal/data/Cargo.toml index d8fafe6892..b7e5dd6218 100644 --- a/ledger/narwhal/data/Cargo.toml +++ b/ledger/narwhal/data/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-data" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -29,7 +29,7 @@ async = [ "tokio" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.7" +version = "=0.16.8" [dependencies.bytes] version = "1" diff --git a/ledger/narwhal/subdag/Cargo.toml b/ledger/narwhal/subdag/Cargo.toml index 534b1cd141..9c7a419043 100644 --- a/ledger/narwhal/subdag/Cargo.toml +++ b/ledger/narwhal/subdag/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "A subdag for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-certificate/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.7" +version = "=0.16.8" [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../batch-certificate" -version = "=0.16.7" +version = "=0.16.8" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.7" +version = "=0.16.8" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/transmission-id/Cargo.toml b/ledger/narwhal/transmission-id/Cargo.toml index 35b988ff7b..2122469f7b 100644 --- a/ledger/narwhal/transmission-id/Cargo.toml +++ b/ledger/narwhal/transmission-id/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "A transmission ID for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.7" +version = "=0.16.8" [dev-dependencies.bincode] version = "1.3" diff --git a/ledger/narwhal/transmission/Cargo.toml b/ledger/narwhal/transmission/Cargo.toml index eefbe6f976..100f0c4e41 100644 --- a/ledger/narwhal/transmission/Cargo.toml +++ b/ledger/narwhal/transmission/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "A transmission for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../block" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "../data" -version = "=0.16.7" +version = "=0.16.8" [dependencies.bytes] version = "1" diff --git a/ledger/query/Cargo.toml b/ledger/query/Cargo.toml index 672608e808..71165584c4 100644 --- a/ledger/query/Cargo.toml +++ b/ledger/query/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-query" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "A query for a decentralized virtual machine" homepage = "https://aleo.org" @@ -30,18 +30,18 @@ query = [ "ledger-store", "synthesizer-program", "ureq" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.async-trait] diff --git a/ledger/store/Cargo.toml b/ledger/store/Cargo.toml index 692a8d9e87..4e87fd1201 100644 --- a/ledger/store/Cargo.toml +++ b/ledger/store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-store" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "A data store for a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,42 +32,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../coinbase" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../committee" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../narwhal/batch-certificate" -version = "=0.16.7" +version = "=0.16.8" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.7" +version = "=0.16.8" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.7" +version = "=0.16.8" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/test-helpers/Cargo.toml b/ledger/test-helpers/Cargo.toml index 24d42d2df5..6aacab6192 100644 --- a/ledger/test-helpers/Cargo.toml +++ b/ledger/test-helpers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-test-helpers" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Test helpers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -19,39 +19,39 @@ edition = "2021" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.7" +version = "=0.16.8" [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../query" -version = "=0.16.7" +version = "=0.16.8" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.7" +version = "=0.16.8" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.7" +version = "=0.16.8" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "../../synthesizer/process" -version = "=0.16.7" +version = "=0.16.8" [dependencies.once_cell] version = "1.18" diff --git a/parameters/Cargo.toml b/parameters/Cargo.toml index 205beececc..83df89f12c 100644 --- a/parameters/Cargo.toml +++ b/parameters/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-parameters" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Parameters for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "encoding", "js-sys", "web-sys" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.7" +version = "=0.16.8" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/Cargo.toml b/synthesizer/Cargo.toml index 21e116c46b..bdd18dee36 100644 --- a/synthesizer/Cargo.toml +++ b/synthesizer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Synthesizer for a decentralized virtual machine" homepage = "https://aleo.org" @@ -68,61 +68,61 @@ harness = false [dependencies.algorithms] package = "snarkvm-algorithms" path = "../algorithms" -version = "=0.16.7" +version = "=0.16.8" [dependencies.circuit] package = "snarkvm-circuit" path = "../circuit" -version = "=0.16.7" +version = "=0.16.8" [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../ledger/block" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../ledger/coinbase" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../ledger/committee" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../ledger/query" -version = "=0.16.7" +version = "=0.16.8" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../ledger/store" -version = "=0.16.7" +version = "=0.16.8" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "./process" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "./program" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "./snark" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.aleo-std] diff --git a/synthesizer/process/Cargo.toml b/synthesizer/process/Cargo.toml index 2532100faf..7f05bd688d 100644 --- a/synthesizer/process/Cargo.toml +++ b/synthesizer/process/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-process" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "A process for a decentralized virtual machine" homepage = "https://aleo.org" @@ -48,40 +48,40 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.7" +version = "=0.16.8" default-features = false features = [ "network", "program", "types" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../ledger/block" -version = "=0.16.7" +version = "=0.16.8" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../../ledger/query" -version = "=0.16.7" +version = "=0.16.8" default-features = false [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../../ledger/store" -version = "=0.16.7" +version = "=0.16.8" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.7" +version = "=0.16.8" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.7" +version = "=0.16.8" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/program/Cargo.toml b/synthesizer/program/Cargo.toml index 23fb2ca720..2ddc6ddb73 100644 --- a/synthesizer/program/Cargo.toml +++ b/synthesizer/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-program" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Program for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "console/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.7" +version = "=0.16.8" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.7" +version = "=0.16.8" default-features = false features = [ "account", "network", "program", "types" ] diff --git a/synthesizer/snark/Cargo.toml b/synthesizer/snark/Cargo.toml index f323a71da9..64ebc7190d 100644 --- a/synthesizer/snark/Cargo.toml +++ b/synthesizer/snark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-snark" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "SNARK wrappers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,18 +33,18 @@ wasm = [ "console/wasm", "snarkvm-algorithms/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.7" +version = "=0.16.8" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.7" +version = "=0.16.8" default-features = false features = [ "network" ] [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.7" +version = "=0.16.8" [dependencies.bincode] version = "1" diff --git a/utilities/Cargo.toml b/utilities/Cargo.toml index a937e6e38e..53fb9081b9 100644 --- a/utilities/Cargo.toml +++ b/utilities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Utilities for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities-derives] path = "./derives" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.aleo-std] diff --git a/utilities/derives/Cargo.toml b/utilities/derives/Cargo.toml index a243c4da44..a936201c6b 100644 --- a/utilities/derives/Cargo.toml +++ b/utilities/derives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities-derives" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "Canonical serialization for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index dd7eea53e8..619c54abf9 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-wasm" -version = "0.16.7" +version = "0.16.8" authors = [ "The Aleo Team " ] description = "WASM for a decentralized virtual machine" homepage = "https://aleo.org" @@ -28,30 +28,30 @@ crate-type = [ "cdylib", "rlib" ] [dependencies.snarkvm-console] path = "../console" -version = "=0.16.7" +version = "=0.16.8" features = [ "wasm" ] optional = true [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.7" +version = "=0.16.8" optional = true [dependencies.snarkvm-synthesizer] path = "../synthesizer" -version = "=0.16.7" +version = "=0.16.8" default-features = false features = [ "wasm" ] optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.7" +version = "=0.16.8" features = [ "wasm" ] optional = true From 9d11e91a68b23562084c2df34e134d69c2b4e05d Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Thu, 2 Nov 2023 17:23:53 +0100 Subject: [PATCH 076/339] Nit: remove marlin reference --- algorithms/src/snark/varuna/varuna.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/algorithms/src/snark/varuna/varuna.rs b/algorithms/src/snark/varuna/varuna.rs index ac07edcee3..e095deffcd 100644 --- a/algorithms/src/snark/varuna/varuna.rs +++ b/algorithms/src/snark/varuna/varuna.rs @@ -338,7 +338,7 @@ where /// This is the main entrypoint for creating proofs. /// You can find a specification of the prover algorithm in: - /// https://github.com/AleoHQ/protocol-docs/tree/main/snark/varuna + /// https://github.com/AleoHQ/protocol-docs fn prove_batch, R: Rng + CryptoRng>( universal_prover: &Self::UniversalProver, fs_parameters: &Self::FSParameters, @@ -627,7 +627,7 @@ where /// This is the main entrypoint for verifying proofs. /// You can find a specification of the verifier algorithm in: - /// https://github.com/AleoHQ/protocol-docs/tree/main/marlin + /// https://github.com/AleoHQ/protocol-docs fn verify_batch>( universal_verifier: &Self::UniversalVerifier, fs_parameters: &Self::FSParameters, From 311b57bf7d8c3e3c0ca3475652aab8708df053b0 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Fri, 3 Nov 2023 14:45:56 +0100 Subject: [PATCH 077/339] Always trim trailing zeros after poly operation --- algorithms/src/fft/polynomial/dense.rs | 46 ++++++++++++++++---------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/algorithms/src/fft/polynomial/dense.rs b/algorithms/src/fft/polynomial/dense.rs index 07454c9b5a..45dc8f8803 100644 --- a/algorithms/src/fft/polynomial/dense.rs +++ b/algorithms/src/fft/polynomial/dense.rs @@ -75,7 +75,7 @@ impl DensePolynomial { /// Constructs a new polynomial from a list of coefficients. pub fn from_coefficients_vec(mut coeffs: Vec) -> Self { // While there are zeros at the end of the coefficient vector, pop them off. - while coeffs.last().map_or(false, |c| c.is_zero()) { + while let Some(true) = coeffs.last().map(|c| c.is_zero()) { coeffs.pop(); } // Check that either the coefficients vec is empty or that the last coeff is non-zero. @@ -113,10 +113,16 @@ impl DensePolynomial { crate::cfg_reduce!(mapping, || zero, |a, b| a + b) } - /// Outputs a polynomial of degree `d` where each coefficient is sampled uniformly at random - /// from the field `F`. + /// Outputs a univariate polynomial of degree `d` where each non-leading + /// coefficient is sampled uniformly at random from R and the leading + /// coefficient is sampled uniformly at random from among the non-zero + /// elements of R. pub fn rand(d: usize, rng: &mut R) -> Self { - let random_coeffs = (0..(d + 1)).map(|_| F::rand(rng)).collect(); + let mut random_coeffs = (0..(d + 1)).map(|_| F::rand(rng)).collect_vec(); + while random_coeffs[d].is_zero() { + // In the extremely unlikely event, sample again. + random_coeffs = (0..(d + 1)).map(|_| F::rand(rng)).collect(); + } Self::from_coefficients_vec(random_coeffs) } @@ -197,6 +203,10 @@ impl<'a, 'b, F: Field> Add<&'a DensePolynomial> for &'b DensePolynomial { let mut result = self.clone(); // Zip safety: `result` and `other` could have different lengths. cfg_iter_mut!(result.coeffs).zip(&other.coeffs).for_each(|(a, b)| *a += b); + // If the leading coefficient ends up being zero, pop it off. + while let Some(true) = self.coeffs.last().map(|c| c.is_zero()) { + result.coeffs.pop(); + } result } else { let mut result = other.clone(); @@ -273,10 +283,10 @@ impl<'a, F: Field> AddAssign<(F, &'a DensePolynomial)> for DensePolynomial cfg_iter_mut!(self.coeffs).zip(&other.coeffs).for_each(|(a, b)| { *a += f * b; }); - // If the leading coefficient ends up being zero, pop it off. - while let Some(true) = self.coeffs.last().map(|c| c.is_zero()) { - self.coeffs.pop(); - } + } + // If the leading coefficient ends up being zero, pop it off. + while let Some(true) = self.coeffs.last().map(|c| c.is_zero()) { + self.coeffs.pop(); } } } @@ -310,6 +320,10 @@ impl<'a, 'b, F: Field> Sub<&'a DensePolynomial> for &'b DensePolynomial { let mut result = self.clone(); // Zip safety: `result` and `other` could have different degrees. cfg_iter_mut!(result.coeffs).zip(&other.coeffs).for_each(|(a, b)| *a -= b); + // If the leading coefficient ends up being zero, pop it off. + while let Some(true) = result.coeffs.last().map(|c| c.is_zero()) { + result.coeffs.pop(); + } result } else { let mut result = self.clone(); @@ -318,11 +332,9 @@ impl<'a, 'b, F: Field> Sub<&'a DensePolynomial> for &'b DensePolynomial { cfg_iter_mut!(result.coeffs).zip(&other.coeffs).for_each(|(a, b)| { *a -= b; }); - if !result.is_zero() { - // If the leading coefficient ends up being zero, pop it off. - while result.coeffs.last().map(|c| c.is_zero()) == Some(true) { - result.coeffs.pop(); - } + // If the leading coefficient ends up being zero, pop it off. + while let Some(true) = result.coeffs.last().map(|c| c.is_zero()) { + result.coeffs.pop(); } result @@ -348,10 +360,10 @@ impl<'a, F: Field> SubAssign<&'a DensePolynomial> for DensePolynomial { self.coeffs.resize(other.coeffs.len(), F::zero()); // Zip safety: self and other have the same length after the resize. cfg_iter_mut!(self.coeffs).zip(&other.coeffs).for_each(|(a, b)| *a -= b); - // If the leading coefficient ends up being zero, pop it off. - while let Some(true) = self.coeffs.last().map(|c| c.is_zero()) { - self.coeffs.pop(); - } + } + // If the leading coefficient ends up being zero, pop it off. + while let Some(true) = self.coeffs.last().map(|c| c.is_zero()) { + self.coeffs.pop(); } } } From 32fbbbfa9200e2173bfe91585f1623fa19e4940d Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Fri, 3 Nov 2023 14:51:16 +0100 Subject: [PATCH 078/339] Add missing dependency --- algorithms/src/fft/polynomial/dense.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/algorithms/src/fft/polynomial/dense.rs b/algorithms/src/fft/polynomial/dense.rs index 45dc8f8803..5203075714 100644 --- a/algorithms/src/fft/polynomial/dense.rs +++ b/algorithms/src/fft/polynomial/dense.rs @@ -25,7 +25,6 @@ use std::{ ops::{Add, AddAssign, Deref, DerefMut, Div, Mul, MulAssign, Neg, Sub, SubAssign}, }; -#[cfg(feature = "serial")] use itertools::Itertools; #[cfg(not(feature = "serial"))] From 9bffffde65472a57d417376d7dcf029ba4eb501a Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Fri, 3 Nov 2023 15:16:29 +0100 Subject: [PATCH 079/339] Only resample last element --- algorithms/src/fft/polynomial/dense.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/src/fft/polynomial/dense.rs b/algorithms/src/fft/polynomial/dense.rs index 5203075714..3dd7942dc0 100644 --- a/algorithms/src/fft/polynomial/dense.rs +++ b/algorithms/src/fft/polynomial/dense.rs @@ -120,7 +120,7 @@ impl DensePolynomial { let mut random_coeffs = (0..(d + 1)).map(|_| F::rand(rng)).collect_vec(); while random_coeffs[d].is_zero() { // In the extremely unlikely event, sample again. - random_coeffs = (0..(d + 1)).map(|_| F::rand(rng)).collect(); + random_coeffs[d] = F::rand(rng); } Self::from_coefficients_vec(random_coeffs) } From 8f71da5b9197c3873b63b0620ab2cfc6066cfb95 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Fri, 3 Nov 2023 15:22:29 +0100 Subject: [PATCH 080/339] Add import to reserved keywords --- synthesizer/program/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/synthesizer/program/src/lib.rs b/synthesizer/program/src/lib.rs index a6597740b3..26f9b7c2b8 100644 --- a/synthesizer/program/src/lib.rs +++ b/synthesizer/program/src/lib.rs @@ -589,6 +589,7 @@ impl, Command: CommandTrait> Pro "owner", // Program "transition", + "import", "function", "struct", "closure", From d2656257d749413b730d276b470c980b7e308657 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Fri, 3 Nov 2023 15:51:44 +0100 Subject: [PATCH 081/339] Check for min struct entries --- synthesizer/process/src/stack/helpers/matches.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/synthesizer/process/src/stack/helpers/matches.rs b/synthesizer/process/src/stack/helpers/matches.rs index 796608f5ab..975045943f 100644 --- a/synthesizer/process/src/stack/helpers/matches.rs +++ b/synthesizer/process/src/stack/helpers/matches.rs @@ -223,8 +223,14 @@ impl Stack { Plaintext::Array(..) => bail!("'{struct_name}' is invalid: expected struct, found array"), }; - // Ensure the number of struct members does not exceed the maximum. let num_members = members.len(); + // Ensure the number of struct members does not go below the minimum. + ensure!( + num_members >= N::MIN_STRUCT_ENTRIES, + "'{struct_name}' cannot be less than {} entries", + N::MIN_STRUCT_ENTRIES + ); + // Ensure the number of struct members does not exceed the maximum. ensure!( num_members <= N::MAX_STRUCT_ENTRIES, "'{struct_name}' cannot exceed {} entries", From 7cf307f81874dfec2e910567c13412b6fb195d3e Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Fri, 3 Nov 2023 16:15:17 +0100 Subject: [PATCH 082/339] Correctly panic when dividing by zero poly --- algorithms/src/fft/polynomial/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/algorithms/src/fft/polynomial/mod.rs b/algorithms/src/fft/polynomial/mod.rs index fa24d0c72e..9c4b0573dc 100644 --- a/algorithms/src/fft/polynomial/mod.rs +++ b/algorithms/src/fft/polynomial/mod.rs @@ -210,10 +210,10 @@ impl<'a, F: Field> Polynomial<'a, F> { /// Divide self by another (sparse or dense) polynomial, and returns the quotient and remainder. pub fn divide_with_q_and_r(&self, divisor: &Self) -> Option<(DensePolynomial, DensePolynomial)> { - if self.is_zero() { - Some((DensePolynomial::zero(), DensePolynomial::zero())) - } else if divisor.is_zero() { + if divisor.is_zero() { panic!("Dividing by zero polynomial") + } else if self.is_zero() { + Some((DensePolynomial::zero(), DensePolynomial::zero())) } else if self.degree() < divisor.degree() { Some((DensePolynomial::zero(), self.clone().into())) } else { From e608f950d771ed282bb6a523cf0a5e628896ccae Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Fri, 3 Nov 2023 16:26:03 +0100 Subject: [PATCH 083/339] return err instead of panic when dividing by zero --- algorithms/src/fft/polynomial/dense.rs | 15 +++++++-------- algorithms/src/fft/polynomial/mod.rs | 15 ++++++++------- algorithms/src/snark/varuna/ahp/selectors.rs | 3 +-- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/algorithms/src/fft/polynomial/dense.rs b/algorithms/src/fft/polynomial/dense.rs index 07454c9b5a..e005a23022 100644 --- a/algorithms/src/fft/polynomial/dense.rs +++ b/algorithms/src/fft/polynomial/dense.rs @@ -15,6 +15,7 @@ //! A polynomial represented in coefficient form. use crate::fft::{EvaluationDomain, Evaluations, Polynomial}; +use anyhow::Result; use snarkvm_fields::{Field, PrimeField}; use snarkvm_utilities::{cfg_iter_mut, serialize::*}; @@ -156,7 +157,7 @@ impl DensePolynomial { pub fn divide_by_vanishing_poly( &self, domain: EvaluationDomain, - ) -> Option<(DensePolynomial, DensePolynomial)> { + ) -> Result<(DensePolynomial, DensePolynomial)> { let self_poly = Polynomial::from(self); let vanishing_poly = Polynomial::from(domain.vanishing_polynomial()); self_poly.divide_with_q_and_r(&vanishing_poly) @@ -421,14 +422,14 @@ impl CheckedDiv for DensePolynomial { let a: Polynomial<_> = self.into(); let b: Polynomial<_> = divisor.into(); match a.divide_with_q_and_r(&b) { - Some((divisor, remainder)) => { + Ok((divisor, remainder)) => { if remainder.is_zero() { Some(divisor) } else { None } } - None => None, + Err(_) => None, } } } @@ -592,11 +593,9 @@ mod tests { for b_degree in 0..70 { let dividend = DensePolynomial::::rand(a_degree, rng); let divisor = DensePolynomial::::rand(b_degree, rng); - if let Some((quotient, remainder)) = - Polynomial::divide_with_q_and_r(&(÷nd).into(), &(&divisor).into()) - { - assert_eq!(dividend, &(&divisor * "ient) + &remainder) - } + let (quotient, remainder) = + Polynomial::divide_with_q_and_r(&(÷nd).into(), &(&divisor).into()).unwrap(); + assert_eq!(dividend, &(&divisor * "ient) + &remainder) } } } diff --git a/algorithms/src/fft/polynomial/mod.rs b/algorithms/src/fft/polynomial/mod.rs index 9c4b0573dc..86c12fcef5 100644 --- a/algorithms/src/fft/polynomial/mod.rs +++ b/algorithms/src/fft/polynomial/mod.rs @@ -15,6 +15,7 @@ //! Work with sparse and dense polynomials. use crate::fft::{EvaluationDomain, Evaluations}; +use anyhow::{ensure, Result}; use snarkvm_fields::{Field, PrimeField}; use snarkvm_utilities::{cfg_iter_mut, serialize::*, SerializationError}; @@ -209,13 +210,13 @@ impl<'a, F: Field> Polynomial<'a, F> { } /// Divide self by another (sparse or dense) polynomial, and returns the quotient and remainder. - pub fn divide_with_q_and_r(&self, divisor: &Self) -> Option<(DensePolynomial, DensePolynomial)> { - if divisor.is_zero() { - panic!("Dividing by zero polynomial") - } else if self.is_zero() { - Some((DensePolynomial::zero(), DensePolynomial::zero())) + pub fn divide_with_q_and_r(&self, divisor: &Self) -> Result<(DensePolynomial, DensePolynomial)> { + ensure!(!divisor.is_zero(), "Dividing by zero polynomial"); + + if self.is_zero() { + Ok((DensePolynomial::zero(), DensePolynomial::zero())) } else if self.degree() < divisor.degree() { - Some((DensePolynomial::zero(), self.clone().into())) + Ok((DensePolynomial::zero(), self.clone().into())) } else { // Now we know that self.degree() >= divisor.degree(); let mut quotient = vec![F::zero(); self.degree() - divisor.degree() + 1]; @@ -241,7 +242,7 @@ impl<'a, F: Field> Polynomial<'a, F> { remainder.coeffs.pop(); } } - Some((DensePolynomial::from_coefficients_vec(quotient), remainder)) + Ok((DensePolynomial::from_coefficients_vec(quotient), remainder)) } } } diff --git a/algorithms/src/snark/varuna/ahp/selectors.rs b/algorithms/src/snark/varuna/ahp/selectors.rs index a80de2e0e4..59a88ae213 100644 --- a/algorithms/src/snark/varuna/ahp/selectors.rs +++ b/algorithms/src/snark/varuna/ahp/selectors.rs @@ -88,8 +88,7 @@ pub(crate) fn apply_randomized_selector( if !remainder_witness { // Substituting in s_i, we get that poly_i * s_i / v_H = poly_i / v_H * (H_i.size() / H.size()); let selector_time = start_timer!(|| "Compute selector without remainder witness"); - let (mut h_i, remainder) = - poly.divide_by_vanishing_poly(*src_domain).ok_or(anyhow::anyhow!("could not divide by vanishing poly"))?; + let (mut h_i, remainder) = poly.divide_by_vanishing_poly(*src_domain)?; assert!(remainder.is_zero()); let multiplier = combiner * src_domain.size_as_field_element * target_domain.size_inv; cfg_iter_mut!(h_i.coeffs).for_each(|c| *c *= multiplier); From 70c50f51b3ddae234c87b32491d098ad57407213 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Fri, 3 Nov 2023 12:13:29 +0100 Subject: [PATCH 084/339] perf: use a Peekable in PoseidonSponge::compress_elements Signed-off-by: ljedrz --- algorithms/src/crypto_hash/poseidon.rs | 35 +++++++++++++------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/algorithms/src/crypto_hash/poseidon.rs b/algorithms/src/crypto_hash/poseidon.rs index 3476c271b8..e215b4ddc2 100644 --- a/algorithms/src/crypto_hash/poseidon.rs +++ b/algorithms/src/crypto_hash/poseidon.rs @@ -18,6 +18,7 @@ use snarkvm_utilities::{BigInteger, FromBits, ToBits}; use smallvec::SmallVec; use std::{ + iter::Peekable, ops::{Index, IndexMut}, sync::Arc, }; @@ -332,7 +333,11 @@ impl PoseidonSponge { /// Compress every two elements if possible. /// Provides a vector of (limb, num_of_additions), both of which are F. - pub fn compress_elements(&self, src_limbs: &[(F, F)], ty: OptimizationType) -> Vec { + pub fn compress_elements>( + &self, + mut src_limbs: Peekable, + ty: OptimizationType, + ) -> Vec { let capacity = F::size_in_bits() - 1; let mut dest_limbs = Vec::::new(); @@ -341,11 +346,8 @@ impl PoseidonSponge { // Prepare a reusable vector to be used in overhead calculation. let mut num_bits = Vec::new(); - let mut i = 0; - let src_len = src_limbs.len(); - while i < src_len { - let first = &src_limbs[i]; - let second = if i + 1 < src_len { Some(&src_limbs[i + 1]) } else { None }; + while let Some(first) = src_limbs.next() { + let second = src_limbs.peek(); let first_max_bits_per_limb = params.bits_per_limb + crate::overhead!(first.1 + F::one(), &mut num_bits); let second_max_bits_per_limb = if let Some(second) = second { @@ -359,14 +361,12 @@ impl PoseidonSponge { let adjustment_factor = &self.adjustment_factor_lookup_table[second_max_bits_per_limb]; dest_limbs.push(first.0 * adjustment_factor + second.0); - i += 2; + src_limbs.next(); } else { dest_limbs.push(first.0); - i += 1; } } else { dest_limbs.push(first.0); - i += 1; } } @@ -417,17 +417,16 @@ impl PoseidonSponge { src: impl IntoIterator, ty: OptimizationType, ) { - let mut src_limbs = Vec::<(F, F)>::new(); - - for elem in src { - let limbs = Self::get_limbs_representations(&elem, ty); - for limb in limbs.iter() { - src_limbs.push((*limb, F::one())); + let src_limbs = src + .into_iter() + .flat_map(|elem| { + let limbs = Self::get_limbs_representations(&elem, ty); + limbs.into_iter().map(|limb| (limb, F::one())) // specifically set to one, since most gadgets in the constraint world would not have zero noise (due to the relatively weak normal form testing in `alloc`) - } - } + }) + .peekable(); - let dest_limbs = self.compress_elements::(&src_limbs, ty); + let dest_limbs = self.compress_elements::(src_limbs, ty); self.absorb_native_field_elements(&dest_limbs); } From 333c8475d64b93926f8dc2a59b48cb7d8c462bd4 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Fri, 3 Nov 2023 12:35:45 +0100 Subject: [PATCH 085/339] chore: fix a comment Signed-off-by: ljedrz --- algorithms/src/crypto_hash/poseidon.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/src/crypto_hash/poseidon.rs b/algorithms/src/crypto_hash/poseidon.rs index e215b4ddc2..e7da888a3a 100644 --- a/algorithms/src/crypto_hash/poseidon.rs +++ b/algorithms/src/crypto_hash/poseidon.rs @@ -405,7 +405,7 @@ impl PoseidonSponge { cur_bits.clear(); } - // then we reserve, so that the limbs are ``big limb first'' + // then we reverse, so that the limbs are ``big limb first'' limbs.reverse(); limbs From 577bc4dd9005eeff32dd2b752fdfa708e649274c Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Fri, 3 Nov 2023 16:39:00 +0100 Subject: [PATCH 086/339] Do not deserialize polys with trailing zero --- algorithms/src/fft/polynomial/mod.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/algorithms/src/fft/polynomial/mod.rs b/algorithms/src/fft/polynomial/mod.rs index fa24d0c72e..5d95df351d 100644 --- a/algorithms/src/fft/polynomial/mod.rs +++ b/algorithms/src/fft/polynomial/mod.rs @@ -67,7 +67,12 @@ impl<'a, F: Field> CanonicalSerialize for Polynomial<'a, F> { impl<'a, F: Field> Valid for Polynomial<'a, F> { fn check(&self) -> Result<(), SerializationError> { - Ok(()) + // Fail if the trailing coefficient is zero + if let Some(false) = self.coeffs().last().map(|c| c.1.is_zero()) { + Err(SerializationError::InvalidData) + } else { + Ok(()) + } } } From f698cf62ebb7b3cd6cfb45245bf6378ea38687a7 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Fri, 3 Nov 2023 16:48:40 +0100 Subject: [PATCH 087/339] Make sure we loop independent of order in map --- algorithms/src/snark/varuna/data_structures/proof.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/src/snark/varuna/data_structures/proof.rs b/algorithms/src/snark/varuna/data_structures/proof.rs index 196059b70f..0d7767f777 100644 --- a/algorithms/src/snark/varuna/data_structures/proof.rs +++ b/algorithms/src/snark/varuna/data_structures/proof.rs @@ -170,7 +170,7 @@ impl Evaluations { for (label, value) in map { if label == "g_1" { - break; + continue; } if label.contains("g_a") { From 765069eff9905170849c9176964324c95176d590 Mon Sep 17 00:00:00 2001 From: vicsn Date: Mon, 6 Nov 2023 12:17:44 +0100 Subject: [PATCH 088/339] Only polynomials without trailing zero are accepted Co-authored-by: ljedrz Signed-off-by: vicsn --- algorithms/src/fft/polynomial/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/src/fft/polynomial/mod.rs b/algorithms/src/fft/polynomial/mod.rs index 5d95df351d..abb794df7f 100644 --- a/algorithms/src/fft/polynomial/mod.rs +++ b/algorithms/src/fft/polynomial/mod.rs @@ -68,7 +68,7 @@ impl<'a, F: Field> CanonicalSerialize for Polynomial<'a, F> { impl<'a, F: Field> Valid for Polynomial<'a, F> { fn check(&self) -> Result<(), SerializationError> { // Fail if the trailing coefficient is zero - if let Some(false) = self.coeffs().last().map(|c| c.1.is_zero()) { + if let Some(true) = self.coeffs().last().map(|c| c.1.is_zero()) { Err(SerializationError::InvalidData) } else { Ok(()) From 7a4d2ab8a412e4a714da74c9b8f892a570046de7 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Mon, 6 Nov 2023 12:54:35 +0100 Subject: [PATCH 089/339] Clarify error --- algorithms/src/fft/polynomial/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/src/fft/polynomial/mod.rs b/algorithms/src/fft/polynomial/mod.rs index 86c12fcef5..54ec8387b8 100644 --- a/algorithms/src/fft/polynomial/mod.rs +++ b/algorithms/src/fft/polynomial/mod.rs @@ -211,7 +211,7 @@ impl<'a, F: Field> Polynomial<'a, F> { /// Divide self by another (sparse or dense) polynomial, and returns the quotient and remainder. pub fn divide_with_q_and_r(&self, divisor: &Self) -> Result<(DensePolynomial, DensePolynomial)> { - ensure!(!divisor.is_zero(), "Dividing by zero polynomial"); + ensure!(!divisor.is_zero(), "Dividing by zero polynomial is undefined"); if self.is_zero() { Ok((DensePolynomial::zero(), DensePolynomial::zero())) From d4180a76d7293635e4565b4c2501195187d81f43 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Mon, 6 Nov 2023 13:00:28 +0100 Subject: [PATCH 090/339] Add test divide_poly_by_zero --- algorithms/src/fft/polynomial/dense.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/algorithms/src/fft/polynomial/dense.rs b/algorithms/src/fft/polynomial/dense.rs index e005a23022..3031cb11f7 100644 --- a/algorithms/src/fft/polynomial/dense.rs +++ b/algorithms/src/fft/polynomial/dense.rs @@ -614,6 +614,13 @@ mod tests { } } + #[test] + fn divide_poly_by_zero() { + let a = Polynomial::::zero(); + let b = Polynomial::::zero(); + assert!(a.divide_with_q_and_r(&b).is_err()); + } + #[test] fn mul_polynomials_random() { let rng = &mut TestRng::default(); From 60dadc2f1c0534c13aa7d6ce0a0baf0946dab420 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Fri, 3 Nov 2023 15:42:57 +0100 Subject: [PATCH 091/339] feat: make all the rngs deterministic once seeded Signed-off-by: ljedrz --- ledger/benches/transaction.rs | 4 +- ledger/block/src/lib.rs | 2 +- ledger/block/src/transaction/fee/mod.rs | 4 +- ledger/src/check_next_block.rs | 9 +++-- ledger/src/check_transaction_basic.rs | 9 ++++- ledger/src/lib.rs | 12 ++---- ledger/src/tests.rs | 34 ++++++++-------- ledger/test-helpers/src/lib.rs | 6 +-- synthesizer/process/src/execute.rs | 9 +++-- synthesizer/process/src/lib.rs | 2 +- synthesizer/process/src/stack/authorize.rs | 2 +- synthesizer/process/src/stack/call/mod.rs | 16 ++++---- synthesizer/process/src/stack/deploy.rs | 9 +++-- synthesizer/process/src/stack/execute.rs | 5 ++- .../process/src/stack/helpers/synthesize.rs | 2 +- synthesizer/process/src/tests/test_credits.rs | 4 +- synthesizer/process/src/tests/test_execute.rs | 40 +++++++++---------- synthesizer/process/src/traits/mod.rs | 5 ++- synthesizer/src/vm/execute.rs | 4 +- synthesizer/src/vm/finalize.rs | 2 +- synthesizer/src/vm/helpers/committee.rs | 21 +++++----- synthesizer/src/vm/helpers/rewards.rs | 2 +- synthesizer/src/vm/mod.rs | 8 ++-- synthesizer/src/vm/verify.rs | 31 ++++++++------ synthesizer/tests/test_process_execute.rs | 2 +- .../tests/test_vm_execute_and_finalize.rs | 2 +- utilities/src/rand.rs | 7 ++++ vm/package/execute.rs | 2 +- vm/package/run.rs | 2 +- 29 files changed, 140 insertions(+), 117 deletions(-) diff --git a/ledger/benches/transaction.rs b/ledger/benches/transaction.rs index c37267d923..e83254914f 100644 --- a/ledger/benches/transaction.rs +++ b/ledger/benches/transaction.rs @@ -80,7 +80,7 @@ function hello: c.bench_function("Transaction::Deploy - verify", |b| { let transaction = vm.deploy(&private_key, &program, Some(records[0].clone()), 600000, None, rng).unwrap(); - b.iter(|| vm.check_transaction(&transaction, None).unwrap()) + b.iter(|| vm.check_transaction(&transaction, None, rng).unwrap()) }); } @@ -118,7 +118,7 @@ fn execute(c: &mut Criterion) { .unwrap(); c.bench_function("Transaction::Execute(transfer_public) - verify", |b| { - b.iter(|| vm.check_transaction(&transaction, None).unwrap()) + b.iter(|| vm.check_transaction(&transaction, None, rng).unwrap()) }); } diff --git a/ledger/block/src/lib.rs b/ledger/block/src/lib.rs index 7aa9595c2c..34ede1b937 100644 --- a/ledger/block/src/lib.rs +++ b/ledger/block/src/lib.rs @@ -607,7 +607,7 @@ pub mod test_helpers { let authorization = process.authorize::(&private_key, locator.0, locator.1, inputs.iter(), rng).unwrap(); // Execute the function. - let (_, mut trace) = process.execute::(authorization).unwrap(); + let (_, mut trace) = process.execute::(authorization, rng).unwrap(); // Initialize a new block store. let block_store = BlockStore::>::open(None).unwrap(); diff --git a/ledger/block/src/transaction/fee/mod.rs b/ledger/block/src/transaction/fee/mod.rs index 8ee356c9fb..233704fca4 100644 --- a/ledger/block/src/transaction/fee/mod.rs +++ b/ledger/block/src/transaction/fee/mod.rs @@ -253,7 +253,7 @@ pub mod test_helpers { ) .unwrap(); // Construct the fee trace. - let (_, mut trace) = process.execute::(authorization).unwrap(); + let (_, mut trace) = process.execute::(authorization, rng).unwrap(); // Initialize a new block store. let block_store = BlockStore::>::open(None).unwrap(); @@ -309,7 +309,7 @@ pub mod test_helpers { ) .unwrap(); // Construct the fee trace. - let (_, mut trace) = process.execute::(authorization).unwrap(); + let (_, mut trace) = process.execute::(authorization, rng).unwrap(); // Initialize a new block store. let block_store = BlockStore::>::open(None).unwrap(); diff --git a/ledger/src/check_next_block.rs b/ledger/src/check_next_block.rs index e4dafb81e9..18a1ee2544 100644 --- a/ledger/src/check_next_block.rs +++ b/ledger/src/check_next_block.rs @@ -14,9 +14,11 @@ use super::*; +use rand::{rngs::StdRng, SeedableRng}; + impl> Ledger { /// Checks the given block is valid next block. - pub fn check_next_block(&self, block: &Block) -> Result<()> { + pub fn check_next_block(&self, block: &Block, rng: &mut R) -> Result<()> { let height = block.height(); // Ensure the block hash does not already exist. @@ -41,8 +43,9 @@ impl> Ledger { // Ensure each transaction is well-formed and unique. // TODO: this intermediate allocation shouldn't be necessary; this is most likely https://github.com/rust-lang/rust/issues/89418. let transactions = block.transactions().iter().collect::>(); - cfg_iter!(transactions).try_for_each(|transaction| { - self.check_transaction_basic(*transaction, transaction.to_rejected_id()?) + let rngs = (0..transactions.len()).map(|_| StdRng::from_seed(rng.gen())).collect::>(); + cfg_iter!(transactions).zip(rngs).try_for_each(|(transaction, mut rng)| { + self.check_transaction_basic(*transaction, transaction.to_rejected_id()?, &mut rng) .map_err(|e| anyhow!("Invalid transaction found in the transactions list: {e}")) })?; diff --git a/ledger/src/check_transaction_basic.rs b/ledger/src/check_transaction_basic.rs index 0d2218272f..cfdb6b7a76 100644 --- a/ledger/src/check_transaction_basic.rs +++ b/ledger/src/check_transaction_basic.rs @@ -16,7 +16,12 @@ use super::*; impl> Ledger { /// Checks the given transaction is well-formed and unique. - pub fn check_transaction_basic(&self, transaction: &Transaction, rejected_id: Option>) -> Result<()> { - self.vm().check_transaction(transaction, rejected_id) + pub fn check_transaction_basic( + &self, + transaction: &Transaction, + rejected_id: Option>, + rng: &mut R, + ) -> Result<()> { + self.vm().check_transaction(transaction, rejected_id, rng) } } diff --git a/ledger/src/lib.rs b/ledger/src/lib.rs index 0e5511b798..c66cebbafa 100644 --- a/ledger/src/lib.rs +++ b/ledger/src/lib.rs @@ -319,21 +319,19 @@ impl> Ledger { /// Creates a deploy transaction. /// /// The `priority_fee_in_microcredits` is an additional fee **on top** of the deployment fee. - pub fn create_deploy( + pub fn create_deploy( &self, private_key: &PrivateKey, program: &Program, priority_fee_in_microcredits: u64, query: Option>, + rng: &mut R, ) -> Result> { // Fetch the unspent records. let records = self.find_unspent_credits_records(&ViewKey::try_from(private_key)?)?; ensure!(!records.len().is_zero(), "The Aleo account has no records to spend."); let mut records = records.values(); - // Initialize an RNG. - let rng = &mut ::rand::thread_rng(); - // Prepare the fee record. let fee_record = Some(records.next().unwrap().clone()); @@ -344,22 +342,20 @@ impl> Ledger { /// Creates a transfer transaction. /// /// The `priority_fee_in_microcredits` is an additional fee **on top** of the execution fee. - pub fn create_transfer( + pub fn create_transfer( &self, private_key: &PrivateKey, to: Address, amount_in_microcredits: u64, priority_fee_in_microcredits: u64, query: Option>, + rng: &mut R, ) -> Result> { // Fetch the unspent records. let records = self.find_unspent_credits_records(&ViewKey::try_from(private_key)?)?; ensure!(!records.len().is_zero(), "The Aleo account has no records to spend."); let mut records = records.values(); - // Initialize an RNG. - let rng = &mut rand::thread_rng(); - // Prepare the inputs. let inputs = [ Value::Record(records.next().unwrap().clone()), diff --git a/ledger/src/tests.rs b/ledger/src/tests.rs index af95102191..5f6c7e5ecc 100644 --- a/ledger/src/tests.rs +++ b/ledger/src/tests.rs @@ -113,7 +113,7 @@ fn test_insufficient_private_fees() { let authorization = ledger.vm.authorize(&private_key, "credits.aleo", "split", inputs.into_iter(), rng).unwrap(); let split_transaction_without_fee = ledger.vm.execute_authorization(authorization, None, None, rng).unwrap(); - assert!(ledger.check_transaction_basic(&split_transaction_without_fee, None).is_ok()); + assert!(ledger.check_transaction_basic(&split_transaction_without_fee, None, rng).is_ok()); } // Check fee amount requirements for executions. @@ -143,7 +143,7 @@ fn test_insufficient_private_fees() { .unwrap(); let fee = ledger.vm.execute_fee_authorization(fee_authorization, None, rng).unwrap(); let sufficient_fee_transaction = Transaction::from_execution(execution.clone(), Some(fee)).unwrap(); - assert!(ledger.check_transaction_basic(&sufficient_fee_transaction, None).is_ok()); + assert!(ledger.check_transaction_basic(&sufficient_fee_transaction, None, rng).is_ok()); // Check that a transaction with insufficient fee will fail. let insufficient_fee_authorization = ledger @@ -153,7 +153,7 @@ fn test_insufficient_private_fees() { let insufficient_fee = ledger.vm.execute_fee_authorization(insufficient_fee_authorization, None, rng).unwrap(); let insufficient_fee_transaction = Transaction::from_execution(execution.clone(), Some(insufficient_fee)).unwrap(); - assert!(ledger.check_transaction_basic(&insufficient_fee_transaction, None).is_err()); + assert!(ledger.check_transaction_basic(&insufficient_fee_transaction, None, rng).is_err()); } // Check fee amount requirements for deployment. @@ -175,7 +175,7 @@ finalize foo: // Check that a deployment transaction with sufficient fee will succeed. let transaction = ledger.vm.deploy(&private_key, &program, Some(record_2.clone()), 0, None, rng).unwrap(); - assert!(ledger.check_transaction_basic(&transaction, None).is_ok()); + assert!(ledger.check_transaction_basic(&transaction, None, rng).is_ok()); // Check that a deployment transaction with insufficient fee will fail. let deployment = transaction.deployment().unwrap(); @@ -186,7 +186,7 @@ finalize foo: let insufficient_fee = ledger.vm.execute_fee_authorization(insufficient_fee_authorization, None, rng).unwrap(); let insufficient_fee_transaction = Transaction::from_deployment(*transaction.owner().unwrap(), deployment.clone(), insufficient_fee).unwrap(); - assert!(ledger.check_transaction_basic(&insufficient_fee_transaction, None).is_err()); + assert!(ledger.check_transaction_basic(&insufficient_fee_transaction, None, rng).is_err()); } } @@ -214,7 +214,7 @@ fn test_insufficient_public_fees() { ledger.prepare_advance_to_next_beacon_block(&private_key, vec![], vec![], vec![transaction], rng).unwrap(); // Check that the next block is valid. - ledger.check_next_block(&block).unwrap(); + ledger.check_next_block(&block, rng).unwrap(); // Add the deployment block to the ledger. ledger.advance_to_next_block(&block).unwrap(); } @@ -234,7 +234,7 @@ fn test_insufficient_public_fees() { ledger.prepare_advance_to_next_beacon_block(&private_key, vec![], vec![], vec![transaction], rng).unwrap(); // Check that the next block is valid. - ledger.check_next_block(&block).unwrap(); + ledger.check_next_block(&block, rng).unwrap(); // Add the deployment block to the ledger. ledger.advance_to_next_block(&block).unwrap(); } @@ -283,7 +283,7 @@ finalize foo: // Deploy. let transaction = ledger.vm.deploy(&private_key, &program, credits, 0, None, rng).unwrap(); // Verify. - ledger.vm().check_transaction(&transaction, None).unwrap(); + ledger.vm().check_transaction(&transaction, None, rng).unwrap(); // Construct the next block. let block = @@ -294,7 +294,7 @@ finalize foo: assert_eq!(ledger.latest_hash(), block.hash()); // Create a transfer transaction to produce a record with insufficient balance to pay for fees. - let transfer_transaction = ledger.create_transfer(&private_key, address, 100, 0, None).unwrap(); + let transfer_transaction = ledger.create_transfer(&private_key, address, 100, 0, None, rng).unwrap(); // Construct the next block. let block = ledger @@ -337,9 +337,9 @@ finalize foo: let transaction = ledger.vm.execute(&private_key, ("dummy.aleo", "foo"), inputs, Some(sufficient_record), 0, None, rng).unwrap(); // Verify. - ledger.vm.check_transaction(&transaction, None).unwrap(); + ledger.vm.check_transaction(&transaction, None, rng).unwrap(); // Ensure that the ledger deems the transaction valid. - assert!(ledger.check_transaction_basic(&transaction, None).is_ok()); + assert!(ledger.check_transaction_basic(&transaction, None, rng).is_ok()); } #[test] @@ -391,7 +391,7 @@ finalize failed_assert: .unwrap(); // Check that the next block is valid. - ledger.check_next_block(&deployment_block).unwrap(); + ledger.check_next_block(&deployment_block, rng).unwrap(); // Add the deployment block to the ledger. ledger.advance_to_next_block(&deployment_block).unwrap(); @@ -438,7 +438,7 @@ finalize failed_assert: assert_eq!(confirmed_transaction.to_unconfirmed_transaction_id().unwrap(), failed_assert_transaction_id); // Check that the next block is valid. - ledger.check_next_block(&next_block).unwrap(); + ledger.check_next_block(&next_block, rng).unwrap(); // Add the block with the rejected transaction to the ledger. ledger.advance_to_next_block(&next_block).unwrap(); @@ -469,7 +469,7 @@ finalize foo: // Deploy. let transaction = ledger.vm.deploy(&private_key, &program, None, 0, None, rng).unwrap(); // Verify. - ledger.vm().check_transaction(&transaction, None).unwrap(); + ledger.vm().check_transaction(&transaction, None, rng).unwrap(); // Construct the next block. let block = @@ -509,7 +509,7 @@ fn test_bond_and_unbond_validator() { .unwrap(); // Check that the next block is valid. - ledger.check_next_block(&transfer_block).unwrap(); + ledger.check_next_block(&transfer_block, rng).unwrap(); // Add the deployment block to the ledger. ledger.advance_to_next_block(&transfer_block).unwrap(); @@ -535,7 +535,7 @@ fn test_bond_and_unbond_validator() { assert!(!committee.is_committee_member(new_member_address)); // Check that the next block is valid. - ledger.check_next_block(&bond_public_block).unwrap(); + ledger.check_next_block(&bond_public_block, rng).unwrap(); // Add the bond public block to the ledger. ledger.advance_to_next_block(&bond_public_block).unwrap(); @@ -558,7 +558,7 @@ fn test_bond_and_unbond_validator() { .unwrap(); // Check that the next block is valid. - ledger.check_next_block(&unbond_public_block).unwrap(); + ledger.check_next_block(&unbond_public_block, rng).unwrap(); // Add the bond public block to the ledger. ledger.advance_to_next_block(&unbond_public_block).unwrap(); diff --git a/ledger/test-helpers/src/lib.rs b/ledger/test-helpers/src/lib.rs index 81afab9fda..743e8f74d9 100644 --- a/ledger/test-helpers/src/lib.rs +++ b/ledger/test-helpers/src/lib.rs @@ -210,7 +210,7 @@ pub fn sample_fee_private(deployment_or_execution_id: Field, rng ) .unwrap(); // Construct the fee trace. - let (_, mut trace) = process.execute::(authorization).unwrap(); + let (_, mut trace) = process.execute::(authorization, rng).unwrap(); // Initialize a new block store. let block_store = BlockStore::>::open(None).unwrap(); @@ -263,7 +263,7 @@ pub fn sample_fee_public(deployment_or_execution_id: Field, rng: ) .unwrap(); // Construct the fee trace. - let (_, mut trace) = process.execute::(authorization).unwrap(); + let (_, mut trace) = process.execute::(authorization, rng).unwrap(); // Initialize a new block store. let block_store = BlockStore::>::open(None).unwrap(); @@ -393,7 +393,7 @@ fn sample_genesis_block_and_components_raw( let authorization = process.authorize::(&private_key, locator.0, locator.1, inputs.iter(), rng).unwrap(); // Execute the function. - let (_, mut trace) = process.execute::(authorization).unwrap(); + let (_, mut trace) = process.execute::(authorization, rng).unwrap(); // Initialize a new block store. let block_store = BlockStore::>::open(None).unwrap(); diff --git a/synthesizer/process/src/execute.rs b/synthesizer/process/src/execute.rs index 1e4bd132fa..7311f018be 100644 --- a/synthesizer/process/src/execute.rs +++ b/synthesizer/process/src/execute.rs @@ -17,9 +17,10 @@ use super::*; impl Process { /// Executes the given authorization. #[inline] - pub fn execute>( + pub fn execute, R: CryptoRng + Rng>( &self, authorization: Authorization, + rng: &mut R, ) -> Result<(Response, Trace)> { let timer = timer!("Process::execute"); @@ -40,7 +41,7 @@ impl Process { // Retrieve the stack. let stack = self.get_stack(request.program_id())?; // Execute the circuit. - let response = stack.execute_function::(call_stack, None)?; + let response = stack.execute_function::(call_stack, None, rng)?; lap!(timer, "Execute the function"); // Extract the trace. @@ -100,7 +101,7 @@ mod tests { assert!(authorization.is_fee_private(), "Authorization must be for a call to 'credits.aleo/fee_private'"); // Execute the authorization. - let (response, trace) = process.execute::(authorization).unwrap(); + let (response, trace) = process.execute::(authorization, rng).unwrap(); // Ensure the response has 1 output. assert_eq!(response.outputs().len(), 1, "Execution of 'credits.aleo/fee_private' must contain 1 output"); // Ensure the response has 1 output ID. @@ -142,7 +143,7 @@ mod tests { assert!(authorization.is_fee_public(), "Authorization must be for a call to 'credits.aleo/fee_public'"); // Execute the authorization. - let (response, trace) = process.execute::(authorization).unwrap(); + let (response, trace) = process.execute::(authorization, rng).unwrap(); // Ensure the response has 1 outputs. assert_eq!(response.outputs().len(), 1, "Execution of 'credits.aleo/fee_public' must contain 1 output"); // Ensure the response has 1 output IDs. diff --git a/synthesizer/process/src/lib.rs b/synthesizer/process/src/lib.rs index eaa24104e4..594781f0e7 100644 --- a/synthesizer/process/src/lib.rs +++ b/synthesizer/process/src/lib.rs @@ -380,7 +380,7 @@ function compute: .unwrap(); assert_eq!(authorization.len(), 1); // Execute the request. - let (_response, mut trace) = process.execute::(authorization).unwrap(); + let (_response, mut trace) = process.execute::(authorization, rng).unwrap(); assert_eq!(trace.transitions().len(), 1); // Prepare the trace. diff --git a/synthesizer/process/src/stack/authorize.rs b/synthesizer/process/src/stack/authorize.rs index 9af4dce5c5..5cc289c185 100644 --- a/synthesizer/process/src/stack/authorize.rs +++ b/synthesizer/process/src/stack/authorize.rs @@ -42,7 +42,7 @@ impl Stack { // Construct the call stack. let call_stack = CallStack::Authorize(vec![request], *private_key, authorization.clone()); // Construct the authorization from the function. - let _response = self.execute_function::(call_stack, None)?; + let _response = self.execute_function::(call_stack, None, rng)?; finish!(timer, "Construct the authorization from the function"); // Return the authorization. diff --git a/synthesizer/process/src/stack/call/mod.rs b/synthesizer/process/src/stack/call/mod.rs index 707c8768e2..ff31a73461 100644 --- a/synthesizer/process/src/stack/call/mod.rs +++ b/synthesizer/process/src/stack/call/mod.rs @@ -36,7 +36,7 @@ pub trait CallTrait { ) -> Result<()>; /// Executes the instruction. - fn execute>( + fn execute, R: CryptoRng + Rng>( &self, stack: &(impl StackEvaluate + StackExecute + StackMatches + StackProgram), registers: &mut ( @@ -45,6 +45,7 @@ pub trait CallTrait { + RegistersLoadCircuit + RegistersStoreCircuit ), + rng: &mut R, ) -> Result<()>; } @@ -122,7 +123,7 @@ impl CallTrait for Call { /// Executes the instruction. #[inline] - fn execute>( + fn execute, R: Rng + CryptoRng>( &self, stack: &(impl StackEvaluate + StackExecute + StackMatches + StackProgram), registers: &mut ( @@ -131,6 +132,7 @@ impl CallTrait for Call { + RegistersLoadCircuit + RegistersStoreCircuit ), + rng: &mut R, ) -> Result<()> { // Load the operands values. let inputs: Vec<_> = @@ -196,9 +198,6 @@ impl CallTrait for Call { // Eject the circuit inputs. let inputs = inputs.eject_value(); - // Initialize an RNG. - let rng = &mut rand::thread_rng(); - // Set the (console) caller. let console_caller = Some(*stack.program_id()); @@ -225,7 +224,7 @@ impl CallTrait for Call { authorization.push(request.clone()); // Execute the request. - let response = substack.execute_function::(call_stack, console_caller)?; + let response = substack.execute_function::(call_stack, console_caller, rng)?; // Return the request and response. (request, response) @@ -247,7 +246,7 @@ impl CallTrait for Call { call_stack.push(request.clone())?; // Execute the request. - let response = substack.execute_function::(call_stack, console_caller)?; + let response = substack.execute_function::(call_stack, console_caller, rng)?; // Return the request and response. (request, response) } @@ -269,7 +268,8 @@ impl CallTrait for Call { let console_response = substack.evaluate_function::(registers.call_stack().replicate(), console_caller)?; // Execute the request. - let response = substack.execute_function::(registers.call_stack(), console_caller)?; + let response = + substack.execute_function::(registers.call_stack(), console_caller, rng)?; // Ensure the values are equal. if console_response.outputs() != response.outputs() { #[cfg(debug_assertions)] diff --git a/synthesizer/process/src/stack/deploy.rs b/synthesizer/process/src/stack/deploy.rs index ad85387c5b..39b46f2f6f 100644 --- a/synthesizer/process/src/stack/deploy.rs +++ b/synthesizer/process/src/stack/deploy.rs @@ -14,6 +14,8 @@ use super::*; +use rand::{rngs::StdRng, SeedableRng}; + impl Stack { /// Deploys the given program ID, if it does not exist. #[inline] @@ -116,10 +118,11 @@ impl Stack { } // Verify the certificates. - cfg_iter!(call_stacks).zip_eq(deployment.verifying_keys()).try_for_each( - |((function_name, call_stack, assignments), (_, (verifying_key, certificate)))| { + let rngs = (0..call_stacks.len()).map(|_| StdRng::from_seed(rng.gen())).collect::>(); + cfg_iter!(call_stacks).zip_eq(deployment.verifying_keys()).zip_eq(rngs).try_for_each( + |(((function_name, call_stack, assignments), (_, (verifying_key, certificate))), mut rng)| { // Synthesize the circuit. - if let Err(err) = self.execute_function::(call_stack.clone(), None) { + if let Err(err) = self.execute_function::(call_stack.clone(), None, &mut rng) { bail!("Failed to synthesize the circuit for '{function_name}': {err}") } // Check the certificate. diff --git a/synthesizer/process/src/stack/execute.rs b/synthesizer/process/src/stack/execute.rs index 45284c133a..20758e5e84 100644 --- a/synthesizer/process/src/stack/execute.rs +++ b/synthesizer/process/src/stack/execute.rs @@ -131,10 +131,11 @@ impl StackExecute for Stack { /// # Errors /// This method will halt if the given inputs are not the same length as the input statements. #[inline] - fn execute_function>( + fn execute_function, R: CryptoRng + Rng>( &self, mut call_stack: CallStack, console_caller: Option>, + rng: &mut R, ) -> Result> { let timer = timer!("Stack::execute_function"); @@ -272,7 +273,7 @@ impl StackExecute for Stack { // Execute the instruction. let result = match instruction { // If the instruction is a `call` instruction, we need to handle it separately. - Instruction::Call(call) => CallTrait::execute(call, self, &mut registers), + Instruction::Call(call) => CallTrait::execute(call, self, &mut registers, rng), // Otherwise, execute the instruction normally. _ => instruction.execute(self, &mut registers), }; diff --git a/synthesizer/process/src/stack/helpers/synthesize.rs b/synthesizer/process/src/stack/helpers/synthesize.rs index 9a9cbf3f1e..c3530d0071 100644 --- a/synthesizer/process/src/stack/helpers/synthesize.rs +++ b/synthesizer/process/src/stack/helpers/synthesize.rs @@ -58,7 +58,7 @@ impl Stack { // Initialize the call stack. let call_stack = CallStack::Synthesize(vec![request], burner_private_key, authorization); // Synthesize the circuit. - let _response = self.execute_function::(call_stack, None)?; + let _response = self.execute_function::(call_stack, None, rng)?; // Ensure the proving key exists. ensure!(self.contains_proving_key(function_name), "Function '{function_name}' is missing a proving key."); diff --git a/synthesizer/process/src/tests/test_credits.rs b/synthesizer/process/src/tests/test_credits.rs index 6437e67b2f..aefae59a3c 100644 --- a/synthesizer/process/src/tests/test_credits.rs +++ b/synthesizer/process/src/tests/test_credits.rs @@ -251,7 +251,7 @@ fn execute_function>( process.authorize::(caller_private_key, "credits.aleo", function, inputs.iter(), rng)?; // Construct the trace. - let (_, mut trace) = process.execute::(authorization)?; + let (_, mut trace) = process.execute::(authorization, rng)?; // Construct the block store. let block_store = BlockStore::>::open(None)?; @@ -1527,7 +1527,7 @@ mod sanity_checks { // Initialize the call stack. let call_stack = CallStack::CheckDeployment(vec![request], *private_key, assignments.clone()); // Synthesize the circuit. - let _response = stack.execute_function::(call_stack, None).unwrap(); + let _response = stack.execute_function::(call_stack, None, rng).unwrap(); // Retrieve the assignment. let assignment = assignments.read().last().unwrap().0.clone(); assignment diff --git a/synthesizer/process/src/tests/test_execute.rs b/synthesizer/process/src/tests/test_execute.rs index 2af2faf97e..d1130c2809 100644 --- a/synthesizer/process/src/tests/test_execute.rs +++ b/synthesizer/process/src/tests/test_execute.rs @@ -85,7 +85,7 @@ pub fn sample_fee, B: BlockStorage, P: Final .authorize_fee_public::(&private_key, base_fee_in_microcredits, priority_fee_in_microcredits, id, rng) .unwrap(); // Execute the fee. - let (_, mut trace) = process.execute::(authorization).unwrap(); + let (_, mut trace) = process.execute::(authorization, rng).unwrap(); // Prepare the assignments. trace.prepare(Query::from(block_store)).unwrap(); // Compute the proof and construct the fee. @@ -395,7 +395,7 @@ output r4 as field.private;", // Re-run to ensure state continues to work. let trace = Arc::new(RwLock::new(Trace::new())); let call_stack = CallStack::execute(authorization, trace).unwrap(); - let response = stack.execute_function::(call_stack, None).unwrap(); + let response = stack.execute_function::(call_stack, None, rng).unwrap(); let candidate = response.outputs(); assert_eq!(3, candidate.len()); assert_eq!(r2, candidate[0]); @@ -530,7 +530,7 @@ fn test_process_execute_transfer_public() { assert_eq!(authorization.len(), 1); // Execute the request. - let (response, _trace) = process.execute::(authorization).unwrap(); + let (response, _trace) = process.execute::(authorization, rng).unwrap(); let candidate = response.outputs(); assert_eq!(2, candidate.len()); assert_eq!(r2, candidate[0]); @@ -677,7 +677,7 @@ fn test_process_multirecords() { assert_eq!(authorization.len(), 1); // Execute the request. - let (response, _trace) = process.execute::(authorization).unwrap(); + let (response, _trace) = process.execute::(authorization, rng).unwrap(); let candidate = response.outputs(); assert_eq!(3, candidate.len()); assert_eq!(output_a, candidate[0]); @@ -758,7 +758,7 @@ fn test_process_self_caller() { assert_eq!(authorization.len(), 1); // Execute the request. - let (response, _trace) = process.execute::(authorization).unwrap(); + let (response, _trace) = process.execute::(authorization, rng).unwrap(); let candidate = response.outputs(); assert_eq!(1, candidate.len()); assert_eq!(output, candidate[0]); @@ -818,7 +818,7 @@ fn test_process_program_id() { assert_eq!(authorization.len(), 1); // Execute the request. - let (response, _trace) = process.execute::(authorization).unwrap(); + let (response, _trace) = process.execute::(authorization, rng).unwrap(); let candidate = response.outputs(); assert_eq!(1, candidate.len()); assert_eq!(output, candidate[0]); @@ -857,7 +857,7 @@ fn test_process_output_operand() { assert_eq!(authorization.len(), 1); // Execute the request. - let (response, _trace) = process.execute::(authorization).unwrap(); + let (response, _trace) = process.execute::(authorization, rng).unwrap(); let candidate = response.outputs(); assert_eq!(1, candidate.len()); assert_eq!(output, candidate[0]); @@ -1020,7 +1020,7 @@ function compute: assert_eq!(authorization.len(), 1); // Execute the request. - let (response, _trace) = process.execute::(authorization).unwrap(); + let (response, _trace) = process.execute::(authorization, rng).unwrap(); let candidate = response.outputs(); assert_eq!(4, candidate.len()); assert_eq!(r3, candidate[0]); @@ -1170,7 +1170,7 @@ function transfer: assert_eq!(authorization.len(), 5); // Execute the request. - let (response, _trace) = process.execute::(authorization).unwrap(); + let (response, _trace) = process.execute::(authorization, rng).unwrap(); let candidate = response.outputs(); assert_eq!(2, candidate.len()); assert_eq!(output_a, candidate[0]); @@ -1280,7 +1280,7 @@ finalize compute: assert_eq!(authorization.len(), 1); // Execute the request. - let (response, mut trace) = process.execute::(authorization).unwrap(); + let (response, mut trace) = process.execute::(authorization, rng).unwrap(); let candidate = response.outputs(); assert_eq!(1, candidate.len()); @@ -1393,7 +1393,7 @@ finalize compute: assert_eq!(authorization.len(), 1); // Execute the request. - let (response, mut trace) = process.execute::(authorization).unwrap(); + let (response, mut trace) = process.execute::(authorization, rng).unwrap(); let candidate = response.outputs(); assert_eq!(1, candidate.len()); @@ -1524,7 +1524,7 @@ finalize mint_public: assert_eq!(authorization.len(), 1); // Execute the request. - let (response, mut trace) = process.execute::(authorization).unwrap(); + let (response, mut trace) = process.execute::(authorization, rng).unwrap(); let candidate = response.outputs(); assert_eq!(1, candidate.len()); @@ -1692,7 +1692,7 @@ finalize init: assert_eq!(authorization.len(), 2); // Execute the request. - let (response, mut trace) = process.execute::(authorization).unwrap(); + let (response, mut trace) = process.execute::(authorization, rng).unwrap(); let candidate = response.outputs(); assert_eq!(1, candidate.len()); @@ -1807,7 +1807,7 @@ finalize compute: assert_eq!(authorization.len(), 1); // Execute the request. - let (response, mut trace) = process.execute::(authorization).unwrap(); + let (response, mut trace) = process.execute::(authorization, rng).unwrap(); let candidate = response.outputs(); assert_eq!(1, candidate.len()); @@ -1919,7 +1919,7 @@ function a: assert_eq!(authorization.len(), 3); // Execute the request. - let (response, mut trace) = process.execute::(authorization).unwrap(); + let (response, mut trace) = process.execute::(authorization, rng).unwrap(); let candidate = response.outputs(); assert_eq!(1, candidate.len()); assert_eq!(output, candidate[0]); @@ -2101,7 +2101,7 @@ fn test_complex_execution_order() { assert_eq!(authorization.len(), 10); // Execute the request. - let (response, mut trace) = process.execute::(authorization).unwrap(); + let (response, mut trace) = process.execute::(authorization, rng).unwrap(); let candidate = response.outputs(); assert_eq!(1, candidate.len()); assert_eq!(output, candidate[0]); @@ -2235,7 +2235,7 @@ finalize compute: assert_eq!(authorization.len(), 1); // Execute the request. - let (response, mut trace) = process.execute::(authorization).unwrap(); + let (response, mut trace) = process.execute::(authorization, rng).unwrap(); let candidate = response.outputs(); assert_eq!(1, candidate.len()); @@ -2339,7 +2339,7 @@ function compute: assert_eq!(authorization.len(), 1); // Execute the request. - let (response, mut trace) = process.execute::(authorization).unwrap(); + let (response, mut trace) = process.execute::(authorization, rng).unwrap(); let candidate = response.outputs(); assert_eq!(3, candidate.len()); assert_eq!(r2, candidate[0]); @@ -2450,7 +2450,7 @@ function {function_name}: .unwrap(); // Execute the request. - let (response, mut trace) = process.execute::(authorization).unwrap(); + let (response, mut trace) = process.execute::(authorization, rng).unwrap(); assert_eq!(response.outputs().len(), 0); // Prepare the trace. @@ -2469,7 +2469,7 @@ function {function_name}: .unwrap(); // Execute the request. - let (response, mut trace) = process.execute::(authorization).unwrap(); + let (response, mut trace) = process.execute::(authorization, rng).unwrap(); assert_eq!(response.outputs().len(), 0); // Prepare the trace. diff --git a/synthesizer/process/src/traits/mod.rs b/synthesizer/process/src/traits/mod.rs index bafbb1d8f3..c82b4ffd59 100644 --- a/synthesizer/process/src/traits/mod.rs +++ b/synthesizer/process/src/traits/mod.rs @@ -16,7 +16,7 @@ use crate::{CallStack, Closure, FinalizeTypes, RegisterTypes}; use console::{ account::Address, network::Network, - prelude::Result, + prelude::{CryptoRng, Result, Rng}, program::{Identifier, ProgramID, Response, Value}, types::Field, }; @@ -68,10 +68,11 @@ pub trait StackExecute { /// /// # Errors /// This method will halt if the given inputs are not the same length as the input statements. - fn execute_function>( + fn execute_function, R: CryptoRng + Rng>( &self, call_stack: CallStack, console_caller: Option>, + rng: &mut R, ) -> Result>; } diff --git a/synthesizer/src/vm/execute.rs b/synthesizer/src/vm/execute.rs index 60b021426c..31a2111188 100644 --- a/synthesizer/src/vm/execute.rs +++ b/synthesizer/src/vm/execute.rs @@ -135,7 +135,7 @@ impl> VM { // Prepare the authorization. let authorization = cast_ref!(authorization as Authorization<$network>); // Execute the call. - let (_, mut trace) = $process.execute::<$aleo>(authorization.clone())?; + let (_, mut trace) = $process.execute::<$aleo, _>(authorization.clone(), rng)?; lap!(timer, "Execute the call"); // Prepare the assignments. @@ -180,7 +180,7 @@ impl> VM { // Prepare the authorization. let authorization = cast_ref!(authorization as Authorization<$network>); // Execute the call. - let (_, mut trace) = $process.execute::<$aleo>(authorization.clone())?; + let (_, mut trace) = $process.execute::<$aleo, _>(authorization.clone(), rng)?; lap!(timer, "Execute the call"); // Prepare the assignments. diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index c30166343a..3b6586e4eb 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -1028,7 +1028,7 @@ finalize transfer_public: .execute(&caller_private_key, (program_id, function_name), inputs.into_iter(), credits, 1, None, rng) .unwrap(); // Verify. - vm.check_transaction(&transaction, None).unwrap(); + vm.check_transaction(&transaction, None, rng).unwrap(); // Return the transaction. transaction diff --git a/synthesizer/src/vm/helpers/committee.rs b/synthesizer/src/vm/helpers/committee.rs index 5153a68893..d44c4eafd1 100644 --- a/synthesizer/src/vm/helpers/committee.rs +++ b/synthesizer/src/vm/helpers/committee.rs @@ -232,14 +232,16 @@ pub fn to_next_commitee_map_and_bonded_map( #[cfg(test)] pub(crate) mod test_helpers { use super::*; + use crate::vm::TestRng; use ledger_committee::MIN_VALIDATOR_STAKE; - use rand::Rng; + use rand::{CryptoRng, Rng}; /// Returns the stakers, given the map of `(validator, (microcredits, is_open))` entries. /// This method simulates the existence of delegators for the members. - pub(crate) fn to_stakers( + pub(crate) fn to_stakers( members: &IndexMap, (u64, bool)>, + rng: &mut R, ) -> IndexMap, (Address, u64)> { members .into_iter() @@ -252,9 +254,9 @@ pub(crate) mod test_helpers { let num_iterations = (remaining_microcredits / staker_amount).saturating_sub(1); // Construct the map of stakers. - let mut stakers: IndexMap<_, _> = cfg_into_iter!((0..num_iterations)) - .map(|_| { - let rng = &mut rand::thread_rng(); + let rngs = (0..num_iterations).map(|_| TestRng::from_seed(rng.gen())).collect::>(); + let mut stakers: IndexMap<_, _> = cfg_into_iter!(rngs) + .map(|mut rng| { // Sample a random staker. let staker = Address::::new(rng.gen()); // Output the staker. @@ -268,7 +270,6 @@ pub(crate) mod test_helpers { // Insert the last staker. let final_amount = remaining_microcredits.saturating_sub(num_iterations * staker_amount); if final_amount > 0 { - let rng = &mut rand::thread_rng(); let staker = Address::::new(rng.gen()); stakers.insert(staker, (*validator, final_amount)); } @@ -351,7 +352,7 @@ mod tests { // Sample a committee. let committee = ledger_committee::test_helpers::sample_committee_for_round_and_size(1, 100, rng); // Convert the committee into stakers. - let expected_stakers = crate::committee::test_helpers::to_stakers(committee.members()); + let expected_stakers = crate::committee::test_helpers::to_stakers(committee.members(), rng); // Initialize the bonded map. let bonded_map = to_bonded_map(&expected_stakers); @@ -371,7 +372,7 @@ mod tests { // Sample a committee. let committee = ledger_committee::test_helpers::sample_committee_for_round_and_size(1, 100, rng); // Convert the committee into stakers. - let stakers = crate::committee::test_helpers::to_stakers(committee.members()); + let stakers = crate::committee::test_helpers::to_stakers(committee.members(), rng); // Start a timer. let timer = std::time::Instant::now(); @@ -388,7 +389,7 @@ mod tests { // Sample a committee. let committee = ledger_committee::test_helpers::sample_committee_for_round_and_size(1, 100, rng); // Convert the committee into stakers. - let stakers = crate::committee::test_helpers::to_stakers(committee.members()); + let stakers = crate::committee::test_helpers::to_stakers(committee.members(), rng); // Start a timer. let timer = std::time::Instant::now(); @@ -407,7 +408,7 @@ mod tests { // Sample a committee. let committee = ledger_committee::test_helpers::sample_committee(rng); // Convert the committee into stakers. - let stakers = crate::committee::test_helpers::to_stakers(committee.members()); + let stakers = crate::committee::test_helpers::to_stakers(committee.members(), rng); // Start a timer. let timer = std::time::Instant::now(); diff --git a/synthesizer/src/vm/helpers/rewards.rs b/synthesizer/src/vm/helpers/rewards.rs index d6aaf74ea2..ae5f9d4fba 100644 --- a/synthesizer/src/vm/helpers/rewards.rs +++ b/synthesizer/src/vm/helpers/rewards.rs @@ -169,7 +169,7 @@ mod tests { // Sample a committee. let committee = ledger_committee::test_helpers::sample_committee_for_round_and_size(1, 100, rng); // Convert the committee into stakers. - let stakers = crate::committee::test_helpers::to_stakers(committee.members()); + let stakers = crate::committee::test_helpers::to_stakers(committee.members(), rng); // Start a timer. let timer = std::time::Instant::now(); diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index baa491b906..237ed5f3cd 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -445,7 +445,7 @@ function compute: // Deploy. let transaction = vm.deploy(&caller_private_key, &program, credits, 10, None, rng).unwrap(); // Verify. - vm.check_transaction(&transaction, None).unwrap(); + vm.check_transaction(&transaction, None, rng).unwrap(); // Return the transaction. transaction }) @@ -488,7 +488,7 @@ function compute: // Construct the execute transaction. let transaction = vm.execute_authorization(authorization, None, None, rng).unwrap(); // Verify. - vm.check_transaction(&transaction, None).unwrap(); + vm.check_transaction(&transaction, None, rng).unwrap(); // Return the transaction. transaction }) @@ -532,7 +532,7 @@ function compute: .execute(&caller_private_key, ("credits.aleo", "transfer_public"), inputs, record, 0, None, rng) .unwrap(); // Verify. - vm.check_transaction(&transaction, None).unwrap(); + vm.check_transaction(&transaction, None, rng).unwrap(); // Return the transaction. transaction }) @@ -584,7 +584,7 @@ function compute: // Construct the transaction. let transaction = Transaction::from_execution(execution, Some(fee)).unwrap(); // Verify. - vm.check_transaction(&transaction, None).unwrap(); + vm.check_transaction(&transaction, None, rng).unwrap(); // Return the transaction. transaction }) diff --git a/synthesizer/src/vm/verify.rs b/synthesizer/src/vm/verify.rs index 99c921dec7..6a20902098 100644 --- a/synthesizer/src/vm/verify.rs +++ b/synthesizer/src/vm/verify.rs @@ -34,7 +34,12 @@ macro_rules! ensure_is_unique { impl> VM { /// Verifies the transaction in the VM. On failure, returns an error. #[inline] - pub fn check_transaction(&self, transaction: &Transaction, rejected_id: Option>) -> Result<()> { + pub fn check_transaction( + &self, + transaction: &Transaction, + rejected_id: Option>, + rng: &mut R, + ) -> Result<()> { let timer = timer!("VM::check_transaction"); /* Transaction */ @@ -108,7 +113,7 @@ impl> VM { bail!("Program ID '{}' is already deployed", deployment.program_id()) } // Verify the deployment. - self.check_deployment_internal(deployment)?; + self.check_deployment_internal(deployment, rng)?; } Transaction::Execute(id, execution, _) => { // Compute the execution ID. @@ -202,13 +207,13 @@ impl> VM { /// Note: This is an internal check only. To ensure all components of the deployment are checked, /// use `VM::check_transaction` instead. #[inline] - fn check_deployment_internal(&self, deployment: &Deployment) -> Result<()> { + fn check_deployment_internal(&self, deployment: &Deployment, rng: &mut R) -> Result<()> { macro_rules! logic { ($process:expr, $network:path, $aleo:path) => {{ // Prepare the deployment. let deployment = cast_ref!(&deployment as Deployment<$network>); // Verify the deployment. - $process.verify_deployment::<$aleo, _>(&deployment, &mut rand::thread_rng()) + $process.verify_deployment::<$aleo, _>(&deployment, rng) }}; } @@ -318,17 +323,17 @@ mod tests { // Fetch a deployment transaction. let deployment_transaction = crate::vm::test_helpers::sample_deployment_transaction(rng); // Ensure the transaction verifies. - vm.check_transaction(&deployment_transaction, None).unwrap(); + vm.check_transaction(&deployment_transaction, None, rng).unwrap(); // Fetch an execution transaction. let execution_transaction = crate::vm::test_helpers::sample_execution_transaction_with_private_fee(rng); // Ensure the transaction verifies. - vm.check_transaction(&execution_transaction, None).unwrap(); + vm.check_transaction(&execution_transaction, None, rng).unwrap(); // Fetch an execution transaction. let execution_transaction = crate::vm::test_helpers::sample_execution_transaction_with_public_fee(rng); // Ensure the transaction verifies. - vm.check_transaction(&execution_transaction, None).unwrap(); + vm.check_transaction(&execution_transaction, None, rng).unwrap(); } #[test] @@ -343,12 +348,12 @@ mod tests { let deployment = vm.deploy_raw(&program, rng).unwrap(); // Ensure the deployment is valid. - vm.check_deployment_internal(&deployment).unwrap(); + vm.check_deployment_internal(&deployment, rng).unwrap(); // Ensure that deserialization doesn't break the transaction verification. let serialized_deployment = deployment.to_string(); let deployment_transaction: Deployment = serde_json::from_str(&serialized_deployment).unwrap(); - vm.check_deployment_internal(&deployment_transaction).unwrap(); + vm.check_deployment_internal(&deployment_transaction, rng).unwrap(); } #[test] @@ -425,15 +430,15 @@ mod tests { // Fetch a valid execution transaction with a private fee. let valid_transaction = crate::vm::test_helpers::sample_execution_transaction_with_private_fee(rng); - vm.check_transaction(&valid_transaction, None).unwrap(); + vm.check_transaction(&valid_transaction, None, rng).unwrap(); // Fetch a valid execution transaction with a public fee. let valid_transaction = crate::vm::test_helpers::sample_execution_transaction_with_public_fee(rng); - vm.check_transaction(&valid_transaction, None).unwrap(); + vm.check_transaction(&valid_transaction, None, rng).unwrap(); // Fetch an valid execution transaction with no fee. let valid_transaction = crate::vm::test_helpers::sample_execution_transaction_without_fee(rng); - vm.check_transaction(&valid_transaction, None).unwrap(); + vm.check_transaction(&valid_transaction, None, rng).unwrap(); } #[test] @@ -529,7 +534,7 @@ mod tests { vm.execute(&caller_private_key, ("testing.aleo", "initialize"), inputs, credits, 10, None, rng).unwrap(); // Verify. - vm.check_transaction(&transaction, None).unwrap(); + vm.check_transaction(&transaction, None, rng).unwrap(); } #[test] diff --git a/synthesizer/tests/test_process_execute.rs b/synthesizer/tests/test_process_execute.rs index a8d710234e..4824d194d1 100644 --- a/synthesizer/tests/test_process_execute.rs +++ b/synthesizer/tests/test_process_execute.rs @@ -114,7 +114,7 @@ fn test_process_execute() { }; // Execute the authorization and extract the output as YAML. std::panic::catch_unwind(AssertUnwindSafe(|| { - match process.execute::(authorization) { + match process.execute::(authorization, rng) { Ok((response, _)) => serde_yaml::Value::Sequence( response .outputs() diff --git a/synthesizer/tests/test_vm_execute_and_finalize.rs b/synthesizer/tests/test_vm_execute_and_finalize.rs index 23b760cbb2..21a5b4e234 100644 --- a/synthesizer/tests/test_vm_execute_and_finalize.rs +++ b/synthesizer/tests/test_vm_execute_and_finalize.rs @@ -210,7 +210,7 @@ fn run_test(test: &ProgramTest) -> serde_yaml::Mapping { }; // Attempt to verify the transaction. - let verified = vm.check_transaction(&transaction, None).is_ok(); + let verified = vm.check_transaction(&transaction, None, rng).is_ok(); // Store the verification result. result.insert(serde_yaml::Value::String("verified".to_string()), serde_yaml::Value::Bool(verified)); diff --git a/utilities/src/rand.rs b/utilities/src/rand.rs index 818aa969fe..b92f0e95da 100644 --- a/utilities/src/rand.rs +++ b/utilities/src/rand.rs @@ -55,6 +55,13 @@ impl TestRng { println!("\nInitializing 'TestRng' with seed '{seed}'\n"); // Use the seed to initialize a fast, non-cryptographic Rng. + Self::from_seed(seed) + } + + // This is the preferred method to use once the main instance of TestRng had already + // been initialized in a test or benchmark and an auxiliary one is desired without + // spamming the stdout. + pub fn from_seed(seed: u64) -> Self { Self(XorShiftRng::seed_from_u64(seed)) } diff --git a/vm/package/execute.rs b/vm/package/execute.rs index f134c0f8bc..e075e8de86 100644 --- a/vm/package/execute.rs +++ b/vm/package/execute.rs @@ -96,7 +96,7 @@ impl Package { process.insert_verifying_key(program_id, &function_name, verifier.verifying_key().clone())?; // Execute the circuit. - let (response, mut trace) = process.execute::(authorization)?; + let (response, mut trace) = process.execute::(authorization, rng)?; // Retrieve the call metrics. let call_metrics = trace.call_metrics().to_vec(); diff --git a/vm/package/run.rs b/vm/package/run.rs index e3c5d8e69a..d692924434 100644 --- a/vm/package/run.rs +++ b/vm/package/run.rs @@ -53,7 +53,7 @@ impl Package { // Initialize the call stack. let call_stack = CallStack::PackageRun(vec![request], *private_key, assignments.clone()); // Synthesize the circuit. - let response = stack.execute_function::(call_stack, None)?; + let response = stack.execute_function::(call_stack, None, rng)?; // Retrieve the call metrics. let call_metrics = assignments.read().iter().map(|(_, metrics)| *metrics).collect::>(); // Return the response and call metrics. From f110541b97968f3942fc23974691a1128f674c6b Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 6 Nov 2023 15:23:44 -0800 Subject: [PATCH 092/339] Fix the number of elements for serializers --- console/program/src/request/serialize.rs | 2 +- ledger/block/src/serialize.rs | 2 +- .../src/transaction/execution/serialize.rs | 2 +- ledger/block/src/transaction/fee/serialize.rs | 2 +- ledger/block/src/transaction/serialize.rs | 2 +- .../block/src/transition/input/serialize.rs | 6 ++-- .../block/src/transition/output/serialize.rs | 10 +++--- .../src/helpers/prover_solution/serialize.rs | 3 +- ledger/narwhal/transmission/src/serialize.rs | 34 ++++++++++--------- .../src/logic/finalize_operation/serialize.rs | 14 ++++++-- 10 files changed, 45 insertions(+), 32 deletions(-) diff --git a/console/program/src/request/serialize.rs b/console/program/src/request/serialize.rs index 650279e492..905b67d991 100644 --- a/console/program/src/request/serialize.rs +++ b/console/program/src/request/serialize.rs @@ -21,7 +21,7 @@ impl Serialize for Request { fn serialize(&self, serializer: S) -> Result { match serializer.is_human_readable() { true => { - let mut transition = serializer.serialize_struct("Request", 9)?; + let mut transition = serializer.serialize_struct("Request", 10)?; transition.serialize_field("signer", &self.signer)?; transition.serialize_field("network", &self.network_id)?; transition.serialize_field("program", &self.program_id)?; diff --git a/ledger/block/src/serialize.rs b/ledger/block/src/serialize.rs index b50a82c808..24edfa8687 100644 --- a/ledger/block/src/serialize.rs +++ b/ledger/block/src/serialize.rs @@ -19,7 +19,7 @@ impl Serialize for Block { fn serialize(&self, serializer: S) -> Result { match serializer.is_human_readable() { true => { - let mut block = serializer.serialize_struct("Block", 6)?; + let mut block = serializer.serialize_struct("Block", 7 + self.solutions.is_some() as usize)?; block.serialize_field("block_hash", &self.block_hash)?; block.serialize_field("previous_hash", &self.previous_hash)?; block.serialize_field("header", &self.header)?; diff --git a/ledger/block/src/transaction/execution/serialize.rs b/ledger/block/src/transaction/execution/serialize.rs index 08724acbbb..b432dd8e72 100644 --- a/ledger/block/src/transaction/execution/serialize.rs +++ b/ledger/block/src/transaction/execution/serialize.rs @@ -19,7 +19,7 @@ impl Serialize for Execution { fn serialize(&self, serializer: S) -> Result { match serializer.is_human_readable() { true => { - let mut execution = serializer.serialize_struct("Execution", 3)?; + let mut execution = serializer.serialize_struct("Execution", 2 + self.proof.is_some() as usize)?; execution .serialize_field("transitions", &self.transitions.values().collect::>>())?; execution.serialize_field("global_state_root", &self.global_state_root)?; diff --git a/ledger/block/src/transaction/fee/serialize.rs b/ledger/block/src/transaction/fee/serialize.rs index 97c1f08f64..b73ec5e037 100644 --- a/ledger/block/src/transaction/fee/serialize.rs +++ b/ledger/block/src/transaction/fee/serialize.rs @@ -19,7 +19,7 @@ impl Serialize for Fee { fn serialize(&self, serializer: S) -> Result { match serializer.is_human_readable() { true => { - let mut fee = serializer.serialize_struct("Fee", 3)?; + let mut fee = serializer.serialize_struct("Fee", 2 + self.proof.is_some() as usize)?; fee.serialize_field("transition", &self.transition)?; fee.serialize_field("global_state_root", &self.global_state_root)?; if let Some(proof) = &self.proof { diff --git a/ledger/block/src/transaction/serialize.rs b/ledger/block/src/transaction/serialize.rs index 9e9b7f941e..ec6aae1448 100644 --- a/ledger/block/src/transaction/serialize.rs +++ b/ledger/block/src/transaction/serialize.rs @@ -29,7 +29,7 @@ impl Serialize for Transaction { transaction.end() } Self::Execute(id, execution, fee) => { - let mut transaction = serializer.serialize_struct("Transaction", 4)?; + let mut transaction = serializer.serialize_struct("Transaction", 3 + fee.is_some() as usize)?; transaction.serialize_field("type", "execute")?; transaction.serialize_field("id", &id)?; transaction.serialize_field("execution", &execution)?; diff --git a/ledger/block/src/transition/input/serialize.rs b/ledger/block/src/transition/input/serialize.rs index 281d47cfff..3a959b7c40 100644 --- a/ledger/block/src/transition/input/serialize.rs +++ b/ledger/block/src/transition/input/serialize.rs @@ -20,7 +20,7 @@ impl Serialize for Input { match serializer.is_human_readable() { true => match self { Self::Constant(id, value) => { - let mut input = serializer.serialize_struct("Input", 3)?; + let mut input = serializer.serialize_struct("Input", 2 + value.is_some() as usize)?; input.serialize_field("type", "constant")?; input.serialize_field("id", &id)?; if let Some(value) = value { @@ -29,7 +29,7 @@ impl Serialize for Input { input.end() } Self::Public(id, value) => { - let mut input = serializer.serialize_struct("Input", 3)?; + let mut input = serializer.serialize_struct("Input", 2 + value.is_some() as usize)?; input.serialize_field("type", "public")?; input.serialize_field("id", &id)?; if let Some(value) = value { @@ -38,7 +38,7 @@ impl Serialize for Input { input.end() } Self::Private(id, value) => { - let mut input = serializer.serialize_struct("Input", 3)?; + let mut input = serializer.serialize_struct("Input", 2 + value.is_some() as usize)?; input.serialize_field("type", "private")?; input.serialize_field("id", &id)?; if let Some(value) = value { diff --git a/ledger/block/src/transition/output/serialize.rs b/ledger/block/src/transition/output/serialize.rs index bdf49c4baa..47041735a0 100644 --- a/ledger/block/src/transition/output/serialize.rs +++ b/ledger/block/src/transition/output/serialize.rs @@ -20,7 +20,7 @@ impl Serialize for Output { match serializer.is_human_readable() { true => match self { Self::Constant(id, value) => { - let mut output = serializer.serialize_struct("Output", 3)?; + let mut output = serializer.serialize_struct("Output", 2 + value.is_some() as usize)?; output.serialize_field("type", "constant")?; output.serialize_field("id", &id)?; if let Some(value) = value { @@ -29,7 +29,7 @@ impl Serialize for Output { output.end() } Self::Public(id, value) => { - let mut output = serializer.serialize_struct("Output", 3)?; + let mut output = serializer.serialize_struct("Output", 2 + value.is_some() as usize)?; output.serialize_field("type", "public")?; output.serialize_field("id", &id)?; if let Some(value) = value { @@ -38,7 +38,7 @@ impl Serialize for Output { output.end() } Self::Private(id, value) => { - let mut output = serializer.serialize_struct("Output", 3)?; + let mut output = serializer.serialize_struct("Output", 2 + value.is_some() as usize)?; output.serialize_field("type", "private")?; output.serialize_field("id", &id)?; if let Some(value) = value { @@ -47,7 +47,7 @@ impl Serialize for Output { output.end() } Self::Record(id, checksum, value) => { - let mut output = serializer.serialize_struct("Output", 5)?; + let mut output = serializer.serialize_struct("Output", 3 + value.is_some() as usize)?; output.serialize_field("type", "record")?; output.serialize_field("id", &id)?; output.serialize_field("checksum", &checksum)?; @@ -63,7 +63,7 @@ impl Serialize for Output { output.end() } Self::Future(id, value) => { - let mut output = serializer.serialize_struct("Output", 3)?; + let mut output = serializer.serialize_struct("Output", 2 + value.is_some() as usize)?; output.serialize_field("type", "future")?; output.serialize_field("id", &id)?; if let Some(value) = value { diff --git a/ledger/coinbase/src/helpers/prover_solution/serialize.rs b/ledger/coinbase/src/helpers/prover_solution/serialize.rs index 32ce1b22dd..564cba8bed 100644 --- a/ledger/coinbase/src/helpers/prover_solution/serialize.rs +++ b/ledger/coinbase/src/helpers/prover_solution/serialize.rs @@ -21,7 +21,8 @@ impl Serialize for ProverSolution { fn serialize(&self, serializer: S) -> Result { match serializer.is_human_readable() { true => { - let mut prover_solution = serializer.serialize_struct("ProverSolution", 3)?; + let mut prover_solution = + serializer.serialize_struct("ProverSolution", 2 + self.proof.random_v.is_some() as usize)?; prover_solution.serialize_field("partial_solution", &self.partial_solution)?; prover_solution.serialize_field("proof.w", &self.proof.w)?; if let Some(random_v) = &self.proof.random_v { diff --git a/ledger/narwhal/transmission/src/serialize.rs b/ledger/narwhal/transmission/src/serialize.rs index 2acd037507..4657a7ff76 100644 --- a/ledger/narwhal/transmission/src/serialize.rs +++ b/ledger/narwhal/transmission/src/serialize.rs @@ -18,23 +18,25 @@ impl Serialize for Transmission { #[inline] fn serialize(&self, serializer: S) -> Result { match serializer.is_human_readable() { - true => { - let mut transmission = serializer.serialize_struct("Transmission", 2)?; - match self { - Self::Ratification => { - transmission.serialize_field("type", "ratification")?; - } - Self::Solution(solution) => { - transmission.serialize_field("type", "solution")?; - transmission.serialize_field("transmission", solution)?; - } - Self::Transaction(transaction) => { - transmission.serialize_field("type", "transaction")?; - transmission.serialize_field("transmission", transaction)?; - } + true => match self { + Self::Ratification => { + let mut transmission = serializer.serialize_struct("Transmission", 1)?; + transmission.serialize_field("type", "ratification")?; + transmission.end() } - transmission.end() - } + Self::Solution(solution) => { + let mut transmission = serializer.serialize_struct("Transmission", 2)?; + transmission.serialize_field("type", "solution")?; + transmission.serialize_field("transmission", solution)?; + transmission.end() + } + Self::Transaction(transaction) => { + let mut transmission = serializer.serialize_struct("Transmission", 2)?; + transmission.serialize_field("type", "transaction")?; + transmission.serialize_field("transmission", transaction)?; + transmission.end() + } + }, false => ToBytesSerializer::serialize_with_size_encoding(self, serializer), } } diff --git a/synthesizer/program/src/logic/finalize_operation/serialize.rs b/synthesizer/program/src/logic/finalize_operation/serialize.rs index f9f666e5de..1a128d3e94 100644 --- a/synthesizer/program/src/logic/finalize_operation/serialize.rs +++ b/synthesizer/program/src/logic/finalize_operation/serialize.rs @@ -19,41 +19,51 @@ impl Serialize for FinalizeOperation { fn serialize(&self, serializer: S) -> Result { match serializer.is_human_readable() { true => { - let mut operation = serializer.serialize_struct("FinalizeOperation", 5)?; // Serialize the components. match self { Self::InitializeMapping(mapping_id) => { + let mut operation = serializer.serialize_struct("FinalizeOperation", 2)?; operation.serialize_field("type", "initialize_mapping")?; operation.serialize_field("mapping_id", mapping_id)?; + operation.end() } Self::InsertKeyValue(mapping_id, key_id, value_id) => { + let mut operation = serializer.serialize_struct("FinalizeOperation", 4)?; operation.serialize_field("type", "insert_key_value")?; operation.serialize_field("mapping_id", mapping_id)?; operation.serialize_field("key_id", key_id)?; operation.serialize_field("value_id", value_id)?; + operation.end() } Self::UpdateKeyValue(mapping_id, index, key_id, value_id) => { + let mut operation = serializer.serialize_struct("FinalizeOperation", 5)?; operation.serialize_field("type", "update_key_value")?; operation.serialize_field("mapping_id", mapping_id)?; operation.serialize_field("index", index)?; operation.serialize_field("key_id", key_id)?; operation.serialize_field("value_id", value_id)?; + operation.end() } Self::RemoveKeyValue(mapping_id, index) => { + let mut operation = serializer.serialize_struct("FinalizeOperation", 3)?; operation.serialize_field("type", "remove_key_value")?; operation.serialize_field("mapping_id", mapping_id)?; operation.serialize_field("index", index)?; + operation.end() } Self::ReplaceMapping(mapping_id) => { + let mut operation = serializer.serialize_struct("FinalizeOperation", 2)?; operation.serialize_field("type", "replace_mapping")?; operation.serialize_field("mapping_id", mapping_id)?; + operation.end() } Self::RemoveMapping(mapping_id) => { + let mut operation = serializer.serialize_struct("FinalizeOperation", 2)?; operation.serialize_field("type", "remove_mapping")?; operation.serialize_field("mapping_id", mapping_id)?; + operation.end() } } - operation.end() } false => ToBytesSerializer::serialize_with_size_encoding(self, serializer), } From 2a99718adb18ce148ee1c6b9a87b549c11465df4 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 6 Nov 2023 15:40:25 -0800 Subject: [PATCH 093/339] Use try_fold and saturating_add instead of sum --- synthesizer/src/vm/helpers/cost.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/synthesizer/src/vm/helpers/cost.rs b/synthesizer/src/vm/helpers/cost.rs index a9e55368d2..5fef5052f5 100644 --- a/synthesizer/src/vm/helpers/cost.rs +++ b/synthesizer/src/vm/helpers/cost.rs @@ -199,5 +199,9 @@ pub fn cost_in_microcredits(finalize: &Finalize) -> Result { Command::BranchEq(_) | Command::BranchNeq(_) => Ok(5_000), Command::Position(_) => Ok(1_000), }; - finalize.commands().iter().map(|command| cost(command)).sum() + finalize + .commands() + .iter() + .map(|command| cost(command)) + .try_fold(0u64, |acc, res| res.map(|x| acc.saturating_add(x))) } From bb005e36d54cffcfcf29d6c5673e118a346f6e25 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 6 Nov 2023 15:45:04 -0800 Subject: [PATCH 094/339] Use checked_add --- synthesizer/src/vm/helpers/cost.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synthesizer/src/vm/helpers/cost.rs b/synthesizer/src/vm/helpers/cost.rs index 5fef5052f5..36c581e383 100644 --- a/synthesizer/src/vm/helpers/cost.rs +++ b/synthesizer/src/vm/helpers/cost.rs @@ -203,5 +203,5 @@ pub fn cost_in_microcredits(finalize: &Finalize) -> Result { .commands() .iter() .map(|command| cost(command)) - .try_fold(0u64, |acc, res| res.map(|x| acc.saturating_add(x))) + .try_fold(0u64, |acc, res| res.and_then(|x| acc.checked_add(x).ok_or(anyhow!("Finalize cost overflowed")))) } From 43ad690bbe75f14f89d326ba54122bc423ad1329 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 6 Nov 2023 16:56:28 -0800 Subject: [PATCH 095/339] Remove unreachable check --- ledger/block/src/verify.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/ledger/block/src/verify.rs b/ledger/block/src/verify.rs index 057ff2b562..7e2afa9857 100644 --- a/ledger/block/src/verify.rs +++ b/ledger/block/src/verify.rs @@ -137,16 +137,11 @@ impl Block { previous_height: u32, current_committee: &Committee, ) -> Result<(u64, u32, i64)> { + #[cfg(not(any(test, feature = "test")))] + ensure!(self.authority.is_quorum(), "The next block must be a quorum block"); + // Determine the expected height. let expected_height = previous_height.saturating_add(1); - // Ensure the block type is correct. - match expected_height == 0 { - true => ensure!(self.authority.is_beacon(), "The genesis block must be a beacon block"), - false => { - #[cfg(not(any(test, feature = "test")))] - ensure!(self.authority.is_quorum(), "The next block must be a quorum block"); - } - } // Determine the expected round. let expected_round = match &self.authority { From b73ad561d04ea0033e9e9a9f7327a706198e8c03 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 6 Nov 2023 17:09:39 -0800 Subject: [PATCH 096/339] Fix off-by-one MAX_FEE check --- synthesizer/src/vm/verify.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synthesizer/src/vm/verify.rs b/synthesizer/src/vm/verify.rs index 99c921dec7..f6aeaceaa1 100644 --- a/synthesizer/src/vm/verify.rs +++ b/synthesizer/src/vm/verify.rs @@ -255,7 +255,7 @@ impl> VM { // Ensure the fee does not exceed the limit. let fee_amount = fee.amount()?; - ensure!(*fee_amount < N::MAX_FEE, "Fee verification failed: fee exceeds the maximum limit"); + ensure!(*fee_amount <= N::MAX_FEE, "Fee verification failed: fee exceeds the maximum limit"); // Verify the fee. let verification = self.process.read().verify_fee(fee, deployment_or_execution_id); From 7ac03f74020cbda9f6132e3134ecc3c9c4d3c2c1 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 6 Nov 2023 17:17:02 -0800 Subject: [PATCH 097/339] Simplify annual_reward logic --- ledger/block/src/helpers/target.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/block/src/helpers/target.rs b/ledger/block/src/helpers/target.rs index b396234257..ffb6265bd2 100644 --- a/ledger/block/src/helpers/target.rs +++ b/ledger/block/src/helpers/target.rs @@ -27,7 +27,7 @@ pub const fn block_reward(total_supply: u64, block_time: u16, coinbase_reward: u // Compute the expected block height at year 1. let block_height_at_year_1 = block_height_at_year(block_time, 1); // Compute the annual reward: (0.05 * S). - let annual_reward = (total_supply / 1000) * 50; + let annual_reward = total_supply / 20; // Compute the block reward: (0.05 * S) / H_Y1. let block_reward = annual_reward / block_height_at_year_1 as u64; // Return the sum of the block reward, coinbase reward, and transaction fees. From b6177fcaa19073b9d227fdcb3f595124b86301e1 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 6 Nov 2023 18:28:02 -0800 Subject: [PATCH 098/339] Update committee member sorting --- ledger/committee/src/lib.rs | 41 ++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/ledger/committee/src/lib.rs b/ledger/committee/src/lib.rs index 6a08e72b51..4335673668 100644 --- a/ledger/committee/src/lib.rs +++ b/ledger/committee/src/lib.rs @@ -198,7 +198,8 @@ impl Committee { /// Note: This ensures the method returns a deterministic result that is SNARK-friendly. fn sorted_members(&self) -> indexmap::map::IntoIter, (u64, bool)> { let members = self.members.clone(); - members.sorted_unstable_by(|address1, stake1, address2, stake2| { + // Note: The use of 'sorted_unstable_by' is safe here because the addresses are guaranteed to be unique. + members.sorted_unstable_by(|address1, (stake1, _), address2, (stake2, _)| { // Sort by stake in decreasing order. let cmp = stake2.cmp(stake1); // If the stakes are equal, sort by x-coordinate in decreasing order. @@ -282,6 +283,22 @@ pub mod test_helpers { Committee::::new(round, committee_members).unwrap() } + /// Samples a committee where all validators have the same stake. + pub fn sample_committee_equal_stake_committee(num_members: u16, rng: &mut TestRng) -> Committee { + assert!(num_members >= 4); + // Sample the members. + let mut members = IndexMap::new(); + // Add in the minimum and maximum staked nodes. + members.insert(Address::::new(rng.gen()), (MIN_VALIDATOR_STAKE, false)); + while members.len() < num_members as usize - 1 { + let stake = MIN_VALIDATOR_STAKE as f64; + let is_open = rng.gen(); + members.insert(Address::::new(rng.gen()), (stake as u64, is_open)); + } + // Return the committee. + Committee::::new(1, members).unwrap() + } + /// Samples a random committee. pub fn sample_committee_custom(num_members: u16, rng: &mut TestRng) -> Committee { assert!(num_members >= 4); @@ -405,4 +422,26 @@ mod tests { } } } + + #[test] + fn test_sorted_members_with_equal_stake() { + // Initialize the RNG. + let rng = &mut TestRng::default(); + // Sample a committee. + let committee = crate::test_helpers::sample_committee_equal_stake_committee(200, rng); + // Start a timer. + let timer = std::time::Instant::now(); + // Sort the members. + let sorted_members = committee.sorted_members().collect::>(); + println!("sorted_members: {}ms", timer.elapsed().as_millis()); + // Check that the members are sorted based on our sorting criteria. + for i in 0..sorted_members.len() - 1 { + let (address1, (stake1, _)) = sorted_members[i]; + let (address2, (stake2, _)) = sorted_members[i + 1]; + assert!(stake1 >= stake2); + if stake1 == stake2 { + assert!(address1.to_x_coordinate() > address2.to_x_coordinate()); + } + } + } } From 03baf2597d8e8eef8cfad6bb539b9ad2087b3a4c Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 6 Nov 2023 18:42:36 -0800 Subject: [PATCH 099/339] Remove incorrect documentation from matches_record --- synthesizer/process/src/stack/register_types/matches.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/synthesizer/process/src/stack/register_types/matches.rs b/synthesizer/process/src/stack/register_types/matches.rs index 2082fa995b..3957726841 100644 --- a/synthesizer/process/src/stack/register_types/matches.rs +++ b/synthesizer/process/src/stack/register_types/matches.rs @@ -168,8 +168,6 @@ impl RegisterTypes { } /// Checks that the given record matches the layout of the record type. - /// Note: Ordering for `owner` **does** matter, however ordering - /// for record data does **not** matter, as long as all defined members are present. pub fn matches_record( &self, stack: &(impl StackMatches + StackProgram), From f171a450b0645d5e01c7837fcec1f329f5e76ed0 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 7 Nov 2023 15:37:55 +0100 Subject: [PATCH 100/339] tests: update the execute_and_finalize test vectors Signed-off-by: ljedrz --- .../execute_and_finalize/child_and_parent.out | 20 +++++++++---------- .../complex_finalization.out | 12 +++++------ .../vm/execute_and_finalize/count_usages.out | 10 +++++----- .../execute_and_finalize/program_callable.out | 14 ++++++------- .../vm/execute_and_finalize/public_wallet.out | 2 +- .../vm/execute_and_finalize/user_callable.out | 6 +++--- 6 files changed, 32 insertions(+), 32 deletions(-) diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/child_and_parent.out b/synthesizer/tests/expectations/vm/execute_and_finalize/child_and_parent.out index 6aab0a972c..cf83c9d485 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/child_and_parent.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/child_and_parent.out @@ -4,30 +4,30 @@ outputs: execute: child.aleo/foo: outputs: - - '{"type":"public","id":"389051587023874025297792889573178986947322645231926608183742711950919559411field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' - - '{"type":"public","id":"764027935495423951991221261588244508770271800988614802602832277026356994499field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"3583507900097573902692207210661581535840809808651900827750728854102720512424field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"476166291720572191849579987891810720100233870490756615272004665719966045283field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' speculate: the execution was accepted add_next_block: succeeded. - verified: true execute: parent.aleo/foo: outputs: - - '{"type":"public","id":"1750346614465839730584856482412734170916382156473722062953642664481181629739field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' - - '{"type":"public","id":"5344219132331075098560420486516441520509044320380266746188928734352154985147field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' - - '{"type":"public","id":"1573682489501842474093724226520469727912427938089152276506875941161556613092field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' - - '{"type":"public","id":"5522952276718822387440091782615844704170996655370860689760310532706413315373field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"3761717515751581670491990458123447761370813910339791821189914541241041772398field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' + - '{"type":"public","id":"7311055836597830429601351369404551037507421904626326632284143897137420180918field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"681818897459164396968079033669192296282137044899275115497211144004195398694field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"3417320637392048962499244658848814085037481834432707606558978225870881469204field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' speculate: the execution was accepted add_next_block: succeeded. additional: - child_outputs: credits.aleo/fee_public: outputs: - - '{"type":"future","id":"6557860754730668406004469054379794576334242764827542178306889009454484547032field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx,\n 1244u64\n ]\n}"}' + - '{"type":"future","id":"5245767978479482276373144091068362056657622227760198296183689243703275814117field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx,\n 1244u64\n ]\n}"}' - child_outputs: child.aleo/foo: outputs: - - '{"type":"public","id":"5712527802009221538913597905008159571083800168555613323828114175105395494302field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' - - '{"type":"public","id":"2170761061395221552321793888804720334493316122331828231173520748015857657389field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"7812033131660295289207078830719348736788767283997224928167372421466500300696field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' + - '{"type":"public","id":"4227271453559074580761782898043117548320729393319599555165417123780466734088field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' credits.aleo/fee_public: outputs: - - '{"type":"future","id":"6934683053495529076879804638371439764251999038469408002617655045734104381794field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx,\n 2123u64\n ]\n}"}' + - '{"type":"future","id":"8216972065644000579816790328783540313220942313753411501386970051803831099199field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx,\n 2123u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/complex_finalization.out b/synthesizer/tests/expectations/vm/execute_and_finalize/complex_finalization.out index 968809fe2f..d413523f61 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/complex_finalization.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/complex_finalization.out @@ -4,23 +4,23 @@ outputs: execute: four_program.aleo/a: outputs: - - '{"type":"future","id":"7070877344843470845071680218340128414876561588663484899722739079133777261690field","value":"{\n program_id: four_program.aleo,\n function_name: a,\n arguments: [\n {\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: three_program.aleo,\n function_name: e,\n arguments: [\n {\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' + - '{"type":"future","id":"665183472055988178271814702289264025474680637838536582821282925188065775088field","value":"{\n program_id: four_program.aleo,\n function_name: a,\n arguments: [\n {\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: three_program.aleo,\n function_name: e,\n arguments: [\n {\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' speculate: the execution was accepted add_next_block: succeeded. additional: - child_outputs: zero_program.aleo/c: outputs: - - '{"type":"future","id":"6477965281694625542813245938794172569328608429706708191922101843636085582648field","value":"{\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' + - '{"type":"future","id":"1480766593085211098189114488792207994373740214001639330000129810788271883137field","value":"{\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' one_program.aleo/d: outputs: - - '{"type":"future","id":"7600562933389723321829659564857024316904973330057294558938622149411503122565field","value":"{\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' + - '{"type":"future","id":"6874436412573820073608038525233877999669336342335693667065896409420053741810field","value":"{\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' two_program.aleo/b: outputs: - - '{"type":"future","id":"1088466287454699993852527092566314082160141085274506025284078608454717245108field","value":"{\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' + - '{"type":"future","id":"439911297771864655257183196286454333195715414280549536084302592849654672842field","value":"{\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' three_program.aleo/e: outputs: - - '{"type":"future","id":"7841227793321257675149138943803344962284191528517008231244304707117434937108field","value":"{\n program_id: three_program.aleo,\n function_name: e,\n arguments: [\n {\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' + - '{"type":"future","id":"6324349534667114127832388996854882573236888808429320919855235417654165379333field","value":"{\n program_id: three_program.aleo,\n function_name: e,\n arguments: [\n {\n program_id: two_program.aleo,\n function_name: b,\n arguments: [\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: one_program.aleo,\n function_name: d,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n {\n program_id: zero_program.aleo,\n function_name: c,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n },\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8\n ]\n}"}' credits.aleo/fee_public: outputs: - - '{"type":"future","id":"1237672223493374809326586125815613616482431271830981051687054520069740484800field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8,\n 1312883u64\n ]\n}"}' + - '{"type":"future","id":"2642525527921148655203140665689909230400981948693155278410222306693462629362field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8,\n 1312883u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/count_usages.out b/synthesizer/tests/expectations/vm/execute_and_finalize/count_usages.out index 21f59e8527..bc0c5af71d 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/count_usages.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/count_usages.out @@ -12,12 +12,12 @@ additional: - child_outputs: basic_math.aleo/add_and_count: outputs: - - '{"type":"private","id":"4561312717108467882490189383753688162224283446985485227292501566765195528324field","value":"ciphertext1qyqxqf95wz9zvjvpar4mvg0uh8xuc3dwd0g3z7rggzs37wgn59lk5rqeqev0f"}' - - '{"type":"future","id":"1823043499627326708916435552316425587964911687609516559408234217585811375291field","value":"{\n program_id: basic_math.aleo,\n function_name: add_and_count,\n arguments: [\n aleo1mrughg5ssadd9fc2uwve7l6u24xn76kyz24zsjtzta03vgkq4vpqggl6fg\n ]\n}"}' + - '{"type":"private","id":"8146495595200999887858412726015174541046002665643175756153664146614367276693field","value":"ciphertext1qyqgrgmhxyfjr3cvy50sy2hg8y56suw5wgvytygzms53mp4ms3v26rg226k3t"}' + - '{"type":"future","id":"4731072368922094762332855593966999173744758108005904730949638980529645559135field","value":"{\n program_id: basic_math.aleo,\n function_name: add_and_count,\n arguments: [\n aleo1mrughg5ssadd9fc2uwve7l6u24xn76kyz24zsjtzta03vgkq4vpqggl6fg\n ]\n}"}' basic_math.aleo/sub_and_count: outputs: - - '{"type":"private","id":"6179141860878239968710321244474677697823391063964518415169464613412286673421field","value":"ciphertext1qyqd9vtp4hdlacy9n322hvdywk84crzw47vfygjmxe253v2tgjqpxqcq5jx54"}' - - '{"type":"future","id":"6353584285709285028969780236537279966694496448826640752394833353716781489471field","value":"{\n program_id: basic_math.aleo,\n function_name: sub_and_count,\n arguments: [\n aleo1mrughg5ssadd9fc2uwve7l6u24xn76kyz24zsjtzta03vgkq4vpqggl6fg\n ]\n}"}' + - '{"type":"private","id":"961409263208860904485872221121989324413563522578995015597420037381610399703field","value":"ciphertext1qyqv6unr5dg8tj228pl0vgv32p92mcyxxyf9368salhtfqh0hd4scqc89y5m4"}' + - '{"type":"future","id":"4663027849889985446453275863200868545411574358675486387787337708909316167962field","value":"{\n program_id: basic_math.aleo,\n function_name: sub_and_count,\n arguments: [\n aleo1mrughg5ssadd9fc2uwve7l6u24xn76kyz24zsjtzta03vgkq4vpqggl6fg\n ]\n}"}' credits.aleo/fee_public: outputs: - - '{"type":"future","id":"1724410343181243501519372165830316719575121816257937877011429517054089311771field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8,\n 263392u64\n ]\n}"}' + - '{"type":"future","id":"3084534457419184182612834880575828543753579447019853593724174249884664876235field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1kw4knandael9qcpxs6g36rr6h7dwvjz6q25ueah6zz9v57zjlvxsx5llq8,\n 263392u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/program_callable.out b/synthesizer/tests/expectations/vm/execute_and_finalize/program_callable.out index 35b4c94e05..8bb0637e68 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/program_callable.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/program_callable.out @@ -5,10 +5,10 @@ outputs: execute: parent.aleo/foo: outputs: - - '{"type":"public","id":"2113639263284598783237184890483589485263377586770518008730201564727239039871field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' - - '{"type":"public","id":"7678040084911633492076681690048450077835769459926508481383981892807233674714field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' - - '{"type":"public","id":"4672581957597248464578193953626136889647685708065995338030805320939951875503field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' - - '{"type":"public","id":"5713124416526318631344949557472532527559170952243278345561593407764623253620field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"7957417389566842019333476383015223465797041221984916169491225413765492389707field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' + - '{"type":"public","id":"5660332966063165816193998255057769236492104556419359071777110117631685203432field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"119590126009840588550727571915536854356547100414781210870229193044716803923field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"3955648008862663886784245642019540732803638576128766893102159939289033551109field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' speculate: the execution was accepted add_next_block: succeeded. additional: @@ -16,8 +16,8 @@ additional: - child_outputs: child.aleo/foo: outputs: - - '{"type":"public","id":"8256096006685601051730823022659471790701845130080598423319521977566444421040field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' - - '{"type":"public","id":"5221989025862141472722693152948767316757289409356062808145501796303456062879field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"5860672233404277218165914850445330702482897594856038385529876412918074003384field","value":"aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy"}' + - '{"type":"public","id":"7032360703707892728582573080419248600535906704593225990910797295396231122684field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' credits.aleo/fee_public: outputs: - - '{"type":"future","id":"2015747658045377273535220569098051012671760616560705166778921345457847058512field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx,\n 2123u64\n ]\n}"}' + - '{"type":"future","id":"3173434315503739455207432985984041544966817001490874630397863189982314711932field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx,\n 2123u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/public_wallet.out b/synthesizer/tests/expectations/vm/execute_and_finalize/public_wallet.out index 96fdcea20c..cbb7f2d77c 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/public_wallet.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/public_wallet.out @@ -11,7 +11,7 @@ additional: - child_outputs: token.aleo/mint_public: outputs: - - '{"type":"future","id":"3040250960739602137216192760697867018750676343790464348994684811613512872895field","value":"{\n program_id: token.aleo,\n function_name: mint_public,\n arguments: [\n aleo1sry3pke49ykrf0aeshf889tr98r4c86p5f4ms766795ssdwfdyqq9jdg0j,\n 10u64\n ]\n}"}' + - '{"type":"future","id":"2095235103073153862497986952383880687050623273703041876358116424903602929020field","value":"{\n program_id: token.aleo,\n function_name: mint_public,\n arguments: [\n aleo1sry3pke49ykrf0aeshf889tr98r4c86p5f4ms766795ssdwfdyqq9jdg0j,\n 10u64\n ]\n}"}' credits.aleo/fee_public: outputs: - '{"type":"future","id":"4373249435479943424484888940718424132561120812144078253060284512525421799293field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1d3e2je2m2hsxwdsvntvf4jnnlj459ywfry6ch2qwrpy6l6r6yvpq8e88h5,\n 131201u64\n ]\n}"}' diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/user_callable.out b/synthesizer/tests/expectations/vm/execute_and_finalize/user_callable.out index 77e6a29dd6..85f3df23fb 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/user_callable.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/user_callable.out @@ -4,8 +4,8 @@ outputs: execute: child.aleo/foo: outputs: - - '{"type":"public","id":"389051587023874025297792889573178986947322645231926608183742711950919559411field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' - - '{"type":"public","id":"764027935495423951991221261588244508770271800988614802602832277026356994499field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"3583507900097573902692207210661581535840809808651900827750728854102720512424field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' + - '{"type":"public","id":"476166291720572191849579987891810720100233870490756615272004665719966045283field","value":"aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx"}' speculate: the execution was accepted add_next_block: succeeded. - execute: 'Failed to evaluate instruction (call child.aleo/foo into r0 r1;): Failed to evaluate instruction (assert.eq self.caller self.signer ;): ''assert.eq'' failed: ''aleo16w8t56s7v6ud7vu33fr388ph0dq0c7yhp597cyjt88rr3nultcyqcyk9yy'' is not equal to ''aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx'' (should be equal)' @@ -13,5 +13,5 @@ additional: - child_outputs: credits.aleo/fee_public: outputs: - - '{"type":"future","id":"6557860754730668406004469054379794576334242764827542178306889009454484547032field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx,\n 1244u64\n ]\n}"}' + - '{"type":"future","id":"5245767978479482276373144091068362056657622227760198296183689243703275814117field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1qr2ha4pfs5l28aze88yn6fhleeythklkczrule2v838uwj65n5gqxt9djx,\n 1244u64\n ]\n}"}' - {} From 49f104d5ccf0f6a126fda109d5ffd4f41bc7a6c4 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 7 Nov 2023 21:58:07 -0800 Subject: [PATCH 101/339] Use a counter to index confirmed transactions in atomic_speculate --- synthesizer/src/vm/finalize.rs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index c30166343a..d13067e398 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -204,13 +204,11 @@ impl> VM { let mut confirmed = Vec::with_capacity(num_transactions); // Initialize a list of the aborted transactions. let mut aborted = Vec::new(); + // Initialize a counter for the confirmed transactions. + let mut counter = 0u32; // Finalize the transactions. - 'outer: for (index, transaction) in transactions.enumerate() { - // Convert the transaction index to a u32. - // Note: On failure, this will abort the entire atomic batch. - let index = u32::try_from(index).map_err(|_| "Failed to convert transaction index".to_string())?; - + 'outer: for transaction in transactions { // Process the transaction in an isolated atomic batch. // - If the transaction succeeds, the finalize operations are stored. // - If the transaction fails, the atomic batch is aborted and no finalize operations are stored. @@ -221,7 +219,7 @@ impl> VM { match process.finalize_deployment(state, store, deployment, fee) { // Construct the accepted deploy transaction. Ok((_, finalize)) => { - ConfirmedTransaction::accepted_deploy(index, transaction.clone(), finalize) + ConfirmedTransaction::accepted_deploy(counter, transaction.clone(), finalize) .map_err(|e| e.to_string()) } // Construct the rejected deploy transaction. @@ -234,7 +232,7 @@ impl> VM { // Construct the rejected deployment. let rejected = Rejected::new_deployment(*program_owner, *deployment.clone()); // Construct the rejected deploy transaction. - ConfirmedTransaction::rejected_deploy(index, fee_tx, rejected, finalize) + ConfirmedTransaction::rejected_deploy(counter, fee_tx, rejected, finalize) .map_err(|e| e.to_string()) } Err(error) => { @@ -256,7 +254,7 @@ impl> VM { match process.finalize_execution(state, store, execution, fee.as_ref()) { // Construct the accepted execute transaction. Ok(finalize) => { - ConfirmedTransaction::accepted_execute(index, transaction.clone(), finalize) + ConfirmedTransaction::accepted_execute(counter, transaction.clone(), finalize) .map_err(|e| e.to_string()) } // Construct the rejected execute transaction. @@ -270,7 +268,7 @@ impl> VM { // Construct the rejected execution. let rejected = Rejected::new_execution(execution.clone()); // Construct the rejected execute transaction. - ConfirmedTransaction::rejected_execute(index, fee_tx, rejected, finalize) + ConfirmedTransaction::rejected_execute(counter, fee_tx, rejected, finalize) .map_err(|e| e.to_string()) } Err(error) => { @@ -298,7 +296,11 @@ impl> VM { match outcome { // If the transaction succeeded, store it and continue to the next transaction. - Ok(confirmed_transaction) => confirmed.push(confirmed_transaction), + Ok(confirmed_transaction) => { + confirmed.push(confirmed_transaction); + // Increment the transaction counter. + counter = counter.saturating_add(1); + } // If the transaction failed, abort the entire batch. Err(error) => { eprintln!("Critical bug in speculate: {error}\n\n{transaction}"); From dc5071419f328cbbf0484a8ced1e389b0d039655 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 7 Nov 2023 22:11:27 -0800 Subject: [PATCH 102/339] Add test to check indexes in blocks with aborted transactions --- ledger/src/tests.rs | 69 ++++++++++++++++++++++++++++++++++ synthesizer/src/vm/finalize.rs | 4 +- 2 files changed, 71 insertions(+), 2 deletions(-) diff --git a/ledger/src/tests.rs b/ledger/src/tests.rs index af95102191..ea5ab8b8d3 100644 --- a/ledger/src/tests.rs +++ b/ledger/src/tests.rs @@ -567,3 +567,72 @@ fn test_bond_and_unbond_validator() { let committee = ledger.latest_committee().unwrap(); assert!(!committee.is_committee_member(new_member_address)); } + +#[test] +fn test_aborted_transaction_indexing() { + let rng = &mut TestRng::default(); + + // Initialize the test environment. + let crate::test_helpers::TestEnv { ledger, private_key, .. } = crate::test_helpers::sample_test_env(rng); + + // Sample a recipient account. + let recipient_private_key = PrivateKey::::new(rng).unwrap(); + let recipient_address = Address::try_from(&recipient_private_key).unwrap(); + + // Sample another recipient account. + let recipient_private_key_2 = PrivateKey::::new(rng).unwrap(); + let recipient_address_2 = Address::try_from(&recipient_private_key_2).unwrap(); + + // Fund a new address. + let inputs = [Value::from_str(&format!("{recipient_address}")).unwrap(), Value::from_str("185000u64").unwrap()]; + let transfer_transaction = ledger + .vm + .execute(&private_key, ("credits.aleo", "transfer_public"), inputs.iter(), None, 0, None, rng) + .unwrap(); + + // Construct the next block. + let transfer_block = ledger + .prepare_advance_to_next_beacon_block(&private_key, vec![], vec![], vec![transfer_transaction], rng) + .unwrap(); + + // Check that the next block is valid. + ledger.check_next_block(&transfer_block).unwrap(); + + // Add the deployment block to the ledger. + ledger.advance_to_next_block(&transfer_block).unwrap(); + + // Send a transaction that will be aborted due to insufficient fee. + let inputs = [Value::from_str(&format!("{recipient_address_2}")).unwrap(), Value::from_str("1u64").unwrap()]; + let transfer_transaction = ledger + .vm + .execute(&recipient_private_key_2, ("credits.aleo", "transfer_public"), inputs.iter(), None, 0, None, rng) + .unwrap(); + let aborted_transaction_id = transfer_transaction.id(); + + // Create another arbitrary transaction. + let inputs = [Value::from_str(&format!("{recipient_address_2}")).unwrap(), Value::from_str("1u64").unwrap()]; + let transfer_transaction_2 = ledger + .vm + .execute(&private_key, ("credits.aleo", "transfer_public"), inputs.iter(), None, 0, None, rng) + .unwrap(); + + // Create a block. + let block = ledger + .prepare_advance_to_next_beacon_block( + &private_key, + vec![], + vec![], + vec![transfer_transaction, transfer_transaction_2], + rng, + ) + .unwrap(); + + // Check that the block contains the aborted transaction. + assert_eq!(block.aborted_transaction_ids(), &[aborted_transaction_id]); + + // Check that the next block is valid. + ledger.check_next_block(&block).unwrap(); + + // Add the deployment block to the ledger. + ledger.advance_to_next_block(&block).unwrap(); +} diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index d13067e398..fe367d94d8 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -204,7 +204,7 @@ impl> VM { let mut confirmed = Vec::with_capacity(num_transactions); // Initialize a list of the aborted transactions. let mut aborted = Vec::new(); - // Initialize a counter for the confirmed transactions. + // Initialize a counter for the confirmed transaction index. let mut counter = 0u32; // Finalize the transactions. @@ -298,7 +298,7 @@ impl> VM { // If the transaction succeeded, store it and continue to the next transaction. Ok(confirmed_transaction) => { confirmed.push(confirmed_transaction); - // Increment the transaction counter. + // Increment the transaction index counter. counter = counter.saturating_add(1); } // If the transaction failed, abort the entire batch. From aba76bc92af876e58f5b8f7393e83f7798371a47 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Wed, 8 Nov 2023 11:54:31 +0100 Subject: [PATCH 103/339] feat: use a custom panic hook when halting Signed-off-by: ljedrz --- synthesizer/process/Cargo.toml | 5 +++++ synthesizer/process/src/finalize.rs | 12 ++++++------ utilities/src/error.rs | 29 +++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/synthesizer/process/Cargo.toml b/synthesizer/process/Cargo.toml index 7f05bd688d..c847561231 100644 --- a/synthesizer/process/Cargo.toml +++ b/synthesizer/process/Cargo.toml @@ -83,6 +83,11 @@ package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" version = "=0.16.8" +[dependencies.utilities] +package = "snarkvm-utilities" +path = "../../utilities" +version = "=0.16.8" + [dependencies.aleo-std] version = "0.1.18" default-features = false diff --git a/synthesizer/process/src/finalize.rs b/synthesizer/process/src/finalize.rs index 513fb5a8e2..40edfd5071 100644 --- a/synthesizer/process/src/finalize.rs +++ b/synthesizer/process/src/finalize.rs @@ -15,6 +15,7 @@ use super::*; use console::program::{Future, Register}; use synthesizer_program::{Await, FinalizeRegistersState, Operand}; +use utilities::handle_halting; impl Process { /// Finalizes the deployment and fee. @@ -224,7 +225,7 @@ fn finalize_transition>( // Finalize the command. match &command { Command::BranchEq(branch_eq) => { - let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + let result = handle_halting!(panic::AssertUnwindSafe(|| { branch_to(counter, branch_eq, finalize, stack, ®isters) })); match result { @@ -238,7 +239,7 @@ fn finalize_transition>( } } Command::BranchNeq(branch_neq) => { - let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + let result = handle_halting!(panic::AssertUnwindSafe(|| { branch_to(counter, branch_neq, finalize, stack, ®isters) })); match result { @@ -276,7 +277,7 @@ fn finalize_transition>( None => bail!("Transition ID '{transition_id}' not found in call graph"), }; - let callee_state = match std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + let callee_state = match handle_halting!(panic::AssertUnwindSafe(|| { // Set up the finalize state for the await. setup_await(state, await_, stack, ®isters, child_transition_id) })) { @@ -306,9 +307,8 @@ fn finalize_transition>( break; } _ => { - let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { - command.finalize(stack, store, &mut registers) - })); + let result = + handle_halting!(panic::AssertUnwindSafe(|| { command.finalize(stack, store, &mut registers) })); match result { // If the evaluation succeeds with an operation, add it to the list. Ok(Ok(Some(finalize_operation))) => finalize_operations.push(finalize_operation), diff --git a/utilities/src/error.rs b/utilities/src/error.rs index 2914264eb4..97ab38bc65 100644 --- a/utilities/src/error.rs +++ b/utilities/src/error.rs @@ -37,3 +37,32 @@ impl Error for crate::String {} #[cfg(not(feature = "std"))] impl Error for crate::io::Error {} + +/// This purpose of this macro is to catch the instances of halting +/// without producing logs looking like unexpected panics. It prints +/// to stderr using the format: "Halted at : ". +#[macro_export] +macro_rules! handle_halting { + ($e:expr) => {{ + use std::panic; + + // Set a custom hook before calling catch_unwind to + // indicate that the panic was expected and handled. + panic::set_hook(Box::new(|e| { + let msg = e.to_string(); + let msg = msg.split_ascii_whitespace().skip_while(|&word| word != "panicked").collect::>(); + let mut msg = msg.join(" "); + msg = msg.replacen("panicked", "Halted", 1); + eprintln!("{msg}"); + })); + + // Perform the operation that may panic. + let result = panic::catch_unwind($e); + + // Restore the standard panic hook. + let _ = panic::take_hook(); + + // Return the result, allowing regular error-handling. + result + }}; +} From 00aaa56feb3d3d82e41b9eff42ff5924391ebceb Mon Sep 17 00:00:00 2001 From: ljedrz Date: Wed, 8 Nov 2023 11:54:37 +0100 Subject: [PATCH 104/339] chore: adjust the lockfile Signed-off-by: ljedrz --- Cargo.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.lock b/Cargo.lock index 24f17f9b00..36d053b289 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3323,6 +3323,7 @@ dependencies = [ "snarkvm-ledger-test-helpers", "snarkvm-synthesizer-program", "snarkvm-synthesizer-snark", + "snarkvm-utilities", "tempfile", ] From 6c71f712e265ca067b59c02bff843ccc80a67502 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Fri, 20 Oct 2023 14:48:24 +0200 Subject: [PATCH 105/339] R1CS is only passing when all constraints refer to variables using the same index. This can only fail if a user makes non-black-box use of the snarkVM compiler and decides to remove declared variables. We could refactor R1CS::enforce(...) to check for each incoming constraint if its variables are consistent with declared variables, but this would be very inefficient (or require use to refactor variables into a mapping). --- circuit/environment/src/helpers/r1cs.rs | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/circuit/environment/src/helpers/r1cs.rs b/circuit/environment/src/helpers/r1cs.rs index 7dc324b14a..cf3347539d 100644 --- a/circuit/environment/src/helpers/r1cs.rs +++ b/circuit/environment/src/helpers/r1cs.rs @@ -91,9 +91,28 @@ impl R1CS { self.counter.add_constraint(constraint); } - /// Returns `true` if all constraints in the environment are satisfied. + /// Returns `true` if both + /// - all constraints in the environment are satisfied. + /// - all constraints use variables corresponding to the declared variables pub fn is_satisfied(&self) -> bool { - self.constraints.iter().all(|constraint| constraint.is_satisfied()) + let constraints_satisfied = self.constraints.iter().all(|constraint| constraint.is_satisfied()); + if !constraints_satisfied { + return false; + } + self.constraints.iter().all(|constraint| { + let (a, b, c) = constraint.to_terms(); + [a, b, c].into_iter().all(|m| { + m.to_terms().into_iter().all(|(var, _)| match var { + Variable::Constant(_value) => false, // terms should not contain Constants + Variable::Private(index, value) => { + self.private.get(*index as usize).map_or_else(|| false, |v| v.value() == **value) + } + Variable::Public(index, value) => { + self.public.get(*index as usize).map_or_else(|| false, |v| v.value() == **value) + } + }) + }) + }) } /// Returns `true` if all constraints in the current scope are satisfied. From 338f76c57fcd46aa07ce387073eb0a7fcc6233b6 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Wed, 8 Nov 2023 17:11:05 -0800 Subject: [PATCH 106/339] Add bounds for committee --- ledger/committee/src/bytes.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ledger/committee/src/bytes.rs b/ledger/committee/src/bytes.rs index d55a80ab41..6d237166ef 100644 --- a/ledger/committee/src/bytes.rs +++ b/ledger/committee/src/bytes.rs @@ -28,6 +28,12 @@ impl FromBytes for Committee { let starting_round = u64::read_le(&mut reader)?; // Read the number of members. let num_members = u16::read_le(&mut reader)?; + if num_members > Self::MAX_COMMITTEE_SIZE { + return Err(error(format!( + "Committee cannot exceed {} members, found {num_members}", + Self::MAX_COMMITTEE_SIZE, + ))); + } // Read the members. let mut members = IndexMap::with_capacity(num_members as usize); for _ in 0..num_members { From 3a31e162817b93491911129bb5866c72db39144f Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Wed, 8 Nov 2023 18:36:56 -0800 Subject: [PATCH 107/339] Add additional bound checks --- ledger/narwhal/batch-header/src/bytes.rs | 12 ++++++++++-- ledger/narwhal/subdag/src/bytes.rs | 8 ++++++++ utilities/src/bytes.rs | 5 +++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/ledger/narwhal/batch-header/src/bytes.rs b/ledger/narwhal/batch-header/src/bytes.rs index f564e58c19..d3786889d9 100644 --- a/ledger/narwhal/batch-header/src/bytes.rs +++ b/ledger/narwhal/batch-header/src/bytes.rs @@ -34,16 +34,24 @@ impl FromBytes for BatchHeader { let timestamp = i64::read_le(&mut reader)?; // Read the number of transmission IDs. - let num_transmissions = u32::read_le(&mut reader)?; + let num_transmission_ids = u32::read_le(&mut reader)?; + // Ensure the number of transmission ids is within bounds. + if num_transmission_ids > i32::MAX as u32 { + return Err(error("Number of transmission ids exceeds maximum")); + } // Read the transmission IDs. let mut transmission_ids = IndexSet::new(); - for _ in 0..num_transmissions { + for _ in 0..num_transmission_ids { // Insert the transmission ID. transmission_ids.insert(TransmissionID::read_le(&mut reader)?); } // Read the number of previous certificate IDs. let num_previous_certificate_ids = u32::read_le(&mut reader)?; + // Ensure the number of previous certificate ids is within bounds. + if num_previous_certificate_ids > i32::MAX as u32 { + return Err(error("Number of previous certificate ids exceeds maximum")); + } // Read the previous certificate IDs. let mut previous_certificate_ids = IndexSet::with_capacity(num_previous_certificate_ids as usize); for _ in 0..num_previous_certificate_ids { diff --git a/ledger/narwhal/subdag/src/bytes.rs b/ledger/narwhal/subdag/src/bytes.rs index c5435663e0..35c1d6b5ed 100644 --- a/ledger/narwhal/subdag/src/bytes.rs +++ b/ledger/narwhal/subdag/src/bytes.rs @@ -26,6 +26,10 @@ impl FromBytes for Subdag { // Read the number of rounds. let num_rounds = u32::read_le(&mut reader)?; + // Ensure the number of rounds is within bounds. + if num_rounds > i32::MAX as u32 { + return Err(error("Number of rounds exceeds maximum")); + } // Read the round certificates. let mut subdag = BTreeMap::new(); for _ in 0..num_rounds { @@ -33,6 +37,10 @@ impl FromBytes for Subdag { let round = u64::read_le(&mut reader)?; // Read the number of certificates. let num_certificates = u32::read_le(&mut reader)?; + // Ensure the number of certificates is within bounds. + if num_certificates > i32::MAX as u32 { + return Err(error("Number of certificates exceeds maximum")); + } // Read the certificates. let mut certificates = IndexSet::with_capacity(num_certificates as usize); for _ in 0..num_certificates { diff --git a/utilities/src/bytes.rs b/utilities/src/bytes.rs index 2a9938dccf..49bf493440 100644 --- a/utilities/src/bytes.rs +++ b/utilities/src/bytes.rs @@ -145,6 +145,11 @@ impl<'de, T: FromBytes> FromBytesDeserializer { false => (size_b, size_a), }; + // Ensure size_b is within bounds. + if size_b > i32::MAX as usize { + return Err(D::Error::custom("size_b exceeds maximum")); + } + // Reserve a new `Vec` with the larger size capacity. let mut buffer = Vec::with_capacity(size_b); From e2d10528ac998466011bd0493ac75a2082ec8384 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Wed, 8 Nov 2023 18:44:26 -0800 Subject: [PATCH 108/339] Defer allocation: --- ledger/narwhal/batch-header/src/bytes.rs | 2 +- ledger/narwhal/subdag/src/bytes.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ledger/narwhal/batch-header/src/bytes.rs b/ledger/narwhal/batch-header/src/bytes.rs index d3786889d9..9ae0a3eaa9 100644 --- a/ledger/narwhal/batch-header/src/bytes.rs +++ b/ledger/narwhal/batch-header/src/bytes.rs @@ -53,7 +53,7 @@ impl FromBytes for BatchHeader { return Err(error("Number of previous certificate ids exceeds maximum")); } // Read the previous certificate IDs. - let mut previous_certificate_ids = IndexSet::with_capacity(num_previous_certificate_ids as usize); + let mut previous_certificate_ids = IndexSet::new(); for _ in 0..num_previous_certificate_ids { // Read the certificate ID. previous_certificate_ids.insert(Field::read_le(&mut reader)?); diff --git a/ledger/narwhal/subdag/src/bytes.rs b/ledger/narwhal/subdag/src/bytes.rs index 35c1d6b5ed..e332527c50 100644 --- a/ledger/narwhal/subdag/src/bytes.rs +++ b/ledger/narwhal/subdag/src/bytes.rs @@ -42,7 +42,7 @@ impl FromBytes for Subdag { return Err(error("Number of certificates exceeds maximum")); } // Read the certificates. - let mut certificates = IndexSet::with_capacity(num_certificates as usize); + let mut certificates = IndexSet::new(); for _ in 0..num_certificates { // Read the certificate. certificates.insert(BatchCertificate::read_le(&mut reader)?); From b833f75e783de613803423b535914f293b17332b Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Thu, 9 Nov 2023 12:11:12 -0800 Subject: [PATCH 109/339] Update log error handling --- ledger/src/lib.rs | 5 +++-- synthesizer/process/src/stack/register_types/initialize.rs | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ledger/src/lib.rs b/ledger/src/lib.rs index 0e5511b798..0259e567b0 100644 --- a/ledger/src/lib.rs +++ b/ledger/src/lib.rs @@ -145,8 +145,9 @@ impl> Ledger { let timer = timer!("Ledger::load_unchecked"); // Initialize the consensus store. - let Ok(store) = ConsensusStore::::open(dev) else { - bail!("Failed to load ledger (run 'snarkos clean' and try again)"); + let store = match ConsensusStore::::open(dev) { + Ok(store) => store, + Err(e) => bail!("Failed to load ledger (run 'snarkos clean' and try again)\n\n{e}\n"), }; lap!(timer, "Load consensus store"); diff --git a/synthesizer/process/src/stack/register_types/initialize.rs b/synthesizer/process/src/stack/register_types/initialize.rs index 173e71d319..ee76d5f31f 100644 --- a/synthesizer/process/src/stack/register_types/initialize.rs +++ b/synthesizer/process/src/stack/register_types/initialize.rs @@ -305,6 +305,7 @@ impl RegisterTypes { operand: &Operand, register_type: &RegisterType, ) -> Result<()> { + #[cfg(feature = "aleo-cli")] match operand { // Inform the user the output operand is an input register, to ensure this is intended behavior. Operand::Register(register) if self.is_input(register) => { From 5df8e83b1578f12fde4f972fe302d1e8175e5da5 Mon Sep 17 00:00:00 2001 From: Raymond Chu <14917648+raychu86@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:26:19 -0800 Subject: [PATCH 110/339] Update synthesizer/src/vm/helpers/cost.rs Co-authored-by: Howard Wu <9260812+howardwu@users.noreply.github.com> Signed-off-by: Raymond Chu <14917648+raychu86@users.noreply.github.com> --- synthesizer/src/vm/helpers/cost.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synthesizer/src/vm/helpers/cost.rs b/synthesizer/src/vm/helpers/cost.rs index 36c581e383..6f349baa84 100644 --- a/synthesizer/src/vm/helpers/cost.rs +++ b/synthesizer/src/vm/helpers/cost.rs @@ -202,6 +202,6 @@ pub fn cost_in_microcredits(finalize: &Finalize) -> Result { finalize .commands() .iter() - .map(|command| cost(command)) + .map(cost) .try_fold(0u64, |acc, res| res.and_then(|x| acc.checked_add(x).ok_or(anyhow!("Finalize cost overflowed")))) } From ccc41e0f166e09f1c207f7b17fc531f650f598b6 Mon Sep 17 00:00:00 2001 From: Raymond Chu <14917648+raychu86@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:40:11 -0800 Subject: [PATCH 111/339] Update ledger/committee/src/bytes.rs Co-authored-by: Howard Wu <9260812+howardwu@users.noreply.github.com> Signed-off-by: Raymond Chu <14917648+raychu86@users.noreply.github.com> --- ledger/committee/src/bytes.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/ledger/committee/src/bytes.rs b/ledger/committee/src/bytes.rs index 6d237166ef..2c3eba9771 100644 --- a/ledger/committee/src/bytes.rs +++ b/ledger/committee/src/bytes.rs @@ -28,6 +28,7 @@ impl FromBytes for Committee { let starting_round = u64::read_le(&mut reader)?; // Read the number of members. let num_members = u16::read_le(&mut reader)?; + // Ensure the number of members is within the allowed limit. if num_members > Self::MAX_COMMITTEE_SIZE { return Err(error(format!( "Committee cannot exceed {} members, found {num_members}", From 9d766a03d32d9bc441beceb7eceb3c00386a58be Mon Sep 17 00:00:00 2001 From: Raymond Chu <14917648+raychu86@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:40:16 -0800 Subject: [PATCH 112/339] Update ledger/narwhal/batch-header/src/bytes.rs Co-authored-by: Howard Wu <9260812+howardwu@users.noreply.github.com> Signed-off-by: Raymond Chu <14917648+raychu86@users.noreply.github.com> --- ledger/narwhal/batch-header/src/bytes.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/narwhal/batch-header/src/bytes.rs b/ledger/narwhal/batch-header/src/bytes.rs index 9ae0a3eaa9..6802152081 100644 --- a/ledger/narwhal/batch-header/src/bytes.rs +++ b/ledger/narwhal/batch-header/src/bytes.rs @@ -35,7 +35,7 @@ impl FromBytes for BatchHeader { // Read the number of transmission IDs. let num_transmission_ids = u32::read_le(&mut reader)?; - // Ensure the number of transmission ids is within bounds. + // Ensure the number of transmission IDs is within bounds. if num_transmission_ids > i32::MAX as u32 { return Err(error("Number of transmission ids exceeds maximum")); } From 6cd67efe28ab62a96fc5119080456ddb832754b1 Mon Sep 17 00:00:00 2001 From: Raymond Chu <14917648+raychu86@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:40:21 -0800 Subject: [PATCH 113/339] Update ledger/narwhal/batch-header/src/bytes.rs Co-authored-by: Howard Wu <9260812+howardwu@users.noreply.github.com> Signed-off-by: Raymond Chu <14917648+raychu86@users.noreply.github.com> --- ledger/narwhal/batch-header/src/bytes.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/narwhal/batch-header/src/bytes.rs b/ledger/narwhal/batch-header/src/bytes.rs index 6802152081..07ee28a0e9 100644 --- a/ledger/narwhal/batch-header/src/bytes.rs +++ b/ledger/narwhal/batch-header/src/bytes.rs @@ -48,7 +48,7 @@ impl FromBytes for BatchHeader { // Read the number of previous certificate IDs. let num_previous_certificate_ids = u32::read_le(&mut reader)?; - // Ensure the number of previous certificate ids is within bounds. + // Ensure the number of previous certificate IDs is within bounds. if num_previous_certificate_ids > i32::MAX as u32 { return Err(error("Number of previous certificate ids exceeds maximum")); } From 04aa25ea068bfcac23d5aa42345a06d4e9fe5940 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:51:51 -0800 Subject: [PATCH 114/339] Adds MAX_TRANSMISSIONS and enforce it --- Cargo.lock | 1 + console/network/src/lib.rs | 4 ++-- ledger/block/Cargo.toml | 4 ++++ ledger/block/src/transactions/mod.rs | 15 +++++++++++++++ ledger/block/src/verify.rs | 4 ++-- ledger/coinbase/benches/coinbase_puzzle.rs | 2 +- .../coinbase/src/helpers/coinbase_solution/mod.rs | 4 ++-- ledger/coinbase/src/lib.rs | 4 ++-- ledger/coinbase/src/tests.rs | 2 +- ledger/narwhal/batch-header/src/bytes.rs | 7 +++++-- ledger/narwhal/batch-header/src/lib.rs | 9 +++++++++ 11 files changed, 44 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 24f17f9b00..d82f1d15ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3049,6 +3049,7 @@ dependencies = [ "snarkvm-ledger-authority", "snarkvm-ledger-coinbase", "snarkvm-ledger-committee", + "snarkvm-ledger-narwhal-batch-header", "snarkvm-ledger-narwhal-subdag", "snarkvm-ledger-narwhal-transmission-id", "snarkvm-ledger-query", diff --git a/console/network/src/lib.rs b/console/network/src/lib.rs index 9179b3c36a..717946cba2 100644 --- a/console/network/src/lib.rs +++ b/console/network/src/lib.rs @@ -109,8 +109,8 @@ pub trait Network: const BLOCK_TIME: u16 = 10; /// The coinbase puzzle degree. const COINBASE_PUZZLE_DEGREE: u32 = (1 << 13) - 1; // 8,191 - /// The maximum number of prover solutions that can be included per block. - const MAX_PROVER_SOLUTIONS: usize = 1 << 8; // 256 prover solutions + /// The maximum number of solutions that can be included per block. + const MAX_SOLUTIONS: usize = 1 << 8; // 256 solutions /// The number of blocks per epoch. const NUM_BLOCKS_PER_EPOCH: u32 = 3600 / Self::BLOCK_TIME as u32; // 360 blocks == ~1 hour diff --git a/ledger/block/Cargo.toml b/ledger/block/Cargo.toml index 41c9017a07..6ce4e1497e 100644 --- a/ledger/block/Cargo.toml +++ b/ledger/block/Cargo.toml @@ -100,6 +100,10 @@ package = "snarkvm-ledger-committee" path = "../../ledger/committee" features = [ "test-helpers" ] +[dev-dependencies.ledger-narwhal-batch-header] +package = "snarkvm-ledger-narwhal-batch-header" +path = "../narwhal/batch-header" + [dev-dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../query" diff --git a/ledger/block/src/transactions/mod.rs b/ledger/block/src/transactions/mod.rs index be1a1f6b70..2eb3a31372 100644 --- a/ledger/block/src/transactions/mod.rs +++ b/ledger/block/src/transactions/mod.rs @@ -339,3 +339,18 @@ pub mod test_helpers { crate::test_helpers::sample_genesis_block(rng).transactions().clone() } } + +#[cfg(test)] +mod tests { + use super::*; + + type CurrentNetwork = console::network::Testnet3; + + #[test] + fn test_max_transactions() { + assert_eq!( + Transactions::::MAX_TRANSACTIONS, + ledger_narwhal_batch_header::BatchHeader::::MAX_TRANSACTIONS + ); + } +} diff --git a/ledger/block/src/verify.rs b/ledger/block/src/verify.rs index 057ff2b562..fad6af3017 100644 --- a/ledger/block/src/verify.rs +++ b/ledger/block/src/verify.rs @@ -271,10 +271,10 @@ impl Block { Some(coinbase) => { // Ensure the number of solutions is within the allowed range. ensure!( - coinbase.len() <= N::MAX_PROVER_SOLUTIONS, + coinbase.len() <= N::MAX_SOLUTIONS, "Block {height} contains too many prover solutions (found '{}', expected '{}')", coinbase.len(), - N::MAX_PROVER_SOLUTIONS + N::MAX_SOLUTIONS ); // Ensure the solutions are not accepted after the block height at year 10. if height > block_height_at_year(N::BLOCK_TIME, 10) { diff --git a/ledger/coinbase/benches/coinbase_puzzle.rs b/ledger/coinbase/benches/coinbase_puzzle.rs index 418466b67f..fe8c86c4ca 100644 --- a/ledger/coinbase/benches/coinbase_puzzle.rs +++ b/ledger/coinbase/benches/coinbase_puzzle.rs @@ -95,7 +95,7 @@ fn coinbase_puzzle_verify(c: &mut Criterion) { let puzzle = CoinbasePuzzleInst::trim(&universal_srs, config).unwrap(); let epoch_challenge = sample_epoch_challenge(degree, rng); - for batch_size in [10, 100, ::MAX_PROVER_SOLUTIONS] { + for batch_size in [10, 100, ::MAX_SOLUTIONS] { let solutions = (0..batch_size) .map(|_| { let (address, nonce) = sample_address_and_nonce(rng); diff --git a/ledger/coinbase/src/helpers/coinbase_solution/mod.rs b/ledger/coinbase/src/helpers/coinbase_solution/mod.rs index bfdacbace4..a735607a53 100644 --- a/ledger/coinbase/src/helpers/coinbase_solution/mod.rs +++ b/ledger/coinbase/src/helpers/coinbase_solution/mod.rs @@ -33,11 +33,11 @@ impl CoinbaseSolution { // Ensure the solutions are not empty. ensure!(!solutions.is_empty(), "There are no solutions to verify for the coinbase puzzle"); // Ensure the number of partial solutions does not exceed `MAX_PROVER_SOLUTIONS`. - if solutions.len() > N::MAX_PROVER_SOLUTIONS { + if solutions.len() > N::MAX_SOLUTIONS { bail!( "The solutions exceed the allowed number of partial solutions. ({} > {})", solutions.len(), - N::MAX_PROVER_SOLUTIONS + N::MAX_SOLUTIONS ); } // Ensure the puzzle commitments are unique. diff --git a/ledger/coinbase/src/lib.rs b/ledger/coinbase/src/lib.rs index d07e0109e7..eacb8c7790 100644 --- a/ledger/coinbase/src/lib.rs +++ b/ledger/coinbase/src/lib.rs @@ -171,11 +171,11 @@ impl CoinbasePuzzle { ensure!(!solutions.is_empty(), "There are no solutions to verify for the coinbase puzzle"); // Ensure the number of partial solutions does not exceed `MAX_PROVER_SOLUTIONS`. - if solutions.len() > N::MAX_PROVER_SOLUTIONS { + if solutions.len() > N::MAX_SOLUTIONS { bail!( "The solutions exceed the allowed number of partial solutions. ({} > {})", solutions.len(), - N::MAX_PROVER_SOLUTIONS + N::MAX_SOLUTIONS ); } diff --git a/ledger/coinbase/src/tests.rs b/ledger/coinbase/src/tests.rs index 5c5546ce26..15a39fc6a3 100644 --- a/ledger/coinbase/src/tests.rs +++ b/ledger/coinbase/src/tests.rs @@ -133,7 +133,7 @@ fn test_profiler() -> Result<()> { // Generate proof inputs let epoch_challenge = EpochChallenge::new(rng.next_u32(), Default::default(), degree).unwrap(); - for batch_size in [10, 100, ::MAX_PROVER_SOLUTIONS] { + for batch_size in [10, 100, ::MAX_SOLUTIONS] { // Generate the solutions. let solutions = (0..batch_size) .map(|_| { diff --git a/ledger/narwhal/batch-header/src/bytes.rs b/ledger/narwhal/batch-header/src/bytes.rs index 6802152081..110a8abcda 100644 --- a/ledger/narwhal/batch-header/src/bytes.rs +++ b/ledger/narwhal/batch-header/src/bytes.rs @@ -36,8 +36,11 @@ impl FromBytes for BatchHeader { // Read the number of transmission IDs. let num_transmission_ids = u32::read_le(&mut reader)?; // Ensure the number of transmission IDs is within bounds. - if num_transmission_ids > i32::MAX as u32 { - return Err(error("Number of transmission ids exceeds maximum")); + if num_transmission_ids as usize > Self::MAX_TRANSMISSIONS { + return Err(error(format!( + "Number of transmission IDs ({num_transmission_ids}) exceeds the maximum ({})", + Self::MAX_TRANSMISSIONS, + ))); } // Read the transmission IDs. let mut transmission_ids = IndexSet::new(); diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index abe3948722..82531518e3 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -46,6 +46,15 @@ pub struct BatchHeader { signature: Signature, } +impl BatchHeader { + /// The maximum number of solutions in a batch. + pub const MAX_SOLUTIONS: usize = N::MAX_SOLUTIONS; + /// The maximum number of transactions in a batch. + pub const MAX_TRANSACTIONS: usize = usize::pow(2, console::program::TRANSACTIONS_DEPTH as u32); + /// The maximum number of transmissions in a batch. + pub const MAX_TRANSMISSIONS: usize = Self::MAX_SOLUTIONS + Self::MAX_TRANSACTIONS; +} + impl BatchHeader { /// Initializes a new batch header. pub fn new( From 0c1ec7c9f7727954d027b938ca44a70239527701 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Thu, 9 Nov 2023 18:03:17 -0800 Subject: [PATCH 115/339] Update the bounds for the checks --- Cargo.lock | 2 ++ ledger/committee/Cargo.toml | 4 ++++ ledger/committee/src/lib.rs | 8 ++++++++ ledger/narwhal/batch-header/src/bytes.rs | 7 +++++-- ledger/narwhal/batch-header/src/lib.rs | 2 ++ ledger/narwhal/subdag/Cargo.toml | 5 +++++ ledger/narwhal/subdag/src/bytes.rs | 19 +++++++++++-------- ledger/narwhal/subdag/src/lib.rs | 6 ++++++ 8 files changed, 43 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d82f1d15ef..38e1ebd741 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3096,6 +3096,7 @@ dependencies = [ "serde_json", "snarkvm-console", "snarkvm-ledger-committee", + "snarkvm-ledger-narwhal-batch-header", "test-strategy", ] @@ -3158,6 +3159,7 @@ dependencies = [ "serde_json", "snarkvm-console", "snarkvm-ledger-narwhal-batch-certificate", + "snarkvm-ledger-narwhal-batch-header", "snarkvm-ledger-narwhal-subdag", "snarkvm-ledger-narwhal-transmission-id", ] diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index 6e01316f0a..a7ae50f51b 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -82,3 +82,7 @@ version = "1" [dev-dependencies.snarkvm-ledger-committee] path = "." features = [ "prop-tests" ] + +[dev-dependencies.ledger-narwhal-batch-header] +package = "snarkvm-ledger-narwhal-batch-header" +path = "../narwhal/batch-header" diff --git a/ledger/committee/src/lib.rs b/ledger/committee/src/lib.rs index 6a08e72b51..5d81de4414 100644 --- a/ledger/committee/src/lib.rs +++ b/ledger/committee/src/lib.rs @@ -405,4 +405,12 @@ mod tests { } } } + + #[test] + fn test_maximum_committee_size() { + assert_eq!( + Committee::::MAX_COMMITTEE_SIZE as usize, + ledger_narwhal_batch_header::BatchHeader::::MAX_CERTIFICATES + ); + } } diff --git a/ledger/narwhal/batch-header/src/bytes.rs b/ledger/narwhal/batch-header/src/bytes.rs index 146c944098..386ee958d3 100644 --- a/ledger/narwhal/batch-header/src/bytes.rs +++ b/ledger/narwhal/batch-header/src/bytes.rs @@ -52,8 +52,11 @@ impl FromBytes for BatchHeader { // Read the number of previous certificate IDs. let num_previous_certificate_ids = u32::read_le(&mut reader)?; // Ensure the number of previous certificate IDs is within bounds. - if num_previous_certificate_ids > i32::MAX as u32 { - return Err(error("Number of previous certificate ids exceeds maximum")); + if num_previous_certificate_ids as usize > Self::MAX_CERTIFICATES { + return Err(error(format!( + "Number of previous certificate IDs ({num_previous_certificate_ids}) exceeds the maximum ({})", + Self::MAX_CERTIFICATES + ))); } // Read the previous certificate IDs. let mut previous_certificate_ids = IndexSet::new(); diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index 82531518e3..3801498a30 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -47,6 +47,8 @@ pub struct BatchHeader { } impl BatchHeader { + /// The maximum number of certificates in a batch. + pub const MAX_CERTIFICATES: usize = 200; /// The maximum number of solutions in a batch. pub const MAX_SOLUTIONS: usize = N::MAX_SOLUTIONS; /// The maximum number of transactions in a batch. diff --git a/ledger/narwhal/subdag/Cargo.toml b/ledger/narwhal/subdag/Cargo.toml index 9c7a419043..7c0a5b676a 100644 --- a/ledger/narwhal/subdag/Cargo.toml +++ b/ledger/narwhal/subdag/Cargo.toml @@ -39,6 +39,11 @@ package = "snarkvm-ledger-narwhal-batch-certificate" path = "../batch-certificate" version = "=0.16.8" +[dependencies.narwhal-batch-header] +package = "snarkvm-ledger-narwhal-batch-header" +path = "../batch-header" +version = "=0.16.8" + [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" diff --git a/ledger/narwhal/subdag/src/bytes.rs b/ledger/narwhal/subdag/src/bytes.rs index e332527c50..d4ed42913b 100644 --- a/ledger/narwhal/subdag/src/bytes.rs +++ b/ledger/narwhal/subdag/src/bytes.rs @@ -21,14 +21,14 @@ impl FromBytes for Subdag { let version = u8::read_le(&mut reader)?; // Ensure the version is valid. if version != 1 { - return Err(error("Invalid batch version")); + return Err(error(format!("Invalid subdag version ({version})"))); } // Read the number of rounds. let num_rounds = u32::read_le(&mut reader)?; // Ensure the number of rounds is within bounds. - if num_rounds > i32::MAX as u32 { - return Err(error("Number of rounds exceeds maximum")); + if num_rounds as usize > Self::MAX_ROUNDS { + return Err(error(format!("Number of rounds ({num_rounds}) exceeds the maximum ({})", Self::MAX_ROUNDS))); } // Read the round certificates. let mut subdag = BTreeMap::new(); @@ -38,8 +38,11 @@ impl FromBytes for Subdag { // Read the number of certificates. let num_certificates = u32::read_le(&mut reader)?; // Ensure the number of certificates is within bounds. - if num_certificates > i32::MAX as u32 { - return Err(error("Number of certificates exceeds maximum")); + if num_certificates as usize > BatchHeader::::MAX_CERTIFICATES { + return Err(error(format!( + "Number of certificates ({num_certificates}) exceeds the maximum ({})", + BatchHeader::::MAX_CERTIFICATES + ))); } // Read the certificates. let mut certificates = IndexSet::new(); @@ -51,7 +54,7 @@ impl FromBytes for Subdag { subdag.insert(round, certificates); } // Return the subdag. - Self::from(subdag).map_err(|e| error(e.to_string())) + Self::from(subdag).map_err(error) } } @@ -61,13 +64,13 @@ impl ToBytes for Subdag { // Write the version. 1u8.write_le(&mut writer)?; // Write the number of rounds. - u32::try_from(self.subdag.len()).map_err(|e| error(e.to_string()))?.write_le(&mut writer)?; + u32::try_from(self.subdag.len()).map_err(error)?.write_le(&mut writer)?; // Write the round certificates. for (round, certificates) in &self.subdag { // Write the round. round.write_le(&mut writer)?; // Write the number of certificates. - u32::try_from(certificates.len()).map_err(|e| error(e.to_string()))?.write_le(&mut writer)?; + u32::try_from(certificates.len()).map_err(error)?.write_le(&mut writer)?; // Write the certificates. for certificate in certificates { // Write the certificate. diff --git a/ledger/narwhal/subdag/src/lib.rs b/ledger/narwhal/subdag/src/lib.rs index beafc19639..8fb93cfe9b 100644 --- a/ledger/narwhal/subdag/src/lib.rs +++ b/ledger/narwhal/subdag/src/lib.rs @@ -21,6 +21,7 @@ mod string; use console::{account::Address, prelude::*, program::SUBDAG_CERTIFICATES_DEPTH, types::Field}; use narwhal_batch_certificate::BatchCertificate; +use narwhal_batch_header::BatchHeader; use narwhal_transmission_id::TransmissionID; use indexmap::IndexSet; @@ -101,6 +102,11 @@ impl Subdag { } } +impl Subdag { + /// The maximum number of rounds in a subdag (bounded up to GC depth). + pub const MAX_ROUNDS: usize = 50; +} + impl Subdag { /// Returns the anchor round. pub fn anchor_round(&self) -> u64 { From 3e4717bf78670b8d79b53ecfc30dc4906c3c43c2 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Thu, 9 Nov 2023 18:07:50 -0800 Subject: [PATCH 116/339] Add size format --- utilities/src/bytes.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utilities/src/bytes.rs b/utilities/src/bytes.rs index 49bf493440..9a7ba1d824 100644 --- a/utilities/src/bytes.rs +++ b/utilities/src/bytes.rs @@ -145,9 +145,9 @@ impl<'de, T: FromBytes> FromBytesDeserializer { false => (size_b, size_a), }; - // Ensure size_b is within bounds. + // Ensure 'size_b' is within bounds. if size_b > i32::MAX as usize { - return Err(D::Error::custom("size_b exceeds maximum")); + return Err(D::Error::custom(format!("size_b ({size_b}) exceeds maximum"))); } // Reserve a new `Vec` with the larger size capacity. From 94c53c578b4a26dc09ed054af9e2c031a7d72ba5 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Thu, 9 Nov 2023 18:54:52 -0800 Subject: [PATCH 117/339] chore(snarkvm): bump version for new release --- .cargo/release-version | 2 +- Cargo.lock | 118 ++++++++++---------- Cargo.toml | 22 ++-- algorithms/Cargo.toml | 12 +- algorithms/cuda/Cargo.toml | 2 +- circuit/Cargo.toml | 16 +-- circuit/account/Cargo.toml | 10 +- circuit/algorithms/Cargo.toml | 8 +- circuit/collections/Cargo.toml | 8 +- circuit/environment/Cargo.toml | 14 +-- circuit/environment/witness/Cargo.toml | 2 +- circuit/network/Cargo.toml | 10 +- circuit/program/Cargo.toml | 16 +-- circuit/types/Cargo.toml | 18 +-- circuit/types/address/Cargo.toml | 14 +-- circuit/types/boolean/Cargo.toml | 6 +- circuit/types/field/Cargo.toml | 8 +- circuit/types/group/Cargo.toml | 12 +- circuit/types/integers/Cargo.toml | 12 +- circuit/types/scalar/Cargo.toml | 10 +- circuit/types/string/Cargo.toml | 12 +- console/Cargo.toml | 14 +-- console/account/Cargo.toml | 6 +- console/algorithms/Cargo.toml | 8 +- console/collections/Cargo.toml | 6 +- console/network/Cargo.toml | 20 ++-- console/network/environment/Cargo.toml | 8 +- console/program/Cargo.toml | 14 +-- console/types/Cargo.toml | 18 +-- console/types/address/Cargo.toml | 10 +- console/types/boolean/Cargo.toml | 4 +- console/types/field/Cargo.toml | 6 +- console/types/group/Cargo.toml | 10 +- console/types/integers/Cargo.toml | 10 +- console/types/scalar/Cargo.toml | 8 +- console/types/string/Cargo.toml | 10 +- curves/Cargo.toml | 6 +- fields/Cargo.toml | 4 +- ledger/Cargo.toml | 22 ++-- ledger/authority/Cargo.toml | 6 +- ledger/block/Cargo.toml | 18 +-- ledger/coinbase/Cargo.toml | 14 +-- ledger/committee/Cargo.toml | 4 +- ledger/narwhal/Cargo.toml | 14 +-- ledger/narwhal/batch-certificate/Cargo.toml | 8 +- ledger/narwhal/batch-header/Cargo.toml | 6 +- ledger/narwhal/data/Cargo.toml | 4 +- ledger/narwhal/subdag/Cargo.toml | 10 +- ledger/narwhal/transmission-id/Cargo.toml | 6 +- ledger/narwhal/transmission/Cargo.toml | 10 +- ledger/query/Cargo.toml | 8 +- ledger/store/Cargo.toml | 18 +-- ledger/test-helpers/Cargo.toml | 16 +-- parameters/Cargo.toml | 6 +- synthesizer/Cargo.toml | 24 ++-- synthesizer/process/Cargo.toml | 16 +-- synthesizer/program/Cargo.toml | 6 +- synthesizer/snark/Cargo.toml | 8 +- utilities/Cargo.toml | 4 +- utilities/derives/Cargo.toml | 2 +- wasm/Cargo.toml | 12 +- 61 files changed, 368 insertions(+), 368 deletions(-) diff --git a/.cargo/release-version b/.cargo/release-version index 056027557e..2f79d75630 100644 --- a/.cargo/release-version +++ b/.cargo/release-version @@ -1 +1 @@ -v0.16.8 \ No newline at end of file +v0.16.9 \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 38e1ebd741..94c08e8145 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2473,7 +2473,7 @@ dependencies = [ [[package]] name = "snarkvm" -version = "0.16.8" +version = "0.16.9" dependencies = [ "anstyle", "anyhow", @@ -2508,7 +2508,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms" -version = "0.16.8" +version = "0.16.9" dependencies = [ "aleo-std", "anyhow", @@ -2547,7 +2547,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms-cuda" -version = "0.16.8" +version = "0.16.9" dependencies = [ "blst", "cc", @@ -2557,7 +2557,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit" -version = "0.16.8" +version = "0.16.9" dependencies = [ "snarkvm-circuit-account", "snarkvm-circuit-algorithms", @@ -2570,7 +2570,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-account" -version = "0.16.8" +version = "0.16.9" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2582,7 +2582,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-algorithms" -version = "0.16.8" +version = "0.16.9" dependencies = [ "anyhow", "snarkvm-circuit-types", @@ -2594,7 +2594,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-collections" -version = "0.16.8" +version = "0.16.9" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2608,7 +2608,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment" -version = "0.16.8" +version = "0.16.9" dependencies = [ "criterion", "indexmap 2.0.2", @@ -2629,11 +2629,11 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment-witness" -version = "0.16.8" +version = "0.16.9" [[package]] name = "snarkvm-circuit-network" -version = "0.16.8" +version = "0.16.9" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-collections", @@ -2644,7 +2644,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-program" -version = "0.16.8" +version = "0.16.9" dependencies = [ "anyhow", "paste", @@ -2662,7 +2662,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types" -version = "0.16.8" +version = "0.16.9" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-address", @@ -2677,7 +2677,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-address" -version = "0.16.8" +version = "0.16.9" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2689,7 +2689,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-boolean" -version = "0.16.8" +version = "0.16.9" dependencies = [ "criterion", "snarkvm-circuit-environment", @@ -2698,7 +2698,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-field" -version = "0.16.8" +version = "0.16.9" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2707,7 +2707,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-group" -version = "0.16.8" +version = "0.16.9" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2719,7 +2719,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-integers" -version = "0.16.8" +version = "0.16.9" dependencies = [ "paste", "snarkvm-circuit-environment", @@ -2732,7 +2732,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-scalar" -version = "0.16.8" +version = "0.16.9" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2742,7 +2742,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-string" -version = "0.16.8" +version = "0.16.9" dependencies = [ "rand", "snarkvm-circuit-environment", @@ -2755,7 +2755,7 @@ dependencies = [ [[package]] name = "snarkvm-console" -version = "0.16.8" +version = "0.16.9" dependencies = [ "snarkvm-console-account", "snarkvm-console-algorithms", @@ -2767,7 +2767,7 @@ dependencies = [ [[package]] name = "snarkvm-console-account" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "bs58", @@ -2780,7 +2780,7 @@ dependencies = [ [[package]] name = "snarkvm-console-algorithms" -version = "0.16.8" +version = "0.16.9" dependencies = [ "blake2s_simd", "criterion", @@ -2798,7 +2798,7 @@ dependencies = [ [[package]] name = "snarkvm-console-collections" -version = "0.16.8" +version = "0.16.9" dependencies = [ "aleo-std", "criterion", @@ -2811,7 +2811,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network" -version = "0.16.8" +version = "0.16.9" dependencies = [ "anyhow", "indexmap 2.0.2", @@ -2833,7 +2833,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network-environment" -version = "0.16.8" +version = "0.16.9" dependencies = [ "anyhow", "bech32", @@ -2850,7 +2850,7 @@ dependencies = [ [[package]] name = "snarkvm-console-program" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "enum_index", @@ -2871,7 +2871,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types" -version = "0.16.8" +version = "0.16.9" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-address", @@ -2885,7 +2885,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-address" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "serde_json", @@ -2897,7 +2897,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-boolean" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "serde_json", @@ -2906,7 +2906,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-field" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "serde_json", @@ -2917,7 +2917,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-group" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "serde_json", @@ -2929,7 +2929,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-integers" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "serde_json", @@ -2941,7 +2941,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-scalar" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "serde_json", @@ -2953,7 +2953,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-string" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "serde_json", @@ -2965,7 +2965,7 @@ dependencies = [ [[package]] name = "snarkvm-curves" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "criterion", @@ -2980,7 +2980,7 @@ dependencies = [ [[package]] name = "snarkvm-fields" -version = "0.16.8" +version = "0.16.9" dependencies = [ "aleo-std", "anyhow", @@ -2997,7 +2997,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger" -version = "0.16.8" +version = "0.16.9" dependencies = [ "aleo-std", "anyhow", @@ -3024,7 +3024,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-authority" -version = "0.16.8" +version = "0.16.9" dependencies = [ "anyhow", "bincode", @@ -3037,7 +3037,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-block" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3061,7 +3061,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-coinbase" -version = "0.16.8" +version = "0.16.9" dependencies = [ "aleo-std", "anyhow", @@ -3082,7 +3082,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-committee" -version = "0.16.8" +version = "0.16.9" dependencies = [ "anyhow", "bincode", @@ -3102,7 +3102,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal" -version = "0.16.8" +version = "0.16.9" dependencies = [ "snarkvm-ledger-narwhal", "snarkvm-ledger-narwhal-batch-certificate", @@ -3115,7 +3115,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3128,7 +3128,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3141,7 +3141,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-data" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bytes", "serde_json", @@ -3151,7 +3151,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3166,7 +3166,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "bytes", @@ -3179,7 +3179,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "serde_json", @@ -3189,7 +3189,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-query" -version = "0.16.8" +version = "0.16.9" dependencies = [ "async-trait", "reqwest", @@ -3201,7 +3201,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-store" -version = "0.16.8" +version = "0.16.9" dependencies = [ "aleo-std", "anyhow", @@ -3229,7 +3229,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-test-helpers" -version = "0.16.8" +version = "0.16.9" dependencies = [ "once_cell", "snarkvm-circuit", @@ -3243,7 +3243,7 @@ dependencies = [ [[package]] name = "snarkvm-parameters" -version = "0.16.8" +version = "0.16.9" dependencies = [ "aleo-std", "anyhow", @@ -3275,7 +3275,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer" -version = "0.16.8" +version = "0.16.9" dependencies = [ "aleo-std", "anyhow", @@ -3306,7 +3306,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-process" -version = "0.16.8" +version = "0.16.9" dependencies = [ "aleo-std", "bincode", @@ -3331,7 +3331,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-program" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "criterion", @@ -3347,7 +3347,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-snark" -version = "0.16.8" +version = "0.16.9" dependencies = [ "bincode", "colored", @@ -3360,7 +3360,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities" -version = "0.16.8" +version = "0.16.9" dependencies = [ "aleo-std", "anyhow", @@ -3380,7 +3380,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities-derives" -version = "0.16.8" +version = "0.16.9" dependencies = [ "proc-macro2", "quote 1.0.33", @@ -3389,7 +3389,7 @@ dependencies = [ [[package]] name = "snarkvm-wasm" -version = "0.16.8" +version = "0.16.9" dependencies = [ "getrandom", "rand", diff --git a/Cargo.toml b/Cargo.toml index 8210374213..784bbce22e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "A decentralized virtual machine" homepage = "https://aleo.org" @@ -146,53 +146,53 @@ wasm = [ "snarkvm-wasm" ] [dependencies.snarkvm-algorithms] path = "./algorithms" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-circuit] path = "./circuit" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-console] path = "./console" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-curves] path = "./curves" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-fields] path = "./fields" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-ledger] path = "./ledger" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-parameters] path = "./parameters" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-synthesizer] path = "./synthesizer" -version = "=0.16.8" +version = "=0.16.9" default-features = false optional = true [dependencies.snarkvm-utilities] path = "./utilities" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-wasm] path = "./wasm" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.anstyle] diff --git a/algorithms/Cargo.toml b/algorithms/Cargo.toml index c1ad71b00f..e058f52d22 100644 --- a/algorithms/Cargo.toml +++ b/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Algorithms for a decentralized virtual machine" homepage = "https://aleo.org" @@ -47,27 +47,27 @@ required-features = [ "test" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.snarkvm-parameters] path = "../parameters" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.snarkvm-algorithms-cuda] path = "./cuda" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.aleo-std] diff --git a/algorithms/cuda/Cargo.toml b/algorithms/cuda/Cargo.toml index 209412674e..b185d5fe98 100644 --- a/algorithms/cuda/Cargo.toml +++ b/algorithms/cuda/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms-cuda" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Cuda optimizations for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/circuit/Cargo.toml b/circuit/Cargo.toml index 019db086bd..0a918b5c9f 100644 --- a/circuit/Cargo.toml +++ b/circuit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Circuits for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,28 +25,28 @@ edition = "2021" [dependencies.snarkvm-circuit-account] path = "./account" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-algorithms] path = "./algorithms" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-collections] path = "./collections" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-environment] path = "./environment" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-network] path = "./network" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-program] path = "./program" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types] path = "./types" -version = "=0.16.8" +version = "=0.16.9" diff --git a/circuit/account/Cargo.toml b/circuit/account/Cargo.toml index fde3b8e055..632707808f 100644 --- a/circuit/account/Cargo.toml +++ b/circuit/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-account" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Account circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-account" path = "../../console/account" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.8" +version = "=0.16.9" [dev-dependencies.snarkvm-utilities] path = "../../utilities" diff --git a/circuit/algorithms/Cargo.toml b/circuit/algorithms/Cargo.toml index dd0a870a8c..b43fc9d9f8 100644 --- a/circuit/algorithms/Cargo.toml +++ b/circuit/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-algorithms" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Algorithm circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-algorithms" path = "../../console/algorithms" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dev-dependencies.anyhow] diff --git a/circuit/collections/Cargo.toml b/circuit/collections/Cargo.toml index f1c386810f..1bc1dde6c3 100644 --- a/circuit/collections/Cargo.toml +++ b/circuit/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-collections" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Collections circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-collections" path = "../../console/collections" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.8" +version = "=0.16.9" [dev-dependencies.snarkvm-circuit-network] path = "../network" diff --git a/circuit/environment/Cargo.toml b/circuit/environment/Cargo.toml index 2e17789ae1..510221b50e 100644 --- a/circuit/environment/Cargo.toml +++ b/circuit/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Circuit environment for a decentralized virtual machine" license = "Apache-2.0" @@ -14,32 +14,32 @@ harness = false [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.8" +version = "=0.16.9" default-features = false features = [ "r1cs" ] [dependencies.snarkvm-circuit-environment-witness] path = "./witness" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.indexmap] diff --git a/circuit/environment/witness/Cargo.toml b/circuit/environment/witness/Cargo.toml index a17d88385e..7bef0bb0f5 100644 --- a/circuit/environment/witness/Cargo.toml +++ b/circuit/environment/witness/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment-witness" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "A procedural macro to construct a witness in an environment" license = "Apache-2.0" diff --git a/circuit/network/Cargo.toml b/circuit/network/Cargo.toml index 60d20ef5bf..ec8c667568 100644 --- a/circuit/network/Cargo.toml +++ b/circuit/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-network" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Network circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.8" +version = "=0.16.9" [dev-dependencies.snarkvm-console-types] path = "../../console/types" diff --git a/circuit/program/Cargo.toml b/circuit/program/Cargo.toml index 093b4e3f81..3a84b4d718 100644 --- a/circuit/program/Cargo.toml +++ b/circuit/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-program" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Program circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,32 +9,32 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-program" path = "../../console/program" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-circuit-account] path = "../account" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.8" +version = "=0.16.9" [dependencies.paste] version = "1.0" diff --git a/circuit/types/Cargo.toml b/circuit/types/Cargo.toml index 21e12f72d7..f4e4331c04 100644 --- a/circuit/types/Cargo.toml +++ b/circuit/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Primitive circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -8,35 +8,35 @@ edition = "2021" [dependencies.snarkvm-circuit-environment] path = "../environment" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-address] path = "./address" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-boolean] path = "./boolean" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-field] path = "./field" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-group] path = "./group" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-integers] path = "./integers" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-scalar] path = "./scalar" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-string] path = "./string" -version = "=0.16.8" +version = "=0.16.9" [dev-dependencies.console] package = "snarkvm-console" diff --git a/circuit/types/address/Cargo.toml b/circuit/types/address/Cargo.toml index 9ada56377e..3ea8252092 100644 --- a/circuit/types/address/Cargo.toml +++ b/circuit/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-address" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Address circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,28 +9,28 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-address" path = "../../../console/types/address" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-group] path = "../group" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.8" +version = "=0.16.9" [features] default = [ "enable_console" ] diff --git a/circuit/types/boolean/Cargo.toml b/circuit/types/boolean/Cargo.toml index ae4efa8db7..494bbfa84f 100644 --- a/circuit/types/boolean/Cargo.toml +++ b/circuit/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-boolean" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Boolean circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -14,12 +14,12 @@ harness = false [dependencies.console] package = "snarkvm-console-types-boolean" path = "../../../console/types/boolean" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.8" +version = "=0.16.9" [dev-dependencies.criterion] version = "0.5" diff --git a/circuit/types/field/Cargo.toml b/circuit/types/field/Cargo.toml index a945013c23..22b0562265 100644 --- a/circuit/types/field/Cargo.toml +++ b/circuit/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-field" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Field circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-field" path = "../../../console/types/field" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.8" +version = "=0.16.9" [features] default = [ "enable_console" ] diff --git a/circuit/types/group/Cargo.toml b/circuit/types/group/Cargo.toml index 61b1443b9c..858273fbfa 100644 --- a/circuit/types/group/Cargo.toml +++ b/circuit/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-group" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Group circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-group" path = "../../../console/types/group" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.8" +version = "=0.16.9" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/integers/Cargo.toml b/circuit/types/integers/Cargo.toml index df75835a08..22d2dbeec3 100644 --- a/circuit/types/integers/Cargo.toml +++ b/circuit/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-integers" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Integer circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-integers" path = "../../../console/types/integers" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.8" +version = "=0.16.9" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/scalar/Cargo.toml b/circuit/types/scalar/Cargo.toml index d9e6fa669e..c17522b316 100644 --- a/circuit/types/scalar/Cargo.toml +++ b/circuit/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-scalar" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Scalar circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-scalar" path = "../../../console/types/scalar" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.8" +version = "=0.16.9" [features] default = [ "enable_console" ] diff --git a/circuit/types/string/Cargo.toml b/circuit/types/string/Cargo.toml index ec4473d42f..f822755993 100644 --- a/circuit/types/string/Cargo.toml +++ b/circuit/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-string" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "String circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-string" path = "../../../console/types/string" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-circuit-types-integers] path = "../integers" -version = "=0.16.8" +version = "=0.16.9" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/console/Cargo.toml b/console/Cargo.toml index 593f82ae99..4438abba11 100644 --- a/console/Cargo.toml +++ b/console/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Console environment for a decentralized virtual machine" license = "Apache-2.0" @@ -8,32 +8,32 @@ edition = "2021" [dependencies.snarkvm-console-account] path = "./account" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-console-algorithms] path = "./algorithms" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-console-collections] path = "./collections" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-console-network] path = "./network" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-console-program] path = "./program" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-console-types] path = "./types" -version = "=0.16.8" +version = "=0.16.9" optional = true [features] diff --git a/console/account/Cargo.toml b/console/account/Cargo.toml index 8da6d89973..46e3425f6e 100644 --- a/console/account/Cargo.toml +++ b/console/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-account" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Account operations for a decentralized virtual machine" license = "Apache-2.0" @@ -13,11 +13,11 @@ harness = false [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.8" +version = "=0.16.9" default-features = false features = [ "address", "boolean", "field", "group", "scalar" ] diff --git a/console/algorithms/Cargo.toml b/console/algorithms/Cargo.toml index 821e2dc48a..75760a914d 100644 --- a/console/algorithms/Cargo.toml +++ b/console/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-algorithms" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Console algorithms for a decentralized virtual machine" license = "Apache-2.0" @@ -23,18 +23,18 @@ harness = false [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.8" +version = "=0.16.9" default-features = false features = [ "field", "group", "integers", "scalar" ] [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.8" +version = "=0.16.9" [dependencies.blake2s_simd] version = "1.0" diff --git a/console/collections/Cargo.toml b/console/collections/Cargo.toml index 62823110bb..d8962023a5 100644 --- a/console/collections/Cargo.toml +++ b/console/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-collections" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Collections for a decentralized virtual machine" license = "Apache-2.0" @@ -18,11 +18,11 @@ harness = false [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.8" +version = "=0.16.9" default-features = false features = [ "field", "integers" ] diff --git a/console/network/Cargo.toml b/console/network/Cargo.toml index 7cab8763c6..a2a53cb3d8 100644 --- a/console/network/Cargo.toml +++ b/console/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Network console library for a decentralized virtual machine" license = "Apache-2.0" @@ -15,45 +15,45 @@ wasm = [ [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.8" +version = "=0.16.9" default-features = false features = [ "snark" ] [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-network-environment] path = "./environment" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.8" +version = "=0.16.9" default-features = false features = [ "field", "group", "scalar" ] [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.snarkvm-parameters] path = "../../parameters" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.8" +version = "=0.16.9" [dependencies.anyhow] version = "1.0.73" diff --git a/console/network/environment/Cargo.toml b/console/network/environment/Cargo.toml index b89109bf47..fffb5f0377 100644 --- a/console/network/environment/Cargo.toml +++ b/console/network/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network-environment" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Environment console library for a decentralized virtual machine" license = "Apache-2.0" @@ -8,17 +8,17 @@ edition = "2021" [dependencies.snarkvm-curves] path = "../../../curves" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.snarkvm-fields] path = "../../../fields" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.snarkvm-utilities] path = "../../../utilities" -version = "=0.16.8" +version = "=0.16.9" [dependencies.anyhow] version = "1.0.73" diff --git a/console/program/Cargo.toml b/console/program/Cargo.toml index 57128a1a01..035281e8c4 100644 --- a/console/program/Cargo.toml +++ b/console/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-program" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Program operations for a decentralized virtual machine" license = "Apache-2.0" @@ -12,27 +12,27 @@ test = [ ] [dependencies.snarkvm-console-account] path = "../account" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.8" +version = "=0.16.9" [dependencies.enum_index] version = "0.2" diff --git a/console/types/Cargo.toml b/console/types/Cargo.toml index fc06b06d37..75a6939384 100644 --- a/console/types/Cargo.toml +++ b/console/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Console types for a decentralized virtual machine" license = "Apache-2.0" @@ -8,41 +8,41 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../network/environment" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types-address] path = "./address" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-console-types-boolean] path = "./boolean" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-console-types-field] path = "./field" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-console-types-group] path = "./group" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-console-types-integers] path = "./integers" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-console-types-scalar] path = "./scalar" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-console-types-string] path = "./string" -version = "=0.16.8" +version = "=0.16.9" optional = true [features] diff --git a/console/types/address/Cargo.toml b/console/types/address/Cargo.toml index d9cc0fa324..b4d7980109 100644 --- a/console/types/address/Cargo.toml +++ b/console/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-address" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types-group] path = "../group" -version = "=0.16.8" +version = "=0.16.9" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/boolean/Cargo.toml b/console/types/boolean/Cargo.toml index aea50019d9..1d734603d6 100644 --- a/console/types/boolean/Cargo.toml +++ b/console/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-boolean" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,7 +8,7 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.8" +version = "=0.16.9" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/field/Cargo.toml b/console/types/field/Cargo.toml index b1ccbb03c6..ae899d5067 100644 --- a/console/types/field/Cargo.toml +++ b/console/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-field" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,11 +8,11 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.8" +version = "=0.16.9" [dependencies.zeroize] version = "1" diff --git a/console/types/group/Cargo.toml b/console/types/group/Cargo.toml index 1861f13d6b..361cca59f4 100644 --- a/console/types/group/Cargo.toml +++ b/console/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-group" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.8" +version = "=0.16.9" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/integers/Cargo.toml b/console/types/integers/Cargo.toml index 342a4cb6f7..c5001a99c4 100644 --- a/console/types/integers/Cargo.toml +++ b/console/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-integers" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.8" +version = "=0.16.9" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/scalar/Cargo.toml b/console/types/scalar/Cargo.toml index 441ddf2602..42968b9afb 100644 --- a/console/types/scalar/Cargo.toml +++ b/console/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-scalar" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,15 +8,15 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.8" +version = "=0.16.9" [dependencies.zeroize] version = "1" diff --git a/console/types/string/Cargo.toml b/console/types/string/Cargo.toml index 4cd84c31de..3a17b14609 100644 --- a/console/types/string/Cargo.toml +++ b/console/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-string" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-console-types-integers] path = "../integers" -version = "=0.16.8" +version = "=0.16.9" [dev-dependencies.bincode] version = "1.3" diff --git a/curves/Cargo.toml b/curves/Cargo.toml index a324ae8bda..540cb32a06 100644 --- a/curves/Cargo.toml +++ b/curves/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-curves" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Curves for a decentralized virtual machine" homepage = "https://aleo.org" @@ -36,12 +36,12 @@ harness = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.rand] diff --git a/fields/Cargo.toml b/fields/Cargo.toml index 68fe8366e0..81365cc3a4 100644 --- a/fields/Cargo.toml +++ b/fields/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-fields" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Fields for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.aleo-std] diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index 53a67ce1c7..0a556a7a64 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "A node ledger for a decentralized virtual machine" homepage = "https://aleo.org" @@ -56,54 +56,54 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "./authority" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "./block" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "./coinbase" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "./committee" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-narwhal] package = "snarkvm-ledger-narwhal" path = "./narwhal" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "./query" -version = "=0.16.8" +version = "=0.16.9" features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "./store" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-test-helpers] package = "snarkvm-ledger-test-helpers" path = "./test-helpers" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.synthesizer] package = "snarkvm-synthesizer" path = "../synthesizer" -version = "=0.16.8" +version = "=0.16.9" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/authority/Cargo.toml b/ledger/authority/Cargo.toml index 8402685070..f046294032 100644 --- a/ledger/authority/Cargo.toml +++ b/ledger/authority/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-authority" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Data structures for a block authority in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-subdag/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.8" +version = "=0.16.9" [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.8" +version = "=0.16.9" [dependencies.anyhow] version = "1" diff --git a/ledger/block/Cargo.toml b/ledger/block/Cargo.toml index 6ce4e1497e..cd03e139f5 100644 --- a/ledger/block/Cargo.toml +++ b/ledger/block/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-block" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "A block for a decentralized virtual machine" homepage = "https://aleo.org" @@ -39,42 +39,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../ledger/coinbase" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../../ledger/committee" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../narwhal/transmission-id" -version = "=0.16.8" +version = "=0.16.9" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.8" +version = "=0.16.9" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.8" +version = "=0.16.9" [dependencies.indexmap] version = "2.0" diff --git a/ledger/coinbase/Cargo.toml b/ledger/coinbase/Cargo.toml index 294b9aa1d1..a6292929e2 100644 --- a/ledger/coinbase/Cargo.toml +++ b/ledger/coinbase/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-coinbase" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Coinbase puzzle for a decentralized virtual machine" homepage = "https://aleo.org" @@ -50,27 +50,27 @@ wasm = [ [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-synthesizer-snark] path = "../../synthesizer/snark" -version = "=0.16.8" +version = "=0.16.9" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.aleo-std] diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index a7ae50f51b..c32b70f8b2 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-committee" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "A committee for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,7 +33,7 @@ test-helpers = [ "prop-tests", "rand_distr" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.8" +version = "=0.16.9" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/Cargo.toml b/ledger/narwhal/Cargo.toml index 44ea8eb833..5db93a32f9 100644 --- a/ledger/narwhal/Cargo.toml +++ b/ledger/narwhal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Data structures for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -64,37 +64,37 @@ transmission-id = [ "narwhal-transmission-id" ] [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "./batch-certificate" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "./batch-header" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "./data" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "./subdag" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.narwhal-transmission] package = "snarkvm-ledger-narwhal-transmission" path = "./transmission" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "./transmission-id" -version = "=0.16.8" +version = "=0.16.9" optional = true [dev-dependencies.snarkvm-ledger-narwhal] diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index 4588f263fe..0fc9354bf2 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-header/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.8" +version = "=0.16.9" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.8" +version = "=0.16.9" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.8" +version = "=0.16.9" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/batch-header/Cargo.toml b/ledger/narwhal/batch-header/Cargo.toml index e314b41cb2..5498c128df 100644 --- a/ledger/narwhal/batch-header/Cargo.toml +++ b/ledger/narwhal/batch-header/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "A batch header for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-transmission-id/test-helpers", "time" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.8" +version = "=0.16.9" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.8" +version = "=0.16.9" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/data/Cargo.toml b/ledger/narwhal/data/Cargo.toml index b7e5dd6218..023ed920b0 100644 --- a/ledger/narwhal/data/Cargo.toml +++ b/ledger/narwhal/data/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-data" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -29,7 +29,7 @@ async = [ "tokio" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.8" +version = "=0.16.9" [dependencies.bytes] version = "1" diff --git a/ledger/narwhal/subdag/Cargo.toml b/ledger/narwhal/subdag/Cargo.toml index 7c0a5b676a..627d57d9c1 100644 --- a/ledger/narwhal/subdag/Cargo.toml +++ b/ledger/narwhal/subdag/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "A subdag for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ "narwhal-batch-certificate/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.8" +version = "=0.16.9" [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../batch-certificate" -version = "=0.16.8" +version = "=0.16.9" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.8" +version = "=0.16.9" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.8" +version = "=0.16.9" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/transmission-id/Cargo.toml b/ledger/narwhal/transmission-id/Cargo.toml index 2122469f7b..403817fa1a 100644 --- a/ledger/narwhal/transmission-id/Cargo.toml +++ b/ledger/narwhal/transmission-id/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "A transmission ID for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.8" +version = "=0.16.9" [dev-dependencies.bincode] version = "1.3" diff --git a/ledger/narwhal/transmission/Cargo.toml b/ledger/narwhal/transmission/Cargo.toml index 100f0c4e41..53b49d6eab 100644 --- a/ledger/narwhal/transmission/Cargo.toml +++ b/ledger/narwhal/transmission/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "A transmission for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../block" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "../data" -version = "=0.16.8" +version = "=0.16.9" [dependencies.bytes] version = "1" diff --git a/ledger/query/Cargo.toml b/ledger/query/Cargo.toml index 71165584c4..5a436c8502 100644 --- a/ledger/query/Cargo.toml +++ b/ledger/query/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-query" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "A query for a decentralized virtual machine" homepage = "https://aleo.org" @@ -30,18 +30,18 @@ query = [ "ledger-store", "synthesizer-program", "ureq" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.async-trait] diff --git a/ledger/store/Cargo.toml b/ledger/store/Cargo.toml index 4e87fd1201..ca6c512d23 100644 --- a/ledger/store/Cargo.toml +++ b/ledger/store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-store" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "A data store for a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,42 +32,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../coinbase" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../committee" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../narwhal/batch-certificate" -version = "=0.16.8" +version = "=0.16.9" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.8" +version = "=0.16.9" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.8" +version = "=0.16.9" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/test-helpers/Cargo.toml b/ledger/test-helpers/Cargo.toml index 6aacab6192..491d7e2e36 100644 --- a/ledger/test-helpers/Cargo.toml +++ b/ledger/test-helpers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-test-helpers" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Test helpers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -19,39 +19,39 @@ edition = "2021" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.8" +version = "=0.16.9" [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../query" -version = "=0.16.8" +version = "=0.16.9" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.8" +version = "=0.16.9" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.8" +version = "=0.16.9" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "../../synthesizer/process" -version = "=0.16.8" +version = "=0.16.9" [dependencies.once_cell] version = "1.18" diff --git a/parameters/Cargo.toml b/parameters/Cargo.toml index 83df89f12c..67527e8515 100644 --- a/parameters/Cargo.toml +++ b/parameters/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-parameters" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Parameters for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "encoding", "js-sys", "web-sys" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.8" +version = "=0.16.9" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/Cargo.toml b/synthesizer/Cargo.toml index bdd18dee36..eb49845932 100644 --- a/synthesizer/Cargo.toml +++ b/synthesizer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Synthesizer for a decentralized virtual machine" homepage = "https://aleo.org" @@ -68,61 +68,61 @@ harness = false [dependencies.algorithms] package = "snarkvm-algorithms" path = "../algorithms" -version = "=0.16.8" +version = "=0.16.9" [dependencies.circuit] package = "snarkvm-circuit" path = "../circuit" -version = "=0.16.8" +version = "=0.16.9" [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../ledger/block" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../ledger/coinbase" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../ledger/committee" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../ledger/query" -version = "=0.16.8" +version = "=0.16.9" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../ledger/store" -version = "=0.16.8" +version = "=0.16.9" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "./process" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "./program" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "./snark" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.aleo-std] diff --git a/synthesizer/process/Cargo.toml b/synthesizer/process/Cargo.toml index 7f05bd688d..d15c44421e 100644 --- a/synthesizer/process/Cargo.toml +++ b/synthesizer/process/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-process" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "A process for a decentralized virtual machine" homepage = "https://aleo.org" @@ -48,40 +48,40 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.8" +version = "=0.16.9" default-features = false features = [ "network", "program", "types" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../ledger/block" -version = "=0.16.8" +version = "=0.16.9" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../../ledger/query" -version = "=0.16.8" +version = "=0.16.9" default-features = false [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../../ledger/store" -version = "=0.16.8" +version = "=0.16.9" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.8" +version = "=0.16.9" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.8" +version = "=0.16.9" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/program/Cargo.toml b/synthesizer/program/Cargo.toml index 2ddc6ddb73..57afe2043f 100644 --- a/synthesizer/program/Cargo.toml +++ b/synthesizer/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-program" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Program for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "console/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.8" +version = "=0.16.9" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.8" +version = "=0.16.9" default-features = false features = [ "account", "network", "program", "types" ] diff --git a/synthesizer/snark/Cargo.toml b/synthesizer/snark/Cargo.toml index 64ebc7190d..1fc172f014 100644 --- a/synthesizer/snark/Cargo.toml +++ b/synthesizer/snark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-snark" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "SNARK wrappers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,18 +33,18 @@ wasm = [ "console/wasm", "snarkvm-algorithms/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.8" +version = "=0.16.9" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.8" +version = "=0.16.9" default-features = false features = [ "network" ] [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.8" +version = "=0.16.9" [dependencies.bincode] version = "1" diff --git a/utilities/Cargo.toml b/utilities/Cargo.toml index 53fb9081b9..6b569d6dd0 100644 --- a/utilities/Cargo.toml +++ b/utilities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Utilities for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities-derives] path = "./derives" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.aleo-std] diff --git a/utilities/derives/Cargo.toml b/utilities/derives/Cargo.toml index a936201c6b..cc0a41a12e 100644 --- a/utilities/derives/Cargo.toml +++ b/utilities/derives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities-derives" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "Canonical serialization for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 619c54abf9..854221d4f8 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-wasm" -version = "0.16.8" +version = "0.16.9" authors = [ "The Aleo Team " ] description = "WASM for a decentralized virtual machine" homepage = "https://aleo.org" @@ -28,30 +28,30 @@ crate-type = [ "cdylib", "rlib" ] [dependencies.snarkvm-console] path = "../console" -version = "=0.16.8" +version = "=0.16.9" features = [ "wasm" ] optional = true [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.8" +version = "=0.16.9" optional = true [dependencies.snarkvm-synthesizer] path = "../synthesizer" -version = "=0.16.8" +version = "=0.16.9" default-features = false features = [ "wasm" ] optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.8" +version = "=0.16.9" features = [ "wasm" ] optional = true From 5f7c128d416d51c374808911476107647c90ddc8 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sat, 11 Nov 2023 21:00:19 -0800 Subject: [PATCH 118/339] Adds BFT map ID to storage --- ledger/store/src/helpers/rocksdb/internal/id.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ledger/store/src/helpers/rocksdb/internal/id.rs b/ledger/store/src/helpers/rocksdb/internal/id.rs index 0d47eecd83..4a8dd7d3ad 100644 --- a/ledger/store/src/helpers/rocksdb/internal/id.rs +++ b/ledger/store/src/helpers/rocksdb/internal/id.rs @@ -17,6 +17,7 @@ #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] #[repr(u16)] pub enum MapID { + BFT(BFTMap), Block(BlockMap), Committee(CommitteeMap), Deployment(DeploymentMap), @@ -34,6 +35,7 @@ pub enum MapID { impl From for u16 { fn from(id: MapID) -> u16 { match id { + MapID::BFT(id) => id as u16, MapID::Block(id) => id as u16, MapID::Committee(id) => id as u16, MapID::Deployment(id) => id as u16, @@ -50,6 +52,15 @@ impl From for u16 { } } +/// The RocksDB map prefix for BFT-related entries. +// Note: the order of these variants can be changed at any point in time, +// as long as the corresponding DataID values remain the same. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +#[repr(u16)] +pub enum BFTMap { + Transmissions = DataID::BFTTransmissionsMap as u16, +} + /// The RocksDB map prefix for block-related entries. // Note: the order of these variants can be changed at any point in time, // as long as the corresponding DataID values remain the same. @@ -273,6 +284,7 @@ enum DataID { // TODO (howardwu): For mainnet - Reorder this up above. BlockRejectedDeploymentOrExecutionMap, + BFTTransmissionsMap, // Testing #[cfg(test)] From 36b5263d9abaf7242e667353087bdbb8ee9f9346 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sat, 11 Nov 2023 21:17:13 -0800 Subject: [PATCH 119/339] Update test flag accessibility --- Cargo.toml | 1 + ledger/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 784bbce22e..972344ef21 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -131,6 +131,7 @@ cuda = [ "snarkvm-algorithms/cuda" ] parameters_no_std_out = [ "snarkvm-parameters/no_std_out" ] noconfig = [ ] rocks = [ "snarkvm-ledger/rocks" ] +test = [ "snarkvm-ledger/test" ] test-helpers = [ "snarkvm-ledger/test-helpers" ] timer = [ "snarkvm-ledger/timer" ] algorithms = [ "snarkvm-algorithms" ] diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index 0a556a7a64..24c21cf0fe 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -45,7 +45,7 @@ serial = [ "ledger-store/serial", "synthesizer/serial" ] -test = [ "ledger-block/test" ] +test = [ "ledger-block/test", "ledger-store/test" ] test-helpers = [ "ledger-test-helpers", "ledger-committee/test-helpers", From 947185042e5040bb00d62721b7a674a8c5d79c4d Mon Sep 17 00:00:00 2001 From: ljedrz Date: Mon, 13 Nov 2023 10:30:22 +0100 Subject: [PATCH 120/339] tweak: only use prefixed iterators with rocksdb Signed-off-by: ljedrz --- .../src/helpers/rocksdb/internal/nested_map.rs | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/ledger/store/src/helpers/rocksdb/internal/nested_map.rs b/ledger/store/src/helpers/rocksdb/internal/nested_map.rs index b168b3591a..58b795730f 100644 --- a/ledger/store/src/helpers/rocksdb/internal/nested_map.rs +++ b/ledger/store/src/helpers/rocksdb/internal/nested_map.rs @@ -140,10 +140,7 @@ impl< let mut batch = rocksdb::WriteBatch::default(); // Construct an iterator over the DB with the specified prefix. - let iterator = self.database.iterator(rocksdb::IteratorMode::From( - &self.create_prefixed_map(map)?, - rocksdb::Direction::Forward, - )); + let iterator = self.database.prefix_iterator(&self.create_prefixed_map(map)?); // Iterate over the entries in the DB with the specified prefix. for entry in iterator { @@ -284,10 +281,7 @@ impl< let serialized_map = bincode::serialize(&map)?; // Construct an iterator over the DB with the specified prefix. - let iterator = self.database.iterator(rocksdb::IteratorMode::From( - &self.create_prefixed_map(&map)?, - rocksdb::Direction::Forward, - )); + let iterator = self.database.prefix_iterator(&self.create_prefixed_map(&map)?); // Iterate over the entries in the DB with the specified prefix. for entry in iterator { @@ -402,9 +396,7 @@ impl< let mut entries = Vec::new(); // Construct an iterator over the DB with the specified prefix. - let iterator = self - .database - .iterator(rocksdb::IteratorMode::From(&self.create_prefixed_map(map)?, rocksdb::Direction::Forward)); + let iterator = self.database.prefix_iterator(&self.create_prefixed_map(map)?); // Iterate over the entries in the DB with the specified prefix. for entry in iterator { From b2c1be6fa3fcf7ad7eafb1236a113965ffd76560 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 13 Nov 2023 13:26:38 -0800 Subject: [PATCH 121/339] Introduce FINALIZE_ID_DEPTH --- console/program/src/state_path/configuration/mod.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/console/program/src/state_path/configuration/mod.rs b/console/program/src/state_path/configuration/mod.rs index b8ddef30cf..ddfa6651f8 100644 --- a/console/program/src/state_path/configuration/mod.rs +++ b/console/program/src/state_path/configuration/mod.rs @@ -19,8 +19,10 @@ use snarkvm_console_network::BHPMerkleTree; pub const BLOCKS_DEPTH: u8 = 32; /// The depth of the Merkle tree for the block header. pub const HEADER_DEPTH: u8 = 3; +/// The depth of the Merkle tree for finalize operations in a transaction. +pub const FINALIZE_ID_DEPTH: u8 = TRANSACTION_DEPTH + 4; // 4 for 16 finalize operations per transition. /// The depth of the Merkle tree for finalize operations in a block. -pub const FINALIZE_OPERATIONS_DEPTH: u8 = 20; +pub const FINALIZE_OPERATIONS_DEPTH: u8 = TRANSACTIONS_DEPTH + 1; /// The depth of the Merkle tree for the ratifications in a block. pub const RATIFICATIONS_DEPTH: u8 = 16; /// The depth the Merkle tree for the subdag certificates in a block. From ba0c521936822d80bab58479e09cde7053e71c38 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 13 Nov 2023 13:28:42 -0800 Subject: [PATCH 122/339] Implement to_finalize_id for confirmed transactions --- ledger/block/src/transactions/confirmed/mod.rs | 13 ++++++++++++- ledger/block/src/transactions/mod.rs | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ledger/block/src/transactions/confirmed/mod.rs b/ledger/block/src/transactions/confirmed/mod.rs index 9d16b7915d..d942c94d5e 100644 --- a/ledger/block/src/transactions/confirmed/mod.rs +++ b/ledger/block/src/transactions/confirmed/mod.rs @@ -17,7 +17,7 @@ mod serialize; mod string; use crate::{rejected::Rejected, Transaction}; -use console::{network::prelude::*, types::Field}; +use console::{network::prelude::*, program::FINALIZE_ID_DEPTH, types::Field}; use synthesizer_program::FinalizeOperation; pub type NumFinalizeSize = u16; @@ -314,6 +314,17 @@ impl ConfirmedTransaction { ), } } + + /// Returns the finalize id, by computing the root for a Merkle tree of the finalize operations. + pub fn to_finalize_id(&self) -> Result> { + // Prepare the leaves. + let leaves = self.finalize_operations().iter().map(ToBits::to_bits_le); + // Compute the finalize id tree. + // Note: This call will check the number of finalize operations is within the size of the Merkle tree. + let tree = N::merkle_tree_bhp::(&leaves.collect::>())?; + // Return the finalize id. + Ok(*tree.root()) + } } impl Deref for ConfirmedTransaction { diff --git a/ledger/block/src/transactions/mod.rs b/ledger/block/src/transactions/mod.rs index 2eb3a31372..6fe4cf695e 100644 --- a/ledger/block/src/transactions/mod.rs +++ b/ledger/block/src/transactions/mod.rs @@ -32,6 +32,7 @@ use console::{ Record, TransactionsPath, TransactionsTree, + FINALIZE_ID_DEPTH, FINALIZE_OPERATIONS_DEPTH, TRANSACTIONS_DEPTH, }, From 0c0a451f94bf18983298124cfdb526570a351ad8 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 13 Nov 2023 13:37:04 -0800 Subject: [PATCH 123/339] Use finalize ids to construct finalize root --- ledger/block/src/transactions/merkle.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/ledger/block/src/transactions/merkle.rs b/ledger/block/src/transactions/merkle.rs index 4efc914ba5..fa651d0f72 100644 --- a/ledger/block/src/transactions/merkle.rs +++ b/ledger/block/src/transactions/merkle.rs @@ -17,11 +17,24 @@ use super::*; impl Transactions { /// Returns the finalize root of the transactions. pub fn to_finalize_root(&self, ratified_finalize_operations: Vec>) -> Result> { + // Prepare the finalize ids for the ratify-finalize operations. + let ratified_finalize_id = *N::merkle_tree_bhp::( + &ratified_finalize_operations.iter().map(ToBits::to_bits_le).collect::>(), + )? + .root(); + // Prepare the leaves. - let leaves = self.finalize_operations().chain(&ratified_finalize_operations).map(ToBits::to_bits_le); + let mut leaves = self + .iter() + .map(ConfirmedTransaction::to_finalize_id) + .map(|res| res.map(|id| id.to_bits_le())) + .collect::>>()?; + // Append the finalize id for the ratifications. + leaves.push(ratified_finalize_id.to_bits_le()); + // Compute the finalize tree. // Note: This call will check the number of finalize operations is within the size of the Merkle tree. - let tree = N::merkle_tree_bhp::(&leaves.collect::>())?; + let tree = N::merkle_tree_bhp::(&leaves)?; // Return the finalize root. Ok(*tree.root()) } From 4d3ba64bb6140b8d9e2315d9ff563e95781e9170 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 13 Nov 2023 13:37:49 -0800 Subject: [PATCH 124/339] nit --- ledger/block/src/transactions/merkle.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/block/src/transactions/merkle.rs b/ledger/block/src/transactions/merkle.rs index fa651d0f72..ed25919766 100644 --- a/ledger/block/src/transactions/merkle.rs +++ b/ledger/block/src/transactions/merkle.rs @@ -17,7 +17,7 @@ use super::*; impl Transactions { /// Returns the finalize root of the transactions. pub fn to_finalize_root(&self, ratified_finalize_operations: Vec>) -> Result> { - // Prepare the finalize ids for the ratify-finalize operations. + // Prepare the finalize id for the ratified finalize operations. let ratified_finalize_id = *N::merkle_tree_bhp::( &ratified_finalize_operations.iter().map(ToBits::to_bits_le).collect::>(), )? From 83b4eb341391089022ae7561e2bbd2eb58e95224 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 13 Nov 2023 14:49:40 -0800 Subject: [PATCH 125/339] Abort transactions that exceeds block transaction limit --- synthesizer/src/vm/finalize.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index fe367d94d8..0be694aabb 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -158,15 +158,6 @@ impl> VM { // Perform the finalize operation on the preset finalize mode. atomic_finalize!(self.finalize_store(), FinalizeMode::DryRun, { - // Ensure the number of transactions does not exceed the maximum. - if num_transactions > Transactions::::MAX_TRANSACTIONS { - // Note: This will abort the entire atomic batch. - return Err(format!( - "Too many transactions in the block - {num_transactions} (max: {})", - Transactions::::MAX_TRANSACTIONS - )); - } - // Initialize an iterator for ratifications before finalize. let pre_ratifications = ratifications.iter().filter(|r| match r { Ratify::Genesis(_, _) => true, @@ -209,6 +200,15 @@ impl> VM { // Finalize the transactions. 'outer: for transaction in transactions { + // Ensure the number of confirmed transactions does not exceed the maximum. + // Upon reaching the maximum number of confirmed transactions, all remaining transactions are aborted. + if confirmed.len() > Transactions::::MAX_TRANSACTIONS { + // Store the aborted transaction. + aborted.push((transaction.clone(), "Exceeds block transaction limit".to_string())); + // Continue to the next transaction. + continue 'outer; + } + // Process the transaction in an isolated atomic batch. // - If the transaction succeeds, the finalize operations are stored. // - If the transaction fails, the atomic batch is aborted and no finalize operations are stored. From 3553add660b67883cae0df03d6679e5d439b142b Mon Sep 17 00:00:00 2001 From: evan-schott <53463459+evan-schott@users.noreply.github.com> Date: Mon, 13 Nov 2023 17:10:46 -0800 Subject: [PATCH 126/339] remove test limitation --- ledger/block/src/verify.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/ledger/block/src/verify.rs b/ledger/block/src/verify.rs index 9fa6093229..7d77d38511 100644 --- a/ledger/block/src/verify.rs +++ b/ledger/block/src/verify.rs @@ -137,9 +137,6 @@ impl Block { previous_height: u32, current_committee: &Committee, ) -> Result<(u64, u32, i64)> { - #[cfg(not(any(test, feature = "test")))] - ensure!(self.authority.is_quorum(), "The next block must be a quorum block"); - // Determine the expected height. let expected_height = previous_height.saturating_add(1); From 6a0b5b0c4d631dcf409eb7e421467a6082564508 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 14 Nov 2023 11:27:49 -0800 Subject: [PATCH 127/339] Add test for exceeding MAX_TRANSACTIONS --- ledger/block/src/lib.rs | 6 ++- ledger/block/src/transactions/mod.rs | 3 ++ ledger/block/src/verify.rs | 4 +- synthesizer/Cargo.toml | 7 ++- synthesizer/src/vm/finalize.rs | 67 ++++++++++++++++++++++++++-- 5 files changed, 80 insertions(+), 7 deletions(-) diff --git a/ledger/block/src/lib.rs b/ledger/block/src/lib.rs index 7aa9595c2c..03f969ebd8 100644 --- a/ledger/block/src/lib.rs +++ b/ledger/block/src/lib.rs @@ -129,10 +129,12 @@ impl Block { ensure!(!transactions.is_empty(), "Cannot create a block with zero transactions"); // Ensure the number of transactions is within the allowed range. - if transactions.len() + aborted_transaction_ids.len() > Transactions::::MAX_TRANSACTIONS { - bail!("Cannot initialize a block with {} transactions (w/ aborted)", Transactions::::MAX_TRANSACTIONS); + if transactions.len() > Transactions::::MAX_TRANSACTIONS { + bail!("Cannot initialize a block with {} transactions", Transactions::::MAX_TRANSACTIONS); } + // TODO (raychu86): Add bound checks for the number of aborted transaction ids. + // Compute the block hash. let block_hash = N::hash_bhp1024(&to_bits_le![previous_hash, header.to_root()?])?; diff --git a/ledger/block/src/transactions/mod.rs b/ledger/block/src/transactions/mod.rs index 2eb3a31372..72ad236e9c 100644 --- a/ledger/block/src/transactions/mod.rs +++ b/ledger/block/src/transactions/mod.rs @@ -167,7 +167,10 @@ impl Transactions { impl Transactions { /// The maximum number of transactions allowed in a block. + #[cfg(not(any(test, feature = "test")))] pub const MAX_TRANSACTIONS: usize = usize::pow(2, TRANSACTIONS_DEPTH as u32); + #[cfg(any(test, feature = "test"))] + pub const MAX_TRANSACTIONS: usize = 4; /// Returns an iterator over all transactions, for all transactions in `self`. pub fn iter(&self) -> impl '_ + ExactSizeIterator> { diff --git a/ledger/block/src/verify.rs b/ledger/block/src/verify.rs index 9fa6093229..cf524138af 100644 --- a/ledger/block/src/verify.rs +++ b/ledger/block/src/verify.rs @@ -385,10 +385,12 @@ impl Block { ensure!(!self.transactions.is_empty(), "Block {height} must contain at least 1 transaction"); // Ensure the number of transactions is within the allowed range. - if self.transactions.len() + self.aborted_transaction_ids.len() > Transactions::::MAX_TRANSACTIONS { + if self.transactions.len() > Transactions::::MAX_TRANSACTIONS { bail!("Cannot validate a block with more than {} transactions", Transactions::::MAX_TRANSACTIONS); } + // TODO (raychu86): Add bound checks for the number of aborted transaction ids. + // Ensure there are no duplicate transaction IDs. if has_duplicates(self.transaction_ids().chain(self.aborted_transaction_ids.iter())) { bail!("Found a duplicate transaction in block {height}"); diff --git a/synthesizer/Cargo.toml b/synthesizer/Cargo.toml index eb49845932..f8636158ff 100644 --- a/synthesizer/Cargo.toml +++ b/synthesizer/Cargo.toml @@ -43,7 +43,7 @@ serial = [ "synthesizer-snark/serial" ] setup = [ ] -test = [ ] +test = [ "ledger-block/test" ] timer = [ "aleo-std/timer" ] wasm = [ "process", @@ -158,6 +158,11 @@ version = "0.5" [dev-dependencies.itertools] version = "0.11.0" +[dev-dependencies.ledger-block] +package = "snarkvm-ledger-block" +path = "../ledger/block" +features = [ "test" ] + [dev-dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../ledger/committee" diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index 0be694aabb..b8ccd6f209 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -202,7 +202,7 @@ impl> VM { 'outer: for transaction in transactions { // Ensure the number of confirmed transactions does not exceed the maximum. // Upon reaching the maximum number of confirmed transactions, all remaining transactions are aborted. - if confirmed.len() > Transactions::::MAX_TRANSACTIONS { + if confirmed.len() >= Transactions::::MAX_TRANSACTIONS { // Store the aborted transaction. aborted.push((transaction.clone(), "Exceeds block transaction limit".to_string())); // Continue to the next transaction. @@ -832,7 +832,7 @@ mod tests { program::{Ciphertext, Entry, Record}, types::Field, }; - use ledger_block::{Block, Header, Metadata, Transaction, Transition}; + use ledger_block::{Block, Header, Metadata, Transaction, Transactions, Transition}; use ledger_store::helpers::memory::ConsensusMemory; use synthesizer_program::Program; @@ -920,7 +920,6 @@ finalize transfer_public: // Speculate on the candidate ratifications, solutions, and transactions. let (ratifications, transactions, aborted_transaction_ids, ratified_finalize_operations) = vm.speculate(sample_finalize_state(1), None, vec![], None, transactions.iter())?; - assert!(aborted_transaction_ids.is_empty()); // Construct the metadata associated with the block. let metadata = Metadata::new( @@ -1544,4 +1543,66 @@ finalize compute: let expected = Value::::from_str("3u8").unwrap(); assert_eq!(value, expected); } + + #[test] + fn test_excess_transactions_should_be_aborted() { + let rng = &mut TestRng::default(); + + // Sample a private key. + let caller_private_key = test_helpers::sample_genesis_private_key(rng); + let caller_address = Address::try_from(&caller_private_key).unwrap(); + + // Initialize the vm. + let vm = test_helpers::sample_vm_with_genesis_block(rng); + + // Deploy a new program. + let genesis = + vm.block_store().get_block(&vm.block_store().get_block_hash(0).unwrap().unwrap()).unwrap().unwrap(); + + // Get the unspent records. + let mut unspent_records = genesis + .transitions() + .cloned() + .flat_map(Transition::into_records) + .map(|(_, record)| record) + .collect::>(); + + // Construct the deployment block. + let (program_id, deployment_block) = + new_program_deployment(&vm, &caller_private_key, &genesis, &mut unspent_records, rng).unwrap(); + + // Add the deployment block to the VM. + vm.add_next_block(&deployment_block).unwrap(); + + // Generate more records to use for the next block. + let splits_block = + generate_splits(&vm, &caller_private_key, &deployment_block, &mut unspent_records, rng).unwrap(); + + // Add the splits block to the VM. + vm.add_next_block(&splits_block).unwrap(); + + // Generate the transactions. + let mut transactions = Vec::new(); + let mut excess_transaction_ids = Vec::new(); + + for _ in 0..Transactions::::MAX_TRANSACTIONS + 1 { + let transaction = + sample_mint_public(&vm, caller_private_key, &program_id, caller_address, 10, &mut unspent_records, rng); + // Abort the transaction if the block is full. + if transactions.len() >= Transactions::::MAX_TRANSACTIONS { + excess_transaction_ids.push(transaction.id()); + } + + transactions.push(transaction); + } + + // Construct the next block. + let next_block = + sample_next_block(&vm, &caller_private_key, &transactions, &splits_block, &mut unspent_records, rng) + .unwrap(); + + // Ensure that the excess transactions were aborted. + assert_eq!(next_block.aborted_transaction_ids(), &excess_transaction_ids); + assert_eq!(next_block.transactions().len(), Transactions::::MAX_TRANSACTIONS); + } } From 7c181f77b9a34ae111711d19e980614092b759bf Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 14 Nov 2023 11:45:24 -0800 Subject: [PATCH 128/339] Increase MAX_TRANSACTIONS for test --- ledger/block/src/transactions/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/block/src/transactions/mod.rs b/ledger/block/src/transactions/mod.rs index 72ad236e9c..0adffadbbb 100644 --- a/ledger/block/src/transactions/mod.rs +++ b/ledger/block/src/transactions/mod.rs @@ -170,7 +170,7 @@ impl Transactions { #[cfg(not(any(test, feature = "test")))] pub const MAX_TRANSACTIONS: usize = usize::pow(2, TRANSACTIONS_DEPTH as u32); #[cfg(any(test, feature = "test"))] - pub const MAX_TRANSACTIONS: usize = 4; + pub const MAX_TRANSACTIONS: usize = 8; /// Returns an iterator over all transactions, for all transactions in `self`. pub fn iter(&self) -> impl '_ + ExactSizeIterator> { From c111cbb5e9e9f9acefe9825c2f78780b9a51360b Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 14 Nov 2023 12:03:51 -0800 Subject: [PATCH 129/339] Use MAXIMUM_CONFIRMED_TRANSACTIONS --- ledger/block/src/transactions/mod.rs | 3 --- synthesizer/Cargo.toml | 7 +------ synthesizer/src/vm/finalize.rs | 24 +++++++++++++++++++----- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/ledger/block/src/transactions/mod.rs b/ledger/block/src/transactions/mod.rs index 0adffadbbb..2eb3a31372 100644 --- a/ledger/block/src/transactions/mod.rs +++ b/ledger/block/src/transactions/mod.rs @@ -167,10 +167,7 @@ impl Transactions { impl Transactions { /// The maximum number of transactions allowed in a block. - #[cfg(not(any(test, feature = "test")))] pub const MAX_TRANSACTIONS: usize = usize::pow(2, TRANSACTIONS_DEPTH as u32); - #[cfg(any(test, feature = "test"))] - pub const MAX_TRANSACTIONS: usize = 8; /// Returns an iterator over all transactions, for all transactions in `self`. pub fn iter(&self) -> impl '_ + ExactSizeIterator> { diff --git a/synthesizer/Cargo.toml b/synthesizer/Cargo.toml index f8636158ff..eb49845932 100644 --- a/synthesizer/Cargo.toml +++ b/synthesizer/Cargo.toml @@ -43,7 +43,7 @@ serial = [ "synthesizer-snark/serial" ] setup = [ ] -test = [ "ledger-block/test" ] +test = [ ] timer = [ "aleo-std/timer" ] wasm = [ "process", @@ -158,11 +158,6 @@ version = "0.5" [dev-dependencies.itertools] version = "0.11.0" -[dev-dependencies.ledger-block] -package = "snarkvm-ledger-block" -path = "../ledger/block" -features = [ "test" ] - [dev-dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../ledger/committee" diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index b8ccd6f209..437ac161c7 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -128,6 +128,11 @@ impl> VM { } impl> VM { + #[cfg(not(any(test, feature = "test")))] + const MAXIMUM_CONFIRMED_TRANSACTIONS: usize = Transactions::::MAX_TRANSACTIONS; + #[cfg(any(test, feature = "test"))] + const MAXIMUM_CONFIRMED_TRANSACTIONS: usize = 12; + /// Performs atomic speculation over a list of transactions. /// /// Returns the ratifications, confirmed transactions, aborted transactions, @@ -202,7 +207,7 @@ impl> VM { 'outer: for transaction in transactions { // Ensure the number of confirmed transactions does not exceed the maximum. // Upon reaching the maximum number of confirmed transactions, all remaining transactions are aborted. - if confirmed.len() >= Transactions::::MAX_TRANSACTIONS { + if confirmed.len() >= Self::MAXIMUM_CONFIRMED_TRANSACTIONS { // Store the aborted transaction. aborted.push((transaction.clone(), "Exceeds block transaction limit".to_string())); // Continue to the next transaction. @@ -832,7 +837,7 @@ mod tests { program::{Ciphertext, Entry, Record}, types::Field, }; - use ledger_block::{Block, Header, Metadata, Transaction, Transactions, Transition}; + use ledger_block::{Block, Header, Metadata, Transaction, Transition}; use ledger_store::helpers::memory::ConsensusMemory; use synthesizer_program::Program; @@ -1581,15 +1586,21 @@ finalize compute: // Add the splits block to the VM. vm.add_next_block(&splits_block).unwrap(); + // Generate more records to use for the next block. + let splits_block = generate_splits(&vm, &caller_private_key, &splits_block, &mut unspent_records, rng).unwrap(); + + // Add the splits block to the VM. + vm.add_next_block(&splits_block).unwrap(); + // Generate the transactions. let mut transactions = Vec::new(); let mut excess_transaction_ids = Vec::new(); - for _ in 0..Transactions::::MAX_TRANSACTIONS + 1 { + for _ in 0..VM::>::MAXIMUM_CONFIRMED_TRANSACTIONS + 1 { let transaction = sample_mint_public(&vm, caller_private_key, &program_id, caller_address, 10, &mut unspent_records, rng); // Abort the transaction if the block is full. - if transactions.len() >= Transactions::::MAX_TRANSACTIONS { + if transactions.len() >= VM::>::MAXIMUM_CONFIRMED_TRANSACTIONS { excess_transaction_ids.push(transaction.id()); } @@ -1603,6 +1614,9 @@ finalize compute: // Ensure that the excess transactions were aborted. assert_eq!(next_block.aborted_transaction_ids(), &excess_transaction_ids); - assert_eq!(next_block.transactions().len(), Transactions::::MAX_TRANSACTIONS); + assert_eq!( + next_block.transactions().len(), + VM::>::MAXIMUM_CONFIRMED_TRANSACTIONS + ); } } From ef33eaaa6945c18b06ff77e2b02f3bd5b2aa04a6 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 14 Nov 2023 18:21:37 -0800 Subject: [PATCH 130/339] Add bound checks for the number of aborted transaction ids --- ledger/block/src/lib.rs | 10 ++++++++-- ledger/block/src/verify.rs | 8 +++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/ledger/block/src/lib.rs b/ledger/block/src/lib.rs index 03f969ebd8..1c3a4fa4fb 100644 --- a/ledger/block/src/lib.rs +++ b/ledger/block/src/lib.rs @@ -130,10 +130,16 @@ impl Block { // Ensure the number of transactions is within the allowed range. if transactions.len() > Transactions::::MAX_TRANSACTIONS { - bail!("Cannot initialize a block with {} transactions", Transactions::::MAX_TRANSACTIONS); + bail!("Cannot initialize a block with more than {} transactions", Transactions::::MAX_TRANSACTIONS); } - // TODO (raychu86): Add bound checks for the number of aborted transaction ids. + // Ensure the number of aborted transaction IDs is within the allowed range. + if aborted_transaction_ids.len() > Transactions::::MAX_TRANSACTIONS { + bail!( + "Cannot initialize a block with more than {} aborted transaction IDs", + Transactions::::MAX_TRANSACTIONS + ); + } // Compute the block hash. let block_hash = N::hash_bhp1024(&to_bits_le![previous_hash, header.to_root()?])?; diff --git a/ledger/block/src/verify.rs b/ledger/block/src/verify.rs index cf524138af..a61e2051ee 100644 --- a/ledger/block/src/verify.rs +++ b/ledger/block/src/verify.rs @@ -389,7 +389,13 @@ impl Block { bail!("Cannot validate a block with more than {} transactions", Transactions::::MAX_TRANSACTIONS); } - // TODO (raychu86): Add bound checks for the number of aborted transaction ids. + // Ensure the number of aborted transaction IDs is within the allowed range. + if self.aborted_transaction_ids.len() > Transactions::::MAX_TRANSACTIONS { + bail!( + "Cannot validate a block with more than {} aborted transaction IDs", + Transactions::::MAX_TRANSACTIONS + ); + } // Ensure there are no duplicate transaction IDs. if has_duplicates(self.transaction_ids().chain(self.aborted_transaction_ids.iter())) { From b894dc5fd86e80a272d0794606650f146a77a478 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 14 Nov 2023 18:34:38 -0800 Subject: [PATCH 131/339] Add documentation --- synthesizer/src/vm/finalize.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index 437ac161c7..f707a06571 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -128,10 +128,13 @@ impl> VM { } impl> VM { + /// The maximum number of confirmed transactions allowed in a block. #[cfg(not(any(test, feature = "test")))] - const MAXIMUM_CONFIRMED_TRANSACTIONS: usize = Transactions::::MAX_TRANSACTIONS; + pub const MAXIMUM_CONFIRMED_TRANSACTIONS: usize = Self::MAX_TRANSACTIONS; + /// The maximum number of confirmed transactions allowed in a block. + /// NOTE: This value is set arbitrarily low and is used for testing purposes only. #[cfg(any(test, feature = "test"))] - const MAXIMUM_CONFIRMED_TRANSACTIONS: usize = 12; + pub const MAXIMUM_CONFIRMED_TRANSACTIONS: usize = 8; /// Performs atomic speculation over a list of transactions. /// From 3c2e5ef5af9571fdf54fd2d07240ddc9f7a63343 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 14 Nov 2023 18:36:28 -0800 Subject: [PATCH 132/339] Keep num_transactions check --- synthesizer/src/vm/finalize.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index f707a06571..4206178438 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -166,6 +166,15 @@ impl> VM { // Perform the finalize operation on the preset finalize mode. atomic_finalize!(self.finalize_store(), FinalizeMode::DryRun, { + // Ensure the number of transactions does not exceed the maximum. + if num_transactions > 2 * Transactions::::MAX_TRANSACTIONS { + // Note: This will abort the entire atomic batch. + return Err(format!( + "Too many transactions in the block - {num_transactions} (max: {})", + 2 * Transactions::::MAX_TRANSACTIONS + )); + } + // Initialize an iterator for ratifications before finalize. let pre_ratifications = ratifications.iter().filter(|r| match r { Ratify::Genesis(_, _) => true, From a819fdadcb9a3234d1b65228a75c82e48df2d1e8 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 14 Nov 2023 18:39:57 -0800 Subject: [PATCH 133/339] nit --- synthesizer/src/vm/finalize.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index 4206178438..0adc2f0e06 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -132,7 +132,7 @@ impl> VM { #[cfg(not(any(test, feature = "test")))] pub const MAXIMUM_CONFIRMED_TRANSACTIONS: usize = Self::MAX_TRANSACTIONS; /// The maximum number of confirmed transactions allowed in a block. - /// NOTE: This value is set arbitrarily low and is used for testing purposes only. + /// This is set to a deliberately low value (8) for testing purposes only. #[cfg(any(test, feature = "test"))] pub const MAXIMUM_CONFIRMED_TRANSACTIONS: usize = 8; From 577b7972cf918617b94670ba65c877dc30a3b209 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 14 Nov 2023 18:41:42 -0800 Subject: [PATCH 134/339] Update ledger/block/src/lib.rs Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- ledger/block/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/block/src/lib.rs b/ledger/block/src/lib.rs index 1c3a4fa4fb..8dc1bf4f68 100644 --- a/ledger/block/src/lib.rs +++ b/ledger/block/src/lib.rs @@ -130,7 +130,7 @@ impl Block { // Ensure the number of transactions is within the allowed range. if transactions.len() > Transactions::::MAX_TRANSACTIONS { - bail!("Cannot initialize a block with more than {} transactions", Transactions::::MAX_TRANSACTIONS); + bail!("Cannot initialize a block with more than {} confirmed transactions", Transactions::::MAX_TRANSACTIONS); } // Ensure the number of aborted transaction IDs is within the allowed range. From e5cfb5e48b831ca802590ff0dc626717b32175c0 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 14 Nov 2023 18:41:56 -0800 Subject: [PATCH 135/339] Update ledger/block/src/verify.rs Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- ledger/block/src/verify.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/block/src/verify.rs b/ledger/block/src/verify.rs index a61e2051ee..40625e0a33 100644 --- a/ledger/block/src/verify.rs +++ b/ledger/block/src/verify.rs @@ -386,7 +386,7 @@ impl Block { // Ensure the number of transactions is within the allowed range. if self.transactions.len() > Transactions::::MAX_TRANSACTIONS { - bail!("Cannot validate a block with more than {} transactions", Transactions::::MAX_TRANSACTIONS); + bail!("Cannot validate a block with more than {} confirmed transactions", Transactions::::MAX_TRANSACTIONS); } // Ensure the number of aborted transaction IDs is within the allowed range. From ada9863078c8e4380d6ef3aeb83c8db92fd77f3e Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 14 Nov 2023 18:42:21 -0800 Subject: [PATCH 136/339] cargo fmt --- ledger/block/src/lib.rs | 5 ++++- ledger/block/src/verify.rs | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/ledger/block/src/lib.rs b/ledger/block/src/lib.rs index 8dc1bf4f68..f2aaebd1cc 100644 --- a/ledger/block/src/lib.rs +++ b/ledger/block/src/lib.rs @@ -130,7 +130,10 @@ impl Block { // Ensure the number of transactions is within the allowed range. if transactions.len() > Transactions::::MAX_TRANSACTIONS { - bail!("Cannot initialize a block with more than {} confirmed transactions", Transactions::::MAX_TRANSACTIONS); + bail!( + "Cannot initialize a block with more than {} confirmed transactions", + Transactions::::MAX_TRANSACTIONS + ); } // Ensure the number of aborted transaction IDs is within the allowed range. diff --git a/ledger/block/src/verify.rs b/ledger/block/src/verify.rs index 40625e0a33..e4f2f58714 100644 --- a/ledger/block/src/verify.rs +++ b/ledger/block/src/verify.rs @@ -386,7 +386,10 @@ impl Block { // Ensure the number of transactions is within the allowed range. if self.transactions.len() > Transactions::::MAX_TRANSACTIONS { - bail!("Cannot validate a block with more than {} confirmed transactions", Transactions::::MAX_TRANSACTIONS); + bail!( + "Cannot validate a block with more than {} confirmed transactions", + Transactions::::MAX_TRANSACTIONS + ); } // Ensure the number of aborted transaction IDs is within the allowed range. From 429f9a668c26fc159acc4ddaf28de560a282fc95 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 14 Nov 2023 18:49:15 -0800 Subject: [PATCH 137/339] Fix utilities version --- synthesizer/process/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synthesizer/process/Cargo.toml b/synthesizer/process/Cargo.toml index 5d9ca99695..67860d2381 100644 --- a/synthesizer/process/Cargo.toml +++ b/synthesizer/process/Cargo.toml @@ -86,7 +86,7 @@ version = "=0.16.9" [dependencies.utilities] package = "snarkvm-utilities" path = "../../utilities" -version = "=0.16.8" +version = "=0.16.9" [dependencies.aleo-std] version = "0.1.18" From a44a9e48933272b96d2075b0842ff524ebc1850b Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 14 Nov 2023 18:49:42 -0800 Subject: [PATCH 138/339] Use rng in check_next_block --- ledger/src/tests.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ledger/src/tests.rs b/ledger/src/tests.rs index 3b4ccb48a3..e20ebde59e 100644 --- a/ledger/src/tests.rs +++ b/ledger/src/tests.rs @@ -596,7 +596,7 @@ fn test_aborted_transaction_indexing() { .unwrap(); // Check that the next block is valid. - ledger.check_next_block(&transfer_block).unwrap(); + ledger.check_next_block(&transfer_block, rng).unwrap(); // Add the deployment block to the ledger. ledger.advance_to_next_block(&transfer_block).unwrap(); @@ -631,7 +631,7 @@ fn test_aborted_transaction_indexing() { assert_eq!(block.aborted_transaction_ids(), &[aborted_transaction_id]); // Check that the next block is valid. - ledger.check_next_block(&block).unwrap(); + ledger.check_next_block(&block, rng).unwrap(); // Add the deployment block to the ledger. ledger.advance_to_next_block(&block).unwrap(); From 68a0cf3e5f50a87f1491e00ef7f609303e421d8f Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 14 Nov 2023 18:50:09 -0800 Subject: [PATCH 139/339] Fix compilation --- synthesizer/src/vm/finalize.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index dcc4a315f7..29f239e71e 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -130,7 +130,7 @@ impl> VM { impl> VM { /// The maximum number of confirmed transactions allowed in a block. #[cfg(not(any(test, feature = "test")))] - pub const MAXIMUM_CONFIRMED_TRANSACTIONS: usize = Self::MAX_TRANSACTIONS; + pub const MAXIMUM_CONFIRMED_TRANSACTIONS: usize = Transactions::::MAX_TRANSACTIONS; /// The maximum number of confirmed transactions allowed in a block. /// This is set to a deliberately low value (8) for testing purposes only. #[cfg(any(test, feature = "test"))] From c620cc4a89bcd81e9de07e827886a2a57e4375e6 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 14 Nov 2023 19:21:42 -0800 Subject: [PATCH 140/339] chore(snarkvm): bump version for new release --- .cargo/release-version | 2 +- Cargo.lock | 118 ++++++++++---------- Cargo.toml | 22 ++-- algorithms/Cargo.toml | 12 +- algorithms/cuda/Cargo.toml | 2 +- circuit/Cargo.toml | 16 +-- circuit/account/Cargo.toml | 10 +- circuit/algorithms/Cargo.toml | 8 +- circuit/collections/Cargo.toml | 8 +- circuit/environment/Cargo.toml | 14 +-- circuit/environment/witness/Cargo.toml | 2 +- circuit/network/Cargo.toml | 10 +- circuit/program/Cargo.toml | 16 +-- circuit/types/Cargo.toml | 18 +-- circuit/types/address/Cargo.toml | 14 +-- circuit/types/boolean/Cargo.toml | 6 +- circuit/types/field/Cargo.toml | 8 +- circuit/types/group/Cargo.toml | 12 +- circuit/types/integers/Cargo.toml | 12 +- circuit/types/scalar/Cargo.toml | 10 +- circuit/types/string/Cargo.toml | 12 +- console/Cargo.toml | 14 +-- console/account/Cargo.toml | 6 +- console/algorithms/Cargo.toml | 8 +- console/collections/Cargo.toml | 6 +- console/network/Cargo.toml | 20 ++-- console/network/environment/Cargo.toml | 8 +- console/program/Cargo.toml | 14 +-- console/types/Cargo.toml | 18 +-- console/types/address/Cargo.toml | 10 +- console/types/boolean/Cargo.toml | 4 +- console/types/field/Cargo.toml | 6 +- console/types/group/Cargo.toml | 10 +- console/types/integers/Cargo.toml | 10 +- console/types/scalar/Cargo.toml | 8 +- console/types/string/Cargo.toml | 10 +- curves/Cargo.toml | 6 +- fields/Cargo.toml | 4 +- ledger/Cargo.toml | 22 ++-- ledger/authority/Cargo.toml | 6 +- ledger/block/Cargo.toml | 18 +-- ledger/coinbase/Cargo.toml | 14 +-- ledger/committee/Cargo.toml | 4 +- ledger/narwhal/Cargo.toml | 14 +-- ledger/narwhal/batch-certificate/Cargo.toml | 8 +- ledger/narwhal/batch-header/Cargo.toml | 6 +- ledger/narwhal/data/Cargo.toml | 4 +- ledger/narwhal/subdag/Cargo.toml | 10 +- ledger/narwhal/transmission-id/Cargo.toml | 6 +- ledger/narwhal/transmission/Cargo.toml | 10 +- ledger/query/Cargo.toml | 8 +- ledger/store/Cargo.toml | 18 +-- ledger/test-helpers/Cargo.toml | 16 +-- parameters/Cargo.toml | 6 +- synthesizer/Cargo.toml | 24 ++-- synthesizer/process/Cargo.toml | 18 +-- synthesizer/program/Cargo.toml | 6 +- synthesizer/snark/Cargo.toml | 8 +- utilities/Cargo.toml | 4 +- utilities/derives/Cargo.toml | 2 +- wasm/Cargo.toml | 12 +- 61 files changed, 369 insertions(+), 369 deletions(-) diff --git a/.cargo/release-version b/.cargo/release-version index 2f79d75630..2e1b588229 100644 --- a/.cargo/release-version +++ b/.cargo/release-version @@ -1 +1 @@ -v0.16.9 \ No newline at end of file +v0.16.10 \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index da31fc41a7..f8d6c32825 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2473,7 +2473,7 @@ dependencies = [ [[package]] name = "snarkvm" -version = "0.16.9" +version = "0.16.10" dependencies = [ "anstyle", "anyhow", @@ -2508,7 +2508,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms" -version = "0.16.9" +version = "0.16.10" dependencies = [ "aleo-std", "anyhow", @@ -2547,7 +2547,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms-cuda" -version = "0.16.9" +version = "0.16.10" dependencies = [ "blst", "cc", @@ -2557,7 +2557,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit" -version = "0.16.9" +version = "0.16.10" dependencies = [ "snarkvm-circuit-account", "snarkvm-circuit-algorithms", @@ -2570,7 +2570,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-account" -version = "0.16.9" +version = "0.16.10" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2582,7 +2582,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-algorithms" -version = "0.16.9" +version = "0.16.10" dependencies = [ "anyhow", "snarkvm-circuit-types", @@ -2594,7 +2594,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-collections" -version = "0.16.9" +version = "0.16.10" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2608,7 +2608,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment" -version = "0.16.9" +version = "0.16.10" dependencies = [ "criterion", "indexmap 2.0.2", @@ -2629,11 +2629,11 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment-witness" -version = "0.16.9" +version = "0.16.10" [[package]] name = "snarkvm-circuit-network" -version = "0.16.9" +version = "0.16.10" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-collections", @@ -2644,7 +2644,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-program" -version = "0.16.9" +version = "0.16.10" dependencies = [ "anyhow", "paste", @@ -2662,7 +2662,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types" -version = "0.16.9" +version = "0.16.10" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-address", @@ -2677,7 +2677,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-address" -version = "0.16.9" +version = "0.16.10" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2689,7 +2689,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-boolean" -version = "0.16.9" +version = "0.16.10" dependencies = [ "criterion", "snarkvm-circuit-environment", @@ -2698,7 +2698,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-field" -version = "0.16.9" +version = "0.16.10" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2707,7 +2707,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-group" -version = "0.16.9" +version = "0.16.10" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2719,7 +2719,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-integers" -version = "0.16.9" +version = "0.16.10" dependencies = [ "paste", "snarkvm-circuit-environment", @@ -2732,7 +2732,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-scalar" -version = "0.16.9" +version = "0.16.10" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2742,7 +2742,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-string" -version = "0.16.9" +version = "0.16.10" dependencies = [ "rand", "snarkvm-circuit-environment", @@ -2755,7 +2755,7 @@ dependencies = [ [[package]] name = "snarkvm-console" -version = "0.16.9" +version = "0.16.10" dependencies = [ "snarkvm-console-account", "snarkvm-console-algorithms", @@ -2767,7 +2767,7 @@ dependencies = [ [[package]] name = "snarkvm-console-account" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "bs58", @@ -2780,7 +2780,7 @@ dependencies = [ [[package]] name = "snarkvm-console-algorithms" -version = "0.16.9" +version = "0.16.10" dependencies = [ "blake2s_simd", "criterion", @@ -2798,7 +2798,7 @@ dependencies = [ [[package]] name = "snarkvm-console-collections" -version = "0.16.9" +version = "0.16.10" dependencies = [ "aleo-std", "criterion", @@ -2811,7 +2811,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network" -version = "0.16.9" +version = "0.16.10" dependencies = [ "anyhow", "indexmap 2.0.2", @@ -2833,7 +2833,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network-environment" -version = "0.16.9" +version = "0.16.10" dependencies = [ "anyhow", "bech32", @@ -2850,7 +2850,7 @@ dependencies = [ [[package]] name = "snarkvm-console-program" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "enum_index", @@ -2871,7 +2871,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types" -version = "0.16.9" +version = "0.16.10" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-address", @@ -2885,7 +2885,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-address" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "serde_json", @@ -2897,7 +2897,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-boolean" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "serde_json", @@ -2906,7 +2906,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-field" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "serde_json", @@ -2917,7 +2917,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-group" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "serde_json", @@ -2929,7 +2929,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-integers" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "serde_json", @@ -2941,7 +2941,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-scalar" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "serde_json", @@ -2953,7 +2953,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-string" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "serde_json", @@ -2965,7 +2965,7 @@ dependencies = [ [[package]] name = "snarkvm-curves" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "criterion", @@ -2980,7 +2980,7 @@ dependencies = [ [[package]] name = "snarkvm-fields" -version = "0.16.9" +version = "0.16.10" dependencies = [ "aleo-std", "anyhow", @@ -2997,7 +2997,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger" -version = "0.16.9" +version = "0.16.10" dependencies = [ "aleo-std", "anyhow", @@ -3024,7 +3024,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-authority" -version = "0.16.9" +version = "0.16.10" dependencies = [ "anyhow", "bincode", @@ -3037,7 +3037,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-block" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3061,7 +3061,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-coinbase" -version = "0.16.9" +version = "0.16.10" dependencies = [ "aleo-std", "anyhow", @@ -3082,7 +3082,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-committee" -version = "0.16.9" +version = "0.16.10" dependencies = [ "anyhow", "bincode", @@ -3102,7 +3102,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal" -version = "0.16.9" +version = "0.16.10" dependencies = [ "snarkvm-ledger-narwhal", "snarkvm-ledger-narwhal-batch-certificate", @@ -3115,7 +3115,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3128,7 +3128,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3141,7 +3141,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-data" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bytes", "serde_json", @@ -3151,7 +3151,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3166,7 +3166,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "bytes", @@ -3179,7 +3179,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "serde_json", @@ -3189,7 +3189,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-query" -version = "0.16.9" +version = "0.16.10" dependencies = [ "async-trait", "reqwest", @@ -3201,7 +3201,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-store" -version = "0.16.9" +version = "0.16.10" dependencies = [ "aleo-std", "anyhow", @@ -3229,7 +3229,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-test-helpers" -version = "0.16.9" +version = "0.16.10" dependencies = [ "once_cell", "snarkvm-circuit", @@ -3243,7 +3243,7 @@ dependencies = [ [[package]] name = "snarkvm-parameters" -version = "0.16.9" +version = "0.16.10" dependencies = [ "aleo-std", "anyhow", @@ -3275,7 +3275,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer" -version = "0.16.9" +version = "0.16.10" dependencies = [ "aleo-std", "anyhow", @@ -3306,7 +3306,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-process" -version = "0.16.9" +version = "0.16.10" dependencies = [ "aleo-std", "bincode", @@ -3332,7 +3332,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-program" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "criterion", @@ -3348,7 +3348,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-snark" -version = "0.16.9" +version = "0.16.10" dependencies = [ "bincode", "colored", @@ -3361,7 +3361,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities" -version = "0.16.9" +version = "0.16.10" dependencies = [ "aleo-std", "anyhow", @@ -3381,7 +3381,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities-derives" -version = "0.16.9" +version = "0.16.10" dependencies = [ "proc-macro2", "quote 1.0.33", @@ -3390,7 +3390,7 @@ dependencies = [ [[package]] name = "snarkvm-wasm" -version = "0.16.9" +version = "0.16.10" dependencies = [ "getrandom", "rand", diff --git a/Cargo.toml b/Cargo.toml index 972344ef21..e4690b9d9e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "A decentralized virtual machine" homepage = "https://aleo.org" @@ -147,53 +147,53 @@ wasm = [ "snarkvm-wasm" ] [dependencies.snarkvm-algorithms] path = "./algorithms" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-circuit] path = "./circuit" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-console] path = "./console" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-curves] path = "./curves" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-fields] path = "./fields" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-ledger] path = "./ledger" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-parameters] path = "./parameters" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-synthesizer] path = "./synthesizer" -version = "=0.16.9" +version = "=0.16.10" default-features = false optional = true [dependencies.snarkvm-utilities] path = "./utilities" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-wasm] path = "./wasm" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.anstyle] diff --git a/algorithms/Cargo.toml b/algorithms/Cargo.toml index e058f52d22..657a17cd49 100644 --- a/algorithms/Cargo.toml +++ b/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Algorithms for a decentralized virtual machine" homepage = "https://aleo.org" @@ -47,27 +47,27 @@ required-features = [ "test" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.snarkvm-parameters] path = "../parameters" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.snarkvm-algorithms-cuda] path = "./cuda" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.aleo-std] diff --git a/algorithms/cuda/Cargo.toml b/algorithms/cuda/Cargo.toml index b185d5fe98..37fde9169d 100644 --- a/algorithms/cuda/Cargo.toml +++ b/algorithms/cuda/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms-cuda" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Cuda optimizations for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/circuit/Cargo.toml b/circuit/Cargo.toml index 0a918b5c9f..21160af3ec 100644 --- a/circuit/Cargo.toml +++ b/circuit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Circuits for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,28 +25,28 @@ edition = "2021" [dependencies.snarkvm-circuit-account] path = "./account" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-algorithms] path = "./algorithms" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-collections] path = "./collections" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-environment] path = "./environment" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-network] path = "./network" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-program] path = "./program" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types] path = "./types" -version = "=0.16.9" +version = "=0.16.10" diff --git a/circuit/account/Cargo.toml b/circuit/account/Cargo.toml index 632707808f..6668627051 100644 --- a/circuit/account/Cargo.toml +++ b/circuit/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-account" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Account circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-account" path = "../../console/account" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.9" +version = "=0.16.10" [dev-dependencies.snarkvm-utilities] path = "../../utilities" diff --git a/circuit/algorithms/Cargo.toml b/circuit/algorithms/Cargo.toml index b43fc9d9f8..6dafec842a 100644 --- a/circuit/algorithms/Cargo.toml +++ b/circuit/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-algorithms" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Algorithm circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-algorithms" path = "../../console/algorithms" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dev-dependencies.anyhow] diff --git a/circuit/collections/Cargo.toml b/circuit/collections/Cargo.toml index 1bc1dde6c3..d6793fdb30 100644 --- a/circuit/collections/Cargo.toml +++ b/circuit/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-collections" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Collections circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-collections" path = "../../console/collections" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.9" +version = "=0.16.10" [dev-dependencies.snarkvm-circuit-network] path = "../network" diff --git a/circuit/environment/Cargo.toml b/circuit/environment/Cargo.toml index 510221b50e..4f5d902197 100644 --- a/circuit/environment/Cargo.toml +++ b/circuit/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Circuit environment for a decentralized virtual machine" license = "Apache-2.0" @@ -14,32 +14,32 @@ harness = false [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.9" +version = "=0.16.10" default-features = false features = [ "r1cs" ] [dependencies.snarkvm-circuit-environment-witness] path = "./witness" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.indexmap] diff --git a/circuit/environment/witness/Cargo.toml b/circuit/environment/witness/Cargo.toml index 7bef0bb0f5..40e8958670 100644 --- a/circuit/environment/witness/Cargo.toml +++ b/circuit/environment/witness/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment-witness" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "A procedural macro to construct a witness in an environment" license = "Apache-2.0" diff --git a/circuit/network/Cargo.toml b/circuit/network/Cargo.toml index ec8c667568..be3981e1ff 100644 --- a/circuit/network/Cargo.toml +++ b/circuit/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-network" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Network circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.9" +version = "=0.16.10" [dev-dependencies.snarkvm-console-types] path = "../../console/types" diff --git a/circuit/program/Cargo.toml b/circuit/program/Cargo.toml index 3a84b4d718..a9b712730f 100644 --- a/circuit/program/Cargo.toml +++ b/circuit/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-program" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Program circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,32 +9,32 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-program" path = "../../console/program" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-circuit-account] path = "../account" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.9" +version = "=0.16.10" [dependencies.paste] version = "1.0" diff --git a/circuit/types/Cargo.toml b/circuit/types/Cargo.toml index f4e4331c04..56094da688 100644 --- a/circuit/types/Cargo.toml +++ b/circuit/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Primitive circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -8,35 +8,35 @@ edition = "2021" [dependencies.snarkvm-circuit-environment] path = "../environment" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-address] path = "./address" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-boolean] path = "./boolean" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-field] path = "./field" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-group] path = "./group" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-integers] path = "./integers" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-scalar] path = "./scalar" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-string] path = "./string" -version = "=0.16.9" +version = "=0.16.10" [dev-dependencies.console] package = "snarkvm-console" diff --git a/circuit/types/address/Cargo.toml b/circuit/types/address/Cargo.toml index 3ea8252092..873ed94a56 100644 --- a/circuit/types/address/Cargo.toml +++ b/circuit/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-address" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Address circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,28 +9,28 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-address" path = "../../../console/types/address" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-group] path = "../group" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.9" +version = "=0.16.10" [features] default = [ "enable_console" ] diff --git a/circuit/types/boolean/Cargo.toml b/circuit/types/boolean/Cargo.toml index 494bbfa84f..12b55e4137 100644 --- a/circuit/types/boolean/Cargo.toml +++ b/circuit/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-boolean" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Boolean circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -14,12 +14,12 @@ harness = false [dependencies.console] package = "snarkvm-console-types-boolean" path = "../../../console/types/boolean" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.9" +version = "=0.16.10" [dev-dependencies.criterion] version = "0.5" diff --git a/circuit/types/field/Cargo.toml b/circuit/types/field/Cargo.toml index 22b0562265..88e4c3704f 100644 --- a/circuit/types/field/Cargo.toml +++ b/circuit/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-field" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Field circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-field" path = "../../../console/types/field" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.9" +version = "=0.16.10" [features] default = [ "enable_console" ] diff --git a/circuit/types/group/Cargo.toml b/circuit/types/group/Cargo.toml index 858273fbfa..8f3732b992 100644 --- a/circuit/types/group/Cargo.toml +++ b/circuit/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-group" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Group circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-group" path = "../../../console/types/group" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.9" +version = "=0.16.10" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/integers/Cargo.toml b/circuit/types/integers/Cargo.toml index 22d2dbeec3..df55dffc97 100644 --- a/circuit/types/integers/Cargo.toml +++ b/circuit/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-integers" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Integer circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-integers" path = "../../../console/types/integers" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.9" +version = "=0.16.10" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/scalar/Cargo.toml b/circuit/types/scalar/Cargo.toml index c17522b316..936f43a428 100644 --- a/circuit/types/scalar/Cargo.toml +++ b/circuit/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-scalar" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Scalar circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-scalar" path = "../../../console/types/scalar" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.9" +version = "=0.16.10" [features] default = [ "enable_console" ] diff --git a/circuit/types/string/Cargo.toml b/circuit/types/string/Cargo.toml index f822755993..86c3dcfd36 100644 --- a/circuit/types/string/Cargo.toml +++ b/circuit/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-string" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "String circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-string" path = "../../../console/types/string" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-circuit-types-integers] path = "../integers" -version = "=0.16.9" +version = "=0.16.10" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/console/Cargo.toml b/console/Cargo.toml index 4438abba11..77d4d5e838 100644 --- a/console/Cargo.toml +++ b/console/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Console environment for a decentralized virtual machine" license = "Apache-2.0" @@ -8,32 +8,32 @@ edition = "2021" [dependencies.snarkvm-console-account] path = "./account" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-console-algorithms] path = "./algorithms" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-console-collections] path = "./collections" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-console-network] path = "./network" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-console-program] path = "./program" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-console-types] path = "./types" -version = "=0.16.9" +version = "=0.16.10" optional = true [features] diff --git a/console/account/Cargo.toml b/console/account/Cargo.toml index 46e3425f6e..c6f2f5c24b 100644 --- a/console/account/Cargo.toml +++ b/console/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-account" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Account operations for a decentralized virtual machine" license = "Apache-2.0" @@ -13,11 +13,11 @@ harness = false [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.9" +version = "=0.16.10" default-features = false features = [ "address", "boolean", "field", "group", "scalar" ] diff --git a/console/algorithms/Cargo.toml b/console/algorithms/Cargo.toml index 75760a914d..cf2cd34d7c 100644 --- a/console/algorithms/Cargo.toml +++ b/console/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-algorithms" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Console algorithms for a decentralized virtual machine" license = "Apache-2.0" @@ -23,18 +23,18 @@ harness = false [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.9" +version = "=0.16.10" default-features = false features = [ "field", "group", "integers", "scalar" ] [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.9" +version = "=0.16.10" [dependencies.blake2s_simd] version = "1.0" diff --git a/console/collections/Cargo.toml b/console/collections/Cargo.toml index d8962023a5..d61504e7bd 100644 --- a/console/collections/Cargo.toml +++ b/console/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-collections" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Collections for a decentralized virtual machine" license = "Apache-2.0" @@ -18,11 +18,11 @@ harness = false [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.9" +version = "=0.16.10" default-features = false features = [ "field", "integers" ] diff --git a/console/network/Cargo.toml b/console/network/Cargo.toml index a2a53cb3d8..d0fcfda978 100644 --- a/console/network/Cargo.toml +++ b/console/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Network console library for a decentralized virtual machine" license = "Apache-2.0" @@ -15,45 +15,45 @@ wasm = [ [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.9" +version = "=0.16.10" default-features = false features = [ "snark" ] [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-network-environment] path = "./environment" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.9" +version = "=0.16.10" default-features = false features = [ "field", "group", "scalar" ] [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.snarkvm-parameters] path = "../../parameters" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.9" +version = "=0.16.10" [dependencies.anyhow] version = "1.0.73" diff --git a/console/network/environment/Cargo.toml b/console/network/environment/Cargo.toml index fffb5f0377..38b263edf5 100644 --- a/console/network/environment/Cargo.toml +++ b/console/network/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network-environment" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Environment console library for a decentralized virtual machine" license = "Apache-2.0" @@ -8,17 +8,17 @@ edition = "2021" [dependencies.snarkvm-curves] path = "../../../curves" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.snarkvm-fields] path = "../../../fields" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.snarkvm-utilities] path = "../../../utilities" -version = "=0.16.9" +version = "=0.16.10" [dependencies.anyhow] version = "1.0.73" diff --git a/console/program/Cargo.toml b/console/program/Cargo.toml index 035281e8c4..f414de45ce 100644 --- a/console/program/Cargo.toml +++ b/console/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-program" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Program operations for a decentralized virtual machine" license = "Apache-2.0" @@ -12,27 +12,27 @@ test = [ ] [dependencies.snarkvm-console-account] path = "../account" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.9" +version = "=0.16.10" [dependencies.enum_index] version = "0.2" diff --git a/console/types/Cargo.toml b/console/types/Cargo.toml index 75a6939384..a03499db21 100644 --- a/console/types/Cargo.toml +++ b/console/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Console types for a decentralized virtual machine" license = "Apache-2.0" @@ -8,41 +8,41 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../network/environment" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types-address] path = "./address" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-console-types-boolean] path = "./boolean" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-console-types-field] path = "./field" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-console-types-group] path = "./group" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-console-types-integers] path = "./integers" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-console-types-scalar] path = "./scalar" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-console-types-string] path = "./string" -version = "=0.16.9" +version = "=0.16.10" optional = true [features] diff --git a/console/types/address/Cargo.toml b/console/types/address/Cargo.toml index b4d7980109..d770be82bc 100644 --- a/console/types/address/Cargo.toml +++ b/console/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-address" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types-group] path = "../group" -version = "=0.16.9" +version = "=0.16.10" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/boolean/Cargo.toml b/console/types/boolean/Cargo.toml index 1d734603d6..98ac8dd348 100644 --- a/console/types/boolean/Cargo.toml +++ b/console/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-boolean" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,7 +8,7 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.9" +version = "=0.16.10" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/field/Cargo.toml b/console/types/field/Cargo.toml index ae899d5067..65eadf8a80 100644 --- a/console/types/field/Cargo.toml +++ b/console/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-field" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,11 +8,11 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.9" +version = "=0.16.10" [dependencies.zeroize] version = "1" diff --git a/console/types/group/Cargo.toml b/console/types/group/Cargo.toml index 361cca59f4..df7b5aa952 100644 --- a/console/types/group/Cargo.toml +++ b/console/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-group" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.9" +version = "=0.16.10" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/integers/Cargo.toml b/console/types/integers/Cargo.toml index c5001a99c4..7e5dae3d3b 100644 --- a/console/types/integers/Cargo.toml +++ b/console/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-integers" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.9" +version = "=0.16.10" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/scalar/Cargo.toml b/console/types/scalar/Cargo.toml index 42968b9afb..34e8291522 100644 --- a/console/types/scalar/Cargo.toml +++ b/console/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-scalar" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,15 +8,15 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.9" +version = "=0.16.10" [dependencies.zeroize] version = "1" diff --git a/console/types/string/Cargo.toml b/console/types/string/Cargo.toml index 3a17b14609..575ab6a3ed 100644 --- a/console/types/string/Cargo.toml +++ b/console/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-string" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-console-types-integers] path = "../integers" -version = "=0.16.9" +version = "=0.16.10" [dev-dependencies.bincode] version = "1.3" diff --git a/curves/Cargo.toml b/curves/Cargo.toml index 540cb32a06..4af8e49fb0 100644 --- a/curves/Cargo.toml +++ b/curves/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-curves" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Curves for a decentralized virtual machine" homepage = "https://aleo.org" @@ -36,12 +36,12 @@ harness = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.rand] diff --git a/fields/Cargo.toml b/fields/Cargo.toml index 81365cc3a4..258a456771 100644 --- a/fields/Cargo.toml +++ b/fields/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-fields" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Fields for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.aleo-std] diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index 24c21cf0fe..1dab7199fb 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "A node ledger for a decentralized virtual machine" homepage = "https://aleo.org" @@ -56,54 +56,54 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "./authority" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "./block" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "./coinbase" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "./committee" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-narwhal] package = "snarkvm-ledger-narwhal" path = "./narwhal" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "./query" -version = "=0.16.9" +version = "=0.16.10" features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "./store" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-test-helpers] package = "snarkvm-ledger-test-helpers" path = "./test-helpers" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.synthesizer] package = "snarkvm-synthesizer" path = "../synthesizer" -version = "=0.16.9" +version = "=0.16.10" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/authority/Cargo.toml b/ledger/authority/Cargo.toml index f046294032..e7061f2890 100644 --- a/ledger/authority/Cargo.toml +++ b/ledger/authority/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-authority" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Data structures for a block authority in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-subdag/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.9" +version = "=0.16.10" [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.9" +version = "=0.16.10" [dependencies.anyhow] version = "1" diff --git a/ledger/block/Cargo.toml b/ledger/block/Cargo.toml index cd03e139f5..1288dd67bc 100644 --- a/ledger/block/Cargo.toml +++ b/ledger/block/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-block" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "A block for a decentralized virtual machine" homepage = "https://aleo.org" @@ -39,42 +39,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../ledger/coinbase" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../../ledger/committee" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../narwhal/transmission-id" -version = "=0.16.9" +version = "=0.16.10" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.9" +version = "=0.16.10" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.9" +version = "=0.16.10" [dependencies.indexmap] version = "2.0" diff --git a/ledger/coinbase/Cargo.toml b/ledger/coinbase/Cargo.toml index a6292929e2..ad4dd953e8 100644 --- a/ledger/coinbase/Cargo.toml +++ b/ledger/coinbase/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-coinbase" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Coinbase puzzle for a decentralized virtual machine" homepage = "https://aleo.org" @@ -50,27 +50,27 @@ wasm = [ [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-synthesizer-snark] path = "../../synthesizer/snark" -version = "=0.16.9" +version = "=0.16.10" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.aleo-std] diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index c32b70f8b2..38531d419b 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-committee" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "A committee for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,7 +33,7 @@ test-helpers = [ "prop-tests", "rand_distr" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.9" +version = "=0.16.10" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/Cargo.toml b/ledger/narwhal/Cargo.toml index 5db93a32f9..7666d20626 100644 --- a/ledger/narwhal/Cargo.toml +++ b/ledger/narwhal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Data structures for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -64,37 +64,37 @@ transmission-id = [ "narwhal-transmission-id" ] [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "./batch-certificate" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "./batch-header" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "./data" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "./subdag" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.narwhal-transmission] package = "snarkvm-ledger-narwhal-transmission" path = "./transmission" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "./transmission-id" -version = "=0.16.9" +version = "=0.16.10" optional = true [dev-dependencies.snarkvm-ledger-narwhal] diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index 0fc9354bf2..e4aa3aee7d 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-header/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.9" +version = "=0.16.10" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.9" +version = "=0.16.10" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.9" +version = "=0.16.10" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/batch-header/Cargo.toml b/ledger/narwhal/batch-header/Cargo.toml index 5498c128df..de13c1f939 100644 --- a/ledger/narwhal/batch-header/Cargo.toml +++ b/ledger/narwhal/batch-header/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "A batch header for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-transmission-id/test-helpers", "time" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.9" +version = "=0.16.10" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.9" +version = "=0.16.10" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/data/Cargo.toml b/ledger/narwhal/data/Cargo.toml index 023ed920b0..66387e8fe1 100644 --- a/ledger/narwhal/data/Cargo.toml +++ b/ledger/narwhal/data/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-data" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -29,7 +29,7 @@ async = [ "tokio" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.9" +version = "=0.16.10" [dependencies.bytes] version = "1" diff --git a/ledger/narwhal/subdag/Cargo.toml b/ledger/narwhal/subdag/Cargo.toml index 627d57d9c1..95e8c51aa2 100644 --- a/ledger/narwhal/subdag/Cargo.toml +++ b/ledger/narwhal/subdag/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "A subdag for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ "narwhal-batch-certificate/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.9" +version = "=0.16.10" [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../batch-certificate" -version = "=0.16.9" +version = "=0.16.10" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.9" +version = "=0.16.10" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.9" +version = "=0.16.10" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/transmission-id/Cargo.toml b/ledger/narwhal/transmission-id/Cargo.toml index 403817fa1a..e2582f472b 100644 --- a/ledger/narwhal/transmission-id/Cargo.toml +++ b/ledger/narwhal/transmission-id/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "A transmission ID for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.9" +version = "=0.16.10" [dev-dependencies.bincode] version = "1.3" diff --git a/ledger/narwhal/transmission/Cargo.toml b/ledger/narwhal/transmission/Cargo.toml index 53b49d6eab..f5e6ff0e35 100644 --- a/ledger/narwhal/transmission/Cargo.toml +++ b/ledger/narwhal/transmission/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "A transmission for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../block" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "../data" -version = "=0.16.9" +version = "=0.16.10" [dependencies.bytes] version = "1" diff --git a/ledger/query/Cargo.toml b/ledger/query/Cargo.toml index 5a436c8502..71ca63b829 100644 --- a/ledger/query/Cargo.toml +++ b/ledger/query/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-query" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "A query for a decentralized virtual machine" homepage = "https://aleo.org" @@ -30,18 +30,18 @@ query = [ "ledger-store", "synthesizer-program", "ureq" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.async-trait] diff --git a/ledger/store/Cargo.toml b/ledger/store/Cargo.toml index ca6c512d23..3c495badb6 100644 --- a/ledger/store/Cargo.toml +++ b/ledger/store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-store" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "A data store for a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,42 +32,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../coinbase" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../committee" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../narwhal/batch-certificate" -version = "=0.16.9" +version = "=0.16.10" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.9" +version = "=0.16.10" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.9" +version = "=0.16.10" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/test-helpers/Cargo.toml b/ledger/test-helpers/Cargo.toml index 491d7e2e36..f778177bf1 100644 --- a/ledger/test-helpers/Cargo.toml +++ b/ledger/test-helpers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-test-helpers" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Test helpers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -19,39 +19,39 @@ edition = "2021" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.9" +version = "=0.16.10" [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../query" -version = "=0.16.9" +version = "=0.16.10" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.9" +version = "=0.16.10" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.9" +version = "=0.16.10" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "../../synthesizer/process" -version = "=0.16.9" +version = "=0.16.10" [dependencies.once_cell] version = "1.18" diff --git a/parameters/Cargo.toml b/parameters/Cargo.toml index 67527e8515..1ca4249a42 100644 --- a/parameters/Cargo.toml +++ b/parameters/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-parameters" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Parameters for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "encoding", "js-sys", "web-sys" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.9" +version = "=0.16.10" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/Cargo.toml b/synthesizer/Cargo.toml index eb49845932..ab7871a71a 100644 --- a/synthesizer/Cargo.toml +++ b/synthesizer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Synthesizer for a decentralized virtual machine" homepage = "https://aleo.org" @@ -68,61 +68,61 @@ harness = false [dependencies.algorithms] package = "snarkvm-algorithms" path = "../algorithms" -version = "=0.16.9" +version = "=0.16.10" [dependencies.circuit] package = "snarkvm-circuit" path = "../circuit" -version = "=0.16.9" +version = "=0.16.10" [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../ledger/block" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../ledger/coinbase" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../ledger/committee" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../ledger/query" -version = "=0.16.9" +version = "=0.16.10" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../ledger/store" -version = "=0.16.9" +version = "=0.16.10" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "./process" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "./program" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "./snark" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.aleo-std] diff --git a/synthesizer/process/Cargo.toml b/synthesizer/process/Cargo.toml index 67860d2381..8fe0dfed81 100644 --- a/synthesizer/process/Cargo.toml +++ b/synthesizer/process/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-process" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "A process for a decentralized virtual machine" homepage = "https://aleo.org" @@ -48,45 +48,45 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.9" +version = "=0.16.10" default-features = false features = [ "network", "program", "types" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../ledger/block" -version = "=0.16.9" +version = "=0.16.10" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../../ledger/query" -version = "=0.16.9" +version = "=0.16.10" default-features = false [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../../ledger/store" -version = "=0.16.9" +version = "=0.16.10" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.9" +version = "=0.16.10" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.9" +version = "=0.16.10" [dependencies.utilities] package = "snarkvm-utilities" path = "../../utilities" -version = "=0.16.9" +version = "=0.16.10" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/program/Cargo.toml b/synthesizer/program/Cargo.toml index 57afe2043f..dabcdd53d1 100644 --- a/synthesizer/program/Cargo.toml +++ b/synthesizer/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-program" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Program for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "console/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.9" +version = "=0.16.10" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.9" +version = "=0.16.10" default-features = false features = [ "account", "network", "program", "types" ] diff --git a/synthesizer/snark/Cargo.toml b/synthesizer/snark/Cargo.toml index 1fc172f014..66023365be 100644 --- a/synthesizer/snark/Cargo.toml +++ b/synthesizer/snark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-snark" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "SNARK wrappers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,18 +33,18 @@ wasm = [ "console/wasm", "snarkvm-algorithms/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.9" +version = "=0.16.10" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.9" +version = "=0.16.10" default-features = false features = [ "network" ] [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.9" +version = "=0.16.10" [dependencies.bincode] version = "1" diff --git a/utilities/Cargo.toml b/utilities/Cargo.toml index 6b569d6dd0..4b781db5d7 100644 --- a/utilities/Cargo.toml +++ b/utilities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Utilities for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities-derives] path = "./derives" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.aleo-std] diff --git a/utilities/derives/Cargo.toml b/utilities/derives/Cargo.toml index cc0a41a12e..2d878556f0 100644 --- a/utilities/derives/Cargo.toml +++ b/utilities/derives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities-derives" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "Canonical serialization for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 854221d4f8..cef394707c 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-wasm" -version = "0.16.9" +version = "0.16.10" authors = [ "The Aleo Team " ] description = "WASM for a decentralized virtual machine" homepage = "https://aleo.org" @@ -28,30 +28,30 @@ crate-type = [ "cdylib", "rlib" ] [dependencies.snarkvm-console] path = "../console" -version = "=0.16.9" +version = "=0.16.10" features = [ "wasm" ] optional = true [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.9" +version = "=0.16.10" optional = true [dependencies.snarkvm-synthesizer] path = "../synthesizer" -version = "=0.16.9" +version = "=0.16.10" default-features = false features = [ "wasm" ] optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.9" +version = "=0.16.10" features = [ "wasm" ] optional = true From 4522cc499eddb3f99fd1e5ecb2d2e19ed578e329 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 14 Nov 2023 11:50:18 +0100 Subject: [PATCH 141/339] perf: reserve the exact capacity in more ToBits impls Signed-off-by: ljedrz --- fields/src/fp_256.rs | 4 ++++ fields/src/fp_384.rs | 4 ++++ utilities/src/bits.rs | 22 +++++++++++++++++++--- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/fields/src/fp_256.rs b/fields/src/fp_256.rs index 02760186e3..15af78a1e1 100644 --- a/fields/src/fp_256.rs +++ b/fields/src/fp_256.rs @@ -583,6 +583,10 @@ impl ToBits for Fp256

      { self.write_bits_le(vec); vec[initial_len..].reverse(); } + + fn num_bits() -> Option { + Some(256) + } } impl ToBytes for Fp256

      { diff --git a/fields/src/fp_384.rs b/fields/src/fp_384.rs index 02e8791fa6..596ef055c2 100644 --- a/fields/src/fp_384.rs +++ b/fields/src/fp_384.rs @@ -612,6 +612,10 @@ impl ToBits for Fp384

      { self.write_bits_le(vec); vec[initial_len..].reverse(); } + + fn num_bits() -> Option { + Some(384) + } } impl ToBytes for Fp384

      { diff --git a/utilities/src/bits.rs b/utilities/src/bits.rs index 4523ec50c4..53e9a04c44 100644 --- a/utilities/src/bits.rs +++ b/utilities/src/bits.rs @@ -41,17 +41,22 @@ pub trait ToBits: Sized { /// Returns `self` as a boolean array in little-endian order. fn to_bits_le(&self) -> Vec { - let mut bits = Vec::with_capacity(32); + let mut bits = Vec::new(); self.write_bits_le(&mut bits); bits } /// Returns `self` as a boolean array in big-endian order. fn to_bits_be(&self) -> Vec { - let mut bits = Vec::with_capacity(32); + let mut bits = Vec::new(); self.write_bits_be(&mut bits); bits } + + /// An optional indication of how many bits an object can be represented with. + fn num_bits() -> Option { + None + } } pub trait FromBits: Sized { @@ -144,7 +149,6 @@ macro_rules! impl_bits_for_integer { /// Returns `self` as a boolean array in little-endian order. #[inline] fn write_bits_le(&self, vec: &mut Vec) { - vec.reserve(<$int>::BITS as usize); let mut value = *self; for _ in 0..<$int>::BITS { vec.push(value & 1 == 1); @@ -158,6 +162,10 @@ macro_rules! impl_bits_for_integer { let reversed = self.reverse_bits(); reversed.write_bits_le(vec); } + + fn num_bits() -> Option { + Some(<$int>::BITS as usize) + } } impl FromBits for $int { @@ -266,6 +274,10 @@ impl ToBits for &[C] { /// A helper method to return a concatenated list of little-endian bits. #[inline] fn write_bits_le(&self, vec: &mut Vec) { + if let Some(num_bits) = C::num_bits() { + vec.reserve(num_bits * self.len()); + } + for elem in self.iter() { elem.write_bits_le(vec); } @@ -274,6 +286,10 @@ impl ToBits for &[C] { /// A helper method to return a concatenated list of big-endian bits. #[inline] fn write_bits_be(&self, vec: &mut Vec) { + if let Some(num_bits) = C::num_bits() { + vec.reserve(num_bits * self.len()); + } + for elem in self.iter() { elem.write_bits_be(vec); } From 46a4bb4f47dcc00c429f8eaff5f82422056c9a9e Mon Sep 17 00:00:00 2001 From: ljedrz Date: Wed, 15 Nov 2023 13:13:23 +0100 Subject: [PATCH 142/339] perf: preallocate the lookup table in PoseidonSponge::get_fe Signed-off-by: ljedrz --- algorithms/src/crypto_hash/poseidon.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/src/crypto_hash/poseidon.rs b/algorithms/src/crypto_hash/poseidon.rs index e7da888a3a..87eb54a4d6 100644 --- a/algorithms/src/crypto_hash/poseidon.rs +++ b/algorithms/src/crypto_hash/poseidon.rs @@ -464,7 +464,7 @@ impl PoseidonSponge { }; let bits = self.get_bits(num_bits_per_nonnative * num_elements); - let mut lookup_table = Vec::::new(); + let mut lookup_table = Vec::::with_capacity(num_bits_per_nonnative); let mut cur = TargetField::one(); for _ in 0..num_bits_per_nonnative { lookup_table.push(cur); From a54eb6c27a5b3853d8b13caf256fbdff4fbdaed4 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Thu, 16 Nov 2023 12:20:20 +0100 Subject: [PATCH 143/339] perf: increase the capacity of new_bases in batch_add Signed-off-by: ljedrz --- algorithms/src/msm/variable_base/batched.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/src/msm/variable_base/batched.rs b/algorithms/src/msm/variable_base/batched.rs index 18fe9e9b8e..eb8e729183 100644 --- a/algorithms/src/msm/variable_base/batched.rs +++ b/algorithms/src/msm/variable_base/batched.rs @@ -192,7 +192,7 @@ pub(super) fn batch_add( let mut number_of_bases_in_batch = 0; let mut instr = Vec::<(u32, u32)>::with_capacity(batch_size); - let mut new_bases = Vec::with_capacity(bases.len() * 3 / 8); + let mut new_bases = Vec::with_capacity(bases.len()); let mut scratch_space = Vec::with_capacity(batch_size / 2); // In the first loop, copy the results of the first in-place addition tree to the vector `new_bases`. From 6b55ecd8f5dfa406698ff45bc54c678703c2e7d2 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Thu, 16 Nov 2023 12:26:18 +0100 Subject: [PATCH 144/339] perf: increase the capacity of ell_coeffs in G2Prepared::from_affine Signed-off-by: ljedrz --- curves/src/templates/bls12/g2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/curves/src/templates/bls12/g2.rs b/curves/src/templates/bls12/g2.rs index af3a62ff63..141b6dede3 100644 --- a/curves/src/templates/bls12/g2.rs +++ b/curves/src/templates/bls12/g2.rs @@ -92,7 +92,7 @@ impl G2Prepared

      { let mut r = G2HomProjective { x: q.x, y: q.y, z: Fp2::one() }; let bit_iterator = BitIteratorBE::new(P::X); - let mut ell_coeffs = Vec::with_capacity(bit_iterator.len()); + let mut ell_coeffs = Vec::with_capacity(bit_iterator.len() * 3 / 2); // `one_half` = 1/2 in the field. let one_half = P::Fp::half(); From 2c812de9e6427be1bbaf8a025210f66fc0796de3 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Thu, 16 Nov 2023 12:33:58 +0100 Subject: [PATCH 145/339] perf: impl ExactSizeIterator for LFSRIter Signed-off-by: ljedrz --- fields/src/traits/poseidon_grain_lfsr.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fields/src/traits/poseidon_grain_lfsr.rs b/fields/src/traits/poseidon_grain_lfsr.rs index c8931f4f68..4768d91115 100644 --- a/fields/src/traits/poseidon_grain_lfsr.rs +++ b/fields/src/traits/poseidon_grain_lfsr.rs @@ -199,3 +199,9 @@ impl<'a> Iterator for LFSRIter<'a> { } } } + +impl<'a> ExactSizeIterator for LFSRIter<'a> { + fn len(&self) -> usize { + self.num_bits + } +} From 1f5217de8ce50485b8259d9e80e8ac1cb848de58 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Thu, 16 Nov 2023 12:55:40 +0100 Subject: [PATCH 146/339] perf: tweak iteration in PoseidonGrainLFSR::get_field_elements_mod_p Signed-off-by: ljedrz --- fields/src/traits/poseidon_grain_lfsr.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fields/src/traits/poseidon_grain_lfsr.rs b/fields/src/traits/poseidon_grain_lfsr.rs index 4768d91115..401469d1f8 100644 --- a/fields/src/traits/poseidon_grain_lfsr.rs +++ b/fields/src/traits/poseidon_grain_lfsr.rs @@ -124,7 +124,11 @@ impl PoseidonGrainLFSR { let mut output = Vec::with_capacity(num_elems); for _ in 0..num_elems { // Obtain `n` bits and make it most-significant-bit first. - let mut bits = self.get_bits(self.field_size_in_bits as usize).collect::>(); + let bits_iter = self.get_bits(self.field_size_in_bits as usize); + let mut bits = Vec::with_capacity(bits_iter.len()); + for bit in bits_iter { + bits.push(bit); + } bits.reverse(); let bytes = bits From 0550fbcce1737c997bd18c99e77ef228fa3c84bc Mon Sep 17 00:00:00 2001 From: ljedrz Date: Thu, 16 Nov 2023 13:25:30 +0100 Subject: [PATCH 147/339] perf: tweak witness_label Signed-off-by: ljedrz --- algorithms/src/snark/varuna/ahp/ahp.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/algorithms/src/snark/varuna/ahp/ahp.rs b/algorithms/src/snark/varuna/ahp/ahp.rs index fc6bea6d5d..27a751cc3c 100644 --- a/algorithms/src/snark/varuna/ahp/ahp.rs +++ b/algorithms/src/snark/varuna/ahp/ahp.rs @@ -32,7 +32,7 @@ use snarkvm_fields::{Field, PrimeField}; use core::{borrow::Borrow, marker::PhantomData}; use itertools::Itertools; -use std::collections::BTreeMap; +use std::{collections::BTreeMap, fmt::Write}; /// The algebraic holographic proof defined in [CHMMVW19](https://eprint.iacr.org/2019/1047). /// Currently, this AHP only supports inputs of size one @@ -43,7 +43,9 @@ pub struct AHPForR1CS { } pub(crate) fn witness_label(circuit_id: CircuitId, poly: &str, i: usize) -> String { - format!("circuit_{circuit_id}_{poly}_{i:0>8}") + let mut label = String::with_capacity(82 + poly.len()); + let _ = write!(&mut label, "circuit_{circuit_id}_{poly}_{i:0>8}"); + label } pub(crate) struct NonZeroDomains { From a82d99aeb256507d8f219ab9e0932a9967efb7dd Mon Sep 17 00:00:00 2001 From: ljedrz Date: Thu, 16 Nov 2023 14:34:03 +0100 Subject: [PATCH 148/339] perf: use try_reserve in the CanonicalDeserialize impl for Vec Signed-off-by: ljedrz --- utilities/src/serialize/impls.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/utilities/src/serialize/impls.rs b/utilities/src/serialize/impls.rs index f163180df1..b82d668167 100644 --- a/utilities/src/serialize/impls.rs +++ b/utilities/src/serialize/impls.rs @@ -424,6 +424,7 @@ impl CanonicalDeserialize for Vec { ) -> Result { let len = u64::deserialize_with_mode(&mut reader, compress, validate)?; let mut values = Vec::new(); + let _ = values.try_reserve(len as usize); for _ in 0..len { values.push(T::deserialize_with_mode(&mut reader, compress, Validate::No)?); } From 247ff80a7855116b8ab0f128d1dc1a0bbde3fbb8 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Thu, 16 Nov 2023 15:59:35 +0100 Subject: [PATCH 149/339] perf: pre-allocate ExecutionPools in PolyMultiplier Signed-off-by: ljedrz --- algorithms/src/fft/polynomial/multiplier.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/algorithms/src/fft/polynomial/multiplier.rs b/algorithms/src/fft/polynomial/multiplier.rs index 66d7a82c9e..c93aa4de76 100644 --- a/algorithms/src/fft/polynomial/multiplier.rs +++ b/algorithms/src/fft/polynomial/multiplier.rs @@ -102,7 +102,7 @@ impl<'a, F: PrimeField> PolyMultiplier<'a, F> { } let fft_pc = &self.fft_precomputation.unwrap(); let ifft_pc = &self.ifft_precomputation.unwrap(); - let mut pool = ExecutionPool::new(); + let mut pool = ExecutionPool::with_capacity(self.polynomials.len() + self.evaluations.len()); for (_, p) in self.polynomials { pool.add_job(move || { let mut p = p.clone().into_owned().coeffs; @@ -146,7 +146,7 @@ impl<'a, F: PrimeField> PolyMultiplier<'a, F> { Some(Cow::Owned(self.fft_precomputation.as_ref().unwrap().to_ifft_precomputation())); } let fft_pc = self.fft_precomputation.as_ref().unwrap(); - let mut pool = ExecutionPool::new(); + let mut pool = ExecutionPool::with_capacity(self.polynomials.len() + self.evaluations.len()); for (l, p) in self.polynomials { pool.add_job(move || { let mut p = p.clone().into_owned().coeffs; From d5e0ee787c382aefec72185855bea78248198437 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Fri, 17 Nov 2023 10:51:52 +0100 Subject: [PATCH 150/339] perf: reduce the number of allocations in BHP::hash Signed-off-by: ljedrz --- console/algorithms/src/bhp/hash_uncompressed.rs | 12 ++++++------ .../src/bhp/hasher/hash_uncompressed.rs | 15 ++++++++++----- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/console/algorithms/src/bhp/hash_uncompressed.rs b/console/algorithms/src/bhp/hash_uncompressed.rs index 8d4ee3283d..85d16ec591 100644 --- a/console/algorithms/src/bhp/hash_uncompressed.rs +++ b/console/algorithms/src/bhp/hash_uncompressed.rs @@ -38,31 +38,31 @@ impl HashUncompres // Initialize a variable to store the hash from the current iteration. let mut digest = Group::::zero(); + // Prepare a reusable vector for the preimage. + let mut preimage = Vec::with_capacity(num_hasher_bits); + // Compute the hash of the input. for (i, input_bits) in input.chunks(max_input_bits_per_iteration).enumerate() { // Determine if this is the first iteration. - let preimage = match i == 0 { + match i == 0 { // Construct the first iteration as: [ 0...0 || DOMAIN || LENGTH(INPUT) || INPUT[0..BLOCK_SIZE] ]. true => { // Initialize a vector for the hash preimage. - let mut preimage = Vec::with_capacity(num_hasher_bits); preimage.extend(&self.domain); (input.len() as u64).write_bits_le(&mut preimage); preimage.extend(input_bits); - preimage } // Construct the subsequent iterations as: [ PREVIOUS_HASH[0..DATA_BITS] || INPUT[I * BLOCK_SIZE..(I + 1) * BLOCK_SIZE] ]. false => { // Initialize a vector for the hash preimage. - let mut preimage = Vec::with_capacity(num_hasher_bits); digest.to_x_coordinate().write_bits_le(&mut preimage); preimage.truncate(num_data_bits); preimage.extend(input_bits); - preimage } - }; + } // Hash the preimage for this iteration. digest = self.hasher.hash_uncompressed(&preimage)?; + preimage.clear(); } Ok(digest) diff --git a/console/algorithms/src/bhp/hasher/hash_uncompressed.rs b/console/algorithms/src/bhp/hasher/hash_uncompressed.rs index a8103ae41a..afad77765a 100644 --- a/console/algorithms/src/bhp/hasher/hash_uncompressed.rs +++ b/console/algorithms/src/bhp/hasher/hash_uncompressed.rs @@ -14,6 +14,8 @@ use super::*; +use std::borrow::Cow; + impl HashUncompressed for BHPHasher { @@ -36,12 +38,15 @@ impl HashUncompres ); // Pad the input to a multiple of `BHP_CHUNK_SIZE` for hashing. - let mut input = input.to_vec(); - if input.len() % BHP_CHUNK_SIZE != 0 { + let input = if input.len() % BHP_CHUNK_SIZE != 0 { let padding = BHP_CHUNK_SIZE - (input.len() % BHP_CHUNK_SIZE); - input.resize(input.len() + padding, false); - ensure!((input.len() % BHP_CHUNK_SIZE) == 0, "Input must be a multiple of {BHP_CHUNK_SIZE}"); - } + let mut padded_input = vec![false; input.len() + padding]; + padded_input[..input.len()].copy_from_slice(input); + ensure!((padded_input.len() % BHP_CHUNK_SIZE) == 0, "Input must be a multiple of {BHP_CHUNK_SIZE}"); + Cow::Owned(padded_input) + } else { + Cow::Borrowed(input) + }; // Compute sum of h_i^{sum of (1-2*c_{i,j,2})*(1+c_{i,j,0}+2*c_{i,j,1})*2^{4*(j-1)} for all j in segment} // for all i. Described in section 5.4.1.7 in the Zcash protocol specification. From fba97999c04f65814d79d34f818def152820ce0a Mon Sep 17 00:00:00 2001 From: ljedrz Date: Fri, 17 Nov 2023 14:39:07 +0100 Subject: [PATCH 151/339] perf: reduce the number of allocations in BHP::hash for circuits Signed-off-by: ljedrz --- circuit/algorithms/src/bhp/hash_uncompressed.rs | 12 ++++++------ .../src/bhp/hasher/hash_uncompressed.rs | 16 +++++++++++----- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/circuit/algorithms/src/bhp/hash_uncompressed.rs b/circuit/algorithms/src/bhp/hash_uncompressed.rs index 54a2edee22..3ff67de6f8 100644 --- a/circuit/algorithms/src/bhp/hash_uncompressed.rs +++ b/circuit/algorithms/src/bhp/hash_uncompressed.rs @@ -38,31 +38,31 @@ impl HashUncompres // Initialize a variable to store the hash from the current iteration. let mut digest = Group::zero(); + // Prepare a reusable vector for the preimage. + let mut preimage = Vec::with_capacity(num_hasher_bits); + // Compute the hash of the input. for (i, input_bits) in input.chunks(max_input_bits_per_iteration).enumerate() { // Determine if this is the first iteration. - let preimage = match i == 0 { + match i == 0 { // Construct the first iteration as: [ 0...0 || DOMAIN || LENGTH(INPUT) || INPUT[0..BLOCK_SIZE] ]. true => { // Initialize a vector for the hash preimage. - let mut preimage = Vec::with_capacity(num_hasher_bits); preimage.extend(self.domain.clone()); U64::constant(console::U64::new(input.len() as u64)).write_bits_le(&mut preimage); preimage.extend_from_slice(input_bits); - preimage } // Construct the subsequent iterations as: [ PREVIOUS_HASH[0..DATA_BITS] || INPUT[I * BLOCK_SIZE..(I + 1) * BLOCK_SIZE] ]. false => { // Initialize a vector for the hash preimage. - let mut preimage = Vec::with_capacity(num_hasher_bits); digest.to_x_coordinate().write_bits_le(&mut preimage); preimage.truncate(num_data_bits); preimage.extend_from_slice(input_bits); - preimage } - }; + } // Hash the preimage for this iteration. digest = self.hasher.hash_uncompressed(&preimage); + preimage.clear(); } digest diff --git a/circuit/algorithms/src/bhp/hasher/hash_uncompressed.rs b/circuit/algorithms/src/bhp/hasher/hash_uncompressed.rs index 5812bf25ad..1120b9848e 100644 --- a/circuit/algorithms/src/bhp/hasher/hash_uncompressed.rs +++ b/circuit/algorithms/src/bhp/hasher/hash_uncompressed.rs @@ -14,6 +14,8 @@ use super::*; +use std::borrow::Cow; + impl HashUncompressed for BHPHasher { @@ -31,18 +33,22 @@ impl HashUncompres } // Ensure the input size is within the parameter size. - let mut input = input.to_vec(); - match input.len() <= Self::MAX_BITS { + let input = match input.len() <= Self::MAX_BITS { true => { // Pad the input to a multiple of `BHP_CHUNK_SIZE` for hashing. if input.len() % BHP_CHUNK_SIZE != 0 { let padding = BHP_CHUNK_SIZE - (input.len() % BHP_CHUNK_SIZE); - input.resize(input.len() + padding, Boolean::constant(false)); - assert_eq!(input.len() % BHP_CHUNK_SIZE, 0, "Input must be a multiple of {BHP_CHUNK_SIZE}"); + let mut padded_input = Vec::with_capacity(input.len() + padding); + padded_input.extend_from_slice(input); + padded_input.resize(input.len() + padding, Boolean::constant(false)); + assert_eq!(padded_input.len() % BHP_CHUNK_SIZE, 0, "Input must be a multiple of {BHP_CHUNK_SIZE}"); + Cow::Owned(padded_input) + } else { + Cow::Borrowed(input) } } false => E::halt(format!("Inputs to this BHP cannot exceed {} bits", Self::MAX_BITS)), - } + }; // Declare the 1 constant field element. let one = Field::one(); From 95959507a1e2da6f37c4c04608abef8e66d668e5 Mon Sep 17 00:00:00 2001 From: Jos Dehaes Date: Wed, 11 Oct 2023 10:46:16 +0200 Subject: [PATCH 152/339] feat: metrics --- Cargo.toml | 7 +++++++ ledger/Cargo.toml | 1 + ledger/committee/Cargo.toml | 11 +++++++++++ ledger/committee/src/lib.rs | 6 ++++++ ledger/narwhal/subdag/src/lib.rs | 4 ++++ metrics/Cargo.toml | 30 ++++++++++++++++++++++++++++++ metrics/src/lib.rs | 28 ++++++++++++++++++++++++++++ vm/lib.rs | 2 ++ 8 files changed, 89 insertions(+) create mode 100644 metrics/Cargo.toml create mode 100644 metrics/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index e4690b9d9e..c5bf78932a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -76,6 +76,7 @@ members = [ "ledger/query", "ledger/store", "ledger/test-helpers", + "metrics", "parameters", "synthesizer", "synthesizer/process", @@ -144,6 +145,7 @@ parameters = [ "snarkvm-parameters" ] synthesizer = [ "snarkvm-synthesizer" ] utilities = [ "snarkvm-utilities" ] wasm = [ "snarkvm-wasm" ] +metrics = [ "snarkvm-metrics", "snarkvm-ledger/metrics" ] [dependencies.snarkvm-algorithms] path = "./algorithms" @@ -175,6 +177,11 @@ path = "./ledger" version = "=0.16.10" optional = true +[dependencies.snarkvm-metrics] +path = "./metrics" +version = "=0.15.4" +optional = true + [dependencies.snarkvm-parameters] path = "./parameters" version = "=0.16.10" diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index 1dab7199fb..ffb933acc7 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -52,6 +52,7 @@ test-helpers = [ "ledger-narwhal/test-helpers" ] timer = [ "aleo-std/timer" ] +metrics = [ "ledger-committee/metrics" ] [dependencies.console] package = "snarkvm-console" diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index 38531d419b..178c84d1be 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -29,12 +29,19 @@ serial = [ "console/serial" ] wasm = [ "console/wasm" ] prop-tests = [ "rand", "rand_chacha", "test-strategy", "proptest", "anyhow" ] test-helpers = [ "prop-tests", "rand_distr" ] +metrics = [ "dep:snarkvm-metrics", "dep:metrics" ] [dependencies.console] package = "snarkvm-console" path = "../../console" version = "=0.16.10" +[dependencies.snarkvm-metrics] +package = "snarkvm-metrics" +path = "../../metrics" +version = "=0.15.4" +optional = true + [dependencies.indexmap] version = "2.0" features = [ "serde", "rayon" ] @@ -67,6 +74,10 @@ optional = true version = "0.3.1" optional = true +[dependencies.metrics] +version = "0.21" +optional = true + [dev-dependencies.bincode] version = "1.3" diff --git a/ledger/committee/src/lib.rs b/ledger/committee/src/lib.rs index 5d81de4414..6ee024badc 100644 --- a/ledger/committee/src/lib.rs +++ b/ledger/committee/src/lib.rs @@ -26,6 +26,10 @@ use console::{ }; use indexmap::IndexMap; +#[cfg(feature = "metrics")] +use metrics::gauge; +#[cfg(feature = "metrics")] +use snarkvm_metrics::committee::TOTAL_STAKE; use std::collections::HashSet; /// The minimum amount of stake required for a validator to bond. @@ -72,6 +76,8 @@ impl Committee { ); // Compute the total stake of the committee for this round. let total_stake = Self::compute_total_stake(&members)?; + #[cfg(feature = "metrics")] + gauge!(TOTAL_STAKE, total_stake as f64); // Return the new committee. Ok(Self { starting_round, members, total_stake }) } diff --git a/ledger/narwhal/subdag/src/lib.rs b/ledger/narwhal/subdag/src/lib.rs index 8fb93cfe9b..c2854cc45d 100644 --- a/ledger/narwhal/subdag/src/lib.rs +++ b/ledger/narwhal/subdag/src/lib.rs @@ -159,6 +159,10 @@ impl Subdag { } } + pub fn commited_certificates(&self) -> u64 { + self.subdag.values().map(|round_cert| round_cert.len() as u64).sum() + } + /// Returns the subdag root of the transactions. pub fn to_subdag_root(&self) -> Result> { // Prepare the leaves. diff --git a/metrics/Cargo.toml b/metrics/Cargo.toml new file mode 100644 index 0000000000..42df0e2725 --- /dev/null +++ b/metrics/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "snarkvm-metrics" +version = "0.15.4" +authors = [ "The Aleo Team " ] +description = "Metrics for a decentralized virtual machine" +homepage = "https://aleo.org" +repository = "https://github.com/AleoHQ/snarkVM" +keywords = [ + "aleo", + "cryptography", + "blockchain", + "decentralized", + "zero-knowledge" +] +categories = [ + "compilers", + "cryptography", + "mathematics", + "wasm", + "web-programming" +] +include = [ "Cargo.toml", "src", "README.md", "LICENSE.md" ] +license = "Apache-2.0" +edition = "2021" + +[dependencies.metrics] +version = "0.21" + +[dependencies.metrics-exporter-prometheus] +version = "0.12" diff --git a/metrics/src/lib.rs b/metrics/src/lib.rs new file mode 100644 index 0000000000..ff2d098925 --- /dev/null +++ b/metrics/src/lib.rs @@ -0,0 +1,28 @@ +// Copyright (C) 2019-2023 Aleo Systems Inc. +// This file is part of the snarkVM library. + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Re-export the metrics macros. +pub use metrics::*; + +pub const GAUGE_NAMES: [&str; 1] = [committee::TOTAL_STAKE]; + +pub mod committee { + pub const TOTAL_STAKE: &str = "snarkvm_committee_total_stake"; +} + +pub fn register_metrics() { + for name in GAUGE_NAMES { + register_gauge!(name); + } +} diff --git a/vm/lib.rs b/vm/lib.rs index cc5d1cfdaa..60d18da0df 100644 --- a/vm/lib.rs +++ b/vm/lib.rs @@ -37,6 +37,8 @@ pub use snarkvm_curves as curves; pub use snarkvm_fields as fields; #[cfg(feature = "ledger")] pub use snarkvm_ledger as ledger; +#[cfg(feature = "metrics")] +pub use snarkvm_metrics as metrics; #[cfg(feature = "parameters")] pub use snarkvm_parameters as parameters; #[cfg(feature = "synthesizer")] From 58a4785d50eab0e3a575c31a594d9c9561d1742d Mon Sep 17 00:00:00 2001 From: Jos Dehaes Date: Wed, 11 Oct 2023 10:46:23 +0200 Subject: [PATCH 153/339] chore: update lock file --- Cargo.lock | 582 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 357 insertions(+), 225 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f8d6c32825..bde9b21922 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,13 +19,14 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", "once_cell", "version_check", + "zerocopy", ] [[package]] @@ -186,13 +187,13 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "async-trait" -version = "0.1.73" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -218,9 +219,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.21.4" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "bech32" @@ -255,7 +256,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -281,9 +282,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "blake2" @@ -433,9 +434,9 @@ dependencies = [ [[package]] name = "cl3" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "215a3aa32ab5d7928c539c4289d1cf144257c3cb05e05a4b7e61d5a6bb6583a5" +checksum = "96fd7abe572cee1c781e3464d5c468e8aee10caaef3ea911aea0dea16414409d" dependencies = [ "libc", "opencl-sys", @@ -455,9 +456,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.6" +version = "4.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d04704f56c2cde07f43e8e2c154b43f216dc5c92fc98ada720177362f953b956" +checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64" dependencies = [ "clap_builder", "clap_derive", @@ -465,9 +466,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.6" +version = "4.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e231faeaca65ebd1ea3c737966bf858971cd38c3849107aa3ea7de90a804e45" +checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc" dependencies = [ "anstream", "anstyle", @@ -477,21 +478,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.2" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ "heck", "proc-macro2", "quote 1.0.33", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "clap_lex" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "colorchoice" @@ -557,9 +558,9 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] @@ -697,7 +698,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "socket2 0.4.9", + "socket2 0.4.10", "winapi", ] @@ -723,7 +724,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.1", + "hashbrown 0.14.2", "lock_api", "once_cell", "parking_lot_core", @@ -911,9 +912,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" +checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" dependencies = [ "libc", "windows-sys 0.48.0", @@ -1004,9 +1005,9 @@ checksum = "c1fd087255f739f4f1aeea69f11b72f8080e9c2e7645cd06955dad4a178a49e3" [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -1019,9 +1020,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -1029,15 +1030,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -1046,27 +1047,27 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -1109,9 +1110,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if", "js-sys", @@ -1134,9 +1135,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "h2" -version = "0.3.21" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", @@ -1144,7 +1145,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", @@ -1165,9 +1166,18 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.1" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" dependencies = [ "ahash", "allocator-api2", @@ -1202,9 +1212,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -1251,7 +1261,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.9", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -1293,12 +1303,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.1", + "hashbrown 0.14.2", "rayon", "serde", ] @@ -1327,9 +1337,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" @@ -1377,9 +1387,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" dependencies = [ "wasm-bindgen", ] @@ -1398,9 +1408,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.149" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "libloading" @@ -1418,6 +1428,17 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall", +] + [[package]] name = "librocksdb-sys" version = "0.11.0+8.1.1" @@ -1447,15 +1468,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" +checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -1477,6 +1498,15 @@ dependencies = [ "libc", ] +[[package]] +name = "mach2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" +dependencies = [ + "libc", +] + [[package]] name = "matchers" version = "0.1.0" @@ -1501,6 +1531,61 @@ dependencies = [ "autocfg", ] +[[package]] +name = "metrics" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" +dependencies = [ + "ahash", + "metrics-macros", + "portable-atomic", +] + +[[package]] +name = "metrics-exporter-prometheus" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a4964177ddfdab1e3a2b37aec7cf320e14169abb0ed73999f558136409178d5" +dependencies = [ + "base64", + "hyper", + "indexmap 1.9.3", + "ipnet", + "metrics", + "metrics-util", + "quanta", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "metrics-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" +dependencies = [ + "proc-macro2", + "quote 1.0.33", + "syn 2.0.39", +] + +[[package]] +name = "metrics-util" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4de2ed6e491ed114b40b732e4d1659a9d53992ebd87490c44a6ffe23739d973e" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", + "hashbrown 0.13.1", + "metrics", + "num_cpus", + "quanta", + "sketches-ddsketch", +] + [[package]] name = "mime" version = "0.3.17" @@ -1524,9 +1609,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "wasi", @@ -1596,7 +1681,7 @@ checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1668,18 +1753,18 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "opencl-sys" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e75919008b8ed7ce9620e2b3580c648db40c7f564a368f271b2647145046d8ba" +checksum = "e45b6878f1873ce3fba231eab49c0da9505a6241fed9cb390a16ed8e101ab0c4" dependencies = [ "libc", ] [[package]] name = "opencl3" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c247ee0c98af8a67ab9c836ed2ea663ac19a17d8bae71325b509835e536c18ad" +checksum = "a94379feed77f776abb9ea6c678bc5f7f42dda9e3dec0cf2d19d7dab4626b01f" dependencies = [ "cl3", "libc", @@ -1687,11 +1772,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.57" +version = "0.10.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" +checksum = "7a257ad03cd8fb16ad4172fedf8094451e1af1c4b70097636ef2eac9a5f0cc33" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "cfg-if", "foreign-types", "libc", @@ -1708,7 +1793,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1719,9 +1804,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.93" +version = "0.9.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" +checksum = "40a4130519a360279579c2053038317e40eff64d13fd3f004f9e1b72b8a6aaf9" dependencies = [ "cc", "libc", @@ -1747,13 +1832,13 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall", "smallvec", "windows-targets 0.48.5", ] @@ -1824,9 +1909,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.4.3" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31114a898e107c51bb1609ffaf55a0e011cf6a4d7f1170d0015a165082c0338b" +checksum = "3bccab0e7fd7cc19f820a1c8c91720af652d0c88dc9664dd72aef2614f04af3b" [[package]] name = "powerfmt" @@ -1847,7 +1932,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1861,24 +1946,40 @@ dependencies = [ [[package]] name = "proptest" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c003ac8c77cb07bb74f5f198bce836a689bcd5a42574612bf14d17bfd08c20e" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.4.0", + "bitflags 2.4.1", "lazy_static", "num-traits", "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.7.5", + "regex-syntax 0.8.2", "rusty-fork", "tempfile", "unarray", ] +[[package]] +name = "quanta" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" +dependencies = [ + "crossbeam-utils", + "libc", + "mach2", + "once_cell", + "raw-cpuid", + "wasi", + "web-sys", + "winapi", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -1958,6 +2059,15 @@ dependencies = [ "rand_core", ] +[[package]] +name = "raw-cpuid" +version = "10.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "rayon" version = "1.8.0" @@ -1980,43 +2090,34 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ "getrandom", - "redox_syscall 0.2.16", + "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.10.0" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d119d7c7ca818f8a53c300863d4f87566aac09943aef5b355bb83969dae75d87" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.1", - "regex-syntax 0.8.1", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -2030,13 +2131,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465c6fc0621e4abc4187a2bda0937bfd4f722c2730b29562e19689ea796c9a4b" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.1", + "regex-syntax 0.8.2", ] [[package]] @@ -2047,15 +2148,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.5" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" - -[[package]] -name = "regex-syntax" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56d84fdd47036b038fc80dd333d10b6aab10d5d31f4a366e20014def75328d33" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" @@ -2097,17 +2192,16 @@ dependencies = [ [[package]] name = "ring" -version = "0.16.20" +version = "0.17.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" dependencies = [ "cc", + "getrandom", "libc", - "once_cell", "spin", "untrusted", - "web-sys", - "winapi", + "windows-sys 0.48.0", ] [[package]] @@ -2177,11 +2271,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.19" +version = "0.38.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "745ecfa778e66b2b63c88a61cb36e0eea109e803b0b86bf9879fbc77c70e86ed" +checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", @@ -2190,9 +2284,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.7" +version = "0.21.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" +checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" dependencies = [ "log", "ring", @@ -2202,9 +2296,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.6" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ "ring", "untrusted", @@ -2272,9 +2366,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ "ring", "untrusted", @@ -2341,31 +2435,31 @@ checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" -version = "1.0.189" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.189" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ - "indexmap 2.0.2", + "indexmap 2.1.0", "itoa", "ryu", "serde", @@ -2385,11 +2479,11 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.25" +version = "0.9.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574" +checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" dependencies = [ - "indexmap 2.0.2", + "indexmap 2.1.0", "itoa", "ryu", "serde", @@ -2418,7 +2512,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -2447,6 +2541,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" +[[package]] +name = "sketches-ddsketch" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68a406c1882ed7f29cd5e248c9848a80e7cb6ae0fea82346d2746f2f941c07e1" + [[package]] name = "slab" version = "0.4.9" @@ -2458,9 +2558,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "smol_str" @@ -2481,7 +2581,7 @@ dependencies = [ "clap", "colored", "dotenvy", - "indexmap 2.0.2", + "indexmap 2.1.0", "num-format", "once_cell", "parking_lot", @@ -2496,6 +2596,7 @@ dependencies = [ "snarkvm-curves", "snarkvm-fields", "snarkvm-ledger", + "snarkvm-metrics", "snarkvm-parameters", "snarkvm-synthesizer", "snarkvm-utilities", @@ -2519,9 +2620,9 @@ dependencies = [ "crossbeam-channel", "expect-test", "fxhash", - "hashbrown 0.14.1", + "hashbrown 0.14.2", "hex", - "indexmap 2.0.2", + "indexmap 2.1.0", "itertools 0.11.0", "lazy_static", "num-traits", @@ -2611,7 +2712,7 @@ name = "snarkvm-circuit-environment" version = "0.16.10" dependencies = [ "criterion", - "indexmap 2.0.2", + "indexmap 2.1.0", "itertools 0.11.0", "nom", "num-traits", @@ -2802,7 +2903,7 @@ version = "0.16.10" dependencies = [ "aleo-std", "criterion", - "indexmap 2.0.2", + "indexmap 2.1.0", "rayon", "snarkvm-console-algorithms", "snarkvm-console-network", @@ -2814,7 +2915,7 @@ name = "snarkvm-console-network" version = "0.16.10" dependencies = [ "anyhow", - "indexmap 2.0.2", + "indexmap 2.1.0", "itertools 0.11.0", "lazy_static", "once_cell", @@ -2855,7 +2956,7 @@ dependencies = [ "bincode", "enum_index", "enum_index_derive", - "indexmap 2.0.2", + "indexmap 2.1.0", "num-derive", "num-traits", "once_cell", @@ -3003,7 +3104,7 @@ dependencies = [ "anyhow", "bincode", "criterion", - "indexmap 2.0.2", + "indexmap 2.1.0", "parking_lot", "rand", "rayon", @@ -3040,7 +3141,7 @@ name = "snarkvm-ledger-block" version = "0.16.10" dependencies = [ "bincode", - "indexmap 2.0.2", + "indexmap 2.1.0", "once_cell", "rayon", "serde_json", @@ -3068,7 +3169,7 @@ dependencies = [ "bincode", "blake2", "criterion", - "indexmap 2.0.2", + "indexmap 2.1.0", "rand", "rayon", "serde_json", @@ -3086,7 +3187,8 @@ version = "0.16.10" dependencies = [ "anyhow", "bincode", - "indexmap 2.0.2", + "indexmap 2.1.0", + "metrics", "parking_lot", "proptest", "rand", @@ -3097,6 +3199,7 @@ dependencies = [ "snarkvm-console", "snarkvm-ledger-committee", "snarkvm-ledger-narwhal-batch-header", + "snarkvm-metrics", "test-strategy", ] @@ -3118,7 +3221,7 @@ name = "snarkvm-ledger-narwhal-batch-certificate" version = "0.16.10" dependencies = [ "bincode", - "indexmap 2.0.2", + "indexmap 2.1.0", "serde_json", "snarkvm-console", "snarkvm-ledger-narwhal-batch-certificate", @@ -3131,7 +3234,7 @@ name = "snarkvm-ledger-narwhal-batch-header" version = "0.16.10" dependencies = [ "bincode", - "indexmap 2.0.2", + "indexmap 2.1.0", "serde_json", "snarkvm-console", "snarkvm-ledger-narwhal-batch-header", @@ -3154,7 +3257,7 @@ name = "snarkvm-ledger-narwhal-subdag" version = "0.16.10" dependencies = [ "bincode", - "indexmap 2.0.2", + "indexmap 2.1.0", "rayon", "serde_json", "snarkvm-console", @@ -3206,7 +3309,7 @@ dependencies = [ "aleo-std", "anyhow", "bincode", - "indexmap 2.0.2", + "indexmap 2.1.0", "once_cell", "parking_lot", "rayon", @@ -3241,6 +3344,14 @@ dependencies = [ "snarkvm-synthesizer-program", ] +[[package]] +name = "snarkvm-metrics" +version = "0.15.4" +dependencies = [ + "metrics", + "metrics-exporter-prometheus", +] + [[package]] name = "snarkvm-parameters" version = "0.16.10" @@ -3253,7 +3364,7 @@ dependencies = [ "curl", "encoding", "hex", - "indexmap 2.0.2", + "indexmap 2.1.0", "itertools 0.11.0", "js-sys", "lazy_static", @@ -3280,7 +3391,7 @@ dependencies = [ "aleo-std", "anyhow", "criterion", - "indexmap 2.0.2", + "indexmap 2.1.0", "itertools 0.11.0", "once_cell", "parking_lot", @@ -3311,7 +3422,7 @@ dependencies = [ "aleo-std", "bincode", "colored", - "indexmap 2.0.2", + "indexmap 2.1.0", "once_cell", "parking_lot", "rand", @@ -3336,7 +3447,7 @@ version = "0.16.10" dependencies = [ "bincode", "criterion", - "indexmap 2.0.2", + "indexmap 2.1.0", "paste", "rand", "rand_chacha", @@ -3385,7 +3496,7 @@ version = "0.16.10" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3406,9 +3517,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", @@ -3416,9 +3527,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", "windows-sys 0.48.0", @@ -3426,9 +3537,9 @@ dependencies = [ [[package]] name = "spin" -version = "0.5.2" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "sppark" @@ -3455,7 +3566,7 @@ dependencies = [ "proc-macro2", "quote 1.0.33", "structmeta-derive", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3466,7 +3577,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3499,9 +3610,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote 1.0.33", @@ -3549,13 +3660,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.8.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", "fastrand 2.0.1", - "redox_syscall 0.3.5", + "redox_syscall", "rustix", "windows-sys 0.48.0", ] @@ -3569,27 +3680,27 @@ dependencies = [ "proc-macro2", "quote 1.0.33", "structmeta", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] name = "thiserror" -version = "1.0.49" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.49" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3665,9 +3776,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.33.0" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ "backtrace", "bytes", @@ -3675,7 +3786,7 @@ dependencies = [ "mio", "num_cpus", "pin-project-lite", - "socket2 0.5.4", + "socket2 0.5.5", "windows-sys 0.48.0", ] @@ -3691,9 +3802,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -3720,9 +3831,9 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.39" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2ef2af84856a50c1d430afce2fdded0a4ec7eda868db86409b4543df0797f9" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -3737,7 +3848,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3752,20 +3863,20 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "lazy_static", "log", + "once_cell", "tracing-core", ] [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", @@ -3861,15 +3972,15 @@ checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" [[package]] name = "untrusted" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5ccd538d4a604753ebc2f17cd9946e89b77bf87f6a8e2309667c6f2e87855e3" +checksum = "7830e33f6e25723d41a63f77e434159dad02919f18f55a512b5f16f3b1d77138" dependencies = [ "base64", "flate2", @@ -3960,9 +4071,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" dependencies = [ "cfg-if", "serde", @@ -3972,24 +4083,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote 1.0.33", - "syn 2.0.38", + "syn 2.0.39", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" dependencies = [ "cfg-if", "js-sys", @@ -3999,9 +4110,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" dependencies = [ "quote 1.0.33", "wasm-bindgen-macro-support", @@ -4009,28 +4120,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.38", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" [[package]] name = "wasm-bindgen-test" -version = "0.3.37" +version = "0.3.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e6e302a7ea94f83a6d09e78e7dc7d9ca7b186bc2829c24a22d0753efd680671" +checksum = "c6433b7c56db97397842c46b67e11873eda263170afeb3a2dc74a7cb370fee0d" dependencies = [ "console_error_panic_hook", "js-sys", @@ -4042,19 +4153,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.37" +version = "0.3.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecb993dd8c836930ed130e020e77d9b2e65dd0fbab1b67c790b0f5d80b11a575" +checksum = "493fcbab756bb764fa37e6bee8cec2dd709eb4273d06d0c282a5e74275ded735" dependencies = [ "proc-macro2", "quote 1.0.33", + "syn 2.0.39", ] [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" dependencies = [ "js-sys", "wasm-bindgen", @@ -4251,11 +4363,31 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "zerocopy" +version = "0.7.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e97e415490559a91254a2979b4829267a57d2fcd741a98eee8b722fb57289aa0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7e48ccf166952882ca8bd778a43502c64f33bf94c12ebe2a7f08e5a0f6689f" +dependencies = [ + "proc-macro2", + "quote 1.0.33", + "syn 2.0.39", +] + [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" dependencies = [ "zeroize_derive", ] @@ -4268,5 +4400,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.38", + "syn 2.0.39", ] From 5f9d88eae64038d2cdd5330472eaf7a9e14f1dbb Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Mon, 20 Nov 2023 09:43:15 -0800 Subject: [PATCH 154/339] Support parsing a program ID as a literal --- vm/cli/commands/run.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/vm/cli/commands/run.rs b/vm/cli/commands/run.rs index db13d5e741..285b46034b 100644 --- a/vm/cli/commands/run.rs +++ b/vm/cli/commands/run.rs @@ -106,12 +106,16 @@ mod tests { #[test] fn clap_snarkvm_run() { - let arg_vec = vec!["snarkvm", "run", "hello", "1u32", "2u32"]; + let arg_vec = vec!["snarkvm", "run", "hello", "1u32", "2u32", "foo.aleo"]; let cli = CLI::parse_from(&arg_vec); if let Command::Run(run) = cli.command { assert_eq!(run.function, Identifier::try_from(arg_vec[2]).unwrap()); - assert_eq!(run.inputs, vec![Value::try_from(arg_vec[3]).unwrap(), Value::try_from(arg_vec[4]).unwrap()]); + assert_eq!(run.inputs, vec![ + Value::try_from(arg_vec[3]).unwrap(), + Value::try_from(arg_vec[4]).unwrap(), + Value::try_from(arg_vec[5]).unwrap() + ]); } else { panic!("Unexpected result of clap parsing!"); } From 084260262d0d9c0019d2e1c458fbb72c0d2ffe95 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Mon, 20 Nov 2023 09:53:43 -0800 Subject: [PATCH 155/339] Reorder operand parsers --- console/program/src/data/literal/mod.rs | 2 +- console/program/src/data/literal/parse.rs | 26 +++++++++++++++++++ .../src/logic/instruction/operand/parse.rs | 4 ++- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/console/program/src/data/literal/mod.rs b/console/program/src/data/literal/mod.rs index 23f085e504..5b904165ca 100644 --- a/console/program/src/data/literal/mod.rs +++ b/console/program/src/data/literal/mod.rs @@ -28,7 +28,7 @@ mod to_bits; mod to_type; mod variant; -use crate::LiteralType; +use crate::{LiteralType, ProgramID}; use snarkvm_console_account::{ComputeKey, PrivateKey, Signature}; use snarkvm_console_network::Network; use snarkvm_console_types::{prelude::*, Boolean}; diff --git a/console/program/src/data/literal/parse.rs b/console/program/src/data/literal/parse.rs index 330914363d..0a02b7200d 100644 --- a/console/program/src/data/literal/parse.rs +++ b/console/program/src/data/literal/parse.rs @@ -36,6 +36,8 @@ impl Parser for Literal { map(Scalar::::parse, |literal| Self::Scalar(literal)), map(Signature::::parse, |literal| Self::Signature(Box::new(literal))), map(StringType::::parse, |literal| Self::String(literal)), + // This allows users to implicitly declare program IDs as literals. + map_res(ProgramID::::parse, |program_id| Ok::(Self::Address(program_id.to_address()?))), ))(string) } } @@ -87,3 +89,27 @@ impl Display for Literal { } } } + +#[cfg(test)] +mod tests { + use super::*; + use snarkvm_console_network::Testnet3; + + type CurrentNetwork = Testnet3; + + #[test] + fn test_parse_program_id() -> Result<()> { + let (remainder, candidate) = Literal::::parse("credits.aleo")?; + assert!(matches!(candidate, Literal::Address(_))); + assert_eq!(candidate.to_string(), "aleo1lqmly7ez2k48ajf5hs92ulphaqr05qm4n8qwzj8v0yprmasgpqgsez59gg"); + assert_eq!("", remainder); + + let result = Literal::::parse("credits.ale"); + assert!(result.is_err()); + + let result = Literal::::parse("credits.aleo1"); + assert!(result.is_err()); + + Ok(()) + } +} diff --git a/synthesizer/program/src/logic/instruction/operand/parse.rs b/synthesizer/program/src/logic/instruction/operand/parse.rs index 8a277ea91d..ccc699ee60 100644 --- a/synthesizer/program/src/logic/instruction/operand/parse.rs +++ b/synthesizer/program/src/logic/instruction/operand/parse.rs @@ -26,9 +26,11 @@ impl Parser for Operand { map(tag("self.signer"), |_| Self::Signer), map(tag("self.caller"), |_| Self::Caller), map(tag("block.height"), |_| Self::BlockHeight), + // Note that `Operand::ProgramID`s must be parsed before `Operand::Literal`s, since a program ID can be implicitly parsed as a literal address. + // This ensures that the string representation of a program uses the `Operand::ProgramID` variant. + map(ProgramID::parse, |program_id| Self::ProgramID(program_id)), map(Literal::parse, |literal| Self::Literal(literal)), map(Register::parse, |register| Self::Register(register)), - map(ProgramID::parse, |program_id| Self::ProgramID(program_id)), ))(string) } } From cea721eefdf465e8d0f2b6c7f176bfa36b303a3b Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 21 Nov 2023 11:26:31 +0100 Subject: [PATCH 156/339] fix: don't preallocate in G2Prepared::read_le Signed-off-by: ljedrz --- curves/src/templates/bls12/g2.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/curves/src/templates/bls12/g2.rs b/curves/src/templates/bls12/g2.rs index af3a62ff63..7b94ff9c4a 100644 --- a/curves/src/templates/bls12/g2.rs +++ b/curves/src/templates/bls12/g2.rs @@ -65,7 +65,7 @@ impl ToBytes for G2Prepared

      { impl FromBytes for G2Prepared

      { fn read_le(mut reader: R) -> IoResult { let ell_coeffs_len: u32 = FromBytes::read_le(&mut reader)?; - let mut ell_coeffs = Vec::with_capacity(ell_coeffs_len as usize); + let mut ell_coeffs = Vec::new(); for _ in 0..ell_coeffs_len { let coeff_1: Fp2 = FromBytes::read_le(&mut reader)?; let coeff_2: Fp2 = FromBytes::read_le(&mut reader)?; From 630ec0932793f397604964cfe7c6647a9463e795 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 21 Nov 2023 15:54:25 +0100 Subject: [PATCH 157/339] perf: use Vec for terms in LinearCombination (circuit) Signed-off-by: ljedrz --- .../src/helpers/linear_combination.rs | 42 +++++++++---------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/circuit/environment/src/helpers/linear_combination.rs b/circuit/environment/src/helpers/linear_combination.rs index 94b7b2eca2..8ba6926288 100644 --- a/circuit/environment/src/helpers/linear_combination.rs +++ b/circuit/environment/src/helpers/linear_combination.rs @@ -19,7 +19,6 @@ use core::{ fmt, ops::{Add, AddAssign, Mul, Neg, Sub}, }; -use indexmap::{map::Entry, IndexMap}; // Before high level program operations are converted into constraints, they are first tracked as linear combinations. // Each linear combination corresponds to a portion or all of a single row of an R1CS matrix, and consists of: @@ -34,7 +33,8 @@ use indexmap::{map::Entry, IndexMap}; #[derive(Clone)] pub struct LinearCombination { constant: F, - terms: IndexMap, F>, + /// The list of terms is kept sorted in order to speed up lookups. + terms: Vec<(Variable, F)>, /// The value of this linear combination, defined as the sum of the `terms` and `constant`. value: F, } @@ -60,7 +60,7 @@ impl LinearCombination { pub fn is_public(&self) -> bool { self.constant.is_zero() && self.terms.len() == 1 - && match self.terms.iter().next() { + && match self.terms.first() { Some((Variable::Public(..), coefficient)) => *coefficient == F::one(), _ => false, } @@ -130,7 +130,7 @@ impl LinearCombination { } /// Returns the terms (excluding the constant value) in the linear combination. - pub(super) fn to_terms(&self) -> &IndexMap, F> { + pub(super) fn to_terms(&self) -> &[(Variable, F)] { &self.terms } @@ -197,18 +197,18 @@ impl From<&[Variable]> for LinearCombination { match variable.is_constant() { true => output.constant += variable.value(), false => { - match output.terms.entry(variable.clone()) { - Entry::Occupied(mut entry) => { + match output.terms.binary_search_by(|(v, _)| v.cmp(variable)) { + Ok(idx) => { // Increment the existing coefficient by 1. - *entry.get_mut() += F::one(); + output.terms[idx].1 += F::one(); // If the coefficient of the term is now zero, remove the entry. - if entry.get().is_zero() { - entry.remove_entry(); + if output.terms[idx].1.is_zero() { + output.terms.remove(idx); } } - Entry::Vacant(entry) => { + Err(idx) => { // Insert the variable and a coefficient of 1 as a new term. - entry.insert(F::one()); + output.terms.insert(idx, (variable.clone(), F::one())); } } } @@ -336,18 +336,18 @@ impl AddAssign<&LinearCombination> for LinearCombination { match variable.is_constant() { true => panic!("Malformed linear combination found"), false => { - match self.terms.entry(variable.clone()) { - Entry::Occupied(mut entry) => { + match self.terms.binary_search_by(|(v, _)| v.cmp(variable)) { + Ok(idx) => { // Add the coefficient to the existing coefficient for this term. - *entry.get_mut() += *coefficient; + self.terms[idx].1 += *coefficient; // If the coefficient of the term is now zero, remove the entry. - if entry.get().is_zero() { - entry.remove_entry(); + if self.terms[idx].1.is_zero() { + self.terms.remove(idx); } } - Entry::Vacant(entry) => { + Err(idx) => { // Insert the variable and coefficient as a new term. - entry.insert(*coefficient); + self.terms.insert(idx, (variable.clone(), *coefficient)); } } } @@ -467,11 +467,7 @@ impl fmt::Debug for LinearCombination { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { let mut output = format!("Constant({})", self.constant); - // Sort the terms. - let mut terms = self.terms.clone(); - terms.sort_keys(); - - for (variable, coefficient) in &terms { + for (variable, coefficient) in &self.terms { output += &match (variable.mode(), coefficient.is_one()) { (Mode::Constant, _) => panic!("Malformed linear combination at: ({coefficient} * {variable:?})"), (_, true) => format!(" + {variable:?}"), From a15fb28b72641ef6814a0a5ff7d5336e53f20384 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 21 Nov 2023 18:00:05 +0100 Subject: [PATCH 158/339] clippy: fix some new lints Signed-off-by: ljedrz --- circuit/algorithms/src/elligator2/encode.rs | 2 +- circuit/environment/src/helpers/linear_combination.rs | 2 +- circuit/types/integers/src/mul_checked.rs | 2 +- synthesizer/process/src/trace/inclusion/mod.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/circuit/algorithms/src/elligator2/encode.rs b/circuit/algorithms/src/elligator2/encode.rs index 0a4e43a0b7..62db70c64d 100644 --- a/circuit/algorithms/src/elligator2/encode.rs +++ b/circuit/algorithms/src/elligator2/encode.rs @@ -22,7 +22,7 @@ impl Elligator2 { debug_assert!(console::Group::::EDWARDS_D.legendre().is_qnr()); // Ensure the input is nonzero. - E::assert_neq(input, &Field::::zero()); + E::assert_neq(input, Field::::zero()); // Define `1` as a constant. let one = Field::one(); diff --git a/circuit/environment/src/helpers/linear_combination.rs b/circuit/environment/src/helpers/linear_combination.rs index 8ba6926288..4d33d210ff 100644 --- a/circuit/environment/src/helpers/linear_combination.rs +++ b/circuit/environment/src/helpers/linear_combination.rs @@ -555,7 +555,7 @@ mod tests { assert_eq!(zero, candidate.constant); assert_eq!(1, candidate.terms.len()); - let (candidate_variable, candidate_coefficient) = candidate.terms.iter().next().unwrap(); + let (candidate_variable, candidate_coefficient) = candidate.terms.first().unwrap(); assert!(candidate_variable.is_public()); assert_eq!(one, candidate_variable.value()); assert_eq!(four, *candidate_coefficient); diff --git a/circuit/types/integers/src/mul_checked.rs b/circuit/types/integers/src/mul_checked.rs index e3cc8d7f61..1cf4588fff 100644 --- a/circuit/types/integers/src/mul_checked.rs +++ b/circuit/types/integers/src/mul_checked.rs @@ -144,7 +144,7 @@ impl Integer { Boolean::assert_bits_are_zero(&z_1_upper_bits); // Check that `z2` is zero. - E::assert_eq(&z2, E::zero()); + E::assert_eq(z2, E::zero()); // Return the product of `self` and `other`. product diff --git a/synthesizer/process/src/trace/inclusion/mod.rs b/synthesizer/process/src/trace/inclusion/mod.rs index 2213586c12..b61b9d0f77 100644 --- a/synthesizer/process/src/trace/inclusion/mod.rs +++ b/synthesizer/process/src/trace/inclusion/mod.rs @@ -222,7 +222,7 @@ impl InclusionAssignment { let candidate_serial_number = circuit::Record::>::serial_number_from_gamma(&gamma, commitment.clone()); // Enforce that the candidate serial number is equal to the serial number. - A::assert_eq(&candidate_serial_number, &serial_number); + A::assert_eq(candidate_serial_number, serial_number); // Enforce the starting leaf is the claimed commitment. A::assert_eq(state_path.transition_leaf().id(), commitment); From 4f430c1eebb32c17627314387721a197d2fbbb91 Mon Sep 17 00:00:00 2001 From: Vesa-Ville Date: Wed, 22 Nov 2023 18:32:29 +0200 Subject: [PATCH 159/339] fix: increase tx base fee --- ledger/benches/transaction.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/benches/transaction.rs b/ledger/benches/transaction.rs index e83254914f..030d061330 100644 --- a/ledger/benches/transaction.rs +++ b/ledger/benches/transaction.rs @@ -104,7 +104,7 @@ fn execute(c: &mut Criterion) { // Retrieve the execution ID. let execution_id = execute_authorization.to_execution_id().unwrap(); // Authorize the fee. - let fee_authorization = vm.authorize_fee_public(&private_key, 100000, 1000, execution_id, rng).unwrap(); + let fee_authorization = vm.authorize_fee_public(&private_key, 300000, 1000, execution_id, rng).unwrap(); c.bench_function("Transaction::Execute(transfer_public)", |b| { b.iter(|| { From be0e5a686670e47060cfc4bbb18f093a853a4a56 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Wed, 8 Nov 2023 11:01:51 -0800 Subject: [PATCH 160/339] Add test --- synthesizer/src/vm/mod.rs | 80 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index 237ed5f3cd..5375d75c37 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -605,7 +605,6 @@ function compute: // Construct the new block header. let (ratifications, transactions, aborted_transaction_ids, ratified_finalize_operations) = vm.speculate(sample_finalize_state(1), None, vec![], None, transactions.iter())?; - assert!(aborted_transaction_ids.is_empty()); // Construct the metadata associated with the block. let metadata = Metadata::new( @@ -975,4 +974,83 @@ function multitransfer: .unwrap(); vm.add_next_block(&sample_next_block(&vm, &caller_private_key, &[execution], rng).unwrap()).unwrap(); } + + #[test] + #[ignore] + fn test_deployment_memory_overload() { + const NUM_DEPLOYMENTS: usize = 100; + + let rng = &mut TestRng::default(); + + // Initialize a private key. + let private_key = sample_genesis_private_key(rng); + + // Initialize the genesis block. + let genesis = sample_genesis_block(rng); + + // Initialize the VM. + let vm = sample_vm(); + // Update the VM. + vm.add_next_block(&genesis).unwrap(); + + // Deploy the base program. + let program = Program::from_str( + r" +program program_layer_0.aleo; + +mapping m: + key as u8.public; + value as u32.public; + +function do: + input r0 as u32.public; + async do r0 into r1; + output r1 as program_layer_0.aleo/do.future; + +finalize do: + input r0 as u32.public; + set r0 into m[0u8];", + ) + .unwrap(); + println!("Deploying the base program."); + let deployment = vm.deploy(&private_key, &program, None, 0, None, rng).unwrap(); + vm.add_next_block(&sample_next_block(&vm, &private_key, &[deployment], rng).unwrap()).unwrap(); + + // For each layer, deploy a program that calls the program from the previous layer. + for i in 1..NUM_DEPLOYMENTS { + let mut program_string = String::new(); + // Add the import statements. + for j in 0..i { + program_string.push_str(&format!("import program_layer_{}.aleo;\n", j)); + } + // Add the program body. + program_string.push_str(&format!( + "program program_layer_{i}.aleo; + +mapping m: + key as u8.public; + value as u32.public; + +function do: + input r0 as u32.public; + call program_layer_{prev}.aleo/do r0 into r1; + async do r0 r1 into r2; + output r2 as program_layer_{i}.aleo/do.future; + +finalize do: + input r0 as u32.public; + input r1 as program_layer_{prev}.aleo/do.future; + await r1; + set r0 into m[0u8];", + prev = i - 1 + )); + // Construct the program. + let program = Program::from_str(&program_string).unwrap(); + + // Deploy the program. + println!("Deploying program {}.", i); + let deployment = vm.deploy(&private_key, &program, None, 0, None, rng).unwrap(); + vm.add_next_block(&sample_next_block(&vm, &private_key, &[deployment], rng).unwrap()).unwrap(); + } + } } From ccf3a84344831fd197498493e31a41c2a5837fac Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Wed, 22 Nov 2023 20:08:50 +0100 Subject: [PATCH 161/339] Remove clone --- algorithms/src/snark/varuna/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/src/snark/varuna/tests.rs b/algorithms/src/snark/varuna/tests.rs index 70eeb548e7..22a3cdc16c 100644 --- a/algorithms/src/snark/varuna/tests.rs +++ b/algorithms/src/snark/varuna/tests.rs @@ -779,7 +779,7 @@ mod varuna_test_vectors { } let fifth_oracles = - AHPForR1CS::<_, MM>::prover_fifth_round(verifier_fourth_msg.clone(), prover_state, rng).unwrap(); + AHPForR1CS::<_, MM>::prover_fifth_round(verifier_fourth_msg, prover_state, rng).unwrap(); // Get coefficients of final oracle polynomial from round 5. let h_2 = format!("{:?}", fifth_oracles.h_2.coeffs().map(|(_, coeff)| coeff).collect::>()); From bef250b0e0e393f867ca04b6104e9618e51a5b63 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Wed, 22 Nov 2023 20:11:13 +0100 Subject: [PATCH 162/339] Wrap Stack in Arc and add timers --- synthesizer/process/src/finalize.rs | 10 +++--- synthesizer/process/src/lib.rs | 23 ++++++++++--- synthesizer/process/src/stack/call/mod.rs | 32 ++++++++++++++++--- synthesizer/process/src/stack/evaluate.rs | 9 ++++-- .../process/src/stack/helpers/initialize.rs | 2 +- synthesizer/process/src/stack/mod.rs | 18 ++++++++--- .../program/src/traits/stack_and_registers.rs | 7 +++- 7 files changed, 77 insertions(+), 24 deletions(-) diff --git a/synthesizer/process/src/finalize.rs b/synthesizer/process/src/finalize.rs index 40edfd5071..6cbdf02ccb 100644 --- a/synthesizer/process/src/finalize.rs +++ b/synthesizer/process/src/finalize.rs @@ -49,7 +49,7 @@ impl Process { /* Finalize the fee. */ // Retrieve the fee stack. - let fee_stack = self.get_stack(fee.program_id())?; + let fee_stack = self.get_stack_ref(fee.program_id())?; // Finalize the fee transition. finalize_operations.extend(finalize_fee_transition(state, store, fee_stack, fee)?); lap!(timer, "Finalize transition for '{}/{}'", fee.program_id(), fee.function_name()); @@ -90,7 +90,7 @@ impl Process { // Retrieve the root transition (without popping it). let transition = execution.peek()?; // Retrieve the stack. - let stack = self.get_stack(transition.program_id())?; + let stack = self.get_stack_ref(transition.program_id())?; // Ensure the number of calls matches the number of transitions. let number_of_calls = stack.get_number_of_calls(transition.function_name())?; ensure!( @@ -113,7 +113,7 @@ impl Process { if let Some(fee) = fee { // Retrieve the fee stack. - let fee_stack = self.get_stack(fee.program_id())?; + let fee_stack = self.get_stack_ref(fee.program_id())?; // Finalize the fee transition. finalize_operations.extend(finalize_fee_transition(state, store, fee_stack, fee)?); lap!(timer, "Finalize transition for '{}/{}'", fee.program_id(), fee.function_name()); @@ -139,7 +139,7 @@ impl Process { atomic_batch_scope!(store, { // Retrieve the stack. - let stack = self.get_stack(fee.program_id())?; + let stack = self.get_stack_ref(fee.program_id())?; // Finalize the fee transition. let result = finalize_fee_transition(state, store, stack, fee); finish!(timer, "Finalize transition for '{}/{}'", fee.program_id(), fee.function_name()); @@ -356,7 +356,7 @@ fn initialize_finalize_state<'a, N: Network>( let (finalize, stack) = match stack.program_id() == future.program_id() { true => (stack.get_function_ref(future.function_name())?.finalize_logic(), stack), false => { - let stack = stack.get_external_stack(future.program_id())?; + let stack = stack.get_external_stack_ref(future.program_id())?; (stack.get_function_ref(future.function_name())?.finalize_logic(), stack) } }; diff --git a/synthesizer/process/src/lib.rs b/synthesizer/process/src/lib.rs index 594781f0e7..27db254e1e 100644 --- a/synthesizer/process/src/lib.rs +++ b/synthesizer/process/src/lib.rs @@ -75,7 +75,7 @@ pub struct Process { /// The universal SRS. universal_srs: Arc>, /// The mapping of program IDs to stacks. - stacks: IndexMap, Stack>, + stacks: IndexMap, Arc>>, } impl Process { @@ -129,7 +129,7 @@ impl Process { #[inline] pub fn add_stack(&mut self, stack: Stack) { // Add the stack to the process. - self.stacks.insert(*stack.program_id(), stack); + self.stacks.insert(*stack.program_id(), Arc::new(stack)); } } @@ -202,11 +202,24 @@ impl Process { /// Returns the stack for the given program ID. #[inline] - pub fn get_stack(&self, program_id: impl TryInto>) -> Result<&Stack> { + pub fn get_stack(&self, program_id: impl TryInto>) -> Result>> { // Prepare the program ID. let program_id = program_id.try_into().map_err(|_| anyhow!("Invalid program ID"))?; // Retrieve the stack. - let stack = self.stacks.get(&program_id).ok_or_else(|| anyhow!("Program '{program_id}' does not exist"))?; + let stack = self.stacks.get(&program_id).cloned().ok_or_else(|| anyhow!("Program '{program_id}' does not exist"))?; + // Ensure the program ID matches. + ensure!(stack.program_id() == &program_id, "Expected program '{}', found '{program_id}'", stack.program_id()); + // Return the stack. + Ok(stack) + } + + /// Returns the stack for the given program ID. + #[inline] + pub fn get_stack_ref(&self, program_id: impl TryInto>) -> Result<&Stack> { + // Prepare the program ID. + let program_id = program_id.try_into().map_err(|_| anyhow!("Invalid program ID"))?; + // Retrieve the stack. + let stack = self.stacks.get(&program_id).ok_or_else(|| anyhow!("Program '{program_id}' does not exist"))?.deref(); // Ensure the program ID matches. ensure!(stack.program_id() == &program_id, "Expected program '{}', found '{program_id}'", stack.program_id()); // Return the stack. @@ -216,7 +229,7 @@ impl Process { /// Returns the program for the given program ID. #[inline] pub fn get_program(&self, program_id: impl TryInto>) -> Result<&Program> { - self.get_stack(program_id).map(Stack::program) + self.get_stack_ref(program_id).map(Stack::program) } /// Returns the proving key for the given program ID and function name. diff --git a/synthesizer/process/src/stack/call/mod.rs b/synthesizer/process/src/stack/call/mod.rs index ff31a73461..ee66a48cfe 100644 --- a/synthesizer/process/src/stack/call/mod.rs +++ b/synthesizer/process/src/stack/call/mod.rs @@ -13,6 +13,7 @@ // limitations under the License. use crate::{CallStack, Registers, RegistersCall, StackEvaluate, StackExecute}; +use aleo_std::prelude::{timer, lap, finish}; use console::{network::prelude::*, program::Request}; use synthesizer_program::{ Call, @@ -57,14 +58,16 @@ impl CallTrait for Call { stack: &(impl StackEvaluate + StackMatches + StackProgram), registers: &mut Registers, ) -> Result<()> { + let timer = timer!("Call::evaluate"); + // Load the operands values. - let inputs: Vec<_> = self.operands().iter().map(|operand| registers.load(stack, operand)).try_collect()?; + let inputs: Vec<_> = self.operands().iter().map(|operand| registers.load(stack.deref(), operand)).try_collect()?; // Retrieve the substack and resource. let (substack, resource) = match self.operator() { // Retrieve the call stack and resource from the locator. CallOperator::Locator(locator) => { - (stack.get_external_stack(locator.program_id())?.clone(), locator.resource()) + (stack.get_external_stack_ref(locator.program_id())?, locator.resource()) } CallOperator::Resource(resource) => { // TODO (howardwu): Revisit this decision to forbid calling internal functions. A record cannot be spent again. @@ -74,9 +77,10 @@ impl CallTrait for Call { bail!("Cannot call '{resource}'. Use a closure ('closure {resource}:') instead.") } - (stack.clone(), resource) + (stack, resource) } }; + lap!(timer, "get substack and resource"); // If the operator is a closure, retrieve the closure and compute the output. let outputs = if let Ok(closure) = substack.program().get_closure(resource) { @@ -111,12 +115,14 @@ impl CallTrait for Call { else { bail!("Call operator '{}' is invalid or unsupported.", self.operator()) }; + lap!(timer, "got outputs"); // Assign the outputs to the destination registers. for (output, register) in outputs.into_iter().zip_eq(&self.destinations()) { // Assign the output to the register. registers.store(stack, register, output)?; } + finish!(timer); Ok(()) } @@ -134,6 +140,8 @@ impl CallTrait for Call { ), rng: &mut R, ) -> Result<()> { + let timer = timer!("Call::execute"); + // Load the operands values. let inputs: Vec<_> = self.operands().iter().map(|operand| registers.load_circuit(stack, operand)).try_collect()?; @@ -142,6 +150,8 @@ impl CallTrait for Call { let (substack, resource) = match self.operator() { // Retrieve the call stack and resource from the locator. CallOperator::Locator(locator) => { + lap!(timer, "Locator"); + // Check the external call locator. let function_name = locator.name().to_string(); let is_credits_program = &locator.program_id().to_string() == "credits.aleo"; @@ -152,10 +162,11 @@ impl CallTrait for Call { if is_credits_program && (is_fee_private || is_fee_public) { bail!("Cannot perform an external call to 'credits.aleo/fee_private' or 'credits.aleo/fee_public'.") } else { - (stack.get_external_stack(locator.program_id())?.clone(), locator.resource()) + (stack.get_external_stack_ref(locator.program_id())?, locator.resource()) } } CallOperator::Resource(resource) => { + lap!(timer, "Resource"); // TODO (howardwu): Revisit this decision to forbid calling internal functions. A record cannot be spent again. // But there are legitimate uses for passing a record through to an internal function. // We could invoke the internal function without a state transition, but need to match visibility. @@ -163,12 +174,13 @@ impl CallTrait for Call { bail!("Cannot call '{resource}'. Use a closure ('closure {resource}:') instead.") } - (stack.clone(), resource) + (stack, resource) } }; // If the operator is a closure, retrieve the closure and compute the output. let outputs = if let Ok(closure) = substack.program().get_closure(resource) { + lap!(timer, "execute_closure"); // Execute the closure, and load the outputs. substack.execute_closure( &closure, @@ -181,6 +193,7 @@ impl CallTrait for Call { } // If the operator is a function, retrieve the function and compute the output. else if let Ok(function) = substack.program().get_function(resource) { + lap!(timer, "execute_function"); // Retrieve the number of inputs. let num_inputs = function.inputs().len(); // Ensure the number of inputs matches the number of input statements. @@ -205,6 +218,7 @@ impl CallTrait for Call { // If the circuit is in authorize or synthesize mode, then add any external calls to the stack. CallStack::Authorize(_, private_key, authorization) | CallStack::Synthesize(_, private_key, authorization) => { + lap!(timer, "CallStack::Authorize,Synthesize"); // Compute the request. let request = Request::sign( &private_key, @@ -230,6 +244,7 @@ impl CallTrait for Call { (request, response) } CallStack::CheckDeployment(_, private_key, ..) | CallStack::PackageRun(_, private_key, ..) => { + lap!(timer, "CallStack::CheckDeployment,PackageRun"); // Compute the request. let request = Request::sign( &private_key, @@ -256,6 +271,7 @@ impl CallTrait for Call { } // If the circuit is in execute mode, then evaluate and execute the instructions. CallStack::Execute(authorization, ..) => { + lap!(timer, "CallStack::Execute"); // Retrieve the next request (without popping it). let request = authorization.peek_next()?; // Ensure the inputs match the original inputs. @@ -281,6 +297,7 @@ impl CallTrait for Call { } } }; + lap!(timer, "got request and response"); // Inject the existing circuit. A::inject_r1cs(r1cs); @@ -330,6 +347,7 @@ impl CallTrait for Call { None, ); A::assert(check_input_ids); + lap!(timer, "checked input ids"); // Inject the outputs as `Mode::Private` (with the 'tcm' and output IDs as `Mode::Public`). let outputs = circuit::Response::process_outputs_from_callback( @@ -342,6 +360,7 @@ impl CallTrait for Call { response.outputs().to_vec(), &function.output_types(), ); + lap!(timer, "checked outputs"); // Return the circuit outputs. outputs } @@ -355,6 +374,9 @@ impl CallTrait for Call { // Assign the output to the register. registers.store_circuit(stack, register, output)?; } + lap!(timer, "assigned outputs to registers"); + + finish!(timer); Ok(()) } diff --git a/synthesizer/process/src/stack/evaluate.rs b/synthesizer/process/src/stack/evaluate.rs index 4110da8a2c..483d993c73 100644 --- a/synthesizer/process/src/stack/evaluate.rs +++ b/synthesizer/process/src/stack/evaluate.rs @@ -218,7 +218,6 @@ impl StackEvaluate for Stack { .collect::>>()?; lap!(timer, "Load the outputs"); - finish!(timer); // Map the output operands to registers. let output_registers = output_operands @@ -228,9 +227,10 @@ impl StackEvaluate for Stack { _ => None, }) .collect::>(); + lap!(timer, "Load the output_registers"); // Compute the response. - Response::new( + let response = Response::new( request.network_id(), self.program.id(), function.name(), @@ -240,6 +240,9 @@ impl StackEvaluate for Stack { outputs, &function.output_types(), &output_registers, - ) + ); + finish!(timer); + + response } } diff --git a/synthesizer/process/src/stack/helpers/initialize.rs b/synthesizer/process/src/stack/helpers/initialize.rs index 416bcc6a9a..46b6bd2465 100644 --- a/synthesizer/process/src/stack/helpers/initialize.rs +++ b/synthesizer/process/src/stack/helpers/initialize.rs @@ -58,7 +58,7 @@ impl Stack { impl Stack { /// Inserts the given external stack to the stack. #[inline] - fn insert_external_stack(&mut self, external_stack: Stack) -> Result<()> { + fn insert_external_stack(&mut self, external_stack: Arc>) -> Result<()> { // Retrieve the program ID. let program_id = *external_stack.program_id(); // Ensure the external stack is not already added. diff --git a/synthesizer/process/src/stack/mod.rs b/synthesizer/process/src/stack/mod.rs index 4fe6d18531..c5b91d6ffb 100644 --- a/synthesizer/process/src/stack/mod.rs +++ b/synthesizer/process/src/stack/mod.rs @@ -169,7 +169,7 @@ pub struct Stack { /// The program (record types, structs, functions). program: Program, /// The mapping of external stacks as `(program ID, stack)`. - external_stacks: IndexMap, Stack>, + external_stacks: IndexMap, Arc>>, /// The mapping of closure and function names to their register types. register_types: IndexMap, RegisterTypes>, /// The mapping of finalize names to their register types. @@ -235,9 +235,19 @@ impl StackProgram for Stack { /// Returns the external stack for the given program ID. #[inline] - fn get_external_stack(&self, program_id: &ProgramID) -> Result<&Stack> { + fn get_external_stack(&self, program_id: &ProgramID) -> Result>> { // Retrieve the external stack. - self.external_stacks.get(program_id).ok_or_else(|| anyhow!("External program '{program_id}' does not exist.")) + self.external_stacks.get(program_id).cloned().ok_or_else(|| anyhow!("External program '{program_id}' does not exist.")) + } + + /// Returns the external stack ref for the given program ID. + #[inline] + fn get_external_stack_ref(&self, program_id: &ProgramID) -> Result<&Stack> { + // Retrieve the external stack. + self.external_stacks.get(program_id).ok_or_else(|| anyhow!("External program '{program_id}' does not exist.")).map(|stack| { + // Return the external stack. + stack.as_ref() + }) } /// Returns the external program for the given program ID. @@ -246,7 +256,7 @@ impl StackProgram for Stack { match self.program.id() == program_id { true => bail!("Attempted to get the main program '{}' as an external program", self.program.id()), // Retrieve the external stack, and return the external program. - false => Ok(self.get_external_stack(program_id)?.program()), + false => Ok(self.get_external_stack_ref(program_id)?.program()), } } diff --git a/synthesizer/program/src/traits/stack_and_registers.rs b/synthesizer/program/src/traits/stack_and_registers.rs index 4a88281c4a..eede9dee0b 100644 --- a/synthesizer/program/src/traits/stack_and_registers.rs +++ b/synthesizer/program/src/traits/stack_and_registers.rs @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +use std::sync::Arc; + use crate::{FinalizeGlobalState, Function, Operand, Program}; use console::{ network::Network, @@ -65,7 +67,10 @@ pub trait StackProgram { fn contains_external_record(&self, locator: &Locator) -> bool; /// Returns the external stack for the given program ID. - fn get_external_stack(&self, program_id: &ProgramID) -> Result<&Self>; + fn get_external_stack(&self, program_id: &ProgramID) -> Result>; + + /// Returns the external stack ref for the given program ID. + fn get_external_stack_ref(&self, program_id: &ProgramID) -> Result<&Self>; /// Returns the external program for the given program ID. fn get_external_program(&self, program_id: &ProgramID) -> Result<&Program>; From 5c6b7d815fc8bc8a1af5f919e90da15c1a2dc8ce Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Wed, 22 Nov 2023 20:12:25 +0100 Subject: [PATCH 163/339] Use evaluate_function for nested checking of deployments --- synthesizer/process/src/stack/call/mod.rs | 4 ++-- synthesizer/process/src/stack/evaluate.rs | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/synthesizer/process/src/stack/call/mod.rs b/synthesizer/process/src/stack/call/mod.rs index ee66a48cfe..37c4c75bda 100644 --- a/synthesizer/process/src/stack/call/mod.rs +++ b/synthesizer/process/src/stack/call/mod.rs @@ -260,8 +260,8 @@ impl CallTrait for Call { // Push the request onto the call stack. call_stack.push(request.clone())?; - // Execute the request. - let response = substack.execute_function::(call_stack, console_caller, rng)?; + // Evaluate the request. + let response = substack.evaluate_function::(call_stack, console_caller)?; // Return the request and response. (request, response) } diff --git a/synthesizer/process/src/stack/evaluate.rs b/synthesizer/process/src/stack/evaluate.rs index 483d993c73..30217f1041 100644 --- a/synthesizer/process/src/stack/evaluate.rs +++ b/synthesizer/process/src/stack/evaluate.rs @@ -106,6 +106,11 @@ impl StackEvaluate for Stack { // Retrieve the next request, based on the call stack mode. let (request, call_stack) = match &call_stack { CallStack::Evaluate(authorization) => (authorization.next()?, call_stack), + // CallStack::Synthesize(_, _, authorization) => (authorization.peek_next()?, call_stack), + CallStack::CheckDeployment(requests, _, _) | CallStack::PackageRun(requests, _, _) => { + let last_request = requests.last().ok_or(anyhow!("CallStack does not contain request"))?.clone(); + (last_request, call_stack) + }, // If the evaluation is performed in the `Execute` mode, create a new `Evaluate` mode. // This is done to ensure that evaluation during execution is performed consistently. CallStack::Execute(authorization, _) => { @@ -116,7 +121,7 @@ impl StackEvaluate for Stack { let call_stack = CallStack::Evaluate(authorization); (request, call_stack) } - _ => bail!("Illegal operation: call stack must be `Evaluate` or `Execute` in `evaluate_function`."), + _ => bail!("Illegal operation: call stack must not be `Synthesize` or `Authorize` in `evaluate_function`."), }; lap!(timer, "Retrieve the next request"); From 036f1120b9fdf955b49bf3ab3c19e846ae5c1586 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Wed, 22 Nov 2023 20:12:44 +0100 Subject: [PATCH 164/339] Extend nested deployment test --- synthesizer/src/vm/mod.rs | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index 5375d75c37..3d952aaca7 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -978,13 +978,16 @@ function multitransfer: #[test] #[ignore] fn test_deployment_memory_overload() { - const NUM_DEPLOYMENTS: usize = 100; + const NUM_DEPLOYMENTS: usize = 32; let rng = &mut TestRng::default(); // Initialize a private key. let private_key = sample_genesis_private_key(rng); + // Initialize a view key. + let view_key = ViewKey::try_from(&private_key).unwrap(); + // Initialize the genesis block. let genesis = sample_genesis_block(rng); @@ -1012,7 +1015,7 @@ finalize do: set r0 into m[0u8];", ) .unwrap(); - println!("Deploying the base program."); + let deployment = vm.deploy(&private_key, &program, None, 0, None, rng).unwrap(); vm.add_next_block(&sample_next_block(&vm, &private_key, &[deployment], rng).unwrap()).unwrap(); @@ -1048,9 +1051,31 @@ finalize do: let program = Program::from_str(&program_string).unwrap(); // Deploy the program. - println!("Deploying program {}.", i); let deployment = vm.deploy(&private_key, &program, None, 0, None, rng).unwrap(); + vm.add_next_block(&sample_next_block(&vm, &private_key, &[deployment], rng).unwrap()).unwrap(); } + + // Fetch the unspent records. + let records = + genesis.transitions().cloned().flat_map(Transition::into_records).collect::>(); + trace!("Unspent Records:\n{:#?}", records); + + // Select a record to spend. + let record = Some(records.values().next().unwrap().decrypt(&view_key).unwrap()); + + // Prepare the inputs. + let inputs = [ + Value::::from_str("1u32").unwrap(), + ] + .into_iter(); + + // Execute. + let transaction = vm + .execute(&private_key, ("program_layer_30.aleo", "do"), inputs, record, 0, None, rng) + .unwrap(); + + // Verify. + vm.check_transaction(&transaction, None).unwrap(); } } From 36250dff9f2c6e76a814411af4dfc083ba70d108 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Wed, 22 Nov 2023 20:29:13 +0100 Subject: [PATCH 165/339] Cargo fmt --- algorithms/src/snark/varuna/tests.rs | 3 +-- synthesizer/process/src/lib.rs | 6 ++++-- synthesizer/process/src/stack/call/mod.rs | 9 ++++----- synthesizer/process/src/stack/evaluate.rs | 5 ++--- synthesizer/process/src/stack/mod.rs | 16 +++++++++++----- synthesizer/src/vm/mod.rs | 13 ++++--------- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/algorithms/src/snark/varuna/tests.rs b/algorithms/src/snark/varuna/tests.rs index 22a3cdc16c..675ae2b197 100644 --- a/algorithms/src/snark/varuna/tests.rs +++ b/algorithms/src/snark/varuna/tests.rs @@ -778,8 +778,7 @@ mod varuna_test_vectors { create_test_vector("domain", "C", &format!("{:?}", variable_domain_elements), circuit); } - let fifth_oracles = - AHPForR1CS::<_, MM>::prover_fifth_round(verifier_fourth_msg, prover_state, rng).unwrap(); + let fifth_oracles = AHPForR1CS::<_, MM>::prover_fifth_round(verifier_fourth_msg, prover_state, rng).unwrap(); // Get coefficients of final oracle polynomial from round 5. let h_2 = format!("{:?}", fifth_oracles.h_2.coeffs().map(|(_, coeff)| coeff).collect::>()); diff --git a/synthesizer/process/src/lib.rs b/synthesizer/process/src/lib.rs index 27db254e1e..ec75fd5842 100644 --- a/synthesizer/process/src/lib.rs +++ b/synthesizer/process/src/lib.rs @@ -206,7 +206,8 @@ impl Process { // Prepare the program ID. let program_id = program_id.try_into().map_err(|_| anyhow!("Invalid program ID"))?; // Retrieve the stack. - let stack = self.stacks.get(&program_id).cloned().ok_or_else(|| anyhow!("Program '{program_id}' does not exist"))?; + let stack = + self.stacks.get(&program_id).cloned().ok_or_else(|| anyhow!("Program '{program_id}' does not exist"))?; // Ensure the program ID matches. ensure!(stack.program_id() == &program_id, "Expected program '{}', found '{program_id}'", stack.program_id()); // Return the stack. @@ -219,7 +220,8 @@ impl Process { // Prepare the program ID. let program_id = program_id.try_into().map_err(|_| anyhow!("Invalid program ID"))?; // Retrieve the stack. - let stack = self.stacks.get(&program_id).ok_or_else(|| anyhow!("Program '{program_id}' does not exist"))?.deref(); + let stack = + self.stacks.get(&program_id).ok_or_else(|| anyhow!("Program '{program_id}' does not exist"))?.deref(); // Ensure the program ID matches. ensure!(stack.program_id() == &program_id, "Expected program '{}', found '{program_id}'", stack.program_id()); // Return the stack. diff --git a/synthesizer/process/src/stack/call/mod.rs b/synthesizer/process/src/stack/call/mod.rs index 37c4c75bda..6c0a66ac74 100644 --- a/synthesizer/process/src/stack/call/mod.rs +++ b/synthesizer/process/src/stack/call/mod.rs @@ -13,7 +13,7 @@ // limitations under the License. use crate::{CallStack, Registers, RegistersCall, StackEvaluate, StackExecute}; -use aleo_std::prelude::{timer, lap, finish}; +use aleo_std::prelude::{finish, lap, timer}; use console::{network::prelude::*, program::Request}; use synthesizer_program::{ Call, @@ -61,14 +61,13 @@ impl CallTrait for Call { let timer = timer!("Call::evaluate"); // Load the operands values. - let inputs: Vec<_> = self.operands().iter().map(|operand| registers.load(stack.deref(), operand)).try_collect()?; + let inputs: Vec<_> = + self.operands().iter().map(|operand| registers.load(stack.deref(), operand)).try_collect()?; // Retrieve the substack and resource. let (substack, resource) = match self.operator() { // Retrieve the call stack and resource from the locator. - CallOperator::Locator(locator) => { - (stack.get_external_stack_ref(locator.program_id())?, locator.resource()) - } + CallOperator::Locator(locator) => (stack.get_external_stack_ref(locator.program_id())?, locator.resource()), CallOperator::Resource(resource) => { // TODO (howardwu): Revisit this decision to forbid calling internal functions. A record cannot be spent again. // But there are legitimate uses for passing a record through to an internal function. diff --git a/synthesizer/process/src/stack/evaluate.rs b/synthesizer/process/src/stack/evaluate.rs index 30217f1041..5612b62bd4 100644 --- a/synthesizer/process/src/stack/evaluate.rs +++ b/synthesizer/process/src/stack/evaluate.rs @@ -110,7 +110,7 @@ impl StackEvaluate for Stack { CallStack::CheckDeployment(requests, _, _) | CallStack::PackageRun(requests, _, _) => { let last_request = requests.last().ok_or(anyhow!("CallStack does not contain request"))?.clone(); (last_request, call_stack) - }, + } // If the evaluation is performed in the `Execute` mode, create a new `Evaluate` mode. // This is done to ensure that evaluation during execution is performed consistently. CallStack::Execute(authorization, _) => { @@ -223,7 +223,6 @@ impl StackEvaluate for Stack { .collect::>>()?; lap!(timer, "Load the outputs"); - // Map the output operands to registers. let output_registers = output_operands .iter() @@ -248,6 +247,6 @@ impl StackEvaluate for Stack { ); finish!(timer); - response + response } } diff --git a/synthesizer/process/src/stack/mod.rs b/synthesizer/process/src/stack/mod.rs index c5b91d6ffb..9e9c664c8e 100644 --- a/synthesizer/process/src/stack/mod.rs +++ b/synthesizer/process/src/stack/mod.rs @@ -237,17 +237,23 @@ impl StackProgram for Stack { #[inline] fn get_external_stack(&self, program_id: &ProgramID) -> Result>> { // Retrieve the external stack. - self.external_stacks.get(program_id).cloned().ok_or_else(|| anyhow!("External program '{program_id}' does not exist.")) + self.external_stacks + .get(program_id) + .cloned() + .ok_or_else(|| anyhow!("External program '{program_id}' does not exist.")) } /// Returns the external stack ref for the given program ID. #[inline] fn get_external_stack_ref(&self, program_id: &ProgramID) -> Result<&Stack> { // Retrieve the external stack. - self.external_stacks.get(program_id).ok_or_else(|| anyhow!("External program '{program_id}' does not exist.")).map(|stack| { - // Return the external stack. - stack.as_ref() - }) + self.external_stacks + .get(program_id) + .ok_or_else(|| anyhow!("External program '{program_id}' does not exist.")) + .map(|stack| { + // Return the external stack. + stack.as_ref() + }) } /// Returns the external program for the given program ID. diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index 3d952aaca7..cff51bdda9 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -1057,23 +1057,18 @@ finalize do: } // Fetch the unspent records. - let records = - genesis.transitions().cloned().flat_map(Transition::into_records).collect::>(); + let records = genesis.transitions().cloned().flat_map(Transition::into_records).collect::>(); trace!("Unspent Records:\n{:#?}", records); // Select a record to spend. let record = Some(records.values().next().unwrap().decrypt(&view_key).unwrap()); // Prepare the inputs. - let inputs = [ - Value::::from_str("1u32").unwrap(), - ] - .into_iter(); + let inputs = [Value::::from_str("1u32").unwrap()].into_iter(); // Execute. - let transaction = vm - .execute(&private_key, ("program_layer_30.aleo", "do"), inputs, record, 0, None, rng) - .unwrap(); + let transaction = + vm.execute(&private_key, ("program_layer_30.aleo", "do"), inputs, record, 0, None, rng).unwrap(); // Verify. vm.check_transaction(&transaction, None).unwrap(); From 4f10fecb969fa73ffcc98d6b94b1724abec3bb0b Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Wed, 22 Nov 2023 20:49:56 +0100 Subject: [PATCH 166/339] Remove comment --- synthesizer/process/src/stack/evaluate.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/synthesizer/process/src/stack/evaluate.rs b/synthesizer/process/src/stack/evaluate.rs index 5612b62bd4..f4f91fddd5 100644 --- a/synthesizer/process/src/stack/evaluate.rs +++ b/synthesizer/process/src/stack/evaluate.rs @@ -106,7 +106,6 @@ impl StackEvaluate for Stack { // Retrieve the next request, based on the call stack mode. let (request, call_stack) = match &call_stack { CallStack::Evaluate(authorization) => (authorization.next()?, call_stack), - // CallStack::Synthesize(_, _, authorization) => (authorization.peek_next()?, call_stack), CallStack::CheckDeployment(requests, _, _) | CallStack::PackageRun(requests, _, _) => { let last_request = requests.last().ok_or(anyhow!("CallStack does not contain request"))?.clone(); (last_request, call_stack) From 9ef59309be73a3ac11b523734039b4414da6c997 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Wed, 22 Nov 2023 20:59:36 +0100 Subject: [PATCH 167/339] Syntax fixes --- synthesizer/process/src/tests/test_credits.rs | 8 ++++---- synthesizer/src/vm/mod.rs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/synthesizer/process/src/tests/test_credits.rs b/synthesizer/process/src/tests/test_credits.rs index aefae59a3c..26a69335d9 100644 --- a/synthesizer/process/src/tests/test_credits.rs +++ b/synthesizer/process/src/tests/test_credits.rs @@ -1544,7 +1544,7 @@ mod sanity_checks { // Construct a new process. let process = Process::load().unwrap(); // Retrieve the stack. - let stack = process.get_stack(ProgramID::from_str("credits.aleo").unwrap()).unwrap(); + let stack = process.get_stack_ref(ProgramID::from_str("credits.aleo").unwrap()).unwrap(); // Declare the function name. let function_name = Identifier::from_str("transfer_private").unwrap(); @@ -1577,7 +1577,7 @@ mod sanity_checks { // Construct a new process. let process = Process::load().unwrap(); // Retrieve the stack. - let stack = process.get_stack(ProgramID::from_str("credits.aleo").unwrap()).unwrap(); + let stack = process.get_stack_ref(ProgramID::from_str("credits.aleo").unwrap()).unwrap(); // Declare the function name. let function_name = Identifier::from_str("transfer_public").unwrap(); @@ -1605,7 +1605,7 @@ mod sanity_checks { // Construct a new process. let process = Process::load().unwrap(); // Retrieve the stack. - let stack = process.get_stack(ProgramID::from_str("credits.aleo").unwrap()).unwrap(); + let stack = process.get_stack_ref(ProgramID::from_str("credits.aleo").unwrap()).unwrap(); // Declare the function name. let function_name = Identifier::from_str("fee_private").unwrap(); @@ -1638,7 +1638,7 @@ mod sanity_checks { // Construct a new process. let process = Process::load().unwrap(); // Retrieve the stack. - let stack = process.get_stack(ProgramID::from_str("credits.aleo").unwrap()).unwrap(); + let stack = process.get_stack_ref(ProgramID::from_str("credits.aleo").unwrap()).unwrap(); // Declare the function name. let function_name = Identifier::from_str("fee_public").unwrap(); diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index cff51bdda9..c35f1ef1e7 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -1071,6 +1071,6 @@ finalize do: vm.execute(&private_key, ("program_layer_30.aleo", "do"), inputs, record, 0, None, rng).unwrap(); // Verify. - vm.check_transaction(&transaction, None).unwrap(); + vm.check_transaction(&transaction, None, rng).unwrap(); } } From 186b09936ab1546dbca75e3155cbf93d0cfdb55f Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Wed, 22 Nov 2023 13:18:50 -0800 Subject: [PATCH 168/339] Update verify.rs Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- ledger/block/src/verify.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/block/src/verify.rs b/ledger/block/src/verify.rs index e4f2f58714..8f6d3facbc 100644 --- a/ledger/block/src/verify.rs +++ b/ledger/block/src/verify.rs @@ -221,7 +221,7 @@ impl Block { let height = self.height(); // Ensure there are sufficient ratifications. - ensure!(!self.ratifications.len() >= 2, "Block {height} must contain at least 2 ratifications"); + ensure!(self.ratifications.len() >= 2, "Block {height} must contain at least 2 ratifications"); // Initialize a ratifications iterator. let mut ratifications_iter = self.ratifications.iter(); From f3add028cd9097fb5ce4e6b6d29d4ef57551dc6a Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Thu, 23 Nov 2023 14:29:23 +0100 Subject: [PATCH 169/339] Clarify wrapped documentation --- synthesizer/program/src/logic/instruction/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/synthesizer/program/src/logic/instruction/mod.rs b/synthesizer/program/src/logic/instruction/mod.rs index f4199eef49..930920ca5e 100644 --- a/synthesizer/program/src/logic/instruction/mod.rs +++ b/synthesizer/program/src/logic/instruction/mod.rs @@ -181,11 +181,11 @@ pub enum Instruction { RemWrapped(RemWrapped), /// Shifts `first` left by `second` bits, storing the outcome in `destination`. Shl(Shl), - /// Shifts `first` left by `second` bits, continuing past the boundary of the type, storing the outcome in `destination`. + /// Shifts `first` left by `second` bits, wrapping around at the boundary of the type, storing the outcome in `destination`. ShlWrapped(ShlWrapped), /// Shifts `first` right by `second` bits, storing the outcome in `destination`. Shr(Shr), - /// Shifts `first` right by `second` bits, continuing past the boundary of the type, storing the outcome in `destination`. + /// Shifts `first` right by `second` bits, wrapping around at the boundary of the type, storing the outcome in `destination`. ShrWrapped(ShrWrapped), /// Computes whether `signature` is valid for the given `address` and `message`. SignVerify(SignVerify), From 8616491e961d7d31374a25169f2fba532b62248f Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Thu, 23 Nov 2023 14:41:44 +0100 Subject: [PATCH 170/339] Correctly sample random vectors --- algorithms/src/snark/varuna/data_structures/proof.rs | 6 +++--- algorithms/src/snark/varuna/tests.rs | 2 +- console/algorithms/benches/poseidon.rs | 6 +++--- ledger/block/src/transition/input/mod.rs | 3 ++- ledger/block/src/transition/output/mod.rs | 3 ++- ledger/test-helpers/src/lib.rs | 6 ++++-- 6 files changed, 15 insertions(+), 11 deletions(-) diff --git a/algorithms/src/snark/varuna/data_structures/proof.rs b/algorithms/src/snark/varuna/data_structures/proof.rs index 0d7767f777..1fc4962215 100644 --- a/algorithms/src/snark/varuna/data_structures/proof.rs +++ b/algorithms/src/snark/varuna/data_structures/proof.rs @@ -424,9 +424,9 @@ mod test { fn rand_evaluations(rng: &mut TestRng, i: usize) -> Evaluations { Evaluations { g_1_eval: F::rand(rng), - g_a_evals: vec![F::rand(rng); i], - g_b_evals: vec![F::rand(rng); i], - g_c_evals: vec![F::rand(rng); i], + g_a_evals: (0..i).map(|_| F::rand(rng)).collect(), + g_b_evals: (0..i).map(|_| F::rand(rng)).collect(), + g_c_evals: (0..i).map(|_| F::rand(rng)).collect(), } } diff --git a/algorithms/src/snark/varuna/tests.rs b/algorithms/src/snark/varuna/tests.rs index 70eeb548e7..ac73830d14 100644 --- a/algorithms/src/snark/varuna/tests.rs +++ b/algorithms/src/snark/varuna/tests.rs @@ -129,7 +129,7 @@ mod varuna { for instance_input in vks_to_inputs.values() { let mut fake_instance_input = Vec::with_capacity(instance_input.len()); for input in instance_input.iter() { - let fake_input = vec![Fr::rand(rng); input.len()]; + let fake_input: Vec<_> = (0..input.len()).map(|_| Fr::rand(rng)).collect(); fake_instance_input.push(fake_input); } fake_instance_inputs.push(fake_instance_input); diff --git a/console/algorithms/benches/poseidon.rs b/console/algorithms/benches/poseidon.rs index 6d03ba5cb1..be7a74b426 100644 --- a/console/algorithms/benches/poseidon.rs +++ b/console/algorithms/benches/poseidon.rs @@ -30,7 +30,7 @@ fn poseidon2(c: &mut Criterion) { c.bench_function("Poseidon2 Hash 4 -> 1", |b| b.iter(|| hash.hash(&input))); c.bench_function("Poseidon2 Hash 4 -> 2", |b| b.iter(|| hash.hash_many(&input, 2))); - let input = [F::rand(rng); 10]; + let input: Vec<_> = (0..10).map(|_| F::rand(rng)).collect(); c.bench_function("Poseidon2 Hash 10 -> 1", |b| b.iter(|| hash.hash(&input))); c.bench_function("Poseidon2 Hash 10 -> 4", |b| b.iter(|| hash.hash_many(&input, 4))); c.bench_function("Poseidon2 Hash 10 -> 8", |b| b.iter(|| hash.hash_many(&input, 8))); @@ -44,7 +44,7 @@ fn poseidon4(c: &mut Criterion) { c.bench_function("Poseidon4 Hash 4 -> 1", |b| b.iter(|| hash.hash(&input))); c.bench_function("Poseidon4 Hash 4 -> 2", |b| b.iter(|| hash.hash_many(&input, 2))); - let input = [F::rand(rng); 10]; + let input: Vec<_> = (0..10).map(|_| F::rand(rng)).collect(); c.bench_function("Poseidon4 Hash 10 -> 1", |b| b.iter(|| hash.hash(&input))); c.bench_function("Poseidon4 Hash 10 -> 4", |b| b.iter(|| hash.hash_many(&input, 4))); c.bench_function("Poseidon4 Hash 10 -> 8", |b| b.iter(|| hash.hash_many(&input, 8))); @@ -58,7 +58,7 @@ fn poseidon8(c: &mut Criterion) { c.bench_function("Poseidon8 Hash 4 -> 1", |b| b.iter(|| hash.hash(&input))); c.bench_function("Poseidon8 Hash 4 -> 2", |b| b.iter(|| hash.hash_many(&input, 2))); - let input = [F::rand(rng); 10]; + let input: Vec<_> = (0..10).map(|_| F::rand(rng)).collect(); c.bench_function("Poseidon8 Hash 10 -> 1", |b| b.iter(|| hash.hash(&input))); c.bench_function("Poseidon8 Hash 10 -> 4", |b| b.iter(|| hash.hash_many(&input, 4))); c.bench_function("Poseidon8 Hash 10 -> 8", |b| b.iter(|| hash.hash_many(&input, 8))); diff --git a/ledger/block/src/transition/input/mod.rs b/ledger/block/src/transition/input/mod.rs index 2ef959be24..284af88f76 100644 --- a/ledger/block/src/transition/input/mod.rs +++ b/ledger/block/src/transition/input/mod.rs @@ -200,7 +200,8 @@ pub(crate) mod test_helpers { let plaintext = Plaintext::Literal(Literal::Field(Uniform::rand(rng)), Default::default()); let plaintext_hash = CurrentNetwork::hash_bhp1024(&plaintext.to_bits_le()).unwrap(); // Sample a random ciphertext. - let ciphertext = Ciphertext::from_fields(&vec![Uniform::rand(rng); 10]).unwrap(); + let fields: Vec<_> = (0..10).map(|_| Uniform::rand(rng)).collect(); + let ciphertext = Ciphertext::from_fields(&fields).unwrap(); let ciphertext_hash = CurrentNetwork::hash_bhp1024(&ciphertext.to_bits_le()).unwrap(); vec![ diff --git a/ledger/block/src/transition/output/mod.rs b/ledger/block/src/transition/output/mod.rs index 2e4e066552..3f0f5ff7a4 100644 --- a/ledger/block/src/transition/output/mod.rs +++ b/ledger/block/src/transition/output/mod.rs @@ -277,7 +277,8 @@ pub(crate) mod test_helpers { let plaintext = Plaintext::Literal(Literal::Field(Uniform::rand(rng)), Default::default()); let plaintext_hash = CurrentNetwork::hash_bhp1024(&plaintext.to_bits_le()).unwrap(); // Sample a random ciphertext. - let ciphertext = Ciphertext::from_fields(&vec![Uniform::rand(rng); 10]).unwrap(); + let fields: Vec<_> = (0..10).map(|_| Uniform::rand(rng)).collect(); + let ciphertext = Ciphertext::from_fields(&fields).unwrap(); let ciphertext_hash = CurrentNetwork::hash_bhp1024(&ciphertext.to_bits_le()).unwrap(); // Sample a random record. let randomizer = Uniform::rand(rng); diff --git a/ledger/test-helpers/src/lib.rs b/ledger/test-helpers/src/lib.rs index 743e8f74d9..813fb8cb0b 100644 --- a/ledger/test-helpers/src/lib.rs +++ b/ledger/test-helpers/src/lib.rs @@ -65,7 +65,8 @@ pub fn sample_inputs() -> Vec<(::TransitionID, Input< let plaintext = Plaintext::Literal(Literal::Field(Uniform::rand(rng)), Default::default()); let plaintext_hash = CurrentNetwork::hash_bhp1024(&plaintext.to_bits_le()).unwrap(); // Sample a random ciphertext. - let ciphertext = Ciphertext::from_fields(&vec![Uniform::rand(rng); 10]).unwrap(); + let fields: Vec<_> = (0..10).map(|_| Uniform::rand(rng)).collect(); + let ciphertext = Ciphertext::from_fields(&fields).unwrap(); let ciphertext_hash = CurrentNetwork::hash_bhp1024(&ciphertext.to_bits_le()).unwrap(); vec![ @@ -97,7 +98,8 @@ pub fn sample_outputs() -> Vec<(::TransitionID, Outpu let plaintext = Plaintext::Literal(Literal::Field(Uniform::rand(rng)), Default::default()); let plaintext_hash = CurrentNetwork::hash_bhp1024(&plaintext.to_bits_le()).unwrap(); // Sample a random ciphertext. - let ciphertext = Ciphertext::from_fields(&vec![Uniform::rand(rng); 10]).unwrap(); + let fields: Vec<_> = (0..10).map(|_| Uniform::rand(rng)).collect(); + let ciphertext = Ciphertext::from_fields(&fields).unwrap(); let ciphertext_hash = CurrentNetwork::hash_bhp1024(&ciphertext.to_bits_le()).unwrap(); // Sample a random record. let randomizer = Uniform::rand(rng); From a3f93f00a13b5ccf058b14cc029f974465957dfa Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Thu, 23 Nov 2023 15:46:18 +0100 Subject: [PATCH 171/339] Reduce code duplication get_*stack_ref --- synthesizer/process/src/finalize.rs | 2 +- synthesizer/process/src/lib.rs | 17 ++++------------- synthesizer/process/src/stack/call/mod.rs | 6 ++++-- synthesizer/process/src/stack/mod.rs | 16 +++------------- .../program/src/traits/stack_and_registers.rs | 2 +- 5 files changed, 13 insertions(+), 30 deletions(-) diff --git a/synthesizer/process/src/finalize.rs b/synthesizer/process/src/finalize.rs index 6cbdf02ccb..e3f7a4ce61 100644 --- a/synthesizer/process/src/finalize.rs +++ b/synthesizer/process/src/finalize.rs @@ -356,7 +356,7 @@ fn initialize_finalize_state<'a, N: Network>( let (finalize, stack) = match stack.program_id() == future.program_id() { true => (stack.get_function_ref(future.function_name())?.finalize_logic(), stack), false => { - let stack = stack.get_external_stack_ref(future.program_id())?; + let stack = stack.get_external_stack_ref(future.program_id())?.as_ref(); (stack.get_function_ref(future.function_name())?.finalize_logic(), stack) } }; diff --git a/synthesizer/process/src/lib.rs b/synthesizer/process/src/lib.rs index ec75fd5842..f85d2894ca 100644 --- a/synthesizer/process/src/lib.rs +++ b/synthesizer/process/src/lib.rs @@ -203,25 +203,16 @@ impl Process { /// Returns the stack for the given program ID. #[inline] pub fn get_stack(&self, program_id: impl TryInto>) -> Result>> { - // Prepare the program ID. - let program_id = program_id.try_into().map_err(|_| anyhow!("Invalid program ID"))?; - // Retrieve the stack. - let stack = - self.stacks.get(&program_id).cloned().ok_or_else(|| anyhow!("Program '{program_id}' does not exist"))?; - // Ensure the program ID matches. - ensure!(stack.program_id() == &program_id, "Expected program '{}', found '{program_id}'", stack.program_id()); - // Return the stack. - Ok(stack) + self.get_stack_ref(program_id).map(Arc::clone) } /// Returns the stack for the given program ID. #[inline] - pub fn get_stack_ref(&self, program_id: impl TryInto>) -> Result<&Stack> { + pub fn get_stack_ref(&self, program_id: impl TryInto>) -> Result<&Arc>> { // Prepare the program ID. let program_id = program_id.try_into().map_err(|_| anyhow!("Invalid program ID"))?; // Retrieve the stack. - let stack = - self.stacks.get(&program_id).ok_or_else(|| anyhow!("Program '{program_id}' does not exist"))?.deref(); + let stack = self.stacks.get(&program_id).ok_or_else(|| anyhow!("Program '{program_id}' does not exist"))?; // Ensure the program ID matches. ensure!(stack.program_id() == &program_id, "Expected program '{}', found '{program_id}'", stack.program_id()); // Return the stack. @@ -231,7 +222,7 @@ impl Process { /// Returns the program for the given program ID. #[inline] pub fn get_program(&self, program_id: impl TryInto>) -> Result<&Program> { - self.get_stack_ref(program_id).map(Stack::program) + Ok(self.get_stack_ref(program_id)?.program()) } /// Returns the proving key for the given program ID and function name. diff --git a/synthesizer/process/src/stack/call/mod.rs b/synthesizer/process/src/stack/call/mod.rs index 6c0a66ac74..3a6df3ca28 100644 --- a/synthesizer/process/src/stack/call/mod.rs +++ b/synthesizer/process/src/stack/call/mod.rs @@ -67,7 +67,9 @@ impl CallTrait for Call { // Retrieve the substack and resource. let (substack, resource) = match self.operator() { // Retrieve the call stack and resource from the locator. - CallOperator::Locator(locator) => (stack.get_external_stack_ref(locator.program_id())?, locator.resource()), + CallOperator::Locator(locator) => { + (stack.get_external_stack_ref(locator.program_id())?.as_ref(), locator.resource()) + } CallOperator::Resource(resource) => { // TODO (howardwu): Revisit this decision to forbid calling internal functions. A record cannot be spent again. // But there are legitimate uses for passing a record through to an internal function. @@ -161,7 +163,7 @@ impl CallTrait for Call { if is_credits_program && (is_fee_private || is_fee_public) { bail!("Cannot perform an external call to 'credits.aleo/fee_private' or 'credits.aleo/fee_public'.") } else { - (stack.get_external_stack_ref(locator.program_id())?, locator.resource()) + (stack.get_external_stack_ref(locator.program_id())?.as_ref(), locator.resource()) } } CallOperator::Resource(resource) => { diff --git a/synthesizer/process/src/stack/mod.rs b/synthesizer/process/src/stack/mod.rs index 9e9c664c8e..a0b737f316 100644 --- a/synthesizer/process/src/stack/mod.rs +++ b/synthesizer/process/src/stack/mod.rs @@ -236,24 +236,14 @@ impl StackProgram for Stack { /// Returns the external stack for the given program ID. #[inline] fn get_external_stack(&self, program_id: &ProgramID) -> Result>> { - // Retrieve the external stack. - self.external_stacks - .get(program_id) - .cloned() - .ok_or_else(|| anyhow!("External program '{program_id}' does not exist.")) + self.get_external_stack_ref(program_id).map(Arc::clone) } /// Returns the external stack ref for the given program ID. #[inline] - fn get_external_stack_ref(&self, program_id: &ProgramID) -> Result<&Stack> { + fn get_external_stack_ref(&self, program_id: &ProgramID) -> Result<&Arc>> { // Retrieve the external stack. - self.external_stacks - .get(program_id) - .ok_or_else(|| anyhow!("External program '{program_id}' does not exist.")) - .map(|stack| { - // Return the external stack. - stack.as_ref() - }) + self.external_stacks.get(program_id).ok_or_else(|| anyhow!("External program '{program_id}' does not exist.")) } /// Returns the external program for the given program ID. diff --git a/synthesizer/program/src/traits/stack_and_registers.rs b/synthesizer/program/src/traits/stack_and_registers.rs index eede9dee0b..061f7c5d17 100644 --- a/synthesizer/program/src/traits/stack_and_registers.rs +++ b/synthesizer/program/src/traits/stack_and_registers.rs @@ -70,7 +70,7 @@ pub trait StackProgram { fn get_external_stack(&self, program_id: &ProgramID) -> Result>; /// Returns the external stack ref for the given program ID. - fn get_external_stack_ref(&self, program_id: &ProgramID) -> Result<&Self>; + fn get_external_stack_ref(&self, program_id: &ProgramID) -> Result<&Arc>; /// Returns the external program for the given program ID. fn get_external_program(&self, program_id: &ProgramID) -> Result<&Program>; From 98da30277c154c77823beae692639802924b35e2 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Thu, 23 Nov 2023 20:45:30 +0100 Subject: [PATCH 172/339] Always get Stack by ref --- synthesizer/process/src/finalize.rs | 8 ++++---- synthesizer/process/src/lib.rs | 10 ++-------- synthesizer/process/src/tests/test_credits.rs | 8 ++++---- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/synthesizer/process/src/finalize.rs b/synthesizer/process/src/finalize.rs index e3f7a4ce61..1454b558b6 100644 --- a/synthesizer/process/src/finalize.rs +++ b/synthesizer/process/src/finalize.rs @@ -49,7 +49,7 @@ impl Process { /* Finalize the fee. */ // Retrieve the fee stack. - let fee_stack = self.get_stack_ref(fee.program_id())?; + let fee_stack = self.get_stack(fee.program_id())?; // Finalize the fee transition. finalize_operations.extend(finalize_fee_transition(state, store, fee_stack, fee)?); lap!(timer, "Finalize transition for '{}/{}'", fee.program_id(), fee.function_name()); @@ -90,7 +90,7 @@ impl Process { // Retrieve the root transition (without popping it). let transition = execution.peek()?; // Retrieve the stack. - let stack = self.get_stack_ref(transition.program_id())?; + let stack = self.get_stack(transition.program_id())?; // Ensure the number of calls matches the number of transitions. let number_of_calls = stack.get_number_of_calls(transition.function_name())?; ensure!( @@ -113,7 +113,7 @@ impl Process { if let Some(fee) = fee { // Retrieve the fee stack. - let fee_stack = self.get_stack_ref(fee.program_id())?; + let fee_stack = self.get_stack(fee.program_id())?; // Finalize the fee transition. finalize_operations.extend(finalize_fee_transition(state, store, fee_stack, fee)?); lap!(timer, "Finalize transition for '{}/{}'", fee.program_id(), fee.function_name()); @@ -139,7 +139,7 @@ impl Process { atomic_batch_scope!(store, { // Retrieve the stack. - let stack = self.get_stack_ref(fee.program_id())?; + let stack = self.get_stack(fee.program_id())?; // Finalize the fee transition. let result = finalize_fee_transition(state, store, stack, fee); finish!(timer, "Finalize transition for '{}/{}'", fee.program_id(), fee.function_name()); diff --git a/synthesizer/process/src/lib.rs b/synthesizer/process/src/lib.rs index f85d2894ca..392574ee2b 100644 --- a/synthesizer/process/src/lib.rs +++ b/synthesizer/process/src/lib.rs @@ -202,13 +202,7 @@ impl Process { /// Returns the stack for the given program ID. #[inline] - pub fn get_stack(&self, program_id: impl TryInto>) -> Result>> { - self.get_stack_ref(program_id).map(Arc::clone) - } - - /// Returns the stack for the given program ID. - #[inline] - pub fn get_stack_ref(&self, program_id: impl TryInto>) -> Result<&Arc>> { + pub fn get_stack(&self, program_id: impl TryInto>) -> Result<&Arc>> { // Prepare the program ID. let program_id = program_id.try_into().map_err(|_| anyhow!("Invalid program ID"))?; // Retrieve the stack. @@ -222,7 +216,7 @@ impl Process { /// Returns the program for the given program ID. #[inline] pub fn get_program(&self, program_id: impl TryInto>) -> Result<&Program> { - Ok(self.get_stack_ref(program_id)?.program()) + Ok(self.get_stack(program_id)?.program()) } /// Returns the proving key for the given program ID and function name. diff --git a/synthesizer/process/src/tests/test_credits.rs b/synthesizer/process/src/tests/test_credits.rs index 26a69335d9..aefae59a3c 100644 --- a/synthesizer/process/src/tests/test_credits.rs +++ b/synthesizer/process/src/tests/test_credits.rs @@ -1544,7 +1544,7 @@ mod sanity_checks { // Construct a new process. let process = Process::load().unwrap(); // Retrieve the stack. - let stack = process.get_stack_ref(ProgramID::from_str("credits.aleo").unwrap()).unwrap(); + let stack = process.get_stack(ProgramID::from_str("credits.aleo").unwrap()).unwrap(); // Declare the function name. let function_name = Identifier::from_str("transfer_private").unwrap(); @@ -1577,7 +1577,7 @@ mod sanity_checks { // Construct a new process. let process = Process::load().unwrap(); // Retrieve the stack. - let stack = process.get_stack_ref(ProgramID::from_str("credits.aleo").unwrap()).unwrap(); + let stack = process.get_stack(ProgramID::from_str("credits.aleo").unwrap()).unwrap(); // Declare the function name. let function_name = Identifier::from_str("transfer_public").unwrap(); @@ -1605,7 +1605,7 @@ mod sanity_checks { // Construct a new process. let process = Process::load().unwrap(); // Retrieve the stack. - let stack = process.get_stack_ref(ProgramID::from_str("credits.aleo").unwrap()).unwrap(); + let stack = process.get_stack(ProgramID::from_str("credits.aleo").unwrap()).unwrap(); // Declare the function name. let function_name = Identifier::from_str("fee_private").unwrap(); @@ -1638,7 +1638,7 @@ mod sanity_checks { // Construct a new process. let process = Process::load().unwrap(); // Retrieve the stack. - let stack = process.get_stack_ref(ProgramID::from_str("credits.aleo").unwrap()).unwrap(); + let stack = process.get_stack(ProgramID::from_str("credits.aleo").unwrap()).unwrap(); // Declare the function name. let function_name = Identifier::from_str("fee_public").unwrap(); From a5a1898c64699a0e407ba1e91aad95747b525f49 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Thu, 23 Nov 2023 20:53:49 +0100 Subject: [PATCH 173/339] Always get external Stack by ref --- synthesizer/process/src/finalize.rs | 2 +- synthesizer/process/src/stack/call/mod.rs | 4 ++-- synthesizer/process/src/stack/mod.rs | 10 ++-------- synthesizer/program/src/traits/stack_and_registers.rs | 5 +---- 4 files changed, 6 insertions(+), 15 deletions(-) diff --git a/synthesizer/process/src/finalize.rs b/synthesizer/process/src/finalize.rs index 1454b558b6..974ed1e158 100644 --- a/synthesizer/process/src/finalize.rs +++ b/synthesizer/process/src/finalize.rs @@ -356,7 +356,7 @@ fn initialize_finalize_state<'a, N: Network>( let (finalize, stack) = match stack.program_id() == future.program_id() { true => (stack.get_function_ref(future.function_name())?.finalize_logic(), stack), false => { - let stack = stack.get_external_stack_ref(future.program_id())?.as_ref(); + let stack = stack.get_external_stack(future.program_id())?.as_ref(); (stack.get_function_ref(future.function_name())?.finalize_logic(), stack) } }; diff --git a/synthesizer/process/src/stack/call/mod.rs b/synthesizer/process/src/stack/call/mod.rs index 3a6df3ca28..6e802a9266 100644 --- a/synthesizer/process/src/stack/call/mod.rs +++ b/synthesizer/process/src/stack/call/mod.rs @@ -68,7 +68,7 @@ impl CallTrait for Call { let (substack, resource) = match self.operator() { // Retrieve the call stack and resource from the locator. CallOperator::Locator(locator) => { - (stack.get_external_stack_ref(locator.program_id())?.as_ref(), locator.resource()) + (stack.get_external_stack(locator.program_id())?.as_ref(), locator.resource()) } CallOperator::Resource(resource) => { // TODO (howardwu): Revisit this decision to forbid calling internal functions. A record cannot be spent again. @@ -163,7 +163,7 @@ impl CallTrait for Call { if is_credits_program && (is_fee_private || is_fee_public) { bail!("Cannot perform an external call to 'credits.aleo/fee_private' or 'credits.aleo/fee_public'.") } else { - (stack.get_external_stack_ref(locator.program_id())?.as_ref(), locator.resource()) + (stack.get_external_stack(locator.program_id())?.as_ref(), locator.resource()) } } CallOperator::Resource(resource) => { diff --git a/synthesizer/process/src/stack/mod.rs b/synthesizer/process/src/stack/mod.rs index a0b737f316..1fa96358bd 100644 --- a/synthesizer/process/src/stack/mod.rs +++ b/synthesizer/process/src/stack/mod.rs @@ -233,15 +233,9 @@ impl StackProgram for Stack { } } - /// Returns the external stack for the given program ID. - #[inline] - fn get_external_stack(&self, program_id: &ProgramID) -> Result>> { - self.get_external_stack_ref(program_id).map(Arc::clone) - } - /// Returns the external stack ref for the given program ID. #[inline] - fn get_external_stack_ref(&self, program_id: &ProgramID) -> Result<&Arc>> { + fn get_external_stack(&self, program_id: &ProgramID) -> Result<&Arc>> { // Retrieve the external stack. self.external_stacks.get(program_id).ok_or_else(|| anyhow!("External program '{program_id}' does not exist.")) } @@ -252,7 +246,7 @@ impl StackProgram for Stack { match self.program.id() == program_id { true => bail!("Attempted to get the main program '{}' as an external program", self.program.id()), // Retrieve the external stack, and return the external program. - false => Ok(self.get_external_stack_ref(program_id)?.program()), + false => Ok(self.get_external_stack(program_id)?.program()), } } diff --git a/synthesizer/program/src/traits/stack_and_registers.rs b/synthesizer/program/src/traits/stack_and_registers.rs index 061f7c5d17..fd1fd160c3 100644 --- a/synthesizer/program/src/traits/stack_and_registers.rs +++ b/synthesizer/program/src/traits/stack_and_registers.rs @@ -66,11 +66,8 @@ pub trait StackProgram { /// Returns `true` if the stack contains the external record. fn contains_external_record(&self, locator: &Locator) -> bool; - /// Returns the external stack for the given program ID. - fn get_external_stack(&self, program_id: &ProgramID) -> Result>; - /// Returns the external stack ref for the given program ID. - fn get_external_stack_ref(&self, program_id: &ProgramID) -> Result<&Arc>; + fn get_external_stack(&self, program_id: &ProgramID) -> Result<&Arc>; /// Returns the external program for the given program ID. fn get_external_program(&self, program_id: &ProgramID) -> Result<&Program>; From b30d4f415e82b7ad77a211bfebd1bb421886a0c2 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Thu, 23 Nov 2023 20:56:12 +0100 Subject: [PATCH 174/339] Clean up timers and assert --- synthesizer/process/src/stack/call/mod.rs | 24 ++++++++----------- synthesizer/process/src/stack/evaluate.rs | 2 +- synthesizer/process/src/stack/mod.rs | 2 +- .../program/src/traits/stack_and_registers.rs | 2 +- synthesizer/src/vm/mod.rs | 1 + 5 files changed, 14 insertions(+), 17 deletions(-) diff --git a/synthesizer/process/src/stack/call/mod.rs b/synthesizer/process/src/stack/call/mod.rs index 6e802a9266..b5c3c8442b 100644 --- a/synthesizer/process/src/stack/call/mod.rs +++ b/synthesizer/process/src/stack/call/mod.rs @@ -81,7 +81,7 @@ impl CallTrait for Call { (stack, resource) } }; - lap!(timer, "get substack and resource"); + lap!(timer, "Retrieved the substack and resource"); // If the operator is a closure, retrieve the closure and compute the output. let outputs = if let Ok(closure) = substack.program().get_closure(resource) { @@ -116,7 +116,7 @@ impl CallTrait for Call { else { bail!("Call operator '{}' is invalid or unsupported.", self.operator()) }; - lap!(timer, "got outputs"); + lap!(timer, "Computed outputs"); // Assign the outputs to the destination registers. for (output, register) in outputs.into_iter().zip_eq(&self.destinations()) { @@ -151,8 +151,6 @@ impl CallTrait for Call { let (substack, resource) = match self.operator() { // Retrieve the call stack and resource from the locator. CallOperator::Locator(locator) => { - lap!(timer, "Locator"); - // Check the external call locator. let function_name = locator.name().to_string(); let is_credits_program = &locator.program_id().to_string() == "credits.aleo"; @@ -167,7 +165,6 @@ impl CallTrait for Call { } } CallOperator::Resource(resource) => { - lap!(timer, "Resource"); // TODO (howardwu): Revisit this decision to forbid calling internal functions. A record cannot be spent again. // But there are legitimate uses for passing a record through to an internal function. // We could invoke the internal function without a state transition, but need to match visibility. @@ -178,10 +175,11 @@ impl CallTrait for Call { (stack, resource) } }; + lap!(timer, "Retrieve the substack and resource"); // If the operator is a closure, retrieve the closure and compute the output. let outputs = if let Ok(closure) = substack.program().get_closure(resource) { - lap!(timer, "execute_closure"); + lap!(timer, "Execute the closure"); // Execute the closure, and load the outputs. substack.execute_closure( &closure, @@ -194,7 +192,7 @@ impl CallTrait for Call { } // If the operator is a function, retrieve the function and compute the output. else if let Ok(function) = substack.program().get_function(resource) { - lap!(timer, "execute_function"); + lap!(timer, "Execute the function"); // Retrieve the number of inputs. let num_inputs = function.inputs().len(); // Ensure the number of inputs matches the number of input statements. @@ -219,7 +217,6 @@ impl CallTrait for Call { // If the circuit is in authorize or synthesize mode, then add any external calls to the stack. CallStack::Authorize(_, private_key, authorization) | CallStack::Synthesize(_, private_key, authorization) => { - lap!(timer, "CallStack::Authorize,Synthesize"); // Compute the request. let request = Request::sign( &private_key, @@ -245,7 +242,6 @@ impl CallTrait for Call { (request, response) } CallStack::CheckDeployment(_, private_key, ..) | CallStack::PackageRun(_, private_key, ..) => { - lap!(timer, "CallStack::CheckDeployment,PackageRun"); // Compute the request. let request = Request::sign( &private_key, @@ -272,7 +268,6 @@ impl CallTrait for Call { } // If the circuit is in execute mode, then evaluate and execute the instructions. CallStack::Execute(authorization, ..) => { - lap!(timer, "CallStack::Execute"); // Retrieve the next request (without popping it). let request = authorization.peek_next()?; // Ensure the inputs match the original inputs. @@ -298,7 +293,8 @@ impl CallTrait for Call { } } }; - lap!(timer, "got request and response"); + lap!(timer, "Computed the request and response"); + // Inject the existing circuit. A::inject_r1cs(r1cs); @@ -348,7 +344,7 @@ impl CallTrait for Call { None, ); A::assert(check_input_ids); - lap!(timer, "checked input ids"); + lap!(timer, "Checked the input ids"); // Inject the outputs as `Mode::Private` (with the 'tcm' and output IDs as `Mode::Public`). let outputs = circuit::Response::process_outputs_from_callback( @@ -361,7 +357,7 @@ impl CallTrait for Call { response.outputs().to_vec(), &function.output_types(), ); - lap!(timer, "checked outputs"); + lap!(timer, "Checked the outputs"); // Return the circuit outputs. outputs } @@ -375,7 +371,7 @@ impl CallTrait for Call { // Assign the output to the register. registers.store_circuit(stack, register, output)?; } - lap!(timer, "assigned outputs to registers"); + lap!(timer, "Assigned the outputs to registers"); finish!(timer); diff --git a/synthesizer/process/src/stack/evaluate.rs b/synthesizer/process/src/stack/evaluate.rs index f4f91fddd5..4de683e245 100644 --- a/synthesizer/process/src/stack/evaluate.rs +++ b/synthesizer/process/src/stack/evaluate.rs @@ -230,7 +230,7 @@ impl StackEvaluate for Stack { _ => None, }) .collect::>(); - lap!(timer, "Load the output_registers"); + lap!(timer, "Loaded the output registers"); // Compute the response. let response = Response::new( diff --git a/synthesizer/process/src/stack/mod.rs b/synthesizer/process/src/stack/mod.rs index 1fa96358bd..2b95b46fb7 100644 --- a/synthesizer/process/src/stack/mod.rs +++ b/synthesizer/process/src/stack/mod.rs @@ -233,7 +233,7 @@ impl StackProgram for Stack { } } - /// Returns the external stack ref for the given program ID. + /// Returns the external stack for the given program ID. #[inline] fn get_external_stack(&self, program_id: &ProgramID) -> Result<&Arc>> { // Retrieve the external stack. diff --git a/synthesizer/program/src/traits/stack_and_registers.rs b/synthesizer/program/src/traits/stack_and_registers.rs index fd1fd160c3..50418e894f 100644 --- a/synthesizer/program/src/traits/stack_and_registers.rs +++ b/synthesizer/program/src/traits/stack_and_registers.rs @@ -66,7 +66,7 @@ pub trait StackProgram { /// Returns `true` if the stack contains the external record. fn contains_external_record(&self, locator: &Locator) -> bool; - /// Returns the external stack ref for the given program ID. + /// Returns the external stack for the given program ID. fn get_external_stack(&self, program_id: &ProgramID) -> Result<&Arc>; /// Returns the external program for the given program ID. diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index c35f1ef1e7..a130668240 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -605,6 +605,7 @@ function compute: // Construct the new block header. let (ratifications, transactions, aborted_transaction_ids, ratified_finalize_operations) = vm.speculate(sample_finalize_state(1), None, vec![], None, transactions.iter())?; + assert!(aborted_transaction_ids.is_empty()); // Construct the metadata associated with the block. let metadata = Metadata::new( From 08e57156fac073199ae98abc8f20b667830c2bfa Mon Sep 17 00:00:00 2001 From: ljedrz Date: Fri, 24 Nov 2023 10:42:45 +0100 Subject: [PATCH 175/339] perf: use Vecs instead of IndexMaps in Assignments Signed-off-by: ljedrz --- circuit/environment/src/helpers/assignment.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/circuit/environment/src/helpers/assignment.rs b/circuit/environment/src/helpers/assignment.rs index 0615dc95dc..acea1bc67e 100644 --- a/circuit/environment/src/helpers/assignment.rs +++ b/circuit/environment/src/helpers/assignment.rs @@ -44,7 +44,7 @@ impl From<&crate::Variable> for AssignmentVariable { #[derive(Clone, Debug)] pub struct AssignmentLC { constant: F, - terms: IndexMap, F>, + terms: Vec<(AssignmentVariable, F)>, } impl From<&crate::LinearCombination> for AssignmentLC { @@ -66,7 +66,7 @@ impl AssignmentLC { } /// Returns the terms of the linear combination. - pub const fn terms(&self) -> &IndexMap, F> { + pub const fn terms(&self) -> &Vec<(AssignmentVariable, F)> { &self.terms } @@ -84,8 +84,8 @@ impl AssignmentLC { /// and constraint assignments. #[derive(Clone, Debug)] pub struct Assignment { - public: IndexMap, - private: IndexMap, + public: Vec<(Index, F)>, + private: Vec<(Index, F)>, constraints: Vec<(AssignmentLC, AssignmentLC, AssignmentLC)>, } @@ -109,12 +109,12 @@ impl From> for Assignment { impl Assignment { /// Returns the public inputs of the assignment. - pub const fn public_inputs(&self) -> &IndexMap { + pub const fn public_inputs(&self) -> &Vec<(Index, F)> { &self.public } /// Returns the private inputs of the assignment. - pub const fn private_inputs(&self) -> &IndexMap { + pub const fn private_inputs(&self) -> &Vec<(Index, F)> { &self.private } From e4425137d438531109b5257b0343156d2a14c392 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Fri, 24 Nov 2023 16:19:01 +0100 Subject: [PATCH 176/339] Use the same format for custom Error types --- algorithms/src/errors.rs | 12 --- algorithms/src/polycommit/error.rs | 110 +++++----------------- algorithms/src/r1cs/errors.rs | 2 +- algorithms/src/snark/varuna/ahp/errors.rs | 35 +++---- 4 files changed, 45 insertions(+), 114 deletions(-) diff --git a/algorithms/src/errors.rs b/algorithms/src/errors.rs index 0713953dc7..a1dedf9f12 100644 --- a/algorithms/src/errors.rs +++ b/algorithms/src/errors.rs @@ -43,9 +43,6 @@ pub enum SNARKError { #[error("Circuit not found")] CircuitNotFound, - - #[error("terminated")] - Terminated, } impl From for SNARKError { @@ -53,12 +50,3 @@ impl From for SNARKError { SNARKError::Crate("AHPError", format!("{err:?}")) } } - -impl From for SNARKError { - fn from(err: crate::polycommit::PCError) -> Self { - match err { - crate::polycommit::PCError::Terminated => SNARKError::Terminated, - err => SNARKError::Crate("PCError", format!("{err:?}")), - } - } -} diff --git a/algorithms/src/polycommit/error.rs b/algorithms/src/polycommit/error.rs index 2be41f7f8e..22db5f8846 100644 --- a/algorithms/src/polycommit/error.rs +++ b/algorithms/src/polycommit/error.rs @@ -13,33 +13,33 @@ // limitations under the License. /// The error type for `PolynomialCommitment`. -#[derive(Debug)] +#[derive(Debug, Error)] pub enum PCError { - AnyhowError(anyhow::Error), + #[error("{0}")] + AnyhowError(#[from] anyhow::Error), - /// The query set contains a label for a polynomial that was not provided as - /// input to the `PC::open`. + #[error("QuerySet` refers to polynomial \"{label}\", but it was not provided.")] MissingPolynomial { - /// The label of the missing polynomial. + /// The label of the missing polynomial label: String, }, - /// `Evaluations` does not contain an evaluation for the polynomial labelled - /// `label` at a particular query. + #[error("`QuerySet` refers to polynomial \"{label}\", but `Evaluations` does not contain an evaluation for it.")] MissingEvaluation { /// The label of the missing polynomial. label: String, }, - /// The provided polynomial was meant to be hiding, but `rng` was `None`. + #[error("The provided polynomial was meant to be hiding, but `rng` was `None`.")] MissingRng, - /// The degree provided in setup was too small; degree 0 polynomials - /// are not supported. + #[error("The degree provided in setup was too small; degree 0 polynomials are not supported.")] DegreeIsZero, - /// The degree of the polynomial passed to `commit` or `open` - /// was too large. + #[error( + "the number of coefficients in the polynomial ({num_coefficients:?}) is greater than \ + the maximum number of powers in `Powers` ({num_powers:?})" + )] TooManyCoefficients { /// The number of coefficients in the polynomial. num_coefficients: usize, @@ -47,10 +47,12 @@ pub enum PCError { num_powers: usize, }, - /// The hiding bound was not `None`, but the hiding bound was zero. + #[error("The hiding bound was not `None`, but the hiding bound was zero.")] HidingBoundIsZero, - /// The hiding bound was too large for the given `Powers`. + #[error( + "the degree of the hiding poly ({hiding_poly_degree:?}) is not less than the maximum number of powers in `Powers` ({num_powers:?})" + )] HidingBoundToolarge { /// The hiding bound hiding_poly_degree: usize, @@ -58,29 +60,28 @@ pub enum PCError { num_powers: usize, }, - /// The lagrange basis is not a power of two. + #[error("The lagrange basis is not a power of two.")] LagrangeBasisSizeIsNotPowerOfTwo, - /// The lagrange basis is larger than the supported degree, + #[error("The lagrange basis is larger than the supported degree.")] LagrangeBasisSizeIsTooLarge, - /// The degree provided to `trim` was too large. + #[error("The degree provided to `trim` was too large.")] TrimmingDegreeTooLarge, - /// The provided equation contained multiple polynomials, of which least one - /// had a strict degree bound. + #[error("the eqaution \"{0}\" contained degree-bounded polynomials")] EquationHasDegreeBounds(String), - /// The required degree bound is not supported by ck/vk + #[error("the degree bound ({0}) is not supported by the parameters")] UnsupportedDegreeBound(usize), - /// The provided equation contained multiple polynomials, of which least one - /// had a strict degree bound. + #[error("the Lagrange basis size ({0}) is not supported by the parameters")] UnsupportedLagrangeBasisSize(usize), - /// The degree bound for the `index`-th polynomial passed to `commit`, `open` - /// or `check` was incorrect, that is, `degree_bound >= poly_degree` or - /// `degree_bound <= max_degree`. + #[error( + "the degree bound ({degree_bound}) for the polynomial {label} \ + (having degree {poly_degree}) is greater than the maximum degree ({max_degree})" + )] IncorrectDegreeBound { /// Degree of the polynomial. poly_degree: usize, @@ -91,63 +92,4 @@ pub enum PCError { /// Index of the offending polynomial. label: String, }, - - Terminated, -} - -impl snarkvm_utilities::error::Error for PCError {} - -impl From for PCError { - fn from(other: anyhow::Error) -> Self { - Self::AnyhowError(other) - } -} - -impl core::fmt::Display for PCError { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - match self { - Self::AnyhowError(error) => write!(f, "{error}"), - Self::MissingPolynomial { label } => { - write!(f, "`QuerySet` refers to polynomial \"{label}\", but it was not provided.") - } - Self::MissingEvaluation { label } => write!( - f, - "`QuerySet` refers to polynomial \"{label}\", but `Evaluations` does not contain an evaluation for it." - ), - Self::MissingRng => write!(f, "hiding commitments require `Some(rng)`"), - Self::DegreeIsZero => write!(f, "this scheme does not support committing to degree 0 polynomials"), - Self::TooManyCoefficients { num_coefficients, num_powers } => write!( - f, - "the number of coefficients in the polynomial ({num_coefficients:?}) is greater than\ - the maximum number of powers in `Powers` ({num_powers:?})" - ), - Self::HidingBoundIsZero => write!(f, "this scheme does not support non-`None` hiding bounds that are 0"), - Self::HidingBoundToolarge { hiding_poly_degree, num_powers } => write!( - f, - "the degree of the hiding poly ({hiding_poly_degree:?}) is not less than the maximum number of powers in `Powers` ({num_powers:?})" - ), - Self::TrimmingDegreeTooLarge => write!(f, "the degree provided to `trim` was too large"), - Self::EquationHasDegreeBounds(e) => { - write!(f, "the eqaution \"{e}\" contained degree-bounded polynomials") - } - Self::UnsupportedDegreeBound(bound) => { - write!(f, "the degree bound ({bound:?}) is not supported by the parameters") - } - Self::LagrangeBasisSizeIsNotPowerOfTwo => { - write!(f, "the Lagrange Basis size is not a power of two") - } - Self::UnsupportedLagrangeBasisSize(size) => { - write!(f, "the Lagrange basis size ({size:?}) is not supported by the parameters") - } - Self::LagrangeBasisSizeIsTooLarge => { - write!(f, "the Lagrange Basis size larger than max supported degree") - } - Self::IncorrectDegreeBound { poly_degree, degree_bound, max_degree, label } => write!( - f, - "the degree bound ({degree_bound}) for the polynomial {label} \ - (having degree {poly_degree}) is greater than the maximum degree ({max_degree})" - ), - Self::Terminated => write!(f, "terminated"), - } - } } diff --git a/algorithms/src/r1cs/errors.rs b/algorithms/src/r1cs/errors.rs index f1ab0a42b6..52b386e137 100644 --- a/algorithms/src/r1cs/errors.rs +++ b/algorithms/src/r1cs/errors.rs @@ -34,7 +34,7 @@ pub enum SynthesisError { Unsatisfiable, /// During synthesis, our polynomials ended up being too high of degree #[error("Polynomial degree is too large")] - PolynomialDegreeTooLarge, + PolyTooLarge, /// During proof generation, we encountered an identity in the CRS #[error("Encountered an identity element in the CRS")] UnexpectedIdentity, diff --git a/algorithms/src/snark/varuna/ahp/errors.rs b/algorithms/src/snark/varuna/ahp/errors.rs index c4bbb30c69..a18dfb46b2 100644 --- a/algorithms/src/snark/varuna/ahp/errors.rs +++ b/algorithms/src/snark/varuna/ahp/errors.rs @@ -13,24 +13,31 @@ // limitations under the License. /// Describes the failure modes of the AHP scheme. -#[derive(Debug)] +#[derive(Debug, Error)] pub enum AHPError { - /// Anyhow error - Anyhow(anyhow::Error), - /// The batch size is zero. + #[error("{}", _0)] + AnyhowError(#[from] anyhow::Error), + + #[error("Batch size was zero; must be at least 1.")] BatchSizeIsZero, - /// An error occurred during constraint generation. + + #[error("An error occurred during constraint generation.")] ConstraintSystemError(crate::r1cs::errors::SynthesisError), - /// The instance generated during proving does not match that in the index. + + #[error("The instance generated during proving does not match that in the index.")] InstanceDoesNotMatchIndex, - /// The number of public inputs is incorrect. + + #[error("The number of public inputs is incorrect.")] InvalidPublicInputLength, - /// During verification, a required evaluation is missing + + #[error("During verification, a required evaluation is missing: {}", _0)] MissingEval(String), - /// Currently we only support square constraint matrices. + + #[error("Currently we only support square constraint matrices.")] NonSquareMatrix, - /// During synthesis, our polynomials ended up being too high of degree - PolynomialDegreeTooLarge, + + #[error("During synthesis, our polynomials ended up being too high of degree.")] + PolyTooLarge, } impl From for AHPError { @@ -38,9 +45,3 @@ impl From for AHPError { AHPError::ConstraintSystemError(other) } } - -impl From for AHPError { - fn from(other: anyhow::Error) -> Self { - AHPError::Anyhow(other) - } -} From d1784a2246989968651b73050c2e7293036550a9 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Fri, 24 Nov 2023 16:19:19 +0100 Subject: [PATCH 177/339] Replace assert and unwrap by ensure and ? --- algorithms/src/polycommit/sonic_pc/mod.rs | 3 +- algorithms/src/snark/varuna/ahp/ahp.rs | 81 +++++++++--------- .../src/snark/varuna/ahp/indexer/circuit.rs | 27 +++--- .../snark/varuna/ahp/indexer/circuit_info.rs | 5 +- .../src/snark/varuna/ahp/indexer/indexer.rs | 32 ++++--- algorithms/src/snark/varuna/ahp/matrices.rs | 29 ++++--- .../varuna/ahp/prover/round_functions/mod.rs | 2 +- .../src/snark/varuna/ahp/prover/state.rs | 18 ++-- algorithms/src/snark/varuna/ahp/selectors.rs | 12 +-- .../src/snark/varuna/ahp/verifier/verifier.rs | 38 ++++----- algorithms/src/snark/varuna/varuna.rs | 83 ++++++++++--------- algorithms/src/traits/snark.rs | 16 ++-- 12 files changed, 181 insertions(+), 165 deletions(-) diff --git a/algorithms/src/polycommit/sonic_pc/mod.rs b/algorithms/src/polycommit/sonic_pc/mod.rs index 3b1858f6e2..8cd6d55644 100644 --- a/algorithms/src/polycommit/sonic_pc/mod.rs +++ b/algorithms/src/polycommit/sonic_pc/mod.rs @@ -515,10 +515,9 @@ impl> SonicKZG10 { .ok_or(PCError::MissingPolynomial { label: label.to_string() })?; if cur_comm.degree_bound().is_some() { - if num_polys != 1 { + if num_polys != 1 || !coeff.is_one() { return Err(PCError::EquationHasDegreeBounds(lc_label)); } - assert!(coeff.is_one(), "Coefficient must be one for degree-bounded equations"); degree_bound = cur_comm.degree_bound(); } coeffs_and_comms.push((*coeff, cur_comm.commitment())); diff --git a/algorithms/src/snark/varuna/ahp/ahp.rs b/algorithms/src/snark/varuna/ahp/ahp.rs index fc6bea6d5d..0d68eca8a6 100644 --- a/algorithms/src/snark/varuna/ahp/ahp.rs +++ b/algorithms/src/snark/varuna/ahp/ahp.rs @@ -27,7 +27,7 @@ use crate::{ SNARKMode, }, }; -use anyhow::anyhow; +use anyhow::{anyhow, ensure, Result}; use snarkvm_fields::{Field, PrimeField}; use core::{borrow::Borrow, marker::PhantomData}; @@ -79,17 +79,17 @@ impl AHPForR1CS { /// of this protocol. /// The number of the variables must include the "one" variable. That is, it /// must be with respect to the number of formatted public inputs. - pub fn max_degree(num_constraints: usize, num_variables: usize, num_non_zero: usize) -> Result { + pub fn max_degree(num_constraints: usize, num_variables: usize, num_non_zero: usize) -> Result { let zk_bound = Self::zk_bound().unwrap_or(0); let constraint_domain_size = - EvaluationDomain::::compute_size_of_domain(num_constraints).ok_or(AHPError::PolynomialDegreeTooLarge)?; + EvaluationDomain::::compute_size_of_domain(num_constraints).ok_or(AHPError::PolyTooLarge)?; let variable_domain_size = - EvaluationDomain::::compute_size_of_domain(num_variables).ok_or(AHPError::PolynomialDegreeTooLarge)?; + EvaluationDomain::::compute_size_of_domain(num_variables).ok_or(AHPError::PolyTooLarge)?; let non_zero_domain_size = - EvaluationDomain::::compute_size_of_domain(num_non_zero).ok_or(AHPError::PolynomialDegreeTooLarge)?; + EvaluationDomain::::compute_size_of_domain(num_non_zero).ok_or(AHPError::PolyTooLarge)?; // these should correspond with the bounds set in the .rs files - Ok(*[ + [ 2 * constraint_domain_size + 2 * zk_bound - 2, 2 * variable_domain_size + 2 * zk_bound - 2, if SM::ZK { variable_domain_size + 3 } else { 0 }, // mask_poly @@ -99,34 +99,40 @@ impl AHPForR1CS { ] .iter() .max() - .unwrap()) + .copied() + .ok_or(anyhow!("Could not find max_degree")) } /// Get all the strict degree bounds enforced in the AHP. - pub fn get_degree_bounds(info: &CircuitInfo) -> [usize; 4] { + pub fn get_degree_bounds(info: &CircuitInfo) -> Result<[usize; 4]> { let num_variables = info.num_variables; let num_non_zero_a = info.num_non_zero_a; let num_non_zero_b = info.num_non_zero_b; let num_non_zero_c = info.num_non_zero_c; - [ - EvaluationDomain::::compute_size_of_domain(num_variables).unwrap() - 2, - EvaluationDomain::::compute_size_of_domain(num_non_zero_a).unwrap() - 2, - EvaluationDomain::::compute_size_of_domain(num_non_zero_b).unwrap() - 2, - EvaluationDomain::::compute_size_of_domain(num_non_zero_c).unwrap() - 2, - ] + Ok([ + EvaluationDomain::::compute_size_of_domain(num_variables).ok_or(SynthesisError::PolyTooLarge)? - 2, + EvaluationDomain::::compute_size_of_domain(num_non_zero_a).ok_or(SynthesisError::PolyTooLarge)? - 2, + EvaluationDomain::::compute_size_of_domain(num_non_zero_b).ok_or(SynthesisError::PolyTooLarge)? - 2, + EvaluationDomain::::compute_size_of_domain(num_non_zero_c).ok_or(SynthesisError::PolyTooLarge)? - 2, + ]) } pub(crate) fn cmp_non_zero_domains( info: &CircuitInfo, max_candidate: Option>, - ) -> Result, SynthesisError> { - let domain_a = EvaluationDomain::new(info.num_non_zero_a).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; - let domain_b = EvaluationDomain::new(info.num_non_zero_b).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; - let domain_c = EvaluationDomain::new(info.num_non_zero_c).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; - let new_candidate = [domain_a, domain_b, domain_c].into_iter().max_by_key(|d| d.size()).unwrap(); + ) -> Result> { + let domain_a = EvaluationDomain::new(info.num_non_zero_a).ok_or(SynthesisError::PolyTooLarge)?; + let domain_b = EvaluationDomain::new(info.num_non_zero_b).ok_or(SynthesisError::PolyTooLarge)?; + let domain_c = EvaluationDomain::new(info.num_non_zero_c).ok_or(SynthesisError::PolyTooLarge)?; + let new_candidate = [domain_a, domain_b, domain_c] + .into_iter() + .max_by_key(|d| d.size()) + .ok_or(anyhow!("could not find max domain"))?; let mut max_non_zero_domain = Some(new_candidate); - if max_candidate.is_some() && max_candidate.unwrap().size() > new_candidate.size() { - max_non_zero_domain = max_candidate; + if let Some(max_candidate) = max_candidate { + if max_candidate.size() > new_candidate.size() { + max_non_zero_domain = Some(max_candidate); + } } Ok(NonZeroDomains { max_non_zero_domain, domain_a, domain_b, domain_c }) } @@ -167,8 +173,8 @@ impl AHPForR1CS { prover_third_message: &prover::ThirdMessage, prover_fourth_message: &prover::FourthMessage, state: &verifier::State, - ) -> Result>, AHPError> { - assert!(!public_inputs.is_empty()); + ) -> Result>> { + ensure!(!public_inputs.is_empty()); let max_constraint_domain = state.max_constraint_domain; let max_variable_domain = state.max_variable_domain; let max_non_zero_domain = state.max_non_zero_domain; @@ -181,11 +187,12 @@ impl AHPForR1CS { .iter() .map(|p| { let public_input = prover::ConstraintSystem::format_public_input(p); - Self::formatted_public_input_is_admissible(&public_input).map(|_| public_input) + Self::formatted_public_input_is_admissible(&public_input)?; + Ok::<_, AHPError>(public_input) }) - .collect::, _>>(); - assert_eq!(public_inputs.as_ref().unwrap()[0].len(), input_domain.size()); - public_inputs + .collect::, _>>()?; + ensure!(public_inputs[0].len() == input_domain.size()); + Ok(public_inputs) }) .collect::, _>>()?; @@ -361,7 +368,7 @@ impl AHPForR1CS { let g_m = LinearCombination::new(g_m_label.clone(), [(F::one(), g_m_label)]); let g_m_at_gamma = evals.get_lc_eval(&g_m, gamma)?; - let (a_poly, b_poly) = Self::construct_matrix_linear_combinations(evals, id, m, v_rc, challenges, rc); + let (a_poly, b_poly) = Self::construct_matrix_linear_combinations(evals, id, m, v_rc, challenges, rc)?; let g_m_term = Self::construct_g_m_term(gamma, g_m_at_gamma, sum, *selector, a_poly, b_poly); matrix_sumcheck += (delta, &g_m_term); @@ -402,7 +409,7 @@ impl AHPForR1CS { v_rc_at_alpha_beta: F, challenges: QueryPoints, rc_size: F, - ) -> (LinearCombination, LinearCombination) { + ) -> Result<(LinearCombination, LinearCombination)> { let label_a_poly = format!("circuit_{id}_a_poly_{matrix}"); let label_b_poly = format!("circuit_{id}_b_poly_{matrix}"); let QueryPoints { alpha, beta, gamma } = challenges; @@ -412,9 +419,9 @@ impl AHPForR1CS { let a_poly_eval_available = evals.get_lc_eval(&a_poly, gamma).is_ok(); let b_poly = LinearCombination::new(label_b_poly.clone(), [(F::one(), label_b_poly.clone())]); let b_poly_eval_available = evals.get_lc_eval(&b_poly, gamma).is_ok(); - assert_eq!(a_poly_eval_available, b_poly_eval_available); + ensure!(a_poly_eval_available == b_poly_eval_available); if a_poly_eval_available && b_poly_eval_available { - return (a_poly, b_poly); + return Ok((a_poly, b_poly)); }; // When running as the verifier, we need to construct a(X) and b(X) from the indexing polynomials @@ -431,7 +438,7 @@ impl AHPForR1CS { (F::one(), (label_row_col).into()), ]); b *= rc_size; - (a, b) + Ok((a, b)) } } @@ -441,14 +448,14 @@ impl AHPForR1CS { /// when constructing linear combinations via `AHPForR1CS::construct_linear_combinations`. pub trait EvaluationsProvider: core::fmt::Debug { /// Get the evaluation of linear combination `lc` at `point`. - fn get_lc_eval(&self, lc: &LinearCombination, point: F) -> Result; + fn get_lc_eval(&self, lc: &LinearCombination, point: F) -> Result; } /// The `EvaluationsProvider` used by the verifier impl EvaluationsProvider for crate::polycommit::sonic_pc::Evaluations { - fn get_lc_eval(&self, lc: &LinearCombination, point: F) -> Result { + fn get_lc_eval(&self, lc: &LinearCombination, point: F) -> Result { let key = (lc.label.clone(), point); - self.get(&key).copied().ok_or_else(|| AHPError::MissingEval(lc.label.clone())) + self.get(&key).copied().ok_or_else(|| AHPError::MissingEval(lc.label.clone())).map_err(Into::into) } } @@ -458,7 +465,7 @@ where F: PrimeField, T: Borrow> + core::fmt::Debug, { - fn get_lc_eval(&self, lc: &LinearCombination, point: F) -> Result { + fn get_lc_eval(&self, lc: &LinearCombination, point: F) -> Result { let mut eval = F::zero(); for (coeff, term) in lc.iter() { let value = if let LCTerm::PolyLabel(label) = term { @@ -468,7 +475,7 @@ where .borrow() .evaluate(point) } else { - assert!(term.is_one()); + ensure!(term.is_one()); F::one() }; eval += &(*coeff * value) diff --git a/algorithms/src/snark/varuna/ahp/indexer/circuit.rs b/algorithms/src/snark/varuna/ahp/indexer/circuit.rs index 00326103a9..5bb6fae41b 100644 --- a/algorithms/src/snark/varuna/ahp/indexer/circuit.rs +++ b/algorithms/src/snark/varuna/ahp/indexer/circuit.rs @@ -29,6 +29,7 @@ use crate::{ SNARKMode, }, }; +use anyhow::{anyhow, Result}; use blake2::Digest; use hex::FromHex; use snarkvm_fields::PrimeField; @@ -119,29 +120,31 @@ impl Circuit { } /// The maximum degree required to represent polynomials of this index. - pub fn max_degree(&self) -> usize { + pub fn max_degree(&self) -> Result { self.index_info.max_degree::() } /// The size of the constraint domain in this R1CS instance. - pub fn constraint_domain_size(&self) -> usize { - crate::fft::EvaluationDomain::::new(self.index_info.num_constraints).unwrap().size() + pub fn constraint_domain_size(&self) -> Result { + Ok(crate::fft::EvaluationDomain::::new(self.index_info.num_constraints) + .ok_or(anyhow!("Cannot create EvaluationDomain"))? + .size()) } /// The size of the variable domain in this R1CS instance. - pub fn variable_domain_size(&self) -> usize { - crate::fft::EvaluationDomain::::new(self.index_info.num_variables).unwrap().size() + pub fn variable_domain_size(&self) -> Result { + Ok(crate::fft::EvaluationDomain::::new(self.index_info.num_variables) + .ok_or(anyhow!("Cannot create EvaluationDomain"))? + .size()) } - pub fn interpolate_matrix_evals(&self) -> impl Iterator> { - let [a_arith, b_arith, c_arith]: [_; 3] = [("a", &self.a_arith), ("b", &self.b_arith), ("c", &self.c_arith)] + pub fn interpolate_matrix_evals(&self) -> Result>> { + Ok([("a", &self.a_arith), ("b", &self.b_arith), ("c", &self.c_arith)] .into_iter() .map(|(label, evals)| MatrixArithmetization::new(&self.id, label, evals)) - .collect::, _>>() - .unwrap() - .try_into() - .unwrap(); - a_arith.into_iter().chain(b_arith.into_iter()).chain(c_arith.into_iter()) + .collect::, _>>()? + .into_iter() + .flat_map(|arith| arith.into_iter())) } /// After indexing, we drop these evaluations to save space in the ProvingKey. diff --git a/algorithms/src/snark/varuna/ahp/indexer/circuit_info.rs b/algorithms/src/snark/varuna/ahp/indexer/circuit_info.rs index 1e17028fd3..5db3583414 100644 --- a/algorithms/src/snark/varuna/ahp/indexer/circuit_info.rs +++ b/algorithms/src/snark/varuna/ahp/indexer/circuit_info.rs @@ -13,6 +13,7 @@ // limitations under the License. use crate::snark::varuna::{ahp::AHPForR1CS, SNARKMode}; +use anyhow::Result; use snarkvm_fields::PrimeField; use snarkvm_utilities::{serialize::*, ToBytes}; @@ -37,9 +38,9 @@ pub struct CircuitInfo { impl CircuitInfo { /// The maximum degree of polynomial required to represent this index in the AHP. - pub fn max_degree(&self) -> usize { + pub fn max_degree(&self) -> Result { let max_non_zero = self.num_non_zero_a.max(self.num_non_zero_b).max(self.num_non_zero_c); - AHPForR1CS::::max_degree(self.num_constraints, self.num_variables, max_non_zero).unwrap() + AHPForR1CS::::max_degree(self.num_constraints, self.num_variables, max_non_zero) } } diff --git a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs index c38e4a9970..f9a33d5f66 100644 --- a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs +++ b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs @@ -27,6 +27,7 @@ use crate::{ SNARKMode, }, }; +use itertools::Itertools; use snarkvm_fields::PrimeField; use snarkvm_utilities::cfg_into_iter; @@ -119,7 +120,7 @@ impl AHPForR1CS { /// Generate the indexed circuit evaluations for this constraint system. /// Used by both the Prover and Verifier - pub(crate) fn index_helper>(c: &C) -> Result, AHPError> { + pub(crate) fn index_helper>(c: &C) -> Result> { let index_time = start_timer!(|| "AHP::Index"); let constraint_time = start_timer!(|| "Generating constraints"); @@ -134,7 +135,7 @@ impl AHPForR1CS { crate::snark::varuna::ahp::matrices::add_randomizing_variables::<_, _>(&mut ics, random_assignments) }); - crate::snark::varuna::ahp::matrices::pad_input_for_indexer_and_prover(&mut ics); + crate::snark::varuna::ahp::matrices::pad_input_for_indexer_and_prover(&mut ics)?; let a = ics.a_matrix()?; let b = ics.b_matrix()?; @@ -171,18 +172,13 @@ impl AHPForR1CS { num_non_zero_c, }; - let constraint_domain = - EvaluationDomain::new(num_constraints).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; - let variable_domain = EvaluationDomain::new(num_variables).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; - let input_domain = - EvaluationDomain::new(num_padded_public_variables).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; + let constraint_domain = EvaluationDomain::new(num_constraints).ok_or(SynthesisError::PolyTooLarge)?; + let variable_domain = EvaluationDomain::new(num_variables).ok_or(SynthesisError::PolyTooLarge)?; + let input_domain = EvaluationDomain::new(num_padded_public_variables).ok_or(SynthesisError::PolyTooLarge)?; - let non_zero_a_domain = - EvaluationDomain::new(num_non_zero_a).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; - let non_zero_b_domain = - EvaluationDomain::new(num_non_zero_b).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; - let non_zero_c_domain = - EvaluationDomain::new(num_non_zero_c).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; + let non_zero_a_domain = EvaluationDomain::new(num_non_zero_a).ok_or(SynthesisError::PolyTooLarge)?; + let non_zero_b_domain = EvaluationDomain::new(num_non_zero_b).ok_or(SynthesisError::PolyTooLarge)?; + let non_zero_c_domain = EvaluationDomain::new(num_non_zero_c).ok_or(SynthesisError::PolyTooLarge)?; let constraint_domain_elements = constraint_domain.elements().collect::>(); let variable_domain_elements = variable_domain.elements().collect::>(); @@ -203,7 +199,7 @@ impl AHPForR1CS { .try_into() .unwrap(); - let id = Circuit::::hash(&index_info, &a, &b, &c).unwrap(); + let id = Circuit::::hash(&index_info, &a, &b, &c)?; let result = Ok(IndexerState { constraint_domain, @@ -233,16 +229,18 @@ impl AHPForR1CS { id: &CircuitId, point: F, ) -> Result, AHPError> { + let labels = [["a"], ["b"], ["c"]]; let mut evals = [ (state.a_arith, state.non_zero_a_domain), (state.b_arith, state.non_zero_b_domain), (state.c_arith, state.non_zero_c_domain), ] .into_iter() - .flat_map(move |(evals, domain)| { - let labels = Self::index_polynomial_labels(&["a", "b", "c"], std::iter::once(id)); + .zip_eq(&labels) + .flat_map(|((evals, domain), label)| { + let labels = Self::index_polynomial_labels(label, std::iter::once(id)); let lagrange_coefficients_at_point = domain.evaluate_all_lagrange_coefficients(point); - labels.zip(evals.evaluate(&lagrange_coefficients_at_point).unwrap()) + labels.zip_eq(evals.evaluate(&lagrange_coefficients_at_point).unwrap()) }) .collect::>(); evals.sort_by(|(l1, _), (l2, _)| l1.cmp(l2)); diff --git a/algorithms/src/snark/varuna/ahp/matrices.rs b/algorithms/src/snark/varuna/ahp/matrices.rs index 9374eee05d..cc7f2c8748 100644 --- a/algorithms/src/snark/varuna/ahp/matrices.rs +++ b/algorithms/src/snark/varuna/ahp/matrices.rs @@ -23,11 +23,11 @@ use crate::{ VarunaHidingMode, }, }; +use itertools::Itertools; use snarkvm_fields::{Field, PrimeField}; use snarkvm_utilities::{cfg_iter, cfg_iter_mut, serialize::*}; -use anyhow::{ensure, Result}; -use itertools::Itertools; +use anyhow::{anyhow, ensure, Result}; use std::collections::BTreeMap; #[cfg(not(feature = "serial"))] @@ -60,7 +60,7 @@ pub(crate) fn to_matrix_helper( pub(crate) fn add_randomizing_variables>( cs: &mut CS, rand_assignments: Option<[F; 3]>, -) { +) -> Result<()> { let mut assignments = [F::one(); 3]; if let Some(r) = rand_assignments { assignments = r; @@ -69,25 +69,27 @@ pub(crate) fn add_randomizing_variables>( let zk_vars = assignments .into_iter() .enumerate() - .map(|(i, assignment)| cs.alloc(|| format!("random_{i}"), || Ok(assignment)).unwrap()) - .collect_vec(); + .map(|(i, assignment)| cs.alloc(|| format!("random_{i}"), || Ok(assignment))) + .collect::, _>>()?; cs.enforce(|| "constraint zk", |lc| lc + zk_vars[0], |lc| lc + zk_vars[1], |lc| lc + zk_vars[2]); + Ok(()) } /// Pads the public variables up to the closest power of two. -pub(crate) fn pad_input_for_indexer_and_prover>(cs: &mut CS) { +pub(crate) fn pad_input_for_indexer_and_prover>(cs: &mut CS) -> Result<()> { let num_public_variables = cs.num_public_variables(); - let power_of_two = EvaluationDomain::::new(num_public_variables); - assert!(power_of_two.is_some()); + let power_of_two = + EvaluationDomain::::new(num_public_variables).ok_or(anyhow!("Could not create EvaluationDomain"))?; // Allocated `zero` variables to pad the public input up to the next power of two. - let padded_size = power_of_two.unwrap().size(); + let padded_size = power_of_two.size(); if padded_size > num_public_variables { for i in 0..(padded_size - num_public_variables) { - cs.alloc_input(|| format!("pad_input_{i}"), || Ok(F::zero())).unwrap(); + cs.alloc_input(|| format!("pad_input_{i}"), || Ok(F::zero()))?; } } + Ok(()) } #[derive(Clone, Debug, CanonicalSerialize, CanonicalDeserialize, PartialEq, Eq)] @@ -105,11 +107,14 @@ pub struct MatrixEvals { impl MatrixEvals { pub(crate) fn evaluate(&self, lagrange_coefficients_at_point: &[F]) -> Result<[F; 4]> { - ensure!(self.row_col.is_some(), "row_col evaluations are not available"); Ok([ self.row.evaluate_with_coeffs(lagrange_coefficients_at_point), self.col.evaluate_with_coeffs(lagrange_coefficients_at_point), - self.row_col.as_ref().unwrap().evaluate_with_coeffs(lagrange_coefficients_at_point), + self.row_col + .as_ref() + .ok_or("row_col evaluations are not available") + .map_err(anyhow::Error::msg)? + .evaluate_with_coeffs(lagrange_coefficients_at_point), self.row_col_val.evaluate_with_coeffs(lagrange_coefficients_at_point), ]) } diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/mod.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/mod.rs index 9251aa91fc..a3cc01b438 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/mod.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/mod.rs @@ -94,7 +94,7 @@ impl AHPForR1CS { rand_assignments, ) }); - crate::snark::varuna::ahp::matrices::pad_input_for_indexer_and_prover(&mut pcs); + crate::snark::varuna::ahp::matrices::pad_input_for_indexer_and_prover(&mut pcs)?; end_timer!(padding_time); diff --git a/algorithms/src/snark/varuna/ahp/prover/state.rs b/algorithms/src/snark/varuna/ahp/prover/state.rs index f23b57f301..02a90ea688 100644 --- a/algorithms/src/snark/varuna/ahp/prover/state.rs +++ b/algorithms/src/snark/varuna/ahp/prover/state.rs @@ -20,6 +20,7 @@ use crate::{ r1cs::{SynthesisError, SynthesisResult}, snark::varuna::{AHPError, AHPForR1CS, Circuit, SNARKMode}, }; +use anyhow::anyhow; use snarkvm_fields::PrimeField; /// Circuit Specific State of the Prover @@ -117,22 +118,23 @@ impl<'a, F: PrimeField, SM: SNARKMode> State<'a, F, SM> { .map(|(circuit, variable_assignments)| { let index_info = &circuit.index_info; - let constraint_domain = EvaluationDomain::new(index_info.num_constraints) - .ok_or(SynthesisError::PolynomialDegreeTooLarge)?; + let constraint_domain = + EvaluationDomain::new(index_info.num_constraints).ok_or(SynthesisError::PolyTooLarge)?; max_num_constraints = max_num_constraints.max(index_info.num_constraints); let variable_domain = - EvaluationDomain::new(index_info.num_variables).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; + EvaluationDomain::new(index_info.num_variables).ok_or(SynthesisError::PolyTooLarge)?; max_num_variables = max_num_variables.max(index_info.num_variables); let non_zero_domains = AHPForR1CS::<_, SM>::cmp_non_zero_domains(index_info, max_non_zero_domain)?; max_non_zero_domain = non_zero_domains.max_non_zero_domain; let first_padded_public_inputs = &variable_assignments[0].0; - let input_domain = EvaluationDomain::new(first_padded_public_inputs.len()).unwrap(); + let input_domain = EvaluationDomain::new(first_padded_public_inputs.len()) + .ok_or(anyhow!("Cannot create EvaluationDomain"))?; let batch_size = variable_assignments.len(); total_instances = - total_instances.checked_add(batch_size).ok_or_else(|| anyhow::anyhow!("Batch size too large"))?; + total_instances.checked_add(batch_size).ok_or_else(|| anyhow!("Batch size too large"))?; let mut z_as = Vec::with_capacity(batch_size); let mut z_bs = Vec::with_capacity(batch_size); let mut z_cs = Vec::with_capacity(batch_size); @@ -174,10 +176,8 @@ impl<'a, F: PrimeField, SM: SNARKMode> State<'a, F, SM> { .collect::>>()?; let max_non_zero_domain = max_non_zero_domain.ok_or(AHPError::BatchSizeIsZero)?; - let max_constraint_domain = - EvaluationDomain::new(max_num_constraints).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; - let max_variable_domain = - EvaluationDomain::new(max_num_variables).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; + let max_constraint_domain = EvaluationDomain::new(max_num_constraints).ok_or(SynthesisError::PolyTooLarge)?; + let max_variable_domain = EvaluationDomain::new(max_num_variables).ok_or(SynthesisError::PolyTooLarge)?; Ok(Self { max_constraint_domain, diff --git a/algorithms/src/snark/varuna/ahp/selectors.rs b/algorithms/src/snark/varuna/ahp/selectors.rs index a80de2e0e4..c6fd2f9829 100644 --- a/algorithms/src/snark/varuna/ahp/selectors.rs +++ b/algorithms/src/snark/varuna/ahp/selectors.rs @@ -13,7 +13,7 @@ // limitations under the License. use crate::fft::{DensePolynomial, EvaluationDomain}; -use anyhow::Result; +use anyhow::{anyhow, ensure, Result}; use snarkvm_fields::{batch_inversion, PrimeField}; use snarkvm_utilities::{cfg_into_iter, cfg_iter_mut, serialize::*}; @@ -90,7 +90,7 @@ pub(crate) fn apply_randomized_selector( let selector_time = start_timer!(|| "Compute selector without remainder witness"); let (mut h_i, remainder) = poly.divide_by_vanishing_poly(*src_domain).ok_or(anyhow::anyhow!("could not divide by vanishing poly"))?; - assert!(remainder.is_zero()); + ensure!(remainder.is_zero()); let multiplier = combiner * src_domain.size_as_field_element * target_domain.size_inv; cfg_iter_mut!(h_i.coeffs).for_each(|c| *c *= multiplier); end_timer!(selector_time); @@ -107,10 +107,12 @@ pub(crate) fn apply_randomized_selector( let selector_time = start_timer!(|| "Compute selector with remainder witness"); let multiplier = combiner * src_domain.size_as_field_element * target_domain.size_inv; cfg_iter_mut!(poly.coeffs).for_each(|c| *c *= multiplier); - let (h_i, mut xg_i) = poly.divide_by_vanishing_poly(*src_domain).unwrap(); + let (h_i, mut xg_i) = + poly.divide_by_vanishing_poly(*src_domain).ok_or(anyhow!("Could not divide by vanishing poly"))?; xg_i = xg_i.mul_by_vanishing_poly(*target_domain); - let (xg_i, remainder) = xg_i.divide_by_vanishing_poly(*src_domain).unwrap(); - assert!(remainder.is_zero()); + let (xg_i, remainder) = + xg_i.divide_by_vanishing_poly(*src_domain).ok_or(anyhow!("Could not divide by vanishing poly"))?; + ensure!(remainder.is_zero()); end_timer!(selector_time); Ok((h_i, Some(xg_i))) } diff --git a/algorithms/src/snark/varuna/ahp/verifier/verifier.rs b/algorithms/src/snark/varuna/ahp/verifier/verifier.rs index 92daabfc0d..0ec22a32ef 100644 --- a/algorithms/src/snark/varuna/ahp/verifier/verifier.rs +++ b/algorithms/src/snark/varuna/ahp/verifier/verifier.rs @@ -28,6 +28,7 @@ use crate::{ }, AlgebraicSponge, }; +use anyhow::{ensure, Result}; use smallvec::SmallVec; use snarkvm_fields::PrimeField; use std::collections::BTreeMap; @@ -41,7 +42,7 @@ impl AHPForR1CS { max_variable_domain: EvaluationDomain, max_non_zero_domain: EvaluationDomain, fs_rng: &mut R, - ) -> Result<(FirstMessage, State), AHPError> { + ) -> Result<(FirstMessage, State)> { let mut batch_combiners = BTreeMap::new(); let mut circuit_specific_states = BTreeMap::new(); let mut num_circuit_combiners = vec![1; batch_sizes.len()]; @@ -55,7 +56,7 @@ impl AHPForR1CS { end_timer!(squeeze_time); let (instance_combiners, circuit_combiner) = elems.split_at(*batch_size - 1); - assert_eq!(circuit_combiner.len(), num_c_combiner); + ensure!(circuit_combiner.len() == num_c_combiner); let mut combiners = BatchCombiners { circuit_combiner: TargetField::one(), instance_combiners: vec![TargetField::one()] }; if num_c_combiner == 1 { @@ -66,32 +67,27 @@ impl AHPForR1CS { let constraint_domain_time = start_timer!(|| format!("Constructing constraint domain for {circuit_id}")); let constraint_domain = - EvaluationDomain::new(circuit_info.num_constraints).ok_or(AHPError::PolynomialDegreeTooLarge)?; + EvaluationDomain::new(circuit_info.num_constraints).ok_or(AHPError::PolyTooLarge)?; end_timer!(constraint_domain_time); let variable_domain_time = start_timer!(|| format!("Constructing constraint domain for {circuit_id}")); - let variable_domain = - EvaluationDomain::new(circuit_info.num_variables).ok_or(AHPError::PolynomialDegreeTooLarge)?; + let variable_domain = EvaluationDomain::new(circuit_info.num_variables).ok_or(AHPError::PolyTooLarge)?; end_timer!(variable_domain_time); let non_zero_a_time = start_timer!(|| format!("Constructing non-zero-a domain for {circuit_id}")); - let non_zero_a_domain = - EvaluationDomain::new(circuit_info.num_non_zero_a).ok_or(AHPError::PolynomialDegreeTooLarge)?; + let non_zero_a_domain = EvaluationDomain::new(circuit_info.num_non_zero_a).ok_or(AHPError::PolyTooLarge)?; end_timer!(non_zero_a_time); let non_zero_b_time = start_timer!(|| format!("Constructing non-zero-b domain {circuit_id}")); - let non_zero_b_domain = - EvaluationDomain::new(circuit_info.num_non_zero_b).ok_or(AHPError::PolynomialDegreeTooLarge)?; + let non_zero_b_domain = EvaluationDomain::new(circuit_info.num_non_zero_b).ok_or(AHPError::PolyTooLarge)?; end_timer!(non_zero_b_time); let non_zero_c_time = start_timer!(|| format!("Constructing non-zero-c domain for {circuit_id}")); - let non_zero_c_domain = - EvaluationDomain::new(circuit_info.num_non_zero_c).ok_or(AHPError::PolynomialDegreeTooLarge)?; + let non_zero_c_domain = EvaluationDomain::new(circuit_info.num_non_zero_c).ok_or(AHPError::PolyTooLarge)?; end_timer!(non_zero_c_time); let input_domain_time = start_timer!(|| format!("Constructing input domain {circuit_id}")); - let input_domain = - EvaluationDomain::new(circuit_info.num_public_inputs).ok_or(AHPError::PolynomialDegreeTooLarge)?; + let input_domain = EvaluationDomain::new(circuit_info.num_public_inputs).ok_or(AHPError::PolyTooLarge)?; end_timer!(input_domain_time); let circuit_specific_state = CircuitSpecificState { @@ -130,13 +126,13 @@ impl AHPForR1CS { pub fn verifier_second_round>( mut state: State, fs_rng: &mut R, - ) -> Result<(SecondMessage, State), AHPError> { + ) -> Result<(SecondMessage, State)> { let elems = fs_rng.squeeze_nonnative_field_elements(3); let (first, _) = elems.split_at(3); - let [alpha, eta_b, eta_c]: [_; 3] = first.try_into().unwrap(); + let [alpha, eta_b, eta_c]: [_; 3] = first.try_into().map_err(anyhow::Error::msg)?; let check_vanish_poly_time = start_timer!(|| "Evaluating vanishing polynomial"); - assert!(!state.max_constraint_domain.evaluate_vanishing_polynomial(alpha).is_zero()); + ensure!(!state.max_constraint_domain.evaluate_vanishing_polynomial(alpha).is_zero()); end_timer!(check_vanish_poly_time); let message = SecondMessage { alpha, eta_b, eta_c }; @@ -149,10 +145,10 @@ impl AHPForR1CS { pub fn verifier_third_round>( mut state: State, fs_rng: &mut R, - ) -> Result<(ThirdMessage, State), AHPError> { + ) -> Result<(ThirdMessage, State)> { let elems = fs_rng.squeeze_nonnative_field_elements(1); let beta = elems[0]; - assert!(!state.max_variable_domain.evaluate_vanishing_polynomial(beta).is_zero()); + ensure!(!state.max_variable_domain.evaluate_vanishing_polynomial(beta).is_zero()); let message = ThirdMessage { beta }; state.third_round_message = Some(message); @@ -164,7 +160,7 @@ impl AHPForR1CS { pub fn verifier_fourth_round>( mut state: State, fs_rng: &mut R, - ) -> Result<(FourthMessage, State), AHPError> { + ) -> Result<(FourthMessage, State)> { let num_circuits = state.circuit_specific_states.len(); let mut delta_a = Vec::with_capacity(num_circuits); let mut delta_b = Vec::with_capacity(num_circuits); @@ -189,10 +185,10 @@ impl AHPForR1CS { pub fn verifier_fifth_round>( mut state: State, fs_rng: &mut R, - ) -> Result, AHPError> { + ) -> Result> { let elems = fs_rng.squeeze_nonnative_field_elements(1); let gamma = elems[0]; - assert!(!state.max_non_zero_domain.evaluate_vanishing_polynomial(gamma).is_zero()); + ensure!(!state.max_non_zero_domain.evaluate_vanishing_polynomial(gamma).is_zero()); state.gamma = Some(gamma); Ok(state) diff --git a/algorithms/src/snark/varuna/varuna.rs b/algorithms/src/snark/varuna/varuna.rs index ac07edcee3..b7844bce91 100644 --- a/algorithms/src/snark/varuna/varuna.rs +++ b/algorithms/src/snark/varuna/varuna.rs @@ -46,7 +46,7 @@ use snarkvm_curves::PairingEngine; use snarkvm_fields::{One, PrimeField, ToConstraintField, Zero}; use snarkvm_utilities::{to_bytes_le, ToBytes}; -use anyhow::{anyhow, Result}; +use anyhow::{anyhow, bail, ensure, Result}; use core::marker::PhantomData; use itertools::Itertools; use rand::{CryptoRng, Rng}; @@ -82,17 +82,17 @@ impl, SM: SNARKMode> VarunaSNARK let mut indexed_circuit = AHPForR1CS::<_, SM>::index(*circuit)?; // TODO: Add check that c is in the correct mode. // Ensure the universal SRS supports the circuit size. - universal_srs - .download_powers_for(0..indexed_circuit.max_degree()) - .map_err(|e| anyhow!("Failed to download powers for degree {}: {e}", indexed_circuit.max_degree()))?; - let coefficient_support = AHPForR1CS::::get_degree_bounds(&indexed_circuit.index_info); + universal_srs.download_powers_for(0..indexed_circuit.max_degree()?).map_err(|e| { + anyhow!("Failed to download powers for degree {}: {e}", indexed_circuit.max_degree().unwrap()) + })?; + let coefficient_support = AHPForR1CS::::get_degree_bounds(&indexed_circuit.index_info)?; // Varuna only needs degree 2 random polynomials. let supported_hiding_bound = 1; let supported_lagrange_sizes = [].into_iter(); // TODO: consider removing lagrange_bases_at_beta_g from CommitterKey let (committer_key, _) = SonicKZG10::::trim( universal_srs, - indexed_circuit.max_degree(), + indexed_circuit.max_degree()?, supported_lagrange_sizes, supported_hiding_bound, Some(coefficient_support.as_slice()), @@ -106,11 +106,11 @@ impl, SM: SNARKMode> VarunaSNARK let (mut circuit_commitments, commitment_randomnesses): (_, _) = SonicKZG10::::commit( universal_prover, &ck, - indexed_circuit.interpolate_matrix_evals().map(Into::into), + indexed_circuit.interpolate_matrix_evals()?.map(Into::into), setup_rng, )?; let empty_randomness = Randomness::::empty(); - assert!(commitment_randomnesses.iter().all(|r| r == &empty_randomness)); + ensure!(commitment_randomnesses.iter().all(|r| r == &empty_randomness)); end_timer!(commit_time); circuit_commitments.sort_by(|c1, c2| c1.label().cmp(c2.label())); @@ -141,7 +141,7 @@ impl, SM: SNARKMode> VarunaSNARK let mut sponge = FS::new_with_parameters(fs_parameters); sponge.absorb_bytes(Self::PROTOCOL_NAME); for (batch_size, inputs) in inputs_and_batch_sizes.values() { - sponge.absorb_bytes(&(u64::try_from(*batch_size).unwrap()).to_le_bytes()); + sponge.absorb_bytes(&(*batch_size as u64).to_le_bytes()); for input in inputs.iter() { sponge.absorb_nonnative_field_elements(input.iter().copied()); } @@ -157,7 +157,7 @@ impl, SM: SNARKMode> VarunaSNARK verifying_key: &CircuitVerifyingKey, ) -> Result { let mut sponge = FS::new_with_parameters(fs_parameters); - sponge.absorb_bytes(&to_bytes_le![&Self::PROTOCOL_NAME].unwrap()); + sponge.absorb_bytes(&to_bytes_le![&Self::PROTOCOL_NAME]?); sponge.absorb_bytes(&verifying_key.circuit_info.to_bytes_le()?); sponge.absorb_native_field_elements(&verifying_key.circuit_commitments); sponge.absorb_bytes(&verifying_key.id.0); @@ -214,7 +214,7 @@ where type VerifierInput = [E::Fr]; type VerifyingKey = CircuitVerifyingKey; - fn universal_setup(max_degree: usize) -> Result { + fn universal_setup(max_degree: usize) -> Result { let setup_time = start_timer!(|| { format!("Varuna::UniversalSetup with max_degree {max_degree}",) }); let srs = SonicKZG10::::load_srs(max_degree).map_err(Into::into); end_timer!(setup_time); @@ -228,7 +228,7 @@ where circuit: &C, ) -> Result<(Self::ProvingKey, Self::VerifyingKey)> { let mut circuit_keys = Self::batch_circuit_setup::(universal_srs, &[circuit])?; - assert_eq!(circuit_keys.len(), 1); + ensure!(circuit_keys.len() == 1); Ok(circuit_keys.pop().unwrap()) } @@ -238,14 +238,14 @@ where fs_parameters: &Self::FSParameters, verifying_key: &Self::VerifyingKey, proving_key: &Self::ProvingKey, - ) -> Result { + ) -> Result { // Initialize sponge let mut sponge = Self::init_sponge_for_certificate(fs_parameters, verifying_key)?; // Compute challenges for linear combination, and the point to evaluate the polynomials at. // The linear combination requires `num_polynomials - 1` coefficients // (since the first coeff is 1), and so we squeeze out `num_polynomials` points. let mut challenges = sponge.squeeze_nonnative_field_elements(verifying_key.circuit_commitments.len()); - let point = challenges.pop().unwrap(); + let point = challenges.pop().ok_or(anyhow!("Failed to squeeze random element"))?; let one = E::Fr::one(); let linear_combination_challenges = core::iter::once(&one).chain(challenges.iter()); @@ -266,7 +266,7 @@ where universal_prover, &committer_key, &[lc], - proving_key.circuit.interpolate_matrix_evals(), + proving_key.circuit.interpolate_matrix_evals()?, &empty_randomness, &query_set, &mut sponge, @@ -283,15 +283,15 @@ where circuit: &C, verifying_key: &Self::VerifyingKey, certificate: &Self::Certificate, - ) -> Result { + ) -> Result { // Ensure the VerifyingKey encodes the expected circuit. let circuit_id = &verifying_key.id; let state = AHPForR1CS::::index_helper(circuit)?; if state.index_info != verifying_key.circuit_info { - return Err(SNARKError::CircuitNotFound); + bail!(SNARKError::CircuitNotFound); } if state.id != *circuit_id { - return Err(SNARKError::CircuitNotFound); + bail!(SNARKError::CircuitNotFound); } // Initialize sponge. @@ -301,7 +301,7 @@ where // The linear combination requires `num_polynomials - 1` coefficients // (since the first coeff is 1), and so we squeeze out `num_polynomials` points. let mut challenges = sponge.squeeze_nonnative_field_elements(verifying_key.circuit_commitments.len()); - let point = challenges.pop().unwrap(); + let point = challenges.pop().ok_or(anyhow!("Failed to squeeze random element"))?; let one = E::Fr::one(); let linear_combination_challenges = core::iter::once(&one).chain(challenges.iter()); @@ -344,10 +344,10 @@ where fs_parameters: &Self::FSParameters, keys_to_constraints: &BTreeMap<&CircuitProvingKey, &[C]>, zk_rng: &mut R, - ) -> Result { + ) -> Result { let prover_time = start_timer!(|| "Varuna::Prover"); if keys_to_constraints.is_empty() { - return Err(SNARKError::EmptyBatch); + bail!(SNARKError::EmptyBatch); } let mut circuits_to_constraints = BTreeMap::new(); @@ -378,7 +378,7 @@ where circuit_ids.push(circuit_id); } - assert_eq!(prover_state.total_instances, total_instances); + ensure!(prover_state.total_instances == total_instances); let committer_key = CommitterUnionKey::union(keys_to_constraints.keys().map(|pk| pk.committer_key.deref())); @@ -522,7 +522,7 @@ where .chain(fourth_oracles.into_iter()) .chain(fifth_oracles.into_iter()) .collect(); - assert!( + ensure!( polynomials.len() == num_unique_circuits * 6 + // numerator and denominator for each matrix sumcheck AHPForR1CS::::num_first_round_oracles(total_instances) + @@ -570,9 +570,9 @@ where let empty_randomness = Randomness::::empty(); if SM::ZK { - assert!(commitment_randomnesses.iter().any(|r| r != &empty_randomness)); + ensure!(commitment_randomnesses.iter().any(|r| r != &empty_randomness)); } else { - assert!(commitment_randomnesses.iter().all(|r| r == &empty_randomness)); + ensure!(commitment_randomnesses.iter().all(|r| r == &empty_randomness)); } // Compute the AHP verifier's query set. @@ -619,7 +619,7 @@ where pc_proof, )?; proof.check_batch_sizes()?; - assert_eq!(proof.pc_proof.is_hiding(), SM::ZK); + ensure!(proof.pc_proof.is_hiding() == SM::ZK); end_timer!(prover_time); Ok(proof) @@ -633,9 +633,9 @@ where fs_parameters: &Self::FSParameters, keys_to_inputs: &BTreeMap<&Self::VerifyingKey, &[B]>, proof: &Self::Proof, - ) -> Result { + ) -> Result { if keys_to_inputs.is_empty() { - return Err(SNARKError::EmptyBatch); + bail!(SNARKError::EmptyBatch); } proof.check_batch_sizes()?; @@ -645,11 +645,11 @@ where batch_sizes.insert(vk.id, batch_sizes_vec[i]); if public_inputs_i.is_empty() { - return Err(SNARKError::EmptyBatch); + bail!(SNARKError::EmptyBatch); } if public_inputs_i.len() != batch_sizes_vec[i] { - return Err(SNARKError::BatchSizeMismatch); + bail!(SNARKError::BatchSizeMismatch); } } @@ -670,17 +670,22 @@ where let non_zero_domains = AHPForR1CS::<_, SM>::cmp_non_zero_domains(&vk.circuit_info, max_non_zero_domain)?; max_non_zero_domain = non_zero_domains.max_non_zero_domain; - let input_domain = EvaluationDomain::::new(vk.circuit_info.num_public_inputs).unwrap(); + let input_domain = EvaluationDomain::::new(vk.circuit_info.num_public_inputs) + .ok_or(anyhow!("Failed to create EvaluationDomain from num_public_inputs"))?; input_domains.insert(vk.id, input_domain); + let input_fields = public_inputs_i + .iter() + .map(|input| input.borrow().to_field_elements()) + .collect::, _>>()?; + let (padded_public_inputs_i, parsed_public_inputs_i): (Vec<_>, Vec<_>) = { - public_inputs_i + input_fields .iter() .map(|input| { - let input = input.borrow().to_field_elements().unwrap(); let mut new_input = Vec::with_capacity((1 + input.len()).max(input_domain.size())); new_input.push(E::Fr::one()); - new_input.extend_from_slice(&input); + new_input.extend_from_slice(input); new_input.resize(input.len().max(input_domain.size()), E::Fr::zero()); if cfg!(debug_assertions) { println!("Number of padded public variables: {}", new_input.len()); @@ -700,10 +705,10 @@ where inputs_and_batch_sizes.insert(vk.id, (batch_size, padded_public_vec[i].as_slice())); } let max_constraint_domain = - EvaluationDomain::::new(max_num_constraints).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; + EvaluationDomain::::new(max_num_constraints).ok_or(SynthesisError::PolyTooLarge)?; let max_variable_domain = - EvaluationDomain::::new(max_num_variables).ok_or(SynthesisError::PolynomialDegreeTooLarge)?; - let max_non_zero_domain = max_non_zero_domain.ok_or(SynthesisError::PolynomialDegreeTooLarge)?; + EvaluationDomain::::new(max_num_variables).ok_or(SynthesisError::PolyTooLarge)?; + let max_non_zero_domain = max_non_zero_domain.ok_or(SynthesisError::PolyTooLarge)?; let comms = &proof.commitments; let proof_has_correct_zk_mode = if SM::ZK { @@ -743,8 +748,8 @@ where if SM::ZK { first_commitments.push(LabeledCommitment::new_with_info( - first_round_info.get("mask_poly").unwrap(), - comms.mask_poly.unwrap(), + first_round_info.get("mask_poly").ok_or(anyhow!("Missing mask_poly"))?, + comms.mask_poly.ok_or(anyhow!("Missing mask_poly"))?, )); } diff --git a/algorithms/src/traits/snark.rs b/algorithms/src/traits/snark.rs index ede71ad08a..a5f48c456b 100644 --- a/algorithms/src/traits/snark.rs +++ b/algorithms/src/traits/snark.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::{errors::SNARKError, r1cs::ConstraintSynthesizer, AlgebraicSponge}; +use crate::{r1cs::ConstraintSynthesizer, AlgebraicSponge}; use snarkvm_fields::PrimeField; use snarkvm_utilities::{CanonicalDeserialize, CanonicalSerialize, FromBytes, ToBytes}; @@ -54,7 +54,7 @@ pub trait SNARK { type FiatShamirRng: AlgebraicSponge; type FSParameters; - fn universal_setup(config: usize) -> Result; + fn universal_setup(config: usize) -> Result; fn circuit_setup>( srs: &Self::UniversalSRS, @@ -66,7 +66,7 @@ pub trait SNARK { fs_parameters: &Self::FSParameters, verifying_key: &Self::VerifyingKey, proving_key: &Self::ProvingKey, - ) -> Result; + ) -> Result; fn prove, R: Rng + CryptoRng>( universal_prover: &Self::UniversalProver, @@ -74,7 +74,7 @@ pub trait SNARK { proving_key: &Self::ProvingKey, constraints: &C, rng: &mut R, - ) -> Result { + ) -> Result { let mut keys_to_constraints = BTreeMap::new(); keys_to_constraints.insert(proving_key, std::slice::from_ref(constraints)); Self::prove_batch(universal_prover, fs_parameters, &keys_to_constraints, rng) @@ -85,7 +85,7 @@ pub trait SNARK { fs_parameters: &Self::FSParameters, keys_to_constraints: &BTreeMap<&Self::ProvingKey, &[C]>, rng: &mut R, - ) -> Result; + ) -> Result; fn verify_vk>( universal_verifier: &Self::UniversalVerifier, @@ -93,7 +93,7 @@ pub trait SNARK { circuit: &C, verifying_key: &Self::VerifyingKey, certificate: &Self::Certificate, - ) -> Result; + ) -> Result; fn verify>( universal_verifier: &Self::UniversalVerifier, @@ -101,7 +101,7 @@ pub trait SNARK { verifying_key: &Self::VerifyingKey, input: B, proof: &Self::Proof, - ) -> Result { + ) -> Result { let mut keys_to_inputs = BTreeMap::new(); let inputs = [input]; keys_to_inputs.insert(verifying_key, &inputs[..]); @@ -113,5 +113,5 @@ pub trait SNARK { fs_parameters: &Self::FSParameters, keys_to_inputs: &BTreeMap<&Self::VerifyingKey, &[B]>, proof: &Self::Proof, - ) -> Result; + ) -> Result; } From 2fc2e730f25f23ab559ecb3f36bb93319c4ce5a7 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:02:56 -0800 Subject: [PATCH 178/339] nits --- algorithms/src/snark/varuna/ahp/indexer/indexer.rs | 2 +- algorithms/src/snark/varuna/ahp/matrices.rs | 2 +- .../src/snark/varuna/ahp/prover/round_functions/fifth.rs | 4 ++-- .../src/snark/varuna/ahp/prover/round_functions/first.rs | 8 ++++---- algorithms/src/snark/varuna/ahp/verifier/messages.rs | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs index f9a33d5f66..e29d023773 100644 --- a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs +++ b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs @@ -27,12 +27,12 @@ use crate::{ SNARKMode, }, }; -use itertools::Itertools; use snarkvm_fields::PrimeField; use snarkvm_utilities::cfg_into_iter; use anyhow::{anyhow, Result}; use core::marker::PhantomData; +use itertools::Itertools; use std::collections::BTreeMap; #[cfg(not(feature = "serial"))] diff --git a/algorithms/src/snark/varuna/ahp/matrices.rs b/algorithms/src/snark/varuna/ahp/matrices.rs index cc7f2c8748..0cd2ccf27d 100644 --- a/algorithms/src/snark/varuna/ahp/matrices.rs +++ b/algorithms/src/snark/varuna/ahp/matrices.rs @@ -23,11 +23,11 @@ use crate::{ VarunaHidingMode, }, }; -use itertools::Itertools; use snarkvm_fields::{Field, PrimeField}; use snarkvm_utilities::{cfg_iter, cfg_iter_mut, serialize::*}; use anyhow::{anyhow, ensure, Result}; +use itertools::Itertools; use std::collections::BTreeMap; #[cfg(not(feature = "serial"))] diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/fifth.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/fifth.rs index 66f949c149..c8e0b71e19 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/fifth.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/fifth.rs @@ -23,11 +23,11 @@ use crate::{ SNARKMode, }, }; +use snarkvm_fields::PrimeField; +use snarkvm_utilities::{cfg_par_bridge, cfg_reduce}; use itertools::Itertools; use rand_core::RngCore; -use snarkvm_fields::PrimeField; -use snarkvm_utilities::{cfg_par_bridge, cfg_reduce}; #[cfg(not(feature = "serial"))] use rayon::prelude::*; diff --git a/algorithms/src/snark/varuna/ahp/prover/round_functions/first.rs b/algorithms/src/snark/varuna/ahp/prover/round_functions/first.rs index 43e243cbc6..df9d33a72c 100644 --- a/algorithms/src/snark/varuna/ahp/prover/round_functions/first.rs +++ b/algorithms/src/snark/varuna/ahp/prover/round_functions/first.rs @@ -12,8 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::collections::BTreeMap; - use crate::{ fft::{DensePolynomial, EvaluationDomain, Evaluations as EvaluationsOnDomain, SparsePolynomial}, polycommit::sonic_pc::{LabeledPolynomial, PolynomialInfo, PolynomialLabel}, @@ -26,11 +24,13 @@ use crate::{ SNARKMode, }, }; -use itertools::Itertools; -use rand_core::RngCore; use snarkvm_fields::PrimeField; use snarkvm_utilities::cfg_into_iter; +use itertools::Itertools; +use rand_core::RngCore; +use std::collections::BTreeMap; + #[cfg(not(feature = "serial"))] use rayon::prelude::*; diff --git a/algorithms/src/snark/varuna/ahp/verifier/messages.rs b/algorithms/src/snark/varuna/ahp/verifier/messages.rs index b6ea8f4146..b939a86c74 100644 --- a/algorithms/src/snark/varuna/ahp/verifier/messages.rs +++ b/algorithms/src/snark/varuna/ahp/verifier/messages.rs @@ -12,9 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +use crate::snark::varuna::{witness_label, CircuitId, SNARKMode}; use snarkvm_fields::PrimeField; -use crate::snark::varuna::{witness_label, CircuitId, SNARKMode}; use itertools::Itertools; use std::collections::BTreeMap; From f0dc8c1d92d67e66266e934a4f90bc1ddd10e145 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:08:40 -0800 Subject: [PATCH 179/339] Adds comments to code changes --- circuit/algorithms/src/bhp/hash_uncompressed.rs | 1 + circuit/algorithms/src/bhp/hasher/hash_uncompressed.rs | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/circuit/algorithms/src/bhp/hash_uncompressed.rs b/circuit/algorithms/src/bhp/hash_uncompressed.rs index 3ff67de6f8..2bcac4d09a 100644 --- a/circuit/algorithms/src/bhp/hash_uncompressed.rs +++ b/circuit/algorithms/src/bhp/hash_uncompressed.rs @@ -62,6 +62,7 @@ impl HashUncompres } // Hash the preimage for this iteration. digest = self.hasher.hash_uncompressed(&preimage); + // Clear the preimage vector for the next iteration. preimage.clear(); } diff --git a/circuit/algorithms/src/bhp/hasher/hash_uncompressed.rs b/circuit/algorithms/src/bhp/hasher/hash_uncompressed.rs index 1120b9848e..4783a24d7b 100644 --- a/circuit/algorithms/src/bhp/hasher/hash_uncompressed.rs +++ b/circuit/algorithms/src/bhp/hasher/hash_uncompressed.rs @@ -37,13 +37,18 @@ impl HashUncompres true => { // Pad the input to a multiple of `BHP_CHUNK_SIZE` for hashing. if input.len() % BHP_CHUNK_SIZE != 0 { + // Compute the number of padding bits. let padding = BHP_CHUNK_SIZE - (input.len() % BHP_CHUNK_SIZE); + // Pad the input with `false` bits. let mut padded_input = Vec::with_capacity(input.len() + padding); padded_input.extend_from_slice(input); padded_input.resize(input.len() + padding, Boolean::constant(false)); + // Ensure the input is a multiple of `BHP_CHUNK_SIZE`. assert_eq!(padded_input.len() % BHP_CHUNK_SIZE, 0, "Input must be a multiple of {BHP_CHUNK_SIZE}"); + // Return the padded input. Cow::Owned(padded_input) } else { + // Return the input as a borrowed slice. Cow::Borrowed(input) } } From 941a0652246ccc2dad25db6efeffdfbd2a27a93c Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:21:12 -0800 Subject: [PATCH 180/339] Clippy --- algorithms/src/snark/varuna/ahp/matrices.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/algorithms/src/snark/varuna/ahp/matrices.rs b/algorithms/src/snark/varuna/ahp/matrices.rs index 0cd2ccf27d..276fb006d7 100644 --- a/algorithms/src/snark/varuna/ahp/matrices.rs +++ b/algorithms/src/snark/varuna/ahp/matrices.rs @@ -27,7 +27,6 @@ use snarkvm_fields::{Field, PrimeField}; use snarkvm_utilities::{cfg_iter, cfg_iter_mut, serialize::*}; use anyhow::{anyhow, ensure, Result}; -use itertools::Itertools; use std::collections::BTreeMap; #[cfg(not(feature = "serial"))] From a1d9b33ce1e0ef67b8c617b884a91f3b74f0ee7d Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:49:44 -0800 Subject: [PATCH 181/339] Fix clippy --- algorithms/src/snark/varuna/ahp/matrices.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/algorithms/src/snark/varuna/ahp/matrices.rs b/algorithms/src/snark/varuna/ahp/matrices.rs index 276fb006d7..2f998f556b 100644 --- a/algorithms/src/snark/varuna/ahp/matrices.rs +++ b/algorithms/src/snark/varuna/ahp/matrices.rs @@ -29,6 +29,8 @@ use snarkvm_utilities::{cfg_iter, cfg_iter_mut, serialize::*}; use anyhow::{anyhow, ensure, Result}; use std::collections::BTreeMap; +#[cfg(feature = "serial")] +use itertools::Itertools; #[cfg(not(feature = "serial"))] use rayon::prelude::*; From c7eff3f13acda3910bcc2ada1d52f2b178e7347d Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 24 Nov 2023 15:04:49 -0800 Subject: [PATCH 182/339] Directly call the last coefficient --- algorithms/src/fft/polynomial/mod.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/algorithms/src/fft/polynomial/mod.rs b/algorithms/src/fft/polynomial/mod.rs index abb794df7f..35dd1760fd 100644 --- a/algorithms/src/fft/polynomial/mod.rs +++ b/algorithms/src/fft/polynomial/mod.rs @@ -67,11 +67,15 @@ impl<'a, F: Field> CanonicalSerialize for Polynomial<'a, F> { impl<'a, F: Field> Valid for Polynomial<'a, F> { fn check(&self) -> Result<(), SerializationError> { - // Fail if the trailing coefficient is zero - if let Some(true) = self.coeffs().last().map(|c| c.1.is_zero()) { - Err(SerializationError::InvalidData) - } else { - Ok(()) + // Check that the polynomial contains a trailing zero coefficient. + let has_trailing_zero = match self { + Sparse(p) => p.coeffs().last().map(|(_, c)| c.is_zero()), + Dense(p) => p.coeffs.last().map(|c| c.is_zero()), + }; + // Fail if the trailing coefficient is zero. + match has_trailing_zero { + Some(true) => Err(SerializationError::InvalidData), + Some(false) | None => Ok(()), } } } From 601060972ca1d4576a53ffa3b0d7a34938abe833 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 24 Nov 2023 15:18:05 -0800 Subject: [PATCH 183/339] Fix compilation, give code some room to breathe --- algorithms/src/snark/varuna/ahp/selectors.rs | 21 +++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/algorithms/src/snark/varuna/ahp/selectors.rs b/algorithms/src/snark/varuna/ahp/selectors.rs index 466873b7a6..b6831e5423 100644 --- a/algorithms/src/snark/varuna/ahp/selectors.rs +++ b/algorithms/src/snark/varuna/ahp/selectors.rs @@ -12,19 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. +use super::verifier::QueryPoints; use crate::fft::{DensePolynomial, EvaluationDomain}; -use anyhow::{anyhow, ensure, Result}; use snarkvm_fields::{batch_inversion, PrimeField}; use snarkvm_utilities::{cfg_into_iter, cfg_iter_mut, serialize::*}; +use anyhow::{ensure, Result}; use itertools::Itertools; use std::collections::{BTreeMap, HashSet}; #[cfg(not(feature = "serial"))] use rayon::prelude::*; -use super::verifier::QueryPoints; - /// Precompute a batch of selectors at challenges. We batch: /// - constraint domain selectors at alpha /// - variable domain selectors at beta @@ -88,11 +87,13 @@ pub(crate) fn apply_randomized_selector( if !remainder_witness { // Substituting in s_i, we get that poly_i * s_i / v_H = poly_i / v_H * (H_i.size() / H.size()); let selector_time = start_timer!(|| "Compute selector without remainder witness"); + let (mut h_i, remainder) = poly.divide_by_vanishing_poly(*src_domain)?; - ensure!(remainder.is_zero(), "Failed to divide by vanishing polynomial - remainder is non-zero ({remainder})"); + ensure!(remainder.is_zero(), "Failed to divide by vanishing polynomial - non-zero remainder ({remainder:?})"); let multiplier = combiner * src_domain.size_as_field_element * target_domain.size_inv; cfg_iter_mut!(h_i.coeffs).for_each(|c| *c *= multiplier); + end_timer!(selector_time); Ok((h_i, None)) } else { @@ -105,14 +106,16 @@ pub(crate) fn apply_randomized_selector( // (\sum_i{c_i*s_i*poly_i})/v_H = h_1*v_H + x_g_1 // That's what we're computing here. let selector_time = start_timer!(|| "Compute selector with remainder witness"); + let multiplier = combiner * src_domain.size_as_field_element * target_domain.size_inv; cfg_iter_mut!(poly.coeffs).for_each(|c| *c *= multiplier); - let (h_i, mut xg_i) = - poly.divide_by_vanishing_poly(*src_domain).ok_or(anyhow!("Could not divide by vanishing poly"))?; + + let (h_i, mut xg_i) = poly.divide_by_vanishing_poly(*src_domain)?; xg_i = xg_i.mul_by_vanishing_poly(*target_domain); - let (xg_i, remainder) = - xg_i.divide_by_vanishing_poly(*src_domain).ok_or(anyhow!("Could not divide by vanishing poly"))?; - ensure!(remainder.is_zero()); + + let (xg_i, remainder) = xg_i.divide_by_vanishing_poly(*src_domain)?; + ensure!(remainder.is_zero(), "Failed to divide by vanishing polynomial - non-zero remainder ({remainder:?})"); + end_timer!(selector_time); Ok((h_i, Some(xg_i))) } From 0ae30149f697dab317f2fd176d5cc1a768f81072 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 24 Nov 2023 15:20:27 -0800 Subject: [PATCH 184/339] nit --- algorithms/src/fft/polynomial/dense.rs | 5 ++--- algorithms/src/fft/polynomial/mod.rs | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/algorithms/src/fft/polynomial/dense.rs b/algorithms/src/fft/polynomial/dense.rs index 3031cb11f7..a37065af21 100644 --- a/algorithms/src/fft/polynomial/dense.rs +++ b/algorithms/src/fft/polynomial/dense.rs @@ -14,11 +14,12 @@ //! A polynomial represented in coefficient form. +use super::PolyMultiplier; use crate::fft::{EvaluationDomain, Evaluations, Polynomial}; -use anyhow::Result; use snarkvm_fields::{Field, PrimeField}; use snarkvm_utilities::{cfg_iter_mut, serialize::*}; +use anyhow::Result; use num_traits::CheckedDiv; use rand::Rng; use std::{ @@ -32,8 +33,6 @@ use itertools::Itertools; #[cfg(not(feature = "serial"))] use rayon::prelude::*; -use super::PolyMultiplier; - /// Stores a polynomial in coefficient form. #[derive(Clone, PartialEq, Eq, Hash, Default, CanonicalSerialize, CanonicalDeserialize)] #[must_use] diff --git a/algorithms/src/fft/polynomial/mod.rs b/algorithms/src/fft/polynomial/mod.rs index 81065d076d..8fcb907408 100644 --- a/algorithms/src/fft/polynomial/mod.rs +++ b/algorithms/src/fft/polynomial/mod.rs @@ -15,14 +15,13 @@ //! Work with sparse and dense polynomials. use crate::fft::{EvaluationDomain, Evaluations}; -use anyhow::{ensure, Result}; use snarkvm_fields::{Field, PrimeField}; use snarkvm_utilities::{cfg_iter_mut, serialize::*, SerializationError}; +use Polynomial::*; +use anyhow::{ensure, Result}; use std::{borrow::Cow, convert::TryInto}; -use Polynomial::*; - #[cfg(not(feature = "serial"))] use rayon::prelude::*; From 30aa354c40caa3157b73d30e60beba8cbf41474d Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 24 Nov 2023 15:32:09 -0800 Subject: [PATCH 185/339] Fix DensePolynomial::add trimming --- algorithms/src/fft/polynomial/dense.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/algorithms/src/fft/polynomial/dense.rs b/algorithms/src/fft/polynomial/dense.rs index f96885f03d..e1703e09eb 100644 --- a/algorithms/src/fft/polynomial/dense.rs +++ b/algorithms/src/fft/polynomial/dense.rs @@ -194,7 +194,7 @@ impl<'a, 'b, F: Field> Add<&'a DensePolynomial> for &'b DensePolynomial { type Output = DensePolynomial; fn add(self, other: &'a DensePolynomial) -> DensePolynomial { - if self.is_zero() { + let mut result = if self.is_zero() { other.clone() } else if other.is_zero() { self.clone() @@ -202,21 +202,18 @@ impl<'a, 'b, F: Field> Add<&'a DensePolynomial> for &'b DensePolynomial { let mut result = self.clone(); // Zip safety: `result` and `other` could have different lengths. cfg_iter_mut!(result.coeffs).zip(&other.coeffs).for_each(|(a, b)| *a += b); - // If the leading coefficient ends up being zero, pop it off. - while let Some(true) = self.coeffs.last().map(|c| c.is_zero()) { - result.coeffs.pop(); - } result } else { let mut result = other.clone(); // Zip safety: `result` and `other` could have different lengths. cfg_iter_mut!(result.coeffs).zip(&self.coeffs).for_each(|(a, b)| *a += b); - // If the leading coefficient ends up being zero, pop it off. - while let Some(true) = self.coeffs.last().map(|c| c.is_zero()) { - result.coeffs.pop(); - } result + }; + // If the leading coefficient ends up being zero, pop it off. + while let Some(true) = result.coeffs.last().map(|c| c.is_zero()) { + result.coeffs.pop(); } + result } } From de0f58f3467caf68d791e533158a3592b8c13cad Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 24 Nov 2023 15:34:05 -0800 Subject: [PATCH 186/339] Ensures completeness on trimming for the sub case --- algorithms/src/fft/polynomial/dense.rs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/algorithms/src/fft/polynomial/dense.rs b/algorithms/src/fft/polynomial/dense.rs index e1703e09eb..6be19d1f93 100644 --- a/algorithms/src/fft/polynomial/dense.rs +++ b/algorithms/src/fft/polynomial/dense.rs @@ -304,7 +304,7 @@ impl<'a, 'b, F: Field> Sub<&'a DensePolynomial> for &'b DensePolynomial { #[inline] fn sub(self, other: &'a DensePolynomial) -> DensePolynomial { - if self.is_zero() { + let mut result = if self.is_zero() { let mut result = other.clone(); for coeff in &mut result.coeffs { *coeff = -(*coeff); @@ -316,10 +316,6 @@ impl<'a, 'b, F: Field> Sub<&'a DensePolynomial> for &'b DensePolynomial { let mut result = self.clone(); // Zip safety: `result` and `other` could have different degrees. cfg_iter_mut!(result.coeffs).zip(&other.coeffs).for_each(|(a, b)| *a -= b); - // If the leading coefficient ends up being zero, pop it off. - while let Some(true) = result.coeffs.last().map(|c| c.is_zero()) { - result.coeffs.pop(); - } result } else { let mut result = self.clone(); @@ -328,13 +324,13 @@ impl<'a, 'b, F: Field> Sub<&'a DensePolynomial> for &'b DensePolynomial { cfg_iter_mut!(result.coeffs).zip(&other.coeffs).for_each(|(a, b)| { *a -= b; }); - // If the leading coefficient ends up being zero, pop it off. - while let Some(true) = result.coeffs.last().map(|c| c.is_zero()) { - result.coeffs.pop(); - } - result + }; + // If the leading coefficient ends up being zero, pop it off. + while let Some(true) = result.coeffs.last().map(|c| c.is_zero()) { + result.coeffs.pop(); } + result } } From 16e71e88b8efe010df9da18951d28396a5906953 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 24 Nov 2023 16:22:48 -0800 Subject: [PATCH 187/339] chore(snarkvm): bump version for new release --- .cargo/release-version | 2 +- Cargo.lock | 118 ++++++++++---------- Cargo.toml | 22 ++-- algorithms/Cargo.toml | 12 +- algorithms/cuda/Cargo.toml | 2 +- circuit/Cargo.toml | 16 +-- circuit/account/Cargo.toml | 10 +- circuit/algorithms/Cargo.toml | 8 +- circuit/collections/Cargo.toml | 8 +- circuit/environment/Cargo.toml | 14 +-- circuit/environment/witness/Cargo.toml | 2 +- circuit/network/Cargo.toml | 10 +- circuit/program/Cargo.toml | 16 +-- circuit/types/Cargo.toml | 18 +-- circuit/types/address/Cargo.toml | 14 +-- circuit/types/boolean/Cargo.toml | 6 +- circuit/types/field/Cargo.toml | 8 +- circuit/types/group/Cargo.toml | 12 +- circuit/types/integers/Cargo.toml | 12 +- circuit/types/scalar/Cargo.toml | 10 +- circuit/types/string/Cargo.toml | 12 +- console/Cargo.toml | 14 +-- console/account/Cargo.toml | 6 +- console/algorithms/Cargo.toml | 8 +- console/collections/Cargo.toml | 6 +- console/network/Cargo.toml | 20 ++-- console/network/environment/Cargo.toml | 8 +- console/program/Cargo.toml | 14 +-- console/types/Cargo.toml | 18 +-- console/types/address/Cargo.toml | 10 +- console/types/boolean/Cargo.toml | 4 +- console/types/field/Cargo.toml | 6 +- console/types/group/Cargo.toml | 10 +- console/types/integers/Cargo.toml | 10 +- console/types/scalar/Cargo.toml | 8 +- console/types/string/Cargo.toml | 10 +- curves/Cargo.toml | 6 +- fields/Cargo.toml | 4 +- ledger/Cargo.toml | 22 ++-- ledger/authority/Cargo.toml | 6 +- ledger/block/Cargo.toml | 18 +-- ledger/coinbase/Cargo.toml | 14 +-- ledger/committee/Cargo.toml | 4 +- ledger/narwhal/Cargo.toml | 14 +-- ledger/narwhal/batch-certificate/Cargo.toml | 8 +- ledger/narwhal/batch-header/Cargo.toml | 6 +- ledger/narwhal/data/Cargo.toml | 4 +- ledger/narwhal/subdag/Cargo.toml | 10 +- ledger/narwhal/transmission-id/Cargo.toml | 6 +- ledger/narwhal/transmission/Cargo.toml | 10 +- ledger/query/Cargo.toml | 8 +- ledger/store/Cargo.toml | 18 +-- ledger/test-helpers/Cargo.toml | 16 +-- parameters/Cargo.toml | 6 +- synthesizer/Cargo.toml | 24 ++-- synthesizer/process/Cargo.toml | 18 +-- synthesizer/program/Cargo.toml | 6 +- synthesizer/snark/Cargo.toml | 8 +- utilities/Cargo.toml | 4 +- utilities/derives/Cargo.toml | 2 +- wasm/Cargo.toml | 12 +- 61 files changed, 369 insertions(+), 369 deletions(-) diff --git a/.cargo/release-version b/.cargo/release-version index 2e1b588229..b592d65843 100644 --- a/.cargo/release-version +++ b/.cargo/release-version @@ -1 +1 @@ -v0.16.10 \ No newline at end of file +v0.16.11 \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index f8d6c32825..c2400419fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2473,7 +2473,7 @@ dependencies = [ [[package]] name = "snarkvm" -version = "0.16.10" +version = "0.16.11" dependencies = [ "anstyle", "anyhow", @@ -2508,7 +2508,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms" -version = "0.16.10" +version = "0.16.11" dependencies = [ "aleo-std", "anyhow", @@ -2547,7 +2547,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms-cuda" -version = "0.16.10" +version = "0.16.11" dependencies = [ "blst", "cc", @@ -2557,7 +2557,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit" -version = "0.16.10" +version = "0.16.11" dependencies = [ "snarkvm-circuit-account", "snarkvm-circuit-algorithms", @@ -2570,7 +2570,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-account" -version = "0.16.10" +version = "0.16.11" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2582,7 +2582,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-algorithms" -version = "0.16.10" +version = "0.16.11" dependencies = [ "anyhow", "snarkvm-circuit-types", @@ -2594,7 +2594,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-collections" -version = "0.16.10" +version = "0.16.11" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2608,7 +2608,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment" -version = "0.16.10" +version = "0.16.11" dependencies = [ "criterion", "indexmap 2.0.2", @@ -2629,11 +2629,11 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment-witness" -version = "0.16.10" +version = "0.16.11" [[package]] name = "snarkvm-circuit-network" -version = "0.16.10" +version = "0.16.11" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-collections", @@ -2644,7 +2644,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-program" -version = "0.16.10" +version = "0.16.11" dependencies = [ "anyhow", "paste", @@ -2662,7 +2662,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types" -version = "0.16.10" +version = "0.16.11" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-address", @@ -2677,7 +2677,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-address" -version = "0.16.10" +version = "0.16.11" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2689,7 +2689,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-boolean" -version = "0.16.10" +version = "0.16.11" dependencies = [ "criterion", "snarkvm-circuit-environment", @@ -2698,7 +2698,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-field" -version = "0.16.10" +version = "0.16.11" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2707,7 +2707,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-group" -version = "0.16.10" +version = "0.16.11" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2719,7 +2719,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-integers" -version = "0.16.10" +version = "0.16.11" dependencies = [ "paste", "snarkvm-circuit-environment", @@ -2732,7 +2732,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-scalar" -version = "0.16.10" +version = "0.16.11" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2742,7 +2742,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-string" -version = "0.16.10" +version = "0.16.11" dependencies = [ "rand", "snarkvm-circuit-environment", @@ -2755,7 +2755,7 @@ dependencies = [ [[package]] name = "snarkvm-console" -version = "0.16.10" +version = "0.16.11" dependencies = [ "snarkvm-console-account", "snarkvm-console-algorithms", @@ -2767,7 +2767,7 @@ dependencies = [ [[package]] name = "snarkvm-console-account" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "bs58", @@ -2780,7 +2780,7 @@ dependencies = [ [[package]] name = "snarkvm-console-algorithms" -version = "0.16.10" +version = "0.16.11" dependencies = [ "blake2s_simd", "criterion", @@ -2798,7 +2798,7 @@ dependencies = [ [[package]] name = "snarkvm-console-collections" -version = "0.16.10" +version = "0.16.11" dependencies = [ "aleo-std", "criterion", @@ -2811,7 +2811,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network" -version = "0.16.10" +version = "0.16.11" dependencies = [ "anyhow", "indexmap 2.0.2", @@ -2833,7 +2833,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network-environment" -version = "0.16.10" +version = "0.16.11" dependencies = [ "anyhow", "bech32", @@ -2850,7 +2850,7 @@ dependencies = [ [[package]] name = "snarkvm-console-program" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "enum_index", @@ -2871,7 +2871,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types" -version = "0.16.10" +version = "0.16.11" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-address", @@ -2885,7 +2885,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-address" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "serde_json", @@ -2897,7 +2897,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-boolean" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "serde_json", @@ -2906,7 +2906,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-field" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "serde_json", @@ -2917,7 +2917,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-group" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "serde_json", @@ -2929,7 +2929,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-integers" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "serde_json", @@ -2941,7 +2941,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-scalar" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "serde_json", @@ -2953,7 +2953,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-string" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "serde_json", @@ -2965,7 +2965,7 @@ dependencies = [ [[package]] name = "snarkvm-curves" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "criterion", @@ -2980,7 +2980,7 @@ dependencies = [ [[package]] name = "snarkvm-fields" -version = "0.16.10" +version = "0.16.11" dependencies = [ "aleo-std", "anyhow", @@ -2997,7 +2997,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger" -version = "0.16.10" +version = "0.16.11" dependencies = [ "aleo-std", "anyhow", @@ -3024,7 +3024,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-authority" -version = "0.16.10" +version = "0.16.11" dependencies = [ "anyhow", "bincode", @@ -3037,7 +3037,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-block" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3061,7 +3061,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-coinbase" -version = "0.16.10" +version = "0.16.11" dependencies = [ "aleo-std", "anyhow", @@ -3082,7 +3082,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-committee" -version = "0.16.10" +version = "0.16.11" dependencies = [ "anyhow", "bincode", @@ -3102,7 +3102,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal" -version = "0.16.10" +version = "0.16.11" dependencies = [ "snarkvm-ledger-narwhal", "snarkvm-ledger-narwhal-batch-certificate", @@ -3115,7 +3115,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3128,7 +3128,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3141,7 +3141,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-data" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bytes", "serde_json", @@ -3151,7 +3151,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3166,7 +3166,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "bytes", @@ -3179,7 +3179,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "serde_json", @@ -3189,7 +3189,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-query" -version = "0.16.10" +version = "0.16.11" dependencies = [ "async-trait", "reqwest", @@ -3201,7 +3201,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-store" -version = "0.16.10" +version = "0.16.11" dependencies = [ "aleo-std", "anyhow", @@ -3229,7 +3229,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-test-helpers" -version = "0.16.10" +version = "0.16.11" dependencies = [ "once_cell", "snarkvm-circuit", @@ -3243,7 +3243,7 @@ dependencies = [ [[package]] name = "snarkvm-parameters" -version = "0.16.10" +version = "0.16.11" dependencies = [ "aleo-std", "anyhow", @@ -3275,7 +3275,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer" -version = "0.16.10" +version = "0.16.11" dependencies = [ "aleo-std", "anyhow", @@ -3306,7 +3306,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-process" -version = "0.16.10" +version = "0.16.11" dependencies = [ "aleo-std", "bincode", @@ -3332,7 +3332,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-program" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "criterion", @@ -3348,7 +3348,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-snark" -version = "0.16.10" +version = "0.16.11" dependencies = [ "bincode", "colored", @@ -3361,7 +3361,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities" -version = "0.16.10" +version = "0.16.11" dependencies = [ "aleo-std", "anyhow", @@ -3381,7 +3381,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities-derives" -version = "0.16.10" +version = "0.16.11" dependencies = [ "proc-macro2", "quote 1.0.33", @@ -3390,7 +3390,7 @@ dependencies = [ [[package]] name = "snarkvm-wasm" -version = "0.16.10" +version = "0.16.11" dependencies = [ "getrandom", "rand", diff --git a/Cargo.toml b/Cargo.toml index e4690b9d9e..15127fdb61 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "A decentralized virtual machine" homepage = "https://aleo.org" @@ -147,53 +147,53 @@ wasm = [ "snarkvm-wasm" ] [dependencies.snarkvm-algorithms] path = "./algorithms" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-circuit] path = "./circuit" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-console] path = "./console" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-curves] path = "./curves" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-fields] path = "./fields" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-ledger] path = "./ledger" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-parameters] path = "./parameters" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-synthesizer] path = "./synthesizer" -version = "=0.16.10" +version = "=0.16.11" default-features = false optional = true [dependencies.snarkvm-utilities] path = "./utilities" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-wasm] path = "./wasm" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.anstyle] diff --git a/algorithms/Cargo.toml b/algorithms/Cargo.toml index 657a17cd49..c107913faa 100644 --- a/algorithms/Cargo.toml +++ b/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Algorithms for a decentralized virtual machine" homepage = "https://aleo.org" @@ -47,27 +47,27 @@ required-features = [ "test" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.snarkvm-parameters] path = "../parameters" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.snarkvm-algorithms-cuda] path = "./cuda" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.aleo-std] diff --git a/algorithms/cuda/Cargo.toml b/algorithms/cuda/Cargo.toml index 37fde9169d..e3c2daee8e 100644 --- a/algorithms/cuda/Cargo.toml +++ b/algorithms/cuda/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms-cuda" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Cuda optimizations for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/circuit/Cargo.toml b/circuit/Cargo.toml index 21160af3ec..e4c589656a 100644 --- a/circuit/Cargo.toml +++ b/circuit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Circuits for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,28 +25,28 @@ edition = "2021" [dependencies.snarkvm-circuit-account] path = "./account" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-algorithms] path = "./algorithms" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-collections] path = "./collections" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-environment] path = "./environment" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-network] path = "./network" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-program] path = "./program" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types] path = "./types" -version = "=0.16.10" +version = "=0.16.11" diff --git a/circuit/account/Cargo.toml b/circuit/account/Cargo.toml index 6668627051..6adb4acdb5 100644 --- a/circuit/account/Cargo.toml +++ b/circuit/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-account" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Account circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-account" path = "../../console/account" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.10" +version = "=0.16.11" [dev-dependencies.snarkvm-utilities] path = "../../utilities" diff --git a/circuit/algorithms/Cargo.toml b/circuit/algorithms/Cargo.toml index 6dafec842a..97f3a238c7 100644 --- a/circuit/algorithms/Cargo.toml +++ b/circuit/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-algorithms" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Algorithm circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-algorithms" path = "../../console/algorithms" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dev-dependencies.anyhow] diff --git a/circuit/collections/Cargo.toml b/circuit/collections/Cargo.toml index d6793fdb30..59724d0d73 100644 --- a/circuit/collections/Cargo.toml +++ b/circuit/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-collections" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Collections circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-collections" path = "../../console/collections" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.10" +version = "=0.16.11" [dev-dependencies.snarkvm-circuit-network] path = "../network" diff --git a/circuit/environment/Cargo.toml b/circuit/environment/Cargo.toml index 4f5d902197..0079209b17 100644 --- a/circuit/environment/Cargo.toml +++ b/circuit/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Circuit environment for a decentralized virtual machine" license = "Apache-2.0" @@ -14,32 +14,32 @@ harness = false [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.10" +version = "=0.16.11" default-features = false features = [ "r1cs" ] [dependencies.snarkvm-circuit-environment-witness] path = "./witness" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.indexmap] diff --git a/circuit/environment/witness/Cargo.toml b/circuit/environment/witness/Cargo.toml index 40e8958670..a1a41cecba 100644 --- a/circuit/environment/witness/Cargo.toml +++ b/circuit/environment/witness/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment-witness" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "A procedural macro to construct a witness in an environment" license = "Apache-2.0" diff --git a/circuit/network/Cargo.toml b/circuit/network/Cargo.toml index be3981e1ff..76bf979079 100644 --- a/circuit/network/Cargo.toml +++ b/circuit/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-network" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Network circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.10" +version = "=0.16.11" [dev-dependencies.snarkvm-console-types] path = "../../console/types" diff --git a/circuit/program/Cargo.toml b/circuit/program/Cargo.toml index a9b712730f..b90a3aed4e 100644 --- a/circuit/program/Cargo.toml +++ b/circuit/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-program" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Program circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,32 +9,32 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-program" path = "../../console/program" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-circuit-account] path = "../account" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.10" +version = "=0.16.11" [dependencies.paste] version = "1.0" diff --git a/circuit/types/Cargo.toml b/circuit/types/Cargo.toml index 56094da688..0b1aa67541 100644 --- a/circuit/types/Cargo.toml +++ b/circuit/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Primitive circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -8,35 +8,35 @@ edition = "2021" [dependencies.snarkvm-circuit-environment] path = "../environment" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-address] path = "./address" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-boolean] path = "./boolean" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-field] path = "./field" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-group] path = "./group" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-integers] path = "./integers" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-scalar] path = "./scalar" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-string] path = "./string" -version = "=0.16.10" +version = "=0.16.11" [dev-dependencies.console] package = "snarkvm-console" diff --git a/circuit/types/address/Cargo.toml b/circuit/types/address/Cargo.toml index 873ed94a56..35c414e747 100644 --- a/circuit/types/address/Cargo.toml +++ b/circuit/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-address" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Address circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,28 +9,28 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-address" path = "../../../console/types/address" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-group] path = "../group" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.10" +version = "=0.16.11" [features] default = [ "enable_console" ] diff --git a/circuit/types/boolean/Cargo.toml b/circuit/types/boolean/Cargo.toml index 12b55e4137..82dafde21e 100644 --- a/circuit/types/boolean/Cargo.toml +++ b/circuit/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-boolean" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Boolean circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -14,12 +14,12 @@ harness = false [dependencies.console] package = "snarkvm-console-types-boolean" path = "../../../console/types/boolean" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.10" +version = "=0.16.11" [dev-dependencies.criterion] version = "0.5" diff --git a/circuit/types/field/Cargo.toml b/circuit/types/field/Cargo.toml index 88e4c3704f..d08323d61a 100644 --- a/circuit/types/field/Cargo.toml +++ b/circuit/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-field" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Field circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-field" path = "../../../console/types/field" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.10" +version = "=0.16.11" [features] default = [ "enable_console" ] diff --git a/circuit/types/group/Cargo.toml b/circuit/types/group/Cargo.toml index 8f3732b992..6d6e494081 100644 --- a/circuit/types/group/Cargo.toml +++ b/circuit/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-group" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Group circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-group" path = "../../../console/types/group" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.10" +version = "=0.16.11" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/integers/Cargo.toml b/circuit/types/integers/Cargo.toml index df55dffc97..1caafd0b64 100644 --- a/circuit/types/integers/Cargo.toml +++ b/circuit/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-integers" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Integer circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-integers" path = "../../../console/types/integers" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.10" +version = "=0.16.11" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/scalar/Cargo.toml b/circuit/types/scalar/Cargo.toml index 936f43a428..62e51ce0bd 100644 --- a/circuit/types/scalar/Cargo.toml +++ b/circuit/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-scalar" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Scalar circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-scalar" path = "../../../console/types/scalar" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.10" +version = "=0.16.11" [features] default = [ "enable_console" ] diff --git a/circuit/types/string/Cargo.toml b/circuit/types/string/Cargo.toml index 86c3dcfd36..823eaacc3a 100644 --- a/circuit/types/string/Cargo.toml +++ b/circuit/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-string" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "String circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-string" path = "../../../console/types/string" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-circuit-types-integers] path = "../integers" -version = "=0.16.10" +version = "=0.16.11" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/console/Cargo.toml b/console/Cargo.toml index 77d4d5e838..5cc82ef821 100644 --- a/console/Cargo.toml +++ b/console/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Console environment for a decentralized virtual machine" license = "Apache-2.0" @@ -8,32 +8,32 @@ edition = "2021" [dependencies.snarkvm-console-account] path = "./account" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-console-algorithms] path = "./algorithms" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-console-collections] path = "./collections" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-console-network] path = "./network" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-console-program] path = "./program" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-console-types] path = "./types" -version = "=0.16.10" +version = "=0.16.11" optional = true [features] diff --git a/console/account/Cargo.toml b/console/account/Cargo.toml index c6f2f5c24b..59d0118e3b 100644 --- a/console/account/Cargo.toml +++ b/console/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-account" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Account operations for a decentralized virtual machine" license = "Apache-2.0" @@ -13,11 +13,11 @@ harness = false [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.10" +version = "=0.16.11" default-features = false features = [ "address", "boolean", "field", "group", "scalar" ] diff --git a/console/algorithms/Cargo.toml b/console/algorithms/Cargo.toml index cf2cd34d7c..071fc07f6d 100644 --- a/console/algorithms/Cargo.toml +++ b/console/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-algorithms" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Console algorithms for a decentralized virtual machine" license = "Apache-2.0" @@ -23,18 +23,18 @@ harness = false [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.10" +version = "=0.16.11" default-features = false features = [ "field", "group", "integers", "scalar" ] [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.10" +version = "=0.16.11" [dependencies.blake2s_simd] version = "1.0" diff --git a/console/collections/Cargo.toml b/console/collections/Cargo.toml index d61504e7bd..7916341a41 100644 --- a/console/collections/Cargo.toml +++ b/console/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-collections" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Collections for a decentralized virtual machine" license = "Apache-2.0" @@ -18,11 +18,11 @@ harness = false [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.10" +version = "=0.16.11" default-features = false features = [ "field", "integers" ] diff --git a/console/network/Cargo.toml b/console/network/Cargo.toml index d0fcfda978..928d12b266 100644 --- a/console/network/Cargo.toml +++ b/console/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Network console library for a decentralized virtual machine" license = "Apache-2.0" @@ -15,45 +15,45 @@ wasm = [ [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.10" +version = "=0.16.11" default-features = false features = [ "snark" ] [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-network-environment] path = "./environment" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.10" +version = "=0.16.11" default-features = false features = [ "field", "group", "scalar" ] [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.snarkvm-parameters] path = "../../parameters" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.10" +version = "=0.16.11" [dependencies.anyhow] version = "1.0.73" diff --git a/console/network/environment/Cargo.toml b/console/network/environment/Cargo.toml index 38b263edf5..b2681a229d 100644 --- a/console/network/environment/Cargo.toml +++ b/console/network/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network-environment" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Environment console library for a decentralized virtual machine" license = "Apache-2.0" @@ -8,17 +8,17 @@ edition = "2021" [dependencies.snarkvm-curves] path = "../../../curves" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.snarkvm-fields] path = "../../../fields" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.snarkvm-utilities] path = "../../../utilities" -version = "=0.16.10" +version = "=0.16.11" [dependencies.anyhow] version = "1.0.73" diff --git a/console/program/Cargo.toml b/console/program/Cargo.toml index f414de45ce..78d9907a7c 100644 --- a/console/program/Cargo.toml +++ b/console/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-program" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Program operations for a decentralized virtual machine" license = "Apache-2.0" @@ -12,27 +12,27 @@ test = [ ] [dependencies.snarkvm-console-account] path = "../account" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.10" +version = "=0.16.11" [dependencies.enum_index] version = "0.2" diff --git a/console/types/Cargo.toml b/console/types/Cargo.toml index a03499db21..e20511a88a 100644 --- a/console/types/Cargo.toml +++ b/console/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Console types for a decentralized virtual machine" license = "Apache-2.0" @@ -8,41 +8,41 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../network/environment" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types-address] path = "./address" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-console-types-boolean] path = "./boolean" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-console-types-field] path = "./field" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-console-types-group] path = "./group" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-console-types-integers] path = "./integers" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-console-types-scalar] path = "./scalar" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-console-types-string] path = "./string" -version = "=0.16.10" +version = "=0.16.11" optional = true [features] diff --git a/console/types/address/Cargo.toml b/console/types/address/Cargo.toml index d770be82bc..974136bdaa 100644 --- a/console/types/address/Cargo.toml +++ b/console/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-address" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types-group] path = "../group" -version = "=0.16.10" +version = "=0.16.11" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/boolean/Cargo.toml b/console/types/boolean/Cargo.toml index 98ac8dd348..8ac68cc08f 100644 --- a/console/types/boolean/Cargo.toml +++ b/console/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-boolean" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,7 +8,7 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.10" +version = "=0.16.11" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/field/Cargo.toml b/console/types/field/Cargo.toml index 65eadf8a80..a5d91584ff 100644 --- a/console/types/field/Cargo.toml +++ b/console/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-field" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,11 +8,11 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.10" +version = "=0.16.11" [dependencies.zeroize] version = "1" diff --git a/console/types/group/Cargo.toml b/console/types/group/Cargo.toml index df7b5aa952..76d706b359 100644 --- a/console/types/group/Cargo.toml +++ b/console/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-group" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.10" +version = "=0.16.11" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/integers/Cargo.toml b/console/types/integers/Cargo.toml index 7e5dae3d3b..b225a6c6d9 100644 --- a/console/types/integers/Cargo.toml +++ b/console/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-integers" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.10" +version = "=0.16.11" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/scalar/Cargo.toml b/console/types/scalar/Cargo.toml index 34e8291522..dab1f66d23 100644 --- a/console/types/scalar/Cargo.toml +++ b/console/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-scalar" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,15 +8,15 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.10" +version = "=0.16.11" [dependencies.zeroize] version = "1" diff --git a/console/types/string/Cargo.toml b/console/types/string/Cargo.toml index 575ab6a3ed..e02ac223c7 100644 --- a/console/types/string/Cargo.toml +++ b/console/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-string" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-console-types-integers] path = "../integers" -version = "=0.16.10" +version = "=0.16.11" [dev-dependencies.bincode] version = "1.3" diff --git a/curves/Cargo.toml b/curves/Cargo.toml index 4af8e49fb0..320601444b 100644 --- a/curves/Cargo.toml +++ b/curves/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-curves" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Curves for a decentralized virtual machine" homepage = "https://aleo.org" @@ -36,12 +36,12 @@ harness = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.rand] diff --git a/fields/Cargo.toml b/fields/Cargo.toml index 258a456771..7f0e26a1f1 100644 --- a/fields/Cargo.toml +++ b/fields/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-fields" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Fields for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.aleo-std] diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index 1dab7199fb..3f5af8b8d2 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "A node ledger for a decentralized virtual machine" homepage = "https://aleo.org" @@ -56,54 +56,54 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "./authority" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "./block" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "./coinbase" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "./committee" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-narwhal] package = "snarkvm-ledger-narwhal" path = "./narwhal" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "./query" -version = "=0.16.10" +version = "=0.16.11" features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "./store" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-test-helpers] package = "snarkvm-ledger-test-helpers" path = "./test-helpers" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.synthesizer] package = "snarkvm-synthesizer" path = "../synthesizer" -version = "=0.16.10" +version = "=0.16.11" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/authority/Cargo.toml b/ledger/authority/Cargo.toml index e7061f2890..816f0eacf5 100644 --- a/ledger/authority/Cargo.toml +++ b/ledger/authority/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-authority" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Data structures for a block authority in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-subdag/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.10" +version = "=0.16.11" [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.10" +version = "=0.16.11" [dependencies.anyhow] version = "1" diff --git a/ledger/block/Cargo.toml b/ledger/block/Cargo.toml index 1288dd67bc..907467f90f 100644 --- a/ledger/block/Cargo.toml +++ b/ledger/block/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-block" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "A block for a decentralized virtual machine" homepage = "https://aleo.org" @@ -39,42 +39,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../ledger/coinbase" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../../ledger/committee" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../narwhal/transmission-id" -version = "=0.16.10" +version = "=0.16.11" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.10" +version = "=0.16.11" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.10" +version = "=0.16.11" [dependencies.indexmap] version = "2.0" diff --git a/ledger/coinbase/Cargo.toml b/ledger/coinbase/Cargo.toml index ad4dd953e8..920fed6a88 100644 --- a/ledger/coinbase/Cargo.toml +++ b/ledger/coinbase/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-coinbase" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Coinbase puzzle for a decentralized virtual machine" homepage = "https://aleo.org" @@ -50,27 +50,27 @@ wasm = [ [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-synthesizer-snark] path = "../../synthesizer/snark" -version = "=0.16.10" +version = "=0.16.11" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.aleo-std] diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index 38531d419b..51284ebe8d 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-committee" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "A committee for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,7 +33,7 @@ test-helpers = [ "prop-tests", "rand_distr" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.10" +version = "=0.16.11" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/Cargo.toml b/ledger/narwhal/Cargo.toml index 7666d20626..608be5458f 100644 --- a/ledger/narwhal/Cargo.toml +++ b/ledger/narwhal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Data structures for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -64,37 +64,37 @@ transmission-id = [ "narwhal-transmission-id" ] [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "./batch-certificate" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "./batch-header" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "./data" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "./subdag" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.narwhal-transmission] package = "snarkvm-ledger-narwhal-transmission" path = "./transmission" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "./transmission-id" -version = "=0.16.10" +version = "=0.16.11" optional = true [dev-dependencies.snarkvm-ledger-narwhal] diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index e4aa3aee7d..b9438c2f90 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-header/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.10" +version = "=0.16.11" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.10" +version = "=0.16.11" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.10" +version = "=0.16.11" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/batch-header/Cargo.toml b/ledger/narwhal/batch-header/Cargo.toml index de13c1f939..a49234fa85 100644 --- a/ledger/narwhal/batch-header/Cargo.toml +++ b/ledger/narwhal/batch-header/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "A batch header for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-transmission-id/test-helpers", "time" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.10" +version = "=0.16.11" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.10" +version = "=0.16.11" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/data/Cargo.toml b/ledger/narwhal/data/Cargo.toml index 66387e8fe1..6616ef7c64 100644 --- a/ledger/narwhal/data/Cargo.toml +++ b/ledger/narwhal/data/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-data" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -29,7 +29,7 @@ async = [ "tokio" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.10" +version = "=0.16.11" [dependencies.bytes] version = "1" diff --git a/ledger/narwhal/subdag/Cargo.toml b/ledger/narwhal/subdag/Cargo.toml index 95e8c51aa2..dac1bd44bf 100644 --- a/ledger/narwhal/subdag/Cargo.toml +++ b/ledger/narwhal/subdag/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "A subdag for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ "narwhal-batch-certificate/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.10" +version = "=0.16.11" [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../batch-certificate" -version = "=0.16.10" +version = "=0.16.11" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.10" +version = "=0.16.11" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.10" +version = "=0.16.11" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/transmission-id/Cargo.toml b/ledger/narwhal/transmission-id/Cargo.toml index e2582f472b..8ce9d53d31 100644 --- a/ledger/narwhal/transmission-id/Cargo.toml +++ b/ledger/narwhal/transmission-id/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "A transmission ID for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.10" +version = "=0.16.11" [dev-dependencies.bincode] version = "1.3" diff --git a/ledger/narwhal/transmission/Cargo.toml b/ledger/narwhal/transmission/Cargo.toml index f5e6ff0e35..d9ce4f5e91 100644 --- a/ledger/narwhal/transmission/Cargo.toml +++ b/ledger/narwhal/transmission/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "A transmission for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../block" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "../data" -version = "=0.16.10" +version = "=0.16.11" [dependencies.bytes] version = "1" diff --git a/ledger/query/Cargo.toml b/ledger/query/Cargo.toml index 71ca63b829..b99d8c30ce 100644 --- a/ledger/query/Cargo.toml +++ b/ledger/query/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-query" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "A query for a decentralized virtual machine" homepage = "https://aleo.org" @@ -30,18 +30,18 @@ query = [ "ledger-store", "synthesizer-program", "ureq" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.async-trait] diff --git a/ledger/store/Cargo.toml b/ledger/store/Cargo.toml index 3c495badb6..33d8063248 100644 --- a/ledger/store/Cargo.toml +++ b/ledger/store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-store" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "A data store for a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,42 +32,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../coinbase" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../committee" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../narwhal/batch-certificate" -version = "=0.16.10" +version = "=0.16.11" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.10" +version = "=0.16.11" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.10" +version = "=0.16.11" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/test-helpers/Cargo.toml b/ledger/test-helpers/Cargo.toml index f778177bf1..a5f624d5a8 100644 --- a/ledger/test-helpers/Cargo.toml +++ b/ledger/test-helpers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-test-helpers" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Test helpers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -19,39 +19,39 @@ edition = "2021" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.10" +version = "=0.16.11" [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../query" -version = "=0.16.10" +version = "=0.16.11" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.10" +version = "=0.16.11" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.10" +version = "=0.16.11" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "../../synthesizer/process" -version = "=0.16.10" +version = "=0.16.11" [dependencies.once_cell] version = "1.18" diff --git a/parameters/Cargo.toml b/parameters/Cargo.toml index 1ca4249a42..a0e8832382 100644 --- a/parameters/Cargo.toml +++ b/parameters/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-parameters" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Parameters for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "encoding", "js-sys", "web-sys" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.10" +version = "=0.16.11" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/Cargo.toml b/synthesizer/Cargo.toml index ab7871a71a..8218959d07 100644 --- a/synthesizer/Cargo.toml +++ b/synthesizer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Synthesizer for a decentralized virtual machine" homepage = "https://aleo.org" @@ -68,61 +68,61 @@ harness = false [dependencies.algorithms] package = "snarkvm-algorithms" path = "../algorithms" -version = "=0.16.10" +version = "=0.16.11" [dependencies.circuit] package = "snarkvm-circuit" path = "../circuit" -version = "=0.16.10" +version = "=0.16.11" [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../ledger/block" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../ledger/coinbase" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../ledger/committee" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../ledger/query" -version = "=0.16.10" +version = "=0.16.11" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../ledger/store" -version = "=0.16.10" +version = "=0.16.11" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "./process" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "./program" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "./snark" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.aleo-std] diff --git a/synthesizer/process/Cargo.toml b/synthesizer/process/Cargo.toml index 8fe0dfed81..f3c74baba8 100644 --- a/synthesizer/process/Cargo.toml +++ b/synthesizer/process/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-process" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "A process for a decentralized virtual machine" homepage = "https://aleo.org" @@ -48,45 +48,45 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.10" +version = "=0.16.11" default-features = false features = [ "network", "program", "types" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../ledger/block" -version = "=0.16.10" +version = "=0.16.11" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../../ledger/query" -version = "=0.16.10" +version = "=0.16.11" default-features = false [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../../ledger/store" -version = "=0.16.10" +version = "=0.16.11" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.10" +version = "=0.16.11" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.10" +version = "=0.16.11" [dependencies.utilities] package = "snarkvm-utilities" path = "../../utilities" -version = "=0.16.10" +version = "=0.16.11" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/program/Cargo.toml b/synthesizer/program/Cargo.toml index dabcdd53d1..1ef2f01361 100644 --- a/synthesizer/program/Cargo.toml +++ b/synthesizer/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-program" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Program for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "console/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.10" +version = "=0.16.11" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.10" +version = "=0.16.11" default-features = false features = [ "account", "network", "program", "types" ] diff --git a/synthesizer/snark/Cargo.toml b/synthesizer/snark/Cargo.toml index 66023365be..c4674bb582 100644 --- a/synthesizer/snark/Cargo.toml +++ b/synthesizer/snark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-snark" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "SNARK wrappers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,18 +33,18 @@ wasm = [ "console/wasm", "snarkvm-algorithms/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.10" +version = "=0.16.11" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.10" +version = "=0.16.11" default-features = false features = [ "network" ] [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.10" +version = "=0.16.11" [dependencies.bincode] version = "1" diff --git a/utilities/Cargo.toml b/utilities/Cargo.toml index 4b781db5d7..44ac7c4d55 100644 --- a/utilities/Cargo.toml +++ b/utilities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Utilities for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities-derives] path = "./derives" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.aleo-std] diff --git a/utilities/derives/Cargo.toml b/utilities/derives/Cargo.toml index 2d878556f0..7aabf8c77a 100644 --- a/utilities/derives/Cargo.toml +++ b/utilities/derives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities-derives" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Canonical serialization for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index cef394707c..3b342a104e 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-wasm" -version = "0.16.10" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "WASM for a decentralized virtual machine" homepage = "https://aleo.org" @@ -28,30 +28,30 @@ crate-type = [ "cdylib", "rlib" ] [dependencies.snarkvm-console] path = "../console" -version = "=0.16.10" +version = "=0.16.11" features = [ "wasm" ] optional = true [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.10" +version = "=0.16.11" optional = true [dependencies.snarkvm-synthesizer] path = "../synthesizer" -version = "=0.16.10" +version = "=0.16.11" default-features = false features = [ "wasm" ] optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.10" +version = "=0.16.11" features = [ "wasm" ] optional = true From b6736c59e64d31eb8ea49e1ca3b088ab41a51c5a Mon Sep 17 00:00:00 2001 From: stanlagermin Date: Sat, 25 Nov 2023 20:08:28 +0700 Subject: [PATCH 188/339] fix typos --- algorithms/src/fft/polynomial/dense.rs | 2 +- algorithms/src/polycommit/error.rs | 2 +- algorithms/src/polycommit/sonic_pc/polynomial.rs | 2 +- curves/src/templates/bls12/bls12.rs | 2 +- synthesizer/process/src/stack/register_types/initialize.rs | 2 +- synthesizer/process/src/tests/test_execute.rs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/algorithms/src/fft/polynomial/dense.rs b/algorithms/src/fft/polynomial/dense.rs index 6be19d1f93..80322a78e9 100644 --- a/algorithms/src/fft/polynomial/dense.rs +++ b/algorithms/src/fft/polynomial/dense.rs @@ -700,7 +700,7 @@ mod tests { multiplier.add_polynomial(a.clone(), "a"); assert_eq!(multiplier.multiply().unwrap(), a); - // Note PolyMultiplier doesn't support a evluations with no polynomials + // Note PolyMultiplier doesn't support a evaluations with no polynomials } #[test] diff --git a/algorithms/src/polycommit/error.rs b/algorithms/src/polycommit/error.rs index 22db5f8846..f101d30224 100644 --- a/algorithms/src/polycommit/error.rs +++ b/algorithms/src/polycommit/error.rs @@ -69,7 +69,7 @@ pub enum PCError { #[error("The degree provided to `trim` was too large.")] TrimmingDegreeTooLarge, - #[error("the eqaution \"{0}\" contained degree-bounded polynomials")] + #[error("the equation \"{0}\" contained degree-bounded polynomials")] EquationHasDegreeBounds(String), #[error("the degree bound ({0}) is not supported by the parameters")] diff --git a/algorithms/src/polycommit/sonic_pc/polynomial.rs b/algorithms/src/polycommit/sonic_pc/polynomial.rs index 4d23d5266a..46bb321a11 100644 --- a/algorithms/src/polycommit/sonic_pc/polynomial.rs +++ b/algorithms/src/polycommit/sonic_pc/polynomial.rs @@ -223,7 +223,7 @@ impl<'a, F: PrimeField> LabeledPolynomialWithBasis<'a, F> { let mut lagrange_polys = HashMap::>::new(); let mut dense_polys = HashMap::<_, DensePolynomial>::new(); let mut sparse_poly = SparsePolynomial::zero(); - // We have sets of polynomials divided along three critera: + // We have sets of polynomials divided along three criteria: // 1. All `Lagrange` polynomials are in the set corresponding to their domain. // 2. All `Dense` polynomials are in the set corresponding to their degree bound. // 3. All `Sparse` polynomials are in the set corresponding to their degree bound. diff --git a/curves/src/templates/bls12/bls12.rs b/curves/src/templates/bls12/bls12.rs index 4870b3d629..71a57c22e9 100644 --- a/curves/src/templates/bls12/bls12.rs +++ b/curves/src/templates/bls12/bls12.rs @@ -193,7 +193,7 @@ where // r = f^((p^6 - 1)(p^2 + 1)) r *= &f2; - // Hard part of the final exponentation is below: + // Hard part of the final exponentiation is below: // From https://eprint.iacr.org/2016/130.pdf, Table 1 let mut y0 = r.cyclotomic_square(); y0.conjugate(); diff --git a/synthesizer/process/src/stack/register_types/initialize.rs b/synthesizer/process/src/stack/register_types/initialize.rs index ee76d5f31f..7b3265a1f5 100644 --- a/synthesizer/process/src/stack/register_types/initialize.rs +++ b/synthesizer/process/src/stack/register_types/initialize.rs @@ -34,7 +34,7 @@ impl RegisterTypes { // Step 2. Check the instructions are well-formed. for instruction in closure.instructions() { - // Ensure the closure contains no aysnc instructions. + // Ensure the closure contains no async instructions. ensure!(instruction.opcode() != Opcode::Async, "An 'async' instruction is not allowed in closures"); // Ensure the closure contains no call instructions. ensure!(instruction.opcode() != Opcode::Call, "A 'call' instruction is not allowed in closures"); diff --git a/synthesizer/process/src/tests/test_execute.rs b/synthesizer/process/src/tests/test_execute.rs index d1130c2809..1837b54967 100644 --- a/synthesizer/process/src/tests/test_execute.rs +++ b/synthesizer/process/src/tests/test_execute.rs @@ -880,7 +880,7 @@ fn test_process_output_operand() { ) .unwrap(); - // Initalize the RNG. + // Initialize the RNG. let rng = &mut TestRng::default(); // Initialize a new caller account. From 9335023d246580056ba6cdd5e751dbf1d26edeb3 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sat, 25 Nov 2023 12:29:09 -0800 Subject: [PATCH 189/339] Add back limitation --- ledger/block/src/verify.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ledger/block/src/verify.rs b/ledger/block/src/verify.rs index 7c68ba6602..eee243e537 100644 --- a/ledger/block/src/verify.rs +++ b/ledger/block/src/verify.rs @@ -137,6 +137,10 @@ impl Block { previous_height: u32, current_committee: &Committee, ) -> Result<(u64, u32, i64)> { + // Note: Do not remove this. This ensures that all blocks after genesis are quorum blocks. + #[cfg(not(any(test, feature = "test")))] + ensure!(self.authority.is_quorum(), "The next block must be a quorum block"); + // Determine the expected height. let expected_height = previous_height.saturating_add(1); From 60a7f2575f811f1f4b907c0697f07b045eae0bf2 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sat, 25 Nov 2023 12:51:26 -0800 Subject: [PATCH 190/339] Reduce finalize ops tree to 2^16 instead of 2^17 --- .../src/state_path/configuration/mod.rs | 6 +++-- .../block/src/transactions/confirmed/mod.rs | 21 +++++++-------- ledger/block/src/transactions/merkle.rs | 27 ++++++++++--------- ledger/block/src/transactions/mod.rs | 2 +- ledger/narwhal/batch-header/src/lib.rs | 2 +- 5 files changed, 30 insertions(+), 28 deletions(-) diff --git a/console/program/src/state_path/configuration/mod.rs b/console/program/src/state_path/configuration/mod.rs index ddfa6651f8..17cb02942d 100644 --- a/console/program/src/state_path/configuration/mod.rs +++ b/console/program/src/state_path/configuration/mod.rs @@ -20,14 +20,16 @@ pub const BLOCKS_DEPTH: u8 = 32; /// The depth of the Merkle tree for the block header. pub const HEADER_DEPTH: u8 = 3; /// The depth of the Merkle tree for finalize operations in a transaction. -pub const FINALIZE_ID_DEPTH: u8 = TRANSACTION_DEPTH + 4; // 4 for 16 finalize operations per transition. +pub const FINALIZE_ID_DEPTH: u8 = TRANSACTION_DEPTH + 4; // '+ 4' is to support 16 finalize operations per transition. /// The depth of the Merkle tree for finalize operations in a block. -pub const FINALIZE_OPERATIONS_DEPTH: u8 = TRANSACTIONS_DEPTH + 1; +pub const FINALIZE_OPERATIONS_DEPTH: u8 = TRANSACTIONS_DEPTH; /// The depth of the Merkle tree for the ratifications in a block. pub const RATIFICATIONS_DEPTH: u8 = 16; /// The depth the Merkle tree for the subdag certificates in a block. pub const SUBDAG_CERTIFICATES_DEPTH: u8 = 16; /// The depth of the Merkle tree for transactions in a block. +/// Note: The technical limit is 2^16 - 1 transactions, to allow compatibility with the +/// finalize operations tree, which requires 1 leaf for the ratified finalize ID. pub const TRANSACTIONS_DEPTH: u8 = 16; /// The depth of the Merkle tree for the transaction. pub const TRANSACTION_DEPTH: u8 = 5; diff --git a/ledger/block/src/transactions/confirmed/mod.rs b/ledger/block/src/transactions/confirmed/mod.rs index d942c94d5e..c617c1b3f4 100644 --- a/ledger/block/src/transactions/confirmed/mod.rs +++ b/ledger/block/src/transactions/confirmed/mod.rs @@ -261,6 +261,16 @@ impl ConfirmedTransaction { } } + /// Returns the finalize ID, by computing the root of a (small) Merkle tree comprised of + /// the ordered finalize operations for the transaction. + pub fn to_finalize_id(&self) -> Result> { + // Prepare the leaves. + let leaves = self.finalize_operations().iter().map(ToBits::to_bits_le).collect::>(); + // Compute the finalize ID. + // Note: This call will ensure the number of finalize operations is within the size of the Merkle tree. + Ok(*N::merkle_tree_bhp::(&leaves)?.root()) + } + /// Returns the rejected ID, if the confirmed transaction is rejected. pub fn to_rejected_id(&self) -> Result>> { match self { @@ -314,17 +324,6 @@ impl ConfirmedTransaction { ), } } - - /// Returns the finalize id, by computing the root for a Merkle tree of the finalize operations. - pub fn to_finalize_id(&self) -> Result> { - // Prepare the leaves. - let leaves = self.finalize_operations().iter().map(ToBits::to_bits_le); - // Compute the finalize id tree. - // Note: This call will check the number of finalize operations is within the size of the Merkle tree. - let tree = N::merkle_tree_bhp::(&leaves.collect::>())?; - // Return the finalize id. - Ok(*tree.root()) - } } impl Deref for ConfirmedTransaction { diff --git a/ledger/block/src/transactions/merkle.rs b/ledger/block/src/transactions/merkle.rs index ed25919766..7f666f4ff5 100644 --- a/ledger/block/src/transactions/merkle.rs +++ b/ledger/block/src/transactions/merkle.rs @@ -17,26 +17,23 @@ use super::*; impl Transactions { /// Returns the finalize root of the transactions. pub fn to_finalize_root(&self, ratified_finalize_operations: Vec>) -> Result> { - // Prepare the finalize id for the ratified finalize operations. + // Prepare the ratified finalize ID - a Merkle tree composed of the ratified finalize operations. let ratified_finalize_id = *N::merkle_tree_bhp::( &ratified_finalize_operations.iter().map(ToBits::to_bits_le).collect::>(), )? .root(); - // Prepare the leaves. - let mut leaves = self + // Prepare the leaves, composed of: + // | transaction_0 finalize ID, ..., transaction_n finalize ID | ratified finalize ID | + let leaves = self .iter() - .map(ConfirmedTransaction::to_finalize_id) - .map(|res| res.map(|id| id.to_bits_le())) + .map(|tx| tx.to_finalize_id().map(|id| id.to_bits_le())) + .chain(std::iter::once(Ok(ratified_finalize_id.to_bits_le()))) .collect::>>()?; - // Append the finalize id for the ratifications. - leaves.push(ratified_finalize_id.to_bits_le()); - // Compute the finalize tree. - // Note: This call will check the number of finalize operations is within the size of the Merkle tree. - let tree = N::merkle_tree_bhp::(&leaves)?; - // Return the finalize root. - Ok(*tree.root()) + // Compute the finalize root. + // Note: This call will ensure the number of finalize operations is within the size of the Merkle tree. + Ok(*N::merkle_tree_bhp::(&leaves)?.root()) } } @@ -87,6 +84,10 @@ mod tests { #[test] fn test_transactions_depth() { // Ensure the log2 relationship between depth and the maximum number of transactions. - assert_eq!(2usize.pow(TRANSACTIONS_DEPTH as u32), Transactions::::MAX_TRANSACTIONS); + // Note: This test uses 'checked_sub' to ensure the depth is not zero. + assert_eq!( + 2usize.pow(TRANSACTIONS_DEPTH as u32).checked_sub(1).expect("Invalid depth"), + Transactions::::MAX_TRANSACTIONS + ); } } diff --git a/ledger/block/src/transactions/mod.rs b/ledger/block/src/transactions/mod.rs index 6fe4cf695e..6d10a510f1 100644 --- a/ledger/block/src/transactions/mod.rs +++ b/ledger/block/src/transactions/mod.rs @@ -168,7 +168,7 @@ impl Transactions { impl Transactions { /// The maximum number of transactions allowed in a block. - pub const MAX_TRANSACTIONS: usize = usize::pow(2, TRANSACTIONS_DEPTH as u32); + pub const MAX_TRANSACTIONS: usize = usize::pow(2, TRANSACTIONS_DEPTH as u32).saturating_sub(1); /// Returns an iterator over all transactions, for all transactions in `self`. pub fn iter(&self) -> impl '_ + ExactSizeIterator> { diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index 3801498a30..8e2fb65cf2 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -52,7 +52,7 @@ impl BatchHeader { /// The maximum number of solutions in a batch. pub const MAX_SOLUTIONS: usize = N::MAX_SOLUTIONS; /// The maximum number of transactions in a batch. - pub const MAX_TRANSACTIONS: usize = usize::pow(2, console::program::TRANSACTIONS_DEPTH as u32); + pub const MAX_TRANSACTIONS: usize = usize::pow(2, console::program::TRANSACTIONS_DEPTH as u32).saturating_sub(1); /// The maximum number of transmissions in a batch. pub const MAX_TRANSMISSIONS: usize = Self::MAX_SOLUTIONS + Self::MAX_TRANSACTIONS; } From 0cd63eef7d645baba9d5664400659f64c931a78a Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sat, 25 Nov 2023 13:40:20 -0800 Subject: [PATCH 191/339] Resample parameter --- .../src/testnet3/resources/block.genesis | Bin 13728 -> 13728 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/parameters/src/testnet3/resources/block.genesis b/parameters/src/testnet3/resources/block.genesis index c33b0398b64573fa23e04bacd903dfb75872c709..86ecc70d467e739bf7694ff790f69ccbac41569a 100644 GIT binary patch delta 11336 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 Bn+N~^ delta 11338 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 bOGHY1|F9^4{xka-{-`)V>9!i Date: Sat, 25 Nov 2023 13:51:58 -0800 Subject: [PATCH 192/339] Reduces the maximum transmissions per batch --- ledger/block/src/transactions/mod.rs | 15 +++++++++++---- ledger/narwhal/batch-header/src/bytes.rs | 4 ++-- ledger/narwhal/batch-header/src/lib.rs | 9 ++++----- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/ledger/block/src/transactions/mod.rs b/ledger/block/src/transactions/mod.rs index 2eb3a31372..d4b5c6cb9e 100644 --- a/ledger/block/src/transactions/mod.rs +++ b/ledger/block/src/transactions/mod.rs @@ -343,14 +343,21 @@ pub mod test_helpers { #[cfg(test)] mod tests { use super::*; + use ledger_narwhal_batch_header::BatchHeader; type CurrentNetwork = console::network::Testnet3; #[test] - fn test_max_transactions() { - assert_eq!( - Transactions::::MAX_TRANSACTIONS, - ledger_narwhal_batch_header::BatchHeader::::MAX_TRANSACTIONS + fn test_max_transmissions() { + // Determine the maximum number of transmissions in a batch. + let max_transmissions = BatchHeader::::MAX_TRANSMISSIONS_PER_BATCH + * BatchHeader::::MAX_CERTIFICATES + * 2; // 2 is for the BFT (1 block per 2 rounds) + + // Note: The maximum number of *transmissions* in a round cannot exceed the maximum number of *transactions* in a block. + assert!( + max_transmissions <= Transactions::::MAX_TRANSACTIONS, + "The maximum number of transmissions in a batch is too large" ); } } diff --git a/ledger/narwhal/batch-header/src/bytes.rs b/ledger/narwhal/batch-header/src/bytes.rs index 386ee958d3..e187d20443 100644 --- a/ledger/narwhal/batch-header/src/bytes.rs +++ b/ledger/narwhal/batch-header/src/bytes.rs @@ -36,10 +36,10 @@ impl FromBytes for BatchHeader { // Read the number of transmission IDs. let num_transmission_ids = u32::read_le(&mut reader)?; // Ensure the number of transmission IDs is within bounds. - if num_transmission_ids as usize > Self::MAX_TRANSMISSIONS { + if num_transmission_ids as usize > Self::MAX_TRANSMISSIONS_PER_BATCH { return Err(error(format!( "Number of transmission IDs ({num_transmission_ids}) exceeds the maximum ({})", - Self::MAX_TRANSMISSIONS, + Self::MAX_TRANSMISSIONS_PER_BATCH, ))); } // Read the transmission IDs. diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index 3801498a30..0156e3428e 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -49,12 +49,11 @@ pub struct BatchHeader { impl BatchHeader { /// The maximum number of certificates in a batch. pub const MAX_CERTIFICATES: usize = 200; - /// The maximum number of solutions in a batch. - pub const MAX_SOLUTIONS: usize = N::MAX_SOLUTIONS; - /// The maximum number of transactions in a batch. - pub const MAX_TRANSACTIONS: usize = usize::pow(2, console::program::TRANSACTIONS_DEPTH as u32); /// The maximum number of transmissions in a batch. - pub const MAX_TRANSMISSIONS: usize = Self::MAX_SOLUTIONS + Self::MAX_TRANSACTIONS; + /// Note: This limit is set to 50 as part of safety measures to prevent DoS attacks. + /// This limit can be increased in the future as performance improves. Alternatively, + /// the rate of block production can be sped up to compensate for the limit set here. + pub const MAX_TRANSMISSIONS_PER_BATCH: usize = 50; } impl BatchHeader { From 53eb83f874195b7aec14e8f456968548edffb372 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sat, 25 Nov 2023 14:43:22 -0800 Subject: [PATCH 193/339] Increase the transactions per block to 2^20 to reflect subdag requirements --- .../src/state_path/configuration/mod.rs | 2 +- ledger/block/src/transactions/mod.rs | 18 +++++++----- ledger/block/src/transition/merkle.rs | 4 +-- ledger/narwhal/batch-header/src/lib.rs | 3 ++ ledger/narwhal/subdag/src/lib.rs | 29 +++++++++++++++---- 5 files changed, 40 insertions(+), 16 deletions(-) diff --git a/console/program/src/state_path/configuration/mod.rs b/console/program/src/state_path/configuration/mod.rs index b8ddef30cf..04d2950c8e 100644 --- a/console/program/src/state_path/configuration/mod.rs +++ b/console/program/src/state_path/configuration/mod.rs @@ -26,7 +26,7 @@ pub const RATIFICATIONS_DEPTH: u8 = 16; /// The depth the Merkle tree for the subdag certificates in a block. pub const SUBDAG_CERTIFICATES_DEPTH: u8 = 16; /// The depth of the Merkle tree for transactions in a block. -pub const TRANSACTIONS_DEPTH: u8 = 16; +pub const TRANSACTIONS_DEPTH: u8 = 20; /// The depth of the Merkle tree for the transaction. pub const TRANSACTION_DEPTH: u8 = 5; /// The depth of the Merkle tree for the transition. diff --git a/ledger/block/src/transactions/mod.rs b/ledger/block/src/transactions/mod.rs index d4b5c6cb9e..61119a73d2 100644 --- a/ledger/block/src/transactions/mod.rs +++ b/ledger/block/src/transactions/mod.rs @@ -349,15 +349,17 @@ mod tests { #[test] fn test_max_transmissions() { - // Determine the maximum number of transmissions in a batch. - let max_transmissions = BatchHeader::::MAX_TRANSMISSIONS_PER_BATCH - * BatchHeader::::MAX_CERTIFICATES - * 2; // 2 is for the BFT (1 block per 2 rounds) - - // Note: The maximum number of *transmissions* in a round cannot exceed the maximum number of *transactions* in a block. + // Determine the maximum number of transmissions in a block. + let max_transmissions_per_block = BatchHeader::::MAX_TRANSMISSIONS_PER_BATCH + * usize::try_from(BatchHeader::::MAX_GC_ROUNDS).unwrap() + * BatchHeader::::MAX_CERTIFICATES; + + // Note: The maximum number of *transmissions* in a block cannot exceed the maximum number of *transactions* in a block. + // If you intended to change the number of 'MAX_TRANSACTIONS', note that this will break the inclusion proof, + // and you will need to migrate all users to a new circuit for the inclusion proof. assert!( - max_transmissions <= Transactions::::MAX_TRANSACTIONS, - "The maximum number of transmissions in a batch is too large" + max_transmissions_per_block <= Transactions::::MAX_TRANSACTIONS, + "The maximum number of transmissions in a block is too large" ); } } diff --git a/ledger/block/src/transition/merkle.rs b/ledger/block/src/transition/merkle.rs index d5a8fb33b1..e2f05de05b 100644 --- a/ledger/block/src/transition/merkle.rs +++ b/ledger/block/src/transition/merkle.rs @@ -36,7 +36,7 @@ impl Transition { // Check if the input ID matches the given ID. if id == input.id() { // Return the transition leaf. - return Ok(input.to_transition_leaf(index as u8)); + return Ok(input.to_transition_leaf(u8::try_from(index)?)); } } // Error if the input ID was not found. @@ -48,7 +48,7 @@ impl Transition { // Check if the output ID matches the given ID. if id == output.id() { // Return the transition leaf. - return Ok(output.to_transition_leaf((self.inputs.len() + index) as u8)); + return Ok(output.to_transition_leaf(u8::try_from(self.inputs.len() + index)?)); } } // Error if the output ID was not found. diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index 0156e3428e..8999829986 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -49,6 +49,9 @@ pub struct BatchHeader { impl BatchHeader { /// The maximum number of certificates in a batch. pub const MAX_CERTIFICATES: usize = 200; + /// The maximum number of rounds to store before garbage collecting. + pub const MAX_GC_ROUNDS: u64 = 100; + // rounds /// The maximum number of transmissions in a batch. /// Note: This limit is set to 50 as part of safety measures to prevent DoS attacks. /// This limit can be increased in the future as performance improves. Alternatively, diff --git a/ledger/narwhal/subdag/src/lib.rs b/ledger/narwhal/subdag/src/lib.rs index 8fb93cfe9b..b62a1f6b3b 100644 --- a/ledger/narwhal/subdag/src/lib.rs +++ b/ledger/narwhal/subdag/src/lib.rs @@ -159,7 +159,7 @@ impl Subdag { } } - /// Returns the subdag root of the transactions. + /// Returns the subdag root of the certificates. pub fn to_subdag_root(&self) -> Result> { // Prepare the leaves. let leaves = cfg_iter!(self.subdag) @@ -168,10 +168,8 @@ impl Subdag { }) .collect::>(); - // Compute the subdag tree. - let tree = N::merkle_tree_bhp::(&leaves)?; - // Return the subdag root. - Ok(*tree.root()) + // Compute the subdag root. + Ok(*N::merkle_tree_bhp::(&leaves)?.root()) } } @@ -255,3 +253,24 @@ pub mod test_helpers { sample } } + +#[cfg(test)] +mod tests { + use super::*; + use narwhal_batch_header::BatchHeader; + + type CurrentNetwork = console::network::Testnet3; + + #[test] + fn test_max_certificates() { + // Determine the maximum number of certificates in a block. + let max_certificates_per_block = usize::try_from(BatchHeader::::MAX_GC_ROUNDS).unwrap() + * BatchHeader::::MAX_CERTIFICATES; + + // Note: The maximum number of certificates in a block must be able to be Merklized. + assert!( + max_certificates_per_block <= 2u32.checked_pow(SUBDAG_CERTIFICATES_DEPTH as u32).unwrap() as usize, + "The maximum number of certificates in a block is too large" + ); + } +} From 9750ce467bef855849259b0fcd947fcdb2eae41b Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sat, 25 Nov 2023 14:54:35 -0800 Subject: [PATCH 194/339] Resample parameters --- .../src/testnet3/resources/block.genesis | Bin 13728 -> 13728 bytes .../src/testnet3/resources/inclusion.metadata | 6 +++--- .../src/testnet3/resources/inclusion.verifier | Bin 665 -> 665 bytes 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/parameters/src/testnet3/resources/block.genesis b/parameters/src/testnet3/resources/block.genesis index c33b0398b64573fa23e04bacd903dfb75872c709..a668899939e0755010352583f933fc95ea92daa7 100644 GIT binary patch delta 11333 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 jvT^sYL}C3%Cgj=<{G4asP@t<){wzGwTc~ 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 Date: Sat, 25 Nov 2023 15:12:10 -0800 Subject: [PATCH 195/339] Expands benches on execute --- ledger/benches/transaction.rs | 95 ++++++++++++++++++++++++++--------- 1 file changed, 70 insertions(+), 25 deletions(-) diff --git a/ledger/benches/transaction.rs b/ledger/benches/transaction.rs index 030d061330..233e15aa37 100644 --- a/ledger/benches/transaction.rs +++ b/ledger/benches/transaction.rs @@ -92,34 +92,79 @@ fn execute(c: &mut Criterion) { let address = Address::try_from(&private_key).unwrap(); // Initialize the VM. - let (vm, _records) = initialize_vm(&private_key, rng); - - // Prepare the inputs. - let inputs = - [Value::::from_str(&address.to_string()).unwrap(), Value::::from_str("1u64").unwrap()] - .into_iter(); - - // Authorize the execution. - let execute_authorization = vm.authorize(&private_key, "credits.aleo", "transfer_public", inputs, rng).unwrap(); - // Retrieve the execution ID. - let execution_id = execute_authorization.to_execution_id().unwrap(); - // Authorize the fee. - let fee_authorization = vm.authorize_fee_public(&private_key, 300000, 1000, execution_id, rng).unwrap(); - - c.bench_function("Transaction::Execute(transfer_public)", |b| { - b.iter(|| { - vm.execute_authorization(execute_authorization.replicate(), Some(fee_authorization.replicate()), None, rng) + let (vm, records) = initialize_vm(&private_key, rng); + + { + // Prepare the inputs. + let inputs = + [Value::::from_str(&address.to_string()).unwrap(), Value::::from_str("1u64").unwrap()] + .into_iter(); + + // Authorize the execution. + let execute_authorization = vm.authorize(&private_key, "credits.aleo", "transfer_public", inputs, rng).unwrap(); + // Retrieve the execution ID. + let execution_id = execute_authorization.to_execution_id().unwrap(); + // Authorize the fee. + let fee_authorization = vm.authorize_fee_public(&private_key, 300000, 1000, execution_id, rng).unwrap(); + + c.bench_function("Transaction::Execute(transfer_public)", |b| { + b.iter(|| { + vm.execute_authorization( + execute_authorization.replicate(), + Some(fee_authorization.replicate()), + None, + rng, + ) .unwrap(); - }) - }); + }) + }); + + let transaction = vm + .execute_authorization(execute_authorization.replicate(), Some(fee_authorization.replicate()), None, rng) + .unwrap(); + + c.bench_function("Transaction::Execute(transfer_public) - verify", |b| { + b.iter(|| vm.check_transaction(&transaction, None, rng).unwrap()) + }); + } + + { + // Prepare the inputs. + let inputs = [ + Value::::Record(records[0].clone()), + Value::::from_str(&address.to_string()).unwrap(), + Value::::from_str("1u64").unwrap(), + ] + .into_iter(); + + // Authorize the execution. + let execute_authorization = + vm.authorize(&private_key, "credits.aleo", "transfer_private", inputs, rng).unwrap(); + // Retrieve the execution ID. + let execution_id = execute_authorization.to_execution_id().unwrap(); + // Authorize the fee. + let fee_authorization = vm.authorize_fee_public(&private_key, 300000, 1000, execution_id, rng).unwrap(); + + c.bench_function("Transaction::Execute(transfer_private)", |b| { + b.iter(|| { + vm.execute_authorization( + execute_authorization.replicate(), + Some(fee_authorization.replicate()), + None, + rng, + ) + .unwrap(); + }) + }); - let transaction = vm - .execute_authorization(execute_authorization.replicate(), Some(fee_authorization.replicate()), None, rng) - .unwrap(); + let transaction = vm + .execute_authorization(execute_authorization.replicate(), Some(fee_authorization.replicate()), None, rng) + .unwrap(); - c.bench_function("Transaction::Execute(transfer_public) - verify", |b| { - b.iter(|| vm.check_transaction(&transaction, None, rng).unwrap()) - }); + c.bench_function("Transaction::Execute(transfer_private) - verify", |b| { + b.iter(|| vm.check_transaction(&transaction, None, rng).unwrap()) + }); + } } criterion_group! { From b42cfc9ee4fc054c6855b45879e14b76920ee703 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sat, 25 Nov 2023 15:17:57 -0800 Subject: [PATCH 196/339] Update constraint counts --- circuit/program/src/state_path/mod.rs | 6 ++-- circuit/program/src/state_path/verify.rs | 36 ++++++++++++------------ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/circuit/program/src/state_path/mod.rs b/circuit/program/src/state_path/mod.rs index d8cf025aa6..6e8a30ed74 100644 --- a/circuit/program/src/state_path/mod.rs +++ b/circuit/program/src/state_path/mod.rs @@ -191,16 +191,16 @@ mod tests { #[test] fn test_state_path_new_constant() -> Result<()> { - check_new(Mode::Constant, 446, 1, 0, 0) + check_new(Mode::Constant, 450, 1, 0, 0) } #[test] fn test_state_path_new_public() -> Result<()> { - check_new(Mode::Public, 0, 447, 0, 376) + check_new(Mode::Public, 0, 451, 0, 376) } #[test] fn test_state_path_new_private() -> Result<()> { - check_new(Mode::Private, 0, 1, 446, 376) + check_new(Mode::Private, 0, 1, 450, 376) } } diff --git a/circuit/program/src/state_path/verify.rs b/circuit/program/src/state_path/verify.rs index f4c6e624cc..9101486ff9 100644 --- a/circuit/program/src/state_path/verify.rs +++ b/circuit/program/src/state_path/verify.rs @@ -225,43 +225,43 @@ mod tests { #[test] fn test_state_path_verify_global_constant() -> Result<()> { - check_verify_global(Mode::Constant, true, 106309, 1, 2, 2)?; - check_verify_global(Mode::Constant, false, 106309, 1, 2, 2) + check_verify_global(Mode::Constant, true, 112709, 1, 2, 2)?; + check_verify_global(Mode::Constant, false, 112709, 1, 2, 2) } #[test] fn test_state_path_verify_global_public() -> Result<()> { - check_verify_global(Mode::Public, true, 27814, 449, 123343, 123982)?; - check_verify_global(Mode::Public, false, 27814, 449, 123343, 123982) + check_verify_global(Mode::Public, true, 29450, 453, 130867, 131522)?; + check_verify_global(Mode::Public, false, 29450, 453, 130867, 131522) } #[test] fn test_state_path_verify_global_private() -> Result<()> { - check_verify_global(Mode::Private, true, 27814, 1, 123791, 123982)?; - check_verify_global(Mode::Private, false, 27814, 1, 123791, 123982) + check_verify_global(Mode::Private, true, 29450, 1, 131319, 131522)?; + check_verify_global(Mode::Private, false, 29450, 1, 131319, 131522) } #[test] fn test_state_path_verify_local_constant() -> Result<()> { - check_verify_local(Mode::Constant, false, true, 106309, 1, 2, 2)?; - check_verify_local(Mode::Constant, false, false, 106309, 1, 2, 2)?; - check_verify_local(Mode::Constant, true, true, 106309, 1, 2, 2)?; - check_verify_local(Mode::Constant, true, false, 106309, 1, 2, 2) + check_verify_local(Mode::Constant, false, true, 112709, 1, 2, 2)?; + check_verify_local(Mode::Constant, false, false, 112709, 1, 2, 2)?; + check_verify_local(Mode::Constant, true, true, 112709, 1, 2, 2)?; + check_verify_local(Mode::Constant, true, false, 112709, 1, 2, 2) } #[test] fn test_state_path_verify_local_public() -> Result<()> { - check_verify_local(Mode::Public, false, true, 27814, 449, 123343, 123982)?; - check_verify_local(Mode::Public, false, false, 27814, 449, 123343, 123982)?; - check_verify_local(Mode::Public, true, true, 27814, 449, 123343, 123982)?; - check_verify_local(Mode::Public, true, false, 27814, 449, 123343, 123982) + check_verify_local(Mode::Public, false, true, 29450, 453, 130867, 131522)?; + check_verify_local(Mode::Public, false, false, 29450, 453, 130867, 131522)?; + check_verify_local(Mode::Public, true, true, 29450, 453, 130867, 131522)?; + check_verify_local(Mode::Public, true, false, 29450, 453, 130867, 131522) } #[test] fn test_state_path_verify_local_private() -> Result<()> { - check_verify_local(Mode::Private, false, true, 27814, 1, 123791, 123982)?; - check_verify_local(Mode::Private, false, false, 27814, 1, 123791, 123982)?; - check_verify_local(Mode::Private, true, true, 27814, 1, 123791, 123982)?; - check_verify_local(Mode::Private, true, false, 27814, 1, 123791, 123982) + check_verify_local(Mode::Private, false, true, 29450, 1, 131319, 131522)?; + check_verify_local(Mode::Private, false, false, 29450, 1, 131319, 131522)?; + check_verify_local(Mode::Private, true, true, 29450, 1, 131319, 131522)?; + check_verify_local(Mode::Private, true, false, 29450, 1, 131319, 131522) } } From 5a68ae4e2ebbaf3c43286735b2332ea122a03f48 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sat, 25 Nov 2023 15:31:45 -0800 Subject: [PATCH 197/339] Fix Subdag::MAX_ROUNDS --- ledger/narwhal/subdag/src/bytes.rs | 2 +- ledger/narwhal/subdag/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ledger/narwhal/subdag/src/bytes.rs b/ledger/narwhal/subdag/src/bytes.rs index d4ed42913b..9b2880251f 100644 --- a/ledger/narwhal/subdag/src/bytes.rs +++ b/ledger/narwhal/subdag/src/bytes.rs @@ -27,7 +27,7 @@ impl FromBytes for Subdag { // Read the number of rounds. let num_rounds = u32::read_le(&mut reader)?; // Ensure the number of rounds is within bounds. - if num_rounds as usize > Self::MAX_ROUNDS { + if num_rounds as u64 > Self::MAX_ROUNDS { return Err(error(format!("Number of rounds ({num_rounds}) exceeds the maximum ({})", Self::MAX_ROUNDS))); } // Read the round certificates. diff --git a/ledger/narwhal/subdag/src/lib.rs b/ledger/narwhal/subdag/src/lib.rs index b62a1f6b3b..e1cf04c7ae 100644 --- a/ledger/narwhal/subdag/src/lib.rs +++ b/ledger/narwhal/subdag/src/lib.rs @@ -104,7 +104,7 @@ impl Subdag { impl Subdag { /// The maximum number of rounds in a subdag (bounded up to GC depth). - pub const MAX_ROUNDS: usize = 50; + pub const MAX_ROUNDS: u64 = BatchHeader::::MAX_GC_ROUNDS; } impl Subdag { From 811d7381aa29c6aef84b40b18018fe4dd33a7940 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sat, 25 Nov 2023 15:38:58 -0800 Subject: [PATCH 198/339] Sets max committee size to max certificates --- ledger/block/src/transactions/mod.rs | 2 +- ledger/committee/Cargo.toml | 8 ++++---- ledger/committee/src/lib.rs | 8 +++----- ledger/narwhal/batch-header/src/bytes.rs | 6 +++--- ledger/narwhal/batch-header/src/lib.rs | 2 +- ledger/narwhal/subdag/src/bytes.rs | 6 +++--- ledger/narwhal/subdag/src/lib.rs | 2 +- 7 files changed, 16 insertions(+), 18 deletions(-) diff --git a/ledger/block/src/transactions/mod.rs b/ledger/block/src/transactions/mod.rs index 14d3141606..98ee5f02ab 100644 --- a/ledger/block/src/transactions/mod.rs +++ b/ledger/block/src/transactions/mod.rs @@ -353,7 +353,7 @@ mod tests { // Determine the maximum number of transmissions in a block. let max_transmissions_per_block = BatchHeader::::MAX_TRANSMISSIONS_PER_BATCH * usize::try_from(BatchHeader::::MAX_GC_ROUNDS).unwrap() - * BatchHeader::::MAX_CERTIFICATES; + * BatchHeader::::MAX_CERTIFICATES as usize; // Note: The maximum number of *transmissions* in a block cannot exceed the maximum number of *transactions* in a block. // If you intended to change the number of 'MAX_TRANSACTIONS', note that this will break the inclusion proof, diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index 51284ebe8d..f885d78f5d 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -35,6 +35,10 @@ package = "snarkvm-console" path = "../../console" version = "=0.16.11" +[dependencies.ledger-narwhal-batch-header] +package = "snarkvm-ledger-narwhal-batch-header" +path = "../narwhal/batch-header" + [dependencies.indexmap] version = "2.0" features = [ "serde", "rayon" ] @@ -82,7 +86,3 @@ version = "1" [dev-dependencies.snarkvm-ledger-committee] path = "." features = [ "prop-tests" ] - -[dev-dependencies.ledger-narwhal-batch-header] -package = "snarkvm-ledger-narwhal-batch-header" -path = "../narwhal/batch-header" diff --git a/ledger/committee/src/lib.rs b/ledger/committee/src/lib.rs index 74c392c35b..17ade7ba5a 100644 --- a/ledger/committee/src/lib.rs +++ b/ledger/committee/src/lib.rs @@ -26,6 +26,7 @@ use console::{ }; use indexmap::IndexMap; +use ledger_narwhal_batch_header::BatchHeader; use std::collections::HashSet; /// The minimum amount of stake required for a validator to bond. @@ -45,7 +46,7 @@ pub struct Committee { impl Committee { /// The maximum number of members that may be in a committee. - pub const MAX_COMMITTEE_SIZE: u16 = 200; + pub const MAX_COMMITTEE_SIZE: u16 = BatchHeader::::MAX_CERTIFICATES; /// Initializes a new `Committee` instance. pub fn new_genesis(members: IndexMap, (u64, bool)>) -> Result { @@ -447,9 +448,6 @@ mod tests { #[test] fn test_maximum_committee_size() { - assert_eq!( - Committee::::MAX_COMMITTEE_SIZE as usize, - ledger_narwhal_batch_header::BatchHeader::::MAX_CERTIFICATES - ); + assert_eq!(Committee::::MAX_COMMITTEE_SIZE, BatchHeader::::MAX_CERTIFICATES); } } diff --git a/ledger/narwhal/batch-header/src/bytes.rs b/ledger/narwhal/batch-header/src/bytes.rs index e187d20443..b34242e553 100644 --- a/ledger/narwhal/batch-header/src/bytes.rs +++ b/ledger/narwhal/batch-header/src/bytes.rs @@ -50,9 +50,9 @@ impl FromBytes for BatchHeader { } // Read the number of previous certificate IDs. - let num_previous_certificate_ids = u32::read_le(&mut reader)?; + let num_previous_certificate_ids = u16::read_le(&mut reader)?; // Ensure the number of previous certificate IDs is within bounds. - if num_previous_certificate_ids as usize > Self::MAX_CERTIFICATES { + if num_previous_certificate_ids > Self::MAX_CERTIFICATES { return Err(error(format!( "Number of previous certificate IDs ({num_previous_certificate_ids}) exceeds the maximum ({})", Self::MAX_CERTIFICATES @@ -101,7 +101,7 @@ impl ToBytes for BatchHeader { transmission_id.write_le(&mut writer)?; } // Write the number of previous certificate IDs. - u32::try_from(self.previous_certificate_ids.len()).map_err(|e| error(e.to_string()))?.write_le(&mut writer)?; + u16::try_from(self.previous_certificate_ids.len()).map_err(|e| error(e.to_string()))?.write_le(&mut writer)?; // Write the previous certificate IDs. for certificate_id in &self.previous_certificate_ids { // Write the certificate ID. diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index 55397d8700..0afdb243b8 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -48,7 +48,7 @@ pub struct BatchHeader { impl BatchHeader { /// The maximum number of certificates in a batch. - pub const MAX_CERTIFICATES: usize = 200; + pub const MAX_CERTIFICATES: u16 = 200; /// The maximum number of rounds to store before garbage collecting. pub const MAX_GC_ROUNDS: u64 = 100; /// The maximum number of transmissions in a batch. diff --git a/ledger/narwhal/subdag/src/bytes.rs b/ledger/narwhal/subdag/src/bytes.rs index 9b2880251f..09032ccf22 100644 --- a/ledger/narwhal/subdag/src/bytes.rs +++ b/ledger/narwhal/subdag/src/bytes.rs @@ -36,9 +36,9 @@ impl FromBytes for Subdag { // Read the round. let round = u64::read_le(&mut reader)?; // Read the number of certificates. - let num_certificates = u32::read_le(&mut reader)?; + let num_certificates = u16::read_le(&mut reader)?; // Ensure the number of certificates is within bounds. - if num_certificates as usize > BatchHeader::::MAX_CERTIFICATES { + if num_certificates > BatchHeader::::MAX_CERTIFICATES { return Err(error(format!( "Number of certificates ({num_certificates}) exceeds the maximum ({})", BatchHeader::::MAX_CERTIFICATES @@ -70,7 +70,7 @@ impl ToBytes for Subdag { // Write the round. round.write_le(&mut writer)?; // Write the number of certificates. - u32::try_from(certificates.len()).map_err(error)?.write_le(&mut writer)?; + u16::try_from(certificates.len()).map_err(error)?.write_le(&mut writer)?; // Write the certificates. for certificate in certificates { // Write the certificate. diff --git a/ledger/narwhal/subdag/src/lib.rs b/ledger/narwhal/subdag/src/lib.rs index e1cf04c7ae..e1d26ffb2f 100644 --- a/ledger/narwhal/subdag/src/lib.rs +++ b/ledger/narwhal/subdag/src/lib.rs @@ -265,7 +265,7 @@ mod tests { fn test_max_certificates() { // Determine the maximum number of certificates in a block. let max_certificates_per_block = usize::try_from(BatchHeader::::MAX_GC_ROUNDS).unwrap() - * BatchHeader::::MAX_CERTIFICATES; + * BatchHeader::::MAX_CERTIFICATES as usize; // Note: The maximum number of certificates in a block must be able to be Merklized. assert!( From 6238fc29d0c3ab5281bbb0279884d5c14481c4af Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sat, 25 Nov 2023 15:54:14 -0800 Subject: [PATCH 199/339] Resample expectations --- .../tests/expectations/vm/execute_and_finalize/test_rand.out | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/synthesizer/tests/expectations/vm/execute_and_finalize/test_rand.out b/synthesizer/tests/expectations/vm/execute_and_finalize/test_rand.out index 4fefc62cfd..d753dcf2b4 100644 --- a/synthesizer/tests/expectations/vm/execute_and_finalize/test_rand.out +++ b/synthesizer/tests/expectations/vm/execute_and_finalize/test_rand.out @@ -19,14 +19,14 @@ outputs: test_rand.aleo/rand_chacha_check: outputs: - '{"type":"future","id":"3721325135151760660773959530505944451747681933722462808964783147996869797702field","value":"{\n program_id: test_rand.aleo,\n function_name: rand_chacha_check,\n arguments: [\n 0field,\n false\n ]\n}"}' - speculate: the execution was accepted + speculate: the execution was rejected add_next_block: succeeded. - verified: true execute: test_rand.aleo/rand_chacha_check: outputs: - '{"type":"future","id":"887371549615679800380522845098080464570119184210350810479392117984911457950field","value":"{\n program_id: test_rand.aleo,\n function_name: rand_chacha_check,\n arguments: [\n 1field,\n true\n ]\n}"}' - speculate: the execution was accepted + speculate: the execution was rejected add_next_block: succeeded. additional: - child_outputs: From 1ce5cae3a4a2962cfd34712806b145f65c0030e9 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sat, 25 Nov 2023 15:58:21 -0800 Subject: [PATCH 200/339] Fix the minimum committee size --- ledger/committee/src/lib.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ledger/committee/src/lib.rs b/ledger/committee/src/lib.rs index 5d81de4414..217ee8249d 100644 --- a/ledger/committee/src/lib.rs +++ b/ledger/committee/src/lib.rs @@ -49,16 +49,14 @@ impl Committee { /// Initializes a new `Committee` instance. pub fn new_genesis(members: IndexMap, (u64, bool)>) -> Result { - // Ensure there are exactly 4 members. - ensure!(members.len() == 4, "Genesis committee must have 4 members"); // Return the new committee. Self::new(0u64, members) } /// Initializes a new `Committee` instance. pub fn new(starting_round: u64, members: IndexMap, (u64, bool)>) -> Result { - // Ensure there are at least 4 members. - ensure!(members.len() >= 4, "Committee must have at least 4 members"); + // Ensure there are at least 3 members. + ensure!(members.len() >= 3, "Committee must have at least 3 members"); // Ensure there are no more than the maximum number of members. ensure!( members.len() <= Self::MAX_COMMITTEE_SIZE as usize, From 4690056e8a6106d7fa67249098cd05d3560caecb Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sat, 25 Nov 2023 16:26:50 -0800 Subject: [PATCH 201/339] Fix test --- ledger/committee/src/lib.rs | 2 +- ledger/committee/src/prop_tests.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ledger/committee/src/lib.rs b/ledger/committee/src/lib.rs index 217ee8249d..7d5072835a 100644 --- a/ledger/committee/src/lib.rs +++ b/ledger/committee/src/lib.rs @@ -374,7 +374,7 @@ mod tests { // Set the number of rounds. const NUM_ROUNDS: u64 = 256 * 2_000; // Sample the number of members. - let num_members = rng.gen_range(4..50); + let num_members = rng.gen_range(3..50); // Sample a committee. let committee = crate::test_helpers::sample_committee_custom(num_members, rng); // Check the leader distribution. diff --git a/ledger/committee/src/prop_tests.rs b/ledger/committee/src/prop_tests.rs index c66769fa98..f0aa2e7bb2 100644 --- a/ledger/committee/src/prop_tests.rs +++ b/ledger/committee/src/prop_tests.rs @@ -125,7 +125,7 @@ impl Arbitrary for ValidatorSet { fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { // use minimal validator set to speed up tests that require signing from the committee members - validator_set(any_valid_validator(), size_range(4..=4usize)).boxed() + validator_set(any_valid_validator(), size_range(3..=4usize)).boxed() } } @@ -149,7 +149,7 @@ pub fn any_valid_private_key() -> BoxedStrategy> { #[allow(dead_code)] fn too_small_committee() -> BoxedStrategy>> { - (1u64.., validator_set(any_valid_validator(), 0..4)).prop_map(to_committee).boxed() + (1u64.., validator_set(any_valid_validator(), 0..3)).prop_map(to_committee).boxed() } #[allow(dead_code)] @@ -199,5 +199,5 @@ fn invalid_stakes(#[strategy(too_low_stake_committee())] committee: Result>) { - assert!(matches!(committee, Err(e) if e.to_string().as_str() == "Committee must have at least 4 members")) + assert!(matches!(committee, Err(e) if e.to_string().as_str() == "Committee must have at least 3 members")) } From 649b8c7af764aecdbb8499dd3470a8c9bc4ab992 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Sun, 26 Nov 2023 18:32:11 +0100 Subject: [PATCH 202/339] Add zip_eq safeguards --- algorithms/src/fft/domain.rs | 5 +- algorithms/src/fft/evaluations.rs | 1 + algorithms/src/polycommit/kzg10/mod.rs | 10 ++-- algorithms/src/polycommit/sonic_pc/mod.rs | 52 +++++++++++-------- .../src/polycommit/sonic_pc/polynomial.rs | 10 ++-- algorithms/src/polycommit/test_templates.rs | 30 ++++++++--- algorithms/src/snark/varuna/ahp/ahp.rs | 3 ++ .../src/snark/varuna/ahp/indexer/circuit.rs | 11 ++-- .../src/snark/varuna/ahp/indexer/indexer.rs | 34 ++++++------ algorithms/src/snark/varuna/ahp/matrices.rs | 12 +++-- .../src/snark/varuna/ahp/prover/message.rs | 2 +- algorithms/src/snark/varuna/varuna.rs | 6 ++- ledger/coinbase/src/lib.rs | 2 +- 13 files changed, 109 insertions(+), 69 deletions(-) diff --git a/algorithms/src/fft/domain.rs b/algorithms/src/fft/domain.rs index 93e7d1ed12..c5b38d012d 100644 --- a/algorithms/src/fft/domain.rs +++ b/algorithms/src/fft/domain.rs @@ -346,12 +346,13 @@ impl EvaluationDomain { /// evaluations in the domain. /// Returns the evaluations of the product over the domain. #[must_use] - pub fn mul_polynomials_in_evaluation_domain(&self, self_evals: Vec, other_evals: &[F]) -> Vec { + pub fn mul_polynomials_in_evaluation_domain(&self, self_evals: Vec, other_evals: &[F]) -> Result> { let mut result = self_evals; + ensure!(result.len() == other_evals.len()); cfg_iter_mut!(result).zip_eq(other_evals).for_each(|(a, b)| *a *= b); - result + Ok(result) } } diff --git a/algorithms/src/fft/evaluations.rs b/algorithms/src/fft/evaluations.rs index f58925a02a..bde5189b45 100644 --- a/algorithms/src/fft/evaluations.rs +++ b/algorithms/src/fft/evaluations.rs @@ -15,6 +15,7 @@ //! A polynomial represented in evaluations form. use crate::fft::{DensePolynomial, EvaluationDomain}; +use anyhow::Result; #[cfg(feature = "serial")] use itertools::Itertools; #[cfg(not(feature = "serial"))] diff --git a/algorithms/src/polycommit/kzg10/mod.rs b/algorithms/src/polycommit/kzg10/mod.rs index 8ddaf0f79c..8619a48661 100644 --- a/algorithms/src/polycommit/kzg10/mod.rs +++ b/algorithms/src/polycommit/kzg10/mod.rs @@ -24,7 +24,7 @@ use crate::{ msm::VariableBase, polycommit::PCError, }; -use anyhow::anyhow; +use anyhow::{anyhow, ensure, Result}; use snarkvm_curves::traits::{AffineCurve, PairingCurve, PairingEngine, ProjectiveCurve}; use snarkvm_fields::{One, PrimeField, Zero}; use snarkvm_utilities::{cfg_iter, cfg_iter_mut, rand::Uniform, BitIteratorBE}; @@ -276,7 +276,7 @@ impl KZG10 { evaluations: &[E::Fr], point: E::Fr, evaluation_at_point: E::Fr, - ) -> Result, PCError> { + ) -> Result> { Self::check_degree_is_too_large(evaluations.len() - 1, lagrange_basis.size())?; // Ensure that the point is not in the domain if lagrange_basis.domain.evaluate_vanishing_polynomial(point).is_zero() { @@ -290,6 +290,7 @@ impl KZG10 { let mut divisor_evals = cfg_iter!(domain_elements).map(|&e| e - point).collect::>(); snarkvm_fields::batch_inversion(&mut divisor_evals); + ensure!(divisor_evals.len() == evaluations.len()); cfg_iter_mut!(divisor_evals).zip_eq(evaluations).for_each(|(divisor_eval, &eval)| { *divisor_eval *= eval - evaluation_at_point; }); @@ -351,7 +352,7 @@ impl KZG10 { values: &[E::Fr], proofs: &[KZGProof], rng: &mut R, - ) -> Result { + ) -> Result { let check_time = start_timer!(|| format!("Checking {} evaluation proofs", commitments.len())); let g = vk.g.to_projective(); let gamma_g = vk.gamma_g.to_projective(); @@ -365,6 +366,9 @@ impl KZG10 { // their coefficients and perform a final multiplication at the end. let mut g_multiplier = E::Fr::zero(); let mut gamma_g_multiplier = E::Fr::zero(); + ensure!(commitments.len() == points.len()); + ensure!(commitments.len() == values.len()); + ensure!(commitments.len() == proofs.len()); for (((c, z), v), proof) in commitments.iter().zip_eq(points).zip_eq(values).zip_eq(proofs) { let w = proof.w; let mut temp = w.mul(*z); diff --git a/algorithms/src/polycommit/sonic_pc/mod.rs b/algorithms/src/polycommit/sonic_pc/mod.rs index 8cd6d55644..3b0129f61c 100644 --- a/algorithms/src/polycommit/sonic_pc/mod.rs +++ b/algorithms/src/polycommit/sonic_pc/mod.rs @@ -24,7 +24,7 @@ use itertools::Itertools; use snarkvm_curves::traits::{AffineCurve, PairingCurve, PairingEngine, ProjectiveCurve}; use snarkvm_fields::{One, Zero}; -use anyhow::{bail, Result}; +use anyhow::{bail, ensure, Result}; use core::{convert::TryInto, marker::PhantomData, ops::Mul}; use rand_core::{RngCore, SeedableRng}; use std::{ @@ -211,7 +211,7 @@ impl> SonicKZG10 { )); let (comm, rand) = p - .sum() + .sum()? .map(move |p| { let rng_ref = rng.as_mut().map(|s| s as _); match p { @@ -266,14 +266,15 @@ impl> SonicKZG10 { pub fn combine_for_open<'a>( universal_prover: &UniversalProver, ck: &CommitterUnionKey, - labeled_polynomials: impl IntoIterator>, - rands: impl IntoIterator>, + labeled_polynomials: impl ExactSizeIterator>, + rands: impl ExactSizeIterator>, fs_rng: &mut S, - ) -> Result<(DensePolynomial, Randomness), PCError> + ) -> Result<(DensePolynomial, Randomness)> where Randomness: 'a, Commitment: 'a, { + ensure!(labeled_polynomials.len() == rands.len()); Ok(Self::combine_polynomials(labeled_polynomials.into_iter().zip_eq(rands).map(|(p, r)| { let enforced_degree_bounds: Option<&[usize]> = ck.enforced_degree_bounds.as_deref(); @@ -289,15 +290,16 @@ impl> SonicKZG10 { pub fn batch_open<'a>( universal_prover: &UniversalProver, ck: &CommitterUnionKey, - labeled_polynomials: impl IntoIterator>, + labeled_polynomials: impl ExactSizeIterator>, query_set: &QuerySet, - rands: impl IntoIterator>, + rands: impl ExactSizeIterator>, fs_rng: &mut S, - ) -> Result, PCError> + ) -> Result> where Randomness: 'a, Commitment: 'a, { + ensure!(labeled_polynomials.len() == rands.len()); let poly_rand: HashMap<_, _> = labeled_polynomials.into_iter().zip_eq(rands).map(|(poly, r)| (poly.label(), (poly, r))).collect(); @@ -326,7 +328,8 @@ impl> SonicKZG10 { query_polys.push(*polynomial); query_rands.push(*rand); } - let (polynomial, rand) = Self::combine_for_open(universal_prover, ck, query_polys, query_rands, fs_rng)?; + let (polynomial, rand) = + Self::combine_for_open(universal_prover, ck, query_polys.into_iter(), query_rands.into_iter(), fs_rng)?; let _randomizer = fs_rng.squeeze_short_nonnative_field_element::(); pool.add_job(move || { @@ -336,7 +339,7 @@ impl> SonicKZG10 { proof }); } - let batch_proof = pool.execute_all().into_iter().collect::>().map(BatchProof); + let batch_proof = pool.execute_all().into_iter().collect::>().map(BatchProof).map_err(Into::into); end_timer!(open_time); batch_proof @@ -349,7 +352,7 @@ impl> SonicKZG10 { values: &Evaluations, proof: &BatchProof, fs_rng: &mut S, - ) -> Result + ) -> Result where Commitment: 'a, { @@ -374,6 +377,7 @@ impl> SonicKZG10 { let mut combined_witness = E::G1Projective::zero(); let mut combined_adjusted_witness = E::G1Projective::zero(); + ensure!(query_to_labels_map.len() == proof.0.len()); for ((_query_name, (query, labels)), p) in query_to_labels_map.into_iter().zip_eq(&proof.0) { let mut comms_to_combine: Vec<&'_ LabeledCommitment<_>> = Vec::new(); let mut values_to_combine = Vec::new(); @@ -400,14 +404,14 @@ impl> SonicKZG10 { p, Some(randomizer), fs_rng, - ); + )?; randomizer = fs_rng.squeeze_short_nonnative_field_element::(); } let result = Self::check_elems(vk, combined_comms, combined_witness, combined_adjusted_witness); end_timer!(batch_check_time); - result + result.map_err(Into::into) } pub fn open_combinations<'a>( @@ -418,7 +422,7 @@ impl> SonicKZG10 { rands: impl IntoIterator>, query_set: &QuerySet, fs_rng: &mut S, - ) -> Result, PCError> + ) -> Result> where Randomness: 'a, Commitment: 'a, @@ -445,7 +449,7 @@ impl> SonicKZG10 { label_map.get(label as &str).ok_or(PCError::MissingPolynomial { label: label.to_string() })?; if let Some(cur_degree_bound) = cur_poly.degree_bound() { if num_polys != 1 { - return Err(PCError::EquationHasDegreeBounds(lc_label)); + bail!(PCError::EquationHasDegreeBounds(lc_label)); } assert!(coeff.is_one(), "Coefficient must be one for degree-bounded equations"); if let Some(old_degree_bound) = degree_bound { @@ -482,7 +486,7 @@ impl> SonicKZG10 { evaluations: &Evaluations, proof: &BatchLCProof, fs_rng: &mut S, - ) -> Result + ) -> Result where Commitment: 'a, { @@ -516,7 +520,7 @@ impl> SonicKZG10 { if cur_comm.degree_bound().is_some() { if num_polys != 1 || !coeff.is_one() { - return Err(PCError::EquationHasDegreeBounds(lc_label)); + bail!(PCError::EquationHasDegreeBounds(lc_label)); } degree_bound = cur_comm.degree_bound(); } @@ -532,6 +536,7 @@ impl> SonicKZG10 { let combined_comms_norm_time = start_timer!(|| "Normalizing commitments"); let comms = Self::normalize_commitments(lc_commitments); + ensure!(lc_info.len() == comms.len()); let lc_commitments = lc_info .into_iter() .zip_eq(comms) @@ -570,7 +575,7 @@ impl> SonicKZG10 { VariableBase::msm(&bases, &scalars) } - fn normalize_commitments(commitments: Vec) -> impl Iterator> { + fn normalize_commitments(commitments: Vec) -> impl ExactSizeIterator> { let comms = E::G1Projective::batch_normalization_into_affine(commitments); comms.into_iter().map(|c| kzg10::KZGCommitment(c)) } @@ -583,18 +588,19 @@ impl> SonicKZG10 { combined_witness: &mut E::G1Projective, combined_adjusted_witness: &mut E::G1Projective, vk: &UniversalVerifier, - commitments: impl IntoIterator>>, + commitments: impl ExactSizeIterator>>, point: E::Fr, - values: impl IntoIterator, + values: impl ExactSizeIterator, proof: &kzg10::KZGProof, randomizer: Option, fs_rng: &mut S, - ) { + ) -> Result<()> { let acc_time = start_timer!(|| "Accumulating elements"); // Keeps track of running combination of values let mut combined_values = E::Fr::zero(); // Iterates through all of the commitments and accumulates common degree_bound elements in a BTreeMap + ensure!(commitments.len() == values.len()); for (labeled_comm, value) in commitments.into_iter().zip_eq(values) { let acc_timer = start_timer!(|| format!("Accumulating {}", labeled_comm.label())); let curr_challenge = fs_rng.squeeze_short_nonnative_field_element::(); @@ -629,6 +635,7 @@ impl> SonicKZG10 { let coeffs = coeffs.into_iter().map(|c| c.into()).collect::>(); *combined_adjusted_witness += VariableBase::msm(&bases, &coeffs); end_timer!(acc_time); + Ok(()) } fn check_elems( @@ -636,7 +643,7 @@ impl> SonicKZG10 { combined_comms: BTreeMap, E::G1Projective>, combined_witness: E::G1Projective, combined_adjusted_witness: E::G1Projective, - ) -> Result { + ) -> Result { let check_time = start_timer!(|| "Checking elems"); let mut g1_projective_elems = Vec::with_capacity(combined_comms.len() + 2); let mut g2_prepared_elems = Vec::with_capacity(combined_comms.len() + 2); @@ -667,6 +674,7 @@ impl> SonicKZG10 { .map(|a| a.prepare()) .collect::>(); + ensure!(g1_prepared_elems_iter.len() == g2_prepared_elems.len()); let g1_g2_prepared = g1_prepared_elems_iter.iter().zip_eq(g2_prepared_elems.iter()); let is_one: bool = E::product_of_pairings(g1_g2_prepared).is_one(); end_timer!(check_time); diff --git a/algorithms/src/polycommit/sonic_pc/polynomial.rs b/algorithms/src/polycommit/sonic_pc/polynomial.rs index 4d23d5266a..52daace056 100644 --- a/algorithms/src/polycommit/sonic_pc/polynomial.rs +++ b/algorithms/src/polycommit/sonic_pc/polynomial.rs @@ -14,6 +14,7 @@ use super::PolynomialLabel; use crate::fft::{DensePolynomial, EvaluationDomain, Evaluations as EvaluationsOnDomain, Polynomial, SparsePolynomial}; +use anyhow::{ensure, Result}; use snarkvm_fields::{Field, PrimeField}; use snarkvm_utilities::{cfg_iter, cfg_iter_mut, CanonicalDeserialize, CanonicalSerialize}; @@ -215,9 +216,9 @@ impl<'a, F: PrimeField> LabeledPolynomialWithBasis<'a, F> { /// Compute a linear combination of the terms in `self.polynomial`, producing an iterator /// over polynomials of the same time. - pub fn sum(&self) -> impl Iterator> { + pub fn sum(&self) -> Result>> { if self.polynomial.len() == 1 && self.polynomial[0].0.is_one() { - vec![self.polynomial[0].1.clone()].into_iter() + Ok(vec![self.polynomial[0].1.clone()].into_iter()) } else { use PolynomialWithBasis::*; let mut lagrange_polys = HashMap::>::new(); @@ -249,6 +250,7 @@ impl<'a, F: PrimeField> LabeledPolynomialWithBasis<'a, F> { Lagrange { evaluations } => { let domain = evaluations.domain().size(); if let Some(e) = lagrange_polys.get_mut(&domain) { + ensure!(e.len() == evaluations.evaluations.len()); cfg_iter_mut!(e).zip_eq(&evaluations.evaluations).for_each(|(e, f)| *e += *c * f) } else { let mut e = evaluations.clone().into_owned().evaluations; @@ -260,7 +262,7 @@ impl<'a, F: PrimeField> LabeledPolynomialWithBasis<'a, F> { } let sparse_poly = Polynomial::from(sparse_poly); let sparse_poly = Monomial { polynomial: Cow::Owned(sparse_poly), degree_bound: None }; - lagrange_polys + Ok(lagrange_polys .into_iter() .map(|(k, v)| { let domain = EvaluationDomain::new(k).unwrap(); @@ -273,7 +275,7 @@ impl<'a, F: PrimeField> LabeledPolynomialWithBasis<'a, F> { }) .chain([sparse_poly]) .collect::>() - .into_iter() + .into_iter()) } } diff --git a/algorithms/src/polycommit/test_templates.rs b/algorithms/src/polycommit/test_templates.rs index e251db6ebc..5664111254 100644 --- a/algorithms/src/polycommit/test_templates.rs +++ b/algorithms/src/polycommit/test_templates.rs @@ -113,8 +113,14 @@ pub fn bad_degree_bound_test>() - println!("Generated query set"); let mut sponge_for_open = S::new(); - let proof = - SonicKZG10::batch_open(universal_prover, &ck, &polynomials, &query_set, &rands, &mut sponge_for_open)?; + let proof = SonicKZG10::batch_open( + universal_prover, + &ck, + polynomials.iter(), + &query_set, + rands.iter(), + &mut sponge_for_open, + )?; let mut sponge_for_check = S::new(); let result = SonicKZG10::batch_check(&vk, &comms, &query_set, &values, &proof, &mut sponge_for_check)?; assert!(result, "proof was incorrect, Query set: {query_set:#?}"); @@ -203,8 +209,14 @@ pub fn lagrange_test_template>() println!("Generated query set"); let mut sponge_for_open = S::new(); - let proof = - SonicKZG10::batch_open(universal_prover, &ck, &polynomials, &query_set, &rands, &mut sponge_for_open)?; + let proof = SonicKZG10::batch_open( + universal_prover, + &ck, + polynomials.iter(), + &query_set, + rands.iter(), + &mut sponge_for_open, + )?; let mut sponge_for_check = S::new(); let result = SonicKZG10::batch_check(&vk, &comms, &query_set, &values, &proof, &mut sponge_for_check)?; if !result { @@ -327,8 +339,14 @@ where println!("Generated query set"); let mut sponge_for_open = S::new(); - let proof = - SonicKZG10::batch_open(universal_prover, &ck, &polynomials, &query_set, &rands, &mut sponge_for_open)?; + let proof = SonicKZG10::batch_open( + universal_prover, + &ck, + polynomials.iter(), + &query_set, + rands.iter(), + &mut sponge_for_open, + )?; let mut sponge_for_check = S::new(); let result = SonicKZG10::batch_check(&vk, &comms, &query_set, &values, &proof, &mut sponge_for_check)?; if !result { diff --git a/algorithms/src/snark/varuna/ahp/ahp.rs b/algorithms/src/snark/varuna/ahp/ahp.rs index 4539531b68..7bce137620 100644 --- a/algorithms/src/snark/varuna/ahp/ahp.rs +++ b/algorithms/src/snark/varuna/ahp/ahp.rs @@ -359,6 +359,9 @@ impl AHPForR1CS { let non_zero_domains = [&state_i.non_zero_a_domain, &state_i.non_zero_b_domain, &state_i.non_zero_c_domain]; let sums = sums_fourth_msg[i].iter(); + ensure!(matrices.len() == sums.len()); + ensure!(matrices.len() == deltas.len()); + ensure!(matrices.len() == non_zero_domains.len()); for (((m, sum), delta), non_zero_domain) in matrices.into_iter().zip_eq(sums).zip_eq(deltas).zip_eq(non_zero_domains) { diff --git a/algorithms/src/snark/varuna/ahp/indexer/circuit.rs b/algorithms/src/snark/varuna/ahp/indexer/circuit.rs index 5bb6fae41b..89d4816369 100644 --- a/algorithms/src/snark/varuna/ahp/indexer/circuit.rs +++ b/algorithms/src/snark/varuna/ahp/indexer/circuit.rs @@ -139,12 +139,11 @@ impl Circuit { } pub fn interpolate_matrix_evals(&self) -> Result>> { - Ok([("a", &self.a_arith), ("b", &self.b_arith), ("c", &self.c_arith)] - .into_iter() - .map(|(label, evals)| MatrixArithmetization::new(&self.id, label, evals)) - .collect::, _>>()? - .into_iter() - .flat_map(|arith| arith.into_iter())) + let mut iters = Vec::with_capacity(3); + for (label, evals) in [("a", &self.a_arith), ("b", &self.b_arith), ("c", &self.c_arith)] { + iters.push(MatrixArithmetization::new(&self.id, label, evals)?.into_iter()); + } + Ok(iters.into_iter().flatten()) } /// After indexing, we drop these evaluations to save space in the ProvingKey. diff --git a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs index e29d023773..ec98aabd2f 100644 --- a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs +++ b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs @@ -19,7 +19,6 @@ use crate::{ snark::varuna::{ ahp::{ indexer::{Circuit, CircuitId, CircuitInfo, ConstraintSystem as IndexerConstraintSystem}, - AHPError, AHPForR1CS, }, matrices::{matrix_evals, MatrixEvals}, @@ -30,7 +29,7 @@ use crate::{ use snarkvm_fields::PrimeField; use snarkvm_utilities::cfg_into_iter; -use anyhow::{anyhow, Result}; +use anyhow::{anyhow, ensure, Result}; use core::marker::PhantomData; use itertools::Itertools; use std::collections::BTreeMap; @@ -105,7 +104,7 @@ impl AHPForR1CS { pub fn index_polynomial_labels<'a>( matrices: &'a [&str], ids: impl Iterator + 'a, - ) -> impl Iterator + 'a { + ) -> Vec { ids.flat_map(move |id| { matrices.iter().flat_map(move |matrix| { [ @@ -116,6 +115,7 @@ impl AHPForR1CS { ] }) }) + .collect_vec() } /// Generate the indexed circuit evaluations for this constraint system. @@ -228,23 +228,21 @@ impl AHPForR1CS { state: IndexerState, id: &CircuitId, point: F, - ) -> Result, AHPError> { - let labels = [["a"], ["b"], ["c"]]; - let mut evals = [ - (state.a_arith, state.non_zero_a_domain), - (state.b_arith, state.non_zero_b_domain), - (state.c_arith, state.non_zero_c_domain), - ] - .into_iter() - .zip_eq(&labels) - .flat_map(|((evals, domain), label)| { + ) -> Result> { + let mut all_evals = Vec::with_capacity(12); + for (evals, domain, label) in [ + (state.a_arith, state.non_zero_a_domain, &["a"]), + (state.b_arith, state.non_zero_b_domain, &["b"]), + (state.c_arith, state.non_zero_c_domain, &["c"]), + ] { let labels = Self::index_polynomial_labels(label, std::iter::once(id)); let lagrange_coefficients_at_point = domain.evaluate_all_lagrange_coefficients(point); - labels.zip_eq(evals.evaluate(&lagrange_coefficients_at_point).unwrap()) - }) - .collect::>(); - evals.sort_by(|(l1, _), (l2, _)| l1.cmp(l2)); - Ok(evals.into_iter().map(|(_, eval)| eval)) + let evals_at_point = evals.evaluate(&lagrange_coefficients_at_point)?; + ensure!(labels.len() == evals_at_point.len()); + all_evals.extend(labels.into_iter().zip_eq(evals_at_point.into_iter())); + } + all_evals.sort_by(|(l1, _), (l2, _)| l1.cmp(l2)); + Ok(all_evals.into_iter().map(|(_, eval)| eval)) } } diff --git a/algorithms/src/snark/varuna/ahp/matrices.rs b/algorithms/src/snark/varuna/ahp/matrices.rs index 2f998f556b..733548a106 100644 --- a/algorithms/src/snark/varuna/ahp/matrices.rs +++ b/algorithms/src/snark/varuna/ahp/matrices.rs @@ -213,6 +213,7 @@ impl MatrixArithmetization { let row_col = if let Some(row_col) = matrix_evals.row_col.as_ref() { row_col.clone().interpolate() } else { + ensure!(matrix_evals.row.evaluations.len() == matrix_evals.col.evaluations.len()); let row_col_evals: Vec = cfg_iter!(matrix_evals.row.evaluations) .zip_eq(&matrix_evals.col.evaluations) .map(|(&r, &c)| r * c) @@ -224,17 +225,18 @@ impl MatrixArithmetization { let label = &[label]; let mut labels = AHPForR1CS::::index_polynomial_labels(label, std::iter::once(id)); + ensure!(labels.len() == 4); Ok(MatrixArithmetization { - row: LabeledPolynomial::new(labels.next().unwrap(), row, None, None), - col: LabeledPolynomial::new(labels.next().unwrap(), col, None, None), - row_col: LabeledPolynomial::new(labels.next().unwrap(), row_col, None, None), - row_col_val: LabeledPolynomial::new(labels.next().unwrap(), row_col_val, None, None), + row_col_val: LabeledPolynomial::new(labels.pop().unwrap(), row_col_val, None, None), + row_col: LabeledPolynomial::new(labels.pop().unwrap(), row_col, None, None), + col: LabeledPolynomial::new(labels.pop().unwrap(), col, None, None), + row: LabeledPolynomial::new(labels.pop().unwrap(), row, None, None), }) } /// Iterate over the indexed polynomials. - pub fn into_iter(self) -> impl Iterator> { + pub fn into_iter(self) -> impl ExactSizeIterator> { // Alphabetical order [self.col, self.row, self.row_col, self.row_col_val].into_iter() } diff --git a/algorithms/src/snark/varuna/ahp/prover/message.rs b/algorithms/src/snark/varuna/ahp/prover/message.rs index 098bbc76ba..c13ed2fc26 100644 --- a/algorithms/src/snark/varuna/ahp/prover/message.rs +++ b/algorithms/src/snark/varuna/ahp/prover/message.rs @@ -27,7 +27,7 @@ pub struct MatrixSums { impl MatrixSums { /// Iterate over the sums - pub fn iter(&self) -> impl Iterator { + pub fn iter(&self) -> impl ExactSizeIterator { [self.sum_a, self.sum_b, self.sum_c].into_iter() } } diff --git a/algorithms/src/snark/varuna/varuna.rs b/algorithms/src/snark/varuna/varuna.rs index dfcce3877c..7705a5aaf1 100644 --- a/algorithms/src/snark/varuna/varuna.rs +++ b/algorithms/src/snark/varuna/varuna.rs @@ -310,11 +310,14 @@ where let evaluations_at_point = AHPForR1CS::::evaluate_index_polynomials(state, circuit_id, point)?; let mut lc = crate::polycommit::sonic_pc::LinearCombination::empty("circuit_check"); let mut evaluation = E::Fr::zero(); + ensure!(poly_info.len() == challenges.len() + 1); + ensure!(poly_info.len() == evaluations_at_point.len()); for ((label, &c), eval) in poly_info.keys().zip_eq(linear_combination_challenges).zip_eq(evaluations_at_point) { lc.add(c, label.as_str()); evaluation += c * eval; } + ensure!(verifying_key.circuit_commitments.len() == poly_info.len()); let commitments = verifying_key .iter() .cloned() @@ -843,10 +846,11 @@ where // correct degree. // Gather commitments in one vector. + let poly_infos = AHPForR1CS::::index_polynomial_info(circuit_ids.iter()); let commitments: Vec<_> = circuit_commitments .into_iter() .flatten() - .zip_eq(AHPForR1CS::::index_polynomial_info(circuit_ids.iter()).values()) + .zip_eq(poly_infos.values()) .map(|(c, info)| LabeledCommitment::new_with_info(info, *c)) .chain(first_commitments) .chain(second_commitments) diff --git a/ledger/coinbase/src/lib.rs b/ledger/coinbase/src/lib.rs index eacb8c7790..acbeb21ff0 100644 --- a/ledger/coinbase/src/lib.rs +++ b/ledger/coinbase/src/lib.rs @@ -125,7 +125,7 @@ impl CoinbasePuzzle { let product_evaluations = pk.product_domain.mul_polynomials_in_evaluation_domain( polynomial_evaluations, &epoch_challenge.epoch_polynomial_evaluations().evaluations, - ); + )?; product_evaluations }; let (commitment, _rand) = KZG10::commit_lagrange(&pk.lagrange_basis(), &product_evaluations, None, None)?; From 3de2343804fac60081621d7fb779087e0bfb14a2 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 26 Nov 2023 11:15:35 -0800 Subject: [PATCH 203/339] Encodes the last committed certificate IDs into the header --- ledger/narwhal/batch-header/src/bytes.rs | 54 +++++++++++- ledger/narwhal/batch-header/src/lib.rs | 91 ++++++++++++++++++-- ledger/narwhal/batch-header/src/serialize.rs | 23 ++++- ledger/narwhal/batch-header/src/to_id.rs | 15 ++++ 4 files changed, 169 insertions(+), 14 deletions(-) diff --git a/ledger/narwhal/batch-header/src/bytes.rs b/ledger/narwhal/batch-header/src/bytes.rs index 386ee958d3..30e136a542 100644 --- a/ledger/narwhal/batch-header/src/bytes.rs +++ b/ledger/narwhal/batch-header/src/bytes.rs @@ -20,7 +20,7 @@ impl FromBytes for BatchHeader { // Read the version. let version = u8::read_le(&mut reader)?; // Ensure the version is valid. - if version != 1 { + if version != 1 && version != 2 { return Err(error("Invalid batch header version")); } @@ -65,12 +65,44 @@ impl FromBytes for BatchHeader { previous_certificate_ids.insert(Field::read_le(&mut reader)?); } + // TODO (howardwu): For mainnet - Change this to always encode the number of committed certificate IDs. + // We currently only encode the size and certificates only in the new version, for backwards compatibility. + let num_last_committed_certificate_ids = if version == 2 { + // Read the number of last committed certificate IDs. + u16::read_le(&mut reader)? + } else { + // Set the number of last committed certificate IDs to zero. + 0 + }; + // Ensure the number of last committed certificate IDs is within bounds. + if num_last_committed_certificate_ids as usize > Self::MAX_CERTIFICATES { + return Err(error(format!( + "Number of last committed certificate IDs ({num_last_committed_certificate_ids}) exceeds the maximum ({})", + Self::MAX_CERTIFICATES + ))); + } + // Read the last committed certificate IDs. + let mut last_committed_certificate_ids = IndexSet::new(); + for _ in 0..num_last_committed_certificate_ids { + // Read the certificate ID. + last_committed_certificate_ids.insert(Field::read_le(&mut reader)?); + } + // Read the signature. let signature = Signature::read_le(&mut reader)?; // Construct the batch. - let batch = Self::from(author, round, timestamp, transmission_ids, previous_certificate_ids, signature) - .map_err(|e| error(e.to_string()))?; + let batch = Self::from( + version, + author, + round, + timestamp, + transmission_ids, + previous_certificate_ids, + last_committed_certificate_ids, + signature, + ) + .map_err(|e| error(e.to_string()))?; // Return the batch. match batch.batch_id == batch_id { @@ -84,7 +116,8 @@ impl ToBytes for BatchHeader { /// Writes the batch header to the buffer. fn write_le(&self, mut writer: W) -> IoResult<()> { // Write the version. - 1u8.write_le(&mut writer)?; + // TODO (howardwu): For mainnet - Change this back to '1u8.write_le(&mut writer)?'; + self.version.write_le(&mut writer)?; // Write the batch ID. self.batch_id.write_le(&mut writer)?; // Write the author. @@ -107,6 +140,19 @@ impl ToBytes for BatchHeader { // Write the certificate ID. certificate_id.write_le(&mut writer)?; } + // TODO (howardwu): For mainnet - Change this to always encode the number of committed certificate IDs. + // We currently only encode the size and certificates only in the new version, for backwards compatibility. + if self.version != 1 { + // Write the number of last committed certificate IDs. + u16::try_from(self.last_committed_certificate_ids.len()) + .map_err(|e| error(e.to_string()))? + .write_le(&mut writer)?; + // Write the last committed certificate IDs. + for certificate_id in &self.last_committed_certificate_ids { + // Write the certificate ID. + certificate_id.write_le(&mut writer)?; + } + } // Write the signature. self.signature.write_le(&mut writer) } diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index 3801498a30..e562906925 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -14,6 +14,7 @@ #![forbid(unsafe_code)] #![warn(clippy::cast_possible_truncation)] +#![allow(clippy::too_many_arguments)] mod bytes; mod serialize; @@ -30,6 +31,10 @@ use narwhal_transmission_id::TransmissionID; #[derive(Clone, PartialEq, Eq)] pub struct BatchHeader { + /// The version of the batch header. + /// TODO (howardwu): For mainnet - Remove this version from the struct, we only use it here for backwards compatibility. + /// NOTE: You must keep the version encoding in the byte serialization, just remove it from the struct in memory. + version: u8, /// The batch ID, defined as the hash of the round number, timestamp, transmission IDs, and previous batch certificate IDs. batch_id: Field, /// The author of the batch. @@ -42,6 +47,8 @@ pub struct BatchHeader { transmission_ids: IndexSet>, /// The batch certificate IDs of the previous round. previous_certificate_ids: IndexSet>, + /// The last committed batch certificate IDs. + last_committed_certificate_ids: IndexSet>, /// The signature of the batch ID from the creator. signature: Signature, } @@ -60,52 +67,100 @@ impl BatchHeader { impl BatchHeader { /// Initializes a new batch header. pub fn new( + version: u8, private_key: &PrivateKey, round: u64, timestamp: i64, transmission_ids: IndexSet>, previous_certificate_ids: IndexSet>, + last_committed_certificate_ids: IndexSet>, rng: &mut R, ) -> Result { match round { - // If the round is zero or one, then there should be no previous certificate IDs. - 0 | 1 => ensure!(previous_certificate_ids.is_empty(), "Invalid round number, must not have certificates"), + 0 | 1 => { + // If the round is zero or one, then there should be no previous certificate IDs. + ensure!(previous_certificate_ids.is_empty(), "Invalid round number, must not have certificates"); + // If the round is zero or one, then there should be no last committed certificate IDs. + ensure!(last_committed_certificate_ids.is_empty(), "Invalid batch, contains committed certificates"); + } // If the round is not zero and not one, then there should be at least one previous certificate ID. _ => ensure!(!previous_certificate_ids.is_empty(), "Invalid round number, must have certificates"), } // Retrieve the address. let author = Address::try_from(private_key)?; // Compute the batch ID. - let batch_id = Self::compute_batch_id(author, round, timestamp, &transmission_ids, &previous_certificate_ids)?; + let batch_id = Self::compute_batch_id( + version, + author, + round, + timestamp, + &transmission_ids, + &previous_certificate_ids, + &last_committed_certificate_ids, + )?; // Sign the preimage. let signature = private_key.sign(&[batch_id], rng)?; // Return the batch header. - Ok(Self { author, batch_id, round, timestamp, transmission_ids, previous_certificate_ids, signature }) + Ok(Self { + version, + author, + batch_id, + round, + timestamp, + transmission_ids, + previous_certificate_ids, + last_committed_certificate_ids, + signature, + }) } /// Initializes a new batch header. pub fn from( + version: u8, author: Address, round: u64, timestamp: i64, transmission_ids: IndexSet>, previous_certificate_ids: IndexSet>, + last_committed_certificate_ids: IndexSet>, signature: Signature, ) -> Result { match round { - // If the round is zero or one, then there should be no previous certificate IDs. - 0 | 1 => ensure!(previous_certificate_ids.is_empty(), "Invalid round number, must not have certificates"), + 0 | 1 => { + // If the round is zero or one, then there should be no previous certificate IDs. + ensure!(previous_certificate_ids.is_empty(), "Invalid round number, must not have certificates"); + // If the round is zero or one, then there should be no last committed certificate IDs. + ensure!(last_committed_certificate_ids.is_empty(), "Invalid batch, contains committed certificates"); + } // If the round is not zero and not one, then there should be at least one previous certificate ID. _ => ensure!(!previous_certificate_ids.is_empty(), "Invalid round number, must have certificates"), } // Compute the batch ID. - let batch_id = Self::compute_batch_id(author, round, timestamp, &transmission_ids, &previous_certificate_ids)?; + let batch_id = Self::compute_batch_id( + version, + author, + round, + timestamp, + &transmission_ids, + &previous_certificate_ids, + &last_committed_certificate_ids, + )?; // Verify the signature. if !signature.verify(&author, &[batch_id]) { bail!("Invalid signature for the batch header"); } // Return the batch header. - Ok(Self { author, batch_id, round, timestamp, transmission_ids, previous_certificate_ids, signature }) + Ok(Self { + version, + author, + batch_id, + round, + timestamp, + transmission_ids, + previous_certificate_ids, + last_committed_certificate_ids, + signature, + }) } } @@ -140,6 +195,11 @@ impl BatchHeader { &self.previous_certificate_ids } + /// Returns the last committed batch certificate IDs. + pub const fn last_committed_certificate_ids(&self) -> &IndexSet> { + &self.last_committed_certificate_ids + } + /// Returns the signature. pub const fn signature(&self) -> &Signature { &self.signature @@ -198,8 +258,21 @@ pub mod test_helpers { narwhal_transmission_id::test_helpers::sample_transmission_ids(rng).into_iter().collect::>(); // Checkpoint the timestamp for the batch. let timestamp = OffsetDateTime::now_utc().unix_timestamp(); + // Sample the last committed certificate IDs. + let last_committed_certificate_ids = + (0..5).map(|_| Field::::rand(rng)).collect::>(); // Return the batch header. - BatchHeader::new(&private_key, round, timestamp, transmission_ids, previous_certificate_ids, rng).unwrap() + BatchHeader::new( + 2, // version + &private_key, + round, + timestamp, + transmission_ids, + previous_certificate_ids, + last_committed_certificate_ids, + rng, + ) + .unwrap() } /// Returns a list of sample batch headers, sampled at random. diff --git a/ledger/narwhal/batch-header/src/serialize.rs b/ledger/narwhal/batch-header/src/serialize.rs index 6acddaead2..dbf719eb0e 100644 --- a/ledger/narwhal/batch-header/src/serialize.rs +++ b/ledger/narwhal/batch-header/src/serialize.rs @@ -19,13 +19,16 @@ impl Serialize for BatchHeader { fn serialize(&self, serializer: S) -> Result { match serializer.is_human_readable() { true => { - let mut header = serializer.serialize_struct("BatchHeader", 7)?; + let mut header = serializer.serialize_struct("BatchHeader", 9)?; + // TODO (howardwu): For mainnet - Remove the version field, and update the 'len' above to 8. + header.serialize_field("version", &self.version)?; header.serialize_field("batch_id", &self.batch_id)?; header.serialize_field("author", &self.author)?; header.serialize_field("round", &self.round)?; header.serialize_field("timestamp", &self.timestamp)?; header.serialize_field("transmission_ids", &self.transmission_ids)?; header.serialize_field("previous_certificate_ids", &self.previous_certificate_ids)?; + header.serialize_field("last_committed_certificate_ids", &self.last_committed_certificate_ids)?; header.serialize_field("signature", &self.signature)?; header.end() } @@ -42,13 +45,31 @@ impl<'de, N: Network> Deserialize<'de> for BatchHeader { let mut header = serde_json::Value::deserialize(deserializer)?; let batch_id: Field = DeserializeExt::take_from_value::(&mut header, "batch_id")?; + // TODO (howardwu): For mainnet - Remove the version parsing. + // If the version field is present, then parse the version. + let version = DeserializeExt::take_from_value::(&mut header, "version").unwrap_or(1); + // TODO (howardwu): For mainnet - Remove the version checking. + // Ensure the version is valid. + if version != 1 && version != 2 { + return Err(error("Invalid batch header version")).map_err(de::Error::custom); + } + // TODO (howardwu): For mainnet - Always take from the 'header', no need to use this match case anymore. + // If the version is not 1, then parse the last committed certificate IDs. + let last_committed_certificate_ids = match version { + 1 => IndexSet::new(), + 2 => DeserializeExt::take_from_value::(&mut header, "last_committed_certificate_ids")?, + _ => unreachable!(), + }; + // Recover the header. let batch_header = Self::from( + version, DeserializeExt::take_from_value::(&mut header, "author")?, DeserializeExt::take_from_value::(&mut header, "round")?, DeserializeExt::take_from_value::(&mut header, "timestamp")?, DeserializeExt::take_from_value::(&mut header, "transmission_ids")?, DeserializeExt::take_from_value::(&mut header, "previous_certificate_ids")?, + last_committed_certificate_ids, DeserializeExt::take_from_value::(&mut header, "signature")?, ) .map_err(de::Error::custom)?; diff --git a/ledger/narwhal/batch-header/src/to_id.rs b/ledger/narwhal/batch-header/src/to_id.rs index 1d99cbda77..0fe74bd547 100644 --- a/ledger/narwhal/batch-header/src/to_id.rs +++ b/ledger/narwhal/batch-header/src/to_id.rs @@ -18,11 +18,13 @@ impl BatchHeader { /// Returns the batch ID. pub fn to_id(&self) -> Result> { Self::compute_batch_id( + self.version, self.author, self.round, self.timestamp, &self.transmission_ids, &self.previous_certificate_ids, + &self.last_committed_certificate_ids, ) } } @@ -30,11 +32,13 @@ impl BatchHeader { impl BatchHeader { /// Returns the batch ID. pub fn compute_batch_id( + version: u8, author: Address, round: u64, timestamp: i64, transmission_ids: &IndexSet>, previous_certificate_ids: &IndexSet>, + last_committed_certificate_ids: &IndexSet>, ) -> Result> { let mut preimage = Vec::new(); // Insert the author. @@ -56,6 +60,17 @@ impl BatchHeader { // Insert the certificate ID. certificate_id.write_le(&mut preimage)?; } + // TODO (howardwu): For mainnet - Change this to always encode the number of committed certificate IDs. + // We currently only encode the size and certificates only in the new version, for backwards compatibility. + if version != 1 { + // Insert the number of last committed certificate IDs. + u32::try_from(last_committed_certificate_ids.len())?.write_le(&mut preimage)?; + // Insert the last committed certificate IDs. + for certificate_id in last_committed_certificate_ids { + // Insert the certificate ID. + certificate_id.write_le(&mut preimage)?; + } + } // Hash the preimage. N::hash_bhp1024(&preimage.to_bits_le()) } From 94077e7c0aa9c01c0c74b81ef5c84b28475880c2 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Sun, 26 Nov 2023 20:19:38 +0100 Subject: [PATCH 204/339] Remove unused Result --- algorithms/src/fft/evaluations.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/algorithms/src/fft/evaluations.rs b/algorithms/src/fft/evaluations.rs index bde5189b45..f58925a02a 100644 --- a/algorithms/src/fft/evaluations.rs +++ b/algorithms/src/fft/evaluations.rs @@ -15,7 +15,6 @@ //! A polynomial represented in evaluations form. use crate::fft::{DensePolynomial, EvaluationDomain}; -use anyhow::Result; #[cfg(feature = "serial")] use itertools::Itertools; #[cfg(not(feature = "serial"))] From 93c20b933cf950577b49b81e4c35c95f553dd621 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 26 Nov 2023 14:35:47 -0800 Subject: [PATCH 205/339] Update version, add license and readme --- Cargo.toml | 2 +- ledger/committee/Cargo.toml | 2 +- metrics/Cargo.toml | 2 +- metrics/LICENSE.md | 194 ++++++++++++++++++++++++++++++++++++ metrics/README.md | 5 + metrics/src/lib.rs | 2 +- 6 files changed, 203 insertions(+), 4 deletions(-) create mode 100644 metrics/LICENSE.md create mode 100644 metrics/README.md diff --git a/Cargo.toml b/Cargo.toml index da33b6f438..5a135ade1a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -179,7 +179,7 @@ optional = true [dependencies.snarkvm-metrics] path = "./metrics" -version = "=0.15.4" +version = "=0.16.11" optional = true [dependencies.snarkvm-parameters] diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index 3ee051f876..d749af9b6d 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -39,7 +39,7 @@ version = "=0.16.11" [dependencies.snarkvm-metrics] package = "snarkvm-metrics" path = "../../metrics" -version = "=0.15.4" +version = "=0.16.11" optional = true [dependencies.indexmap] diff --git a/metrics/Cargo.toml b/metrics/Cargo.toml index 42df0e2725..8b240b78c0 100644 --- a/metrics/Cargo.toml +++ b/metrics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-metrics" -version = "0.15.4" +version = "0.16.11" authors = [ "The Aleo Team " ] description = "Metrics for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/metrics/LICENSE.md b/metrics/LICENSE.md new file mode 100644 index 0000000000..d0af96c393 --- /dev/null +++ b/metrics/LICENSE.md @@ -0,0 +1,194 @@ +Apache License +============== + +_Version 2.0, January 2004_ +_<>_ + +### Terms and Conditions for use, reproduction, and distribution + +#### 1. Definitions + +“License” shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +“Licensor” shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +“Legal Entity” shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, “control” means **(i)** the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the +outstanding shares, or **(iii)** beneficial ownership of such entity. + +“You” (or “Your”) shall mean an individual or Legal Entity exercising +permissions granted by this License. + +“Source” form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +“Object” form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +“Work” shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +“Derivative Works” shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +“Contribution” shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +“submitted” means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as “Not a Contribution.” + +“Contributor” shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +#### 2. Grant of Copyright License + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +#### 3. Grant of Patent License + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +#### 4. Redistribution + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +* **(a)** You must give any other recipients of the Work or Derivative Works a copy of +this License; and +* **(b)** You must cause any modified files to carry prominent notices stating that You +changed the files; and +* **(c)** You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. + +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +#### 5. Submission of Contributions + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +#### 6. Trademarks + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +#### 7. Disclaimer of Warranty + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +#### 8. Limitation of Liability + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +#### 9. Accepting Warranty or Additional Liability + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +_END OF TERMS AND CONDITIONS_ + +### APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets `[]` replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same “printed page” as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/metrics/README.md b/metrics/README.md new file mode 100644 index 0000000000..cab86375b3 --- /dev/null +++ b/metrics/README.md @@ -0,0 +1,5 @@ +# snarkvm-metrics + +[![Crates.io](https://img.shields.io/crates/v/snarkvm-metrics.svg?color=neon)](https://crates.io/crates/snarkvm-metrics) +[![Authors](https://img.shields.io/badge/authors-Aleo-orange.svg)](https://aleo.org) +[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](./LICENSE.md) diff --git a/metrics/src/lib.rs b/metrics/src/lib.rs index ff2d098925..f9ee545015 100644 --- a/metrics/src/lib.rs +++ b/metrics/src/lib.rs @@ -18,7 +18,7 @@ pub use metrics::*; pub const GAUGE_NAMES: [&str; 1] = [committee::TOTAL_STAKE]; pub mod committee { - pub const TOTAL_STAKE: &str = "snarkvm_committee_total_stake"; + pub const TOTAL_STAKE: &str = "snarkvm_ledger_committee_total_stake"; } pub fn register_metrics() { From 1cba8fee2dcdc1f0cca1e25a1019d56f6e8c5e82 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 26 Nov 2023 14:49:57 -0800 Subject: [PATCH 206/339] nits --- Cargo.lock | 2 +- Cargo.toml | 2 +- ledger/Cargo.toml | 2 +- ledger/committee/src/lib.rs | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e5e5160358..b740976612 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3346,7 +3346,7 @@ dependencies = [ [[package]] name = "snarkvm-metrics" -version = "0.15.4" +version = "0.16.11" dependencies = [ "metrics", "metrics-exporter-prometheus", diff --git a/Cargo.toml b/Cargo.toml index 5a135ade1a..818e796016 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -141,11 +141,11 @@ console = [ "snarkvm-console" ] curves = [ "snarkvm-curves" ] fields = [ "snarkvm-fields" ] ledger = [ "snarkvm-ledger" ] +metrics = [ "snarkvm-metrics", "snarkvm-ledger/metrics" ] parameters = [ "snarkvm-parameters" ] synthesizer = [ "snarkvm-synthesizer" ] utilities = [ "snarkvm-utilities" ] wasm = [ "snarkvm-wasm" ] -metrics = [ "snarkvm-metrics", "snarkvm-ledger/metrics" ] [dependencies.snarkvm-algorithms] path = "./algorithms" diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index f927542887..88ec19114c 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -33,6 +33,7 @@ async = [ "ledger-query/async", "synthesizer/async" ] +metrics = [ "ledger-committee/metrics" ] rocks = [ "ledger-store/rocks" ] serial = [ "console/serial", @@ -52,7 +53,6 @@ test-helpers = [ "ledger-narwhal/test-helpers" ] timer = [ "aleo-std/timer" ] -metrics = [ "ledger-committee/metrics" ] [dependencies.console] package = "snarkvm-console" diff --git a/ledger/committee/src/lib.rs b/ledger/committee/src/lib.rs index 6ee024badc..26b468dac1 100644 --- a/ledger/committee/src/lib.rs +++ b/ledger/committee/src/lib.rs @@ -26,11 +26,12 @@ use console::{ }; use indexmap::IndexMap; +use std::collections::HashSet; + #[cfg(feature = "metrics")] use metrics::gauge; #[cfg(feature = "metrics")] use snarkvm_metrics::committee::TOTAL_STAKE; -use std::collections::HashSet; /// The minimum amount of stake required for a validator to bond. pub const MIN_VALIDATOR_STAKE: u64 = 1_000_000_000_000u64; // microcredits From efad8ee191dde53838c378f8446e38f71a7c83d8 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 26 Nov 2023 15:05:24 -0800 Subject: [PATCH 207/339] Adds abstraction for gauge metrics --- Cargo.lock | 1 - ledger/committee/Cargo.toml | 24 ++++++++++-------------- ledger/committee/src/lib.rs | 7 +------ metrics/src/lib.rs | 12 ++++++++++-- 4 files changed, 21 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b740976612..a6e59c7edd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3188,7 +3188,6 @@ dependencies = [ "anyhow", "bincode", "indexmap 2.1.0", - "metrics", "parking_lot", "proptest", "rand", diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index d749af9b6d..e1e82f4257 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -27,25 +27,25 @@ edition = "2021" default = [ ] serial = [ "console/serial" ] wasm = [ "console/wasm" ] +metrics = [ "dep:metrics" ] prop-tests = [ "rand", "rand_chacha", "test-strategy", "proptest", "anyhow" ] test-helpers = [ "prop-tests", "rand_distr" ] -metrics = [ "dep:snarkvm-metrics", "dep:metrics" ] [dependencies.console] package = "snarkvm-console" path = "../../console" version = "=0.16.11" -[dependencies.snarkvm-metrics] +[dependencies.indexmap] +version = "2.0" +features = [ "serde", "rayon" ] + +[dependencies.metrics] package = "snarkvm-metrics" path = "../../metrics" version = "=0.16.11" optional = true -[dependencies.indexmap] -version = "2.0" -features = [ "serde", "rayon" ] - [dependencies.serde_json] version = "1.0" features = [ "preserve_order" ] @@ -74,10 +74,6 @@ optional = true version = "0.3.1" optional = true -[dependencies.metrics] -version = "0.21" -optional = true - [dev-dependencies.bincode] version = "1.3" @@ -90,10 +86,10 @@ version = "0.4" [dev-dependencies.rayon] version = "1" -[dev-dependencies.snarkvm-ledger-committee] -path = "." -features = [ "prop-tests" ] - [dev-dependencies.ledger-narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../narwhal/batch-header" + +[dev-dependencies.snarkvm-ledger-committee] +path = "." +features = [ "prop-tests" ] diff --git a/ledger/committee/src/lib.rs b/ledger/committee/src/lib.rs index 26b468dac1..a43b288373 100644 --- a/ledger/committee/src/lib.rs +++ b/ledger/committee/src/lib.rs @@ -28,11 +28,6 @@ use console::{ use indexmap::IndexMap; use std::collections::HashSet; -#[cfg(feature = "metrics")] -use metrics::gauge; -#[cfg(feature = "metrics")] -use snarkvm_metrics::committee::TOTAL_STAKE; - /// The minimum amount of stake required for a validator to bond. pub const MIN_VALIDATOR_STAKE: u64 = 1_000_000_000_000u64; // microcredits /// The minimum amount of stake required for a delegator to bond. @@ -78,7 +73,7 @@ impl Committee { // Compute the total stake of the committee for this round. let total_stake = Self::compute_total_stake(&members)?; #[cfg(feature = "metrics")] - gauge!(TOTAL_STAKE, total_stake as f64); + metrics::gauge(metrics::committee::TOTAL_STAKE, total_stake as f64); // Return the new committee. Ok(Self { starting_round, members, total_stake }) } diff --git a/metrics/src/lib.rs b/metrics/src/lib.rs index f9ee545015..b6f1d2b0ed 100644 --- a/metrics/src/lib.rs +++ b/metrics/src/lib.rs @@ -12,8 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Re-export the metrics macros. -pub use metrics::*; +use metrics::*; pub const GAUGE_NAMES: [&str; 1] = [committee::TOTAL_STAKE]; @@ -21,8 +20,17 @@ pub mod committee { pub const TOTAL_STAKE: &str = "snarkvm_ledger_committee_total_stake"; } +/// Registers all metrics. pub fn register_metrics() { for name in GAUGE_NAMES { register_gauge!(name); } } + +/// Updates a gauge with the given name to the given value. +/// +/// Gauges represent a single value that can go up or down over time, +/// and always starts out with an initial value of zero. +pub fn gauge>(name: &'static str, value: V) { + gauge!(name, value.into()); +} From 622472b0479215f8f28e3b884fdc64ca9b584f3b Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 26 Nov 2023 15:13:01 -0800 Subject: [PATCH 208/339] Remove method --- ledger/narwhal/subdag/src/lib.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ledger/narwhal/subdag/src/lib.rs b/ledger/narwhal/subdag/src/lib.rs index c2854cc45d..8fb93cfe9b 100644 --- a/ledger/narwhal/subdag/src/lib.rs +++ b/ledger/narwhal/subdag/src/lib.rs @@ -159,10 +159,6 @@ impl Subdag { } } - pub fn commited_certificates(&self) -> u64 { - self.subdag.values().map(|round_cert| round_cert.len() as u64).sum() - } - /// Returns the subdag root of the transactions. pub fn to_subdag_root(&self) -> Result> { // Prepare the leaves. From fafb4d9c6d74261f1990c2ab452db7dba74dfbfa Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 26 Nov 2023 15:15:29 -0800 Subject: [PATCH 209/339] Remove dev-dep --- ledger/committee/Cargo.toml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index e1e82f4257..5b6e58209e 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -89,7 +89,3 @@ version = "1" [dev-dependencies.ledger-narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../narwhal/batch-header" - -[dev-dependencies.snarkvm-ledger-committee] -path = "." -features = [ "prop-tests" ] From 71fe59d7d3866b2f81e9a3632cf7d33180974dac Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 26 Nov 2023 15:23:36 -0800 Subject: [PATCH 210/339] Undo --- Cargo.lock | 1 - ledger/committee/Cargo.toml | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index a6e59c7edd..ad9d2929bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3196,7 +3196,6 @@ dependencies = [ "rayon", "serde_json", "snarkvm-console", - "snarkvm-ledger-committee", "snarkvm-ledger-narwhal-batch-header", "snarkvm-metrics", "test-strategy", diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index 5b6e58209e..e1e82f4257 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -89,3 +89,7 @@ version = "1" [dev-dependencies.ledger-narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../narwhal/batch-header" + +[dev-dependencies.snarkvm-ledger-committee] +path = "." +features = [ "prop-tests" ] From a72a39c939a22bb244c41657bc1117723a8091c1 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 26 Nov 2023 15:30:53 -0800 Subject: [PATCH 211/339] Add wasm feature flag on metrics --- Cargo.lock | 1 + metrics/Cargo.toml | 6 ++++++ metrics/src/lib.rs | 5 +++++ wasm/Cargo.toml | 18 +++++++++--------- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ad9d2929bf..a6e59c7edd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3196,6 +3196,7 @@ dependencies = [ "rayon", "serde_json", "snarkvm-console", + "snarkvm-ledger-committee", "snarkvm-ledger-narwhal-batch-header", "snarkvm-metrics", "test-strategy", diff --git a/metrics/Cargo.toml b/metrics/Cargo.toml index 8b240b78c0..9de139765a 100644 --- a/metrics/Cargo.toml +++ b/metrics/Cargo.toml @@ -23,8 +23,14 @@ include = [ "Cargo.toml", "src", "README.md", "LICENSE.md" ] license = "Apache-2.0" edition = "2021" +[features] +default = [ "metrics", "metrics-exporter-prometheus" ] +wasm = [ ] + [dependencies.metrics] version = "0.21" +optional = true [dependencies.metrics-exporter-prometheus] version = "0.12" +optional = true diff --git a/metrics/src/lib.rs b/metrics/src/lib.rs index b6f1d2b0ed..4612f1dfbd 100644 --- a/metrics/src/lib.rs +++ b/metrics/src/lib.rs @@ -31,6 +31,11 @@ pub fn register_metrics() { /// /// Gauges represent a single value that can go up or down over time, /// and always starts out with an initial value of zero. +#[cfg(not(feature = "wasm"))] pub fn gauge>(name: &'static str, value: V) { gauge!(name, value.into()); } +#[cfg(feature = "wasm")] +pub fn gauge>(_name: &'static str, _value: V) { + return; +} diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 3b342a104e..fd71fc8f94 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -26,6 +26,15 @@ edition = "2021" [lib] crate-type = [ "cdylib", "rlib" ] +[features] +default = [ "full" ] +full = [ "console", "curves", "fields", "synthesizer", "utilities" ] +console = [ "snarkvm-console" ] +curves = [ "snarkvm-curves" ] +fields = [ "snarkvm-fields" ] +synthesizer = [ "snarkvm-synthesizer" ] +utilities = [ "snarkvm-utilities" ] + [dependencies.snarkvm-console] path = "../console" version = "=0.16.11" @@ -74,12 +83,3 @@ features = [ "js" ] [dev-dependencies.wasm-bindgen-test] version = "0.3.37" - -[features] -default = [ "full" ] -full = [ "console", "curves", "fields", "synthesizer", "utilities" ] -console = [ "snarkvm-console" ] -curves = [ "snarkvm-curves" ] -fields = [ "snarkvm-fields" ] -synthesizer = [ "snarkvm-synthesizer" ] -utilities = [ "snarkvm-utilities" ] From d2041496c2f826d165c9fa80539fd1fafc1cc23c Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 26 Nov 2023 15:39:18 -0800 Subject: [PATCH 212/339] Update feature flag --- ledger/committee/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index e1e82f4257..b17fea6adf 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -26,7 +26,7 @@ edition = "2021" [features] default = [ ] serial = [ "console/serial" ] -wasm = [ "console/wasm" ] +wasm = [ "console/wasm", "metrics/wasm" ] metrics = [ "dep:metrics" ] prop-tests = [ "rand", "rand_chacha", "test-strategy", "proptest", "anyhow" ] test-helpers = [ "prop-tests", "rand_distr" ] From 6e936607d3f8c724d8d4338a7795d4d8044fb6d9 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 26 Nov 2023 16:52:47 -0800 Subject: [PATCH 213/339] Update usage --- Cargo.lock | 469 +++++++++++++++++------------------- Cargo.toml | 4 +- ledger/committee/src/lib.rs | 2 + metrics/src/lib.rs | 14 +- 4 files changed, 237 insertions(+), 252 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a6e59c7edd..c527717418 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,14 +19,13 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" dependencies = [ "cfg-if", "once_cell", "version_check", - "zerocopy", ] [[package]] @@ -187,13 +186,13 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.38", ] [[package]] @@ -219,9 +218,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.21.5" +version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" [[package]] name = "bech32" @@ -256,7 +255,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.39", + "syn 2.0.38", ] [[package]] @@ -282,9 +281,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" [[package]] name = "blake2" @@ -434,9 +433,9 @@ dependencies = [ [[package]] name = "cl3" -version = "0.9.4" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96fd7abe572cee1c781e3464d5c468e8aee10caaef3ea911aea0dea16414409d" +checksum = "215a3aa32ab5d7928c539c4289d1cf144257c3cb05e05a4b7e61d5a6bb6583a5" dependencies = [ "libc", "opencl-sys", @@ -456,9 +455,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.8" +version = "4.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64" +checksum = "d04704f56c2cde07f43e8e2c154b43f216dc5c92fc98ada720177362f953b956" dependencies = [ "clap_builder", "clap_derive", @@ -466,9 +465,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.8" +version = "4.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc" +checksum = "0e231faeaca65ebd1ea3c737966bf858971cd38c3849107aa3ea7de90a804e45" dependencies = [ "anstream", "anstyle", @@ -478,21 +477,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" dependencies = [ "heck", "proc-macro2", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.38", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" [[package]] name = "colorchoice" @@ -558,9 +557,9 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -698,7 +697,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "socket2 0.4.10", + "socket2 0.4.9", "winapi", ] @@ -724,7 +723,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.2", + "hashbrown 0.14.1", "lock_api", "once_cell", "parking_lot_core", @@ -912,9 +911,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.7" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" +checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" dependencies = [ "libc", "windows-sys 0.48.0", @@ -1005,9 +1004,9 @@ checksum = "c1fd087255f739f4f1aeea69f11b72f8080e9c2e7645cd06955dad4a178a49e3" [[package]] name = "futures" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" dependencies = [ "futures-channel", "futures-core", @@ -1020,9 +1019,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ "futures-core", "futures-sink", @@ -1030,15 +1029,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" dependencies = [ "futures-core", "futures-task", @@ -1047,27 +1046,27 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ "futures-channel", "futures-core", @@ -1110,9 +1109,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "js-sys", @@ -1135,9 +1134,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "h2" -version = "0.3.22" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" +checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" dependencies = [ "bytes", "fnv", @@ -1145,7 +1144,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.1.0", + "indexmap 1.9.3", "slab", "tokio", "tokio-util", @@ -1175,9 +1174,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" dependencies = [ "ahash", "allocator-api2", @@ -1212,9 +1211,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.11" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ "bytes", "fnv", @@ -1261,7 +1260,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.4.9", "tokio", "tower-service", "tracing", @@ -1303,12 +1302,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown 0.14.1", "rayon", "serde", ] @@ -1337,9 +1336,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "is-terminal" @@ -1387,9 +1386,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -1408,9 +1407,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.150" +version = "0.2.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" [[package]] name = "libloading" @@ -1428,17 +1427,6 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" -[[package]] -name = "libredox" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" -dependencies = [ - "bitflags 2.4.1", - "libc", - "redox_syscall", -] - [[package]] name = "librocksdb-sys" version = "0.11.0+8.1.1" @@ -1468,15 +1456,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.11" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" +checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -1568,7 +1556,7 @@ checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.38", ] [[package]] @@ -1609,9 +1597,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", "wasi", @@ -1681,7 +1669,7 @@ checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.38", ] [[package]] @@ -1753,18 +1741,18 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "opencl-sys" -version = "0.2.6" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45b6878f1873ce3fba231eab49c0da9505a6241fed9cb390a16ed8e101ab0c4" +checksum = "e75919008b8ed7ce9620e2b3580c648db40c7f564a368f271b2647145046d8ba" dependencies = [ "libc", ] [[package]] name = "opencl3" -version = "0.9.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a94379feed77f776abb9ea6c678bc5f7f42dda9e3dec0cf2d19d7dab4626b01f" +checksum = "c247ee0c98af8a67ab9c836ed2ea663ac19a17d8bae71325b509835e536c18ad" dependencies = [ "cl3", "libc", @@ -1772,11 +1760,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.59" +version = "0.10.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a257ad03cd8fb16ad4172fedf8094451e1af1c4b70097636ef2eac9a5f0cc33" +checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.0", "cfg-if", "foreign-types", "libc", @@ -1793,7 +1781,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.38", ] [[package]] @@ -1804,9 +1792,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.95" +version = "0.9.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a4130519a360279579c2053038317e40eff64d13fd3f004f9e1b72b8a6aaf9" +checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" dependencies = [ "cc", "libc", @@ -1832,13 +1820,13 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.3.5", "smallvec", "windows-targets 0.48.5", ] @@ -1909,9 +1897,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.5.1" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bccab0e7fd7cc19f820a1c8c91720af652d0c88dc9664dd72aef2614f04af3b" +checksum = "31114a898e107c51bb1609ffaf55a0e011cf6a4d7f1170d0015a165082c0338b" [[package]] name = "powerfmt" @@ -1932,7 +1920,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.39", + "syn 2.0.38", ] [[package]] @@ -1946,19 +1934,19 @@ dependencies = [ [[package]] name = "proptest" -version = "1.4.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +checksum = "7c003ac8c77cb07bb74f5f198bce836a689bcd5a42574612bf14d17bfd08c20e" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.4.1", + "bitflags 2.4.0", "lazy_static", "num-traits", "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.8.2", + "regex-syntax 0.7.5", "rusty-fork", "tempfile", "unarray", @@ -2090,34 +2078,43 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "redox_users" -version = "0.4.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom", - "libredox", + "redox_syscall 0.2.16", "thiserror", ] [[package]] name = "regex" -version = "1.10.2" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "d119d7c7ca818f8a53c300863d4f87566aac09943aef5b355bb83969dae75d87" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", - "regex-syntax 0.8.2", + "regex-automata 0.4.1", + "regex-syntax 0.8.1", ] [[package]] @@ -2131,13 +2128,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "465c6fc0621e4abc4187a2bda0937bfd4f722c2730b29562e19689ea796c9a4b" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.1", ] [[package]] @@ -2148,9 +2145,15 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + +[[package]] +name = "regex-syntax" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "56d84fdd47036b038fc80dd333d10b6aab10d5d31f4a366e20014def75328d33" [[package]] name = "reqwest" @@ -2192,16 +2195,17 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.5" +version = "0.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" dependencies = [ "cc", - "getrandom", "libc", + "once_cell", "spin", "untrusted", - "windows-sys 0.48.0", + "web-sys", + "winapi", ] [[package]] @@ -2271,11 +2275,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.25" +version = "0.38.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" +checksum = "745ecfa778e66b2b63c88a61cb36e0eea109e803b0b86bf9879fbc77c70e86ed" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.0", "errno", "libc", "linux-raw-sys", @@ -2284,9 +2288,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.9" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" +checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" dependencies = [ "log", "ring", @@ -2296,9 +2300,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.7" +version = "0.101.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" dependencies = [ "ring", "untrusted", @@ -2366,9 +2370,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" -version = "0.7.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" dependencies = [ "ring", "untrusted", @@ -2435,31 +2439,31 @@ checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" -version = "1.0.192" +version = "1.0.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.192" +version = "1.0.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.38", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.0.2", "itoa", "ryu", "serde", @@ -2479,11 +2483,11 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.27" +version = "0.9.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" +checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.0.2", "itoa", "ryu", "serde", @@ -2512,7 +2516,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.38", ] [[package]] @@ -2558,9 +2562,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" [[package]] name = "smol_str" @@ -2581,7 +2585,7 @@ dependencies = [ "clap", "colored", "dotenvy", - "indexmap 2.1.0", + "indexmap 2.0.2", "num-format", "once_cell", "parking_lot", @@ -2620,9 +2624,9 @@ dependencies = [ "crossbeam-channel", "expect-test", "fxhash", - "hashbrown 0.14.2", + "hashbrown 0.14.1", "hex", - "indexmap 2.1.0", + "indexmap 2.0.2", "itertools 0.11.0", "lazy_static", "num-traits", @@ -2712,7 +2716,7 @@ name = "snarkvm-circuit-environment" version = "0.16.11" dependencies = [ "criterion", - "indexmap 2.1.0", + "indexmap 2.0.2", "itertools 0.11.0", "nom", "num-traits", @@ -2903,7 +2907,7 @@ version = "0.16.11" dependencies = [ "aleo-std", "criterion", - "indexmap 2.1.0", + "indexmap 2.0.2", "rayon", "snarkvm-console-algorithms", "snarkvm-console-network", @@ -2915,7 +2919,7 @@ name = "snarkvm-console-network" version = "0.16.11" dependencies = [ "anyhow", - "indexmap 2.1.0", + "indexmap 2.0.2", "itertools 0.11.0", "lazy_static", "once_cell", @@ -2956,7 +2960,7 @@ dependencies = [ "bincode", "enum_index", "enum_index_derive", - "indexmap 2.1.0", + "indexmap 2.0.2", "num-derive", "num-traits", "once_cell", @@ -3104,7 +3108,7 @@ dependencies = [ "anyhow", "bincode", "criterion", - "indexmap 2.1.0", + "indexmap 2.0.2", "parking_lot", "rand", "rayon", @@ -3141,7 +3145,7 @@ name = "snarkvm-ledger-block" version = "0.16.11" dependencies = [ "bincode", - "indexmap 2.1.0", + "indexmap 2.0.2", "once_cell", "rayon", "serde_json", @@ -3169,7 +3173,7 @@ dependencies = [ "bincode", "blake2", "criterion", - "indexmap 2.1.0", + "indexmap 2.0.2", "rand", "rayon", "serde_json", @@ -3187,7 +3191,7 @@ version = "0.16.11" dependencies = [ "anyhow", "bincode", - "indexmap 2.1.0", + "indexmap 2.0.2", "parking_lot", "proptest", "rand", @@ -3220,7 +3224,7 @@ name = "snarkvm-ledger-narwhal-batch-certificate" version = "0.16.11" dependencies = [ "bincode", - "indexmap 2.1.0", + "indexmap 2.0.2", "serde_json", "snarkvm-console", "snarkvm-ledger-narwhal-batch-certificate", @@ -3233,7 +3237,7 @@ name = "snarkvm-ledger-narwhal-batch-header" version = "0.16.11" dependencies = [ "bincode", - "indexmap 2.1.0", + "indexmap 2.0.2", "serde_json", "snarkvm-console", "snarkvm-ledger-narwhal-batch-header", @@ -3256,7 +3260,7 @@ name = "snarkvm-ledger-narwhal-subdag" version = "0.16.11" dependencies = [ "bincode", - "indexmap 2.1.0", + "indexmap 2.0.2", "rayon", "serde_json", "snarkvm-console", @@ -3308,7 +3312,7 @@ dependencies = [ "aleo-std", "anyhow", "bincode", - "indexmap 2.1.0", + "indexmap 2.0.2", "once_cell", "parking_lot", "rayon", @@ -3363,7 +3367,7 @@ dependencies = [ "curl", "encoding", "hex", - "indexmap 2.1.0", + "indexmap 2.0.2", "itertools 0.11.0", "js-sys", "lazy_static", @@ -3390,7 +3394,7 @@ dependencies = [ "aleo-std", "anyhow", "criterion", - "indexmap 2.1.0", + "indexmap 2.0.2", "itertools 0.11.0", "once_cell", "parking_lot", @@ -3421,7 +3425,7 @@ dependencies = [ "aleo-std", "bincode", "colored", - "indexmap 2.1.0", + "indexmap 2.0.2", "once_cell", "parking_lot", "rand", @@ -3446,7 +3450,7 @@ version = "0.16.11" dependencies = [ "bincode", "criterion", - "indexmap 2.1.0", + "indexmap 2.0.2", "paste", "rand", "rand_chacha", @@ -3495,7 +3499,7 @@ version = "0.16.11" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.38", ] [[package]] @@ -3516,9 +3520,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.10" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ "libc", "winapi", @@ -3526,9 +3530,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" dependencies = [ "libc", "windows-sys 0.48.0", @@ -3536,9 +3540,9 @@ dependencies = [ [[package]] name = "spin" -version = "0.9.8" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "sppark" @@ -3565,7 +3569,7 @@ dependencies = [ "proc-macro2", "quote 1.0.33", "structmeta-derive", - "syn 2.0.39", + "syn 2.0.38", ] [[package]] @@ -3576,7 +3580,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.38", ] [[package]] @@ -3609,9 +3613,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.39" +version = "2.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" dependencies = [ "proc-macro2", "quote 1.0.33", @@ -3659,13 +3663,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.8.1" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if", "fastrand 2.0.1", - "redox_syscall", + "redox_syscall 0.3.5", "rustix", "windows-sys 0.48.0", ] @@ -3679,27 +3683,27 @@ dependencies = [ "proc-macro2", "quote 1.0.33", "structmeta", - "syn 2.0.39", + "syn 2.0.38", ] [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.38", ] [[package]] @@ -3775,9 +3779,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.34.0" +version = "1.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" dependencies = [ "backtrace", "bytes", @@ -3785,7 +3789,7 @@ dependencies = [ "mio", "num_cpus", "pin-project-lite", - "socket2 0.5.5", + "socket2 0.5.4", "windows-sys 0.48.0", ] @@ -3801,9 +3805,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" dependencies = [ "bytes", "futures-core", @@ -3830,9 +3834,9 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "ee2ef2af84856a50c1d430afce2fdded0a4ec7eda868db86409b4543df0797f9" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -3847,7 +3851,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.38", ] [[package]] @@ -3862,20 +3866,20 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.2.0" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" dependencies = [ + "lazy_static", "log", - "once_cell", "tracing-core", ] [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" dependencies = [ "matchers", "nu-ansi-term", @@ -3971,15 +3975,15 @@ checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" [[package]] name = "untrusted" -version = "0.9.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "ureq" -version = "2.9.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7830e33f6e25723d41a63f77e434159dad02919f18f55a512b5f16f3b1d77138" +checksum = "f5ccd538d4a604753ebc2f17cd9946e89b77bf87f6a8e2309667c6f2e87855e3" dependencies = [ "base64", "flate2", @@ -4070,9 +4074,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "serde", @@ -4082,24 +4086,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.38", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.38" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" dependencies = [ "cfg-if", "js-sys", @@ -4109,9 +4113,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote 1.0.33", "wasm-bindgen-macro-support", @@ -4119,28 +4123,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.38", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "wasm-bindgen-test" -version = "0.3.38" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6433b7c56db97397842c46b67e11873eda263170afeb3a2dc74a7cb370fee0d" +checksum = "6e6e302a7ea94f83a6d09e78e7dc7d9ca7b186bc2829c24a22d0753efd680671" dependencies = [ "console_error_panic_hook", "js-sys", @@ -4152,20 +4156,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.38" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "493fcbab756bb764fa37e6bee8cec2dd709eb4273d06d0c282a5e74275ded735" +checksum = "ecb993dd8c836930ed130e020e77d9b2e65dd0fbab1b67c790b0f5d80b11a575" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.39", ] [[package]] name = "web-sys" -version = "0.3.65" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -4362,31 +4365,11 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "zerocopy" -version = "0.7.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e97e415490559a91254a2979b4829267a57d2fcd741a98eee8b722fb57289aa0" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7e48ccf166952882ca8bd778a43502c64f33bf94c12ebe2a7f08e5a0f6689f" -dependencies = [ - "proc-macro2", - "quote 1.0.33", - "syn 2.0.39", -] - [[package]] name = "zeroize" -version = "1.7.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" dependencies = [ "zeroize_derive", ] @@ -4399,5 +4382,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.38", ] diff --git a/Cargo.toml b/Cargo.toml index 818e796016..d6bd5b714a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -124,7 +124,8 @@ cli = [ "rand", "self_update", "serde_json", - "thiserror" + "thiserror", + "ureq" ] aleo-cli = [ "snarkvm-synthesizer/aleo-cli" ] async = [ "snarkvm-ledger/async", "snarkvm-synthesizer/async" ] @@ -259,6 +260,7 @@ optional = true [dependencies.ureq] version = "2.7" features = [ "json" ] +optional = true [dev-dependencies.bincode] version = "1.3" diff --git a/ledger/committee/src/lib.rs b/ledger/committee/src/lib.rs index a43b288373..f9dd7e2ea0 100644 --- a/ledger/committee/src/lib.rs +++ b/ledger/committee/src/lib.rs @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#![forbid(unsafe_code)] + mod bytes; mod serialize; mod string; diff --git a/metrics/src/lib.rs b/metrics/src/lib.rs index 4612f1dfbd..e66ca873fa 100644 --- a/metrics/src/lib.rs +++ b/metrics/src/lib.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use metrics::*; +#![forbid(unsafe_code)] pub const GAUGE_NAMES: [&str; 1] = [committee::TOTAL_STAKE]; @@ -22,8 +22,9 @@ pub mod committee { /// Registers all metrics. pub fn register_metrics() { + #[cfg(not(feature = "wasm"))] for name in GAUGE_NAMES { - register_gauge!(name); + ::metrics::register_gauge!(name); } } @@ -31,11 +32,8 @@ pub fn register_metrics() { /// /// Gauges represent a single value that can go up or down over time, /// and always starts out with an initial value of zero. -#[cfg(not(feature = "wasm"))] +#[allow(unused_variables)] pub fn gauge>(name: &'static str, value: V) { - gauge!(name, value.into()); -} -#[cfg(feature = "wasm")] -pub fn gauge>(_name: &'static str, _value: V) { - return; + #[cfg(not(feature = "wasm"))] + ::metrics::gauge!(name, value.into()); } From 6e88b24585d3c073793fd446909126781a6d3421 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 26 Nov 2023 17:00:58 -0800 Subject: [PATCH 214/339] Update usage --- ledger/committee/Cargo.toml | 2 +- ledger/committee/src/lib.rs | 4 +++- metrics/Cargo.toml | 6 ------ metrics/src/lib.rs | 3 --- 4 files changed, 4 insertions(+), 11 deletions(-) diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index b17fea6adf..e1e82f4257 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -26,7 +26,7 @@ edition = "2021" [features] default = [ ] serial = [ "console/serial" ] -wasm = [ "console/wasm", "metrics/wasm" ] +wasm = [ "console/wasm" ] metrics = [ "dep:metrics" ] prop-tests = [ "rand", "rand_chacha", "test-strategy", "proptest", "anyhow" ] test-helpers = [ "prop-tests", "rand_distr" ] diff --git a/ledger/committee/src/lib.rs b/ledger/committee/src/lib.rs index f9dd7e2ea0..87955df7cd 100644 --- a/ledger/committee/src/lib.rs +++ b/ledger/committee/src/lib.rs @@ -13,6 +13,7 @@ // limitations under the License. #![forbid(unsafe_code)] +#![warn(clippy::cast_possible_truncation)] mod bytes; mod serialize; @@ -287,13 +288,14 @@ pub mod test_helpers { } /// Samples a random committee. + #[allow(clippy::cast_possible_truncation)] pub fn sample_committee_custom(num_members: u16, rng: &mut TestRng) -> Committee { assert!(num_members >= 4); // Set the maximum amount staked in the node. const MAX_STAKE: u64 = 100_000_000_000_000; // Initialize the Exponential distribution. let distribution = Exp::new(2.0).unwrap(); - // Initialize an RNG for the stake. + // Initialize maximum stake range. let range = (MAX_STAKE - MIN_VALIDATOR_STAKE) as f64; // Sample the members. let mut members = IndexMap::new(); diff --git a/metrics/Cargo.toml b/metrics/Cargo.toml index 9de139765a..8b240b78c0 100644 --- a/metrics/Cargo.toml +++ b/metrics/Cargo.toml @@ -23,14 +23,8 @@ include = [ "Cargo.toml", "src", "README.md", "LICENSE.md" ] license = "Apache-2.0" edition = "2021" -[features] -default = [ "metrics", "metrics-exporter-prometheus" ] -wasm = [ ] - [dependencies.metrics] version = "0.21" -optional = true [dependencies.metrics-exporter-prometheus] version = "0.12" -optional = true diff --git a/metrics/src/lib.rs b/metrics/src/lib.rs index e66ca873fa..82665c1b55 100644 --- a/metrics/src/lib.rs +++ b/metrics/src/lib.rs @@ -22,7 +22,6 @@ pub mod committee { /// Registers all metrics. pub fn register_metrics() { - #[cfg(not(feature = "wasm"))] for name in GAUGE_NAMES { ::metrics::register_gauge!(name); } @@ -32,8 +31,6 @@ pub fn register_metrics() { /// /// Gauges represent a single value that can go up or down over time, /// and always starts out with an initial value of zero. -#[allow(unused_variables)] pub fn gauge>(name: &'static str, value: V) { - #[cfg(not(feature = "wasm"))] ::metrics::gauge!(name, value.into()); } From 31d0bb5d0a757f2522449133aa3b0924569bc598 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 26 Nov 2023 17:13:43 -0800 Subject: [PATCH 215/339] chore(snarkvm): bump version for new release --- .cargo/release-version | 2 +- Cargo.lock | 120 ++++++++++---------- Cargo.toml | 24 ++-- algorithms/Cargo.toml | 12 +- algorithms/cuda/Cargo.toml | 2 +- circuit/Cargo.toml | 16 +-- circuit/account/Cargo.toml | 10 +- circuit/algorithms/Cargo.toml | 8 +- circuit/collections/Cargo.toml | 8 +- circuit/environment/Cargo.toml | 14 +-- circuit/environment/witness/Cargo.toml | 2 +- circuit/network/Cargo.toml | 10 +- circuit/program/Cargo.toml | 16 +-- circuit/types/Cargo.toml | 18 +-- circuit/types/address/Cargo.toml | 14 +-- circuit/types/boolean/Cargo.toml | 6 +- circuit/types/field/Cargo.toml | 8 +- circuit/types/group/Cargo.toml | 12 +- circuit/types/integers/Cargo.toml | 12 +- circuit/types/scalar/Cargo.toml | 10 +- circuit/types/string/Cargo.toml | 12 +- console/Cargo.toml | 14 +-- console/account/Cargo.toml | 6 +- console/algorithms/Cargo.toml | 8 +- console/collections/Cargo.toml | 6 +- console/network/Cargo.toml | 20 ++-- console/network/environment/Cargo.toml | 8 +- console/program/Cargo.toml | 14 +-- console/types/Cargo.toml | 18 +-- console/types/address/Cargo.toml | 10 +- console/types/boolean/Cargo.toml | 4 +- console/types/field/Cargo.toml | 6 +- console/types/group/Cargo.toml | 10 +- console/types/integers/Cargo.toml | 10 +- console/types/scalar/Cargo.toml | 8 +- console/types/string/Cargo.toml | 10 +- curves/Cargo.toml | 6 +- fields/Cargo.toml | 4 +- ledger/Cargo.toml | 22 ++-- ledger/authority/Cargo.toml | 6 +- ledger/block/Cargo.toml | 18 +-- ledger/coinbase/Cargo.toml | 14 +-- ledger/committee/Cargo.toml | 6 +- ledger/narwhal/Cargo.toml | 14 +-- ledger/narwhal/batch-certificate/Cargo.toml | 8 +- ledger/narwhal/batch-header/Cargo.toml | 6 +- ledger/narwhal/data/Cargo.toml | 4 +- ledger/narwhal/subdag/Cargo.toml | 10 +- ledger/narwhal/transmission-id/Cargo.toml | 6 +- ledger/narwhal/transmission/Cargo.toml | 10 +- ledger/query/Cargo.toml | 8 +- ledger/store/Cargo.toml | 18 +-- ledger/test-helpers/Cargo.toml | 16 +-- metrics/Cargo.toml | 2 +- parameters/Cargo.toml | 6 +- synthesizer/Cargo.toml | 24 ++-- synthesizer/process/Cargo.toml | 18 +-- synthesizer/program/Cargo.toml | 6 +- synthesizer/snark/Cargo.toml | 8 +- utilities/Cargo.toml | 4 +- utilities/derives/Cargo.toml | 2 +- wasm/Cargo.toml | 12 +- 62 files changed, 373 insertions(+), 373 deletions(-) diff --git a/.cargo/release-version b/.cargo/release-version index b592d65843..e38085345d 100644 --- a/.cargo/release-version +++ b/.cargo/release-version @@ -1 +1 @@ -v0.16.11 \ No newline at end of file +v0.16.12 \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index c527717418..30dbab2ec4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2577,7 +2577,7 @@ dependencies = [ [[package]] name = "snarkvm" -version = "0.16.11" +version = "0.16.12" dependencies = [ "anstyle", "anyhow", @@ -2613,7 +2613,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms" -version = "0.16.11" +version = "0.16.12" dependencies = [ "aleo-std", "anyhow", @@ -2652,7 +2652,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms-cuda" -version = "0.16.11" +version = "0.16.12" dependencies = [ "blst", "cc", @@ -2662,7 +2662,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit" -version = "0.16.11" +version = "0.16.12" dependencies = [ "snarkvm-circuit-account", "snarkvm-circuit-algorithms", @@ -2675,7 +2675,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-account" -version = "0.16.11" +version = "0.16.12" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2687,7 +2687,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-algorithms" -version = "0.16.11" +version = "0.16.12" dependencies = [ "anyhow", "snarkvm-circuit-types", @@ -2699,7 +2699,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-collections" -version = "0.16.11" +version = "0.16.12" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2713,7 +2713,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment" -version = "0.16.11" +version = "0.16.12" dependencies = [ "criterion", "indexmap 2.0.2", @@ -2734,11 +2734,11 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment-witness" -version = "0.16.11" +version = "0.16.12" [[package]] name = "snarkvm-circuit-network" -version = "0.16.11" +version = "0.16.12" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-collections", @@ -2749,7 +2749,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-program" -version = "0.16.11" +version = "0.16.12" dependencies = [ "anyhow", "paste", @@ -2767,7 +2767,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types" -version = "0.16.11" +version = "0.16.12" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-address", @@ -2782,7 +2782,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-address" -version = "0.16.11" +version = "0.16.12" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2794,7 +2794,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-boolean" -version = "0.16.11" +version = "0.16.12" dependencies = [ "criterion", "snarkvm-circuit-environment", @@ -2803,7 +2803,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-field" -version = "0.16.11" +version = "0.16.12" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2812,7 +2812,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-group" -version = "0.16.11" +version = "0.16.12" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2824,7 +2824,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-integers" -version = "0.16.11" +version = "0.16.12" dependencies = [ "paste", "snarkvm-circuit-environment", @@ -2837,7 +2837,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-scalar" -version = "0.16.11" +version = "0.16.12" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2847,7 +2847,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-string" -version = "0.16.11" +version = "0.16.12" dependencies = [ "rand", "snarkvm-circuit-environment", @@ -2860,7 +2860,7 @@ dependencies = [ [[package]] name = "snarkvm-console" -version = "0.16.11" +version = "0.16.12" dependencies = [ "snarkvm-console-account", "snarkvm-console-algorithms", @@ -2872,7 +2872,7 @@ dependencies = [ [[package]] name = "snarkvm-console-account" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "bs58", @@ -2885,7 +2885,7 @@ dependencies = [ [[package]] name = "snarkvm-console-algorithms" -version = "0.16.11" +version = "0.16.12" dependencies = [ "blake2s_simd", "criterion", @@ -2903,7 +2903,7 @@ dependencies = [ [[package]] name = "snarkvm-console-collections" -version = "0.16.11" +version = "0.16.12" dependencies = [ "aleo-std", "criterion", @@ -2916,7 +2916,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network" -version = "0.16.11" +version = "0.16.12" dependencies = [ "anyhow", "indexmap 2.0.2", @@ -2938,7 +2938,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network-environment" -version = "0.16.11" +version = "0.16.12" dependencies = [ "anyhow", "bech32", @@ -2955,7 +2955,7 @@ dependencies = [ [[package]] name = "snarkvm-console-program" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "enum_index", @@ -2976,7 +2976,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types" -version = "0.16.11" +version = "0.16.12" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-address", @@ -2990,7 +2990,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-address" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "serde_json", @@ -3002,7 +3002,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-boolean" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "serde_json", @@ -3011,7 +3011,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-field" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "serde_json", @@ -3022,7 +3022,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-group" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "serde_json", @@ -3034,7 +3034,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-integers" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "serde_json", @@ -3046,7 +3046,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-scalar" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "serde_json", @@ -3058,7 +3058,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-string" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "serde_json", @@ -3070,7 +3070,7 @@ dependencies = [ [[package]] name = "snarkvm-curves" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "criterion", @@ -3085,7 +3085,7 @@ dependencies = [ [[package]] name = "snarkvm-fields" -version = "0.16.11" +version = "0.16.12" dependencies = [ "aleo-std", "anyhow", @@ -3102,7 +3102,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger" -version = "0.16.11" +version = "0.16.12" dependencies = [ "aleo-std", "anyhow", @@ -3129,7 +3129,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-authority" -version = "0.16.11" +version = "0.16.12" dependencies = [ "anyhow", "bincode", @@ -3142,7 +3142,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-block" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3166,7 +3166,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-coinbase" -version = "0.16.11" +version = "0.16.12" dependencies = [ "aleo-std", "anyhow", @@ -3187,7 +3187,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-committee" -version = "0.16.11" +version = "0.16.12" dependencies = [ "anyhow", "bincode", @@ -3208,7 +3208,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal" -version = "0.16.11" +version = "0.16.12" dependencies = [ "snarkvm-ledger-narwhal", "snarkvm-ledger-narwhal-batch-certificate", @@ -3221,7 +3221,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3234,7 +3234,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3247,7 +3247,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-data" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bytes", "serde_json", @@ -3257,7 +3257,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3272,7 +3272,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "bytes", @@ -3285,7 +3285,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "serde_json", @@ -3295,7 +3295,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-query" -version = "0.16.11" +version = "0.16.12" dependencies = [ "async-trait", "reqwest", @@ -3307,7 +3307,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-store" -version = "0.16.11" +version = "0.16.12" dependencies = [ "aleo-std", "anyhow", @@ -3335,7 +3335,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-test-helpers" -version = "0.16.11" +version = "0.16.12" dependencies = [ "once_cell", "snarkvm-circuit", @@ -3349,7 +3349,7 @@ dependencies = [ [[package]] name = "snarkvm-metrics" -version = "0.16.11" +version = "0.16.12" dependencies = [ "metrics", "metrics-exporter-prometheus", @@ -3357,7 +3357,7 @@ dependencies = [ [[package]] name = "snarkvm-parameters" -version = "0.16.11" +version = "0.16.12" dependencies = [ "aleo-std", "anyhow", @@ -3389,7 +3389,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer" -version = "0.16.11" +version = "0.16.12" dependencies = [ "aleo-std", "anyhow", @@ -3420,7 +3420,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-process" -version = "0.16.11" +version = "0.16.12" dependencies = [ "aleo-std", "bincode", @@ -3446,7 +3446,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-program" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "criterion", @@ -3462,7 +3462,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-snark" -version = "0.16.11" +version = "0.16.12" dependencies = [ "bincode", "colored", @@ -3475,7 +3475,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities" -version = "0.16.11" +version = "0.16.12" dependencies = [ "aleo-std", "anyhow", @@ -3495,7 +3495,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities-derives" -version = "0.16.11" +version = "0.16.12" dependencies = [ "proc-macro2", "quote 1.0.33", @@ -3504,7 +3504,7 @@ dependencies = [ [[package]] name = "snarkvm-wasm" -version = "0.16.11" +version = "0.16.12" dependencies = [ "getrandom", "rand", diff --git a/Cargo.toml b/Cargo.toml index d6bd5b714a..2f4ee0689a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "A decentralized virtual machine" homepage = "https://aleo.org" @@ -150,58 +150,58 @@ wasm = [ "snarkvm-wasm" ] [dependencies.snarkvm-algorithms] path = "./algorithms" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-circuit] path = "./circuit" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-console] path = "./console" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-curves] path = "./curves" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-fields] path = "./fields" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-ledger] path = "./ledger" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-metrics] path = "./metrics" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-parameters] path = "./parameters" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-synthesizer] path = "./synthesizer" -version = "=0.16.11" +version = "=0.16.12" default-features = false optional = true [dependencies.snarkvm-utilities] path = "./utilities" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-wasm] path = "./wasm" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.anstyle] diff --git a/algorithms/Cargo.toml b/algorithms/Cargo.toml index c107913faa..da99784f52 100644 --- a/algorithms/Cargo.toml +++ b/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Algorithms for a decentralized virtual machine" homepage = "https://aleo.org" @@ -47,27 +47,27 @@ required-features = [ "test" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.snarkvm-parameters] path = "../parameters" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.snarkvm-algorithms-cuda] path = "./cuda" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.aleo-std] diff --git a/algorithms/cuda/Cargo.toml b/algorithms/cuda/Cargo.toml index e3c2daee8e..24f9a3127f 100644 --- a/algorithms/cuda/Cargo.toml +++ b/algorithms/cuda/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms-cuda" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Cuda optimizations for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/circuit/Cargo.toml b/circuit/Cargo.toml index e4c589656a..d996f10337 100644 --- a/circuit/Cargo.toml +++ b/circuit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Circuits for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,28 +25,28 @@ edition = "2021" [dependencies.snarkvm-circuit-account] path = "./account" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-algorithms] path = "./algorithms" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-collections] path = "./collections" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-environment] path = "./environment" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-network] path = "./network" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-program] path = "./program" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types] path = "./types" -version = "=0.16.11" +version = "=0.16.12" diff --git a/circuit/account/Cargo.toml b/circuit/account/Cargo.toml index 6adb4acdb5..a23cc13706 100644 --- a/circuit/account/Cargo.toml +++ b/circuit/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-account" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Account circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-account" path = "../../console/account" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.11" +version = "=0.16.12" [dev-dependencies.snarkvm-utilities] path = "../../utilities" diff --git a/circuit/algorithms/Cargo.toml b/circuit/algorithms/Cargo.toml index 97f3a238c7..331fccd9fd 100644 --- a/circuit/algorithms/Cargo.toml +++ b/circuit/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-algorithms" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Algorithm circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-algorithms" path = "../../console/algorithms" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dev-dependencies.anyhow] diff --git a/circuit/collections/Cargo.toml b/circuit/collections/Cargo.toml index 59724d0d73..b6d794509e 100644 --- a/circuit/collections/Cargo.toml +++ b/circuit/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-collections" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Collections circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-collections" path = "../../console/collections" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.11" +version = "=0.16.12" [dev-dependencies.snarkvm-circuit-network] path = "../network" diff --git a/circuit/environment/Cargo.toml b/circuit/environment/Cargo.toml index 0079209b17..96ad7e8cc8 100644 --- a/circuit/environment/Cargo.toml +++ b/circuit/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Circuit environment for a decentralized virtual machine" license = "Apache-2.0" @@ -14,32 +14,32 @@ harness = false [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.11" +version = "=0.16.12" default-features = false features = [ "r1cs" ] [dependencies.snarkvm-circuit-environment-witness] path = "./witness" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.indexmap] diff --git a/circuit/environment/witness/Cargo.toml b/circuit/environment/witness/Cargo.toml index a1a41cecba..f5e511d623 100644 --- a/circuit/environment/witness/Cargo.toml +++ b/circuit/environment/witness/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment-witness" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "A procedural macro to construct a witness in an environment" license = "Apache-2.0" diff --git a/circuit/network/Cargo.toml b/circuit/network/Cargo.toml index 76bf979079..f593089bd4 100644 --- a/circuit/network/Cargo.toml +++ b/circuit/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-network" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Network circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.11" +version = "=0.16.12" [dev-dependencies.snarkvm-console-types] path = "../../console/types" diff --git a/circuit/program/Cargo.toml b/circuit/program/Cargo.toml index b90a3aed4e..078a68a21d 100644 --- a/circuit/program/Cargo.toml +++ b/circuit/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-program" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Program circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,32 +9,32 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-program" path = "../../console/program" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-circuit-account] path = "../account" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.11" +version = "=0.16.12" [dependencies.paste] version = "1.0" diff --git a/circuit/types/Cargo.toml b/circuit/types/Cargo.toml index 0b1aa67541..2a5c0e9a4b 100644 --- a/circuit/types/Cargo.toml +++ b/circuit/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Primitive circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -8,35 +8,35 @@ edition = "2021" [dependencies.snarkvm-circuit-environment] path = "../environment" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-address] path = "./address" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-boolean] path = "./boolean" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-field] path = "./field" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-group] path = "./group" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-integers] path = "./integers" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-scalar] path = "./scalar" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-string] path = "./string" -version = "=0.16.11" +version = "=0.16.12" [dev-dependencies.console] package = "snarkvm-console" diff --git a/circuit/types/address/Cargo.toml b/circuit/types/address/Cargo.toml index 35c414e747..7d9caea652 100644 --- a/circuit/types/address/Cargo.toml +++ b/circuit/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-address" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Address circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,28 +9,28 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-address" path = "../../../console/types/address" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-group] path = "../group" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.11" +version = "=0.16.12" [features] default = [ "enable_console" ] diff --git a/circuit/types/boolean/Cargo.toml b/circuit/types/boolean/Cargo.toml index 82dafde21e..d3de151380 100644 --- a/circuit/types/boolean/Cargo.toml +++ b/circuit/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-boolean" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Boolean circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -14,12 +14,12 @@ harness = false [dependencies.console] package = "snarkvm-console-types-boolean" path = "../../../console/types/boolean" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.11" +version = "=0.16.12" [dev-dependencies.criterion] version = "0.5" diff --git a/circuit/types/field/Cargo.toml b/circuit/types/field/Cargo.toml index d08323d61a..9bda4f1a41 100644 --- a/circuit/types/field/Cargo.toml +++ b/circuit/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-field" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Field circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-field" path = "../../../console/types/field" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.11" +version = "=0.16.12" [features] default = [ "enable_console" ] diff --git a/circuit/types/group/Cargo.toml b/circuit/types/group/Cargo.toml index 6d6e494081..b12e20ec23 100644 --- a/circuit/types/group/Cargo.toml +++ b/circuit/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-group" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Group circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-group" path = "../../../console/types/group" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.11" +version = "=0.16.12" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/integers/Cargo.toml b/circuit/types/integers/Cargo.toml index 1caafd0b64..7ec7b1fee8 100644 --- a/circuit/types/integers/Cargo.toml +++ b/circuit/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-integers" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Integer circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-integers" path = "../../../console/types/integers" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.11" +version = "=0.16.12" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/scalar/Cargo.toml b/circuit/types/scalar/Cargo.toml index 62e51ce0bd..1a5dfd3d85 100644 --- a/circuit/types/scalar/Cargo.toml +++ b/circuit/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-scalar" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Scalar circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-scalar" path = "../../../console/types/scalar" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.11" +version = "=0.16.12" [features] default = [ "enable_console" ] diff --git a/circuit/types/string/Cargo.toml b/circuit/types/string/Cargo.toml index 823eaacc3a..7de3d7cc80 100644 --- a/circuit/types/string/Cargo.toml +++ b/circuit/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-string" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "String circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-string" path = "../../../console/types/string" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-circuit-types-integers] path = "../integers" -version = "=0.16.11" +version = "=0.16.12" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/console/Cargo.toml b/console/Cargo.toml index 5cc82ef821..63b8d62313 100644 --- a/console/Cargo.toml +++ b/console/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Console environment for a decentralized virtual machine" license = "Apache-2.0" @@ -8,32 +8,32 @@ edition = "2021" [dependencies.snarkvm-console-account] path = "./account" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-console-algorithms] path = "./algorithms" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-console-collections] path = "./collections" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-console-network] path = "./network" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-console-program] path = "./program" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-console-types] path = "./types" -version = "=0.16.11" +version = "=0.16.12" optional = true [features] diff --git a/console/account/Cargo.toml b/console/account/Cargo.toml index 59d0118e3b..e2813db421 100644 --- a/console/account/Cargo.toml +++ b/console/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-account" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Account operations for a decentralized virtual machine" license = "Apache-2.0" @@ -13,11 +13,11 @@ harness = false [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.11" +version = "=0.16.12" default-features = false features = [ "address", "boolean", "field", "group", "scalar" ] diff --git a/console/algorithms/Cargo.toml b/console/algorithms/Cargo.toml index 071fc07f6d..77fd18fef0 100644 --- a/console/algorithms/Cargo.toml +++ b/console/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-algorithms" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Console algorithms for a decentralized virtual machine" license = "Apache-2.0" @@ -23,18 +23,18 @@ harness = false [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.11" +version = "=0.16.12" default-features = false features = [ "field", "group", "integers", "scalar" ] [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.11" +version = "=0.16.12" [dependencies.blake2s_simd] version = "1.0" diff --git a/console/collections/Cargo.toml b/console/collections/Cargo.toml index 7916341a41..9cff0030d3 100644 --- a/console/collections/Cargo.toml +++ b/console/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-collections" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Collections for a decentralized virtual machine" license = "Apache-2.0" @@ -18,11 +18,11 @@ harness = false [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.11" +version = "=0.16.12" default-features = false features = [ "field", "integers" ] diff --git a/console/network/Cargo.toml b/console/network/Cargo.toml index 928d12b266..959397f47a 100644 --- a/console/network/Cargo.toml +++ b/console/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Network console library for a decentralized virtual machine" license = "Apache-2.0" @@ -15,45 +15,45 @@ wasm = [ [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.11" +version = "=0.16.12" default-features = false features = [ "snark" ] [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-network-environment] path = "./environment" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.11" +version = "=0.16.12" default-features = false features = [ "field", "group", "scalar" ] [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.snarkvm-parameters] path = "../../parameters" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.11" +version = "=0.16.12" [dependencies.anyhow] version = "1.0.73" diff --git a/console/network/environment/Cargo.toml b/console/network/environment/Cargo.toml index b2681a229d..df3130e699 100644 --- a/console/network/environment/Cargo.toml +++ b/console/network/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network-environment" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Environment console library for a decentralized virtual machine" license = "Apache-2.0" @@ -8,17 +8,17 @@ edition = "2021" [dependencies.snarkvm-curves] path = "../../../curves" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.snarkvm-fields] path = "../../../fields" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.snarkvm-utilities] path = "../../../utilities" -version = "=0.16.11" +version = "=0.16.12" [dependencies.anyhow] version = "1.0.73" diff --git a/console/program/Cargo.toml b/console/program/Cargo.toml index 78d9907a7c..84d1e97f2d 100644 --- a/console/program/Cargo.toml +++ b/console/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-program" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Program operations for a decentralized virtual machine" license = "Apache-2.0" @@ -12,27 +12,27 @@ test = [ ] [dependencies.snarkvm-console-account] path = "../account" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.11" +version = "=0.16.12" [dependencies.enum_index] version = "0.2" diff --git a/console/types/Cargo.toml b/console/types/Cargo.toml index e20511a88a..fe6ef8f2c4 100644 --- a/console/types/Cargo.toml +++ b/console/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Console types for a decentralized virtual machine" license = "Apache-2.0" @@ -8,41 +8,41 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../network/environment" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types-address] path = "./address" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-console-types-boolean] path = "./boolean" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-console-types-field] path = "./field" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-console-types-group] path = "./group" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-console-types-integers] path = "./integers" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-console-types-scalar] path = "./scalar" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-console-types-string] path = "./string" -version = "=0.16.11" +version = "=0.16.12" optional = true [features] diff --git a/console/types/address/Cargo.toml b/console/types/address/Cargo.toml index 974136bdaa..248b77a445 100644 --- a/console/types/address/Cargo.toml +++ b/console/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-address" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types-group] path = "../group" -version = "=0.16.11" +version = "=0.16.12" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/boolean/Cargo.toml b/console/types/boolean/Cargo.toml index 8ac68cc08f..8f7040a711 100644 --- a/console/types/boolean/Cargo.toml +++ b/console/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-boolean" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,7 +8,7 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.11" +version = "=0.16.12" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/field/Cargo.toml b/console/types/field/Cargo.toml index a5d91584ff..938f7e32f8 100644 --- a/console/types/field/Cargo.toml +++ b/console/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-field" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,11 +8,11 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.11" +version = "=0.16.12" [dependencies.zeroize] version = "1" diff --git a/console/types/group/Cargo.toml b/console/types/group/Cargo.toml index 76d706b359..2e1d8fe28a 100644 --- a/console/types/group/Cargo.toml +++ b/console/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-group" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.11" +version = "=0.16.12" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/integers/Cargo.toml b/console/types/integers/Cargo.toml index b225a6c6d9..eeffe03a51 100644 --- a/console/types/integers/Cargo.toml +++ b/console/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-integers" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.11" +version = "=0.16.12" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/scalar/Cargo.toml b/console/types/scalar/Cargo.toml index dab1f66d23..41b1a885dd 100644 --- a/console/types/scalar/Cargo.toml +++ b/console/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-scalar" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,15 +8,15 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.11" +version = "=0.16.12" [dependencies.zeroize] version = "1" diff --git a/console/types/string/Cargo.toml b/console/types/string/Cargo.toml index e02ac223c7..148c11a5e5 100644 --- a/console/types/string/Cargo.toml +++ b/console/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-string" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-console-types-integers] path = "../integers" -version = "=0.16.11" +version = "=0.16.12" [dev-dependencies.bincode] version = "1.3" diff --git a/curves/Cargo.toml b/curves/Cargo.toml index 320601444b..9a065cb406 100644 --- a/curves/Cargo.toml +++ b/curves/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-curves" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Curves for a decentralized virtual machine" homepage = "https://aleo.org" @@ -36,12 +36,12 @@ harness = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.rand] diff --git a/fields/Cargo.toml b/fields/Cargo.toml index 7f0e26a1f1..bb97c09dd6 100644 --- a/fields/Cargo.toml +++ b/fields/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-fields" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Fields for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.aleo-std] diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index 88ec19114c..2effb58d54 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "A node ledger for a decentralized virtual machine" homepage = "https://aleo.org" @@ -57,54 +57,54 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "./authority" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "./block" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "./coinbase" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "./committee" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-narwhal] package = "snarkvm-ledger-narwhal" path = "./narwhal" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "./query" -version = "=0.16.11" +version = "=0.16.12" features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "./store" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-test-helpers] package = "snarkvm-ledger-test-helpers" path = "./test-helpers" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.synthesizer] package = "snarkvm-synthesizer" path = "../synthesizer" -version = "=0.16.11" +version = "=0.16.12" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/authority/Cargo.toml b/ledger/authority/Cargo.toml index 816f0eacf5..88a2525af3 100644 --- a/ledger/authority/Cargo.toml +++ b/ledger/authority/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-authority" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Data structures for a block authority in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-subdag/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.11" +version = "=0.16.12" [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.11" +version = "=0.16.12" [dependencies.anyhow] version = "1" diff --git a/ledger/block/Cargo.toml b/ledger/block/Cargo.toml index 907467f90f..9487d4b494 100644 --- a/ledger/block/Cargo.toml +++ b/ledger/block/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-block" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "A block for a decentralized virtual machine" homepage = "https://aleo.org" @@ -39,42 +39,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../ledger/coinbase" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../../ledger/committee" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../narwhal/transmission-id" -version = "=0.16.11" +version = "=0.16.12" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.11" +version = "=0.16.12" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.11" +version = "=0.16.12" [dependencies.indexmap] version = "2.0" diff --git a/ledger/coinbase/Cargo.toml b/ledger/coinbase/Cargo.toml index 920fed6a88..a8735c88ab 100644 --- a/ledger/coinbase/Cargo.toml +++ b/ledger/coinbase/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-coinbase" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Coinbase puzzle for a decentralized virtual machine" homepage = "https://aleo.org" @@ -50,27 +50,27 @@ wasm = [ [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-synthesizer-snark] path = "../../synthesizer/snark" -version = "=0.16.11" +version = "=0.16.12" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.aleo-std] diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index e1e82f4257..36d7e7eee9 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-committee" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "A committee for a decentralized virtual machine" homepage = "https://aleo.org" @@ -34,7 +34,7 @@ test-helpers = [ "prop-tests", "rand_distr" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.11" +version = "=0.16.12" [dependencies.indexmap] version = "2.0" @@ -43,7 +43,7 @@ features = [ "serde", "rayon" ] [dependencies.metrics] package = "snarkvm-metrics" path = "../../metrics" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.serde_json] diff --git a/ledger/narwhal/Cargo.toml b/ledger/narwhal/Cargo.toml index 608be5458f..0b107c6385 100644 --- a/ledger/narwhal/Cargo.toml +++ b/ledger/narwhal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Data structures for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -64,37 +64,37 @@ transmission-id = [ "narwhal-transmission-id" ] [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "./batch-certificate" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "./batch-header" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "./data" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "./subdag" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.narwhal-transmission] package = "snarkvm-ledger-narwhal-transmission" path = "./transmission" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "./transmission-id" -version = "=0.16.11" +version = "=0.16.12" optional = true [dev-dependencies.snarkvm-ledger-narwhal] diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index b9438c2f90..b272fccaab 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-header/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.11" +version = "=0.16.12" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.11" +version = "=0.16.12" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.11" +version = "=0.16.12" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/batch-header/Cargo.toml b/ledger/narwhal/batch-header/Cargo.toml index a49234fa85..995c6af6fd 100644 --- a/ledger/narwhal/batch-header/Cargo.toml +++ b/ledger/narwhal/batch-header/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "A batch header for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-transmission-id/test-helpers", "time" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.11" +version = "=0.16.12" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.11" +version = "=0.16.12" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/data/Cargo.toml b/ledger/narwhal/data/Cargo.toml index 6616ef7c64..c9788fed46 100644 --- a/ledger/narwhal/data/Cargo.toml +++ b/ledger/narwhal/data/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-data" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -29,7 +29,7 @@ async = [ "tokio" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.11" +version = "=0.16.12" [dependencies.bytes] version = "1" diff --git a/ledger/narwhal/subdag/Cargo.toml b/ledger/narwhal/subdag/Cargo.toml index dac1bd44bf..67d87d0544 100644 --- a/ledger/narwhal/subdag/Cargo.toml +++ b/ledger/narwhal/subdag/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "A subdag for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ "narwhal-batch-certificate/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.11" +version = "=0.16.12" [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../batch-certificate" -version = "=0.16.11" +version = "=0.16.12" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.11" +version = "=0.16.12" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.11" +version = "=0.16.12" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/transmission-id/Cargo.toml b/ledger/narwhal/transmission-id/Cargo.toml index 8ce9d53d31..8f2cc6e59f 100644 --- a/ledger/narwhal/transmission-id/Cargo.toml +++ b/ledger/narwhal/transmission-id/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "A transmission ID for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.11" +version = "=0.16.12" [dev-dependencies.bincode] version = "1.3" diff --git a/ledger/narwhal/transmission/Cargo.toml b/ledger/narwhal/transmission/Cargo.toml index d9ce4f5e91..689ee9e837 100644 --- a/ledger/narwhal/transmission/Cargo.toml +++ b/ledger/narwhal/transmission/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "A transmission for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../block" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "../data" -version = "=0.16.11" +version = "=0.16.12" [dependencies.bytes] version = "1" diff --git a/ledger/query/Cargo.toml b/ledger/query/Cargo.toml index b99d8c30ce..582bf28e6f 100644 --- a/ledger/query/Cargo.toml +++ b/ledger/query/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-query" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "A query for a decentralized virtual machine" homepage = "https://aleo.org" @@ -30,18 +30,18 @@ query = [ "ledger-store", "synthesizer-program", "ureq" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.async-trait] diff --git a/ledger/store/Cargo.toml b/ledger/store/Cargo.toml index 33d8063248..2ee5781024 100644 --- a/ledger/store/Cargo.toml +++ b/ledger/store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-store" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "A data store for a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,42 +32,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../coinbase" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../committee" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../narwhal/batch-certificate" -version = "=0.16.11" +version = "=0.16.12" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.11" +version = "=0.16.12" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.11" +version = "=0.16.12" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/test-helpers/Cargo.toml b/ledger/test-helpers/Cargo.toml index a5f624d5a8..e83e3627f2 100644 --- a/ledger/test-helpers/Cargo.toml +++ b/ledger/test-helpers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-test-helpers" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Test helpers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -19,39 +19,39 @@ edition = "2021" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.11" +version = "=0.16.12" [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../query" -version = "=0.16.11" +version = "=0.16.12" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.11" +version = "=0.16.12" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.11" +version = "=0.16.12" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "../../synthesizer/process" -version = "=0.16.11" +version = "=0.16.12" [dependencies.once_cell] version = "1.18" diff --git a/metrics/Cargo.toml b/metrics/Cargo.toml index 8b240b78c0..2046b13ea4 100644 --- a/metrics/Cargo.toml +++ b/metrics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-metrics" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Metrics for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/parameters/Cargo.toml b/parameters/Cargo.toml index a0e8832382..6df31a71cc 100644 --- a/parameters/Cargo.toml +++ b/parameters/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-parameters" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Parameters for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "encoding", "js-sys", "web-sys" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.11" +version = "=0.16.12" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/Cargo.toml b/synthesizer/Cargo.toml index 8218959d07..54637f1720 100644 --- a/synthesizer/Cargo.toml +++ b/synthesizer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Synthesizer for a decentralized virtual machine" homepage = "https://aleo.org" @@ -68,61 +68,61 @@ harness = false [dependencies.algorithms] package = "snarkvm-algorithms" path = "../algorithms" -version = "=0.16.11" +version = "=0.16.12" [dependencies.circuit] package = "snarkvm-circuit" path = "../circuit" -version = "=0.16.11" +version = "=0.16.12" [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../ledger/block" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../ledger/coinbase" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../ledger/committee" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../ledger/query" -version = "=0.16.11" +version = "=0.16.12" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../ledger/store" -version = "=0.16.11" +version = "=0.16.12" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "./process" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "./program" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "./snark" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.aleo-std] diff --git a/synthesizer/process/Cargo.toml b/synthesizer/process/Cargo.toml index f3c74baba8..c15af587b5 100644 --- a/synthesizer/process/Cargo.toml +++ b/synthesizer/process/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-process" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "A process for a decentralized virtual machine" homepage = "https://aleo.org" @@ -48,45 +48,45 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.11" +version = "=0.16.12" default-features = false features = [ "network", "program", "types" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../ledger/block" -version = "=0.16.11" +version = "=0.16.12" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../../ledger/query" -version = "=0.16.11" +version = "=0.16.12" default-features = false [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../../ledger/store" -version = "=0.16.11" +version = "=0.16.12" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.11" +version = "=0.16.12" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.11" +version = "=0.16.12" [dependencies.utilities] package = "snarkvm-utilities" path = "../../utilities" -version = "=0.16.11" +version = "=0.16.12" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/program/Cargo.toml b/synthesizer/program/Cargo.toml index 1ef2f01361..af55370cdf 100644 --- a/synthesizer/program/Cargo.toml +++ b/synthesizer/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-program" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Program for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "console/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.11" +version = "=0.16.12" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.11" +version = "=0.16.12" default-features = false features = [ "account", "network", "program", "types" ] diff --git a/synthesizer/snark/Cargo.toml b/synthesizer/snark/Cargo.toml index c4674bb582..509627652a 100644 --- a/synthesizer/snark/Cargo.toml +++ b/synthesizer/snark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-snark" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "SNARK wrappers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,18 +33,18 @@ wasm = [ "console/wasm", "snarkvm-algorithms/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.11" +version = "=0.16.12" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.11" +version = "=0.16.12" default-features = false features = [ "network" ] [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.11" +version = "=0.16.12" [dependencies.bincode] version = "1" diff --git a/utilities/Cargo.toml b/utilities/Cargo.toml index 44ac7c4d55..b03e3c4b4a 100644 --- a/utilities/Cargo.toml +++ b/utilities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Utilities for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities-derives] path = "./derives" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.aleo-std] diff --git a/utilities/derives/Cargo.toml b/utilities/derives/Cargo.toml index 7aabf8c77a..aebe837a8d 100644 --- a/utilities/derives/Cargo.toml +++ b/utilities/derives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities-derives" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "Canonical serialization for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index fd71fc8f94..b6b3707ecc 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-wasm" -version = "0.16.11" +version = "0.16.12" authors = [ "The Aleo Team " ] description = "WASM for a decentralized virtual machine" homepage = "https://aleo.org" @@ -37,30 +37,30 @@ utilities = [ "snarkvm-utilities" ] [dependencies.snarkvm-console] path = "../console" -version = "=0.16.11" +version = "=0.16.12" features = [ "wasm" ] optional = true [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.11" +version = "=0.16.12" optional = true [dependencies.snarkvm-synthesizer] path = "../synthesizer" -version = "=0.16.11" +version = "=0.16.12" default-features = false features = [ "wasm" ] optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.11" +version = "=0.16.12" features = [ "wasm" ] optional = true From 4378a1917c77949ae3518c77263a4b3785068a8e Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Mon, 27 Nov 2023 12:26:23 +0100 Subject: [PATCH 216/339] Do not allocate to check poly label length --- .../src/snark/varuna/ahp/indexer/indexer.rs | 30 +++++++++++-------- algorithms/src/snark/varuna/ahp/matrices.rs | 11 ++++--- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs index ec98aabd2f..88eca191a7 100644 --- a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs +++ b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs @@ -101,21 +101,27 @@ impl AHPForR1CS { map } + pub fn index_polynomial_labels_single<'a>( + matrix: &str, + id: &'a CircuitId, + ) -> impl ExactSizeIterator + 'a { + [ + format!("circuit_{id}_row_{matrix}"), + format!("circuit_{id}_col_{matrix}"), + format!("circuit_{id}_row_col_{matrix}"), + format!("circuit_{id}_row_col_val_{matrix}"), + ].into_iter() + } + pub fn index_polynomial_labels<'a>( matrices: &'a [&str], ids: impl Iterator + 'a, - ) -> Vec { + ) -> impl Iterator + 'a { ids.flat_map(move |id| { matrices.iter().flat_map(move |matrix| { - [ - format!("circuit_{id}_row_{matrix}"), - format!("circuit_{id}_col_{matrix}"), - format!("circuit_{id}_row_col_{matrix}"), - format!("circuit_{id}_row_col_val_{matrix}"), - ] + Self::index_polynomial_labels_single(matrix, id) }) }) - .collect_vec() } /// Generate the indexed circuit evaluations for this constraint system. @@ -231,11 +237,11 @@ impl AHPForR1CS { ) -> Result> { let mut all_evals = Vec::with_capacity(12); for (evals, domain, label) in [ - (state.a_arith, state.non_zero_a_domain, &["a"]), - (state.b_arith, state.non_zero_b_domain, &["b"]), - (state.c_arith, state.non_zero_c_domain, &["c"]), + (state.a_arith, state.non_zero_a_domain, "a"), + (state.b_arith, state.non_zero_b_domain, "b"), + (state.c_arith, state.non_zero_c_domain, "c"), ] { - let labels = Self::index_polynomial_labels(label, std::iter::once(id)); + let labels = Self::index_polynomial_labels_single(label, &id); let lagrange_coefficients_at_point = domain.evaluate_all_lagrange_coefficients(point); let evals_at_point = evals.evaluate(&lagrange_coefficients_at_point)?; ensure!(labels.len() == evals_at_point.len()); diff --git a/algorithms/src/snark/varuna/ahp/matrices.rs b/algorithms/src/snark/varuna/ahp/matrices.rs index 733548a106..a9a6d370e2 100644 --- a/algorithms/src/snark/varuna/ahp/matrices.rs +++ b/algorithms/src/snark/varuna/ahp/matrices.rs @@ -223,15 +223,14 @@ impl MatrixArithmetization { let row_col_val = matrix_evals.row_col_val.clone().interpolate(); end_timer!(interpolate_time); - let label = &[label]; - let mut labels = AHPForR1CS::::index_polynomial_labels(label, std::iter::once(id)); + let mut labels = AHPForR1CS::::index_polynomial_labels_single(&label, &id); ensure!(labels.len() == 4); Ok(MatrixArithmetization { - row_col_val: LabeledPolynomial::new(labels.pop().unwrap(), row_col_val, None, None), - row_col: LabeledPolynomial::new(labels.pop().unwrap(), row_col, None, None), - col: LabeledPolynomial::new(labels.pop().unwrap(), col, None, None), - row: LabeledPolynomial::new(labels.pop().unwrap(), row, None, None), + row: LabeledPolynomial::new(labels.next().unwrap(), row, None, None), + col: LabeledPolynomial::new(labels.next().unwrap(), col, None, None), + row_col: LabeledPolynomial::new(labels.next().unwrap(), row_col, None, None), + row_col_val: LabeledPolynomial::new(labels.next().unwrap(), row_col_val, None, None), }) } From cbfaeb0c12a30e149f3bf31798c1577c6361b84f Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Mon, 27 Nov 2023 12:27:02 +0100 Subject: [PATCH 217/339] Nit: move imports into block of external lib imports --- algorithms/src/polycommit/kzg10/mod.rs | 2 +- algorithms/src/polycommit/sonic_pc/polynomial.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/algorithms/src/polycommit/kzg10/mod.rs b/algorithms/src/polycommit/kzg10/mod.rs index 8619a48661..e1aff3180d 100644 --- a/algorithms/src/polycommit/kzg10/mod.rs +++ b/algorithms/src/polycommit/kzg10/mod.rs @@ -24,11 +24,11 @@ use crate::{ msm::VariableBase, polycommit::PCError, }; -use anyhow::{anyhow, ensure, Result}; use snarkvm_curves::traits::{AffineCurve, PairingCurve, PairingEngine, ProjectiveCurve}; use snarkvm_fields::{One, PrimeField, Zero}; use snarkvm_utilities::{cfg_iter, cfg_iter_mut, rand::Uniform, BitIteratorBE}; +use anyhow::{anyhow, ensure, Result}; use core::{marker::PhantomData, ops::Mul}; use itertools::Itertools; use rand_core::RngCore; diff --git a/algorithms/src/polycommit/sonic_pc/polynomial.rs b/algorithms/src/polycommit/sonic_pc/polynomial.rs index 52daace056..7c60cf35fa 100644 --- a/algorithms/src/polycommit/sonic_pc/polynomial.rs +++ b/algorithms/src/polycommit/sonic_pc/polynomial.rs @@ -14,10 +14,10 @@ use super::PolynomialLabel; use crate::fft::{DensePolynomial, EvaluationDomain, Evaluations as EvaluationsOnDomain, Polynomial, SparsePolynomial}; -use anyhow::{ensure, Result}; use snarkvm_fields::{Field, PrimeField}; use snarkvm_utilities::{cfg_iter, cfg_iter_mut, CanonicalDeserialize, CanonicalSerialize}; +use anyhow::{ensure, Result}; use hashbrown::HashMap; use std::borrow::Cow; From fdfd68a9c11ba22aff2f9acd080e47fc6c426138 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Mon, 27 Nov 2023 13:15:09 +0100 Subject: [PATCH 218/339] Refactor evaluate_index_polynomials to prevent redundant allocations and do not panic. A core constraint in this design, is that Rust cannot guarantee the size of chained iterators --- .../src/snark/varuna/ahp/indexer/indexer.rs | 31 ++++++++++++------- algorithms/src/snark/varuna/varuna.rs | 23 +++++--------- 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs index 88eca191a7..cb8379659b 100644 --- a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs +++ b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs @@ -14,7 +14,7 @@ use crate::{ fft::EvaluationDomain, - polycommit::sonic_pc::{PolynomialInfo, PolynomialLabel}, + polycommit::sonic_pc::{LinearCombination, PolynomialInfo, PolynomialLabel}, r1cs::{errors::SynthesisError, ConstraintSynthesizer, ConstraintSystem}, snark::varuna::{ ahp::{ @@ -110,18 +110,15 @@ impl AHPForR1CS { format!("circuit_{id}_col_{matrix}"), format!("circuit_{id}_row_col_{matrix}"), format!("circuit_{id}_row_col_val_{matrix}"), - ].into_iter() + ] + .into_iter() } pub fn index_polynomial_labels<'a>( matrices: &'a [&str], ids: impl Iterator + 'a, ) -> impl Iterator + 'a { - ids.flat_map(move |id| { - matrices.iter().flat_map(move |matrix| { - Self::index_polynomial_labels_single(matrix, id) - }) - }) + ids.flat_map(move |id| matrices.iter().flat_map(move |matrix| Self::index_polynomial_labels_single(matrix, id))) } /// Generate the indexed circuit evaluations for this constraint system. @@ -230,12 +227,17 @@ impl AHPForR1CS { result } + /// Evaluate the index polynomials for this constraint system at the given point. + /// Return the LinearCombination of the index polynomials and the sum of the evaluations. pub(crate) fn evaluate_index_polynomials( state: IndexerState, id: &CircuitId, point: F, - ) -> Result> { - let mut all_evals = Vec::with_capacity(12); + mut combiners: impl Iterator, + ) -> Result<(LinearCombination, F)> { + let mut lc = LinearCombination::empty("circuit_check"); + let mut all_evals = Vec::with_capacity(3); + let mut sum = F::zero(); for (evals, domain, label) in [ (state.a_arith, state.non_zero_a_domain, "a"), (state.b_arith, state.non_zero_b_domain, "b"), @@ -245,10 +247,15 @@ impl AHPForR1CS { let lagrange_coefficients_at_point = domain.evaluate_all_lagrange_coefficients(point); let evals_at_point = evals.evaluate(&lagrange_coefficients_at_point)?; ensure!(labels.len() == evals_at_point.len()); - all_evals.extend(labels.into_iter().zip_eq(evals_at_point.into_iter())); + all_evals.push(labels.into_iter().zip_eq(evals_at_point.into_iter())); + } + let sorted_evals = all_evals.into_iter().flatten().sorted_unstable_by(|(l1, _), (l2, _)| l1.cmp(l2)); + for (label, eval) in sorted_evals { + let combiner = combiners.next().ok_or(anyhow!("No combiner left"))?; + lc.add(combiner, label.as_str()); + sum += eval * combiner; } - all_evals.sort_by(|(l1, _), (l2, _)| l1.cmp(l2)); - Ok(all_evals.into_iter().map(|(_, eval)| eval)) + Ok((lc, sum)) } } diff --git a/algorithms/src/snark/varuna/varuna.rs b/algorithms/src/snark/varuna/varuna.rs index 7705a5aaf1..b4a5ce77f7 100644 --- a/algorithms/src/snark/varuna/varuna.rs +++ b/algorithms/src/snark/varuna/varuna.rs @@ -302,28 +302,19 @@ where // (since the first coeff is 1), and so we squeeze out `num_polynomials` points. let mut challenges = sponge.squeeze_nonnative_field_elements(verifying_key.circuit_commitments.len()); let point = challenges.pop().ok_or(anyhow!("Failed to squeeze random element"))?; - let one = E::Fr::one(); - let linear_combination_challenges = core::iter::once(&one).chain(challenges.iter()); + let combiners = core::iter::once(E::Fr::one()).chain(challenges.into_iter()); // We will construct a linear combination and provide a proof of evaluation of the lc at `point`. - let poly_info = AHPForR1CS::::index_polynomial_info(std::iter::once(circuit_id)); - let evaluations_at_point = AHPForR1CS::::evaluate_index_polynomials(state, circuit_id, point)?; - let mut lc = crate::polycommit::sonic_pc::LinearCombination::empty("circuit_check"); - let mut evaluation = E::Fr::zero(); - ensure!(poly_info.len() == challenges.len() + 1); - ensure!(poly_info.len() == evaluations_at_point.len()); - for ((label, &c), eval) in poly_info.keys().zip_eq(linear_combination_challenges).zip_eq(evaluations_at_point) { - lc.add(c, label.as_str()); - evaluation += c * eval; - } + let (lc, evaluation) = + AHPForR1CS::::evaluate_index_polynomials(state, circuit_id, point, combiners)?; - ensure!(verifying_key.circuit_commitments.len() == poly_info.len()); + ensure!(verifying_key.circuit_commitments.len() == lc.terms.len()); let commitments = verifying_key .iter() .cloned() - .zip_eq(poly_info.values()) - .map(|(c, info)| LabeledCommitment::new_with_info(info, c)) - .collect::>(); + .zip_eq(lc.terms.keys()) + .map(|(c, label)| LabeledCommitment::new(format!("{label:?}"), c, None)) + .collect_vec(); let evaluations = Evaluations::from_iter([(("circuit_check".into(), point), evaluation)]); let query_set = QuerySet::from_iter([("circuit_check".into(), ("challenge".into(), point))]); From 11889cd3d2fd64cd62dda3042957b3a64d03a25e Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Mon, 27 Nov 2023 14:37:49 +0100 Subject: [PATCH 219/339] this function has an empty attribute, but returns a type already marked as --- algorithms/src/fft/domain.rs | 1 - ledger/coinbase/src/lib.rs | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/algorithms/src/fft/domain.rs b/algorithms/src/fft/domain.rs index c5b38d012d..c121e9bfe2 100644 --- a/algorithms/src/fft/domain.rs +++ b/algorithms/src/fft/domain.rs @@ -345,7 +345,6 @@ impl EvaluationDomain { /// Perform O(n) multiplication of two polynomials that are presented by their /// evaluations in the domain. /// Returns the evaluations of the product over the domain. - #[must_use] pub fn mul_polynomials_in_evaluation_domain(&self, self_evals: Vec, other_evals: &[F]) -> Result> { let mut result = self_evals; diff --git a/ledger/coinbase/src/lib.rs b/ledger/coinbase/src/lib.rs index acbeb21ff0..c3016e150b 100644 --- a/ledger/coinbase/src/lib.rs +++ b/ledger/coinbase/src/lib.rs @@ -122,11 +122,10 @@ impl CoinbasePuzzle { let product_evaluations = { let polynomial_evaluations = pk.product_domain.in_order_fft_with_pc(&polynomial, &pk.fft_precomputation); - let product_evaluations = pk.product_domain.mul_polynomials_in_evaluation_domain( + pk.product_domain.mul_polynomials_in_evaluation_domain( polynomial_evaluations, &epoch_challenge.epoch_polynomial_evaluations().evaluations, - )?; - product_evaluations + )? }; let (commitment, _rand) = KZG10::commit_lagrange(&pk.lagrange_basis(), &product_evaluations, None, None)?; From e23945a695e3cd7ec294ddeecee651f6735da04f Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Mon, 27 Nov 2023 14:38:01 +0100 Subject: [PATCH 220/339] Cargo clippy --- algorithms/src/snark/varuna/ahp/indexer/indexer.rs | 2 +- algorithms/src/snark/varuna/ahp/matrices.rs | 2 +- algorithms/src/snark/varuna/varuna.rs | 4 +--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs index cb8379659b..9205937943 100644 --- a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs +++ b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs @@ -243,7 +243,7 @@ impl AHPForR1CS { (state.b_arith, state.non_zero_b_domain, "b"), (state.c_arith, state.non_zero_c_domain, "c"), ] { - let labels = Self::index_polynomial_labels_single(label, &id); + let labels = Self::index_polynomial_labels_single(label, id); let lagrange_coefficients_at_point = domain.evaluate_all_lagrange_coefficients(point); let evals_at_point = evals.evaluate(&lagrange_coefficients_at_point)?; ensure!(labels.len() == evals_at_point.len()); diff --git a/algorithms/src/snark/varuna/ahp/matrices.rs b/algorithms/src/snark/varuna/ahp/matrices.rs index a9a6d370e2..68e67cdec3 100644 --- a/algorithms/src/snark/varuna/ahp/matrices.rs +++ b/algorithms/src/snark/varuna/ahp/matrices.rs @@ -223,7 +223,7 @@ impl MatrixArithmetization { let row_col_val = matrix_evals.row_col_val.clone().interpolate(); end_timer!(interpolate_time); - let mut labels = AHPForR1CS::::index_polynomial_labels_single(&label, &id); + let mut labels = AHPForR1CS::::index_polynomial_labels_single(label, id); ensure!(labels.len() == 4); Ok(MatrixArithmetization { diff --git a/algorithms/src/snark/varuna/varuna.rs b/algorithms/src/snark/varuna/varuna.rs index b4a5ce77f7..df01ee4425 100644 --- a/algorithms/src/snark/varuna/varuna.rs +++ b/algorithms/src/snark/varuna/varuna.rs @@ -836,12 +836,10 @@ where // degree bounds because we know the committed index polynomial has the // correct degree. - // Gather commitments in one vector. - let poly_infos = AHPForR1CS::::index_polynomial_info(circuit_ids.iter()); let commitments: Vec<_> = circuit_commitments .into_iter() .flatten() - .zip_eq(poly_infos.values()) + .zip_eq(AHPForR1CS::::index_polynomial_info(circuit_ids.iter()).values()) .map(|(c, info)| LabeledCommitment::new_with_info(info, *c)) .chain(first_commitments) .chain(second_commitments) From e2674ba507ba023dbec70ad38bdb387822feb4d6 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Mon, 27 Nov 2023 15:51:00 +0100 Subject: [PATCH 221/339] Ensure we don't miss terms to add when summing LabeledPolynomialWithBasis --- algorithms/src/polycommit/sonic_pc/polynomial.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/algorithms/src/polycommit/sonic_pc/polynomial.rs b/algorithms/src/polycommit/sonic_pc/polynomial.rs index 7c60cf35fa..6b9aacd7a2 100644 --- a/algorithms/src/polycommit/sonic_pc/polynomial.rs +++ b/algorithms/src/polycommit/sonic_pc/polynomial.rs @@ -235,8 +235,9 @@ impl<'a, F: PrimeField> LabeledPolynomialWithBasis<'a, F> { match polynomial.as_ref() { Dense(p) => { if let Some(e) = dense_polys.get_mut(degree_bound) { - // Zip safety: `p` could be of smaller degree than `e` (or vice versa), + // Zip safety: `p` could be of smaller degree than `e`, // so it's okay to just use `zip` here. + ensure!(e.len() >= p.coeffs.len()); cfg_iter_mut!(e).zip(&p.coeffs).for_each(|(e, f)| *e += *c * f) } else { let mut e: DensePolynomial = p.clone().into_owned(); From de07aa01b4bd9bb4d7708d5e5d0f4c41931dc28d Mon Sep 17 00:00:00 2001 From: ljedrz Date: Mon, 27 Nov 2023 16:22:47 +0100 Subject: [PATCH 222/339] perf: reuse allocations in PoseidonGrainLFSR::get_field_elements_mod_p Signed-off-by: ljedrz --- fields/src/traits/poseidon_grain_lfsr.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/fields/src/traits/poseidon_grain_lfsr.rs b/fields/src/traits/poseidon_grain_lfsr.rs index 401469d1f8..1d14847396 100644 --- a/fields/src/traits/poseidon_grain_lfsr.rs +++ b/fields/src/traits/poseidon_grain_lfsr.rs @@ -117,21 +117,25 @@ impl PoseidonGrainLFSR { pub fn get_field_elements_mod_p(&mut self, num_elems: usize) -> Result> { // Ensure the number of bits matches the modulus. - if self.field_size_in_bits != F::Parameters::MODULUS_BITS as u64 { + let num_bits = self.field_size_in_bits; + if num_bits != F::Parameters::MODULUS_BITS as u64 { bail!("The number of bits in the field must match the modulus"); } + // Prepare reusable vectors for the intermediate bits and bytes. + let mut bits = Vec::with_capacity(num_bits as usize); + let mut bytes = Vec::with_capacity((num_bits as usize + 7) / 8); + let mut output = Vec::with_capacity(num_elems); for _ in 0..num_elems { // Obtain `n` bits and make it most-significant-bit first. - let bits_iter = self.get_bits(self.field_size_in_bits as usize); - let mut bits = Vec::with_capacity(bits_iter.len()); + let bits_iter = self.get_bits(num_bits as usize); for bit in bits_iter { bits.push(bit); } bits.reverse(); - let bytes = bits + for byte in bits .chunks(8) .map(|chunk| { let mut sum = chunk[0] as u8; @@ -143,9 +147,15 @@ impl PoseidonGrainLFSR { sum }) .rev() - .collect::>(); + { + bytes.push(byte); + } output.push(F::from_bytes_be_mod_order(&bytes)); + // Clear the vectors of bits and bytes so they can be reused + // in the next iteration. + bits.clear(); + bytes.clear(); } Ok(output) } From c91f98b59b81dc7d2481c8bf4387a6edbd7f01a5 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Mon, 27 Nov 2023 08:17:26 -0800 Subject: [PATCH 223/339] Check valid destination type for hash instruction --- synthesizer/program/src/logic/instruction/operation/hash.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synthesizer/program/src/logic/instruction/operation/hash.rs b/synthesizer/program/src/logic/instruction/operation/hash.rs index 6a320b2ab4..31edc306e7 100644 --- a/synthesizer/program/src/logic/instruction/operation/hash.rs +++ b/synthesizer/program/src/logic/instruction/operation/hash.rs @@ -107,7 +107,7 @@ fn check_number_of_operands(variant: u8, opcode: Opcode, num_operands: usize) -> fn is_valid_destination_type(destination_type: &PlaintextType) -> bool { !matches!( destination_type, - PlaintextType::Literal(LiteralType::Boolean) | PlaintextType::Literal(LiteralType::String) + PlaintextType::Literal(LiteralType::Boolean) | PlaintextType::Literal(LiteralType::String) | PlaintextType::Struct(..) | PlaintextType::Array(..) ) } From a331d0ea1c90b825596e4a878a819fd607748cc9 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Mon, 27 Nov 2023 08:17:50 -0800 Subject: [PATCH 224/339] Handle errors in integration tests --- synthesizer/tests/test_process_execute.rs | 213 ++++++++++++---------- 1 file changed, 114 insertions(+), 99 deletions(-) diff --git a/synthesizer/tests/test_process_execute.rs b/synthesizer/tests/test_process_execute.rs index 4824d194d1..2a4b118dc6 100644 --- a/synthesizer/tests/test_process_execute.rs +++ b/synthesizer/tests/test_process_execute.rs @@ -35,110 +35,125 @@ fn test_process_execute() { // Run each test and compare it against its corresponding expectation. tests.par_iter().for_each(|test| { - // Add the programs into the process. - let mut process = process.clone(); - for program in test.programs() { - process.add_program(program).unwrap() + // Run the test. + let output = run_test(process.clone(), test); + // Check against the expected output. + test.check(&output).unwrap(); + // Save the output. + test.save(&output).unwrap(); + }); +} + +// A helper function to run the test and extract the outputs as YAML, to be compared against the expectation. +fn run_test(process: Process, test: &ProgramTest) -> serde_yaml::Mapping { + // Initialize the output. + let mut output = serde_yaml::Mapping::new(); + output.insert( + serde_yaml::Value::String("errors".to_string()), + serde_yaml::Value::Sequence(serde_yaml::Sequence::new()), + ); + + // Add the programs into the process. + let mut process = process.clone(); + for program in test.programs() { + if let Err(err) = process.add_program(program) { + output + .get_mut(&serde_yaml::Value::String("errors".to_string())) + .unwrap() + .as_sequence_mut() + .unwrap() + .push(serde_yaml::Value::String(err.to_string())); + return output; } + } - // Initialize the RNG. - let rng = &mut match test.randomness() { - None => TestRng::default(), - Some(randomness) => TestRng::fixed(randomness), - }; + // Initialize the RNG. + let rng = &mut match test.randomness() { + None => TestRng::default(), + Some(randomness) => TestRng::fixed(randomness), + }; - let mut output = serde_yaml::Mapping::new(); - output.insert( - serde_yaml::Value::String("errors".to_string()), - serde_yaml::Value::Sequence(serde_yaml::Sequence::new()), - ); - output.insert( - serde_yaml::Value::String("outputs".to_string()), - serde_yaml::Value::Sequence( - test.cases() - .iter() - .map(|value| { - // Extract the function name, inputs, and optional private key. - let value = value.as_mapping().expect("expected mapping for test case"); - let program_id = ProgramID::::from_str( - value - .get("program") - .expect("expected program name for test case") - .as_str() - .expect("expected string for program name"), - ) - .expect("unable to parse program name"); - let function_name = Identifier::::from_str( - value - .get("function") - .expect("expected function name for test case") - .as_str() - .expect("expected string for function name"), - ) - .expect("unable to parse function name"); - let inputs = value - .get("inputs") - .expect("expected inputs for test case") - .as_sequence() - .expect("expected sequence for inputs") - .iter() - .map(|input| match &input { - serde_yaml::Value::Bool(bool) => { - Value::::from(Literal::Boolean(Boolean::new(*bool))) - } - _ => Value::::from_str( - input.as_str().expect("expected string for input"), - ) + output.insert( + serde_yaml::Value::String("outputs".to_string()), + serde_yaml::Value::Sequence( + test.cases() + .iter() + .map(|value| { + // Extract the function name, inputs, and optional private key. + let value = value.as_mapping().expect("expected mapping for test case"); + let program_id = ProgramID::::from_str( + value + .get("program") + .expect("expected program name for test case") + .as_str() + .expect("expected string for program name"), + ) + .expect("unable to parse program name"); + let function_name = Identifier::::from_str( + value + .get("function") + .expect("expected function name for test case") + .as_str() + .expect("expected string for function name"), + ) + .expect("unable to parse function name"); + let inputs = value + .get("inputs") + .expect("expected inputs for test case") + .as_sequence() + .expect("expected sequence for inputs") + .iter() + .map(|input| match &input { + serde_yaml::Value::Bool(bool) => { + Value::::from(Literal::Boolean(Boolean::new(*bool))) + } + _ => Value::::from_str(input.as_str().expect("expected string for input")) .expect("unable to parse input"), - }) - .collect_vec(); - let private_key = match value.get("private_key") { - Some(private_key) => PrivateKey::::from_str( - private_key.as_str().expect("expected string for private key"), - ) - .expect("unable to parse private key"), - None => PrivateKey::new(rng).unwrap(), - }; + }) + .collect_vec(); + let private_key = match value.get("private_key") { + Some(private_key) => PrivateKey::::from_str( + private_key.as_str().expect("expected string for private key"), + ) + .expect("unable to parse private key"), + None => PrivateKey::new(rng).unwrap(), + }; - let mut run_test = || -> serde_yaml::Value { - // Authorize the execution. - let authorization = match process.authorize::( - &private_key, - program_id, - function_name, - inputs.iter(), - rng, - ) { - Ok(authorization) => authorization, - Err(err) => return serde_yaml::Value::String(err.to_string()), - }; - // Execute the authorization and extract the output as YAML. - std::panic::catch_unwind(AssertUnwindSafe(|| { - match process.execute::(authorization, rng) { - Ok((response, _)) => serde_yaml::Value::Sequence( - response - .outputs() - .iter() - .cloned() - .map(|output| serde_yaml::Value::String(output.to_string())) - .collect_vec(), - ), - Err(err) => serde_yaml::Value::String(err.to_string()), - } - })) - .unwrap_or(serde_yaml::Value::String( - "Compiler panicked when calling `Process::execute`".to_string(), - )) + let mut run_test = || -> serde_yaml::Value { + // Authorize the execution. + let authorization = match process.authorize::( + &private_key, + program_id, + function_name, + inputs.iter(), + rng, + ) { + Ok(authorization) => authorization, + Err(err) => return serde_yaml::Value::String(err.to_string()), }; - run_test() - }) - .collect::(), - ), - ); + // Execute the authorization and extract the output as YAML. + std::panic::catch_unwind(AssertUnwindSafe(|| { + match process.execute::(authorization, rng) { + Ok((response, _)) => serde_yaml::Value::Sequence( + response + .outputs() + .iter() + .cloned() + .map(|output| serde_yaml::Value::String(output.to_string())) + .collect_vec(), + ), + Err(err) => serde_yaml::Value::String(err.to_string()), + } + })) + .unwrap_or(serde_yaml::Value::String( + "Compiler panicked when calling `Process::execute`".to_string(), + )) + }; + run_test() + }) + .collect::(), + ), + ); - // Check against the expected output. - test.check(&output).unwrap(); - // Save the output. - test.save(&output).unwrap(); - }); + output } From 0120f980c53d7cf0a5266d9e5abbf5e3db2eeb95 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Mon, 27 Nov 2023 08:21:12 -0800 Subject: [PATCH 225/339] Add test --- .../process/execute/hash_into_struct.out | 2 ++ .../process/execute/hash_into_struct.aleo | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 synthesizer/tests/expectations/process/execute/hash_into_struct.out create mode 100644 synthesizer/tests/tests/process/execute/hash_into_struct.aleo diff --git a/synthesizer/tests/expectations/process/execute/hash_into_struct.out b/synthesizer/tests/expectations/process/execute/hash_into_struct.out new file mode 100644 index 0000000000..5d6b35e881 --- /dev/null +++ b/synthesizer/tests/expectations/process/execute/hash_into_struct.out @@ -0,0 +1,2 @@ +errors: +- Invalid destination type in 'hash' instruction diff --git a/synthesizer/tests/tests/process/execute/hash_into_struct.aleo b/synthesizer/tests/tests/process/execute/hash_into_struct.aleo new file mode 100644 index 0000000000..c00bdc039a --- /dev/null +++ b/synthesizer/tests/tests/process/execute/hash_into_struct.aleo @@ -0,0 +1,24 @@ +/* +randomness: 9045282 +cases: [] +*/ + +program hash_into_struct.aleo; + +struct arjQITzQAw: + qcoZ_qzzye as boolean; + ynh0UgMeBB as address; + uLpRnfnsg9 as u8; + D4j4T0s8Kc as boolean; + MaDEhMWsdd as u8; + HpHdqmODmR as i64; + rnbm6ct6qw as u16; + +closure kmNSyjzeaZ: + input r0 as boolean; + hash.bhp768 5372560835405554868775356124803982999725684598186573362469277964967083823207field into r1 as arjQITzQAw; + output r1.qcoZ_qzzye as boolean; + +function uftFRlQzED: + input r0 as boolean.private; + output r0 as boolean.private; From d4a0fff75e94131423f599da63c2746d7df1e517 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Mon, 27 Nov 2023 08:28:16 -0800 Subject: [PATCH 226/339] Fmt --- synthesizer/program/src/logic/instruction/operation/hash.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/synthesizer/program/src/logic/instruction/operation/hash.rs b/synthesizer/program/src/logic/instruction/operation/hash.rs index 31edc306e7..85be953372 100644 --- a/synthesizer/program/src/logic/instruction/operation/hash.rs +++ b/synthesizer/program/src/logic/instruction/operation/hash.rs @@ -107,7 +107,10 @@ fn check_number_of_operands(variant: u8, opcode: Opcode, num_operands: usize) -> fn is_valid_destination_type(destination_type: &PlaintextType) -> bool { !matches!( destination_type, - PlaintextType::Literal(LiteralType::Boolean) | PlaintextType::Literal(LiteralType::String) | PlaintextType::Struct(..) | PlaintextType::Array(..) + PlaintextType::Literal(LiteralType::Boolean) + | PlaintextType::Literal(LiteralType::String) + | PlaintextType::Struct(..) + | PlaintextType::Array(..) ) } From 21a6c7fca7abd5b713e947bf3c5c6d3bf2c4d755 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Mon, 27 Nov 2023 08:48:01 -0800 Subject: [PATCH 227/339] Fix integration tests --- .../tests/expectations/process/execute/hash_into_struct.out | 1 + synthesizer/tests/test_process_execute.rs | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/synthesizer/tests/expectations/process/execute/hash_into_struct.out b/synthesizer/tests/expectations/process/execute/hash_into_struct.out index 5d6b35e881..f750db7204 100644 --- a/synthesizer/tests/expectations/process/execute/hash_into_struct.out +++ b/synthesizer/tests/expectations/process/execute/hash_into_struct.out @@ -1,2 +1,3 @@ errors: - Invalid destination type in 'hash' instruction +outputs: [] diff --git a/synthesizer/tests/test_process_execute.rs b/synthesizer/tests/test_process_execute.rs index 2a4b118dc6..d57b5b91cf 100644 --- a/synthesizer/tests/test_process_execute.rs +++ b/synthesizer/tests/test_process_execute.rs @@ -63,6 +63,10 @@ fn run_test(process: Process, test: &ProgramTest) -> serde_yaml: .as_sequence_mut() .unwrap() .push(serde_yaml::Value::String(err.to_string())); + output.insert( + serde_yaml::Value::String("outputs".to_string()), + serde_yaml::Value::Sequence(serde_yaml::Sequence::new()), + ); return output; } } From 4d53416e32310bb0dc2b84e244966903e43bb495 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Mon, 27 Nov 2023 08:52:53 -0800 Subject: [PATCH 228/339] Fmt --- synthesizer/program/src/logic/instruction/operation/hash.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/synthesizer/program/src/logic/instruction/operation/hash.rs b/synthesizer/program/src/logic/instruction/operation/hash.rs index 85be953372..cd7954e887 100644 --- a/synthesizer/program/src/logic/instruction/operation/hash.rs +++ b/synthesizer/program/src/logic/instruction/operation/hash.rs @@ -108,9 +108,9 @@ fn is_valid_destination_type(destination_type: &PlaintextType) -> !matches!( destination_type, PlaintextType::Literal(LiteralType::Boolean) - | PlaintextType::Literal(LiteralType::String) - | PlaintextType::Struct(..) - | PlaintextType::Array(..) + | PlaintextType::Literal(LiteralType::String) + | PlaintextType::Struct(..) + | PlaintextType::Array(..) ) } From a16555599852eff4df077d3efbeb70745ba6ede6 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 27 Nov 2023 16:36:59 -0500 Subject: [PATCH 229/339] Add check for duplicate program IDs --- ledger/block/src/verify.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ledger/block/src/verify.rs b/ledger/block/src/verify.rs index 8f6d3facbc..4429010cd6 100644 --- a/ledger/block/src/verify.rs +++ b/ledger/block/src/verify.rs @@ -410,6 +410,16 @@ impl Block { bail!("Found a duplicate transition in block {height}"); } + // Ensure there are not duplicate program IDs. + if has_duplicates( + self.transactions() + .iter() + .filter_map(|tx| tx.transaction().deployment()) + .map(|deployment| deployment.program_id()), + ) { + bail!("Found a duplicate program ID in block {height}"); + } + /* Input */ // Ensure there are no duplicate input IDs. From cd6761430da6279a1690abfc49c99adcdf58b8f1 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 27 Nov 2023 16:37:57 -0500 Subject: [PATCH 230/339] Add test for duplicate program ids --- ledger/src/tests.rs | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/ledger/src/tests.rs b/ledger/src/tests.rs index e20ebde59e..a645e2923e 100644 --- a/ledger/src/tests.rs +++ b/ledger/src/tests.rs @@ -636,3 +636,60 @@ fn test_aborted_transaction_indexing() { // Add the deployment block to the ledger. ledger.advance_to_next_block(&block).unwrap(); } + +#[test] +fn test_deployment_duplicate_program_id() { + let rng = &mut TestRng::default(); + + // Initialize the test environment. + let crate::test_helpers::TestEnv { ledger, private_key, .. } = crate::test_helpers::sample_test_env(rng); + + // Create two programs with a duplicate program ID but different mappings + let program_1 = Program::::from_str( + r" +program dummy_program.aleo; +mapping abcd1: + key as address.public; + value as u64.public; +function foo: + input r0 as u8.private; + async foo r0 into r1; + output r1 as dummy_program.aleo/foo.future; +finalize foo: + input r0 as u8.public; + add r0 r0 into r1;", + ) + .unwrap(); + + let program_2 = Program::::from_str( + r" +program dummy_program.aleo; +mapping abcd2: + key as address.public; + value as u64.public; +function foo2: + input r0 as u8.private; + async foo2 r0 into r1; + output r1 as dummy_program.aleo/foo2.future; +finalize foo2: + input r0 as u8.public; + add r0 r0 into r1;", + ) + .unwrap(); + + // Create a deployment transaction for the first program. + let deployment_1 = ledger.vm.deploy(&private_key, &program_1, None, 0, None, rng).unwrap(); + assert!(ledger.check_transaction_basic(&deployment_1, None, rng).is_ok()); + + // Create a deployment transaction for the second program. + let deployment_2 = ledger.vm.deploy(&private_key, &program_2, None, 0, None, rng).unwrap(); + assert!(ledger.check_transaction_basic(&deployment_2, None, rng).is_ok()); + + // Create a block. + let block = ledger + .prepare_advance_to_next_beacon_block(&private_key, vec![], vec![], vec![deployment_1, deployment_2], rng) + .unwrap(); + + // Check that the next block is valid. + assert!(ledger.check_next_block(&block, rng).is_err()); +} From 0be202b179cd6808b784b5af48e4ff741aeae957 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 27 Nov 2023 17:34:25 -0500 Subject: [PATCH 231/339] Reject subsequent deployments with duplicate program ids in a block --- ledger/src/tests.rs | 16 ++++++++- synthesizer/src/vm/finalize.rs | 65 ++++++++++++++++++++++++---------- synthesizer/src/vm/mod.rs | 2 +- 3 files changed, 62 insertions(+), 21 deletions(-) diff --git a/ledger/src/tests.rs b/ledger/src/tests.rs index a645e2923e..f3081b22ee 100644 --- a/ledger/src/tests.rs +++ b/ledger/src/tests.rs @@ -679,10 +679,12 @@ finalize foo2: // Create a deployment transaction for the first program. let deployment_1 = ledger.vm.deploy(&private_key, &program_1, None, 0, None, rng).unwrap(); + let deployment_1_id = deployment_1.id(); assert!(ledger.check_transaction_basic(&deployment_1, None, rng).is_ok()); // Create a deployment transaction for the second program. let deployment_2 = ledger.vm.deploy(&private_key, &program_2, None, 0, None, rng).unwrap(); + let deployment_2_id = deployment_2.id(); assert!(ledger.check_transaction_basic(&deployment_2, None, rng).is_ok()); // Create a block. @@ -691,5 +693,17 @@ finalize foo2: .unwrap(); // Check that the next block is valid. - assert!(ledger.check_next_block(&block, rng).is_err()); + ledger.check_next_block(&block, rng).unwrap(); + + // Add the block to the ledger. + ledger.advance_to_next_block(&block).unwrap(); + + // Enforce that the block transactions were correct. + assert_eq!(block.transactions().num_accepted(), 1); + assert_eq!(block.transactions().num_rejected(), 1); + + // Enforce that the first program was deployed and the second was rejected. + assert_eq!(ledger.get_program(*program_1.id()).unwrap(), program_1); + assert!(ledger.vm.transaction_store().contains_transaction_id(&deployment_1_id).unwrap()); + assert!(ledger.vm.block_store().contains_rejected_or_aborted_transaction_id(&deployment_2_id).unwrap()); } diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index 29f239e71e..dccf122967 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -212,6 +212,8 @@ impl> VM { let mut confirmed = Vec::with_capacity(num_transactions); // Initialize a list of the aborted transactions. let mut aborted = Vec::new(); + // Initialize a list of the successful deployments. + let mut deployments = IndexSet::new(); // Initialize a counter for the confirmed transaction index. let mut counter = 0u32; @@ -233,25 +235,50 @@ impl> VM { // The finalize operation here involves appending the 'stack', // and adding the program to the finalize tree. Transaction::Deploy(_, program_owner, deployment, fee) => { - match process.finalize_deployment(state, store, deployment, fee) { - // Construct the accepted deploy transaction. - Ok((_, finalize)) => { - ConfirmedTransaction::accepted_deploy(counter, transaction.clone(), finalize) - .map_err(|e| e.to_string()) - } - // Construct the rejected deploy transaction. - Err(_error) => { - // Finalize the fee, to ensure it is valid. - match process.finalize_fee(state, store, fee).and_then(|finalize| { - Transaction::from_fee(fee.clone()).map(|fee_tx| (fee_tx, finalize)) - }) { - Ok((fee_tx, finalize)) => { - // Construct the rejected deployment. - let rejected = Rejected::new_deployment(*program_owner, *deployment.clone()); - // Construct the rejected deploy transaction. + // Define the closure for processing a rejected deployment. + let process_rejected_deployment = + |fee: &Fee, + deployment: Deployment| + -> Result, String>> { + process + .finalize_fee(state, store, fee) + .and_then(|finalize| { + Transaction::from_fee(fee.clone()).map(|fee_tx| (fee_tx, finalize)) + }) + .map(|(fee_tx, finalize)| { + let rejected = Rejected::new_deployment(*program_owner, deployment); ConfirmedTransaction::rejected_deploy(counter, fee_tx, rejected, finalize) .map_err(|e| e.to_string()) - } + }) + }; + + // Check if the program has already been deployed in this block. + match deployments.contains(deployment.program_id()) { + // If the program has already been deployed, construct the rejected deploy transaction. + true => match process_rejected_deployment(&fee, *deployment.clone()) { + Ok(result) => result, + Err(error) => { + // Note: On failure, skip this transaction, and continue speculation. + #[cfg(debug_assertions)] + eprintln!("Failed to finalize the fee in a rejected deploy - {error}"); + // Store the aborted transaction. + aborted.push((transaction.clone(), error.to_string())); + // Continue to the next transaction. + continue 'outer; + } + }, + // If the program has not yet been deployed, attempt to deploy it. + false => match process.finalize_deployment(state, store, deployment, fee) { + // Construct the accepted deploy transaction. + Ok((_, finalize)) => { + // Add the program id to the list of deployments. + deployments.insert(*deployment.program_id()); + ConfirmedTransaction::accepted_deploy(counter, transaction.clone(), finalize) + .map_err(|e| e.to_string()) + } + // Construct the rejected deploy transaction. + Err(_error) => match process_rejected_deployment(&fee, *deployment.clone()) { + Ok(result) => result, Err(error) => { // Note: On failure, skip this transaction, and continue speculation. #[cfg(debug_assertions)] @@ -261,8 +288,8 @@ impl> VM { // Continue to the next transaction. continue 'outer; } - } - } + }, + }, } } // The finalize operation here involves calling 'update_key_value', diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index a130668240..4be5e63786 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -59,7 +59,7 @@ use synthesizer_process::{Authorization, Process, Trace}; use synthesizer_program::{FinalizeGlobalState, FinalizeOperation, FinalizeStoreTrait, Program}; use aleo_std::prelude::{finish, lap, timer}; -use indexmap::IndexMap; +use indexmap::{IndexMap, IndexSet}; use parking_lot::RwLock; use std::sync::Arc; From 01512f90365c04e58886d6aa96673b2b9aa09ef3 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 27 Nov 2023 17:36:38 -0500 Subject: [PATCH 232/339] clippy --- synthesizer/src/vm/finalize.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index dccf122967..e954c5e9dd 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -255,7 +255,7 @@ impl> VM { // Check if the program has already been deployed in this block. match deployments.contains(deployment.program_id()) { // If the program has already been deployed, construct the rejected deploy transaction. - true => match process_rejected_deployment(&fee, *deployment.clone()) { + true => match process_rejected_deployment(fee, *deployment.clone()) { Ok(result) => result, Err(error) => { // Note: On failure, skip this transaction, and continue speculation. @@ -277,7 +277,7 @@ impl> VM { .map_err(|e| e.to_string()) } // Construct the rejected deploy transaction. - Err(_error) => match process_rejected_deployment(&fee, *deployment.clone()) { + Err(_error) => match process_rejected_deployment(fee, *deployment.clone()) { Ok(result) => result, Err(error) => { // Note: On failure, skip this transaction, and continue speculation. From f1aa7d8ac62900a929cc22a58ed1b54d3285108a Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Mon, 27 Nov 2023 15:53:04 -0800 Subject: [PATCH 233/339] Add check for nonzero commands --- synthesizer/program/src/finalize/bytes.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/synthesizer/program/src/finalize/bytes.rs b/synthesizer/program/src/finalize/bytes.rs index df2f1094ce..20cdb358df 100644 --- a/synthesizer/program/src/finalize/bytes.rs +++ b/synthesizer/program/src/finalize/bytes.rs @@ -33,6 +33,9 @@ impl> FromBytes for FinalizeCore u16::try_from(N::MAX_COMMANDS).map_err(error)? { return Err(error(format!("Failed to deserialize finalize: too many commands ({num_commands})"))); } @@ -71,7 +74,7 @@ impl> ToBytes for FinalizeCore // Write the number of commands for the finalize. let num_commands = self.commands.len(); - match num_commands <= N::MAX_COMMANDS { + match 0 < num_commands && num_commands <= N::MAX_COMMANDS { true => u16::try_from(num_commands).map_err(error)?.write_le(&mut writer)?, false => return Err(error(format!("Failed to write {num_commands} commands as bytes"))), } From 5246c887064063df2b724b5dc7a60c744d88421e Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Mon, 27 Nov 2023 15:53:27 -0800 Subject: [PATCH 234/339] Add check for nonzero inputs and commands in closure --- synthesizer/program/src/closure/bytes.rs | 10 ++++++++-- synthesizer/program/src/closure/parse.rs | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/synthesizer/program/src/closure/bytes.rs b/synthesizer/program/src/closure/bytes.rs index 1afb0e623e..6176f9f55a 100644 --- a/synthesizer/program/src/closure/bytes.rs +++ b/synthesizer/program/src/closure/bytes.rs @@ -23,6 +23,9 @@ impl> FromBytes for ClosureCore u16::try_from(N::MAX_INPUTS).map_err(error)? { return Err(error(format!("Failed to deserialize a closure: too many inputs ({num_inputs})"))); } @@ -33,6 +36,9 @@ impl> FromBytes for ClosureCore u32::try_from(N::MAX_INSTRUCTIONS).map_err(error)? { return Err(error(format!("Failed to deserialize a closure: too many instructions ({num_instructions})"))); } @@ -70,7 +76,7 @@ impl> ToBytes for ClosureCore u16::try_from(num_inputs).map_err(error)?.write_le(&mut writer)?, false => return Err(error(format!("Failed to write {num_inputs} inputs as bytes"))), } @@ -82,7 +88,7 @@ impl> ToBytes for ClosureCore u32::try_from(num_instructions).map_err(error)?.write_le(&mut writer)?, false => return Err(error(format!("Failed to write {num_instructions} instructions as bytes"))), } diff --git a/synthesizer/program/src/closure/parse.rs b/synthesizer/program/src/closure/parse.rs index fe88ef2e1e..4d9894b0d7 100644 --- a/synthesizer/program/src/closure/parse.rs +++ b/synthesizer/program/src/closure/parse.rs @@ -32,7 +32,7 @@ impl> Parser for ClosureCore Date: Mon, 27 Nov 2023 16:03:49 -0800 Subject: [PATCH 235/339] Clippy --- synthesizer/program/src/closure/bytes.rs | 4 ++-- synthesizer/program/src/finalize/bytes.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/synthesizer/program/src/closure/bytes.rs b/synthesizer/program/src/closure/bytes.rs index 6176f9f55a..60d717bf30 100644 --- a/synthesizer/program/src/closure/bytes.rs +++ b/synthesizer/program/src/closure/bytes.rs @@ -24,7 +24,7 @@ impl> FromBytes for ClosureCore u16::try_from(N::MAX_INPUTS).map_err(error)? { return Err(error(format!("Failed to deserialize a closure: too many inputs ({num_inputs})"))); @@ -37,7 +37,7 @@ impl> FromBytes for ClosureCore u32::try_from(N::MAX_INSTRUCTIONS).map_err(error)? { return Err(error(format!("Failed to deserialize a closure: too many instructions ({num_instructions})"))); diff --git a/synthesizer/program/src/finalize/bytes.rs b/synthesizer/program/src/finalize/bytes.rs index 20cdb358df..749be4982d 100644 --- a/synthesizer/program/src/finalize/bytes.rs +++ b/synthesizer/program/src/finalize/bytes.rs @@ -34,7 +34,7 @@ impl> FromBytes for FinalizeCore u16::try_from(N::MAX_COMMANDS).map_err(error)? { return Err(error(format!("Failed to deserialize finalize: too many commands ({num_commands})"))); From 585fb104f32fe22cff2365709a52e00ffba4016b Mon Sep 17 00:00:00 2001 From: Alessandro Coglio Date: Mon, 27 Nov 2023 23:46:48 -0800 Subject: [PATCH 236/339] Update my web page URL. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dbd1bf0af6..e2665cb94e 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ Thank you for helping make SnarkVM better! Collin Chin
      Collin Chin

      💻 📖 👀 - Alessandro Coglio
      Alessandro Coglio

      💻 📖 ⚠️ + Alessandro Coglio
      Alessandro Coglio

      💻 📖 ⚠️ Niklas Long
      Niklas Long

      💻 jules
      jules

      💻 Ali Mousa
      Ali Mousa

      💻 From 764b8973d7f55ffdfcf05649311a04e106ad9f14 Mon Sep 17 00:00:00 2001 From: collin <16715212+collinc97@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:05:20 -0800 Subject: [PATCH 237/339] regen contributors --- README.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index dbd1bf0af6..54a136fe4a 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ - +

      ## Table of Contents @@ -109,16 +109,16 @@ Thank you for helping make SnarkVM better! jules
      jules

      💻 Ali Mousa
      Ali Mousa

      💻 Weikeng Chen
      Weikeng Chen

      💻 - Max Bruce
      Max Bruce

      💻 + Evan Schott
      Evan Schott

      💻 + Max Bruce
      Max Bruce

      💻 zhiqiangxu
      zhiqiangxu

      💻 Javier Rodríguez Chatruc
      Javier Rodríguez Chatruc

      💻 Eduardo Morais
      Eduardo Morais

      💻 Maciej Zwoliński
      Maciej Zwoliński

      💻 Ivan Litteri
      Ivan Litteri

      💻 Francisco Strambini
      Francisco Strambini

      💻 - swift-mx
      swift-mx

      💻 Haruka
      Haruka

      🐛 💻 @@ -130,11 +130,20 @@ Thank you for helping make SnarkVM better! Psi Vesely
      Psi Vesely

      💻 + swift-mx
      swift-mx

      💻 Nacho Avecilla
      Nacho Avecilla

      💻 qy3u
      qy3u

      💻 Yt
      Yt

      💻 Kostyan
      Kostyan

      💻 + stanlagermin
      stanlagermin

      💻 + Sukey
      Sukey

      💻 + + + Alex Zhao
      Alex Zhao

      💻 + ghost ant
      ghost ant

      💻 + Psi Vesely
      Psi Vesely

      💻 Dependabot
      Dependabot

      💻 + Dependabot Preview
      Dependabot Preview

      💻 All Contributors
      All Contributors

      📖 From 17c0caba307f707d190dd98d5b282d5e429ad0ec Mon Sep 17 00:00:00 2001 From: collin <16715212+collinc97@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:06:29 -0800 Subject: [PATCH 238/339] fix nit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 54a136fe4a..8acfbc7658 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ snarkvm ## 4. Contributors -Thank you for helping make SnarkVM better! +Thank you for helping make snarkvm better! [🧐 What do the emojis mean?](https://allcontributors.org/docs/en/emoji-key) From fac4006e6aabfb0502588a27803eb5f2afb781c8 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Wed, 29 Nov 2023 15:28:38 -0800 Subject: [PATCH 239/339] Update README.md Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8acfbc7658..f1da38327a 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ snarkvm ## 4. Contributors -Thank you for helping make snarkvm better! +Thank you for helping make snarkVM better! [🧐 What do the emojis mean?](https://allcontributors.org/docs/en/emoji-key) From fa436c5ed68aec17d101f3f2bfbbb75606a22f2b Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Thu, 30 Nov 2023 12:51:22 -0500 Subject: [PATCH 240/339] Add bound checks for number of signatures in a batch certificate --- ledger/narwhal/batch-certificate/src/bytes.rs | 14 ++++++++++++++ ledger/narwhal/batch-certificate/src/lib.rs | 10 ++++++++++ 2 files changed, 24 insertions(+) diff --git a/ledger/narwhal/batch-certificate/src/bytes.rs b/ledger/narwhal/batch-certificate/src/bytes.rs index 1de636bf2a..df2cd98bfa 100644 --- a/ledger/narwhal/batch-certificate/src/bytes.rs +++ b/ledger/narwhal/batch-certificate/src/bytes.rs @@ -31,6 +31,13 @@ impl FromBytes for BatchCertificate { let batch_header = BatchHeader::read_le(&mut reader)?; // Read the number of signatures. let num_signatures = u32::read_le(&mut reader)?; + // Ensure the number of signatures is within bounds. + if num_signatures as usize > Self::MAX_SIGNATURES { + return Err(error(format!( + "Number of signatures ({num_signatures}) exceeds the maximum ({})", + Self::MAX_SIGNATURES + ))); + } // Read the signatures. let mut signatures = IndexMap::with_capacity(num_signatures as usize); for _ in 0..num_signatures { @@ -48,6 +55,13 @@ impl FromBytes for BatchCertificate { let batch_header = BatchHeader::read_le(&mut reader)?; // Read the number of signatures. let num_signatures = u16::read_le(&mut reader)?; + // Ensure the number of signatures is within bounds. + if num_signatures as usize > Self::MAX_SIGNATURES { + return Err(error(format!( + "Number of signatures ({num_signatures}) exceeds the maximum ({})", + Self::MAX_SIGNATURES + ))); + } // Read the signatures. let mut signatures = IndexSet::with_capacity(num_signatures as usize); for _ in 0..num_signatures { diff --git a/ledger/narwhal/batch-certificate/src/lib.rs b/ledger/narwhal/batch-certificate/src/lib.rs index bfdc385016..cb515aaa49 100644 --- a/ledger/narwhal/batch-certificate/src/lib.rs +++ b/ledger/narwhal/batch-certificate/src/lib.rs @@ -49,6 +49,11 @@ pub enum BatchCertificate { }, } +impl BatchCertificate { + /// The maximum number of signatures in a batch certificate. + pub const MAX_SIGNATURES: usize = 200; +} + impl BatchCertificate { // TODO (howardwu): For mainnet - Delete V1 and switch everyone to V2 as the default. /// Initializes a (deprecated) V1 batch certificate. @@ -75,6 +80,8 @@ impl BatchCertificate { // Hash the preimage. N::hash_bhp1024(&preimage.to_bits_le()) } + // Ensure that the number of signatures is within bounds. + ensure!(signatures.len() <= Self::MAX_SIGNATURES, "Invalid number of signatures"); // Compute the certificate ID. if certificate_id != compute_certificate_id(batch_header.batch_id(), &signatures)? { bail!("Invalid batch certificate ID") @@ -92,6 +99,9 @@ impl BatchCertificate { /// Initializes a new batch certificate. pub fn from(batch_header: BatchHeader, signatures: IndexSet>) -> Result { + // Ensure that the number of signatures is within bounds. + ensure!(signatures.len() <= Self::MAX_SIGNATURES, "Invalid number of signatures"); + // Verify the signatures are valid. for signature in &signatures { if !signature.verify(&signature.to_address(), &[batch_header.batch_id()]) { From 194675ff9aa00db05bf4e2f5f1f1d3f1527bb40e Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Thu, 30 Nov 2023 12:52:22 -0500 Subject: [PATCH 241/339] Add additional checks to batch header --- ledger/narwhal/batch-header/src/lib.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index 3801498a30..2f52c72823 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -73,6 +73,12 @@ impl BatchHeader { // If the round is not zero and not one, then there should be at least one previous certificate ID. _ => ensure!(!previous_certificate_ids.is_empty(), "Invalid round number, must have certificates"), } + + // Ensure that the number of transmissions is within bounds. + ensure!(transmission_ids.len() <= Self::MAX_TRANSMISSIONS, "Invalid number of transmission ids"); + // Ensure that the number of previous certificate IDs is within bounds. + ensure!(previous_certificate_ids.len() <= Self::MAX_CERTIFICATES, "Invalid number of previous certificate IDs"); + // Retrieve the address. let author = Address::try_from(private_key)?; // Compute the batch ID. @@ -98,6 +104,12 @@ impl BatchHeader { // If the round is not zero and not one, then there should be at least one previous certificate ID. _ => ensure!(!previous_certificate_ids.is_empty(), "Invalid round number, must have certificates"), } + + // Ensure that the number of transmissions is within bounds. + ensure!(transmission_ids.len() <= Self::MAX_TRANSMISSIONS, "Invalid number of transmission ids"); + // Ensure that the number of previous certificate IDs is within bounds. + ensure!(previous_certificate_ids.len() <= Self::MAX_CERTIFICATES, "Invalid number of previous certificate IDs"); + // Compute the batch ID. let batch_id = Self::compute_batch_id(author, round, timestamp, &transmission_ids, &previous_certificate_ids)?; // Verify the signature. From 9fb6f689f6f9ad665c31a3c4a0ba39ba5b868a53 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Thu, 30 Nov 2023 12:52:47 -0500 Subject: [PATCH 242/339] Add test for MAX_SIGNATURES --- Cargo.lock | 1 + ledger/committee/Cargo.toml | 4 ++++ ledger/committee/src/lib.rs | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 30dbab2ec4..c71f9e42e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3201,6 +3201,7 @@ dependencies = [ "serde_json", "snarkvm-console", "snarkvm-ledger-committee", + "snarkvm-ledger-narwhal-batch-certificate", "snarkvm-ledger-narwhal-batch-header", "snarkvm-metrics", "test-strategy", diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index 36d7e7eee9..254fc540f6 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -86,6 +86,10 @@ version = "0.4" [dev-dependencies.rayon] version = "1" +[dev-dependencies.ledger-narwhal-batch-certificate] +package = "snarkvm-ledger-narwhal-batch-certificate" +path = "../narwhal/batch-certificate" + [dev-dependencies.ledger-narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../narwhal/batch-header" diff --git a/ledger/committee/src/lib.rs b/ledger/committee/src/lib.rs index e961fd0619..95b8592b0c 100644 --- a/ledger/committee/src/lib.rs +++ b/ledger/committee/src/lib.rs @@ -416,5 +416,9 @@ mod tests { Committee::::MAX_COMMITTEE_SIZE as usize, ledger_narwhal_batch_header::BatchHeader::::MAX_CERTIFICATES ); + assert_eq!( + Committee::::MAX_COMMITTEE_SIZE as usize, + ledger_narwhal_batch_certificate::BatchCertificate::::MAX_SIGNATURES + ); } } From 5e9d3f0b3b0a0f012a659915f6dd472241a48cde Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Thu, 30 Nov 2023 22:21:19 -0800 Subject: [PATCH 243/339] Use execute_function --- synthesizer/process/src/stack/call/mod.rs | 4 ++-- synthesizer/process/src/stack/evaluate.rs | 6 +----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/synthesizer/process/src/stack/call/mod.rs b/synthesizer/process/src/stack/call/mod.rs index b5c3c8442b..5d6578ab73 100644 --- a/synthesizer/process/src/stack/call/mod.rs +++ b/synthesizer/process/src/stack/call/mod.rs @@ -257,8 +257,8 @@ impl CallTrait for Call { // Push the request onto the call stack. call_stack.push(request.clone())?; - // Evaluate the request. - let response = substack.evaluate_function::(call_stack, console_caller)?; + // Execute the request. + let response = substack.execute_function::(call_stack, console_caller, rng)?; // Return the request and response. (request, response) } diff --git a/synthesizer/process/src/stack/evaluate.rs b/synthesizer/process/src/stack/evaluate.rs index 4de683e245..9dda9b6db2 100644 --- a/synthesizer/process/src/stack/evaluate.rs +++ b/synthesizer/process/src/stack/evaluate.rs @@ -106,10 +106,6 @@ impl StackEvaluate for Stack { // Retrieve the next request, based on the call stack mode. let (request, call_stack) = match &call_stack { CallStack::Evaluate(authorization) => (authorization.next()?, call_stack), - CallStack::CheckDeployment(requests, _, _) | CallStack::PackageRun(requests, _, _) => { - let last_request = requests.last().ok_or(anyhow!("CallStack does not contain request"))?.clone(); - (last_request, call_stack) - } // If the evaluation is performed in the `Execute` mode, create a new `Evaluate` mode. // This is done to ensure that evaluation during execution is performed consistently. CallStack::Execute(authorization, _) => { @@ -120,7 +116,7 @@ impl StackEvaluate for Stack { let call_stack = CallStack::Evaluate(authorization); (request, call_stack) } - _ => bail!("Illegal operation: call stack must not be `Synthesize` or `Authorize` in `evaluate_function`."), + _ => bail!("Illegal operation: call stack must be `Evaluate` or `Execute` in `evaluate_function`."), }; lap!(timer, "Retrieve the next request"); From 5b37a43318fb0aae2d09e1b5c92a3918055e9cbd Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Fri, 1 Dec 2023 18:19:09 -0800 Subject: [PATCH 244/339] Add test with nested deployment and assert --- synthesizer/src/vm/mod.rs | 56 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index a130668240..2e0682f04e 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -976,6 +976,62 @@ function multitransfer: vm.add_next_block(&sample_next_block(&vm, &caller_private_key, &[execution], rng).unwrap()).unwrap(); } + #[test] + fn test_nested_deployment_with_assert() { + let rng = &mut TestRng::default(); + + // Initialize a private key. + let private_key = sample_genesis_private_key(rng); + + // Initialize the genesis block. + let genesis = sample_genesis_block(rng); + + // Initialize the VM. + let vm = sample_vm(); + // Update the VM. + vm.add_next_block(&genesis).unwrap(); + + // Deploy the base program. + let program = Program::from_str( + r" +program child_program.aleo; + +function check: + input r0 as field.private; + assert.eq r0 123456789123456789123456789123456789123456789123456789field; + ", + ) + .unwrap(); + + let deployment = vm.deploy(&private_key, &program, None, 0, None, rng).unwrap(); + assert!(vm.check_transaction(&deployment, None, rng).is_ok()); + vm.add_next_block(&sample_next_block(&vm, &private_key, &[deployment], rng).unwrap()).unwrap(); + + // Check that program is deployed. + assert!(vm.contains_program(&ProgramID::from_str("child_program.aleo").unwrap())); + + // Deploy the program that calls the program from the previous layer. + let program = Program::from_str( + r" +import child_program.aleo; + +program parent_program.aleo; + +function check: + input r0 as field.private; + call child_program.aleo/check r0; + ", + ) + .unwrap(); + + let deployment = vm.deploy(&private_key, &program, None, 0, None, rng).unwrap(); + assert!(vm.check_transaction(&deployment, None, rng).is_ok()); + vm.add_next_block(&sample_next_block(&vm, &private_key, &[deployment], rng).unwrap()).unwrap(); + + // Check that program is deployed. + assert!(vm.contains_program(&ProgramID::from_str("parent_program.aleo").unwrap())); + } + #[test] #[ignore] fn test_deployment_memory_overload() { From 5c351ad5dd7b4b1d1b1bef76952380dc2ba2f876 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Fri, 1 Dec 2023 21:07:46 -0800 Subject: [PATCH 245/339] nit --- ledger/block/src/verify.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ledger/block/src/verify.rs b/ledger/block/src/verify.rs index 4429010cd6..0d58dba982 100644 --- a/ledger/block/src/verify.rs +++ b/ledger/block/src/verify.rs @@ -412,10 +412,7 @@ impl Block { // Ensure there are not duplicate program IDs. if has_duplicates( - self.transactions() - .iter() - .filter_map(|tx| tx.transaction().deployment()) - .map(|deployment| deployment.program_id()), + self.transactions().iter().filter_map(|tx| tx.transaction().deployment().map(|d| d.program_id())), ) { bail!("Found a duplicate program ID in block {height}"); } From eb3bdc981cc709e6ac7aaaecc517301fc92e79b7 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Sat, 2 Dec 2023 11:16:33 -0500 Subject: [PATCH 246/339] nit --- ledger/block/src/verify.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/block/src/verify.rs b/ledger/block/src/verify.rs index 0d58dba982..6a278897b9 100644 --- a/ledger/block/src/verify.rs +++ b/ledger/block/src/verify.rs @@ -410,7 +410,7 @@ impl Block { bail!("Found a duplicate transition in block {height}"); } - // Ensure there are not duplicate program IDs. + // Ensure there are no duplicate program IDs. if has_duplicates( self.transactions().iter().filter_map(|tx| tx.transaction().deployment().map(|d| d.program_id())), ) { From aaf8428d684f79a24ea7369a92d27ce876a9c2fb Mon Sep 17 00:00:00 2001 From: iwantanode <87604944+tudorpintea999@users.noreply.github.com> Date: Sun, 3 Dec 2023 10:57:53 +0200 Subject: [PATCH 247/339] fix typo polynomial.cuh Signed-off-by: iwantanode <87604944+tudorpintea999@users.noreply.github.com> --- algorithms/cuda/cuda/polynomial.cuh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/cuda/cuda/polynomial.cuh b/algorithms/cuda/cuda/polynomial.cuh index e74fa7bad3..745075accc 100644 --- a/algorithms/cuda/cuda/polynomial.cuh +++ b/algorithms/cuda/cuda/polynomial.cuh @@ -116,7 +116,7 @@ public: size_t pcur = 0; size_t ecur = 0; - // Set up the first polynomail / evaluation in dmem0 + // Set up the first polynomial / evaluation in dmem0 if (pcount > 0) { mul_copy_poly(hmem0, dmem0, polynomials[0], plens[0], stream, lg_domain_size); // Perform NTT on the input data From e624de16007e42eb5b63f4be5423341d886269cc Mon Sep 17 00:00:00 2001 From: iwantanode <87604944+tudorpintea999@users.noreply.github.com> Date: Sun, 3 Dec 2023 10:59:50 +0200 Subject: [PATCH 248/339] fix typo build.rs Signed-off-by: iwantanode <87604944+tudorpintea999@users.noreply.github.com> --- algorithms/cuda/build.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/cuda/build.rs b/algorithms/cuda/build.rs index 8b2036d54a..8e85744b6c 100644 --- a/algorithms/cuda/build.rs +++ b/algorithms/cuda/build.rs @@ -20,7 +20,7 @@ fn main() { // account for cross-compilation [by examining environment variable] let target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap(); - // Set CC environment variable to choose alternative C compiler. + // Set CC environment variable to choose an alternative C compiler. // Optimization level depends on whether or not --release is passed // or implied. let mut cc = cc::Build::new(); From 5bf27ffa06b326943db4a84e4d116a78085e6a57 Mon Sep 17 00:00:00 2001 From: iwantanode <87604944+tudorpintea999@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:01:16 +0200 Subject: [PATCH 249/339] fix typo poseidon.rs Signed-off-by: iwantanode <87604944+tudorpintea999@users.noreply.github.com> --- algorithms/src/crypto_hash/poseidon.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/src/crypto_hash/poseidon.rs b/algorithms/src/crypto_hash/poseidon.rs index 87eb54a4d6..77a28d8d47 100644 --- a/algorithms/src/crypto_hash/poseidon.rs +++ b/algorithms/src/crypto_hash/poseidon.rs @@ -41,7 +41,7 @@ impl State impl Iterator { self.capacity_state.iter_mut().chain(self.rate_state.iter_mut()) } From eaa3ca76b8d88ef94bc907d5f7af8289d843982a Mon Sep 17 00:00:00 2001 From: iwantanode <87604944+tudorpintea999@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:02:59 +0200 Subject: [PATCH 250/339] fix typo dense.rs Signed-off-by: iwantanode <87604944+tudorpintea999@users.noreply.github.com> --- algorithms/src/fft/polynomial/dense.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/algorithms/src/fft/polynomial/dense.rs b/algorithms/src/fft/polynomial/dense.rs index 80322a78e9..80b9658fc1 100644 --- a/algorithms/src/fft/polynomial/dense.rs +++ b/algorithms/src/fft/polynomial/dense.rs @@ -77,7 +77,7 @@ impl DensePolynomial { while let Some(true) = coeffs.last().map(|c| c.is_zero()) { coeffs.pop(); } - // Check that either the coefficients vec is empty or that the last coeff is non-zero. + // Check that either the coefficients vec are empty or that the last coeff is non-zero. assert!(coeffs.last().map_or(true, |coeff| !coeff.is_zero())); Self { coeffs } @@ -700,7 +700,7 @@ mod tests { multiplier.add_polynomial(a.clone(), "a"); assert_eq!(multiplier.multiply().unwrap(), a); - // Note PolyMultiplier doesn't support a evaluations with no polynomials + // Note PolyMultiplier doesn't support evaluations with no polynomials } #[test] From 0dedb7434ffcd7ed6bc40b3ab9f6d95b28113993 Mon Sep 17 00:00:00 2001 From: iwantanode <87604944+tudorpintea999@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:04:59 +0200 Subject: [PATCH 251/339] fix typo sparse.rs Signed-off-by: iwantanode <87604944+tudorpintea999@users.noreply.github.com> --- algorithms/src/fft/polynomial/sparse.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/src/fft/polynomial/sparse.rs b/algorithms/src/fft/polynomial/sparse.rs index 23b2b1f0df..f38967f99f 100644 --- a/algorithms/src/fft/polynomial/sparse.rs +++ b/algorithms/src/fft/polynomial/sparse.rs @@ -93,7 +93,7 @@ impl SparsePolynomial { total } - /// Perform a naive n^2 multiplicatoin of `self` by `other`. + /// Perform a naive n^2 multiplication of `self` by `other`. pub fn mul(&self, other: &Self) -> Self { if self.is_zero() || other.is_zero() { SparsePolynomial::zero() From b181a9c40723c3e731e770df6c4468f6bbaa52b7 Mon Sep 17 00:00:00 2001 From: iwantanode <87604944+tudorpintea999@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:07:46 +0200 Subject: [PATCH 252/339] fix typo batched.rs Signed-off-by: iwantanode <87604944+tudorpintea999@users.noreply.github.com> --- algorithms/src/msm/variable_base/batched.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/algorithms/src/msm/variable_base/batched.rs b/algorithms/src/msm/variable_base/batched.rs index eb8e729183..b1f172d8a4 100644 --- a/algorithms/src/msm/variable_base/batched.rs +++ b/algorithms/src/msm/variable_base/batched.rs @@ -48,7 +48,7 @@ impl PartialOrd for BucketPosition { } } -/// Returns a batch size of sufficient size to amortise the cost of an inversion, +/// Returns a batch size of sufficient size to amortize the cost of an inversion, /// while attempting to reduce strain to the CPU cache. #[inline] const fn batch_size(msm_size: usize) -> usize { @@ -57,7 +57,7 @@ const fn batch_size(msm_size: usize) -> usize { // L1 and L2 cache sizes and dividing them by the size of group elements (i.e. 96 bytes). // // As the algorithm itself requires caching additional values beyond the group elements, - // the ideal batch size is less than expectations, to accommodate those values. + // the ideal batch size is less than expected, to accommodate those values. // In general, it was found that undershooting is better than overshooting this heuristic. if cfg!(target_arch = "x86_64") && msm_size < 500_000 { // Assumes an L1 cache size of 32KiB. Note that larger cache sizes From 1e8db878bbb1710ccce6b0beecc73dcb97537d91 Mon Sep 17 00:00:00 2001 From: iwantanode <87604944+tudorpintea999@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:10:44 +0200 Subject: [PATCH 253/339] fix typo mod.rs Signed-off-by: iwantanode <87604944+tudorpintea999@users.noreply.github.com> --- algorithms/src/polycommit/sonic_pc/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/src/polycommit/sonic_pc/mod.rs b/algorithms/src/polycommit/sonic_pc/mod.rs index 8cd6d55644..890c7286a3 100644 --- a/algorithms/src/polycommit/sonic_pc/mod.rs +++ b/algorithms/src/polycommit/sonic_pc/mod.rs @@ -159,7 +159,7 @@ impl> SonicKZG10 { Ok((ck, vk)) } - /// Outputs a commitments to `polynomials`. + /// Outputs commitments to `polynomials`. /// /// If `polynomials[i].is_hiding()`, then the `i`-th commitment is hiding /// up to `polynomials.hiding_bound()` queries. From b4b235af312910b52622276218cbae86368fc0ea Mon Sep 17 00:00:00 2001 From: iwantanode <87604944+tudorpintea999@users.noreply.github.com> Date: Sun, 3 Dec 2023 16:39:15 +0200 Subject: [PATCH 254/339] fix typo constraint_system.rs Signed-off-by: iwantanode <87604944+tudorpintea999@users.noreply.github.com> --- algorithms/src/r1cs/constraint_system.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/src/r1cs/constraint_system.rs b/algorithms/src/r1cs/constraint_system.rs index c6558570b8..0c73678a1a 100644 --- a/algorithms/src/r1cs/constraint_system.rs +++ b/algorithms/src/r1cs/constraint_system.rs @@ -26,7 +26,7 @@ pub trait ConstraintSynthesizer: Sync { } /// Represents a constraint system which can have new variables -/// allocated and constrains between them formed. +/// allocated and constraints between them formed. pub trait ConstraintSystem: Sized { /// Represents the type of the "root" of this constraint system /// so that nested namespaces can minimize indirection. From a2754476496b41d618d75460db73dc642a55b8d8 Mon Sep 17 00:00:00 2001 From: iwantanode <87604944+tudorpintea999@users.noreply.github.com> Date: Sun, 3 Dec 2023 16:40:42 +0200 Subject: [PATCH 255/339] fix typo mod.rs Signed-off-by: iwantanode <87604944+tudorpintea999@users.noreply.github.com> --- algorithms/src/r1cs/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/algorithms/src/r1cs/mod.rs b/algorithms/src/r1cs/mod.rs index 8f788008cc..11fc8042d5 100644 --- a/algorithms/src/r1cs/mod.rs +++ b/algorithms/src/r1cs/mod.rs @@ -67,9 +67,9 @@ impl Variable { /// Represents the index of either a public variable (input) or a private variable (auxiliary). #[derive(Copy, Clone, PartialEq, Debug, Eq, Hash)] pub enum Index { - /// Index of an public variable. + /// Index of a public variable. Public(usize), - /// Index of an private variable. + /// Index of a private variable. Private(usize), } From 36d5606c3b21aca0ad632993a870c28fc8525367 Mon Sep 17 00:00:00 2001 From: iwantanode <87604944+tudorpintea999@users.noreply.github.com> Date: Sun, 3 Dec 2023 17:03:25 +0200 Subject: [PATCH 256/339] fix typo ahp.rs Signed-off-by: iwantanode <87604944+tudorpintea999@users.noreply.github.com> --- algorithms/src/snark/varuna/ahp/ahp.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/src/snark/varuna/ahp/ahp.rs b/algorithms/src/snark/varuna/ahp/ahp.rs index 4539531b68..5d1e677dc1 100644 --- a/algorithms/src/snark/varuna/ahp/ahp.rs +++ b/algorithms/src/snark/varuna/ahp/ahp.rs @@ -166,7 +166,7 @@ impl AHPForR1CS { /// Public input should be unformatted. /// We construct the linear combinations as per section 5 of our protocol documentation. /// We can distinguish between: - /// (1) simple comitments: $\{\cm{g_A}, \cm{g_B}, \cm{g_C}\}$ and $\{\cm{\hat{z}_{B,i,j}}\}_{i \in {[\mathcal{D}]}}$, $\cm{g_1}$ + /// (1) simple commitments: $\{\cm{g_A}, \cm{g_B}, \cm{g_C}\}$ and $\{\cm{\hat{z}_{B,i,j}}\}_{i \in {[\mathcal{D}]}}$, $\cm{g_1}$ /// (2) virtual commitments for the lincheck_sumcheck and matrix_sumcheck. These are linear combinations of the simple commitments #[allow(non_snake_case)] pub fn construct_linear_combinations>( From 506be08db66c021b42ca9eda0ab4df396ee1fbee Mon Sep 17 00:00:00 2001 From: iwantanode <87604944+tudorpintea999@users.noreply.github.com> Date: Sun, 3 Dec 2023 17:12:29 +0200 Subject: [PATCH 257/339] fix typo mod.rs Signed-off-by: iwantanode <87604944+tudorpintea999@users.noreply.github.com> --- utilities/src/biginteger/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utilities/src/biginteger/mod.rs b/utilities/src/biginteger/mod.rs index 21e68fdbad..34fe2e1d4b 100644 --- a/utilities/src/biginteger/mod.rs +++ b/utilities/src/biginteger/mod.rs @@ -75,10 +75,10 @@ pub trait BigInteger: /// Returns true iff this number is odd. fn is_odd(&self) -> bool; - /// Returns true iff this number is even. + /// Returns true if this number is even. fn is_even(&self) -> bool; - /// Returns true iff this number is zero. + /// Returns true if this number is zero. fn is_zero(&self) -> bool; /// Compute the number of bits needed to encode this number. Always a From d82640dd012422b85fb2501e97a04c29725cdbac Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:04:21 -0800 Subject: [PATCH 258/339] Encode the version for new --- ledger/narwhal/batch-header/src/lib.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index e562906925..c70a02f7e8 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -67,7 +67,6 @@ impl BatchHeader { impl BatchHeader { /// Initializes a new batch header. pub fn new( - version: u8, private_key: &PrivateKey, round: u64, timestamp: i64, @@ -76,6 +75,11 @@ impl BatchHeader { last_committed_certificate_ids: IndexSet>, rng: &mut R, ) -> Result { + // Set the version. + // TODO (howardwu): For mainnet - Remove this version from the struct, we only use it here for backwards compatibility. + // NOTE: You must keep the version encoding in the byte serialization, just remove it from the struct in memory. + let version = 2u8; + match round { 0 | 1 => { // If the round is zero or one, then there should be no previous certificate IDs. @@ -263,7 +267,6 @@ pub mod test_helpers { (0..5).map(|_| Field::::rand(rng)).collect::>(); // Return the batch header. BatchHeader::new( - 2, // version &private_key, round, timestamp, From 376645819718f76e7278348449bd01080346e309 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:20:13 -0800 Subject: [PATCH 259/339] Rename the last election certificate IDs --- ledger/narwhal/batch-header/src/bytes.rs | 30 +++++++++--------- ledger/narwhal/batch-header/src/lib.rs | 33 ++++++++++---------- ledger/narwhal/batch-header/src/serialize.rs | 10 +++--- ledger/narwhal/batch-header/src/to_id.rs | 12 +++---- 4 files changed, 42 insertions(+), 43 deletions(-) diff --git a/ledger/narwhal/batch-header/src/bytes.rs b/ledger/narwhal/batch-header/src/bytes.rs index 30e136a542..7acc890eec 100644 --- a/ledger/narwhal/batch-header/src/bytes.rs +++ b/ledger/narwhal/batch-header/src/bytes.rs @@ -67,25 +67,25 @@ impl FromBytes for BatchHeader { // TODO (howardwu): For mainnet - Change this to always encode the number of committed certificate IDs. // We currently only encode the size and certificates only in the new version, for backwards compatibility. - let num_last_committed_certificate_ids = if version == 2 { - // Read the number of last committed certificate IDs. + let num_last_election_certificate_ids = if version == 2 { + // Read the number of last election certificate IDs. u16::read_le(&mut reader)? } else { - // Set the number of last committed certificate IDs to zero. + // Set the number of last election certificate IDs to zero. 0 }; - // Ensure the number of last committed certificate IDs is within bounds. - if num_last_committed_certificate_ids as usize > Self::MAX_CERTIFICATES { + // Ensure the number of last election certificate IDs is within bounds. + if num_last_election_certificate_ids as usize > Self::MAX_CERTIFICATES { return Err(error(format!( - "Number of last committed certificate IDs ({num_last_committed_certificate_ids}) exceeds the maximum ({})", + "Number of last election certificate IDs ({num_last_election_certificate_ids}) exceeds the maximum ({})", Self::MAX_CERTIFICATES ))); } - // Read the last committed certificate IDs. - let mut last_committed_certificate_ids = IndexSet::new(); - for _ in 0..num_last_committed_certificate_ids { + // Read the last election certificate IDs. + let mut last_election_certificate_ids = IndexSet::new(); + for _ in 0..num_last_election_certificate_ids { // Read the certificate ID. - last_committed_certificate_ids.insert(Field::read_le(&mut reader)?); + last_election_certificate_ids.insert(Field::read_le(&mut reader)?); } // Read the signature. @@ -99,7 +99,7 @@ impl FromBytes for BatchHeader { timestamp, transmission_ids, previous_certificate_ids, - last_committed_certificate_ids, + last_election_certificate_ids, signature, ) .map_err(|e| error(e.to_string()))?; @@ -143,12 +143,12 @@ impl ToBytes for BatchHeader { // TODO (howardwu): For mainnet - Change this to always encode the number of committed certificate IDs. // We currently only encode the size and certificates only in the new version, for backwards compatibility. if self.version != 1 { - // Write the number of last committed certificate IDs. - u16::try_from(self.last_committed_certificate_ids.len()) + // Write the number of last election certificate IDs. + u16::try_from(self.last_election_certificate_ids.len()) .map_err(|e| error(e.to_string()))? .write_le(&mut writer)?; - // Write the last committed certificate IDs. - for certificate_id in &self.last_committed_certificate_ids { + // Write the last election certificate IDs. + for certificate_id in &self.last_election_certificate_ids { // Write the certificate ID. certificate_id.write_le(&mut writer)?; } diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index c70a02f7e8..4c6aa96c5e 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -48,7 +48,7 @@ pub struct BatchHeader { /// The batch certificate IDs of the previous round. previous_certificate_ids: IndexSet>, /// The last committed batch certificate IDs. - last_committed_certificate_ids: IndexSet>, + last_election_certificate_ids: IndexSet>, /// The signature of the batch ID from the creator. signature: Signature, } @@ -72,7 +72,7 @@ impl BatchHeader { timestamp: i64, transmission_ids: IndexSet>, previous_certificate_ids: IndexSet>, - last_committed_certificate_ids: IndexSet>, + last_election_certificate_ids: IndexSet>, rng: &mut R, ) -> Result { // Set the version. @@ -84,8 +84,8 @@ impl BatchHeader { 0 | 1 => { // If the round is zero or one, then there should be no previous certificate IDs. ensure!(previous_certificate_ids.is_empty(), "Invalid round number, must not have certificates"); - // If the round is zero or one, then there should be no last committed certificate IDs. - ensure!(last_committed_certificate_ids.is_empty(), "Invalid batch, contains committed certificates"); + // If the round is zero or one, then there should be no last election certificate IDs. + ensure!(last_election_certificate_ids.is_empty(), "Invalid batch, contains election certificates"); } // If the round is not zero and not one, then there should be at least one previous certificate ID. _ => ensure!(!previous_certificate_ids.is_empty(), "Invalid round number, must have certificates"), @@ -100,7 +100,7 @@ impl BatchHeader { timestamp, &transmission_ids, &previous_certificate_ids, - &last_committed_certificate_ids, + &last_election_certificate_ids, )?; // Sign the preimage. let signature = private_key.sign(&[batch_id], rng)?; @@ -113,7 +113,7 @@ impl BatchHeader { timestamp, transmission_ids, previous_certificate_ids, - last_committed_certificate_ids, + last_election_certificate_ids, signature, }) } @@ -126,15 +126,15 @@ impl BatchHeader { timestamp: i64, transmission_ids: IndexSet>, previous_certificate_ids: IndexSet>, - last_committed_certificate_ids: IndexSet>, + last_election_certificate_ids: IndexSet>, signature: Signature, ) -> Result { match round { 0 | 1 => { // If the round is zero or one, then there should be no previous certificate IDs. ensure!(previous_certificate_ids.is_empty(), "Invalid round number, must not have certificates"); - // If the round is zero or one, then there should be no last committed certificate IDs. - ensure!(last_committed_certificate_ids.is_empty(), "Invalid batch, contains committed certificates"); + // If the round is zero or one, then there should be no last election certificate IDs. + ensure!(last_election_certificate_ids.is_empty(), "Invalid batch, contains election certificates"); } // If the round is not zero and not one, then there should be at least one previous certificate ID. _ => ensure!(!previous_certificate_ids.is_empty(), "Invalid round number, must have certificates"), @@ -147,7 +147,7 @@ impl BatchHeader { timestamp, &transmission_ids, &previous_certificate_ids, - &last_committed_certificate_ids, + &last_election_certificate_ids, )?; // Verify the signature. if !signature.verify(&author, &[batch_id]) { @@ -162,7 +162,7 @@ impl BatchHeader { timestamp, transmission_ids, previous_certificate_ids, - last_committed_certificate_ids, + last_election_certificate_ids, signature, }) } @@ -200,8 +200,8 @@ impl BatchHeader { } /// Returns the last committed batch certificate IDs. - pub const fn last_committed_certificate_ids(&self) -> &IndexSet> { - &self.last_committed_certificate_ids + pub const fn last_election_certificate_ids(&self) -> &IndexSet> { + &self.last_election_certificate_ids } /// Returns the signature. @@ -262,9 +262,8 @@ pub mod test_helpers { narwhal_transmission_id::test_helpers::sample_transmission_ids(rng).into_iter().collect::>(); // Checkpoint the timestamp for the batch. let timestamp = OffsetDateTime::now_utc().unix_timestamp(); - // Sample the last committed certificate IDs. - let last_committed_certificate_ids = - (0..5).map(|_| Field::::rand(rng)).collect::>(); + // Sample the last election certificate IDs. + let last_election_certificate_ids = (0..5).map(|_| Field::::rand(rng)).collect::>(); // Return the batch header. BatchHeader::new( &private_key, @@ -272,7 +271,7 @@ pub mod test_helpers { timestamp, transmission_ids, previous_certificate_ids, - last_committed_certificate_ids, + last_election_certificate_ids, rng, ) .unwrap() diff --git a/ledger/narwhal/batch-header/src/serialize.rs b/ledger/narwhal/batch-header/src/serialize.rs index dbf719eb0e..15cefd3a70 100644 --- a/ledger/narwhal/batch-header/src/serialize.rs +++ b/ledger/narwhal/batch-header/src/serialize.rs @@ -28,7 +28,7 @@ impl Serialize for BatchHeader { header.serialize_field("timestamp", &self.timestamp)?; header.serialize_field("transmission_ids", &self.transmission_ids)?; header.serialize_field("previous_certificate_ids", &self.previous_certificate_ids)?; - header.serialize_field("last_committed_certificate_ids", &self.last_committed_certificate_ids)?; + header.serialize_field("last_election_certificate_ids", &self.last_election_certificate_ids)?; header.serialize_field("signature", &self.signature)?; header.end() } @@ -54,10 +54,10 @@ impl<'de, N: Network> Deserialize<'de> for BatchHeader { return Err(error("Invalid batch header version")).map_err(de::Error::custom); } // TODO (howardwu): For mainnet - Always take from the 'header', no need to use this match case anymore. - // If the version is not 1, then parse the last committed certificate IDs. - let last_committed_certificate_ids = match version { + // If the version is not 1, then parse the last election certificate IDs. + let last_election_certificate_ids = match version { 1 => IndexSet::new(), - 2 => DeserializeExt::take_from_value::(&mut header, "last_committed_certificate_ids")?, + 2 => DeserializeExt::take_from_value::(&mut header, "last_election_certificate_ids")?, _ => unreachable!(), }; @@ -69,7 +69,7 @@ impl<'de, N: Network> Deserialize<'de> for BatchHeader { DeserializeExt::take_from_value::(&mut header, "timestamp")?, DeserializeExt::take_from_value::(&mut header, "transmission_ids")?, DeserializeExt::take_from_value::(&mut header, "previous_certificate_ids")?, - last_committed_certificate_ids, + last_election_certificate_ids, DeserializeExt::take_from_value::(&mut header, "signature")?, ) .map_err(de::Error::custom)?; diff --git a/ledger/narwhal/batch-header/src/to_id.rs b/ledger/narwhal/batch-header/src/to_id.rs index 0fe74bd547..1d3eea042b 100644 --- a/ledger/narwhal/batch-header/src/to_id.rs +++ b/ledger/narwhal/batch-header/src/to_id.rs @@ -24,7 +24,7 @@ impl BatchHeader { self.timestamp, &self.transmission_ids, &self.previous_certificate_ids, - &self.last_committed_certificate_ids, + &self.last_election_certificate_ids, ) } } @@ -38,7 +38,7 @@ impl BatchHeader { timestamp: i64, transmission_ids: &IndexSet>, previous_certificate_ids: &IndexSet>, - last_committed_certificate_ids: &IndexSet>, + last_election_certificate_ids: &IndexSet>, ) -> Result> { let mut preimage = Vec::new(); // Insert the author. @@ -63,10 +63,10 @@ impl BatchHeader { // TODO (howardwu): For mainnet - Change this to always encode the number of committed certificate IDs. // We currently only encode the size and certificates only in the new version, for backwards compatibility. if version != 1 { - // Insert the number of last committed certificate IDs. - u32::try_from(last_committed_certificate_ids.len())?.write_le(&mut preimage)?; - // Insert the last committed certificate IDs. - for certificate_id in last_committed_certificate_ids { + // Insert the number of last election certificate IDs. + u32::try_from(last_election_certificate_ids.len())?.write_le(&mut preimage)?; + // Insert the last election certificate IDs. + for certificate_id in last_election_certificate_ids { // Insert the certificate ID. certificate_id.write_le(&mut preimage)?; } From 35b4945617d58ac694b9d953aae3bd5808902a2a Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 3 Dec 2023 12:37:23 -0800 Subject: [PATCH 260/339] Adds election certificate IDs to the subdag --- ledger/narwhal/subdag/src/bytes.rs | 33 +++++++++++++++++++++++--- ledger/narwhal/subdag/src/lib.rs | 24 ++++++++++++++++--- ledger/narwhal/subdag/src/serialize.rs | 10 ++++++-- 3 files changed, 59 insertions(+), 8 deletions(-) diff --git a/ledger/narwhal/subdag/src/bytes.rs b/ledger/narwhal/subdag/src/bytes.rs index d4ed42913b..44cb8eb4b6 100644 --- a/ledger/narwhal/subdag/src/bytes.rs +++ b/ledger/narwhal/subdag/src/bytes.rs @@ -20,7 +20,7 @@ impl FromBytes for Subdag { // Read the version. let version = u8::read_le(&mut reader)?; // Ensure the version is valid. - if version != 1 { + if version != 1 && version != 2 { return Err(error(format!("Invalid subdag version ({version})"))); } @@ -53,8 +53,28 @@ impl FromBytes for Subdag { // Insert the round and certificates. subdag.insert(round, certificates); } + + // Read the election certificate IDs. + let mut election_certificate_ids = IndexSet::new(); + // TODO (howardwu): For mainnet - Always attempt to deserialize the election certificate IDs. + if version != 1 { + // Read the number of election certificate IDs. + let num_election_certificate_ids = u16::read_le(&mut reader)?; + // Ensure the number of election certificate IDs is within bounds. + if num_election_certificate_ids as usize > BatchHeader::::MAX_CERTIFICATES { + return Err(error(format!( + "Number of election certificate IDs ({num_election_certificate_ids}) exceeds the maximum ({})", + BatchHeader::::MAX_CERTIFICATES + ))); + } + for _ in 0..num_election_certificate_ids { + // Read the election certificate ID. + election_certificate_ids.insert(Field::read_le(&mut reader)?); + } + } + // Return the subdag. - Self::from(subdag).map_err(error) + Self::from(subdag, election_certificate_ids).map_err(error) } } @@ -62,7 +82,7 @@ impl ToBytes for Subdag { /// Writes the subdag to the buffer. fn write_le(&self, mut writer: W) -> IoResult<()> { // Write the version. - 1u8.write_le(&mut writer)?; + 2u8.write_le(&mut writer)?; // Write the number of rounds. u32::try_from(self.subdag.len()).map_err(error)?.write_le(&mut writer)?; // Write the round certificates. @@ -77,6 +97,13 @@ impl ToBytes for Subdag { certificate.write_le(&mut writer)?; } } + // Write the number of election certificate IDs. + u16::try_from(self.election_certificate_ids.len()).map_err(error)?.write_le(&mut writer)?; + // Write the election certificate IDs. + for election_certificate_id in &self.election_certificate_ids { + // Write the election certificate ID. + election_certificate_id.write_le(&mut writer)?; + } Ok(()) } } diff --git a/ledger/narwhal/subdag/src/lib.rs b/ledger/narwhal/subdag/src/lib.rs index 8fb93cfe9b..5935325648 100644 --- a/ledger/narwhal/subdag/src/lib.rs +++ b/ledger/narwhal/subdag/src/lib.rs @@ -82,23 +82,35 @@ fn sanity_check_subdag_with_dfs(subdag: &BTreeMap { /// The subdag of round certificates. subdag: BTreeMap>>, + /// The election certificate IDs. + election_certificate_ids: IndexSet>, } impl Subdag { /// Initializes a new subdag. - pub fn from(subdag: BTreeMap>>) -> Result { + pub fn from( + subdag: BTreeMap>>, + election_certificate_ids: IndexSet>, + ) -> Result { // Ensure the subdag is not empty. ensure!(!subdag.is_empty(), "Subdag cannot be empty"); + // Ensure the subdag does not exceed the maximum number of rounds. + ensure!(subdag.len() <= Self::MAX_ROUNDS, "Subdag cannot exceed the maximum number of rounds"); // Ensure the anchor round is even. ensure!(subdag.iter().next_back().map_or(0, |(r, _)| *r) % 2 == 0, "Anchor round must be even"); // Ensure there is only one leader certificate. ensure!(subdag.iter().next_back().map_or(0, |(_, c)| c.len()) == 1, "Subdag cannot have multiple leaders"); + // Ensure the number of election certificate IDs is within bounds. + ensure!( + election_certificate_ids.len() <= BatchHeader::::MAX_CERTIFICATES, + "Number of election certificate IDs exceeds the maximum" + ); // Ensure the rounds are sequential. ensure!(is_sequential(&subdag), "Subdag rounds must be sequential"); // Ensure the subdag structure matches the commit. ensure!(sanity_check_subdag_with_dfs(&subdag), "Subdag structure does not match commit"); // Ensure the leader certificate is an even round. - Ok(Self { subdag }) + Ok(Self { subdag, election_certificate_ids }) } } @@ -239,8 +251,14 @@ pub mod test_helpers { ); subdag.insert(starting_round + 2, indexset![certificate]); + // Initialize the election certificate IDs. + let mut election_certificate_ids = IndexSet::new(); + for _ in 0..AVAILABILITY_THRESHOLD { + election_certificate_ids.insert(rng.gen()); + } + // Return the subdag. - Subdag::from(subdag).unwrap() + Subdag::from(subdag, election_certificate_ids).unwrap() } /// Returns a list of sample subdags, sampled at random. diff --git a/ledger/narwhal/subdag/src/serialize.rs b/ledger/narwhal/subdag/src/serialize.rs index 961d91d286..fb73011d91 100644 --- a/ledger/narwhal/subdag/src/serialize.rs +++ b/ledger/narwhal/subdag/src/serialize.rs @@ -19,8 +19,9 @@ impl Serialize for Subdag { fn serialize(&self, serializer: S) -> Result { match serializer.is_human_readable() { true => { - let mut certificate = serializer.serialize_struct("Subdag", 1)?; + let mut certificate = serializer.serialize_struct("Subdag", 2)?; certificate.serialize_field("subdag", &self.subdag)?; + certificate.serialize_field("election_certificate_ids", &self.election_certificate_ids)?; certificate.end() } false => ToBytesSerializer::serialize_with_size_encoding(self, serializer), @@ -34,7 +35,12 @@ impl<'de, N: Network> Deserialize<'de> for Subdag { match deserializer.is_human_readable() { true => { let mut value = serde_json::Value::deserialize(deserializer)?; - Ok(Self::from(DeserializeExt::take_from_value::(&mut value, "subdag")?) + + // TODO (howardwu): For mainnet - Directly take the value, do not check if its missing. + let election_certificate_ids = + DeserializeExt::take_from_value::(&mut value, "election_certificate_ids").unwrap_or_default(); + + Ok(Self::from(DeserializeExt::take_from_value::(&mut value, "subdag")?, election_certificate_ids) .map_err(de::Error::custom)?) } false => FromBytesDeserializer::::deserialize_with_size_encoding(deserializer, "subdag"), From 43338330da3be1f8524d68ec54255337c6487822 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 3 Dec 2023 12:39:14 -0800 Subject: [PATCH 261/339] Adds getter for election certificate IDs in subdag --- ledger/narwhal/subdag/src/lib.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ledger/narwhal/subdag/src/lib.rs b/ledger/narwhal/subdag/src/lib.rs index 5935325648..2a279a98bc 100644 --- a/ledger/narwhal/subdag/src/lib.rs +++ b/ledger/narwhal/subdag/src/lib.rs @@ -171,6 +171,11 @@ impl Subdag { } } + /// Returns the election certificate IDs. + pub fn election_certificate_ids(&self) -> &IndexSet> { + &self.election_certificate_ids + } + /// Returns the subdag root of the transactions. pub fn to_subdag_root(&self) -> Result> { // Prepare the leaves. From 7b6061d31b0e892f2ced2936aaf46b17b580d5f1 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 3 Dec 2023 12:52:38 -0800 Subject: [PATCH 262/339] nit: fix comments --- ledger/narwhal/batch-header/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index 4c6aa96c5e..03465d1eab 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -47,7 +47,7 @@ pub struct BatchHeader { transmission_ids: IndexSet>, /// The batch certificate IDs of the previous round. previous_certificate_ids: IndexSet>, - /// The last committed batch certificate IDs. + /// The last election batch certificate IDs. last_election_certificate_ids: IndexSet>, /// The signature of the batch ID from the creator. signature: Signature, @@ -199,7 +199,7 @@ impl BatchHeader { &self.previous_certificate_ids } - /// Returns the last committed batch certificate IDs. + /// Returns the last election batch certificate IDs. pub const fn last_election_certificate_ids(&self) -> &IndexSet> { &self.last_election_certificate_ids } From d9bb326bbdc577345caf8babb8752f91dc765d75 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 4 Dec 2023 12:25:17 -0500 Subject: [PATCH 263/339] Abort transactions that attempt to double-spend inputs --- synthesizer/src/vm/finalize.rs | 18 ++++++++++++++++++ synthesizer/src/vm/mod.rs | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index 29f239e71e..620f3ed8a9 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -214,6 +214,8 @@ impl> VM { let mut aborted = Vec::new(); // Initialize a counter for the confirmed transaction index. let mut counter = 0u32; + // Initialize a list of spent input IDs. + let mut input_ids: IndexSet> = IndexSet::new(); // Finalize the transactions. 'outer: for transaction in transactions { @@ -226,6 +228,19 @@ impl> VM { continue 'outer; } + // TODO (raychu86): Consider using InputStore with contains_input_id_speculative instead. + // This can be added to the `finalize_execution` and `finalize_fee` methods to allow for + // a possible rejected transaction instead of always aborting. + // Ensure that the transaction is not double-spending an input. + for input_id in transaction.input_ids() { + if input_ids.contains(input_id) { + // Store the aborted transaction. + aborted.push((transaction.clone(), format!("Double-spending input {input_id}"))); + // Continue to the next transaction. + continue 'outer; + } + } + // Process the transaction in an isolated atomic batch. // - If the transaction succeeds, the finalize operations are stored. // - If the transaction fails, the atomic batch is aborted and no finalize operations are stored. @@ -314,6 +329,9 @@ impl> VM { match outcome { // If the transaction succeeded, store it and continue to the next transaction. Ok(confirmed_transaction) => { + // Add the input IDs to the set of spent input IDs. + input_ids.extend(confirmed_transaction.transaction().input_ids()); + // Store the confirmed transaction. confirmed.push(confirmed_transaction); // Increment the transaction index counter. counter = counter.saturating_add(1); diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index 2e0682f04e..3d295359c7 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -59,7 +59,7 @@ use synthesizer_process::{Authorization, Process, Trace}; use synthesizer_program::{FinalizeGlobalState, FinalizeOperation, FinalizeStoreTrait, Program}; use aleo_std::prelude::{finish, lap, timer}; -use indexmap::IndexMap; +use indexmap::{IndexMap, IndexSet}; use parking_lot::RwLock; use std::sync::Arc; From dc0761a3562ff5642731f7b7047dbba47052e4e2 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 4 Dec 2023 12:25:30 -0500 Subject: [PATCH 264/339] Add test for double-spend protection --- ledger/src/tests.rs | 80 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/ledger/src/tests.rs b/ledger/src/tests.rs index e20ebde59e..2ed27676b0 100644 --- a/ledger/src/tests.rs +++ b/ledger/src/tests.rs @@ -636,3 +636,83 @@ fn test_aborted_transaction_indexing() { // Add the deployment block to the ledger. ledger.advance_to_next_block(&block).unwrap(); } + +#[test] +fn test_execute_duplicate_input_ids() { + let rng = &mut TestRng::default(); + + // Initialize the test environment. + let crate::test_helpers::TestEnv { ledger, private_key, view_key, address, .. } = + crate::test_helpers::sample_test_env(rng); + + // A helper function to find records. + let find_records = || { + let microcredits = Identifier::from_str("microcredits").unwrap(); + ledger + .find_records(&view_key, RecordsFilter::SlowUnspent(private_key)) + .unwrap() + .filter(|(_, record)| match record.data().get(µcredits) { + Some(Entry::Private(Plaintext::Literal(Literal::U64(amount), _))) => !amount.is_zero(), + _ => false, + }) + .collect::>() + }; + + // Fetch the unspent records. + let records = find_records(); + let record_1 = records[0].clone(); + + // Prepare a transfer that spends the record. + let inputs = [ + Value::Record(record_1.clone()), + Value::from_str(&format!("{address}")).unwrap(), + Value::from_str("100u64").unwrap(), + ]; + let transfer_1 = ledger + .vm + .execute(&private_key, ("credits.aleo", "transfer_private"), inputs.into_iter(), None, 0, None, rng) + .unwrap(); + let transfer_1_id = transfer_1.id(); + + // Prepare a transfer that attempts to spend the same record. + let inputs = [ + Value::Record(record_1.clone()), + Value::from_str(&format!("{address}")).unwrap(), + Value::from_str("1000u64").unwrap(), + ]; + let transfer_2 = ledger + .vm + .execute(&private_key, ("credits.aleo", "transfer_private"), inputs.into_iter(), None, 0, None, rng) + .unwrap(); + let transfer_2_id = transfer_2.id(); + + // Prepare a transfer that attempts to spend the same record in the fee. + let inputs = [Value::from_str(&format!("{address}")).unwrap(), Value::from_str("100u64").unwrap()]; + let transfer_3 = ledger + .vm + .execute(&private_key, ("credits.aleo", "transfer_public"), inputs.into_iter(), Some(record_1), 0, None, rng) + .unwrap(); + let transfer_3_id = transfer_3.id(); + + // Create a block. + let block = ledger + .prepare_advance_to_next_beacon_block( + &private_key, + vec![], + vec![], + vec![transfer_1, transfer_2, transfer_3], + rng, + ) + .unwrap(); + + // Check that the next block is valid. + ledger.check_next_block(&block, rng).unwrap(); + + // Add the block to the ledger. + ledger.advance_to_next_block(&block).unwrap(); + + // Enforce that the block transactions were correct. + assert_eq!(block.transactions().num_accepted(), 1); + assert_eq!(block.transactions().transaction_ids().collect::>(), vec![&transfer_1_id]); + assert_eq!(block.aborted_transaction_ids(), &vec![transfer_2_id, transfer_3_id]); +} From 655a6d708d39e92e1e27433ef04cbc17f702c230 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 4 Dec 2023 18:23:05 -0500 Subject: [PATCH 265/339] Account for subsequent blocks as well --- ledger/src/tests.rs | 43 +++++++++++++++++++++++++++++++++- synthesizer/src/vm/finalize.rs | 5 +++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/ledger/src/tests.rs b/ledger/src/tests.rs index 2ed27676b0..e36b25c34a 100644 --- a/ledger/src/tests.rs +++ b/ledger/src/tests.rs @@ -690,10 +690,27 @@ fn test_execute_duplicate_input_ids() { let inputs = [Value::from_str(&format!("{address}")).unwrap(), Value::from_str("100u64").unwrap()]; let transfer_3 = ledger .vm - .execute(&private_key, ("credits.aleo", "transfer_public"), inputs.into_iter(), Some(record_1), 0, None, rng) + .execute( + &private_key, + ("credits.aleo", "transfer_public"), + inputs.into_iter(), + Some(record_1.clone()), + 0, + None, + rng, + ) .unwrap(); let transfer_3_id = transfer_3.id(); + // Prepare a transfer that attempts to spend the same record for the subsequent block. + let inputs = + [Value::Record(record_1), Value::from_str(&format!("{address}")).unwrap(), Value::from_str("1000u64").unwrap()]; + let transfer_4 = ledger + .vm + .execute(&private_key, ("credits.aleo", "transfer_private"), inputs.into_iter(), None, 0, None, rng) + .unwrap(); + let transfer_4_id = transfer_4.id(); + // Create a block. let block = ledger .prepare_advance_to_next_beacon_block( @@ -715,4 +732,28 @@ fn test_execute_duplicate_input_ids() { assert_eq!(block.transactions().num_accepted(), 1); assert_eq!(block.transactions().transaction_ids().collect::>(), vec![&transfer_1_id]); assert_eq!(block.aborted_transaction_ids(), &vec![transfer_2_id, transfer_3_id]); + + // Prepare a transfer that will succeed for the subsequent block. + let inputs = [Value::from_str(&format!("{address}")).unwrap(), Value::from_str("1000u64").unwrap()]; + let transfer_5 = ledger + .vm + .execute(&private_key, ("credits.aleo", "transfer_public"), inputs.into_iter(), None, 0, None, rng) + .unwrap(); + let transfer_5_id = transfer_5.id(); + + // Create a block. + let block = ledger + .prepare_advance_to_next_beacon_block(&private_key, vec![], vec![], vec![transfer_4, transfer_5], rng) + .unwrap(); + + // Check that the next block is valid. + ledger.check_next_block(&block, rng).unwrap(); + + // Add the block to the ledger. + ledger.advance_to_next_block(&block).unwrap(); + + // Enforce that the block transactions were correct. + assert_eq!(block.transactions().num_accepted(), 1); + assert_eq!(block.transactions().transaction_ids().collect::>(), vec![&transfer_5_id]); + assert_eq!(block.aborted_transaction_ids(), &vec![transfer_4_id]); } diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index 620f3ed8a9..ca601b2ef1 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -233,7 +233,10 @@ impl> VM { // a possible rejected transaction instead of always aborting. // Ensure that the transaction is not double-spending an input. for input_id in transaction.input_ids() { - if input_ids.contains(input_id) { + // If the input ID is already spent in this block or previous blocks, abort the transaction. + if input_ids.contains(input_id) + || self.transition_store().contains_input_id(input_id).map_err(|e| e.to_string())? + { // Store the aborted transaction. aborted.push((transaction.clone(), format!("Double-spending input {input_id}"))); // Continue to the next transaction. From 383d88a59486fe49b4080f9f530523f0892e7a1d Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 28 Nov 2023 15:53:01 +0100 Subject: [PATCH 266/339] perf: use Cell instead of RefCell to handle a bool Signed-off-by: ljedrz --- circuit/environment/src/circuit.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/circuit/environment/src/circuit.rs b/circuit/environment/src/circuit.rs index 4dd58fdc65..eac23704f7 100644 --- a/circuit/environment/src/circuit.rs +++ b/circuit/environment/src/circuit.rs @@ -14,14 +14,17 @@ use crate::{helpers::Constraint, Mode, *}; -use core::{cell::RefCell, fmt}; +use core::{ + cell::{Cell, RefCell}, + fmt, +}; use std::rc::Rc; type Field = ::Field; thread_local! { pub(super) static CIRCUIT: Rc>> = Rc::new(RefCell::new(R1CS::new())); - pub(super) static IN_WITNESS: Rc> = Rc::new(RefCell::new(false)); + pub(super) static IN_WITNESS: Rc> = Rc::new(Cell::new(false)); pub(super) static ZERO: LinearCombination = LinearCombination::zero(); pub(super) static ONE: LinearCombination = LinearCombination::one(); } @@ -49,7 +52,7 @@ impl Environment for Circuit { fn new_variable(mode: Mode, value: Self::BaseField) -> Variable { IN_WITNESS.with(|in_witness| { // Ensure we are not in witness mode. - if !(*(**in_witness).borrow()) { + if !(**in_witness).get() { CIRCUIT.with(|circuit| match mode { Mode::Constant => (**circuit).borrow_mut().new_constant(value), Mode::Public => (**circuit).borrow_mut().new_public(value), @@ -65,13 +68,13 @@ impl Environment for Circuit { fn new_witness Output::Primitive, Output: Inject>(mode: Mode, logic: Fn) -> Output { IN_WITNESS.with(|in_witness| { // Set the entire environment to witness mode. - *(**in_witness).borrow_mut() = true; + in_witness.replace(true); // Run the logic. let output = logic(); // Return the entire environment from witness mode. - *(**in_witness).borrow_mut() = false; + in_witness.replace(false); Inject::new(mode, output) }) @@ -108,7 +111,7 @@ impl Environment for Circuit { { IN_WITNESS.with(|in_witness| { // Ensure we are not in witness mode. - if !(*(**in_witness).borrow()) { + if !(**in_witness).get() { CIRCUIT.with(|circuit| { // Set the entire environment to the new scope. let name = name.into(); @@ -142,7 +145,7 @@ impl Environment for Circuit { { IN_WITNESS.with(|in_witness| { // Ensure we are not in witness mode. - if !(*(**in_witness).borrow()) { + if !(**in_witness).get() { CIRCUIT.with(|circuit| { let (a, b, c) = constraint(); let (a, b, c) = (a.into(), b.into(), c.into()); @@ -272,7 +275,7 @@ impl Environment for Circuit { fn eject_r1cs_and_reset() -> R1CS { CIRCUIT.with(|circuit| { // Reset the witness mode. - IN_WITNESS.with(|in_witness| *(**in_witness).borrow_mut() = false); + IN_WITNESS.with(|in_witness| in_witness.replace(false)); // Eject the R1CS instance. let r1cs = circuit.replace(R1CS::<::BaseField>::new()); // Ensure the circuit is now empty. @@ -291,7 +294,7 @@ impl Environment for Circuit { fn eject_assignment_and_reset() -> Assignment<::Field> { CIRCUIT.with(|circuit| { // Reset the witness mode. - IN_WITNESS.with(|in_witness| *(**in_witness).borrow_mut() = false); + IN_WITNESS.with(|in_witness| in_witness.replace(false)); // Eject the R1CS instance. let r1cs = circuit.replace(R1CS::<::BaseField>::new()); assert_eq!(0, (**circuit).borrow().num_constants()); @@ -307,7 +310,7 @@ impl Environment for Circuit { fn reset() { CIRCUIT.with(|circuit| { // Reset the witness mode. - IN_WITNESS.with(|in_witness| *(**in_witness).borrow_mut() = false); + IN_WITNESS.with(|in_witness| in_witness.replace(false)); *(**circuit).borrow_mut() = R1CS::<::BaseField>::new(); assert_eq!(0, (**circuit).borrow().num_constants()); assert_eq!(1, (**circuit).borrow().num_public()); From 10d97102c7842bde636f7ea242a95129afd324e2 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Thu, 30 Nov 2023 16:01:54 +0100 Subject: [PATCH 267/339] perf: remove unneeded Rcs from the circuitry Signed-off-by: ljedrz --- circuit/environment/src/circuit.rs | 85 ++++++++++---------- circuit/environment/src/helpers/converter.rs | 2 +- 2 files changed, 43 insertions(+), 44 deletions(-) diff --git a/circuit/environment/src/circuit.rs b/circuit/environment/src/circuit.rs index eac23704f7..3beb5637ee 100644 --- a/circuit/environment/src/circuit.rs +++ b/circuit/environment/src/circuit.rs @@ -18,13 +18,12 @@ use core::{ cell::{Cell, RefCell}, fmt, }; -use std::rc::Rc; type Field = ::Field; thread_local! { - pub(super) static CIRCUIT: Rc>> = Rc::new(RefCell::new(R1CS::new())); - pub(super) static IN_WITNESS: Rc> = Rc::new(Cell::new(false)); + pub(super) static CIRCUIT: RefCell> = RefCell::new(R1CS::new()); + pub(super) static IN_WITNESS: Cell = Cell::new(false); pub(super) static ZERO: LinearCombination = LinearCombination::zero(); pub(super) static ONE: LinearCombination = LinearCombination::one(); } @@ -52,11 +51,11 @@ impl Environment for Circuit { fn new_variable(mode: Mode, value: Self::BaseField) -> Variable { IN_WITNESS.with(|in_witness| { // Ensure we are not in witness mode. - if !(**in_witness).get() { + if !(*in_witness).get() { CIRCUIT.with(|circuit| match mode { - Mode::Constant => (**circuit).borrow_mut().new_constant(value), - Mode::Public => (**circuit).borrow_mut().new_public(value), - Mode::Private => (**circuit).borrow_mut().new_private(value), + Mode::Constant => (*circuit).borrow_mut().new_constant(value), + Mode::Public => (*circuit).borrow_mut().new_public(value), + Mode::Private => (*circuit).borrow_mut().new_private(value), }) } else { Self::halt("Tried to initialize a new variable in witness mode") @@ -111,11 +110,11 @@ impl Environment for Circuit { { IN_WITNESS.with(|in_witness| { // Ensure we are not in witness mode. - if !(**in_witness).get() { + if !(*in_witness).get() { CIRCUIT.with(|circuit| { // Set the entire environment to the new scope. let name = name.into(); - if let Err(error) = (**circuit).borrow_mut().push_scope(&name) { + if let Err(error) = (*circuit).borrow_mut().push_scope(&name) { Self::halt(error) } @@ -123,7 +122,7 @@ impl Environment for Circuit { let output = logic(); // Return the entire environment to the previous scope. - if let Err(error) = (**circuit).borrow_mut().pop_scope(name) { + if let Err(error) = (*circuit).borrow_mut().pop_scope(name) { Self::halt(error) } @@ -145,7 +144,7 @@ impl Environment for Circuit { { IN_WITNESS.with(|in_witness| { // Ensure we are not in witness mode. - if !(**in_witness).get() { + if !(*in_witness).get() { CIRCUIT.with(|circuit| { let (a, b, c) = constraint(); let (a, b, c) = (a.into(), b.into(), c.into()); @@ -170,9 +169,9 @@ impl Environment for Circuit { } false => { // Construct the constraint object. - let constraint = Constraint((**circuit).borrow().scope(), a, b, c); + let constraint = Constraint((*circuit).borrow().scope(), a, b, c); // Append the constraint. - (**circuit).borrow_mut().enforce(constraint) + (*circuit).borrow_mut().enforce(constraint) } } }); @@ -184,62 +183,62 @@ impl Environment for Circuit { /// Returns `true` if all constraints in the environment are satisfied. fn is_satisfied() -> bool { - CIRCUIT.with(|circuit| (**circuit).borrow().is_satisfied()) + CIRCUIT.with(|circuit| (*circuit).borrow().is_satisfied()) } /// Returns `true` if all constraints in the current scope are satisfied. fn is_satisfied_in_scope() -> bool { - CIRCUIT.with(|circuit| (**circuit).borrow().is_satisfied_in_scope()) + CIRCUIT.with(|circuit| (*circuit).borrow().is_satisfied_in_scope()) } /// Returns the number of constants in the entire circuit. fn num_constants() -> u64 { - CIRCUIT.with(|circuit| (**circuit).borrow().num_constants()) + CIRCUIT.with(|circuit| (*circuit).borrow().num_constants()) } /// Returns the number of public variables in the entire circuit. fn num_public() -> u64 { - CIRCUIT.with(|circuit| (**circuit).borrow().num_public()) + CIRCUIT.with(|circuit| (*circuit).borrow().num_public()) } /// Returns the number of private variables in the entire circuit. fn num_private() -> u64 { - CIRCUIT.with(|circuit| (**circuit).borrow().num_private()) + CIRCUIT.with(|circuit| (*circuit).borrow().num_private()) } /// Returns the number of constraints in the entire circuit. fn num_constraints() -> u64 { - CIRCUIT.with(|circuit| (**circuit).borrow().num_constraints()) + CIRCUIT.with(|circuit| (*circuit).borrow().num_constraints()) } /// Returns the number of nonzeros in the entire circuit. fn num_nonzeros() -> (u64, u64, u64) { - CIRCUIT.with(|circuit| (**circuit).borrow().num_nonzeros()) + CIRCUIT.with(|circuit| (*circuit).borrow().num_nonzeros()) } /// Returns the number of constants for the current scope. fn num_constants_in_scope() -> u64 { - CIRCUIT.with(|circuit| (**circuit).borrow().num_constants_in_scope()) + CIRCUIT.with(|circuit| (*circuit).borrow().num_constants_in_scope()) } /// Returns the number of public variables for the current scope. fn num_public_in_scope() -> u64 { - CIRCUIT.with(|circuit| (**circuit).borrow().num_public_in_scope()) + CIRCUIT.with(|circuit| (*circuit).borrow().num_public_in_scope()) } /// Returns the number of private variables for the current scope. fn num_private_in_scope() -> u64 { - CIRCUIT.with(|circuit| (**circuit).borrow().num_private_in_scope()) + CIRCUIT.with(|circuit| (*circuit).borrow().num_private_in_scope()) } /// Returns the number of constraints for the current scope. fn num_constraints_in_scope() -> u64 { - CIRCUIT.with(|circuit| (**circuit).borrow().num_constraints_in_scope()) + CIRCUIT.with(|circuit| (*circuit).borrow().num_constraints_in_scope()) } /// Returns the number of nonzeros for the current scope. fn num_nonzeros_in_scope() -> (u64, u64, u64) { - CIRCUIT.with(|circuit| (**circuit).borrow().num_nonzeros_in_scope()) + CIRCUIT.with(|circuit| (*circuit).borrow().num_nonzeros_in_scope()) } /// Halts the program from further synthesis, evaluation, and execution in the current environment. @@ -255,10 +254,10 @@ impl Environment for Circuit { fn inject_r1cs(r1cs: R1CS) { CIRCUIT.with(|circuit| { // Ensure the circuit is empty before injecting. - assert_eq!(0, (**circuit).borrow().num_constants()); - assert_eq!(1, (**circuit).borrow().num_public()); - assert_eq!(0, (**circuit).borrow().num_private()); - assert_eq!(0, (**circuit).borrow().num_constraints()); + assert_eq!(0, (*circuit).borrow().num_constants()); + assert_eq!(1, (*circuit).borrow().num_public()); + assert_eq!(0, (*circuit).borrow().num_private()); + assert_eq!(0, (*circuit).borrow().num_constraints()); // Inject the R1CS instance. let r1cs = circuit.replace(r1cs); // Ensure the circuit that was replaced is empty. @@ -279,10 +278,10 @@ impl Environment for Circuit { // Eject the R1CS instance. let r1cs = circuit.replace(R1CS::<::BaseField>::new()); // Ensure the circuit is now empty. - assert_eq!(0, (**circuit).borrow().num_constants()); - assert_eq!(1, (**circuit).borrow().num_public()); - assert_eq!(0, (**circuit).borrow().num_private()); - assert_eq!(0, (**circuit).borrow().num_constraints()); + assert_eq!(0, (*circuit).borrow().num_constants()); + assert_eq!(1, (*circuit).borrow().num_public()); + assert_eq!(0, (*circuit).borrow().num_private()); + assert_eq!(0, (*circuit).borrow().num_constraints()); // Return the R1CS instance. r1cs }) @@ -297,10 +296,10 @@ impl Environment for Circuit { IN_WITNESS.with(|in_witness| in_witness.replace(false)); // Eject the R1CS instance. let r1cs = circuit.replace(R1CS::<::BaseField>::new()); - assert_eq!(0, (**circuit).borrow().num_constants()); - assert_eq!(1, (**circuit).borrow().num_public()); - assert_eq!(0, (**circuit).borrow().num_private()); - assert_eq!(0, (**circuit).borrow().num_constraints()); + assert_eq!(0, (*circuit).borrow().num_constants()); + assert_eq!(1, (*circuit).borrow().num_public()); + assert_eq!(0, (*circuit).borrow().num_private()); + assert_eq!(0, (*circuit).borrow().num_constraints()); // Convert the R1CS instance to an assignment. Assignment::from(r1cs) }) @@ -311,18 +310,18 @@ impl Environment for Circuit { CIRCUIT.with(|circuit| { // Reset the witness mode. IN_WITNESS.with(|in_witness| in_witness.replace(false)); - *(**circuit).borrow_mut() = R1CS::<::BaseField>::new(); - assert_eq!(0, (**circuit).borrow().num_constants()); - assert_eq!(1, (**circuit).borrow().num_public()); - assert_eq!(0, (**circuit).borrow().num_private()); - assert_eq!(0, (**circuit).borrow().num_constraints()); + *(*circuit).borrow_mut() = R1CS::<::BaseField>::new(); + assert_eq!(0, (*circuit).borrow().num_constants()); + assert_eq!(1, (*circuit).borrow().num_public()); + assert_eq!(0, (*circuit).borrow().num_private()); + assert_eq!(0, (*circuit).borrow().num_constraints()); }); } } impl fmt::Display for Circuit { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - CIRCUIT.with(|circuit| write!(f, "{}", (**circuit).borrow())) + CIRCUIT.with(|circuit| write!(f, "{}", (*circuit).borrow())) } } diff --git a/circuit/environment/src/helpers/converter.rs b/circuit/environment/src/helpers/converter.rs index 665f67974e..85feaa3891 100644 --- a/circuit/environment/src/helpers/converter.rs +++ b/circuit/environment/src/helpers/converter.rs @@ -30,7 +30,7 @@ impl snarkvm_algorithms::r1cs::ConstraintSynthesizer for Circuit { &self, cs: &mut CS, ) -> Result<(), snarkvm_algorithms::r1cs::SynthesisError> { - crate::circuit::CIRCUIT.with(|circuit| (*(**circuit).borrow()).generate_constraints(cs)) + crate::circuit::CIRCUIT.with(|circuit| (*(*circuit).borrow()).generate_constraints(cs)) } } From aac0f15d1b177cd8770df963db9fd3a2b1e9f364 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 5 Dec 2023 19:49:55 +0100 Subject: [PATCH 268/339] cleanup: remove redundant derefs around IN_WITNESS Signed-off-by: ljedrz --- circuit/environment/src/circuit.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/circuit/environment/src/circuit.rs b/circuit/environment/src/circuit.rs index 3beb5637ee..b580cd3b7f 100644 --- a/circuit/environment/src/circuit.rs +++ b/circuit/environment/src/circuit.rs @@ -51,7 +51,7 @@ impl Environment for Circuit { fn new_variable(mode: Mode, value: Self::BaseField) -> Variable { IN_WITNESS.with(|in_witness| { // Ensure we are not in witness mode. - if !(*in_witness).get() { + if !in_witness.get() { CIRCUIT.with(|circuit| match mode { Mode::Constant => (*circuit).borrow_mut().new_constant(value), Mode::Public => (*circuit).borrow_mut().new_public(value), @@ -110,7 +110,7 @@ impl Environment for Circuit { { IN_WITNESS.with(|in_witness| { // Ensure we are not in witness mode. - if !(*in_witness).get() { + if !in_witness.get() { CIRCUIT.with(|circuit| { // Set the entire environment to the new scope. let name = name.into(); @@ -144,7 +144,7 @@ impl Environment for Circuit { { IN_WITNESS.with(|in_witness| { // Ensure we are not in witness mode. - if !(*in_witness).get() { + if !in_witness.get() { CIRCUIT.with(|circuit| { let (a, b, c) = constraint(); let (a, b, c) = (a.into(), b.into(), c.into()); From 5403fd652c26b849ed6d1010d1d491e0be69c09d Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 5 Dec 2023 19:53:02 +0100 Subject: [PATCH 269/339] cleanup: remove redundant derefs around CIRCUIT Signed-off-by: ljedrz --- circuit/environment/src/circuit.rs | 74 ++++++++++---------- circuit/environment/src/helpers/converter.rs | 2 +- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/circuit/environment/src/circuit.rs b/circuit/environment/src/circuit.rs index b580cd3b7f..be60fe946b 100644 --- a/circuit/environment/src/circuit.rs +++ b/circuit/environment/src/circuit.rs @@ -53,9 +53,9 @@ impl Environment for Circuit { // Ensure we are not in witness mode. if !in_witness.get() { CIRCUIT.with(|circuit| match mode { - Mode::Constant => (*circuit).borrow_mut().new_constant(value), - Mode::Public => (*circuit).borrow_mut().new_public(value), - Mode::Private => (*circuit).borrow_mut().new_private(value), + Mode::Constant => circuit.borrow_mut().new_constant(value), + Mode::Public => circuit.borrow_mut().new_public(value), + Mode::Private => circuit.borrow_mut().new_private(value), }) } else { Self::halt("Tried to initialize a new variable in witness mode") @@ -114,7 +114,7 @@ impl Environment for Circuit { CIRCUIT.with(|circuit| { // Set the entire environment to the new scope. let name = name.into(); - if let Err(error) = (*circuit).borrow_mut().push_scope(&name) { + if let Err(error) = circuit.borrow_mut().push_scope(&name) { Self::halt(error) } @@ -122,7 +122,7 @@ impl Environment for Circuit { let output = logic(); // Return the entire environment to the previous scope. - if let Err(error) = (*circuit).borrow_mut().pop_scope(name) { + if let Err(error) = circuit.borrow_mut().pop_scope(name) { Self::halt(error) } @@ -169,9 +169,9 @@ impl Environment for Circuit { } false => { // Construct the constraint object. - let constraint = Constraint((*circuit).borrow().scope(), a, b, c); + let constraint = Constraint(circuit.borrow().scope(), a, b, c); // Append the constraint. - (*circuit).borrow_mut().enforce(constraint) + circuit.borrow_mut().enforce(constraint) } } }); @@ -183,62 +183,62 @@ impl Environment for Circuit { /// Returns `true` if all constraints in the environment are satisfied. fn is_satisfied() -> bool { - CIRCUIT.with(|circuit| (*circuit).borrow().is_satisfied()) + CIRCUIT.with(|circuit| circuit.borrow().is_satisfied()) } /// Returns `true` if all constraints in the current scope are satisfied. fn is_satisfied_in_scope() -> bool { - CIRCUIT.with(|circuit| (*circuit).borrow().is_satisfied_in_scope()) + CIRCUIT.with(|circuit| circuit.borrow().is_satisfied_in_scope()) } /// Returns the number of constants in the entire circuit. fn num_constants() -> u64 { - CIRCUIT.with(|circuit| (*circuit).borrow().num_constants()) + CIRCUIT.with(|circuit| circuit.borrow().num_constants()) } /// Returns the number of public variables in the entire circuit. fn num_public() -> u64 { - CIRCUIT.with(|circuit| (*circuit).borrow().num_public()) + CIRCUIT.with(|circuit| circuit.borrow().num_public()) } /// Returns the number of private variables in the entire circuit. fn num_private() -> u64 { - CIRCUIT.with(|circuit| (*circuit).borrow().num_private()) + CIRCUIT.with(|circuit| circuit.borrow().num_private()) } /// Returns the number of constraints in the entire circuit. fn num_constraints() -> u64 { - CIRCUIT.with(|circuit| (*circuit).borrow().num_constraints()) + CIRCUIT.with(|circuit| circuit.borrow().num_constraints()) } /// Returns the number of nonzeros in the entire circuit. fn num_nonzeros() -> (u64, u64, u64) { - CIRCUIT.with(|circuit| (*circuit).borrow().num_nonzeros()) + CIRCUIT.with(|circuit| circuit.borrow().num_nonzeros()) } /// Returns the number of constants for the current scope. fn num_constants_in_scope() -> u64 { - CIRCUIT.with(|circuit| (*circuit).borrow().num_constants_in_scope()) + CIRCUIT.with(|circuit| circuit.borrow().num_constants_in_scope()) } /// Returns the number of public variables for the current scope. fn num_public_in_scope() -> u64 { - CIRCUIT.with(|circuit| (*circuit).borrow().num_public_in_scope()) + CIRCUIT.with(|circuit| circuit.borrow().num_public_in_scope()) } /// Returns the number of private variables for the current scope. fn num_private_in_scope() -> u64 { - CIRCUIT.with(|circuit| (*circuit).borrow().num_private_in_scope()) + CIRCUIT.with(|circuit| circuit.borrow().num_private_in_scope()) } /// Returns the number of constraints for the current scope. fn num_constraints_in_scope() -> u64 { - CIRCUIT.with(|circuit| (*circuit).borrow().num_constraints_in_scope()) + CIRCUIT.with(|circuit| circuit.borrow().num_constraints_in_scope()) } /// Returns the number of nonzeros for the current scope. fn num_nonzeros_in_scope() -> (u64, u64, u64) { - CIRCUIT.with(|circuit| (*circuit).borrow().num_nonzeros_in_scope()) + CIRCUIT.with(|circuit| circuit.borrow().num_nonzeros_in_scope()) } /// Halts the program from further synthesis, evaluation, and execution in the current environment. @@ -254,10 +254,10 @@ impl Environment for Circuit { fn inject_r1cs(r1cs: R1CS) { CIRCUIT.with(|circuit| { // Ensure the circuit is empty before injecting. - assert_eq!(0, (*circuit).borrow().num_constants()); - assert_eq!(1, (*circuit).borrow().num_public()); - assert_eq!(0, (*circuit).borrow().num_private()); - assert_eq!(0, (*circuit).borrow().num_constraints()); + assert_eq!(0, circuit.borrow().num_constants()); + assert_eq!(1, circuit.borrow().num_public()); + assert_eq!(0, circuit.borrow().num_private()); + assert_eq!(0, circuit.borrow().num_constraints()); // Inject the R1CS instance. let r1cs = circuit.replace(r1cs); // Ensure the circuit that was replaced is empty. @@ -278,10 +278,10 @@ impl Environment for Circuit { // Eject the R1CS instance. let r1cs = circuit.replace(R1CS::<::BaseField>::new()); // Ensure the circuit is now empty. - assert_eq!(0, (*circuit).borrow().num_constants()); - assert_eq!(1, (*circuit).borrow().num_public()); - assert_eq!(0, (*circuit).borrow().num_private()); - assert_eq!(0, (*circuit).borrow().num_constraints()); + assert_eq!(0, circuit.borrow().num_constants()); + assert_eq!(1, circuit.borrow().num_public()); + assert_eq!(0, circuit.borrow().num_private()); + assert_eq!(0, circuit.borrow().num_constraints()); // Return the R1CS instance. r1cs }) @@ -296,10 +296,10 @@ impl Environment for Circuit { IN_WITNESS.with(|in_witness| in_witness.replace(false)); // Eject the R1CS instance. let r1cs = circuit.replace(R1CS::<::BaseField>::new()); - assert_eq!(0, (*circuit).borrow().num_constants()); - assert_eq!(1, (*circuit).borrow().num_public()); - assert_eq!(0, (*circuit).borrow().num_private()); - assert_eq!(0, (*circuit).borrow().num_constraints()); + assert_eq!(0, circuit.borrow().num_constants()); + assert_eq!(1, circuit.borrow().num_public()); + assert_eq!(0, circuit.borrow().num_private()); + assert_eq!(0, circuit.borrow().num_constraints()); // Convert the R1CS instance to an assignment. Assignment::from(r1cs) }) @@ -310,18 +310,18 @@ impl Environment for Circuit { CIRCUIT.with(|circuit| { // Reset the witness mode. IN_WITNESS.with(|in_witness| in_witness.replace(false)); - *(*circuit).borrow_mut() = R1CS::<::BaseField>::new(); - assert_eq!(0, (*circuit).borrow().num_constants()); - assert_eq!(1, (*circuit).borrow().num_public()); - assert_eq!(0, (*circuit).borrow().num_private()); - assert_eq!(0, (*circuit).borrow().num_constraints()); + *circuit.borrow_mut() = R1CS::<::BaseField>::new(); + assert_eq!(0, circuit.borrow().num_constants()); + assert_eq!(1, circuit.borrow().num_public()); + assert_eq!(0, circuit.borrow().num_private()); + assert_eq!(0, circuit.borrow().num_constraints()); }); } } impl fmt::Display for Circuit { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - CIRCUIT.with(|circuit| write!(f, "{}", (*circuit).borrow())) + CIRCUIT.with(|circuit| write!(f, "{}", circuit.borrow())) } } diff --git a/circuit/environment/src/helpers/converter.rs b/circuit/environment/src/helpers/converter.rs index 85feaa3891..2466c5954d 100644 --- a/circuit/environment/src/helpers/converter.rs +++ b/circuit/environment/src/helpers/converter.rs @@ -30,7 +30,7 @@ impl snarkvm_algorithms::r1cs::ConstraintSynthesizer for Circuit { &self, cs: &mut CS, ) -> Result<(), snarkvm_algorithms::r1cs::SynthesisError> { - crate::circuit::CIRCUIT.with(|circuit| (*(*circuit).borrow()).generate_constraints(cs)) + crate::circuit::CIRCUIT.with(|circuit| circuit.borrow().generate_constraints(cs)) } } From 2c2eb01d6b9ab094ec37fef75498667bfa10fad9 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Mon, 4 Dec 2023 13:46:47 +0100 Subject: [PATCH 270/339] cleanup: thin out the derives of CommitterKey Signed-off-by: ljedrz --- algorithms/src/polycommit/sonic_pc/data_structures.rs | 2 +- .../varuna/data_structures/circuit_proving_key.rs | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/algorithms/src/polycommit/sonic_pc/data_structures.rs b/algorithms/src/polycommit/sonic_pc/data_structures.rs index 25fbbd8292..6ef7c58b83 100644 --- a/algorithms/src/polycommit/sonic_pc/data_structures.rs +++ b/algorithms/src/polycommit/sonic_pc/data_structures.rs @@ -36,7 +36,7 @@ pub type Randomness = kzg10::KZGRandomness; pub type Commitment = kzg10::KZGCommitment; /// `CommitterKey` is used to commit to, and create evaluation proofs for, a given polynomial. -#[derive(Clone, Debug, Default, Hash, CanonicalSerialize, CanonicalDeserialize, PartialEq, Eq)] +#[derive(Debug)] pub struct CommitterKey { /// The key used to commit to polynomials. pub powers_of_beta_g: Vec, diff --git a/algorithms/src/snark/varuna/data_structures/circuit_proving_key.rs b/algorithms/src/snark/varuna/data_structures/circuit_proving_key.rs index 1adb86b2c8..5848743d0f 100644 --- a/algorithms/src/snark/varuna/data_structures/circuit_proving_key.rs +++ b/algorithms/src/snark/varuna/data_structures/circuit_proving_key.rs @@ -27,7 +27,7 @@ use snarkvm_utilities::{ use std::{cmp::Ordering, sync::Arc}; /// Proving key for a specific circuit (i.e., R1CS matrices). -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug)] pub struct CircuitProvingKey { /// The circuit verifying key. pub circuit_verifying_key: CircuitVerifyingKey, @@ -58,6 +58,14 @@ impl FromBytes for CircuitProvingKey { } } +impl PartialEq for CircuitProvingKey { + fn eq(&self, other: &Self) -> bool { + self.circuit.id == other.circuit.id + } +} + +impl Eq for CircuitProvingKey {} + impl Ord for CircuitProvingKey { fn cmp(&self, other: &Self) -> Ordering { self.circuit.id.cmp(&other.circuit.id) From cb6f6c56ba13631ba3dc146cc1121fdccbcf9188 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 5 Dec 2023 12:20:52 +0100 Subject: [PATCH 271/339] perf: make sure PowersOfBetaG doesn't get deep-cloned Signed-off-by: ljedrz --- parameters/src/testnet3/powers.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/parameters/src/testnet3/powers.rs b/parameters/src/testnet3/powers.rs index 6559a18c83..8c36656266 100644 --- a/parameters/src/testnet3/powers.rs +++ b/parameters/src/testnet3/powers.rs @@ -57,7 +57,7 @@ lazy_static::lazy_static! { } /// A vector of powers of beta G. -#[derive(Debug, Clone)] +#[derive(Debug)] pub struct PowersOfG { /// The powers of beta G. powers_of_beta_g: PowersOfBetaG, @@ -224,7 +224,7 @@ impl ToBytes for PowersOfG { } } -#[derive(Debug, Clone, CanonicalSerialize, CanonicalDeserialize)] +#[derive(Debug, CanonicalSerialize, CanonicalDeserialize)] pub struct PowersOfBetaG { /// Group elements of form `[G, \beta * G, \beta^2 * G, ..., \beta^d G]`. powers_of_beta_g: Vec, From fcd4c1e7f043a8edd2e89ee2e71d4afb0a1c21e8 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Sat, 2 Dec 2023 21:55:03 +0100 Subject: [PATCH 272/339] perf: make sure MatrixEvals doesn't get deep-cloned Signed-off-by: ljedrz --- algorithms/src/snark/varuna/ahp/indexer/circuit.rs | 2 +- algorithms/src/snark/varuna/ahp/matrices.rs | 2 +- utilities/src/serialize/impls.rs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/algorithms/src/snark/varuna/ahp/indexer/circuit.rs b/algorithms/src/snark/varuna/ahp/indexer/circuit.rs index 5bb6fae41b..1aeb368e34 100644 --- a/algorithms/src/snark/varuna/ahp/indexer/circuit.rs +++ b/algorithms/src/snark/varuna/ahp/indexer/circuit.rs @@ -62,7 +62,7 @@ impl CircuitId { /// public input /// 2) `{a,b,c}` are the matrices defining the R1CS instance /// 3) `{a,b,c}_arith` are structs containing information about the arithmetized matrices -#[derive(Clone, Debug)] +#[derive(Debug)] pub struct Circuit { /// Information about the indexed circuit. pub index_info: CircuitInfo, diff --git a/algorithms/src/snark/varuna/ahp/matrices.rs b/algorithms/src/snark/varuna/ahp/matrices.rs index 2f998f556b..567768183b 100644 --- a/algorithms/src/snark/varuna/ahp/matrices.rs +++ b/algorithms/src/snark/varuna/ahp/matrices.rs @@ -93,7 +93,7 @@ pub(crate) fn pad_input_for_indexer_and_prover { /// Evaluations of the `row` polynomial. pub row: EvaluationsOnDomain, diff --git a/utilities/src/serialize/impls.rs b/utilities/src/serialize/impls.rs index b82d668167..dccc02981e 100644 --- a/utilities/src/serialize/impls.rs +++ b/utilities/src/serialize/impls.rs @@ -306,7 +306,7 @@ impl CanonicalSerialize for Rc { // } // } -impl CanonicalSerialize for Arc { +impl CanonicalSerialize for Arc { #[inline] fn serialize_with_mode(&self, mut writer: W, compress: Compress) -> Result<(), SerializationError> { self.as_ref().serialize_with_mode(&mut writer, compress) @@ -334,7 +334,7 @@ impl Valid for Arc { } } -impl CanonicalDeserialize for Arc { +impl CanonicalDeserialize for Arc { #[inline] fn deserialize_with_mode( reader: R, From c08cd37383ff19321964a2b5d58d87643f668c8b Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 5 Dec 2023 14:44:20 +0100 Subject: [PATCH 273/339] cleanup: thin out the derives of CommitterUnionKey Signed-off-by: ljedrz --- algorithms/src/polycommit/sonic_pc/data_structures.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/src/polycommit/sonic_pc/data_structures.rs b/algorithms/src/polycommit/sonic_pc/data_structures.rs index 6ef7c58b83..6504d198fa 100644 --- a/algorithms/src/polycommit/sonic_pc/data_structures.rs +++ b/algorithms/src/polycommit/sonic_pc/data_structures.rs @@ -271,7 +271,7 @@ impl CommitterKey { } /// `CommitterUnionKey` is a union of `CommitterKey`s, useful for multi-circuit batch proofs. -#[derive(Clone, Debug, Hash, PartialEq, Eq)] +#[derive(Debug)] pub struct CommitterUnionKey<'a, E: PairingEngine> { /// The key used to commit to polynomials. pub powers_of_beta_g: Option<&'a Vec>, From cb294c3ae986191a51fb1bf59ee94d20f68f6d98 Mon Sep 17 00:00:00 2001 From: Pranav Gaddamadugu <23022326+d0cd@users.noreply.github.com> Date: Tue, 5 Dec 2023 14:49:27 -0800 Subject: [PATCH 274/339] Add reserved keyword --- synthesizer/program/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/synthesizer/program/src/lib.rs b/synthesizer/program/src/lib.rs index 26f9b7c2b8..6e32c776f8 100644 --- a/synthesizer/program/src/lib.rs +++ b/synthesizer/program/src/lib.rs @@ -575,6 +575,7 @@ impl, Command: CommandTrait> Pro "u64", "u128", "scalar", + "signature", "string", // Boolean "true", From 9120463a98afb4baf4f86a261732e48394f1f08f Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:55:39 -0800 Subject: [PATCH 275/339] Update ledger/narwhal/batch-header/src/bytes.rs Co-authored-by: Alessandro Coglio Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- ledger/narwhal/batch-header/src/bytes.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/narwhal/batch-header/src/bytes.rs b/ledger/narwhal/batch-header/src/bytes.rs index 7acc890eec..1fbd71f29d 100644 --- a/ledger/narwhal/batch-header/src/bytes.rs +++ b/ledger/narwhal/batch-header/src/bytes.rs @@ -141,7 +141,7 @@ impl ToBytes for BatchHeader { certificate_id.write_le(&mut writer)?; } // TODO (howardwu): For mainnet - Change this to always encode the number of committed certificate IDs. - // We currently only encode the size and certificates only in the new version, for backwards compatibility. + // We currently only encode the size and certificates in the new version, for backwards compatibility. if self.version != 1 { // Write the number of last election certificate IDs. u16::try_from(self.last_election_certificate_ids.len()) From 75bd1d39087914d70930bc1d63dc37579f409597 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:55:51 -0800 Subject: [PATCH 276/339] Update ledger/narwhal/batch-header/src/bytes.rs Co-authored-by: Alessandro Coglio Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- ledger/narwhal/batch-header/src/bytes.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/narwhal/batch-header/src/bytes.rs b/ledger/narwhal/batch-header/src/bytes.rs index 1fbd71f29d..91730b13bb 100644 --- a/ledger/narwhal/batch-header/src/bytes.rs +++ b/ledger/narwhal/batch-header/src/bytes.rs @@ -66,7 +66,7 @@ impl FromBytes for BatchHeader { } // TODO (howardwu): For mainnet - Change this to always encode the number of committed certificate IDs. - // We currently only encode the size and certificates only in the new version, for backwards compatibility. + // We currently only encode the size and certificates in the new version, for backwards compatibility. let num_last_election_certificate_ids = if version == 2 { // Read the number of last election certificate IDs. u16::read_le(&mut reader)? From dfd500b5ad0e555344443bc1d208fa88a629451a Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:58:58 -0800 Subject: [PATCH 277/339] Add missing TODOs --- ledger/narwhal/batch-header/src/bytes.rs | 1 + ledger/narwhal/subdag/src/bytes.rs | 2 ++ 2 files changed, 3 insertions(+) diff --git a/ledger/narwhal/batch-header/src/bytes.rs b/ledger/narwhal/batch-header/src/bytes.rs index 91730b13bb..c46a1f140a 100644 --- a/ledger/narwhal/batch-header/src/bytes.rs +++ b/ledger/narwhal/batch-header/src/bytes.rs @@ -20,6 +20,7 @@ impl FromBytes for BatchHeader { // Read the version. let version = u8::read_le(&mut reader)?; // Ensure the version is valid. + // TODO (howardwu): For mainnet - Change the version back to 1. if version != 1 && version != 2 { return Err(error("Invalid batch header version")); } diff --git a/ledger/narwhal/subdag/src/bytes.rs b/ledger/narwhal/subdag/src/bytes.rs index 44cb8eb4b6..b805dabecb 100644 --- a/ledger/narwhal/subdag/src/bytes.rs +++ b/ledger/narwhal/subdag/src/bytes.rs @@ -20,6 +20,7 @@ impl FromBytes for Subdag { // Read the version. let version = u8::read_le(&mut reader)?; // Ensure the version is valid. + // TODO (howardwu): For mainnet - Change the version back to 1. if version != 1 && version != 2 { return Err(error(format!("Invalid subdag version ({version})"))); } @@ -82,6 +83,7 @@ impl ToBytes for Subdag { /// Writes the subdag to the buffer. fn write_le(&self, mut writer: W) -> IoResult<()> { // Write the version. + // TODO (howardwu): For mainnet - Change the version back to 1. 2u8.write_le(&mut writer)?; // Write the number of rounds. u32::try_from(self.subdag.len()).map_err(error)?.write_le(&mut writer)?; From 14a9e5fed74e0328f94795864913b8fb00d012b0 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 5 Dec 2023 16:51:48 -0800 Subject: [PATCH 278/339] Clippy --- ledger/committee/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ledger/committee/src/lib.rs b/ledger/committee/src/lib.rs index dca9462ee9..042ca103af 100644 --- a/ledger/committee/src/lib.rs +++ b/ledger/committee/src/lib.rs @@ -295,9 +295,9 @@ pub mod test_helpers { // Add in the minimum and maximum staked nodes. members.insert(Address::::new(rng.gen()), (MIN_VALIDATOR_STAKE, false)); while members.len() < num_members as usize - 1 { - let stake = MIN_VALIDATOR_STAKE as f64; + let stake = MIN_VALIDATOR_STAKE; let is_open = rng.gen(); - members.insert(Address::::new(rng.gen()), (stake as u64, is_open)); + members.insert(Address::::new(rng.gen()), (stake, is_open)); } // Return the committee. Committee::::new(1, members).unwrap() From 2adb4ead921066edead1a6665eadbae2896ed2f5 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 5 Dec 2023 13:23:26 +0100 Subject: [PATCH 279/339] perf: use BTreeMap::range to obtain powers_of_beta_times_gamma_g in SonicKZG10::trim Signed-off-by: ljedrz --- algorithms/src/polycommit/sonic_pc/mod.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/algorithms/src/polycommit/sonic_pc/mod.rs b/algorithms/src/polycommit/sonic_pc/mod.rs index 890c7286a3..d29f8e666e 100644 --- a/algorithms/src/polycommit/sonic_pc/mod.rs +++ b/algorithms/src/polycommit/sonic_pc/mod.rs @@ -119,14 +119,16 @@ impl> SonicKZG10 { }; let powers_of_beta_g = pp.powers_of_beta_g(0, supported_degree + 1)?.to_vec(); - let powers_of_beta_times_gamma_g = (0..=(supported_hiding_bound + 1)) - .map(|i| { - pp.powers_of_beta_times_gamma_g() - .get(&i) - .copied() - .ok_or(PCError::HidingBoundToolarge { hiding_poly_degree: supported_hiding_bound, num_powers: 0 }) - }) - .collect::, _>>()?; + let powers_of_beta_times_gamma_g = pp + .powers_of_beta_times_gamma_g() + .range(0..=(supported_hiding_bound + 1)) + .map(|(_k, v)| *v) + .collect::>(); + if powers_of_beta_times_gamma_g.len() != supported_hiding_bound + 2 { + return Err( + PCError::HidingBoundToolarge { hiding_poly_degree: supported_hiding_bound, num_powers: 0 }.into() + ); + } let mut lagrange_bases_at_beta_g = BTreeMap::new(); for size in supported_lagrange_sizes { From 4ddbf9dcc87a47ff285e94e52854871d8407328a Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 5 Dec 2023 13:31:23 +0100 Subject: [PATCH 280/339] perf: use BTreeMap::range to obtain powers_for_degree_bound in SonicKZG10::trim Signed-off-by: ljedrz --- algorithms/src/polycommit/sonic_pc/mod.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/algorithms/src/polycommit/sonic_pc/mod.rs b/algorithms/src/polycommit/sonic_pc/mod.rs index d29f8e666e..8488e71c83 100644 --- a/algorithms/src/polycommit/sonic_pc/mod.rs +++ b/algorithms/src/polycommit/sonic_pc/mod.rs @@ -100,13 +100,12 @@ impl> SonicKZG10 { // Also add degree 0. for degree_bound in enforced_degree_bounds { let shift_degree = max_degree - degree_bound; - let mut powers_for_degree_bound = Vec::with_capacity((max_degree + 2).saturating_sub(shift_degree)); - for i in 0..=supported_hiding_bound + 1 { - // We have an additional degree in `powers_of_beta_times_gamma_g` beyond `powers_of_beta_g`. - if shift_degree + i < max_degree + 2 { - powers_for_degree_bound.push(pp.powers_of_beta_times_gamma_g()[&(shift_degree + i)]); - } - } + // We have an additional degree in `powers_of_beta_times_gamma_g` beyond `powers_of_beta_g`. + let powers_for_degree_bound = pp + .powers_of_beta_times_gamma_g() + .range(shift_degree..max_degree.min(shift_degree + supported_hiding_bound) + 2) + .map(|(_k, v)| *v) + .collect(); shifted_powers_of_beta_times_gamma_g.insert(*degree_bound, powers_for_degree_bound); } From df12af3ea5d184bbd48412958a6118f53c734433 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 5 Dec 2023 14:51:15 +0100 Subject: [PATCH 281/339] perf: remove an intermediate alloc in SonicKZG10::commit Signed-off-by: ljedrz --- algorithms/src/polycommit/sonic_pc/mod.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/algorithms/src/polycommit/sonic_pc/mod.rs b/algorithms/src/polycommit/sonic_pc/mod.rs index 8488e71c83..3fca03ec11 100644 --- a/algorithms/src/polycommit/sonic_pc/mod.rs +++ b/algorithms/src/polycommit/sonic_pc/mod.rs @@ -241,13 +241,12 @@ impl> SonicKZG10 { } } }) - .collect::, _>>()? - .into_iter() - .fold((E::G1Projective::zero(), Randomness::empty()), |mut a, b| { + .try_fold((E::G1Projective::zero(), Randomness::empty()), |mut a, b| { + let b = b?; a.0.add_assign_mixed(&b.0.0); a.1 += (E::Fr::one(), &b.1); - a - }); + Ok::<_, PCError>(a) + })?; let comm = kzg10::KZGCommitment(comm.to_affine()); Ok((LabeledCommitment::new(label.to_string(), comm, degree_bound), rand)) From 6fb5a81b11e6c3c411b15700595834600a972aa8 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 5 Dec 2023 15:14:17 +0100 Subject: [PATCH 282/339] perf: preallocate the result vecs in SonicKZG10::commit Signed-off-by: ljedrz --- algorithms/src/polycommit/sonic_pc/mod.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/algorithms/src/polycommit/sonic_pc/mod.rs b/algorithms/src/polycommit/sonic_pc/mod.rs index 3fca03ec11..5f667f8e08 100644 --- a/algorithms/src/polycommit/sonic_pc/mod.rs +++ b/algorithms/src/polycommit/sonic_pc/mod.rs @@ -181,8 +181,6 @@ impl> SonicKZG10 { ) -> Result<(Vec>>, Vec>), PCError> { let rng = &mut OptionalRng(rng); let commit_time = start_timer!(|| "Committing to polynomials"); - let mut labeled_comms: Vec>> = Vec::new(); - let mut randomness: Vec> = Vec::new(); let mut pool = snarkvm_utilities::ExecutionPool::>::new(); for p in polynomials { @@ -253,6 +251,9 @@ impl> SonicKZG10 { }); } let results: Vec> = pool.execute_all(); + + let mut labeled_comms = Vec::with_capacity(results.len()); + let mut randomness = Vec::with_capacity(results.len()); for result in results { let (comm, rand) = result?; labeled_comms.push(comm); From 7b1733345a8ea022302fccea764c06558b96f466 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Mon, 4 Dec 2023 13:07:12 +0100 Subject: [PATCH 283/339] perf: don't lose the preallocated capacity in download_shifted_powers_from Signed-off-by: ljedrz --- parameters/src/testnet3/powers.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/parameters/src/testnet3/powers.rs b/parameters/src/testnet3/powers.rs index 8c36656266..f533626342 100644 --- a/parameters/src/testnet3/powers.rs +++ b/parameters/src/testnet3/powers.rs @@ -499,11 +499,7 @@ impl PowersOfBetaG { // Deserialize the group elements. let additional_powers = Vec::deserialize_uncompressed_unchecked(&*additional_bytes)?; - if final_powers.is_empty() { - final_powers = additional_powers; - } else { - final_powers.extend(additional_powers); - } + final_powers.extend(additional_powers.iter()); } final_powers.extend(self.shifted_powers_of_beta_g.iter()); self.shifted_powers_of_beta_g = final_powers; From 0a3e1e4b73210d5a286cb3e79da733088b1cff9a Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 5 Dec 2023 12:46:20 +0100 Subject: [PATCH 284/339] perf: reorganize the locks related to PowersOfG Signed-off-by: ljedrz --- .../src/polycommit/kzg10/data_structures.rs | 27 +++++----- algorithms/src/polycommit/sonic_pc/mod.rs | 4 +- parameters/Cargo.toml | 3 ++ parameters/src/testnet3/powers.rs | 53 +++++++++---------- 4 files changed, 44 insertions(+), 43 deletions(-) diff --git a/algorithms/src/polycommit/kzg10/data_structures.rs b/algorithms/src/polycommit/kzg10/data_structures.rs index c13328439c..495e817788 100644 --- a/algorithms/src/polycommit/kzg10/data_structures.rs +++ b/algorithms/src/polycommit/kzg10/data_structures.rs @@ -31,7 +31,6 @@ use snarkvm_utilities::{ use crate::srs::{UniversalProver, UniversalVerifier}; use anyhow::Result; use core::ops::{Add, AddAssign}; -use parking_lot::RwLock; use rand_core::RngCore; use std::{collections::BTreeMap, io, ops::Range, sync::Arc}; @@ -42,7 +41,7 @@ pub struct UniversalParams { /// and group elements of the form `{ \beta^i \gamma G }`, where `i` ranges from 0 to `degree`. /// This struct provides an abstraction over the powers which are located on-disk /// to reduce memory usage. - powers: Arc>>, + powers: Arc>, /// The generator of G2. pub h: E::G2Affine, /// The generator of G2, prepared for use in pairings. @@ -53,16 +52,16 @@ pub struct UniversalParams { impl UniversalParams { pub fn load() -> Result { - let powers = Arc::new(RwLock::new(PowersOfG::::load()?)); + let powers = Arc::new(PowersOfG::::load()?); let h = E::G2Affine::prime_subgroup_generator(); let prepared_h = h.prepare(); - let prepared_beta_h = powers.read().beta_h().prepare(); + let prepared_beta_h = powers.beta_h().prepare(); Ok(Self { powers, h, prepared_h, prepared_beta_h }) } pub fn download_powers_for(&self, range: Range) -> Result<()> { - self.powers.write().download_powers_for(range) + self.powers.download_powers_for(range) } pub fn lagrange_basis(&self, domain: EvaluationDomain) -> Result> { @@ -72,23 +71,23 @@ impl UniversalParams { } pub fn power_of_beta_g(&self, index: usize) -> Result { - self.powers.write().power_of_beta_g(index) + self.powers.power_of_beta_g(index) } pub fn powers_of_beta_g(&self, lower: usize, upper: usize) -> Result> { - Ok(self.powers.write().powers_of_beta_g(lower..upper)?.to_vec()) + self.powers.powers_of_beta_g(lower..upper) } - pub fn powers_of_beta_times_gamma_g(&self) -> Arc> { - self.powers.read().powers_of_beta_gamma_g() + pub fn powers_of_beta_times_gamma_g(&self) -> &BTreeMap { + self.powers.powers_of_beta_gamma_g() } pub fn beta_h(&self) -> E::G2Affine { - self.powers.read().beta_h() + self.powers.beta_h() } pub fn max_degree(&self) -> usize { - self.powers.read().max_num_powers() - 1 + self.powers.max_num_powers() - 1 } pub fn to_universal_prover(&self) -> Result> { @@ -105,7 +104,7 @@ impl UniversalParams { Ok(UniversalVerifier { vk: VerifierKey:: { g, gamma_g, h, beta_h, prepared_h, prepared_beta_h }, - prepared_negative_powers_of_beta_h: self.powers.read().prepared_negative_powers_of_beta_h(), + prepared_negative_powers_of_beta_h: self.powers.prepared_negative_powers_of_beta_h(), }) } } @@ -113,7 +112,7 @@ impl UniversalParams { impl FromBytes for UniversalParams { fn read_le(mut reader: R) -> io::Result { // Deserialize `powers`. - let powers = Arc::new(RwLock::new(PowersOfG::read_le(&mut reader)?)); + let powers = Arc::new(PowersOfG::read_le(&mut reader)?); // Deserialize `h`. let h: E::G2Affine = FromBytes::read_le(&mut reader)?; @@ -131,7 +130,7 @@ impl FromBytes for UniversalParams { impl ToBytes for UniversalParams { fn write_le(&self, mut writer: W) -> io::Result<()> { // Serialize powers. - self.powers.read().write_le(&mut writer)?; + self.powers.write_le(&mut writer)?; // Serialize `h`. self.h.write_le(&mut writer)?; diff --git a/algorithms/src/polycommit/sonic_pc/mod.rs b/algorithms/src/polycommit/sonic_pc/mod.rs index 890c7286a3..7d14396dc2 100644 --- a/algorithms/src/polycommit/sonic_pc/mod.rs +++ b/algorithms/src/polycommit/sonic_pc/mod.rs @@ -95,7 +95,7 @@ impl> SonicKZG10 { max_degree - lowest_shift_degree + 1 )); - let shifted_powers_of_beta_g = pp.powers_of_beta_g(lowest_shift_degree, pp.max_degree() + 1)?.to_vec(); + let shifted_powers_of_beta_g = pp.powers_of_beta_g(lowest_shift_degree, pp.max_degree() + 1)?; let mut shifted_powers_of_beta_times_gamma_g = BTreeMap::new(); // Also add degree 0. for degree_bound in enforced_degree_bounds { @@ -118,7 +118,7 @@ impl> SonicKZG10 { (None, None) }; - let powers_of_beta_g = pp.powers_of_beta_g(0, supported_degree + 1)?.to_vec(); + let powers_of_beta_g = pp.powers_of_beta_g(0, supported_degree + 1)?; let powers_of_beta_times_gamma_g = (0..=(supported_hiding_bound + 1)) .map(|i| { pp.powers_of_beta_times_gamma_g() diff --git a/parameters/Cargo.toml b/parameters/Cargo.toml index 6df31a71cc..0627cb439a 100644 --- a/parameters/Cargo.toml +++ b/parameters/Cargo.toml @@ -76,6 +76,9 @@ optional = true [dependencies.lazy_static] version = "1.4" +[dependencies.parking_lot] +version = "0.12" + [dependencies.paste] version = "1" diff --git a/parameters/src/testnet3/powers.rs b/parameters/src/testnet3/powers.rs index f533626342..577c8dc01d 100644 --- a/parameters/src/testnet3/powers.rs +++ b/parameters/src/testnet3/powers.rs @@ -28,6 +28,7 @@ use snarkvm_utilities::{ }; use anyhow::{anyhow, bail, ensure, Result}; +use parking_lot::RwLock; use std::{collections::BTreeMap, ops::Range, sync::Arc}; const NUM_POWERS_15: usize = 1 << 15; @@ -60,13 +61,13 @@ lazy_static::lazy_static! { #[derive(Debug)] pub struct PowersOfG { /// The powers of beta G. - powers_of_beta_g: PowersOfBetaG, + powers_of_beta_g: RwLock>, /// Group elements of form `{ \beta^i \gamma G }`, where `i` is from 0 to `degree`, /// This is used for hiding. - powers_of_beta_times_gamma_g: Arc>, + powers_of_beta_times_gamma_g: BTreeMap, /// Group elements of form `{ \beta^{max_degree - i} H }`, where `i` /// is of the form `2^k - 1` for `k` in `1` to `log_2(max_degree)`. - negative_powers_of_beta_h: Arc>, + negative_powers_of_beta_h: BTreeMap, /// Information required to enforce degree bounds. Each pair is of the form `(degree_bound, shifting_advice)`. /// Each pair is in the form `(degree_bound, \beta^{max_degree - i} H),` where `H` is the generator of G2, /// and `i` is of the form `2^k - 1` for `k` in `1` to `log_2(max_degree)`. @@ -78,15 +79,14 @@ pub struct PowersOfG { impl PowersOfG { /// Initializes the hard-coded instance of the powers. pub fn load() -> Result { - let powers_of_beta_g = PowersOfBetaG::load()?; + let powers_of_beta_g = RwLock::new(PowersOfBetaG::load()?); // Reconstruct powers of beta_times_gamma_g. - let powers_of_beta_times_gamma_g = - Arc::new(BTreeMap::deserialize_uncompressed_unchecked(&**POWERS_OF_BETA_GAMMA_G)?); + let powers_of_beta_times_gamma_g = BTreeMap::deserialize_uncompressed_unchecked(&**POWERS_OF_BETA_GAMMA_G)?; // Reconstruct negative powers of beta_h. - let negative_powers_of_beta_h: Arc> = - Arc::new(BTreeMap::deserialize_uncompressed_unchecked(&**NEG_POWERS_OF_BETA_H)?); + let negative_powers_of_beta_h: BTreeMap = + BTreeMap::deserialize_uncompressed_unchecked(&**NEG_POWERS_OF_BETA_H)?; // Compute the prepared negative powers of beta_h. let prepared_negative_powers_of_beta_h: Arc::Prepared>> = @@ -105,13 +105,13 @@ impl PowersOfG { } /// Download the powers of beta G specified by `range`. - pub fn download_powers_for(&mut self, range: Range) -> Result<()> { - self.powers_of_beta_g.download_powers_for(&range) + pub fn download_powers_for(&self, range: Range) -> Result<()> { + self.powers_of_beta_g.write().download_powers_for(&range) } /// Returns the number of contiguous powers of beta G starting from the 0-th power. pub fn num_powers(&self) -> usize { - self.powers_of_beta_g.num_powers() + self.powers_of_beta_g.read().num_powers() } /// Returns the maximum possible number of contiguous powers of beta G starting from the 0-th power. @@ -120,22 +120,22 @@ impl PowersOfG { } /// Returns the powers of beta * gamma G. - pub fn powers_of_beta_gamma_g(&self) -> Arc> { - self.powers_of_beta_times_gamma_g.clone() + pub fn powers_of_beta_gamma_g(&self) -> &BTreeMap { + &self.powers_of_beta_times_gamma_g } /// Returns the `index`-th power of beta * G. - pub fn power_of_beta_g(&mut self, index: usize) -> Result { - self.powers_of_beta_g.power(index) + pub fn power_of_beta_g(&self, index: usize) -> Result { + self.powers_of_beta_g.write().power(index) } /// Returns the powers of `beta * G` that lie within `range`. - pub fn powers_of_beta_g(&mut self, range: Range) -> Result<&[E::G1Affine]> { - self.powers_of_beta_g.powers(range) + pub fn powers_of_beta_g(&self, range: Range) -> Result> { + Ok(self.powers_of_beta_g.write().powers(range)?.to_vec()) } - pub fn negative_powers_of_beta_h(&self) -> Arc> { - self.negative_powers_of_beta_h.clone() + pub fn negative_powers_of_beta_h(&self) -> &BTreeMap { + &self.negative_powers_of_beta_h } pub fn prepared_negative_powers_of_beta_h(&self) -> Arc::Prepared>> { @@ -149,7 +149,7 @@ impl PowersOfG { impl CanonicalSerialize for PowersOfG { fn serialize_with_mode(&self, mut writer: W, mode: Compress) -> Result<(), SerializationError> { - self.powers_of_beta_g.serialize_with_mode(&mut writer, mode)?; + self.powers_of_beta_g.read().serialize_with_mode(&mut writer, mode)?; self.powers_of_beta_times_gamma_g.serialize_with_mode(&mut writer, mode)?; self.negative_powers_of_beta_h.serialize_with_mode(&mut writer, mode)?; self.beta_h.serialize_with_mode(&mut writer, mode)?; @@ -157,7 +157,7 @@ impl CanonicalSerialize for PowersOfG { } fn serialized_size(&self, mode: Compress) -> usize { - self.powers_of_beta_g.serialized_size(mode) + self.powers_of_beta_g.read().serialized_size(mode) + self.powers_of_beta_times_gamma_g.serialized_size(mode) + self.negative_powers_of_beta_h.serialized_size(mode) + self.beta_h.serialized_size(mode) @@ -170,15 +170,14 @@ impl CanonicalDeserialize for PowersOfG { compress: Compress, validate: Validate, ) -> Result { - let powers_of_beta_g = PowersOfBetaG::deserialize_with_mode(&mut reader, compress, Validate::No)?; + let powers_of_beta_g = RwLock::new(PowersOfBetaG::deserialize_with_mode(&mut reader, compress, Validate::No)?); // Reconstruct powers of beta_times_gamma_g. - let powers_of_beta_times_gamma_g = - Arc::new(BTreeMap::deserialize_with_mode(&mut reader, compress, Validate::No)?); + let powers_of_beta_times_gamma_g = BTreeMap::deserialize_with_mode(&mut reader, compress, Validate::No)?; // Reconstruct negative powers of beta_h. - let negative_powers_of_beta_h: Arc> = - Arc::new(BTreeMap::deserialize_with_mode(&mut reader, compress, Validate::No)?); + let negative_powers_of_beta_h: BTreeMap = + BTreeMap::deserialize_with_mode(&mut reader, compress, Validate::No)?; // Compute the prepared negative powers of beta_h. let prepared_negative_powers_of_beta_h: Arc::Prepared>> = @@ -202,7 +201,7 @@ impl CanonicalDeserialize for PowersOfG { impl Valid for PowersOfG { fn check(&self) -> Result<(), SerializationError> { - self.powers_of_beta_g.check()?; + self.powers_of_beta_g.read().check()?; self.powers_of_beta_times_gamma_g.check()?; self.negative_powers_of_beta_h.check()?; self.prepared_negative_powers_of_beta_h.check()?; From 568c372248eabb5e1fa87e2f44f636b42ecfd87b Mon Sep 17 00:00:00 2001 From: ljedrz Date: Tue, 5 Dec 2023 17:40:57 +0100 Subject: [PATCH 285/339] chore: adjust the lockfile Signed-off-by: ljedrz --- Cargo.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.lock b/Cargo.lock index 30dbab2ec4..cc24c01daa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3371,6 +3371,7 @@ dependencies = [ "itertools 0.11.0", "js-sys", "lazy_static", + "parking_lot", "paste", "rand", "serde_json", From ec290e9871a2270ad6eb40061af81709496d91a0 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Wed, 6 Dec 2023 17:58:47 -0500 Subject: [PATCH 286/339] Fix error handling --- synthesizer/src/vm/finalize.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index 4295ffe330..d7a96acfb5 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -237,7 +237,7 @@ impl> VM { for input_id in transaction.input_ids() { // If the input ID is already spent in this block or previous blocks, abort the transaction. if input_ids.contains(input_id) - || self.transition_store().contains_input_id(input_id).map_err(|e| e.to_string())? + || self.transition_store().contains_input_id(input_id).unwrap_or(true) { // Store the aborted transaction. aborted.push((transaction.clone(), format!("Double-spending input {input_id}"))); From 3e40be93e901cd403f09dc8caa5e0c004bec82fb Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Wed, 6 Dec 2023 17:59:37 -0500 Subject: [PATCH 287/339] Remove unecessary todo --- synthesizer/src/vm/finalize.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index d7a96acfb5..2972d78ad1 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -230,9 +230,6 @@ impl> VM { continue 'outer; } - // TODO (raychu86): Consider using InputStore with contains_input_id_speculative instead. - // This can be added to the `finalize_execution` and `finalize_fee` methods to allow for - // a possible rejected transaction instead of always aborting. // Ensure that the transaction is not double-spending an input. for input_id in transaction.input_ids() { // If the input ID is already spent in this block or previous blocks, abort the transaction. From b04776b243db2f0136437b27cf9591c2d97aa0b7 Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Wed, 6 Dec 2023 16:31:32 +0100 Subject: [PATCH 288/339] Ensure Evaluations are always sufficient length --- algorithms/src/fft/evaluations.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/algorithms/src/fft/evaluations.rs b/algorithms/src/fft/evaluations.rs index f58925a02a..532e06756b 100644 --- a/algorithms/src/fft/evaluations.rs +++ b/algorithms/src/fft/evaluations.rs @@ -38,7 +38,9 @@ pub struct Evaluations { impl Evaluations { /// Construct `Self` from evaluations and a domain. - pub fn from_vec_and_domain(evaluations: Vec, domain: EvaluationDomain) -> Self { + pub fn from_vec_and_domain(mut evaluations: Vec, domain: EvaluationDomain) -> Self { + // Pad evaluations to ensure we can always evaluate + evaluations.resize(domain.size(), F::zero()); Self { evaluations, domain } } From aba9f0429c07ded1b27f7b6ec0bf381ea062cbf8 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Thu, 7 Dec 2023 17:45:07 -0500 Subject: [PATCH 289/339] Update error message for aborted transaction --- ledger/store/src/block/mod.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ledger/store/src/block/mod.rs b/ledger/store/src/block/mod.rs index 2f6fcc1e9d..d3af337cbf 100644 --- a/ledger/store/src/block/mod.rs +++ b/ledger/store/src/block/mod.rs @@ -885,7 +885,15 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { Some(transactions) => { match transactions.find_confirmed_transaction_for_unconfirmed_transaction_id(transaction_id) { Some(confirmed) => Ok(Some(confirmed.transaction().clone())), - None => bail!("Missing transaction '{transaction_id}' in block storage"), + None => { + // Check if the transaction was aborted. + if let Some(aborted_ids) = self.get_block_aborted_transaction_ids(&block_hash)? { + if aborted_ids.contains(transaction_id) { + bail!("Transaction '{transaction_id}' was aborted in block '{block_hash}'"); + } + } + bail!("Missing transaction '{transaction_id}' in block storage"); + } } } None => bail!("Missing transactions for block '{block_hash}' in block storage"), From a8e7ab328f023d0058bbde33b072db91b85c687a Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Thu, 7 Dec 2023 17:51:05 -0500 Subject: [PATCH 290/339] Include rejected and aborted transactions in find_block_hash --- ledger/store/src/block/mod.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ledger/store/src/block/mod.rs b/ledger/store/src/block/mod.rs index d3af337cbf..4ffb292fec 100644 --- a/ledger/store/src/block/mod.rs +++ b/ledger/store/src/block/mod.rs @@ -628,7 +628,11 @@ pub trait BlockStorage: 'static + Clone + Send + Sync { match self.confirmed_transactions_map().get_confirmed(transaction_id)? { Some(Cow::Borrowed((block_hash, _, _))) => Ok(Some(*block_hash)), Some(Cow::Owned((block_hash, _, _))) => Ok(Some(block_hash)), - None => Ok(None), + None => match self.rejected_or_aborted_transaction_id_map().get_confirmed(transaction_id)? { + Some(Cow::Borrowed(block_hash)) => Ok(Some(*block_hash)), + Some(Cow::Owned(block_hash)) => Ok(Some(block_hash)), + None => Ok(None), + }, } } From 8a99c17ea0f912c9b43371ede27bffb840047b33 Mon Sep 17 00:00:00 2001 From: Alessandro Coglio Date: Fri, 8 Dec 2023 15:23:09 -0800 Subject: [PATCH 291/339] Fix some documentation. --- ledger/narwhal/batch-header/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index 03465d1eab..1d833fca7a 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -35,7 +35,9 @@ pub struct BatchHeader { /// TODO (howardwu): For mainnet - Remove this version from the struct, we only use it here for backwards compatibility. /// NOTE: You must keep the version encoding in the byte serialization, just remove it from the struct in memory. version: u8, - /// The batch ID, defined as the hash of the round number, timestamp, transmission IDs, and previous batch certificate IDs. + /// The batch ID, defined as the hash of the version, author, round number, timestamp, transmission IDs, + /// previous batch certificate IDs, and last election certificate IDs (the latter only if the version is not 1, + /// for pre-mainnet backward compatibility. batch_id: Field, /// The author of the batch. author: Address, From ad9c0a4203b9c8b3872d24377e1a1307b55fe088 Mon Sep 17 00:00:00 2001 From: Alessandro Coglio Date: Fri, 8 Dec 2023 15:25:24 -0800 Subject: [PATCH 292/339] Close the parenthesis. --- ledger/narwhal/batch-header/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index 1d833fca7a..619e908a62 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -37,7 +37,7 @@ pub struct BatchHeader { version: u8, /// The batch ID, defined as the hash of the version, author, round number, timestamp, transmission IDs, /// previous batch certificate IDs, and last election certificate IDs (the latter only if the version is not 1, - /// for pre-mainnet backward compatibility. + /// for pre-mainnet backward compatibility). batch_id: Field, /// The author of the batch. author: Address, From 9ad2a45ae9db8051b11ed429b9e36b36e3bbdd76 Mon Sep 17 00:00:00 2001 From: Alessandro Coglio Date: Fri, 8 Dec 2023 16:53:26 -0800 Subject: [PATCH 293/339] Fix typos in doc. --- ledger/narwhal/transmission-id/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ledger/narwhal/transmission-id/src/lib.rs b/ledger/narwhal/transmission-id/src/lib.rs index a2d911ccfc..43ffea0191 100644 --- a/ledger/narwhal/transmission-id/src/lib.rs +++ b/ledger/narwhal/transmission-id/src/lib.rs @@ -33,14 +33,14 @@ pub enum TransmissionID { } impl From> for TransmissionID { - /// Converts the puzzle commitment into an transmission ID. + /// Converts the puzzle commitment into a transmission ID. fn from(puzzle_commitment: PuzzleCommitment) -> Self { Self::Solution(puzzle_commitment) } } impl From<&N::TransactionID> for TransmissionID { - /// Converts the transaction ID into an transmission ID. + /// Converts the transaction ID into a transmission ID. fn from(transaction_id: &N::TransactionID) -> Self { Self::Transaction(*transaction_id) } From 0cc2d1e21f1836ac9574697003fd57616442e674 Mon Sep 17 00:00:00 2001 From: Alessandro Coglio Date: Fri, 8 Dec 2023 16:59:12 -0800 Subject: [PATCH 294/339] Fix doc typos. --- ledger/narwhal/transmission/src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ledger/narwhal/transmission/src/lib.rs b/ledger/narwhal/transmission/src/lib.rs index bb7aa80695..a18d096241 100644 --- a/ledger/narwhal/transmission/src/lib.rs +++ b/ledger/narwhal/transmission/src/lib.rs @@ -37,28 +37,28 @@ pub enum Transmission { } impl From> for Transmission { - /// Converts the prover solution into an transmission. + /// Converts the prover solution into a transmission. fn from(solution: ProverSolution) -> Self { Self::Solution(Data::Object(solution)) } } impl From> for Transmission { - /// Converts the transaction into an transmission. + /// Converts the transaction into a transmission. fn from(transaction: Transaction) -> Self { Self::Transaction(Data::Object(transaction)) } } impl From>> for Transmission { - /// Converts the prover solution into an transmission. + /// Converts the prover solution into a transmission. fn from(solution: Data>) -> Self { Self::Solution(solution) } } impl From>> for Transmission { - /// Converts the transaction into an transmission. + /// Converts the transaction into a transmission. fn from(transaction: Data>) -> Self { Self::Transaction(transaction) } From c238d8f82fba5d503dfdfa18e59a4537a070b1b2 Mon Sep 17 00:00:00 2001 From: David Cardenas <47157243+davidcardenasus@users.noreply.github.com> Date: Sat, 9 Dec 2023 03:04:38 -0800 Subject: [PATCH 295/339] Add X (Twitter) to README Signed-off-by: David Cardenas <47157243+davidcardenasus@users.noreply.github.com> --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0d062ac7ff..f496a6c566 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ +

      From 1b8a2f14f7a703cd8cf973d813765d1de2ff3911 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Wed, 16 Aug 2023 14:15:05 +0200 Subject: [PATCH 296/339] perf: speed up VM::from via parallelism Signed-off-by: ljedrz --- ledger/store/src/transaction/deployment.rs | 8 ++++ ledger/store/src/transaction/mod.rs | 8 ++++ synthesizer/src/vm/mod.rs | 45 +++++++++++++++------- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/ledger/store/src/transaction/deployment.rs b/ledger/store/src/transaction/deployment.rs index 476e85f293..162dab8c48 100644 --- a/ledger/store/src/transaction/deployment.rs +++ b/ledger/store/src/transaction/deployment.rs @@ -30,6 +30,8 @@ use synthesizer_snark::{Certificate, VerifyingKey}; use anyhow::Result; use core::marker::PhantomData; +#[cfg(not(feature = "serial"))] +use rayon::prelude::*; use std::borrow::Cow; /// A trait for deployment storage. @@ -631,6 +633,12 @@ impl> DeploymentStore { self.storage.id_map().keys_confirmed() } + /// Returns a parallel iterator over the deployment transaction IDs, for all deployments. + #[cfg(not(feature = "serial"))] + pub fn par_deployment_transaction_ids(&self) -> impl '_ + ParallelIterator> { + self.storage.id_map().keys_confirmed().collect::>().into_par_iter() + } + /// Returns an iterator over the program IDs, for all deployments. pub fn program_ids(&self) -> impl '_ + Iterator>> { self.storage.id_map().values_confirmed().map(|id| match id { diff --git a/ledger/store/src/transaction/mod.rs b/ledger/store/src/transaction/mod.rs index b3f56bec8d..227d8b5c73 100644 --- a/ledger/store/src/transaction/mod.rs +++ b/ledger/store/src/transaction/mod.rs @@ -37,6 +37,8 @@ use synthesizer_program::Program; use synthesizer_snark::{Certificate, VerifyingKey}; use anyhow::Result; +#[cfg(not(feature = "serial"))] +use rayon::prelude::*; use serde::{Deserialize, Serialize}; use std::borrow::Cow; @@ -446,6 +448,12 @@ impl> TransactionStore { self.storage.deployment_store().deployment_transaction_ids() } + /// Returns a parallel iterator over the deployment transaction IDs, for all deployments. + #[cfg(not(feature = "serial"))] + pub fn par_deployment_transaction_ids(&self) -> impl '_ + ParallelIterator> { + self.storage.deployment_store().par_deployment_transaction_ids() + } + /// Returns an iterator over the execution transaction IDs, for all executions. pub fn execution_transaction_ids(&self) -> impl '_ + Iterator> { self.storage.execution_store().execution_transaction_ids() diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index 3d295359c7..6b8a1e915d 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -61,6 +61,8 @@ use synthesizer_program::{FinalizeGlobalState, FinalizeOperation, FinalizeStoreT use aleo_std::prelude::{finish, lap, timer}; use indexmap::{IndexMap, IndexSet}; use parking_lot::RwLock; +#[cfg(not(feature = "serial"))] +use rayon::prelude::*; use std::sync::Arc; #[derive(Clone)] @@ -88,12 +90,12 @@ impl> VM { } } - // A helper function to load the program into the process, and recursively load all imports. + // A helper function to retrieve all the deployments. fn load_deployment_and_imports>( - process: &mut Process, + process: &Process, transaction_store: &TransactionStore, transaction_id: N::TransactionID, - ) -> Result<()> { + ) -> Result, Deployment)>> { // Retrieve the deployment from the transaction id. let deployment = match transaction_store.get_deployment(&transaction_id)? { Some(deployment) => deployment, @@ -106,9 +108,12 @@ impl> VM { // Return early if the program is already loaded. if process.contains_program(program_id) { - return Ok(()); + return Ok(vec![]); } + // Prepare a vector for the deployments. + let mut deployments = vec![]; + // Iterate through the program imports. for import_program_id in program.imports().keys() { // Add the imports to the process if does not exist yet. @@ -120,25 +125,37 @@ impl> VM { bail!("Transaction id for '{program_id}' is not found in storage."); }; - // Recursively load the deployment and its imports. - load_deployment_and_imports(process, transaction_store, transaction_id)? + // Add the deployment and its imports found recursively. + deployments.extend_from_slice(&load_deployment_and_imports( + process, + transaction_store, + transaction_id, + )?); } } - // Load the deployment if it does not exist in the process yet. - if !process.contains_program(program_id) { - process.load_deployment(&deployment)?; - } + // Once all the imports have been included, add the parent deployment. + deployments.push((*program_id, deployment)); - Ok(()) + Ok(deployments) } // Retrieve the transaction store. let transaction_store = store.transaction_store(); // Load the deployments from the store. - for transaction_id in transaction_store.deployment_transaction_ids() { - // Load the deployment and its imports. - load_deployment_and_imports(&mut process, transaction_store, *transaction_id)?; + let deployments = transaction_store + .par_deployment_transaction_ids() + .map(|transaction_id| { + // Load the deployment and its imports. + load_deployment_and_imports(&process, transaction_store, *transaction_id) + }) + .collect::>>()?; + + for (program_id, deployment) in deployments.iter().flatten() { + // Load the deployment if it does not exist in the process yet. + if !process.contains_program(program_id) { + process.load_deployment(deployment)?; + } } // Return the new VM. From 4917a40199414ff8aafdcd5751a786260a493f0e Mon Sep 17 00:00:00 2001 From: ljedrz Date: Fri, 20 Oct 2023 17:06:56 +0200 Subject: [PATCH 297/339] perf: load deployments using chunked parallelism Signed-off-by: ljedrz --- ledger/store/src/transaction/deployment.rs | 8 ------- ledger/store/src/transaction/mod.rs | 8 ------- synthesizer/src/vm/mod.rs | 27 ++++++++++++---------- 3 files changed, 15 insertions(+), 28 deletions(-) diff --git a/ledger/store/src/transaction/deployment.rs b/ledger/store/src/transaction/deployment.rs index 162dab8c48..476e85f293 100644 --- a/ledger/store/src/transaction/deployment.rs +++ b/ledger/store/src/transaction/deployment.rs @@ -30,8 +30,6 @@ use synthesizer_snark::{Certificate, VerifyingKey}; use anyhow::Result; use core::marker::PhantomData; -#[cfg(not(feature = "serial"))] -use rayon::prelude::*; use std::borrow::Cow; /// A trait for deployment storage. @@ -633,12 +631,6 @@ impl> DeploymentStore { self.storage.id_map().keys_confirmed() } - /// Returns a parallel iterator over the deployment transaction IDs, for all deployments. - #[cfg(not(feature = "serial"))] - pub fn par_deployment_transaction_ids(&self) -> impl '_ + ParallelIterator> { - self.storage.id_map().keys_confirmed().collect::>().into_par_iter() - } - /// Returns an iterator over the program IDs, for all deployments. pub fn program_ids(&self) -> impl '_ + Iterator>> { self.storage.id_map().values_confirmed().map(|id| match id { diff --git a/ledger/store/src/transaction/mod.rs b/ledger/store/src/transaction/mod.rs index 227d8b5c73..b3f56bec8d 100644 --- a/ledger/store/src/transaction/mod.rs +++ b/ledger/store/src/transaction/mod.rs @@ -37,8 +37,6 @@ use synthesizer_program::Program; use synthesizer_snark::{Certificate, VerifyingKey}; use anyhow::Result; -#[cfg(not(feature = "serial"))] -use rayon::prelude::*; use serde::{Deserialize, Serialize}; use std::borrow::Cow; @@ -448,12 +446,6 @@ impl> TransactionStore { self.storage.deployment_store().deployment_transaction_ids() } - /// Returns a parallel iterator over the deployment transaction IDs, for all deployments. - #[cfg(not(feature = "serial"))] - pub fn par_deployment_transaction_ids(&self) -> impl '_ + ParallelIterator> { - self.storage.deployment_store().par_deployment_transaction_ids() - } - /// Returns an iterator over the execution transaction IDs, for all executions. pub fn execution_transaction_ids(&self) -> impl '_ + Iterator> { self.storage.execution_store().execution_transaction_ids() diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index 6b8a1e915d..161a555c3b 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -142,19 +142,22 @@ impl> VM { // Retrieve the transaction store. let transaction_store = store.transaction_store(); + // Retrieve the list of deployment transaction IDs. + let deployment_ids = transaction_store.deployment_transaction_ids().collect::>(); // Load the deployments from the store. - let deployments = transaction_store - .par_deployment_transaction_ids() - .map(|transaction_id| { - // Load the deployment and its imports. - load_deployment_and_imports(&process, transaction_store, *transaction_id) - }) - .collect::>>()?; - - for (program_id, deployment) in deployments.iter().flatten() { - // Load the deployment if it does not exist in the process yet. - if !process.contains_program(program_id) { - process.load_deployment(deployment)?; + for chunk in deployment_ids.chunks(256) { + let deployments = cfg_iter!(chunk) + .map(|transaction_id| { + // Load the deployment and its imports. + load_deployment_and_imports(&process, transaction_store, **transaction_id) + }) + .collect::>>()?; + + for (program_id, deployment) in deployments.iter().flatten() { + // Load the deployment if it does not exist in the process yet. + if !process.contains_program(program_id) { + process.load_deployment(deployment)?; + } } } From 2d75732fa1deb672d9185c26f47832f64a950919 Mon Sep 17 00:00:00 2001 From: ljedrz Date: Fri, 15 Dec 2023 12:00:44 +0100 Subject: [PATCH 298/339] logs: provide some extra start-up debug info Signed-off-by: ljedrz --- ledger/src/lib.rs | 1 + synthesizer/src/vm/mod.rs | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ledger/src/lib.rs b/ledger/src/lib.rs index 5dbd6a3275..fd239f68c5 100644 --- a/ledger/src/lib.rs +++ b/ledger/src/lib.rs @@ -144,6 +144,7 @@ impl> Ledger { pub fn load_unchecked(genesis_block: Block, dev: Option) -> Result { let timer = timer!("Ledger::load_unchecked"); + debug!("Loading the consensus store..."); // Initialize the consensus store. let store = match ConsensusStore::::open(dev) { Ok(store) => store, diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index 161a555c3b..ca16173086 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -145,7 +145,13 @@ impl> VM { // Retrieve the list of deployment transaction IDs. let deployment_ids = transaction_store.deployment_transaction_ids().collect::>(); // Load the deployments from the store. - for chunk in deployment_ids.chunks(256) { + for (i, chunk) in deployment_ids.chunks(256).enumerate() { + debug!( + "Loading deployments: {}-{}/{}...", + i * 256, + ((i + 1) * 256).min(deployment_ids.len()), + deployment_ids.len() + ); let deployments = cfg_iter!(chunk) .map(|transaction_id| { // Load the deployment and its imports. From ebd7d986e4a4c21192778878ccefefe81c3b91e9 Mon Sep 17 00:00:00 2001 From: evan-schott <53463459+evan-schott@users.noreply.github.com> Date: Fri, 15 Dec 2023 19:23:06 -0800 Subject: [PATCH 299/339] Add test --- vm/package/mod.rs | 71 +++++++++++++++++++++++++++++++++++++++++++++++ vm/package/run.rs | 24 ++++++++++++++++ 2 files changed, 95 insertions(+) diff --git a/vm/package/mod.rs b/vm/package/mod.rs index f9083cc6a9..87f383df83 100644 --- a/vm/package/mod.rs +++ b/vm/package/mod.rs @@ -273,6 +273,60 @@ function transfer: sample_package_with_program_and_imports(&main_program, &[imported_program]) } + /// Samples a (temporary) package containing a `grandparent.aleo` program which imports `parent.aleo` which imports `child.aleo`. + pub(crate) fn sample_nested_package() -> (PathBuf, Package) { + // Initialize the child program. + let child_program = Program::::from_str( + " +program child.aleo; + +record A: + owner as address.private; + val as u32.private; + +function mint: + input r0 as address.private; + input r1 as u32.private; + cast r0 r1 into r2 as A.record; + output r2 as A.record;", + ) + .unwrap(); + + // Initialize the parent program. + let parent_program = Program::::from_str( + " +import child.aleo; + +program parent.aleo; + +function wrapper_mint: + input r0 as address.private; + input r1 as u32.private; + call child.aleo/mint r0 r1 into r2; + output r2 as child.aleo/A.record;", + ) + .unwrap(); + + // Initialize the grandparent program. + let grandparent_program = Program::::from_str( + " +import child.aleo; +import parent.aleo; + +program grandparent.aleo; + +function double_wrapper_mint: + input r0 as address.private; + input r1 as u32.private; + call parent.aleo/wrapper_mint r0 r1 into r2; + output r2 as child.aleo/A.record;", + ) + .unwrap(); + + // Sample the package using the main program and imported program. + sample_package_with_program_and_imports(&grandparent_program, &[child_program, parent_program]) + } + /// Samples a (temporary) package containing a `transfer.aleo` program which imports `credits.aleo`. pub(crate) fn sample_transfer_package() -> (PathBuf, Package) { // Initialize the imported program. @@ -386,6 +440,23 @@ function main: (caller0_private_key, function_name, vec![r0, r1, r2]) } + "grandparent.aleo" => { + // Initialize caller 0. + let caller0_private_key = crate::cli::helpers::dotenv_private_key().unwrap(); + + // Initialize caller 1. + let caller1_private_key = PrivateKey::::new(rng).unwrap(); + let caller1 = Address::try_from(&caller1_private_key).unwrap(); + + // Declare the function name. + let function_name = Identifier::from_str("double_wrapper_mint").unwrap(); + + // Initialize the function inputs. + let r0 = Value::::from_str(&caller1.to_string()).unwrap(); + let r1 = Value::::from_str("1u32").unwrap(); + + (caller0_private_key, function_name, vec![r0, r1]) + } _ => panic!("Invalid program ID for sample package (while testing)"), } } diff --git a/vm/package/run.rs b/vm/package/run.rs index d692924434..54b1520ead 100644 --- a/vm/package/run.rs +++ b/vm/package/run.rs @@ -116,6 +116,30 @@ mod tests { std::fs::remove_dir_all(directory).unwrap(); } + #[test] + fn test_run_with_nested_imports() { + // Samples a new package at a temporary directory. + let (directory, package) = crate::package::test_helpers::sample_nested_package(); + + // Ensure the build directory does *not* exist. + assert!(!package.build_directory().exists()); + // Build the package. + package.build::(None).unwrap(); + // Ensure the build directory exists. + assert!(package.build_directory().exists()); + + // Initialize an RNG. + let rng = &mut TestRng::default(); + // Sample the function inputs. + let (private_key, function_name, inputs) = + crate::package::test_helpers::sample_package_run(package.program_id()); + // Run the program function. + let (_response, _metrics) = package.run::(&private_key, function_name, &inputs, rng).unwrap(); + + // Proactively remove the temporary directory (to conserve space). + std::fs::remove_dir_all(directory).unwrap(); + } + /// Use `cargo test profiler --features timer` to run this test. #[ignore] #[test] From eb1975a8c07ce173e3d3869146710228b2ef95c7 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Sun, 17 Dec 2023 11:39:50 -0800 Subject: [PATCH 300/339] Add proper bound for valid candidate solutions --- ledger/src/advance.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/ledger/src/advance.rs b/ledger/src/advance.rs index b8896e7611..6443ec0da6 100644 --- a/ledger/src/advance.rs +++ b/ledger/src/advance.rs @@ -129,11 +129,18 @@ impl> Ledger { let latest_epoch_challenge = self.latest_epoch_challenge()?; // Separate the candidate solutions into valid and aborted solutions. // TODO: Add `aborted_solution_ids` to the block. - let (valid_candidate_solutions, _aborted_candidate_solutions): (Vec<_>, Vec<_>) = - cfg_into_iter!(candidate_solutions).partition(|solution| { - solution - .verify(coinbase_verifying_key, &latest_epoch_challenge, self.latest_proof_target()) - .unwrap_or(false) + let (valid_candidate_solutions, _aborted_candidate_solutions) = cfg_into_iter!(candidate_solutions) + .fold((Vec::new(), Vec::new()), |(mut valid, mut aborted), solution| { + if valid.len() < N::MAX_SOLUTIONS + && solution + .verify(coinbase_verifying_key, &latest_epoch_challenge, self.latest_proof_target()) + .unwrap_or(false) + { + valid.push(solution); + } else { + aborted.push(solution); + } + (valid, aborted) }); // Check if there are any valid solutions. match valid_candidate_solutions.is_empty() { From 300f7e8abf63d7ef13d09f7e844978d7678f982c Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Sun, 17 Dec 2023 12:29:22 -0800 Subject: [PATCH 301/339] Fix compilation --- ledger/src/advance.rs | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/ledger/src/advance.rs b/ledger/src/advance.rs index 6443ec0da6..062a02b711 100644 --- a/ledger/src/advance.rs +++ b/ledger/src/advance.rs @@ -127,21 +127,29 @@ impl> Ledger { let coinbase_verifying_key = self.coinbase_puzzle.coinbase_verifying_key(); // Retrieve the latest epoch challenge. let latest_epoch_challenge = self.latest_epoch_challenge()?; - // Separate the candidate solutions into valid and aborted solutions. - // TODO: Add `aborted_solution_ids` to the block. - let (valid_candidate_solutions, _aborted_candidate_solutions) = cfg_into_iter!(candidate_solutions) - .fold((Vec::new(), Vec::new()), |(mut valid, mut aborted), solution| { - if valid.len() < N::MAX_SOLUTIONS - && solution + // TODO: Add `aborted_solution_ids` to the block. And optimize this logic. + // Verify the candidate solutions. + let verification_results: Vec<_> = cfg_into_iter!(candidate_solutions) + .map(|solution| { + ( + solution, + solution .verify(coinbase_verifying_key, &latest_epoch_challenge, self.latest_proof_target()) - .unwrap_or(false) - { - valid.push(solution); - } else { - aborted.push(solution); - } - (valid, aborted) - }); + .unwrap_or(false), + ) + }) + .collect(); + // Separate the candidate solutions into valid and aborted solutions. + let mut valid_candidate_solutions = Vec::new(); + let mut aborted_candidate_solutions = Vec::new(); + for (solution, is_valid) in verification_results.into_iter() { + if is_valid && valid_candidate_solutions.len() < N::MAX_SOLUTIONS { + valid_candidate_solutions.push(solution); + } else { + aborted_candidate_solutions.push(solution); + } + } + // Check if there are any valid solutions. match valid_candidate_solutions.is_empty() { true => (None, Field::::zero(), 0u128), From 2bfb07c4f725ffa2a0d15d26dce03fd2a471c680 Mon Sep 17 00:00:00 2001 From: Raymond Chu <14917648+raychu86@users.noreply.github.com> Date: Sun, 17 Dec 2023 13:09:29 -0800 Subject: [PATCH 302/339] Update ledger/src/advance.rs Co-authored-by: Howard Wu <9260812+howardwu@users.noreply.github.com> Signed-off-by: Raymond Chu <14917648+raychu86@users.noreply.github.com> --- ledger/src/advance.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/src/advance.rs b/ledger/src/advance.rs index 062a02b711..bf9dafb2e4 100644 --- a/ledger/src/advance.rs +++ b/ledger/src/advance.rs @@ -140,7 +140,7 @@ impl> Ledger { }) .collect(); // Separate the candidate solutions into valid and aborted solutions. - let mut valid_candidate_solutions = Vec::new(); + let mut valid_candidate_solutions = Vec::with_capacity(N::MAX_SOLUTIONS); let mut aborted_candidate_solutions = Vec::new(); for (solution, is_valid) in verification_results.into_iter() { if is_valid && valid_candidate_solutions.len() < N::MAX_SOLUTIONS { From 02101fc3325c360d54b0f1d8a311ced50e62796b Mon Sep 17 00:00:00 2001 From: Raymond Chu <14917648+raychu86@users.noreply.github.com> Date: Sun, 17 Dec 2023 13:09:36 -0800 Subject: [PATCH 303/339] Update ledger/src/advance.rs Co-authored-by: Howard Wu <9260812+howardwu@users.noreply.github.com> Signed-off-by: Raymond Chu <14917648+raychu86@users.noreply.github.com> --- ledger/src/advance.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/src/advance.rs b/ledger/src/advance.rs index bf9dafb2e4..ee49488d93 100644 --- a/ledger/src/advance.rs +++ b/ledger/src/advance.rs @@ -127,7 +127,7 @@ impl> Ledger { let coinbase_verifying_key = self.coinbase_puzzle.coinbase_verifying_key(); // Retrieve the latest epoch challenge. let latest_epoch_challenge = self.latest_epoch_challenge()?; - // TODO: Add `aborted_solution_ids` to the block. And optimize this logic. + // TODO: For mainnet - Add `aborted_solution_ids` to the block. And optimize this logic. // Verify the candidate solutions. let verification_results: Vec<_> = cfg_into_iter!(candidate_solutions) .map(|solution| { From 68e53c998c3954baf1dcb3b266e80be546d3c82b Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 17 Dec 2023 13:51:34 -0800 Subject: [PATCH 304/339] Update ledger/src/lib.rs Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- ledger/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/src/lib.rs b/ledger/src/lib.rs index fd239f68c5..31337af364 100644 --- a/ledger/src/lib.rs +++ b/ledger/src/lib.rs @@ -144,7 +144,7 @@ impl> Ledger { pub fn load_unchecked(genesis_block: Block, dev: Option) -> Result { let timer = timer!("Ledger::load_unchecked"); - debug!("Loading the consensus store..."); + debug!("Loading the ledger from storage..."); // Initialize the consensus store. let store = match ConsensusStore::::open(dev) { Ok(store) => store, From 531c08f646866791f259a9bff465671556502f54 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 17 Dec 2023 13:52:06 -0800 Subject: [PATCH 305/339] Update synthesizer/src/vm/mod.rs Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- synthesizer/src/vm/mod.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index ca16173086..c0e55541fd 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -61,9 +61,10 @@ use synthesizer_program::{FinalizeGlobalState, FinalizeOperation, FinalizeStoreT use aleo_std::prelude::{finish, lap, timer}; use indexmap::{IndexMap, IndexSet}; use parking_lot::RwLock; +use std::sync::Arc; + #[cfg(not(feature = "serial"))] use rayon::prelude::*; -use std::sync::Arc; #[derive(Clone)] pub struct VM> { From 04b1905be5f239fd445f52328d0e9c021e79ab56 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 17 Dec 2023 14:20:46 -0800 Subject: [PATCH 306/339] Update ledger/src/lib.rs Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- ledger/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/src/lib.rs b/ledger/src/lib.rs index 31337af364..ecb5c9c59d 100644 --- a/ledger/src/lib.rs +++ b/ledger/src/lib.rs @@ -144,7 +144,7 @@ impl> Ledger { pub fn load_unchecked(genesis_block: Block, dev: Option) -> Result { let timer = timer!("Ledger::load_unchecked"); - debug!("Loading the ledger from storage..."); + info!("Loading the ledger from storage..."); // Initialize the consensus store. let store = match ConsensusStore::::open(dev) { Ok(store) => store, From 2971c064f0f8c000f8f072e2c296178569fd7a96 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 17 Dec 2023 14:21:00 -0800 Subject: [PATCH 307/339] Update synthesizer/src/vm/mod.rs Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- synthesizer/src/vm/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index c0e55541fd..ece50117d7 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -148,7 +148,7 @@ impl> VM { // Load the deployments from the store. for (i, chunk) in deployment_ids.chunks(256).enumerate() { debug!( - "Loading deployments: {}-{}/{}...", + "Loading deployments {}-{} (of {})...", i * 256, ((i + 1) * 256).min(deployment_ids.len()), deployment_ids.len() From 2d5163997339e505b22bb94ae93e43d206d6cc3a Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 17 Dec 2023 14:46:46 -0800 Subject: [PATCH 308/339] Update enum interface usage --- circuit/environment/src/helpers/r1cs.rs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/circuit/environment/src/helpers/r1cs.rs b/circuit/environment/src/helpers/r1cs.rs index e24a98ca79..d8f42ca94f 100644 --- a/circuit/environment/src/helpers/r1cs.rs +++ b/circuit/environment/src/helpers/r1cs.rs @@ -91,24 +91,33 @@ impl R1CS { self.counter.add_constraint(constraint); } - /// Returns `true` if both - /// - all constraints in the environment are satisfied. - /// - all constraints use variables corresponding to the declared variables + /// Returns `true` if all of the constraints are satisfied. + /// + /// In addition, when in debug mode, this function also checks that + /// all constraints use variables corresponding to the declared variables. pub fn is_satisfied(&self) -> bool { + // Ensure all constraints are satisfied. let constraints_satisfied = self.constraints.iter().all(|constraint| constraint.is_satisfied()); if !constraints_satisfied { return false; } + + // In debug mode, ensure all constraints use variables corresponding to the declared variables. + #[cfg(not(debug_assertions))] + return true; + #[cfg(debug_assertions)] self.constraints.iter().all(|constraint| { let (a, b, c) = constraint.to_terms(); [a, b, c].into_iter().all(|m| { - m.to_terms().into_iter().all(|(var, _)| match var { + m.to_terms().into_iter().all(|(variable, _)| match variable { Variable::Constant(_value) => false, // terms should not contain Constants - Variable::Private(index, value) => { - self.private.get(*index as usize).map_or_else(|| false, |v| v.value() == **value) + Variable::Private(private) => { + let (index, value) = private.as_ref(); + self.private.get(*index as usize).map_or_else(|| false, |v| v.value() == *value) } - Variable::Public(index, value) => { - self.public.get(*index as usize).map_or_else(|| false, |v| v.value() == **value) + Variable::Public(public) => { + let (index, value) = public.as_ref(); + self.public.get(*index as usize).map_or_else(|| false, |v| v.value() == *value) } }) }) From 91d12b322aa3989d1961676a8c7ccf9f0b3ab24e Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 17 Dec 2023 14:48:05 -0800 Subject: [PATCH 309/339] Clippy --- circuit/environment/src/helpers/r1cs.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/circuit/environment/src/helpers/r1cs.rs b/circuit/environment/src/helpers/r1cs.rs index d8f42ca94f..d08adbdfdb 100644 --- a/circuit/environment/src/helpers/r1cs.rs +++ b/circuit/environment/src/helpers/r1cs.rs @@ -108,8 +108,8 @@ impl R1CS { #[cfg(debug_assertions)] self.constraints.iter().all(|constraint| { let (a, b, c) = constraint.to_terms(); - [a, b, c].into_iter().all(|m| { - m.to_terms().into_iter().all(|(variable, _)| match variable { + [a, b, c].into_iter().all(|lc| { + lc.to_terms().iter().all(|(variable, _)| match variable { Variable::Constant(_value) => false, // terms should not contain Constants Variable::Private(private) => { let (index, value) = private.as_ref(); From ebb37be48bc73063b3e6ceb27bda051d4f78966e Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 17 Dec 2023 15:50:39 -0800 Subject: [PATCH 310/339] Update fields/src/traits/poseidon_grain_lfsr.rs Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- fields/src/traits/poseidon_grain_lfsr.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/fields/src/traits/poseidon_grain_lfsr.rs b/fields/src/traits/poseidon_grain_lfsr.rs index 1d14847396..bcefe30fa6 100644 --- a/fields/src/traits/poseidon_grain_lfsr.rs +++ b/fields/src/traits/poseidon_grain_lfsr.rs @@ -152,6 +152,7 @@ impl PoseidonGrainLFSR { } output.push(F::from_bytes_be_mod_order(&bytes)); + // Clear the vectors of bits and bytes so they can be reused // in the next iteration. bits.clear(); From 0aab2ea1861aa3f6b1aefec67ec31157e740c5c7 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Sun, 17 Dec 2023 16:11:50 -0800 Subject: [PATCH 311/339] Fix the num_members assertion in sample_committee_custom --- ledger/committee/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/committee/src/lib.rs b/ledger/committee/src/lib.rs index e961fd0619..9ba7843dcd 100644 --- a/ledger/committee/src/lib.rs +++ b/ledger/committee/src/lib.rs @@ -288,7 +288,7 @@ pub mod test_helpers { /// Samples a random committee. #[allow(clippy::cast_possible_truncation)] pub fn sample_committee_custom(num_members: u16, rng: &mut TestRng) -> Committee { - assert!(num_members >= 4); + assert!(num_members >= 3); // Set the maximum amount staked in the node. const MAX_STAKE: u64 = 100_000_000_000_000; // Initialize the Exponential distribution. From 1414e47a22b46d6cee68b7448d15170256904ca5 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Sun, 17 Dec 2023 16:37:40 -0800 Subject: [PATCH 312/339] Use BatchHeader::MAX_CERTIFICATES --- ledger/narwhal/batch-certificate/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/narwhal/batch-certificate/src/lib.rs b/ledger/narwhal/batch-certificate/src/lib.rs index cb515aaa49..c963455254 100644 --- a/ledger/narwhal/batch-certificate/src/lib.rs +++ b/ledger/narwhal/batch-certificate/src/lib.rs @@ -51,7 +51,7 @@ pub enum BatchCertificate { impl BatchCertificate { /// The maximum number of signatures in a batch certificate. - pub const MAX_SIGNATURES: usize = 200; + pub const MAX_SIGNATURES: usize = BatchHeader::::MAX_CERTIFICATES; } impl BatchCertificate { From 1e905113609a50e08f81c575975aadbb30352e96 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Sun, 17 Dec 2023 17:11:23 -0800 Subject: [PATCH 313/339] Move MAX_SIGNATURES check --- Cargo.lock | 1 - ledger/committee/Cargo.toml | 4 ---- ledger/committee/src/lib.rs | 4 ---- ledger/narwhal/batch-certificate/src/lib.rs | 12 ++++++++++++ 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8388d27d55..693b66970e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3201,7 +3201,6 @@ dependencies = [ "serde_json", "snarkvm-console", "snarkvm-ledger-committee", - "snarkvm-ledger-narwhal-batch-certificate", "snarkvm-ledger-narwhal-batch-header", "snarkvm-metrics", "test-strategy", diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index 254fc540f6..36d7e7eee9 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -86,10 +86,6 @@ version = "0.4" [dev-dependencies.rayon] version = "1" -[dev-dependencies.ledger-narwhal-batch-certificate] -package = "snarkvm-ledger-narwhal-batch-certificate" -path = "../narwhal/batch-certificate" - [dev-dependencies.ledger-narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../narwhal/batch-header" diff --git a/ledger/committee/src/lib.rs b/ledger/committee/src/lib.rs index 95b8592b0c..e961fd0619 100644 --- a/ledger/committee/src/lib.rs +++ b/ledger/committee/src/lib.rs @@ -416,9 +416,5 @@ mod tests { Committee::::MAX_COMMITTEE_SIZE as usize, ledger_narwhal_batch_header::BatchHeader::::MAX_CERTIFICATES ); - assert_eq!( - Committee::::MAX_COMMITTEE_SIZE as usize, - ledger_narwhal_batch_certificate::BatchCertificate::::MAX_SIGNATURES - ); } } diff --git a/ledger/narwhal/batch-certificate/src/lib.rs b/ledger/narwhal/batch-certificate/src/lib.rs index c963455254..ace956b700 100644 --- a/ledger/narwhal/batch-certificate/src/lib.rs +++ b/ledger/narwhal/batch-certificate/src/lib.rs @@ -300,3 +300,15 @@ pub mod test_helpers { (certificate, previous_certificates) } } + +#[cfg(test)] +mod tests { + use super::*; + + type CurrentNetwork = console::network::Testnet3; + + #[test] + fn test_maximum_signatures() { + assert_eq!(BatchHeader::::MAX_CERTIFICATES, BatchCertificate::::MAX_SIGNATURES); + } +} From 4a3cf3c16fbef780403947afe2ea4b85450019f0 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Sun, 17 Dec 2023 17:13:32 -0800 Subject: [PATCH 314/339] Add check for number of last_election_certificate_ids --- ledger/narwhal/batch-header/src/lib.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index 4cbbf1a31a..30a1015662 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -95,6 +95,11 @@ impl BatchHeader { ensure!(transmission_ids.len() <= Self::MAX_TRANSMISSIONS, "Invalid number of transmission ids"); // Ensure that the number of previous certificate IDs is within bounds. ensure!(previous_certificate_ids.len() <= Self::MAX_CERTIFICATES, "Invalid number of previous certificate IDs"); + // Ensure the number of last election certificate IDs is within bounds. + ensure!( + last_election_certificate_ids.len() <= Self::MAX_CERTIFICATES, + "Invalid number of last election certificate IDs" + ); // Retrieve the address. let author = Address::try_from(private_key)?; @@ -150,6 +155,11 @@ impl BatchHeader { ensure!(transmission_ids.len() <= Self::MAX_TRANSMISSIONS, "Invalid number of transmission ids"); // Ensure that the number of previous certificate IDs is within bounds. ensure!(previous_certificate_ids.len() <= Self::MAX_CERTIFICATES, "Invalid number of previous certificate IDs"); + // Ensure the number of last election certificate IDs is within bounds. + ensure!( + last_election_certificate_ids.len() <= Self::MAX_CERTIFICATES, + "Invalid number of last election certificate IDs" + ); // Compute the batch ID. let batch_id = Self::compute_batch_id( From a700d6d7845b09b2b8000c78d842a4895b42ee1c Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Sun, 17 Dec 2023 17:21:54 -0800 Subject: [PATCH 315/339] Skip election_certificate_ids in Subdag equality --- ledger/narwhal/subdag/src/lib.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ledger/narwhal/subdag/src/lib.rs b/ledger/narwhal/subdag/src/lib.rs index 2a279a98bc..74380ced1d 100644 --- a/ledger/narwhal/subdag/src/lib.rs +++ b/ledger/narwhal/subdag/src/lib.rs @@ -78,7 +78,7 @@ fn sanity_check_subdag_with_dfs(subdag: &BTreeMap { /// The subdag of round certificates. subdag: BTreeMap>>, @@ -86,6 +86,14 @@ pub struct Subdag { election_certificate_ids: IndexSet>, } +impl PartialEq for Subdag { + fn eq(&self, other: &Self) -> bool { + self.subdag == other.subdag + } +} + +impl Eq for Subdag {} + impl Subdag { /// Initializes a new subdag. pub fn from( From ee53c2da31e588fc77f5cb67be0753d397f5299a Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 17 Dec 2023 17:36:00 -0800 Subject: [PATCH 316/339] Update ledger/narwhal/subdag/src/lib.rs Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- ledger/narwhal/subdag/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/ledger/narwhal/subdag/src/lib.rs b/ledger/narwhal/subdag/src/lib.rs index 74380ced1d..3026a094b3 100644 --- a/ledger/narwhal/subdag/src/lib.rs +++ b/ledger/narwhal/subdag/src/lib.rs @@ -88,6 +88,7 @@ pub struct Subdag { impl PartialEq for Subdag { fn eq(&self, other: &Self) -> bool { + // Note: We do not check equality on `election_certificate_ids` as it would cause `Block::eq` to trigger false-positives. self.subdag == other.subdag } } From c6acaad2ce45b1ef4f63edea05f4bbfcc62f3e6d Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Sun, 17 Dec 2023 18:17:46 -0800 Subject: [PATCH 317/339] chore(snarkvm): bump version for new release --- .cargo/release-version | 2 +- Cargo.lock | 120 ++++++++++---------- Cargo.toml | 24 ++-- algorithms/Cargo.toml | 12 +- algorithms/cuda/Cargo.toml | 2 +- circuit/Cargo.toml | 16 +-- circuit/account/Cargo.toml | 10 +- circuit/algorithms/Cargo.toml | 8 +- circuit/collections/Cargo.toml | 8 +- circuit/environment/Cargo.toml | 14 +-- circuit/environment/witness/Cargo.toml | 2 +- circuit/network/Cargo.toml | 12 +- circuit/program/Cargo.toml | 16 +-- circuit/types/Cargo.toml | 18 +-- circuit/types/address/Cargo.toml | 14 +-- circuit/types/boolean/Cargo.toml | 6 +- circuit/types/field/Cargo.toml | 8 +- circuit/types/group/Cargo.toml | 12 +- circuit/types/integers/Cargo.toml | 12 +- circuit/types/scalar/Cargo.toml | 10 +- circuit/types/string/Cargo.toml | 12 +- console/Cargo.toml | 14 +-- console/account/Cargo.toml | 6 +- console/algorithms/Cargo.toml | 8 +- console/collections/Cargo.toml | 6 +- console/network/Cargo.toml | 20 ++-- console/network/environment/Cargo.toml | 8 +- console/program/Cargo.toml | 14 +-- console/types/Cargo.toml | 18 +-- console/types/address/Cargo.toml | 10 +- console/types/boolean/Cargo.toml | 4 +- console/types/field/Cargo.toml | 6 +- console/types/group/Cargo.toml | 10 +- console/types/integers/Cargo.toml | 10 +- console/types/scalar/Cargo.toml | 8 +- console/types/string/Cargo.toml | 10 +- curves/Cargo.toml | 6 +- fields/Cargo.toml | 4 +- ledger/Cargo.toml | 22 ++-- ledger/authority/Cargo.toml | 6 +- ledger/block/Cargo.toml | 18 +-- ledger/coinbase/Cargo.toml | 14 +-- ledger/committee/Cargo.toml | 6 +- ledger/narwhal/Cargo.toml | 14 +-- ledger/narwhal/batch-certificate/Cargo.toml | 8 +- ledger/narwhal/batch-header/Cargo.toml | 6 +- ledger/narwhal/data/Cargo.toml | 4 +- ledger/narwhal/subdag/Cargo.toml | 10 +- ledger/narwhal/transmission-id/Cargo.toml | 6 +- ledger/narwhal/transmission/Cargo.toml | 10 +- ledger/query/Cargo.toml | 14 ++- ledger/store/Cargo.toml | 18 +-- ledger/test-helpers/Cargo.toml | 16 +-- metrics/Cargo.toml | 2 +- parameters/Cargo.toml | 6 +- synthesizer/Cargo.toml | 24 ++-- synthesizer/process/Cargo.toml | 18 +-- synthesizer/program/Cargo.toml | 6 +- synthesizer/snark/Cargo.toml | 8 +- utilities/Cargo.toml | 4 +- utilities/derives/Cargo.toml | 2 +- wasm/Cargo.toml | 36 ++++-- 62 files changed, 397 insertions(+), 381 deletions(-) diff --git a/.cargo/release-version b/.cargo/release-version index e38085345d..1d261db554 100644 --- a/.cargo/release-version +++ b/.cargo/release-version @@ -1 +1 @@ -v0.16.12 \ No newline at end of file +v0.16.13 \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 4c58149154..903e50f568 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2577,7 +2577,7 @@ dependencies = [ [[package]] name = "snarkvm" -version = "0.16.12" +version = "0.16.13" dependencies = [ "anstyle", "anyhow", @@ -2613,7 +2613,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms" -version = "0.16.12" +version = "0.16.13" dependencies = [ "aleo-std", "anyhow", @@ -2652,7 +2652,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms-cuda" -version = "0.16.12" +version = "0.16.13" dependencies = [ "blst", "cc", @@ -2662,7 +2662,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit" -version = "0.16.12" +version = "0.16.13" dependencies = [ "snarkvm-circuit-account", "snarkvm-circuit-algorithms", @@ -2675,7 +2675,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-account" -version = "0.16.12" +version = "0.16.13" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2687,7 +2687,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-algorithms" -version = "0.16.12" +version = "0.16.13" dependencies = [ "anyhow", "snarkvm-circuit-types", @@ -2699,7 +2699,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-collections" -version = "0.16.12" +version = "0.16.13" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2713,7 +2713,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment" -version = "0.16.12" +version = "0.16.13" dependencies = [ "criterion", "indexmap 2.0.2", @@ -2734,11 +2734,11 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment-witness" -version = "0.16.12" +version = "0.16.13" [[package]] name = "snarkvm-circuit-network" -version = "0.16.12" +version = "0.16.13" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-collections", @@ -2749,7 +2749,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-program" -version = "0.16.12" +version = "0.16.13" dependencies = [ "anyhow", "paste", @@ -2767,7 +2767,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types" -version = "0.16.12" +version = "0.16.13" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-address", @@ -2782,7 +2782,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-address" -version = "0.16.12" +version = "0.16.13" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2794,7 +2794,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-boolean" -version = "0.16.12" +version = "0.16.13" dependencies = [ "criterion", "snarkvm-circuit-environment", @@ -2803,7 +2803,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-field" -version = "0.16.12" +version = "0.16.13" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2812,7 +2812,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-group" -version = "0.16.12" +version = "0.16.13" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2824,7 +2824,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-integers" -version = "0.16.12" +version = "0.16.13" dependencies = [ "paste", "snarkvm-circuit-environment", @@ -2837,7 +2837,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-scalar" -version = "0.16.12" +version = "0.16.13" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2847,7 +2847,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-string" -version = "0.16.12" +version = "0.16.13" dependencies = [ "rand", "snarkvm-circuit-environment", @@ -2860,7 +2860,7 @@ dependencies = [ [[package]] name = "snarkvm-console" -version = "0.16.12" +version = "0.16.13" dependencies = [ "snarkvm-console-account", "snarkvm-console-algorithms", @@ -2872,7 +2872,7 @@ dependencies = [ [[package]] name = "snarkvm-console-account" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "bs58", @@ -2885,7 +2885,7 @@ dependencies = [ [[package]] name = "snarkvm-console-algorithms" -version = "0.16.12" +version = "0.16.13" dependencies = [ "blake2s_simd", "criterion", @@ -2903,7 +2903,7 @@ dependencies = [ [[package]] name = "snarkvm-console-collections" -version = "0.16.12" +version = "0.16.13" dependencies = [ "aleo-std", "criterion", @@ -2916,7 +2916,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network" -version = "0.16.12" +version = "0.16.13" dependencies = [ "anyhow", "indexmap 2.0.2", @@ -2938,7 +2938,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network-environment" -version = "0.16.12" +version = "0.16.13" dependencies = [ "anyhow", "bech32", @@ -2955,7 +2955,7 @@ dependencies = [ [[package]] name = "snarkvm-console-program" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "enum_index", @@ -2976,7 +2976,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types" -version = "0.16.12" +version = "0.16.13" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-address", @@ -2990,7 +2990,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-address" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "serde_json", @@ -3002,7 +3002,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-boolean" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "serde_json", @@ -3011,7 +3011,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-field" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "serde_json", @@ -3022,7 +3022,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-group" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "serde_json", @@ -3034,7 +3034,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-integers" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "serde_json", @@ -3046,7 +3046,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-scalar" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "serde_json", @@ -3058,7 +3058,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-string" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "serde_json", @@ -3070,7 +3070,7 @@ dependencies = [ [[package]] name = "snarkvm-curves" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "criterion", @@ -3085,7 +3085,7 @@ dependencies = [ [[package]] name = "snarkvm-fields" -version = "0.16.12" +version = "0.16.13" dependencies = [ "aleo-std", "anyhow", @@ -3102,7 +3102,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger" -version = "0.16.12" +version = "0.16.13" dependencies = [ "aleo-std", "anyhow", @@ -3129,7 +3129,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-authority" -version = "0.16.12" +version = "0.16.13" dependencies = [ "anyhow", "bincode", @@ -3142,7 +3142,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-block" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3166,7 +3166,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-coinbase" -version = "0.16.12" +version = "0.16.13" dependencies = [ "aleo-std", "anyhow", @@ -3187,7 +3187,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-committee" -version = "0.16.12" +version = "0.16.13" dependencies = [ "anyhow", "bincode", @@ -3208,7 +3208,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal" -version = "0.16.12" +version = "0.16.13" dependencies = [ "snarkvm-ledger-narwhal", "snarkvm-ledger-narwhal-batch-certificate", @@ -3221,7 +3221,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3234,7 +3234,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3247,7 +3247,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-data" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bytes", "serde_json", @@ -3257,7 +3257,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3272,7 +3272,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "bytes", @@ -3285,7 +3285,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "serde_json", @@ -3295,7 +3295,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-query" -version = "0.16.12" +version = "0.16.13" dependencies = [ "async-trait", "reqwest", @@ -3307,7 +3307,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-store" -version = "0.16.12" +version = "0.16.13" dependencies = [ "aleo-std", "anyhow", @@ -3335,7 +3335,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-test-helpers" -version = "0.16.12" +version = "0.16.13" dependencies = [ "once_cell", "snarkvm-circuit", @@ -3349,7 +3349,7 @@ dependencies = [ [[package]] name = "snarkvm-metrics" -version = "0.16.12" +version = "0.16.13" dependencies = [ "metrics", "metrics-exporter-prometheus", @@ -3357,7 +3357,7 @@ dependencies = [ [[package]] name = "snarkvm-parameters" -version = "0.16.12" +version = "0.16.13" dependencies = [ "aleo-std", "anyhow", @@ -3390,7 +3390,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer" -version = "0.16.12" +version = "0.16.13" dependencies = [ "aleo-std", "anyhow", @@ -3421,7 +3421,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-process" -version = "0.16.12" +version = "0.16.13" dependencies = [ "aleo-std", "bincode", @@ -3447,7 +3447,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-program" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "criterion", @@ -3463,7 +3463,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-snark" -version = "0.16.12" +version = "0.16.13" dependencies = [ "bincode", "colored", @@ -3476,7 +3476,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities" -version = "0.16.12" +version = "0.16.13" dependencies = [ "aleo-std", "anyhow", @@ -3496,7 +3496,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities-derives" -version = "0.16.12" +version = "0.16.13" dependencies = [ "proc-macro2", "quote 1.0.33", @@ -3505,7 +3505,7 @@ dependencies = [ [[package]] name = "snarkvm-wasm" -version = "0.16.12" +version = "0.16.13" dependencies = [ "getrandom", "snarkvm-circuit-network", diff --git a/Cargo.toml b/Cargo.toml index 2f4ee0689a..5bc2b1c6ef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "A decentralized virtual machine" homepage = "https://aleo.org" @@ -150,58 +150,58 @@ wasm = [ "snarkvm-wasm" ] [dependencies.snarkvm-algorithms] path = "./algorithms" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-circuit] path = "./circuit" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-console] path = "./console" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-curves] path = "./curves" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-fields] path = "./fields" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-ledger] path = "./ledger" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-metrics] path = "./metrics" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-parameters] path = "./parameters" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-synthesizer] path = "./synthesizer" -version = "=0.16.12" +version = "=0.16.13" default-features = false optional = true [dependencies.snarkvm-utilities] path = "./utilities" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-wasm] path = "./wasm" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.anstyle] diff --git a/algorithms/Cargo.toml b/algorithms/Cargo.toml index da99784f52..3bb244c1e3 100644 --- a/algorithms/Cargo.toml +++ b/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Algorithms for a decentralized virtual machine" homepage = "https://aleo.org" @@ -47,27 +47,27 @@ required-features = [ "test" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.snarkvm-parameters] path = "../parameters" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.snarkvm-algorithms-cuda] path = "./cuda" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.aleo-std] diff --git a/algorithms/cuda/Cargo.toml b/algorithms/cuda/Cargo.toml index 24f9a3127f..baf0b265bd 100644 --- a/algorithms/cuda/Cargo.toml +++ b/algorithms/cuda/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms-cuda" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Cuda optimizations for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/circuit/Cargo.toml b/circuit/Cargo.toml index d996f10337..c1f084fa9a 100644 --- a/circuit/Cargo.toml +++ b/circuit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Circuits for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,28 +25,28 @@ edition = "2021" [dependencies.snarkvm-circuit-account] path = "./account" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-algorithms] path = "./algorithms" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-collections] path = "./collections" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-environment] path = "./environment" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-network] path = "./network" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-program] path = "./program" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types] path = "./types" -version = "=0.16.12" +version = "=0.16.13" diff --git a/circuit/account/Cargo.toml b/circuit/account/Cargo.toml index a23cc13706..7c0435b1e6 100644 --- a/circuit/account/Cargo.toml +++ b/circuit/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-account" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Account circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-account" path = "../../console/account" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.12" +version = "=0.16.13" [dev-dependencies.snarkvm-utilities] path = "../../utilities" diff --git a/circuit/algorithms/Cargo.toml b/circuit/algorithms/Cargo.toml index 331fccd9fd..1bc8a0ee16 100644 --- a/circuit/algorithms/Cargo.toml +++ b/circuit/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-algorithms" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Algorithm circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-algorithms" path = "../../console/algorithms" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dev-dependencies.anyhow] diff --git a/circuit/collections/Cargo.toml b/circuit/collections/Cargo.toml index b6d794509e..94806d9ebd 100644 --- a/circuit/collections/Cargo.toml +++ b/circuit/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-collections" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Collections circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-collections" path = "../../console/collections" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.12" +version = "=0.16.13" [dev-dependencies.snarkvm-circuit-network] path = "../network" diff --git a/circuit/environment/Cargo.toml b/circuit/environment/Cargo.toml index 96ad7e8cc8..a231644cc5 100644 --- a/circuit/environment/Cargo.toml +++ b/circuit/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Circuit environment for a decentralized virtual machine" license = "Apache-2.0" @@ -14,32 +14,32 @@ harness = false [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.12" +version = "=0.16.13" default-features = false features = [ "r1cs" ] [dependencies.snarkvm-circuit-environment-witness] path = "./witness" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.indexmap] diff --git a/circuit/environment/witness/Cargo.toml b/circuit/environment/witness/Cargo.toml index f5e511d623..88634d948e 100644 --- a/circuit/environment/witness/Cargo.toml +++ b/circuit/environment/witness/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment-witness" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "A procedural macro to construct a witness in an environment" license = "Apache-2.0" diff --git a/circuit/network/Cargo.toml b/circuit/network/Cargo.toml index be35666e9f..577c34149f 100644 --- a/circuit/network/Cargo.toml +++ b/circuit/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-network" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Network circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.12" +version = "=0.16.13" [dev-dependencies.snarkvm-console-types] path = "../../console/types" @@ -30,4 +30,4 @@ path = "../../console/types" [features] default = [ "enable_console" ] enable_console = [ "console" ] -wasm = [ "console/wasm"] +wasm = [ "console/wasm" ] diff --git a/circuit/program/Cargo.toml b/circuit/program/Cargo.toml index 078a68a21d..d0dc956620 100644 --- a/circuit/program/Cargo.toml +++ b/circuit/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-program" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Program circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,32 +9,32 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-program" path = "../../console/program" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-circuit-account] path = "../account" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.12" +version = "=0.16.13" [dependencies.paste] version = "1.0" diff --git a/circuit/types/Cargo.toml b/circuit/types/Cargo.toml index 2a5c0e9a4b..b232d10211 100644 --- a/circuit/types/Cargo.toml +++ b/circuit/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Primitive circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -8,35 +8,35 @@ edition = "2021" [dependencies.snarkvm-circuit-environment] path = "../environment" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-address] path = "./address" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-boolean] path = "./boolean" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-field] path = "./field" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-group] path = "./group" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-integers] path = "./integers" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-scalar] path = "./scalar" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-string] path = "./string" -version = "=0.16.12" +version = "=0.16.13" [dev-dependencies.console] package = "snarkvm-console" diff --git a/circuit/types/address/Cargo.toml b/circuit/types/address/Cargo.toml index 7d9caea652..a5ee48cce2 100644 --- a/circuit/types/address/Cargo.toml +++ b/circuit/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-address" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Address circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,28 +9,28 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-address" path = "../../../console/types/address" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-group] path = "../group" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.12" +version = "=0.16.13" [features] default = [ "enable_console" ] diff --git a/circuit/types/boolean/Cargo.toml b/circuit/types/boolean/Cargo.toml index d3de151380..2906d393c2 100644 --- a/circuit/types/boolean/Cargo.toml +++ b/circuit/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-boolean" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Boolean circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -14,12 +14,12 @@ harness = false [dependencies.console] package = "snarkvm-console-types-boolean" path = "../../../console/types/boolean" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.12" +version = "=0.16.13" [dev-dependencies.criterion] version = "0.5" diff --git a/circuit/types/field/Cargo.toml b/circuit/types/field/Cargo.toml index 9bda4f1a41..e55bfb6dc3 100644 --- a/circuit/types/field/Cargo.toml +++ b/circuit/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-field" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Field circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-field" path = "../../../console/types/field" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.12" +version = "=0.16.13" [features] default = [ "enable_console" ] diff --git a/circuit/types/group/Cargo.toml b/circuit/types/group/Cargo.toml index b12e20ec23..0cafb824f6 100644 --- a/circuit/types/group/Cargo.toml +++ b/circuit/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-group" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Group circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-group" path = "../../../console/types/group" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.12" +version = "=0.16.13" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/integers/Cargo.toml b/circuit/types/integers/Cargo.toml index 7ec7b1fee8..8479724fe7 100644 --- a/circuit/types/integers/Cargo.toml +++ b/circuit/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-integers" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Integer circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-integers" path = "../../../console/types/integers" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.12" +version = "=0.16.13" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/scalar/Cargo.toml b/circuit/types/scalar/Cargo.toml index 1a5dfd3d85..cf14da981b 100644 --- a/circuit/types/scalar/Cargo.toml +++ b/circuit/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-scalar" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Scalar circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-scalar" path = "../../../console/types/scalar" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.12" +version = "=0.16.13" [features] default = [ "enable_console" ] diff --git a/circuit/types/string/Cargo.toml b/circuit/types/string/Cargo.toml index 7de3d7cc80..663889cb47 100644 --- a/circuit/types/string/Cargo.toml +++ b/circuit/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-string" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "String circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-string" path = "../../../console/types/string" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-circuit-types-integers] path = "../integers" -version = "=0.16.12" +version = "=0.16.13" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/console/Cargo.toml b/console/Cargo.toml index 63b8d62313..9dcd1eb678 100644 --- a/console/Cargo.toml +++ b/console/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Console environment for a decentralized virtual machine" license = "Apache-2.0" @@ -8,32 +8,32 @@ edition = "2021" [dependencies.snarkvm-console-account] path = "./account" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-console-algorithms] path = "./algorithms" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-console-collections] path = "./collections" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-console-network] path = "./network" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-console-program] path = "./program" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-console-types] path = "./types" -version = "=0.16.12" +version = "=0.16.13" optional = true [features] diff --git a/console/account/Cargo.toml b/console/account/Cargo.toml index e2813db421..3ac17b9644 100644 --- a/console/account/Cargo.toml +++ b/console/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-account" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Account operations for a decentralized virtual machine" license = "Apache-2.0" @@ -13,11 +13,11 @@ harness = false [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.12" +version = "=0.16.13" default-features = false features = [ "address", "boolean", "field", "group", "scalar" ] diff --git a/console/algorithms/Cargo.toml b/console/algorithms/Cargo.toml index 77fd18fef0..77a682d4e2 100644 --- a/console/algorithms/Cargo.toml +++ b/console/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-algorithms" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Console algorithms for a decentralized virtual machine" license = "Apache-2.0" @@ -23,18 +23,18 @@ harness = false [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.12" +version = "=0.16.13" default-features = false features = [ "field", "group", "integers", "scalar" ] [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.12" +version = "=0.16.13" [dependencies.blake2s_simd] version = "1.0" diff --git a/console/collections/Cargo.toml b/console/collections/Cargo.toml index 9cff0030d3..e5a87df90c 100644 --- a/console/collections/Cargo.toml +++ b/console/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-collections" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Collections for a decentralized virtual machine" license = "Apache-2.0" @@ -18,11 +18,11 @@ harness = false [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.12" +version = "=0.16.13" default-features = false features = [ "field", "integers" ] diff --git a/console/network/Cargo.toml b/console/network/Cargo.toml index 959397f47a..a0253e48ad 100644 --- a/console/network/Cargo.toml +++ b/console/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Network console library for a decentralized virtual machine" license = "Apache-2.0" @@ -15,45 +15,45 @@ wasm = [ [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.12" +version = "=0.16.13" default-features = false features = [ "snark" ] [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-network-environment] path = "./environment" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.12" +version = "=0.16.13" default-features = false features = [ "field", "group", "scalar" ] [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.snarkvm-parameters] path = "../../parameters" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.12" +version = "=0.16.13" [dependencies.anyhow] version = "1.0.73" diff --git a/console/network/environment/Cargo.toml b/console/network/environment/Cargo.toml index df3130e699..572063c484 100644 --- a/console/network/environment/Cargo.toml +++ b/console/network/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network-environment" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Environment console library for a decentralized virtual machine" license = "Apache-2.0" @@ -8,17 +8,17 @@ edition = "2021" [dependencies.snarkvm-curves] path = "../../../curves" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.snarkvm-fields] path = "../../../fields" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.snarkvm-utilities] path = "../../../utilities" -version = "=0.16.12" +version = "=0.16.13" [dependencies.anyhow] version = "1.0.73" diff --git a/console/program/Cargo.toml b/console/program/Cargo.toml index 84d1e97f2d..057dec5afe 100644 --- a/console/program/Cargo.toml +++ b/console/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-program" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Program operations for a decentralized virtual machine" license = "Apache-2.0" @@ -12,27 +12,27 @@ test = [ ] [dependencies.snarkvm-console-account] path = "../account" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.12" +version = "=0.16.13" [dependencies.enum_index] version = "0.2" diff --git a/console/types/Cargo.toml b/console/types/Cargo.toml index fe6ef8f2c4..18e1040b69 100644 --- a/console/types/Cargo.toml +++ b/console/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Console types for a decentralized virtual machine" license = "Apache-2.0" @@ -8,41 +8,41 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../network/environment" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types-address] path = "./address" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-console-types-boolean] path = "./boolean" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-console-types-field] path = "./field" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-console-types-group] path = "./group" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-console-types-integers] path = "./integers" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-console-types-scalar] path = "./scalar" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-console-types-string] path = "./string" -version = "=0.16.12" +version = "=0.16.13" optional = true [features] diff --git a/console/types/address/Cargo.toml b/console/types/address/Cargo.toml index 248b77a445..76f505ef5e 100644 --- a/console/types/address/Cargo.toml +++ b/console/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-address" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types-group] path = "../group" -version = "=0.16.12" +version = "=0.16.13" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/boolean/Cargo.toml b/console/types/boolean/Cargo.toml index 8f7040a711..1098c82384 100644 --- a/console/types/boolean/Cargo.toml +++ b/console/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-boolean" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,7 +8,7 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.12" +version = "=0.16.13" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/field/Cargo.toml b/console/types/field/Cargo.toml index 938f7e32f8..b7bd02c0b0 100644 --- a/console/types/field/Cargo.toml +++ b/console/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-field" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,11 +8,11 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.12" +version = "=0.16.13" [dependencies.zeroize] version = "1" diff --git a/console/types/group/Cargo.toml b/console/types/group/Cargo.toml index 2e1d8fe28a..6b45197779 100644 --- a/console/types/group/Cargo.toml +++ b/console/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-group" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.12" +version = "=0.16.13" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/integers/Cargo.toml b/console/types/integers/Cargo.toml index eeffe03a51..0b5059404d 100644 --- a/console/types/integers/Cargo.toml +++ b/console/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-integers" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.12" +version = "=0.16.13" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/scalar/Cargo.toml b/console/types/scalar/Cargo.toml index 41b1a885dd..c963cd756c 100644 --- a/console/types/scalar/Cargo.toml +++ b/console/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-scalar" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,15 +8,15 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.12" +version = "=0.16.13" [dependencies.zeroize] version = "1" diff --git a/console/types/string/Cargo.toml b/console/types/string/Cargo.toml index 148c11a5e5..767525bf8c 100644 --- a/console/types/string/Cargo.toml +++ b/console/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-string" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-console-types-integers] path = "../integers" -version = "=0.16.12" +version = "=0.16.13" [dev-dependencies.bincode] version = "1.3" diff --git a/curves/Cargo.toml b/curves/Cargo.toml index 9a065cb406..b8c1d952b2 100644 --- a/curves/Cargo.toml +++ b/curves/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-curves" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Curves for a decentralized virtual machine" homepage = "https://aleo.org" @@ -36,12 +36,12 @@ harness = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.rand] diff --git a/fields/Cargo.toml b/fields/Cargo.toml index bb97c09dd6..9a481ef100 100644 --- a/fields/Cargo.toml +++ b/fields/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-fields" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Fields for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.aleo-std] diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index 2effb58d54..3a154a53cf 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "A node ledger for a decentralized virtual machine" homepage = "https://aleo.org" @@ -57,54 +57,54 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "./authority" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "./block" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "./coinbase" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "./committee" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-narwhal] package = "snarkvm-ledger-narwhal" path = "./narwhal" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "./query" -version = "=0.16.12" +version = "=0.16.13" features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "./store" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-test-helpers] package = "snarkvm-ledger-test-helpers" path = "./test-helpers" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.synthesizer] package = "snarkvm-synthesizer" path = "../synthesizer" -version = "=0.16.12" +version = "=0.16.13" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/authority/Cargo.toml b/ledger/authority/Cargo.toml index 88a2525af3..49131f9e56 100644 --- a/ledger/authority/Cargo.toml +++ b/ledger/authority/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-authority" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Data structures for a block authority in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-subdag/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.12" +version = "=0.16.13" [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.12" +version = "=0.16.13" [dependencies.anyhow] version = "1" diff --git a/ledger/block/Cargo.toml b/ledger/block/Cargo.toml index 9487d4b494..722a1a5d53 100644 --- a/ledger/block/Cargo.toml +++ b/ledger/block/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-block" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "A block for a decentralized virtual machine" homepage = "https://aleo.org" @@ -39,42 +39,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../ledger/coinbase" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../../ledger/committee" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../narwhal/transmission-id" -version = "=0.16.12" +version = "=0.16.13" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.12" +version = "=0.16.13" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.12" +version = "=0.16.13" [dependencies.indexmap] version = "2.0" diff --git a/ledger/coinbase/Cargo.toml b/ledger/coinbase/Cargo.toml index a8735c88ab..1f789c6a19 100644 --- a/ledger/coinbase/Cargo.toml +++ b/ledger/coinbase/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-coinbase" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Coinbase puzzle for a decentralized virtual machine" homepage = "https://aleo.org" @@ -50,27 +50,27 @@ wasm = [ [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-synthesizer-snark] path = "../../synthesizer/snark" -version = "=0.16.12" +version = "=0.16.13" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.aleo-std] diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index 36d7e7eee9..243cee75ed 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-committee" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "A committee for a decentralized virtual machine" homepage = "https://aleo.org" @@ -34,7 +34,7 @@ test-helpers = [ "prop-tests", "rand_distr" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.12" +version = "=0.16.13" [dependencies.indexmap] version = "2.0" @@ -43,7 +43,7 @@ features = [ "serde", "rayon" ] [dependencies.metrics] package = "snarkvm-metrics" path = "../../metrics" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.serde_json] diff --git a/ledger/narwhal/Cargo.toml b/ledger/narwhal/Cargo.toml index 0b107c6385..b1ad2d3d38 100644 --- a/ledger/narwhal/Cargo.toml +++ b/ledger/narwhal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Data structures for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -64,37 +64,37 @@ transmission-id = [ "narwhal-transmission-id" ] [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "./batch-certificate" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "./batch-header" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "./data" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "./subdag" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.narwhal-transmission] package = "snarkvm-ledger-narwhal-transmission" path = "./transmission" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "./transmission-id" -version = "=0.16.12" +version = "=0.16.13" optional = true [dev-dependencies.snarkvm-ledger-narwhal] diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index b272fccaab..c96da60e06 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-header/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.12" +version = "=0.16.13" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.12" +version = "=0.16.13" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.12" +version = "=0.16.13" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/batch-header/Cargo.toml b/ledger/narwhal/batch-header/Cargo.toml index 995c6af6fd..b1abd2e80e 100644 --- a/ledger/narwhal/batch-header/Cargo.toml +++ b/ledger/narwhal/batch-header/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "A batch header for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-transmission-id/test-helpers", "time" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.12" +version = "=0.16.13" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.12" +version = "=0.16.13" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/data/Cargo.toml b/ledger/narwhal/data/Cargo.toml index c9788fed46..1402d421de 100644 --- a/ledger/narwhal/data/Cargo.toml +++ b/ledger/narwhal/data/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-data" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -29,7 +29,7 @@ async = [ "tokio" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.12" +version = "=0.16.13" [dependencies.bytes] version = "1" diff --git a/ledger/narwhal/subdag/Cargo.toml b/ledger/narwhal/subdag/Cargo.toml index 67d87d0544..a1a3f99527 100644 --- a/ledger/narwhal/subdag/Cargo.toml +++ b/ledger/narwhal/subdag/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "A subdag for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ "narwhal-batch-certificate/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.12" +version = "=0.16.13" [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../batch-certificate" -version = "=0.16.12" +version = "=0.16.13" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.12" +version = "=0.16.13" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.12" +version = "=0.16.13" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/transmission-id/Cargo.toml b/ledger/narwhal/transmission-id/Cargo.toml index 8f2cc6e59f..962ec0e628 100644 --- a/ledger/narwhal/transmission-id/Cargo.toml +++ b/ledger/narwhal/transmission-id/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "A transmission ID for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.12" +version = "=0.16.13" [dev-dependencies.bincode] version = "1.3" diff --git a/ledger/narwhal/transmission/Cargo.toml b/ledger/narwhal/transmission/Cargo.toml index 689ee9e837..bce6f13f60 100644 --- a/ledger/narwhal/transmission/Cargo.toml +++ b/ledger/narwhal/transmission/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "A transmission for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../block" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "../data" -version = "=0.16.12" +version = "=0.16.13" [dependencies.bytes] version = "1" diff --git a/ledger/query/Cargo.toml b/ledger/query/Cargo.toml index 6995a7f5e5..d8d76cda21 100644 --- a/ledger/query/Cargo.toml +++ b/ledger/query/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-query" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "A query for a decentralized virtual machine" homepage = "https://aleo.org" @@ -24,24 +24,28 @@ serial = [ "ledger-store/serial", "synthesizer-program/serial" ] -wasm = [ "console/wasm", "ledger-store/wasm", "synthesizer-program/wasm" ] +wasm = [ + "console/wasm", + "ledger-store/wasm", + "synthesizer-program/wasm" +] query = [ "ledger-store", "synthesizer-program", "ureq" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.async-trait] diff --git a/ledger/store/Cargo.toml b/ledger/store/Cargo.toml index db5fd4c08a..df73d052b3 100644 --- a/ledger/store/Cargo.toml +++ b/ledger/store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-store" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "A data store for a decentralized virtual machine" homepage = "https://aleo.org" @@ -42,42 +42,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../coinbase" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../committee" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../narwhal/batch-certificate" -version = "=0.16.12" +version = "=0.16.13" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.12" +version = "=0.16.13" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.12" +version = "=0.16.13" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/test-helpers/Cargo.toml b/ledger/test-helpers/Cargo.toml index e83e3627f2..f1dbdb9bff 100644 --- a/ledger/test-helpers/Cargo.toml +++ b/ledger/test-helpers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-test-helpers" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Test helpers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -19,39 +19,39 @@ edition = "2021" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.12" +version = "=0.16.13" [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../query" -version = "=0.16.12" +version = "=0.16.13" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.12" +version = "=0.16.13" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.12" +version = "=0.16.13" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "../../synthesizer/process" -version = "=0.16.12" +version = "=0.16.13" [dependencies.once_cell] version = "1.18" diff --git a/metrics/Cargo.toml b/metrics/Cargo.toml index 2046b13ea4..7c91eca11f 100644 --- a/metrics/Cargo.toml +++ b/metrics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-metrics" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Metrics for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/parameters/Cargo.toml b/parameters/Cargo.toml index 0627cb439a..d769a77c4c 100644 --- a/parameters/Cargo.toml +++ b/parameters/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-parameters" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Parameters for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "encoding", "js-sys", "web-sys" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.12" +version = "=0.16.13" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/Cargo.toml b/synthesizer/Cargo.toml index f465de7c0c..dca82ddb22 100644 --- a/synthesizer/Cargo.toml +++ b/synthesizer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Synthesizer for a decentralized virtual machine" homepage = "https://aleo.org" @@ -69,61 +69,61 @@ harness = false [dependencies.algorithms] package = "snarkvm-algorithms" path = "../algorithms" -version = "=0.16.12" +version = "=0.16.13" [dependencies.circuit] package = "snarkvm-circuit" path = "../circuit" -version = "=0.16.12" +version = "=0.16.13" [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../ledger/block" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../ledger/coinbase" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../ledger/committee" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../ledger/query" -version = "=0.16.12" +version = "=0.16.13" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../ledger/store" -version = "=0.16.12" +version = "=0.16.13" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "./process" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "./program" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "./snark" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.aleo-std] diff --git a/synthesizer/process/Cargo.toml b/synthesizer/process/Cargo.toml index c15af587b5..be11d60eff 100644 --- a/synthesizer/process/Cargo.toml +++ b/synthesizer/process/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-process" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "A process for a decentralized virtual machine" homepage = "https://aleo.org" @@ -48,45 +48,45 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.12" +version = "=0.16.13" default-features = false features = [ "network", "program", "types" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../ledger/block" -version = "=0.16.12" +version = "=0.16.13" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../../ledger/query" -version = "=0.16.12" +version = "=0.16.13" default-features = false [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../../ledger/store" -version = "=0.16.12" +version = "=0.16.13" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.12" +version = "=0.16.13" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.12" +version = "=0.16.13" [dependencies.utilities] package = "snarkvm-utilities" path = "../../utilities" -version = "=0.16.12" +version = "=0.16.13" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/program/Cargo.toml b/synthesizer/program/Cargo.toml index af55370cdf..f9b5e87248 100644 --- a/synthesizer/program/Cargo.toml +++ b/synthesizer/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-program" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Program for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "console/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.12" +version = "=0.16.13" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.12" +version = "=0.16.13" default-features = false features = [ "account", "network", "program", "types" ] diff --git a/synthesizer/snark/Cargo.toml b/synthesizer/snark/Cargo.toml index 509627652a..293af43d6c 100644 --- a/synthesizer/snark/Cargo.toml +++ b/synthesizer/snark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-snark" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "SNARK wrappers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,18 +33,18 @@ wasm = [ "console/wasm", "snarkvm-algorithms/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.12" +version = "=0.16.13" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.12" +version = "=0.16.13" default-features = false features = [ "network" ] [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.12" +version = "=0.16.13" [dependencies.bincode] version = "1" diff --git a/utilities/Cargo.toml b/utilities/Cargo.toml index b03e3c4b4a..4f8af15dc9 100644 --- a/utilities/Cargo.toml +++ b/utilities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Utilities for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities-derives] path = "./derives" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.aleo-std] diff --git a/utilities/derives/Cargo.toml b/utilities/derives/Cargo.toml index aebe837a8d..b7ac9ce0e4 100644 --- a/utilities/derives/Cargo.toml +++ b/utilities/derives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities-derives" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "Canonical serialization for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index ffe688667f..a1ca2bcb59 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-wasm" -version = "0.16.12" +version = "0.16.13" authors = [ "The Aleo Team " ] description = "WASM for a decentralized virtual machine" homepage = "https://aleo.org" @@ -28,65 +28,77 @@ crate-type = [ "cdylib", "rlib" ] [features] default = [ "full" ] -full = [ "circuit", "console", "curves", "fields", "ledger", "synthesizer", "utilities" ] +full = [ + "circuit", + "console", + "curves", + "fields", + "ledger", + "synthesizer", + "utilities" +] circuit = [ "snarkvm-circuit-network" ] console = [ "snarkvm-console" ] curves = [ "snarkvm-curves" ] fields = [ "snarkvm-fields" ] -ledger = [ "snarkvm-ledger-block", "snarkvm-ledger-query", "snarkvm-ledger-store" ] +ledger = [ + "snarkvm-ledger-block", + "snarkvm-ledger-query", + "snarkvm-ledger-store" +] synthesizer = [ "snarkvm-synthesizer" ] utilities = [ "snarkvm-utilities" ] [dependencies.snarkvm-circuit-network] path = "../circuit/network" -version = "=0.16.12" +version = "=0.16.13" features = [ "wasm" ] optional = true [dependencies.snarkvm-console] path = "../console" -version = "=0.16.12" +version = "=0.16.13" features = [ "wasm" ] optional = true [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.12" +version = "=0.16.13" optional = true [dependencies.snarkvm-ledger-block] path = "../ledger/block" -version = "=0.16.12" +version = "=0.16.13" features = [ "wasm" ] optional = true [dependencies.snarkvm-ledger-query] path = "../ledger/query" -version = "=0.16.12" +version = "=0.16.13" features = [ "async", "wasm" ] optional = true [dependencies.snarkvm-ledger-store] path = "../ledger/store" -version = "=0.16.12" +version = "=0.16.13" features = [ "wasm" ] optional = true [dependencies.snarkvm-synthesizer] path = "../synthesizer" -version = "=0.16.12" +version = "=0.16.13" default-features = false features = [ "async", "wasm" ] optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.12" +version = "=0.16.13" features = [ "wasm" ] optional = true From d621d0feedcd5723a262de43f705f931b87060ac Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Mon, 18 Dec 2023 09:45:25 +0100 Subject: [PATCH 318/339] Add check that combiners.len() == sorted_evals.len() --- algorithms/src/snark/varuna/ahp/indexer/indexer.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs index 9205937943..021a0fcb80 100644 --- a/algorithms/src/snark/varuna/ahp/indexer/indexer.rs +++ b/algorithms/src/snark/varuna/ahp/indexer/indexer.rs @@ -255,6 +255,7 @@ impl AHPForR1CS { lc.add(combiner, label.as_str()); sum += eval * combiner; } + ensure!(combiners.next().is_none(), "Found more combiners than sorted_evals"); Ok((lc, sum)) } } From 5f94a0ae8959df49b7df22016c6b2f648c2cbdcb Mon Sep 17 00:00:00 2001 From: ljedrz Date: Thu, 14 Dec 2023 15:00:29 +0100 Subject: [PATCH 319/339] fix: avoid a panic in combine_for_open Signed-off-by: ljedrz --- algorithms/src/polycommit/sonic_pc/mod.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/algorithms/src/polycommit/sonic_pc/mod.rs b/algorithms/src/polycommit/sonic_pc/mod.rs index d42acd1bbe..1d840b45a9 100644 --- a/algorithms/src/polycommit/sonic_pc/mod.rs +++ b/algorithms/src/polycommit/sonic_pc/mod.rs @@ -276,14 +276,17 @@ impl> SonicKZG10 { Commitment: 'a, { ensure!(labeled_polynomials.len() == rands.len()); - Ok(Self::combine_polynomials(labeled_polynomials.into_iter().zip_eq(rands).map(|(p, r)| { + let mut to_combine = Vec::with_capacity(labeled_polynomials.len()); + + for (p, r) in labeled_polynomials.zip_eq(rands) { let enforced_degree_bounds: Option<&[usize]> = ck.enforced_degree_bounds.as_deref(); - kzg10::KZG10::::check_degrees_and_bounds(universal_prover.max_degree, enforced_degree_bounds, p) - .unwrap(); + kzg10::KZG10::::check_degrees_and_bounds(universal_prover.max_degree, enforced_degree_bounds, p)?; let challenge = fs_rng.squeeze_short_nonnative_field_element::(); - (challenge, p.polynomial().to_dense(), r) - }))) + to_combine.push((challenge, p.polynomial().to_dense(), r)); + } + + Ok(Self::combine_polynomials(to_combine)) } /// On input a list of labeled polynomials and a query set, `open` outputs a proof of evaluation From 5e31754a237440e0be1fc3caa88a3dd671473cca Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 18 Dec 2023 22:08:18 -0800 Subject: [PATCH 320/339] Parallelize signature verification in BatchCertification::from --- Cargo.lock | 1 + ledger/narwhal/batch-certificate/Cargo.toml | 4 ++++ ledger/narwhal/batch-certificate/src/lib.rs | 7 +++++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 903e50f568..cbbdedb02c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3225,6 +3225,7 @@ version = "0.16.13" dependencies = [ "bincode", "indexmap 2.0.2", + "rayon", "serde_json", "snarkvm-console", "snarkvm-ledger-narwhal-batch-certificate", diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index c96da60e06..8ac5923317 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -48,6 +48,10 @@ version = "=0.16.13" version = "2.0" features = [ "serde" ] +[dependencies.rayon] +version = "1" +optional = true + [dependencies.serde_json] version = "1.0" features = [ "preserve_order" ] diff --git a/ledger/narwhal/batch-certificate/src/lib.rs b/ledger/narwhal/batch-certificate/src/lib.rs index ace956b700..1571cd72c1 100644 --- a/ledger/narwhal/batch-certificate/src/lib.rs +++ b/ledger/narwhal/batch-certificate/src/lib.rs @@ -29,6 +29,8 @@ use narwhal_transmission_id::TransmissionID; use core::hash::{Hash, Hasher}; use indexmap::{IndexMap, IndexSet}; +#[cfg(not(feature = "serial"))] +use rayon::prelude::*; #[derive(Clone)] pub enum BatchCertificate { @@ -103,11 +105,12 @@ impl BatchCertificate { ensure!(signatures.len() <= Self::MAX_SIGNATURES, "Invalid number of signatures"); // Verify the signatures are valid. - for signature in &signatures { + cfg_iter!(signatures).try_for_each(|signature| { if !signature.verify(&signature.to_address(), &[batch_header.batch_id()]) { bail!("Invalid batch certificate signature") } - } + Ok(()) + })?; // Return the batch certificate. Self::from_unchecked(batch_header, signatures) } From 11d011b1db19c74a6a1b6a58ab45142d0a140186 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Mon, 18 Dec 2023 22:16:09 -0800 Subject: [PATCH 321/339] Update ledger/narwhal/batch-certificate/src/lib.rs Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- ledger/narwhal/batch-certificate/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/ledger/narwhal/batch-certificate/src/lib.rs b/ledger/narwhal/batch-certificate/src/lib.rs index 1571cd72c1..3e9fede619 100644 --- a/ledger/narwhal/batch-certificate/src/lib.rs +++ b/ledger/narwhal/batch-certificate/src/lib.rs @@ -29,6 +29,7 @@ use narwhal_transmission_id::TransmissionID; use core::hash::{Hash, Hasher}; use indexmap::{IndexMap, IndexSet}; + #[cfg(not(feature = "serial"))] use rayon::prelude::*; From 51c4efb6ea3352c02764aa71ffe20c9a20a50a86 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 18 Dec 2023 22:18:58 -0800 Subject: [PATCH 322/339] Fix dep --- ledger/narwhal/batch-certificate/Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index 8ac5923317..461a46f6c4 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -50,7 +50,6 @@ features = [ "serde" ] [dependencies.rayon] version = "1" -optional = true [dependencies.serde_json] version = "1.0" From bb2423f060d1b4057c2f71f57b0bdeba5ce6dcc8 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Mon, 18 Dec 2023 22:33:52 -0800 Subject: [PATCH 323/339] Fix rayon dep --- ledger/narwhal/batch-certificate/Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index 461a46f6c4..661079aaaa 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -24,7 +24,7 @@ license = "Apache-2.0" edition = "2021" [features] -default = [ ] +default = [ "rayon" ] serial = [ "console/serial" ] wasm = [ "console/wasm" ] test-helpers = [ "narwhal-batch-header/test-helpers" ] @@ -50,6 +50,7 @@ features = [ "serde" ] [dependencies.rayon] version = "1" +optional = true [dependencies.serde_json] version = "1.0" From fba88b3ab97fbe9947805675ea3559e9130d05cb Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 19 Dec 2023 00:01:01 -0800 Subject: [PATCH 324/339] Add cfg_chunks to prelude --- console/network/environment/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/console/network/environment/src/lib.rs b/console/network/environment/src/lib.rs index f6d28304b3..bfd495d509 100644 --- a/console/network/environment/src/lib.rs +++ b/console/network/environment/src/lib.rs @@ -30,6 +30,7 @@ pub mod prelude { pub use snarkvm_curves::{AffineCurve, MontgomeryParameters, ProjectiveCurve, TwistedEdwardsParameters}; pub use snarkvm_fields::{Field as _, PrimeField as _, SquareRootField as _, Zero as _}; pub use snarkvm_utilities::{ + cfg_chunks, cfg_find, cfg_find_map, cfg_into_iter, From 17fc055b08a9d77637f12387c510681a6aa1fcb9 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 19 Dec 2023 00:03:01 -0800 Subject: [PATCH 325/339] Parallelize signature deserialization in BatchCertificate --- Cargo.lock | 1 + ledger/narwhal/batch-certificate/Cargo.toml | 6 +++++- ledger/narwhal/batch-certificate/src/bytes.rs | 14 +++++++------- ledger/narwhal/batch-certificate/src/lib.rs | 3 +++ 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 903e50f568..cbbdedb02c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3225,6 +3225,7 @@ version = "0.16.13" dependencies = [ "bincode", "indexmap 2.0.2", + "rayon", "serde_json", "snarkvm-console", "snarkvm-ledger-narwhal-batch-certificate", diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index c96da60e06..661079aaaa 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -24,7 +24,7 @@ license = "Apache-2.0" edition = "2021" [features] -default = [ ] +default = [ "rayon" ] serial = [ "console/serial" ] wasm = [ "console/wasm" ] test-helpers = [ "narwhal-batch-header/test-helpers" ] @@ -48,6 +48,10 @@ version = "=0.16.13" version = "2.0" features = [ "serde" ] +[dependencies.rayon] +version = "1" +optional = true + [dependencies.serde_json] version = "1.0" features = [ "preserve_order" ] diff --git a/ledger/narwhal/batch-certificate/src/bytes.rs b/ledger/narwhal/batch-certificate/src/bytes.rs index df2cd98bfa..8193c70b1d 100644 --- a/ledger/narwhal/batch-certificate/src/bytes.rs +++ b/ledger/narwhal/batch-certificate/src/bytes.rs @@ -62,14 +62,14 @@ impl FromBytes for BatchCertificate { Self::MAX_SIGNATURES ))); } + // Read the signature bytes. + let signature_size_in_bytes = (Signature::::size_in_bits() + 7) / 8; + let mut signature_bytes = vec![0u8; num_signatures as usize * signature_size_in_bytes]; + reader.read_exact(&mut signature_bytes)?; // Read the signatures. - let mut signatures = IndexSet::with_capacity(num_signatures as usize); - for _ in 0..num_signatures { - // Read the signature. - let signature = Signature::read_le(&mut reader)?; - // Insert the signature. - signatures.insert(signature); - } + let signatures = cfg_chunks!(signature_bytes, signature_size_in_bytes) + .map(Signature::read_le) + .collect::, _>>()?; // Return the batch certificate. Self::from(batch_header, signatures).map_err(error) } else { diff --git a/ledger/narwhal/batch-certificate/src/lib.rs b/ledger/narwhal/batch-certificate/src/lib.rs index ace956b700..21ccbfbb0d 100644 --- a/ledger/narwhal/batch-certificate/src/lib.rs +++ b/ledger/narwhal/batch-certificate/src/lib.rs @@ -30,6 +30,9 @@ use narwhal_transmission_id::TransmissionID; use core::hash::{Hash, Hasher}; use indexmap::{IndexMap, IndexSet}; +#[cfg(not(feature = "serial"))] +use rayon::prelude::*; + #[derive(Clone)] pub enum BatchCertificate { // TODO (howardwu): For mainnet - Delete V1 and switch everyone to V2 as the default. From bb10e7d7eb1393376e612164d4bc8e678b7bb8f0 Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 19 Dec 2023 00:15:12 -0800 Subject: [PATCH 326/339] Implement size_in_bytes for ComputeKey and Signature --- console/account/src/compute_key/mod.rs | 1 + .../account/src/compute_key/size_in_bytes.rs | 23 +++++++++++++++++++ console/account/src/signature/mod.rs | 1 + .../account/src/signature/size_in_bytes.rs | 23 +++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 console/account/src/compute_key/size_in_bytes.rs create mode 100644 console/account/src/signature/size_in_bytes.rs diff --git a/console/account/src/compute_key/mod.rs b/console/account/src/compute_key/mod.rs index 1fadf472be..5b7e827f7d 100644 --- a/console/account/src/compute_key/mod.rs +++ b/console/account/src/compute_key/mod.rs @@ -17,6 +17,7 @@ mod bytes; mod from_bits; mod serialize; mod size_in_bits; +mod size_in_bytes; mod to_address; mod to_bits; mod to_fields; diff --git a/console/account/src/compute_key/size_in_bytes.rs b/console/account/src/compute_key/size_in_bytes.rs new file mode 100644 index 0000000000..68bd892bef --- /dev/null +++ b/console/account/src/compute_key/size_in_bytes.rs @@ -0,0 +1,23 @@ +// Copyright (C) 2019-2023 Aleo Systems Inc. +// This file is part of the snarkVM library. + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use super::*; + +impl SizeInBytes for ComputeKey { + /// Returns the compute key size in bytes. + #[inline] + fn size_in_bytes() -> usize { + Group::::size_in_bytes() + Group::::size_in_bytes() + } +} diff --git a/console/account/src/signature/mod.rs b/console/account/src/signature/mod.rs index 6b2c0b7db1..1225af3b38 100644 --- a/console/account/src/signature/mod.rs +++ b/console/account/src/signature/mod.rs @@ -18,6 +18,7 @@ mod from_bits; mod parse; mod serialize; mod size_in_bits; +mod size_in_bytes; mod to_bits; mod to_fields; mod verify; diff --git a/console/account/src/signature/size_in_bytes.rs b/console/account/src/signature/size_in_bytes.rs new file mode 100644 index 0000000000..7f1e9dced8 --- /dev/null +++ b/console/account/src/signature/size_in_bytes.rs @@ -0,0 +1,23 @@ +// Copyright (C) 2019-2023 Aleo Systems Inc. +// This file is part of the snarkVM library. + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use super::*; + +impl SizeInBytes for Signature { + /// Returns the signature size in bytes. + #[inline] + fn size_in_bytes() -> usize { + Scalar::::size_in_bytes() + Scalar::::size_in_bytes() + ComputeKey::::size_in_bytes() + } +} From 0bc0295ff546304654fb7a212d0982223b1f103f Mon Sep 17 00:00:00 2001 From: raychu86 <14917648+raychu86@users.noreply.github.com> Date: Tue, 19 Dec 2023 00:15:45 -0800 Subject: [PATCH 327/339] Use Signature::size_in_bytes --- ledger/narwhal/batch-certificate/src/bytes.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ledger/narwhal/batch-certificate/src/bytes.rs b/ledger/narwhal/batch-certificate/src/bytes.rs index 8193c70b1d..446a0d4193 100644 --- a/ledger/narwhal/batch-certificate/src/bytes.rs +++ b/ledger/narwhal/batch-certificate/src/bytes.rs @@ -63,11 +63,10 @@ impl FromBytes for BatchCertificate { ))); } // Read the signature bytes. - let signature_size_in_bytes = (Signature::::size_in_bits() + 7) / 8; - let mut signature_bytes = vec![0u8; num_signatures as usize * signature_size_in_bytes]; + let mut signature_bytes = vec![0u8; num_signatures as usize * Signature::::size_in_bytes()]; reader.read_exact(&mut signature_bytes)?; // Read the signatures. - let signatures = cfg_chunks!(signature_bytes, signature_size_in_bytes) + let signatures = cfg_chunks!(signature_bytes, Signature::::size_in_bytes()) .map(Signature::read_le) .collect::, _>>()?; // Return the batch certificate. From 6723db0c5c885ac8e9c02a2f6719e159b98cf2c0 Mon Sep 17 00:00:00 2001 From: Alessandro Coglio Date: Tue, 19 Dec 2023 16:09:38 +0100 Subject: [PATCH 328/339] Remove mention of version. --- ledger/narwhal/batch-header/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index 7a3af90ae1..06353543e1 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -35,7 +35,7 @@ pub struct BatchHeader { /// TODO (howardwu): For mainnet - Remove this version from the struct, we only use it here for backwards compatibility. /// NOTE: You must keep the version encoding in the byte serialization, just remove it from the struct in memory. version: u8, - /// The batch ID, defined as the hash of the version, author, round number, timestamp, transmission IDs, + /// The batch ID, defined as the hash of the author, round number, timestamp, transmission IDs, /// previous batch certificate IDs, and last election certificate IDs (the latter only if the version is not 1, /// for pre-mainnet backward compatibility). batch_id: Field, From b06ded73a6f47f2d87caa32389b66cd4fde91b12 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 19 Dec 2023 09:56:19 -0800 Subject: [PATCH 329/339] Update ledger/narwhal/batch-header/src/lib.rs Signed-off-by: Howard Wu <9260812+howardwu@users.noreply.github.com> --- ledger/narwhal/batch-header/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index 06353543e1..64f4bc7b30 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -36,8 +36,7 @@ pub struct BatchHeader { /// NOTE: You must keep the version encoding in the byte serialization, just remove it from the struct in memory. version: u8, /// The batch ID, defined as the hash of the author, round number, timestamp, transmission IDs, - /// previous batch certificate IDs, and last election certificate IDs (the latter only if the version is not 1, - /// for pre-mainnet backward compatibility). + /// previous batch certificate IDs, and last election certificate IDs. batch_id: Field, /// The author of the batch. author: Address, From d5e9c7fb5e0232356ab7fb8802078bc63079611c Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 19 Dec 2023 10:29:50 -0800 Subject: [PATCH 330/339] Updates the metrics with all types --- metrics/src/lib.rs | 62 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/metrics/src/lib.rs b/metrics/src/lib.rs index 82665c1b55..83e9748539 100644 --- a/metrics/src/lib.rs +++ b/metrics/src/lib.rs @@ -20,13 +20,43 @@ pub mod committee { pub const TOTAL_STAKE: &str = "snarkvm_ledger_committee_total_stake"; } -/// Registers all metrics. +/// Registers all snarkVM metrics. pub fn register_metrics() { for name in GAUGE_NAMES { - ::metrics::register_gauge!(name); + register_gauge(name); } } +/******** Counter ********/ + +/// Registers a counter with the given name. +pub fn register_counter(name: &'static str) { + ::metrics::register_counter!(name); +} + +/// Updates a counter with the given name to the given value. +/// +/// Counters represent a single monotonic value, which means the value can only be incremented, +/// not decremented, and always starts out with an initial value of zero. +pub fn counter>(name: &'static str, value: V) { + ::metrics::counter!(name, value.into()); +} + +/// Increments a counter with the given name by one. +/// +/// Counters represent a single monotonic value, which means the value can only be incremented, +/// not decremented, and always starts out with an initial value of zero. +pub fn increment_counter(name: &'static str) { + ::metrics::increment_counter!(name); +} + +/******** Gauge ********/ + +/// Registers a gauge with the given name. +pub fn register_gauge(name: &'static str) { + ::metrics::register_gauge!(name); +} + /// Updates a gauge with the given name to the given value. /// /// Gauges represent a single value that can go up or down over time, @@ -34,3 +64,31 @@ pub fn register_metrics() { pub fn gauge>(name: &'static str, value: V) { ::metrics::gauge!(name, value.into()); } + +/// Increments a gauge with the given name by the given value. +/// +/// Gauges represent a single value that can go up or down over time, +/// and always starts out with an initial value of zero. +pub fn increment_gauge>(name: &'static str, value: V) { + ::metrics::increment_gauge!(name, value.into()); +} + +/// Decrements a gauge with the given name by the given value. +/// +/// Gauges represent a single value that can go up or down over time, +/// and always starts out with an initial value of zero. +pub fn decrement_gauge>(name: &'static str, value: V) { + ::metrics::decrement_gauge!(name, value.into()); +} + +/******** Histogram ********/ + +/// Registers a histogram with the given name. +pub fn register_histogram(name: &'static str) { + ::metrics::register_histogram!(name); +} + +/// Updates a histogram with the given name to the given value. +pub fn histogram>(name: &'static str, value: V) { + ::metrics::histogram!(name, value.into()); +} From f6aaf895b9336a249f612779d2c4b0eaa8f228e1 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 19 Dec 2023 10:43:15 -0800 Subject: [PATCH 331/339] Make gauges names private --- metrics/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metrics/src/lib.rs b/metrics/src/lib.rs index 83e9748539..4108fb9a86 100644 --- a/metrics/src/lib.rs +++ b/metrics/src/lib.rs @@ -14,7 +14,7 @@ #![forbid(unsafe_code)] -pub const GAUGE_NAMES: [&str; 1] = [committee::TOTAL_STAKE]; +const GAUGE_NAMES: [&str; 1] = [committee::TOTAL_STAKE]; pub mod committee { pub const TOTAL_STAKE: &str = "snarkvm_ledger_committee_total_stake"; From fd2f5b5072d80e88a17c1edc082b8251e0f7ed88 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 19 Dec 2023 14:25:35 -0800 Subject: [PATCH 332/339] chore(snarkvm): bump version for new release --- .cargo/release-version | 2 +- Cargo.lock | 120 ++++++++++---------- Cargo.toml | 24 ++-- algorithms/Cargo.toml | 12 +- algorithms/cuda/Cargo.toml | 2 +- circuit/Cargo.toml | 16 +-- circuit/account/Cargo.toml | 10 +- circuit/algorithms/Cargo.toml | 8 +- circuit/collections/Cargo.toml | 8 +- circuit/environment/Cargo.toml | 14 +-- circuit/environment/witness/Cargo.toml | 2 +- circuit/network/Cargo.toml | 10 +- circuit/program/Cargo.toml | 16 +-- circuit/types/Cargo.toml | 18 +-- circuit/types/address/Cargo.toml | 14 +-- circuit/types/boolean/Cargo.toml | 6 +- circuit/types/field/Cargo.toml | 8 +- circuit/types/group/Cargo.toml | 12 +- circuit/types/integers/Cargo.toml | 12 +- circuit/types/scalar/Cargo.toml | 10 +- circuit/types/string/Cargo.toml | 12 +- console/Cargo.toml | 14 +-- console/account/Cargo.toml | 6 +- console/algorithms/Cargo.toml | 8 +- console/collections/Cargo.toml | 6 +- console/network/Cargo.toml | 20 ++-- console/network/environment/Cargo.toml | 8 +- console/program/Cargo.toml | 14 +-- console/types/Cargo.toml | 18 +-- console/types/address/Cargo.toml | 10 +- console/types/boolean/Cargo.toml | 4 +- console/types/field/Cargo.toml | 6 +- console/types/group/Cargo.toml | 10 +- console/types/integers/Cargo.toml | 10 +- console/types/scalar/Cargo.toml | 8 +- console/types/string/Cargo.toml | 10 +- curves/Cargo.toml | 6 +- fields/Cargo.toml | 4 +- ledger/Cargo.toml | 22 ++-- ledger/authority/Cargo.toml | 6 +- ledger/block/Cargo.toml | 18 +-- ledger/coinbase/Cargo.toml | 14 +-- ledger/committee/Cargo.toml | 6 +- ledger/narwhal/Cargo.toml | 14 +-- ledger/narwhal/batch-certificate/Cargo.toml | 8 +- ledger/narwhal/batch-header/Cargo.toml | 6 +- ledger/narwhal/data/Cargo.toml | 4 +- ledger/narwhal/subdag/Cargo.toml | 10 +- ledger/narwhal/transmission-id/Cargo.toml | 6 +- ledger/narwhal/transmission/Cargo.toml | 10 +- ledger/query/Cargo.toml | 8 +- ledger/store/Cargo.toml | 18 +-- ledger/test-helpers/Cargo.toml | 16 +-- metrics/Cargo.toml | 2 +- parameters/Cargo.toml | 6 +- synthesizer/Cargo.toml | 24 ++-- synthesizer/process/Cargo.toml | 18 +-- synthesizer/program/Cargo.toml | 6 +- synthesizer/snark/Cargo.toml | 8 +- utilities/Cargo.toml | 4 +- utilities/derives/Cargo.toml | 2 +- wasm/Cargo.toml | 20 ++-- 62 files changed, 377 insertions(+), 377 deletions(-) diff --git a/.cargo/release-version b/.cargo/release-version index 1d261db554..642deb0fe4 100644 --- a/.cargo/release-version +++ b/.cargo/release-version @@ -1 +1 @@ -v0.16.13 \ No newline at end of file +v0.16.14 \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index cbbdedb02c..47ce3fb1d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2577,7 +2577,7 @@ dependencies = [ [[package]] name = "snarkvm" -version = "0.16.13" +version = "0.16.14" dependencies = [ "anstyle", "anyhow", @@ -2613,7 +2613,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms" -version = "0.16.13" +version = "0.16.14" dependencies = [ "aleo-std", "anyhow", @@ -2652,7 +2652,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms-cuda" -version = "0.16.13" +version = "0.16.14" dependencies = [ "blst", "cc", @@ -2662,7 +2662,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit" -version = "0.16.13" +version = "0.16.14" dependencies = [ "snarkvm-circuit-account", "snarkvm-circuit-algorithms", @@ -2675,7 +2675,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-account" -version = "0.16.13" +version = "0.16.14" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2687,7 +2687,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-algorithms" -version = "0.16.13" +version = "0.16.14" dependencies = [ "anyhow", "snarkvm-circuit-types", @@ -2699,7 +2699,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-collections" -version = "0.16.13" +version = "0.16.14" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2713,7 +2713,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment" -version = "0.16.13" +version = "0.16.14" dependencies = [ "criterion", "indexmap 2.0.2", @@ -2734,11 +2734,11 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment-witness" -version = "0.16.13" +version = "0.16.14" [[package]] name = "snarkvm-circuit-network" -version = "0.16.13" +version = "0.16.14" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-collections", @@ -2749,7 +2749,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-program" -version = "0.16.13" +version = "0.16.14" dependencies = [ "anyhow", "paste", @@ -2767,7 +2767,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types" -version = "0.16.13" +version = "0.16.14" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-address", @@ -2782,7 +2782,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-address" -version = "0.16.13" +version = "0.16.14" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2794,7 +2794,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-boolean" -version = "0.16.13" +version = "0.16.14" dependencies = [ "criterion", "snarkvm-circuit-environment", @@ -2803,7 +2803,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-field" -version = "0.16.13" +version = "0.16.14" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2812,7 +2812,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-group" -version = "0.16.13" +version = "0.16.14" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2824,7 +2824,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-integers" -version = "0.16.13" +version = "0.16.14" dependencies = [ "paste", "snarkvm-circuit-environment", @@ -2837,7 +2837,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-scalar" -version = "0.16.13" +version = "0.16.14" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2847,7 +2847,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-string" -version = "0.16.13" +version = "0.16.14" dependencies = [ "rand", "snarkvm-circuit-environment", @@ -2860,7 +2860,7 @@ dependencies = [ [[package]] name = "snarkvm-console" -version = "0.16.13" +version = "0.16.14" dependencies = [ "snarkvm-console-account", "snarkvm-console-algorithms", @@ -2872,7 +2872,7 @@ dependencies = [ [[package]] name = "snarkvm-console-account" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "bs58", @@ -2885,7 +2885,7 @@ dependencies = [ [[package]] name = "snarkvm-console-algorithms" -version = "0.16.13" +version = "0.16.14" dependencies = [ "blake2s_simd", "criterion", @@ -2903,7 +2903,7 @@ dependencies = [ [[package]] name = "snarkvm-console-collections" -version = "0.16.13" +version = "0.16.14" dependencies = [ "aleo-std", "criterion", @@ -2916,7 +2916,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network" -version = "0.16.13" +version = "0.16.14" dependencies = [ "anyhow", "indexmap 2.0.2", @@ -2938,7 +2938,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network-environment" -version = "0.16.13" +version = "0.16.14" dependencies = [ "anyhow", "bech32", @@ -2955,7 +2955,7 @@ dependencies = [ [[package]] name = "snarkvm-console-program" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "enum_index", @@ -2976,7 +2976,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types" -version = "0.16.13" +version = "0.16.14" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-address", @@ -2990,7 +2990,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-address" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "serde_json", @@ -3002,7 +3002,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-boolean" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "serde_json", @@ -3011,7 +3011,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-field" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "serde_json", @@ -3022,7 +3022,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-group" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "serde_json", @@ -3034,7 +3034,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-integers" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "serde_json", @@ -3046,7 +3046,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-scalar" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "serde_json", @@ -3058,7 +3058,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-string" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "serde_json", @@ -3070,7 +3070,7 @@ dependencies = [ [[package]] name = "snarkvm-curves" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "criterion", @@ -3085,7 +3085,7 @@ dependencies = [ [[package]] name = "snarkvm-fields" -version = "0.16.13" +version = "0.16.14" dependencies = [ "aleo-std", "anyhow", @@ -3102,7 +3102,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger" -version = "0.16.13" +version = "0.16.14" dependencies = [ "aleo-std", "anyhow", @@ -3129,7 +3129,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-authority" -version = "0.16.13" +version = "0.16.14" dependencies = [ "anyhow", "bincode", @@ -3142,7 +3142,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-block" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3166,7 +3166,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-coinbase" -version = "0.16.13" +version = "0.16.14" dependencies = [ "aleo-std", "anyhow", @@ -3187,7 +3187,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-committee" -version = "0.16.13" +version = "0.16.14" dependencies = [ "anyhow", "bincode", @@ -3208,7 +3208,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal" -version = "0.16.13" +version = "0.16.14" dependencies = [ "snarkvm-ledger-narwhal", "snarkvm-ledger-narwhal-batch-certificate", @@ -3221,7 +3221,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3235,7 +3235,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3248,7 +3248,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-data" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bytes", "serde_json", @@ -3258,7 +3258,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3273,7 +3273,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "bytes", @@ -3286,7 +3286,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "serde_json", @@ -3296,7 +3296,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-query" -version = "0.16.13" +version = "0.16.14" dependencies = [ "async-trait", "reqwest", @@ -3308,7 +3308,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-store" -version = "0.16.13" +version = "0.16.14" dependencies = [ "aleo-std", "anyhow", @@ -3336,7 +3336,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-test-helpers" -version = "0.16.13" +version = "0.16.14" dependencies = [ "once_cell", "snarkvm-circuit", @@ -3350,7 +3350,7 @@ dependencies = [ [[package]] name = "snarkvm-metrics" -version = "0.16.13" +version = "0.16.14" dependencies = [ "metrics", "metrics-exporter-prometheus", @@ -3358,7 +3358,7 @@ dependencies = [ [[package]] name = "snarkvm-parameters" -version = "0.16.13" +version = "0.16.14" dependencies = [ "aleo-std", "anyhow", @@ -3391,7 +3391,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer" -version = "0.16.13" +version = "0.16.14" dependencies = [ "aleo-std", "anyhow", @@ -3422,7 +3422,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-process" -version = "0.16.13" +version = "0.16.14" dependencies = [ "aleo-std", "bincode", @@ -3448,7 +3448,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-program" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "criterion", @@ -3464,7 +3464,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-snark" -version = "0.16.13" +version = "0.16.14" dependencies = [ "bincode", "colored", @@ -3477,7 +3477,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities" -version = "0.16.13" +version = "0.16.14" dependencies = [ "aleo-std", "anyhow", @@ -3497,7 +3497,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities-derives" -version = "0.16.13" +version = "0.16.14" dependencies = [ "proc-macro2", "quote 1.0.33", @@ -3506,7 +3506,7 @@ dependencies = [ [[package]] name = "snarkvm-wasm" -version = "0.16.13" +version = "0.16.14" dependencies = [ "getrandom", "snarkvm-circuit-network", diff --git a/Cargo.toml b/Cargo.toml index 5bc2b1c6ef..7fcdc7ec3f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "A decentralized virtual machine" homepage = "https://aleo.org" @@ -150,58 +150,58 @@ wasm = [ "snarkvm-wasm" ] [dependencies.snarkvm-algorithms] path = "./algorithms" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-circuit] path = "./circuit" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-console] path = "./console" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-curves] path = "./curves" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-fields] path = "./fields" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-ledger] path = "./ledger" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-metrics] path = "./metrics" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-parameters] path = "./parameters" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-synthesizer] path = "./synthesizer" -version = "=0.16.13" +version = "=0.16.14" default-features = false optional = true [dependencies.snarkvm-utilities] path = "./utilities" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-wasm] path = "./wasm" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.anstyle] diff --git a/algorithms/Cargo.toml b/algorithms/Cargo.toml index 3bb244c1e3..5e125691a5 100644 --- a/algorithms/Cargo.toml +++ b/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Algorithms for a decentralized virtual machine" homepage = "https://aleo.org" @@ -47,27 +47,27 @@ required-features = [ "test" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.snarkvm-parameters] path = "../parameters" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.snarkvm-algorithms-cuda] path = "./cuda" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.aleo-std] diff --git a/algorithms/cuda/Cargo.toml b/algorithms/cuda/Cargo.toml index baf0b265bd..aae2cbdb94 100644 --- a/algorithms/cuda/Cargo.toml +++ b/algorithms/cuda/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms-cuda" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Cuda optimizations for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/circuit/Cargo.toml b/circuit/Cargo.toml index c1f084fa9a..128d7ee3ee 100644 --- a/circuit/Cargo.toml +++ b/circuit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Circuits for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,28 +25,28 @@ edition = "2021" [dependencies.snarkvm-circuit-account] path = "./account" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-algorithms] path = "./algorithms" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-collections] path = "./collections" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-environment] path = "./environment" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-network] path = "./network" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-program] path = "./program" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types] path = "./types" -version = "=0.16.13" +version = "=0.16.14" diff --git a/circuit/account/Cargo.toml b/circuit/account/Cargo.toml index 7c0435b1e6..ed39f89e4f 100644 --- a/circuit/account/Cargo.toml +++ b/circuit/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-account" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Account circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-account" path = "../../console/account" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.13" +version = "=0.16.14" [dev-dependencies.snarkvm-utilities] path = "../../utilities" diff --git a/circuit/algorithms/Cargo.toml b/circuit/algorithms/Cargo.toml index 1bc8a0ee16..a481a8b16d 100644 --- a/circuit/algorithms/Cargo.toml +++ b/circuit/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-algorithms" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Algorithm circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-algorithms" path = "../../console/algorithms" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dev-dependencies.anyhow] diff --git a/circuit/collections/Cargo.toml b/circuit/collections/Cargo.toml index 94806d9ebd..6a674b9452 100644 --- a/circuit/collections/Cargo.toml +++ b/circuit/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-collections" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Collections circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-collections" path = "../../console/collections" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.13" +version = "=0.16.14" [dev-dependencies.snarkvm-circuit-network] path = "../network" diff --git a/circuit/environment/Cargo.toml b/circuit/environment/Cargo.toml index a231644cc5..19c5869059 100644 --- a/circuit/environment/Cargo.toml +++ b/circuit/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Circuit environment for a decentralized virtual machine" license = "Apache-2.0" @@ -14,32 +14,32 @@ harness = false [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.13" +version = "=0.16.14" default-features = false features = [ "r1cs" ] [dependencies.snarkvm-circuit-environment-witness] path = "./witness" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.indexmap] diff --git a/circuit/environment/witness/Cargo.toml b/circuit/environment/witness/Cargo.toml index 88634d948e..ede16a9166 100644 --- a/circuit/environment/witness/Cargo.toml +++ b/circuit/environment/witness/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment-witness" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "A procedural macro to construct a witness in an environment" license = "Apache-2.0" diff --git a/circuit/network/Cargo.toml b/circuit/network/Cargo.toml index 577c34149f..837bd67edf 100644 --- a/circuit/network/Cargo.toml +++ b/circuit/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-network" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Network circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.13" +version = "=0.16.14" [dev-dependencies.snarkvm-console-types] path = "../../console/types" diff --git a/circuit/program/Cargo.toml b/circuit/program/Cargo.toml index d0dc956620..0c41d52585 100644 --- a/circuit/program/Cargo.toml +++ b/circuit/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-program" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Program circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,32 +9,32 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-program" path = "../../console/program" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-circuit-account] path = "../account" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.13" +version = "=0.16.14" [dependencies.paste] version = "1.0" diff --git a/circuit/types/Cargo.toml b/circuit/types/Cargo.toml index b232d10211..ffde9546dc 100644 --- a/circuit/types/Cargo.toml +++ b/circuit/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Primitive circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -8,35 +8,35 @@ edition = "2021" [dependencies.snarkvm-circuit-environment] path = "../environment" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-address] path = "./address" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-boolean] path = "./boolean" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-field] path = "./field" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-group] path = "./group" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-integers] path = "./integers" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-scalar] path = "./scalar" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-string] path = "./string" -version = "=0.16.13" +version = "=0.16.14" [dev-dependencies.console] package = "snarkvm-console" diff --git a/circuit/types/address/Cargo.toml b/circuit/types/address/Cargo.toml index a5ee48cce2..75fc13bcc8 100644 --- a/circuit/types/address/Cargo.toml +++ b/circuit/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-address" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Address circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,28 +9,28 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-address" path = "../../../console/types/address" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-group] path = "../group" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.13" +version = "=0.16.14" [features] default = [ "enable_console" ] diff --git a/circuit/types/boolean/Cargo.toml b/circuit/types/boolean/Cargo.toml index 2906d393c2..1f350c43b6 100644 --- a/circuit/types/boolean/Cargo.toml +++ b/circuit/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-boolean" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Boolean circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -14,12 +14,12 @@ harness = false [dependencies.console] package = "snarkvm-console-types-boolean" path = "../../../console/types/boolean" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.13" +version = "=0.16.14" [dev-dependencies.criterion] version = "0.5" diff --git a/circuit/types/field/Cargo.toml b/circuit/types/field/Cargo.toml index e55bfb6dc3..5a49dffe11 100644 --- a/circuit/types/field/Cargo.toml +++ b/circuit/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-field" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Field circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-field" path = "../../../console/types/field" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.13" +version = "=0.16.14" [features] default = [ "enable_console" ] diff --git a/circuit/types/group/Cargo.toml b/circuit/types/group/Cargo.toml index 0cafb824f6..c02efa0d99 100644 --- a/circuit/types/group/Cargo.toml +++ b/circuit/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-group" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Group circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-group" path = "../../../console/types/group" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.13" +version = "=0.16.14" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/integers/Cargo.toml b/circuit/types/integers/Cargo.toml index 8479724fe7..4fb4a50f27 100644 --- a/circuit/types/integers/Cargo.toml +++ b/circuit/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-integers" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Integer circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-integers" path = "../../../console/types/integers" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.13" +version = "=0.16.14" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/scalar/Cargo.toml b/circuit/types/scalar/Cargo.toml index cf14da981b..f7d25294a1 100644 --- a/circuit/types/scalar/Cargo.toml +++ b/circuit/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-scalar" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Scalar circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-scalar" path = "../../../console/types/scalar" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.13" +version = "=0.16.14" [features] default = [ "enable_console" ] diff --git a/circuit/types/string/Cargo.toml b/circuit/types/string/Cargo.toml index 663889cb47..e24c333c29 100644 --- a/circuit/types/string/Cargo.toml +++ b/circuit/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-string" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "String circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-string" path = "../../../console/types/string" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-circuit-types-integers] path = "../integers" -version = "=0.16.13" +version = "=0.16.14" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/console/Cargo.toml b/console/Cargo.toml index 9dcd1eb678..a716db0249 100644 --- a/console/Cargo.toml +++ b/console/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Console environment for a decentralized virtual machine" license = "Apache-2.0" @@ -8,32 +8,32 @@ edition = "2021" [dependencies.snarkvm-console-account] path = "./account" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-console-algorithms] path = "./algorithms" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-console-collections] path = "./collections" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-console-network] path = "./network" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-console-program] path = "./program" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-console-types] path = "./types" -version = "=0.16.13" +version = "=0.16.14" optional = true [features] diff --git a/console/account/Cargo.toml b/console/account/Cargo.toml index 3ac17b9644..53491b9103 100644 --- a/console/account/Cargo.toml +++ b/console/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-account" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Account operations for a decentralized virtual machine" license = "Apache-2.0" @@ -13,11 +13,11 @@ harness = false [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.13" +version = "=0.16.14" default-features = false features = [ "address", "boolean", "field", "group", "scalar" ] diff --git a/console/algorithms/Cargo.toml b/console/algorithms/Cargo.toml index 77a682d4e2..719da24088 100644 --- a/console/algorithms/Cargo.toml +++ b/console/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-algorithms" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Console algorithms for a decentralized virtual machine" license = "Apache-2.0" @@ -23,18 +23,18 @@ harness = false [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.13" +version = "=0.16.14" default-features = false features = [ "field", "group", "integers", "scalar" ] [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.13" +version = "=0.16.14" [dependencies.blake2s_simd] version = "1.0" diff --git a/console/collections/Cargo.toml b/console/collections/Cargo.toml index e5a87df90c..1df6cc61cc 100644 --- a/console/collections/Cargo.toml +++ b/console/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-collections" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Collections for a decentralized virtual machine" license = "Apache-2.0" @@ -18,11 +18,11 @@ harness = false [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.13" +version = "=0.16.14" default-features = false features = [ "field", "integers" ] diff --git a/console/network/Cargo.toml b/console/network/Cargo.toml index a0253e48ad..9f1c4a614f 100644 --- a/console/network/Cargo.toml +++ b/console/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Network console library for a decentralized virtual machine" license = "Apache-2.0" @@ -15,45 +15,45 @@ wasm = [ [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.13" +version = "=0.16.14" default-features = false features = [ "snark" ] [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-network-environment] path = "./environment" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.13" +version = "=0.16.14" default-features = false features = [ "field", "group", "scalar" ] [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.snarkvm-parameters] path = "../../parameters" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.13" +version = "=0.16.14" [dependencies.anyhow] version = "1.0.73" diff --git a/console/network/environment/Cargo.toml b/console/network/environment/Cargo.toml index 572063c484..4daa190b73 100644 --- a/console/network/environment/Cargo.toml +++ b/console/network/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network-environment" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Environment console library for a decentralized virtual machine" license = "Apache-2.0" @@ -8,17 +8,17 @@ edition = "2021" [dependencies.snarkvm-curves] path = "../../../curves" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.snarkvm-fields] path = "../../../fields" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.snarkvm-utilities] path = "../../../utilities" -version = "=0.16.13" +version = "=0.16.14" [dependencies.anyhow] version = "1.0.73" diff --git a/console/program/Cargo.toml b/console/program/Cargo.toml index 057dec5afe..38c8a0adc9 100644 --- a/console/program/Cargo.toml +++ b/console/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-program" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Program operations for a decentralized virtual machine" license = "Apache-2.0" @@ -12,27 +12,27 @@ test = [ ] [dependencies.snarkvm-console-account] path = "../account" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.13" +version = "=0.16.14" [dependencies.enum_index] version = "0.2" diff --git a/console/types/Cargo.toml b/console/types/Cargo.toml index 18e1040b69..e0eb95de7c 100644 --- a/console/types/Cargo.toml +++ b/console/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Console types for a decentralized virtual machine" license = "Apache-2.0" @@ -8,41 +8,41 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../network/environment" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types-address] path = "./address" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-console-types-boolean] path = "./boolean" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-console-types-field] path = "./field" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-console-types-group] path = "./group" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-console-types-integers] path = "./integers" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-console-types-scalar] path = "./scalar" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-console-types-string] path = "./string" -version = "=0.16.13" +version = "=0.16.14" optional = true [features] diff --git a/console/types/address/Cargo.toml b/console/types/address/Cargo.toml index 76f505ef5e..80e0e575f8 100644 --- a/console/types/address/Cargo.toml +++ b/console/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-address" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types-group] path = "../group" -version = "=0.16.13" +version = "=0.16.14" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/boolean/Cargo.toml b/console/types/boolean/Cargo.toml index 1098c82384..116443e659 100644 --- a/console/types/boolean/Cargo.toml +++ b/console/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-boolean" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,7 +8,7 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.13" +version = "=0.16.14" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/field/Cargo.toml b/console/types/field/Cargo.toml index b7bd02c0b0..514d6978dc 100644 --- a/console/types/field/Cargo.toml +++ b/console/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-field" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,11 +8,11 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.13" +version = "=0.16.14" [dependencies.zeroize] version = "1" diff --git a/console/types/group/Cargo.toml b/console/types/group/Cargo.toml index 6b45197779..55d57423d0 100644 --- a/console/types/group/Cargo.toml +++ b/console/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-group" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.13" +version = "=0.16.14" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/integers/Cargo.toml b/console/types/integers/Cargo.toml index 0b5059404d..f6c13e36e1 100644 --- a/console/types/integers/Cargo.toml +++ b/console/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-integers" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.13" +version = "=0.16.14" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/scalar/Cargo.toml b/console/types/scalar/Cargo.toml index c963cd756c..2ae14d7ba5 100644 --- a/console/types/scalar/Cargo.toml +++ b/console/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-scalar" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,15 +8,15 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.13" +version = "=0.16.14" [dependencies.zeroize] version = "1" diff --git a/console/types/string/Cargo.toml b/console/types/string/Cargo.toml index 767525bf8c..c8c717c4b2 100644 --- a/console/types/string/Cargo.toml +++ b/console/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-string" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-console-types-integers] path = "../integers" -version = "=0.16.13" +version = "=0.16.14" [dev-dependencies.bincode] version = "1.3" diff --git a/curves/Cargo.toml b/curves/Cargo.toml index b8c1d952b2..780ad40d62 100644 --- a/curves/Cargo.toml +++ b/curves/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-curves" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Curves for a decentralized virtual machine" homepage = "https://aleo.org" @@ -36,12 +36,12 @@ harness = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.rand] diff --git a/fields/Cargo.toml b/fields/Cargo.toml index 9a481ef100..115d8be537 100644 --- a/fields/Cargo.toml +++ b/fields/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-fields" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Fields for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.aleo-std] diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index 3a154a53cf..61e93075bf 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "A node ledger for a decentralized virtual machine" homepage = "https://aleo.org" @@ -57,54 +57,54 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "./authority" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "./block" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "./coinbase" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "./committee" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-narwhal] package = "snarkvm-ledger-narwhal" path = "./narwhal" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "./query" -version = "=0.16.13" +version = "=0.16.14" features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "./store" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-test-helpers] package = "snarkvm-ledger-test-helpers" path = "./test-helpers" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.synthesizer] package = "snarkvm-synthesizer" path = "../synthesizer" -version = "=0.16.13" +version = "=0.16.14" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/authority/Cargo.toml b/ledger/authority/Cargo.toml index 49131f9e56..91d9a849c9 100644 --- a/ledger/authority/Cargo.toml +++ b/ledger/authority/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-authority" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Data structures for a block authority in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-subdag/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.13" +version = "=0.16.14" [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.13" +version = "=0.16.14" [dependencies.anyhow] version = "1" diff --git a/ledger/block/Cargo.toml b/ledger/block/Cargo.toml index 722a1a5d53..31891b142a 100644 --- a/ledger/block/Cargo.toml +++ b/ledger/block/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-block" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "A block for a decentralized virtual machine" homepage = "https://aleo.org" @@ -39,42 +39,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../ledger/coinbase" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../../ledger/committee" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../narwhal/transmission-id" -version = "=0.16.13" +version = "=0.16.14" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.13" +version = "=0.16.14" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.13" +version = "=0.16.14" [dependencies.indexmap] version = "2.0" diff --git a/ledger/coinbase/Cargo.toml b/ledger/coinbase/Cargo.toml index 1f789c6a19..8e61ee220a 100644 --- a/ledger/coinbase/Cargo.toml +++ b/ledger/coinbase/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-coinbase" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Coinbase puzzle for a decentralized virtual machine" homepage = "https://aleo.org" @@ -50,27 +50,27 @@ wasm = [ [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-synthesizer-snark] path = "../../synthesizer/snark" -version = "=0.16.13" +version = "=0.16.14" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.aleo-std] diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index 243cee75ed..58bb602dc4 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-committee" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "A committee for a decentralized virtual machine" homepage = "https://aleo.org" @@ -34,7 +34,7 @@ test-helpers = [ "prop-tests", "rand_distr" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.13" +version = "=0.16.14" [dependencies.indexmap] version = "2.0" @@ -43,7 +43,7 @@ features = [ "serde", "rayon" ] [dependencies.metrics] package = "snarkvm-metrics" path = "../../metrics" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.serde_json] diff --git a/ledger/narwhal/Cargo.toml b/ledger/narwhal/Cargo.toml index b1ad2d3d38..e744f954f1 100644 --- a/ledger/narwhal/Cargo.toml +++ b/ledger/narwhal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Data structures for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -64,37 +64,37 @@ transmission-id = [ "narwhal-transmission-id" ] [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "./batch-certificate" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "./batch-header" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "./data" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "./subdag" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.narwhal-transmission] package = "snarkvm-ledger-narwhal-transmission" path = "./transmission" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "./transmission-id" -version = "=0.16.13" +version = "=0.16.14" optional = true [dev-dependencies.snarkvm-ledger-narwhal] diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index 661079aaaa..1f169f5d61 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-header/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.13" +version = "=0.16.14" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.13" +version = "=0.16.14" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.13" +version = "=0.16.14" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/batch-header/Cargo.toml b/ledger/narwhal/batch-header/Cargo.toml index b1abd2e80e..ff63e5c52b 100644 --- a/ledger/narwhal/batch-header/Cargo.toml +++ b/ledger/narwhal/batch-header/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "A batch header for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-transmission-id/test-helpers", "time" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.13" +version = "=0.16.14" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.13" +version = "=0.16.14" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/data/Cargo.toml b/ledger/narwhal/data/Cargo.toml index 1402d421de..b48d028ec6 100644 --- a/ledger/narwhal/data/Cargo.toml +++ b/ledger/narwhal/data/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-data" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -29,7 +29,7 @@ async = [ "tokio" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.13" +version = "=0.16.14" [dependencies.bytes] version = "1" diff --git a/ledger/narwhal/subdag/Cargo.toml b/ledger/narwhal/subdag/Cargo.toml index a1a3f99527..12858922e2 100644 --- a/ledger/narwhal/subdag/Cargo.toml +++ b/ledger/narwhal/subdag/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "A subdag for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ "narwhal-batch-certificate/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.13" +version = "=0.16.14" [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../batch-certificate" -version = "=0.16.13" +version = "=0.16.14" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.13" +version = "=0.16.14" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.13" +version = "=0.16.14" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/transmission-id/Cargo.toml b/ledger/narwhal/transmission-id/Cargo.toml index 962ec0e628..e81a3e58c7 100644 --- a/ledger/narwhal/transmission-id/Cargo.toml +++ b/ledger/narwhal/transmission-id/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "A transmission ID for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.13" +version = "=0.16.14" [dev-dependencies.bincode] version = "1.3" diff --git a/ledger/narwhal/transmission/Cargo.toml b/ledger/narwhal/transmission/Cargo.toml index bce6f13f60..283073441d 100644 --- a/ledger/narwhal/transmission/Cargo.toml +++ b/ledger/narwhal/transmission/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "A transmission for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../block" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "../data" -version = "=0.16.13" +version = "=0.16.14" [dependencies.bytes] version = "1" diff --git a/ledger/query/Cargo.toml b/ledger/query/Cargo.toml index d8d76cda21..8b574424e2 100644 --- a/ledger/query/Cargo.toml +++ b/ledger/query/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-query" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "A query for a decentralized virtual machine" homepage = "https://aleo.org" @@ -34,18 +34,18 @@ query = [ "ledger-store", "synthesizer-program", "ureq" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.async-trait] diff --git a/ledger/store/Cargo.toml b/ledger/store/Cargo.toml index df73d052b3..c20984da88 100644 --- a/ledger/store/Cargo.toml +++ b/ledger/store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-store" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "A data store for a decentralized virtual machine" homepage = "https://aleo.org" @@ -42,42 +42,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../coinbase" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../committee" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../narwhal/batch-certificate" -version = "=0.16.13" +version = "=0.16.14" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.13" +version = "=0.16.14" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.13" +version = "=0.16.14" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/test-helpers/Cargo.toml b/ledger/test-helpers/Cargo.toml index f1dbdb9bff..35dd04422d 100644 --- a/ledger/test-helpers/Cargo.toml +++ b/ledger/test-helpers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-test-helpers" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Test helpers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -19,39 +19,39 @@ edition = "2021" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.13" +version = "=0.16.14" [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../query" -version = "=0.16.13" +version = "=0.16.14" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.13" +version = "=0.16.14" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.13" +version = "=0.16.14" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "../../synthesizer/process" -version = "=0.16.13" +version = "=0.16.14" [dependencies.once_cell] version = "1.18" diff --git a/metrics/Cargo.toml b/metrics/Cargo.toml index 7c91eca11f..5457815361 100644 --- a/metrics/Cargo.toml +++ b/metrics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-metrics" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Metrics for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/parameters/Cargo.toml b/parameters/Cargo.toml index d769a77c4c..9a33cf69f9 100644 --- a/parameters/Cargo.toml +++ b/parameters/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-parameters" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Parameters for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "encoding", "js-sys", "web-sys" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.13" +version = "=0.16.14" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/Cargo.toml b/synthesizer/Cargo.toml index dca82ddb22..33666c5f87 100644 --- a/synthesizer/Cargo.toml +++ b/synthesizer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Synthesizer for a decentralized virtual machine" homepage = "https://aleo.org" @@ -69,61 +69,61 @@ harness = false [dependencies.algorithms] package = "snarkvm-algorithms" path = "../algorithms" -version = "=0.16.13" +version = "=0.16.14" [dependencies.circuit] package = "snarkvm-circuit" path = "../circuit" -version = "=0.16.13" +version = "=0.16.14" [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../ledger/block" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../ledger/coinbase" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../ledger/committee" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../ledger/query" -version = "=0.16.13" +version = "=0.16.14" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../ledger/store" -version = "=0.16.13" +version = "=0.16.14" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "./process" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "./program" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "./snark" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.aleo-std] diff --git a/synthesizer/process/Cargo.toml b/synthesizer/process/Cargo.toml index be11d60eff..bb861a5c5a 100644 --- a/synthesizer/process/Cargo.toml +++ b/synthesizer/process/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-process" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "A process for a decentralized virtual machine" homepage = "https://aleo.org" @@ -48,45 +48,45 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.13" +version = "=0.16.14" default-features = false features = [ "network", "program", "types" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../ledger/block" -version = "=0.16.13" +version = "=0.16.14" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../../ledger/query" -version = "=0.16.13" +version = "=0.16.14" default-features = false [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../../ledger/store" -version = "=0.16.13" +version = "=0.16.14" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.13" +version = "=0.16.14" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.13" +version = "=0.16.14" [dependencies.utilities] package = "snarkvm-utilities" path = "../../utilities" -version = "=0.16.13" +version = "=0.16.14" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/program/Cargo.toml b/synthesizer/program/Cargo.toml index f9b5e87248..26603b350f 100644 --- a/synthesizer/program/Cargo.toml +++ b/synthesizer/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-program" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Program for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "console/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.13" +version = "=0.16.14" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.13" +version = "=0.16.14" default-features = false features = [ "account", "network", "program", "types" ] diff --git a/synthesizer/snark/Cargo.toml b/synthesizer/snark/Cargo.toml index 293af43d6c..47cc71279a 100644 --- a/synthesizer/snark/Cargo.toml +++ b/synthesizer/snark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-snark" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "SNARK wrappers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,18 +33,18 @@ wasm = [ "console/wasm", "snarkvm-algorithms/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.13" +version = "=0.16.14" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.13" +version = "=0.16.14" default-features = false features = [ "network" ] [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.13" +version = "=0.16.14" [dependencies.bincode] version = "1" diff --git a/utilities/Cargo.toml b/utilities/Cargo.toml index 4f8af15dc9..0bc62085c2 100644 --- a/utilities/Cargo.toml +++ b/utilities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Utilities for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities-derives] path = "./derives" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.aleo-std] diff --git a/utilities/derives/Cargo.toml b/utilities/derives/Cargo.toml index b7ac9ce0e4..0dca4da596 100644 --- a/utilities/derives/Cargo.toml +++ b/utilities/derives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities-derives" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "Canonical serialization for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index a1ca2bcb59..5383ffefc0 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-wasm" -version = "0.16.13" +version = "0.16.14" authors = [ "The Aleo Team " ] description = "WASM for a decentralized virtual machine" homepage = "https://aleo.org" @@ -51,54 +51,54 @@ utilities = [ "snarkvm-utilities" ] [dependencies.snarkvm-circuit-network] path = "../circuit/network" -version = "=0.16.13" +version = "=0.16.14" features = [ "wasm" ] optional = true [dependencies.snarkvm-console] path = "../console" -version = "=0.16.13" +version = "=0.16.14" features = [ "wasm" ] optional = true [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.13" +version = "=0.16.14" optional = true [dependencies.snarkvm-ledger-block] path = "../ledger/block" -version = "=0.16.13" +version = "=0.16.14" features = [ "wasm" ] optional = true [dependencies.snarkvm-ledger-query] path = "../ledger/query" -version = "=0.16.13" +version = "=0.16.14" features = [ "async", "wasm" ] optional = true [dependencies.snarkvm-ledger-store] path = "../ledger/store" -version = "=0.16.13" +version = "=0.16.14" features = [ "wasm" ] optional = true [dependencies.snarkvm-synthesizer] path = "../synthesizer" -version = "=0.16.13" +version = "=0.16.14" default-features = false features = [ "async", "wasm" ] optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.13" +version = "=0.16.14" features = [ "wasm" ] optional = true From 6013d5f7ae954eb37d87dec77cb7e3c0760eb8d5 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 19 Dec 2023 16:26:31 -0800 Subject: [PATCH 333/339] Add error logging on the finalize error --- synthesizer/src/vm/mod.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index ece50117d7..2c2bb80abe 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -327,11 +327,16 @@ impl> VM { // Next, finalize the transactions. match self.finalize(state, block.ratifications(), block.solutions(), block.transactions()) { Ok(_ratified_finalize_operations) => Ok(()), - Err(error) => { + Err(finalize_error) => { // Rollback the block. - self.block_store().remove_last_n(1)?; - // Return the error. - Err(error) + self.block_store().remove_last_n(1).map_err(|removal_error| { + // Log the finalize error. + error!("Failed to finalize block {} - {finalize_error}", block.height()); + // Return the removal error. + removal_error + })?; + // Return the finalize error. + Err(finalize_error) } } } From eda0ab8c55549f7f625517ff1be6013f0c991591 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 19 Dec 2023 16:48:35 -0800 Subject: [PATCH 334/339] Adds a block lock for advancing --- synthesizer/src/vm/mod.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index 2c2bb80abe..00e16a05b0 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -60,7 +60,7 @@ use synthesizer_program::{FinalizeGlobalState, FinalizeOperation, FinalizeStoreT use aleo_std::prelude::{finish, lap, timer}; use indexmap::{IndexMap, IndexSet}; -use parking_lot::RwLock; +use parking_lot::{Mutex, RwLock}; use std::sync::Arc; #[cfg(not(feature = "serial"))] @@ -72,6 +72,8 @@ pub struct VM> { process: Arc>>, /// The VM store. store: ConsensusStore, + /// The lock for advancing blocks. + block_lock: Arc>, } impl> VM { @@ -169,7 +171,7 @@ impl> VM { } // Return the new VM. - Ok(Self { process: Arc::new(RwLock::new(process)), store }) + Ok(Self { process: Arc::new(RwLock::new(process)), store, block_lock: Arc::new(Mutex::new(())) }) } /// Returns `true` if a program with the given program ID exists. @@ -310,6 +312,10 @@ impl> VM { /// Adds the given block into the VM. #[inline] pub fn add_next_block(&self, block: &Block) -> Result<()> { + // Acquire the block lock, which is needed to ensure this function is not called concurrently. + // Note: This lock must be held for the entire scope of this function. + let _block_lock = self.block_lock.lock(); + // Construct the finalize state. let state = FinalizeGlobalState::new::( block.round(), From 7cfadd9186534906eb3657b6f40f902917e59cd1 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 19 Dec 2023 17:04:45 -0800 Subject: [PATCH 335/339] Introduce an atomic lock over speculate and finalize --- synthesizer/src/vm/finalize.rs | 10 ++++++++++ synthesizer/src/vm/mod.rs | 10 +++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/synthesizer/src/vm/finalize.rs b/synthesizer/src/vm/finalize.rs index 2972d78ad1..8c9422d153 100644 --- a/synthesizer/src/vm/finalize.rs +++ b/synthesizer/src/vm/finalize.rs @@ -159,6 +159,11 @@ impl> VM { Vec<(Transaction, String)>, Vec>, )> { + // Acquire the atomic lock, which is needed to ensure this function is not called concurrently + // with other `atomic_finalize!` macro calls, which will cause a `bail!` to be triggered erroneously. + // Note: This lock must be held for the entire scope of the call to `atomic_finalize!`. + let _atomic_lock = self.atomic_lock.lock(); + let timer = timer!("VM::atomic_speculate"); // Retrieve the number of transactions. @@ -448,6 +453,11 @@ impl> VM { solutions: Option<&CoinbaseSolution>, transactions: &Transactions, ) -> Result>> { + // Acquire the atomic lock, which is needed to ensure this function is not called concurrently + // with other `atomic_finalize!` macro calls, which will cause a `bail!` to be triggered erroneously. + // Note: This lock must be held for the entire scope of the call to `atomic_finalize!`. + let _atomic_lock = self.atomic_lock.lock(); + let timer = timer!("VM::atomic_finalize"); // Perform the finalize operation on the preset finalize mode. diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index 00e16a05b0..709b1e08e1 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -72,8 +72,8 @@ pub struct VM> { process: Arc>>, /// The VM store. store: ConsensusStore, - /// The lock for advancing blocks. - block_lock: Arc>, + /// The lock to guarantee atomicity over calls to speculate and finalize. + atomic_lock: Arc>, } impl> VM { @@ -171,7 +171,7 @@ impl> VM { } // Return the new VM. - Ok(Self { process: Arc::new(RwLock::new(process)), store, block_lock: Arc::new(Mutex::new(())) }) + Ok(Self { process: Arc::new(RwLock::new(process)), store, atomic_lock: Arc::new(Mutex::new(())) }) } /// Returns `true` if a program with the given program ID exists. @@ -312,10 +312,6 @@ impl> VM { /// Adds the given block into the VM. #[inline] pub fn add_next_block(&self, block: &Block) -> Result<()> { - // Acquire the block lock, which is needed to ensure this function is not called concurrently. - // Note: This lock must be held for the entire scope of this function. - let _block_lock = self.block_lock.lock(); - // Construct the finalize state. let state = FinalizeGlobalState::new::( block.round(), From 6e05e7173eb07f16e952a806132dd948265b84dc Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 19 Dec 2023 17:16:29 -0800 Subject: [PATCH 336/339] Adds block lock back in --- synthesizer/src/vm/mod.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/synthesizer/src/vm/mod.rs b/synthesizer/src/vm/mod.rs index 709b1e08e1..a9e29d1594 100644 --- a/synthesizer/src/vm/mod.rs +++ b/synthesizer/src/vm/mod.rs @@ -74,6 +74,8 @@ pub struct VM> { store: ConsensusStore, /// The lock to guarantee atomicity over calls to speculate and finalize. atomic_lock: Arc>, + /// The lock for ensuring there is no concurrency when advancing blocks. + block_lock: Arc>, } impl> VM { @@ -171,7 +173,12 @@ impl> VM { } // Return the new VM. - Ok(Self { process: Arc::new(RwLock::new(process)), store, atomic_lock: Arc::new(Mutex::new(())) }) + Ok(Self { + process: Arc::new(RwLock::new(process)), + store, + atomic_lock: Arc::new(Mutex::new(())), + block_lock: Arc::new(Mutex::new(())), + }) } /// Returns `true` if a program with the given program ID exists. @@ -312,6 +319,10 @@ impl> VM { /// Adds the given block into the VM. #[inline] pub fn add_next_block(&self, block: &Block) -> Result<()> { + // Acquire the block lock, which is needed to ensure this function is not called concurrently. + // Note: This lock must be held for the entire scope of this function. + let _block_lock = self.block_lock.lock(); + // Construct the finalize state. let state = FinalizeGlobalState::new::( block.round(), From 499ea095775227a91cdc7c30ab01518164a73874 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 19 Dec 2023 17:49:24 -0800 Subject: [PATCH 337/339] chore(snarkvm): bump version for new release --- .cargo/release-version | 2 +- Cargo.lock | 120 ++++++++++---------- Cargo.toml | 24 ++-- algorithms/Cargo.toml | 12 +- algorithms/cuda/Cargo.toml | 2 +- circuit/Cargo.toml | 16 +-- circuit/account/Cargo.toml | 10 +- circuit/algorithms/Cargo.toml | 8 +- circuit/collections/Cargo.toml | 8 +- circuit/environment/Cargo.toml | 14 +-- circuit/environment/witness/Cargo.toml | 2 +- circuit/network/Cargo.toml | 10 +- circuit/program/Cargo.toml | 16 +-- circuit/types/Cargo.toml | 18 +-- circuit/types/address/Cargo.toml | 14 +-- circuit/types/boolean/Cargo.toml | 6 +- circuit/types/field/Cargo.toml | 8 +- circuit/types/group/Cargo.toml | 12 +- circuit/types/integers/Cargo.toml | 12 +- circuit/types/scalar/Cargo.toml | 10 +- circuit/types/string/Cargo.toml | 12 +- console/Cargo.toml | 14 +-- console/account/Cargo.toml | 6 +- console/algorithms/Cargo.toml | 8 +- console/collections/Cargo.toml | 6 +- console/network/Cargo.toml | 20 ++-- console/network/environment/Cargo.toml | 8 +- console/program/Cargo.toml | 14 +-- console/types/Cargo.toml | 18 +-- console/types/address/Cargo.toml | 10 +- console/types/boolean/Cargo.toml | 4 +- console/types/field/Cargo.toml | 6 +- console/types/group/Cargo.toml | 10 +- console/types/integers/Cargo.toml | 10 +- console/types/scalar/Cargo.toml | 8 +- console/types/string/Cargo.toml | 10 +- curves/Cargo.toml | 6 +- fields/Cargo.toml | 4 +- ledger/Cargo.toml | 22 ++-- ledger/authority/Cargo.toml | 6 +- ledger/block/Cargo.toml | 18 +-- ledger/coinbase/Cargo.toml | 14 +-- ledger/committee/Cargo.toml | 6 +- ledger/narwhal/Cargo.toml | 14 +-- ledger/narwhal/batch-certificate/Cargo.toml | 8 +- ledger/narwhal/batch-header/Cargo.toml | 6 +- ledger/narwhal/data/Cargo.toml | 4 +- ledger/narwhal/subdag/Cargo.toml | 10 +- ledger/narwhal/transmission-id/Cargo.toml | 6 +- ledger/narwhal/transmission/Cargo.toml | 10 +- ledger/query/Cargo.toml | 8 +- ledger/store/Cargo.toml | 18 +-- ledger/test-helpers/Cargo.toml | 16 +-- metrics/Cargo.toml | 2 +- parameters/Cargo.toml | 6 +- synthesizer/Cargo.toml | 24 ++-- synthesizer/process/Cargo.toml | 18 +-- synthesizer/program/Cargo.toml | 6 +- synthesizer/snark/Cargo.toml | 8 +- utilities/Cargo.toml | 4 +- utilities/derives/Cargo.toml | 2 +- wasm/Cargo.toml | 20 ++-- 62 files changed, 377 insertions(+), 377 deletions(-) diff --git a/.cargo/release-version b/.cargo/release-version index 642deb0fe4..ef9b3919c6 100644 --- a/.cargo/release-version +++ b/.cargo/release-version @@ -1 +1 @@ -v0.16.14 \ No newline at end of file +v0.16.15 \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 47ce3fb1d6..d5dfef8577 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2577,7 +2577,7 @@ dependencies = [ [[package]] name = "snarkvm" -version = "0.16.14" +version = "0.16.15" dependencies = [ "anstyle", "anyhow", @@ -2613,7 +2613,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms" -version = "0.16.14" +version = "0.16.15" dependencies = [ "aleo-std", "anyhow", @@ -2652,7 +2652,7 @@ dependencies = [ [[package]] name = "snarkvm-algorithms-cuda" -version = "0.16.14" +version = "0.16.15" dependencies = [ "blst", "cc", @@ -2662,7 +2662,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit" -version = "0.16.14" +version = "0.16.15" dependencies = [ "snarkvm-circuit-account", "snarkvm-circuit-algorithms", @@ -2675,7 +2675,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-account" -version = "0.16.14" +version = "0.16.15" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2687,7 +2687,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-algorithms" -version = "0.16.14" +version = "0.16.15" dependencies = [ "anyhow", "snarkvm-circuit-types", @@ -2699,7 +2699,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-collections" -version = "0.16.14" +version = "0.16.15" dependencies = [ "anyhow", "snarkvm-circuit-algorithms", @@ -2713,7 +2713,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment" -version = "0.16.14" +version = "0.16.15" dependencies = [ "criterion", "indexmap 2.0.2", @@ -2734,11 +2734,11 @@ dependencies = [ [[package]] name = "snarkvm-circuit-environment-witness" -version = "0.16.14" +version = "0.16.15" [[package]] name = "snarkvm-circuit-network" -version = "0.16.14" +version = "0.16.15" dependencies = [ "snarkvm-circuit-algorithms", "snarkvm-circuit-collections", @@ -2749,7 +2749,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-program" -version = "0.16.14" +version = "0.16.15" dependencies = [ "anyhow", "paste", @@ -2767,7 +2767,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types" -version = "0.16.14" +version = "0.16.15" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-address", @@ -2782,7 +2782,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-address" -version = "0.16.14" +version = "0.16.15" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2794,7 +2794,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-boolean" -version = "0.16.14" +version = "0.16.15" dependencies = [ "criterion", "snarkvm-circuit-environment", @@ -2803,7 +2803,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-field" -version = "0.16.14" +version = "0.16.15" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2812,7 +2812,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-group" -version = "0.16.14" +version = "0.16.15" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2824,7 +2824,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-integers" -version = "0.16.14" +version = "0.16.15" dependencies = [ "paste", "snarkvm-circuit-environment", @@ -2837,7 +2837,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-scalar" -version = "0.16.14" +version = "0.16.15" dependencies = [ "snarkvm-circuit-environment", "snarkvm-circuit-types-boolean", @@ -2847,7 +2847,7 @@ dependencies = [ [[package]] name = "snarkvm-circuit-types-string" -version = "0.16.14" +version = "0.16.15" dependencies = [ "rand", "snarkvm-circuit-environment", @@ -2860,7 +2860,7 @@ dependencies = [ [[package]] name = "snarkvm-console" -version = "0.16.14" +version = "0.16.15" dependencies = [ "snarkvm-console-account", "snarkvm-console-algorithms", @@ -2872,7 +2872,7 @@ dependencies = [ [[package]] name = "snarkvm-console-account" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "bs58", @@ -2885,7 +2885,7 @@ dependencies = [ [[package]] name = "snarkvm-console-algorithms" -version = "0.16.14" +version = "0.16.15" dependencies = [ "blake2s_simd", "criterion", @@ -2903,7 +2903,7 @@ dependencies = [ [[package]] name = "snarkvm-console-collections" -version = "0.16.14" +version = "0.16.15" dependencies = [ "aleo-std", "criterion", @@ -2916,7 +2916,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network" -version = "0.16.14" +version = "0.16.15" dependencies = [ "anyhow", "indexmap 2.0.2", @@ -2938,7 +2938,7 @@ dependencies = [ [[package]] name = "snarkvm-console-network-environment" -version = "0.16.14" +version = "0.16.15" dependencies = [ "anyhow", "bech32", @@ -2955,7 +2955,7 @@ dependencies = [ [[package]] name = "snarkvm-console-program" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "enum_index", @@ -2976,7 +2976,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types" -version = "0.16.14" +version = "0.16.15" dependencies = [ "snarkvm-console-network-environment", "snarkvm-console-types-address", @@ -2990,7 +2990,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-address" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "serde_json", @@ -3002,7 +3002,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-boolean" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "serde_json", @@ -3011,7 +3011,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-field" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "serde_json", @@ -3022,7 +3022,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-group" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "serde_json", @@ -3034,7 +3034,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-integers" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "serde_json", @@ -3046,7 +3046,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-scalar" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "serde_json", @@ -3058,7 +3058,7 @@ dependencies = [ [[package]] name = "snarkvm-console-types-string" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "serde_json", @@ -3070,7 +3070,7 @@ dependencies = [ [[package]] name = "snarkvm-curves" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "criterion", @@ -3085,7 +3085,7 @@ dependencies = [ [[package]] name = "snarkvm-fields" -version = "0.16.14" +version = "0.16.15" dependencies = [ "aleo-std", "anyhow", @@ -3102,7 +3102,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger" -version = "0.16.14" +version = "0.16.15" dependencies = [ "aleo-std", "anyhow", @@ -3129,7 +3129,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-authority" -version = "0.16.14" +version = "0.16.15" dependencies = [ "anyhow", "bincode", @@ -3142,7 +3142,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-block" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3166,7 +3166,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-coinbase" -version = "0.16.14" +version = "0.16.15" dependencies = [ "aleo-std", "anyhow", @@ -3187,7 +3187,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-committee" -version = "0.16.14" +version = "0.16.15" dependencies = [ "anyhow", "bincode", @@ -3208,7 +3208,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal" -version = "0.16.14" +version = "0.16.15" dependencies = [ "snarkvm-ledger-narwhal", "snarkvm-ledger-narwhal-batch-certificate", @@ -3221,7 +3221,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3235,7 +3235,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3248,7 +3248,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-data" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bytes", "serde_json", @@ -3258,7 +3258,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "indexmap 2.0.2", @@ -3273,7 +3273,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "bytes", @@ -3286,7 +3286,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "serde_json", @@ -3296,7 +3296,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-query" -version = "0.16.14" +version = "0.16.15" dependencies = [ "async-trait", "reqwest", @@ -3308,7 +3308,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-store" -version = "0.16.14" +version = "0.16.15" dependencies = [ "aleo-std", "anyhow", @@ -3336,7 +3336,7 @@ dependencies = [ [[package]] name = "snarkvm-ledger-test-helpers" -version = "0.16.14" +version = "0.16.15" dependencies = [ "once_cell", "snarkvm-circuit", @@ -3350,7 +3350,7 @@ dependencies = [ [[package]] name = "snarkvm-metrics" -version = "0.16.14" +version = "0.16.15" dependencies = [ "metrics", "metrics-exporter-prometheus", @@ -3358,7 +3358,7 @@ dependencies = [ [[package]] name = "snarkvm-parameters" -version = "0.16.14" +version = "0.16.15" dependencies = [ "aleo-std", "anyhow", @@ -3391,7 +3391,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer" -version = "0.16.14" +version = "0.16.15" dependencies = [ "aleo-std", "anyhow", @@ -3422,7 +3422,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-process" -version = "0.16.14" +version = "0.16.15" dependencies = [ "aleo-std", "bincode", @@ -3448,7 +3448,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-program" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "criterion", @@ -3464,7 +3464,7 @@ dependencies = [ [[package]] name = "snarkvm-synthesizer-snark" -version = "0.16.14" +version = "0.16.15" dependencies = [ "bincode", "colored", @@ -3477,7 +3477,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities" -version = "0.16.14" +version = "0.16.15" dependencies = [ "aleo-std", "anyhow", @@ -3497,7 +3497,7 @@ dependencies = [ [[package]] name = "snarkvm-utilities-derives" -version = "0.16.14" +version = "0.16.15" dependencies = [ "proc-macro2", "quote 1.0.33", @@ -3506,7 +3506,7 @@ dependencies = [ [[package]] name = "snarkvm-wasm" -version = "0.16.14" +version = "0.16.15" dependencies = [ "getrandom", "snarkvm-circuit-network", diff --git a/Cargo.toml b/Cargo.toml index 7fcdc7ec3f..2932649638 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "A decentralized virtual machine" homepage = "https://aleo.org" @@ -150,58 +150,58 @@ wasm = [ "snarkvm-wasm" ] [dependencies.snarkvm-algorithms] path = "./algorithms" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-circuit] path = "./circuit" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-console] path = "./console" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-curves] path = "./curves" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-fields] path = "./fields" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-ledger] path = "./ledger" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-metrics] path = "./metrics" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-parameters] path = "./parameters" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-synthesizer] path = "./synthesizer" -version = "=0.16.14" +version = "=0.16.15" default-features = false optional = true [dependencies.snarkvm-utilities] path = "./utilities" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-wasm] path = "./wasm" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.anstyle] diff --git a/algorithms/Cargo.toml b/algorithms/Cargo.toml index 5e125691a5..af5a76e19b 100644 --- a/algorithms/Cargo.toml +++ b/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Algorithms for a decentralized virtual machine" homepage = "https://aleo.org" @@ -47,27 +47,27 @@ required-features = [ "test" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.snarkvm-parameters] path = "../parameters" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.snarkvm-algorithms-cuda] path = "./cuda" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.aleo-std] diff --git a/algorithms/cuda/Cargo.toml b/algorithms/cuda/Cargo.toml index aae2cbdb94..f57066d0f1 100644 --- a/algorithms/cuda/Cargo.toml +++ b/algorithms/cuda/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-algorithms-cuda" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Cuda optimizations for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/circuit/Cargo.toml b/circuit/Cargo.toml index 128d7ee3ee..801a7d7160 100644 --- a/circuit/Cargo.toml +++ b/circuit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Circuits for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,28 +25,28 @@ edition = "2021" [dependencies.snarkvm-circuit-account] path = "./account" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-algorithms] path = "./algorithms" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-collections] path = "./collections" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-environment] path = "./environment" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-network] path = "./network" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-program] path = "./program" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types] path = "./types" -version = "=0.16.14" +version = "=0.16.15" diff --git a/circuit/account/Cargo.toml b/circuit/account/Cargo.toml index ed39f89e4f..99ab62b6c4 100644 --- a/circuit/account/Cargo.toml +++ b/circuit/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-account" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Account circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-account" path = "../../console/account" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.14" +version = "=0.16.15" [dev-dependencies.snarkvm-utilities] path = "../../utilities" diff --git a/circuit/algorithms/Cargo.toml b/circuit/algorithms/Cargo.toml index a481a8b16d..918caade59 100644 --- a/circuit/algorithms/Cargo.toml +++ b/circuit/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-algorithms" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Algorithm circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-algorithms" path = "../../console/algorithms" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dev-dependencies.anyhow] diff --git a/circuit/collections/Cargo.toml b/circuit/collections/Cargo.toml index 6a674b9452..7a24023f22 100644 --- a/circuit/collections/Cargo.toml +++ b/circuit/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-collections" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Collections circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-collections" path = "../../console/collections" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.14" +version = "=0.16.15" [dev-dependencies.snarkvm-circuit-network] path = "../network" diff --git a/circuit/environment/Cargo.toml b/circuit/environment/Cargo.toml index 19c5869059..eda3378021 100644 --- a/circuit/environment/Cargo.toml +++ b/circuit/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Circuit environment for a decentralized virtual machine" license = "Apache-2.0" @@ -14,32 +14,32 @@ harness = false [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.14" +version = "=0.16.15" default-features = false features = [ "r1cs" ] [dependencies.snarkvm-circuit-environment-witness] path = "./witness" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.indexmap] diff --git a/circuit/environment/witness/Cargo.toml b/circuit/environment/witness/Cargo.toml index ede16a9166..64c87aca08 100644 --- a/circuit/environment/witness/Cargo.toml +++ b/circuit/environment/witness/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-environment-witness" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "A procedural macro to construct a witness in an environment" license = "Apache-2.0" diff --git a/circuit/network/Cargo.toml b/circuit/network/Cargo.toml index 837bd67edf..6d9e086b43 100644 --- a/circuit/network/Cargo.toml +++ b/circuit/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-network" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Network circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-network" path = "../../console/network" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.14" +version = "=0.16.15" [dev-dependencies.snarkvm-console-types] path = "../../console/types" diff --git a/circuit/program/Cargo.toml b/circuit/program/Cargo.toml index 0c41d52585..7b0e18ce2c 100644 --- a/circuit/program/Cargo.toml +++ b/circuit/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-program" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Program circuit library for a decentralized virtual machine" license = "Apache-2.0" @@ -9,32 +9,32 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-program" path = "../../console/program" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-circuit-account] path = "../account" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-algorithms] path = "../algorithms" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-collections] path = "../collections" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-network] path = "../network" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types] path = "../types" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.14" +version = "=0.16.15" [dependencies.paste] version = "1.0" diff --git a/circuit/types/Cargo.toml b/circuit/types/Cargo.toml index ffde9546dc..8650ccc513 100644 --- a/circuit/types/Cargo.toml +++ b/circuit/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Primitive circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -8,35 +8,35 @@ edition = "2021" [dependencies.snarkvm-circuit-environment] path = "../environment" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-address] path = "./address" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-boolean] path = "./boolean" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-field] path = "./field" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-group] path = "./group" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-integers] path = "./integers" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-scalar] path = "./scalar" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-string] path = "./string" -version = "=0.16.14" +version = "=0.16.15" [dev-dependencies.console] package = "snarkvm-console" diff --git a/circuit/types/address/Cargo.toml b/circuit/types/address/Cargo.toml index 75fc13bcc8..50e4b7c70b 100644 --- a/circuit/types/address/Cargo.toml +++ b/circuit/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-address" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Address circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,28 +9,28 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-address" path = "../../../console/types/address" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-group] path = "../group" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.14" +version = "=0.16.15" [features] default = [ "enable_console" ] diff --git a/circuit/types/boolean/Cargo.toml b/circuit/types/boolean/Cargo.toml index 1f350c43b6..d357cf45b0 100644 --- a/circuit/types/boolean/Cargo.toml +++ b/circuit/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-boolean" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Boolean circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -14,12 +14,12 @@ harness = false [dependencies.console] package = "snarkvm-console-types-boolean" path = "../../../console/types/boolean" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.14" +version = "=0.16.15" [dev-dependencies.criterion] version = "0.5" diff --git a/circuit/types/field/Cargo.toml b/circuit/types/field/Cargo.toml index 5a49dffe11..9f26acc523 100644 --- a/circuit/types/field/Cargo.toml +++ b/circuit/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-field" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Field circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,16 +9,16 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-field" path = "../../../console/types/field" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.14" +version = "=0.16.15" [features] default = [ "enable_console" ] diff --git a/circuit/types/group/Cargo.toml b/circuit/types/group/Cargo.toml index c02efa0d99..7138c5c1b9 100644 --- a/circuit/types/group/Cargo.toml +++ b/circuit/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-group" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Group circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-group" path = "../../../console/types/group" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.14" +version = "=0.16.15" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/integers/Cargo.toml b/circuit/types/integers/Cargo.toml index 4fb4a50f27..de9557a845 100644 --- a/circuit/types/integers/Cargo.toml +++ b/circuit/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-integers" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Integer circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-integers" path = "../../../console/types/integers" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-scalar] path = "../scalar" -version = "=0.16.14" +version = "=0.16.15" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/circuit/types/scalar/Cargo.toml b/circuit/types/scalar/Cargo.toml index f7d25294a1..a9e64ddb22 100644 --- a/circuit/types/scalar/Cargo.toml +++ b/circuit/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-scalar" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Scalar circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,20 +9,20 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-scalar" path = "../../../console/types/scalar" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.14" +version = "=0.16.15" [features] default = [ "enable_console" ] diff --git a/circuit/types/string/Cargo.toml b/circuit/types/string/Cargo.toml index e24c333c29..1cebb5b626 100644 --- a/circuit/types/string/Cargo.toml +++ b/circuit/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-circuit-types-string" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "String circuit for a decentralized virtual machine" license = "Apache-2.0" @@ -9,24 +9,24 @@ edition = "2021" [dependencies.console] package = "snarkvm-console-types-string" path = "../../../console/types/string" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-circuit-environment] path = "../../environment" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-boolean] path = "../boolean" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-field] path = "../field" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-circuit-types-integers] path = "../integers" -version = "=0.16.14" +version = "=0.16.15" [dev-dependencies.snarkvm-utilities] path = "../../../utilities" diff --git a/console/Cargo.toml b/console/Cargo.toml index a716db0249..a33a64fb29 100644 --- a/console/Cargo.toml +++ b/console/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Console environment for a decentralized virtual machine" license = "Apache-2.0" @@ -8,32 +8,32 @@ edition = "2021" [dependencies.snarkvm-console-account] path = "./account" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-console-algorithms] path = "./algorithms" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-console-collections] path = "./collections" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-console-network] path = "./network" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-console-program] path = "./program" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-console-types] path = "./types" -version = "=0.16.14" +version = "=0.16.15" optional = true [features] diff --git a/console/account/Cargo.toml b/console/account/Cargo.toml index 53491b9103..bb41a00122 100644 --- a/console/account/Cargo.toml +++ b/console/account/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-account" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Account operations for a decentralized virtual machine" license = "Apache-2.0" @@ -13,11 +13,11 @@ harness = false [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.14" +version = "=0.16.15" default-features = false features = [ "address", "boolean", "field", "group", "scalar" ] diff --git a/console/algorithms/Cargo.toml b/console/algorithms/Cargo.toml index 719da24088..99291b7d20 100644 --- a/console/algorithms/Cargo.toml +++ b/console/algorithms/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-algorithms" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Console algorithms for a decentralized virtual machine" license = "Apache-2.0" @@ -23,18 +23,18 @@ harness = false [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.14" +version = "=0.16.15" default-features = false features = [ "field", "group", "integers", "scalar" ] [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.14" +version = "=0.16.15" [dependencies.blake2s_simd] version = "1.0" diff --git a/console/collections/Cargo.toml b/console/collections/Cargo.toml index 1df6cc61cc..2566972c39 100644 --- a/console/collections/Cargo.toml +++ b/console/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-collections" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Collections for a decentralized virtual machine" license = "Apache-2.0" @@ -18,11 +18,11 @@ harness = false [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.14" +version = "=0.16.15" default-features = false features = [ "field", "integers" ] diff --git a/console/network/Cargo.toml b/console/network/Cargo.toml index 9f1c4a614f..c86f68cca3 100644 --- a/console/network/Cargo.toml +++ b/console/network/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Network console library for a decentralized virtual machine" license = "Apache-2.0" @@ -15,45 +15,45 @@ wasm = [ [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.14" +version = "=0.16.15" default-features = false features = [ "snark" ] [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-network-environment] path = "./environment" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.14" +version = "=0.16.15" default-features = false features = [ "field", "group", "scalar" ] [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.snarkvm-parameters] path = "../../parameters" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.14" +version = "=0.16.15" [dependencies.anyhow] version = "1.0.73" diff --git a/console/network/environment/Cargo.toml b/console/network/environment/Cargo.toml index 4daa190b73..279581b885 100644 --- a/console/network/environment/Cargo.toml +++ b/console/network/environment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-network-environment" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Environment console library for a decentralized virtual machine" license = "Apache-2.0" @@ -8,17 +8,17 @@ edition = "2021" [dependencies.snarkvm-curves] path = "../../../curves" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.snarkvm-fields] path = "../../../fields" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.snarkvm-utilities] path = "../../../utilities" -version = "=0.16.14" +version = "=0.16.15" [dependencies.anyhow] version = "1.0.73" diff --git a/console/program/Cargo.toml b/console/program/Cargo.toml index 38c8a0adc9..ba81988fc7 100644 --- a/console/program/Cargo.toml +++ b/console/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-program" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Program operations for a decentralized virtual machine" license = "Apache-2.0" @@ -12,27 +12,27 @@ test = [ ] [dependencies.snarkvm-console-account] path = "../account" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-algorithms] path = "../algorithms" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-collections] path = "../collections" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-network] path = "../network" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types] path = "../types" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.14" +version = "=0.16.15" [dependencies.enum_index] version = "0.2" diff --git a/console/types/Cargo.toml b/console/types/Cargo.toml index e0eb95de7c..17dc90de05 100644 --- a/console/types/Cargo.toml +++ b/console/types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Console types for a decentralized virtual machine" license = "Apache-2.0" @@ -8,41 +8,41 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../network/environment" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types-address] path = "./address" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-console-types-boolean] path = "./boolean" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-console-types-field] path = "./field" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-console-types-group] path = "./group" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-console-types-integers] path = "./integers" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-console-types-scalar] path = "./scalar" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-console-types-string] path = "./string" -version = "=0.16.14" +version = "=0.16.15" optional = true [features] diff --git a/console/types/address/Cargo.toml b/console/types/address/Cargo.toml index 80e0e575f8..2c17e364a5 100644 --- a/console/types/address/Cargo.toml +++ b/console/types/address/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-address" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types-group] path = "../group" -version = "=0.16.14" +version = "=0.16.15" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/boolean/Cargo.toml b/console/types/boolean/Cargo.toml index 116443e659..be2c33dbee 100644 --- a/console/types/boolean/Cargo.toml +++ b/console/types/boolean/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-boolean" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,7 +8,7 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.14" +version = "=0.16.15" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/field/Cargo.toml b/console/types/field/Cargo.toml index 514d6978dc..bc29ee8fde 100644 --- a/console/types/field/Cargo.toml +++ b/console/types/field/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-field" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,11 +8,11 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.14" +version = "=0.16.15" [dependencies.zeroize] version = "1" diff --git a/console/types/group/Cargo.toml b/console/types/group/Cargo.toml index 55d57423d0..4fc8365c8f 100644 --- a/console/types/group/Cargo.toml +++ b/console/types/group/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-group" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.14" +version = "=0.16.15" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/integers/Cargo.toml b/console/types/integers/Cargo.toml index f6c13e36e1..0b35f6f1a8 100644 --- a/console/types/integers/Cargo.toml +++ b/console/types/integers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-integers" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types-scalar] path = "../scalar" -version = "=0.16.14" +version = "=0.16.15" [dev-dependencies.bincode] version = "1.3" diff --git a/console/types/scalar/Cargo.toml b/console/types/scalar/Cargo.toml index 2ae14d7ba5..03db6c53ec 100644 --- a/console/types/scalar/Cargo.toml +++ b/console/types/scalar/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-scalar" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,15 +8,15 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.14" +version = "=0.16.15" [dependencies.zeroize] version = "1" diff --git a/console/types/string/Cargo.toml b/console/types/string/Cargo.toml index c8c717c4b2..4e98ffd9e0 100644 --- a/console/types/string/Cargo.toml +++ b/console/types/string/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-console-types-string" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Type operations for a decentralized virtual machine" license = "Apache-2.0" @@ -8,19 +8,19 @@ edition = "2021" [dependencies.snarkvm-console-network-environment] path = "../../network/environment" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types-boolean] path = "../boolean" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types-field] path = "../field" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-console-types-integers] path = "../integers" -version = "=0.16.14" +version = "=0.16.15" [dev-dependencies.bincode] version = "1.3" diff --git a/curves/Cargo.toml b/curves/Cargo.toml index 780ad40d62..369622d10e 100644 --- a/curves/Cargo.toml +++ b/curves/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-curves" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Curves for a decentralized virtual machine" homepage = "https://aleo.org" @@ -36,12 +36,12 @@ harness = false [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.rand] diff --git a/fields/Cargo.toml b/fields/Cargo.toml index 115d8be537..9f15b2f15c 100644 --- a/fields/Cargo.toml +++ b/fields/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-fields" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Fields for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.aleo-std] diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index 61e93075bf..8258be5fc0 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "A node ledger for a decentralized virtual machine" homepage = "https://aleo.org" @@ -57,54 +57,54 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "./authority" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "./block" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "./coinbase" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "./committee" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-narwhal] package = "snarkvm-ledger-narwhal" path = "./narwhal" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "./query" -version = "=0.16.14" +version = "=0.16.15" features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "./store" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-test-helpers] package = "snarkvm-ledger-test-helpers" path = "./test-helpers" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.synthesizer] package = "snarkvm-synthesizer" path = "../synthesizer" -version = "=0.16.14" +version = "=0.16.15" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/authority/Cargo.toml b/ledger/authority/Cargo.toml index 91d9a849c9..2be5317994 100644 --- a/ledger/authority/Cargo.toml +++ b/ledger/authority/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-authority" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Data structures for a block authority in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-subdag/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.14" +version = "=0.16.15" [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.14" +version = "=0.16.15" [dependencies.anyhow] version = "1" diff --git a/ledger/block/Cargo.toml b/ledger/block/Cargo.toml index 31891b142a..c3dff51f0e 100644 --- a/ledger/block/Cargo.toml +++ b/ledger/block/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-block" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "A block for a decentralized virtual machine" homepage = "https://aleo.org" @@ -39,42 +39,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../ledger/coinbase" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../../ledger/committee" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "../narwhal/subdag" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../narwhal/transmission-id" -version = "=0.16.14" +version = "=0.16.15" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.14" +version = "=0.16.15" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.14" +version = "=0.16.15" [dependencies.indexmap] version = "2.0" diff --git a/ledger/coinbase/Cargo.toml b/ledger/coinbase/Cargo.toml index 8e61ee220a..4af319fcec 100644 --- a/ledger/coinbase/Cargo.toml +++ b/ledger/coinbase/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-coinbase" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Coinbase puzzle for a decentralized virtual machine" homepage = "https://aleo.org" @@ -50,27 +50,27 @@ wasm = [ [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-curves] path = "../../curves" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-fields] path = "../../fields" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-synthesizer-snark] path = "../../synthesizer/snark" -version = "=0.16.14" +version = "=0.16.15" [dependencies.snarkvm-utilities] path = "../../utilities" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.aleo-std] diff --git a/ledger/committee/Cargo.toml b/ledger/committee/Cargo.toml index 58bb602dc4..2bfae2c3f0 100644 --- a/ledger/committee/Cargo.toml +++ b/ledger/committee/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-committee" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "A committee for a decentralized virtual machine" homepage = "https://aleo.org" @@ -34,7 +34,7 @@ test-helpers = [ "prop-tests", "rand_distr" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.14" +version = "=0.16.15" [dependencies.indexmap] version = "2.0" @@ -43,7 +43,7 @@ features = [ "serde", "rayon" ] [dependencies.metrics] package = "snarkvm-metrics" path = "../../metrics" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.serde_json] diff --git a/ledger/narwhal/Cargo.toml b/ledger/narwhal/Cargo.toml index e744f954f1..014a7a0599 100644 --- a/ledger/narwhal/Cargo.toml +++ b/ledger/narwhal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Data structures for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -64,37 +64,37 @@ transmission-id = [ "narwhal-transmission-id" ] [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "./batch-certificate" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "./batch-header" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "./data" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.narwhal-subdag] package = "snarkvm-ledger-narwhal-subdag" path = "./subdag" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.narwhal-transmission] package = "snarkvm-ledger-narwhal-transmission" path = "./transmission" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "./transmission-id" -version = "=0.16.14" +version = "=0.16.15" optional = true [dev-dependencies.snarkvm-ledger-narwhal] diff --git a/ledger/narwhal/batch-certificate/Cargo.toml b/ledger/narwhal/batch-certificate/Cargo.toml index 1f169f5d61..0e91b4f2e5 100644 --- a/ledger/narwhal/batch-certificate/Cargo.toml +++ b/ledger/narwhal/batch-certificate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-certificate" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,17 +32,17 @@ test-helpers = [ "narwhal-batch-header/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.14" +version = "=0.16.15" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.14" +version = "=0.16.15" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.14" +version = "=0.16.15" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/batch-header/Cargo.toml b/ledger/narwhal/batch-header/Cargo.toml index ff63e5c52b..2469093f4f 100644 --- a/ledger/narwhal/batch-header/Cargo.toml +++ b/ledger/narwhal/batch-header/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-batch-header" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "A batch header for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ "narwhal-transmission-id/test-helpers", "time" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.14" +version = "=0.16.15" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.14" +version = "=0.16.15" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/data/Cargo.toml b/ledger/narwhal/data/Cargo.toml index b48d028ec6..0605db8cd8 100644 --- a/ledger/narwhal/data/Cargo.toml +++ b/ledger/narwhal/data/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-data" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "A batch certificate for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -29,7 +29,7 @@ async = [ "tokio" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.14" +version = "=0.16.15" [dependencies.bytes] version = "1" diff --git a/ledger/narwhal/subdag/Cargo.toml b/ledger/narwhal/subdag/Cargo.toml index 12858922e2..34c72d5888 100644 --- a/ledger/narwhal/subdag/Cargo.toml +++ b/ledger/narwhal/subdag/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-subdag" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "A subdag for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ "narwhal-batch-certificate/test-helpers" ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.14" +version = "=0.16.15" [dependencies.narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../batch-certificate" -version = "=0.16.14" +version = "=0.16.15" [dependencies.narwhal-batch-header] package = "snarkvm-ledger-narwhal-batch-header" path = "../batch-header" -version = "=0.16.14" +version = "=0.16.15" [dependencies.narwhal-transmission-id] package = "snarkvm-ledger-narwhal-transmission-id" path = "../transmission-id" -version = "=0.16.14" +version = "=0.16.15" [dependencies.indexmap] version = "2.0" diff --git a/ledger/narwhal/transmission-id/Cargo.toml b/ledger/narwhal/transmission-id/Cargo.toml index e81a3e58c7..337d55df0a 100644 --- a/ledger/narwhal/transmission-id/Cargo.toml +++ b/ledger/narwhal/transmission-id/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission-id" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "A transmission ID for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,12 +32,12 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.14" +version = "=0.16.15" [dev-dependencies.bincode] version = "1.3" diff --git a/ledger/narwhal/transmission/Cargo.toml b/ledger/narwhal/transmission/Cargo.toml index 283073441d..e50f7952c5 100644 --- a/ledger/narwhal/transmission/Cargo.toml +++ b/ledger/narwhal/transmission/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-narwhal-transmission" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "A transmission for a Narwhal-style memory pool in a decentralized virtual machine" homepage = "https://aleo.org" @@ -32,22 +32,22 @@ test-helpers = [ ] [dependencies.console] package = "snarkvm-console" path = "../../../console" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../block" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../../coinbase" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-narwhal-data] package = "snarkvm-ledger-narwhal-data" path = "../data" -version = "=0.16.14" +version = "=0.16.15" [dependencies.bytes] version = "1" diff --git a/ledger/query/Cargo.toml b/ledger/query/Cargo.toml index 8b574424e2..5feb1fba04 100644 --- a/ledger/query/Cargo.toml +++ b/ledger/query/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-query" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "A query for a decentralized virtual machine" homepage = "https://aleo.org" @@ -34,18 +34,18 @@ query = [ "ledger-store", "synthesizer-program", "ureq" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.async-trait] diff --git a/ledger/store/Cargo.toml b/ledger/store/Cargo.toml index c20984da88..e17fa0900f 100644 --- a/ledger/store/Cargo.toml +++ b/ledger/store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-store" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "A data store for a decentralized virtual machine" homepage = "https://aleo.org" @@ -42,42 +42,42 @@ test = [ ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-authority] package = "snarkvm-ledger-authority" path = "../authority" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../coinbase" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../committee" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-narwhal-batch-certificate] package = "snarkvm-ledger-narwhal-batch-certificate" path = "../narwhal/batch-certificate" -version = "=0.16.14" +version = "=0.16.15" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.14" +version = "=0.16.15" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.14" +version = "=0.16.15" [dependencies.aleo-std] version = "0.1.18" diff --git a/ledger/test-helpers/Cargo.toml b/ledger/test-helpers/Cargo.toml index 35dd04422d..a9889f8940 100644 --- a/ledger/test-helpers/Cargo.toml +++ b/ledger/test-helpers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-ledger-test-helpers" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Test helpers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -19,39 +19,39 @@ edition = "2021" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.14" +version = "=0.16.15" [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../block" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../query" -version = "=0.16.14" +version = "=0.16.15" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../store" -version = "=0.16.14" +version = "=0.16.15" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.14" +version = "=0.16.15" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "../../synthesizer/process" -version = "=0.16.14" +version = "=0.16.15" [dependencies.once_cell] version = "1.18" diff --git a/metrics/Cargo.toml b/metrics/Cargo.toml index 5457815361..04dc3a620d 100644 --- a/metrics/Cargo.toml +++ b/metrics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-metrics" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Metrics for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/parameters/Cargo.toml b/parameters/Cargo.toml index 9a33cf69f9..932f9ba0e2 100644 --- a/parameters/Cargo.toml +++ b/parameters/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-parameters" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Parameters for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "encoding", "js-sys", "web-sys" ] [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.14" +version = "=0.16.15" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/Cargo.toml b/synthesizer/Cargo.toml index 33666c5f87..9afbf50875 100644 --- a/synthesizer/Cargo.toml +++ b/synthesizer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Synthesizer for a decentralized virtual machine" homepage = "https://aleo.org" @@ -69,61 +69,61 @@ harness = false [dependencies.algorithms] package = "snarkvm-algorithms" path = "../algorithms" -version = "=0.16.14" +version = "=0.16.15" [dependencies.circuit] package = "snarkvm-circuit" path = "../circuit" -version = "=0.16.14" +version = "=0.16.15" [dependencies.console] package = "snarkvm-console" path = "../console" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../ledger/block" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-coinbase] package = "snarkvm-ledger-coinbase" path = "../ledger/coinbase" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-committee] package = "snarkvm-ledger-committee" path = "../ledger/committee" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../ledger/query" -version = "=0.16.14" +version = "=0.16.15" default-features = false features = [ "query" ] [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../ledger/store" -version = "=0.16.14" +version = "=0.16.15" [dependencies.synthesizer-process] package = "snarkvm-synthesizer-process" path = "./process" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "./program" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "./snark" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.aleo-std] diff --git a/synthesizer/process/Cargo.toml b/synthesizer/process/Cargo.toml index bb861a5c5a..8b3ec8171d 100644 --- a/synthesizer/process/Cargo.toml +++ b/synthesizer/process/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-process" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "A process for a decentralized virtual machine" homepage = "https://aleo.org" @@ -48,45 +48,45 @@ timer = [ "aleo-std/timer" ] [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.14" +version = "=0.16.15" default-features = false features = [ "network", "program", "types" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-block] package = "snarkvm-ledger-block" path = "../../ledger/block" -version = "=0.16.14" +version = "=0.16.15" [dependencies.ledger-query] package = "snarkvm-ledger-query" path = "../../ledger/query" -version = "=0.16.14" +version = "=0.16.15" default-features = false [dependencies.ledger-store] package = "snarkvm-ledger-store" path = "../../ledger/store" -version = "=0.16.14" +version = "=0.16.15" [dependencies.synthesizer-program] package = "snarkvm-synthesizer-program" path = "../../synthesizer/program" -version = "=0.16.14" +version = "=0.16.15" [dependencies.synthesizer-snark] package = "snarkvm-synthesizer-snark" path = "../../synthesizer/snark" -version = "=0.16.14" +version = "=0.16.15" [dependencies.utilities] package = "snarkvm-utilities" path = "../../utilities" -version = "=0.16.14" +version = "=0.16.15" [dependencies.aleo-std] version = "0.1.18" diff --git a/synthesizer/program/Cargo.toml b/synthesizer/program/Cargo.toml index 26603b350f..ae2ad7a9ba 100644 --- a/synthesizer/program/Cargo.toml +++ b/synthesizer/program/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-program" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Program for a decentralized virtual machine" homepage = "https://aleo.org" @@ -31,12 +31,12 @@ wasm = [ "console/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.14" +version = "=0.16.15" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.14" +version = "=0.16.15" default-features = false features = [ "account", "network", "program", "types" ] diff --git a/synthesizer/snark/Cargo.toml b/synthesizer/snark/Cargo.toml index 47cc71279a..100ce851b9 100644 --- a/synthesizer/snark/Cargo.toml +++ b/synthesizer/snark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-synthesizer-snark" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "SNARK wrappers for a decentralized virtual machine" homepage = "https://aleo.org" @@ -33,18 +33,18 @@ wasm = [ "console/wasm", "snarkvm-algorithms/wasm" ] [dependencies.circuit] package = "snarkvm-circuit" path = "../../circuit" -version = "=0.16.14" +version = "=0.16.15" [dependencies.console] package = "snarkvm-console" path = "../../console" -version = "=0.16.14" +version = "=0.16.15" default-features = false features = [ "network" ] [dependencies.snarkvm-algorithms] path = "../../algorithms" -version = "=0.16.14" +version = "=0.16.15" [dependencies.bincode] version = "1" diff --git a/utilities/Cargo.toml b/utilities/Cargo.toml index 0bc62085c2..bbced72fca 100644 --- a/utilities/Cargo.toml +++ b/utilities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Utilities for a decentralized virtual machine" homepage = "https://aleo.org" @@ -25,7 +25,7 @@ edition = "2021" [dependencies.snarkvm-utilities-derives] path = "./derives" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.aleo-std] diff --git a/utilities/derives/Cargo.toml b/utilities/derives/Cargo.toml index 0dca4da596..29d966060b 100644 --- a/utilities/derives/Cargo.toml +++ b/utilities/derives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-utilities-derives" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "Canonical serialization for a decentralized virtual machine" homepage = "https://aleo.org" diff --git a/wasm/Cargo.toml b/wasm/Cargo.toml index 5383ffefc0..0ab51f4d5a 100644 --- a/wasm/Cargo.toml +++ b/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "snarkvm-wasm" -version = "0.16.14" +version = "0.16.15" authors = [ "The Aleo Team " ] description = "WASM for a decentralized virtual machine" homepage = "https://aleo.org" @@ -51,54 +51,54 @@ utilities = [ "snarkvm-utilities" ] [dependencies.snarkvm-circuit-network] path = "../circuit/network" -version = "=0.16.14" +version = "=0.16.15" features = [ "wasm" ] optional = true [dependencies.snarkvm-console] path = "../console" -version = "=0.16.14" +version = "=0.16.15" features = [ "wasm" ] optional = true [dependencies.snarkvm-curves] path = "../curves" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-fields] path = "../fields" -version = "=0.16.14" +version = "=0.16.15" optional = true [dependencies.snarkvm-ledger-block] path = "../ledger/block" -version = "=0.16.14" +version = "=0.16.15" features = [ "wasm" ] optional = true [dependencies.snarkvm-ledger-query] path = "../ledger/query" -version = "=0.16.14" +version = "=0.16.15" features = [ "async", "wasm" ] optional = true [dependencies.snarkvm-ledger-store] path = "../ledger/store" -version = "=0.16.14" +version = "=0.16.15" features = [ "wasm" ] optional = true [dependencies.snarkvm-synthesizer] path = "../synthesizer" -version = "=0.16.14" +version = "=0.16.15" default-features = false features = [ "async", "wasm" ] optional = true [dependencies.snarkvm-utilities] path = "../utilities" -version = "=0.16.14" +version = "=0.16.15" features = [ "wasm" ] optional = true From b16767efbe247173ab2a1a8656c5a6b6002e437b Mon Sep 17 00:00:00 2001 From: Victor Sint Nicolaas Date: Mon, 27 Nov 2023 15:46:09 +0100 Subject: [PATCH 338/339] Remove dead code --- algorithms/src/polycommit/sonic_pc/mod.rs | 63 +++++----- .../src/polycommit/sonic_pc/polynomial.rs | 114 +++--------------- 2 files changed, 42 insertions(+), 135 deletions(-) diff --git a/algorithms/src/polycommit/sonic_pc/mod.rs b/algorithms/src/polycommit/sonic_pc/mod.rs index 1d840b45a9..847483ca69 100644 --- a/algorithms/src/polycommit/sonic_pc/mod.rs +++ b/algorithms/src/polycommit/sonic_pc/mod.rs @@ -209,43 +209,34 @@ impl> SonicKZG10 { hiding_bound, )); - let (comm, rand) = p - .sum()? - .map(move |p| { - let rng_ref = rng.as_mut().map(|s| s as _); - match p { - PolynomialWithBasis::Lagrange { evaluations } => { - let domain = crate::fft::EvaluationDomain::new(evaluations.evaluations.len()).unwrap(); - let lagrange_basis = ck - .lagrange_basis(domain) - .ok_or(PCError::UnsupportedLagrangeBasisSize(domain.size()))?; - assert!(domain.size().is_power_of_two()); - assert!(lagrange_basis.size().is_power_of_two()); - kzg10::KZG10::commit_lagrange( - &lagrange_basis, - &evaluations.evaluations, - hiding_bound, - rng_ref, - ) - } - PolynomialWithBasis::Monomial { polynomial, degree_bound } => { - let powers = if let Some(degree_bound) = degree_bound { - ck.shifted_powers_of_beta_g(degree_bound).unwrap() - } else { - ck.powers() - }; - - kzg10::KZG10::commit(&powers, &polynomial, hiding_bound, rng_ref) - } + let (comm, rand) = { + let rng_ref = rng.as_mut().map(|s| s as _); + match p.polynomial { + PolynomialWithBasis::Lagrange { evaluations } => { + let domain = crate::fft::EvaluationDomain::new(evaluations.evaluations.len()).unwrap(); + let lagrange_basis = ck + .lagrange_basis(domain) + .ok_or(PCError::UnsupportedLagrangeBasisSize(domain.size()))?; + assert!(domain.size().is_power_of_two()); + assert!(lagrange_basis.size().is_power_of_two()); + kzg10::KZG10::commit_lagrange( + &lagrange_basis, + &evaluations.evaluations, + hiding_bound, + rng_ref, + )? } - }) - .try_fold((E::G1Projective::zero(), Randomness::empty()), |mut a, b| { - let b = b?; - a.0.add_assign_mixed(&b.0.0); - a.1 += (E::Fr::one(), &b.1); - Ok::<_, PCError>(a) - })?; - let comm = kzg10::KZGCommitment(comm.to_affine()); + PolynomialWithBasis::Monomial { polynomial, degree_bound } => { + let powers = if let Some(degree_bound) = degree_bound { + ck.shifted_powers_of_beta_g(degree_bound).unwrap() + } else { + ck.powers() + }; + + kzg10::KZG10::commit(&powers, &polynomial, hiding_bound, rng_ref)? + } + } + }; Ok((LabeledCommitment::new(label.to_string(), comm, degree_bound), rand)) }); diff --git a/algorithms/src/polycommit/sonic_pc/polynomial.rs b/algorithms/src/polycommit/sonic_pc/polynomial.rs index c620989bde..a18a0bbace 100644 --- a/algorithms/src/polycommit/sonic_pc/polynomial.rs +++ b/algorithms/src/polycommit/sonic_pc/polynomial.rs @@ -17,8 +17,7 @@ use crate::fft::{DensePolynomial, EvaluationDomain, Evaluations as EvaluationsOn use snarkvm_fields::{Field, PrimeField}; use snarkvm_utilities::{cfg_iter, cfg_iter_mut, CanonicalDeserialize, CanonicalSerialize}; -use anyhow::{ensure, Result}; -use hashbrown::HashMap; +use anyhow::Result; use std::borrow::Cow; #[cfg(feature = "serial")] @@ -142,7 +141,7 @@ impl LabeledPolynomial { #[derive(Debug, Clone)] pub struct LabeledPolynomialWithBasis<'a, F: PrimeField> { pub info: PolynomialInfo, - pub polynomial: Vec<(F, PolynomialWithBasis<'a, F>)>, + pub polynomial: PolynomialWithBasis<'a, F>, } impl<'a, F: PrimeField> LabeledPolynomialWithBasis<'a, F> { @@ -155,16 +154,6 @@ impl<'a, F: PrimeField> LabeledPolynomialWithBasis<'a, F> { ) -> Self { let polynomial = PolynomialWithBasis::new_monomial_basis_ref(polynomial, degree_bound); let info = PolynomialInfo::new(label, degree_bound, hiding_bound); - Self { info, polynomial: vec![(F::one(), polynomial)] } - } - - /// Construct a new labeled polynomial by consuming `polynomial`. - pub fn new_linear_combination( - label: PolynomialLabel, - polynomial: Vec<(F, PolynomialWithBasis<'a, F>)>, - hiding_bound: Option, - ) -> Self { - let info = PolynomialInfo::new(label, None, hiding_bound); Self { info, polynomial } } @@ -175,7 +164,7 @@ impl<'a, F: PrimeField> LabeledPolynomialWithBasis<'a, F> { ) -> Self { let polynomial = PolynomialWithBasis::new_lagrange_basis(polynomial); let info = PolynomialInfo::new(label, None, hiding_bound); - Self { info, polynomial: vec![(F::one(), polynomial)] } + Self { info, polynomial } } pub fn new_lagrange_basis_ref( @@ -185,7 +174,7 @@ impl<'a, F: PrimeField> LabeledPolynomialWithBasis<'a, F> { ) -> Self { let polynomial = PolynomialWithBasis::new_lagrange_basis_ref(polynomial); let info = PolynomialInfo::new(label, None, hiding_bound); - Self { info, polynomial: vec![(F::one(), polynomial)] } + Self { info, polynomial } } /// Return the label for `self`. @@ -199,96 +188,23 @@ impl<'a, F: PrimeField> LabeledPolynomialWithBasis<'a, F> { } pub fn degree(&self) -> usize { - self.polynomial - .iter() - .map(|(_, p)| match p { - PolynomialWithBasis::Lagrange { evaluations } => evaluations.domain().size() - 1, - PolynomialWithBasis::Monomial { polynomial, .. } => polynomial.degree(), - }) - .max() - .unwrap_or(0) + match &self.polynomial { + PolynomialWithBasis::Lagrange { evaluations } => evaluations.domain().size() - 1, + PolynomialWithBasis::Monomial { polynomial, .. } => polynomial.degree(), + } } /// Evaluate the polynomial in `self`. pub fn evaluate(&self, point: F) -> F { - self.polynomial.iter().map(|(coeff, p)| p.evaluate(point) * coeff).sum() - } - - /// Compute a linear combination of the terms in `self.polynomial`, producing an iterator - /// over polynomials of the same time. - pub fn sum(&self) -> Result>> { - if self.polynomial.len() == 1 && self.polynomial[0].0.is_one() { - Ok(vec![self.polynomial[0].1.clone()].into_iter()) - } else { - use PolynomialWithBasis::*; - let mut lagrange_polys = HashMap::>::new(); - let mut dense_polys = HashMap::<_, DensePolynomial>::new(); - let mut sparse_poly = SparsePolynomial::zero(); - // We have sets of polynomials divided along three criteria: - // 1. All `Lagrange` polynomials are in the set corresponding to their domain. - // 2. All `Dense` polynomials are in the set corresponding to their degree bound. - // 3. All `Sparse` polynomials are in the set corresponding to their degree bound. - for (c, poly) in self.polynomial.iter() { - match poly { - Monomial { polynomial, degree_bound } => { - use Polynomial::*; - match polynomial.as_ref() { - Dense(p) => { - if let Some(e) = dense_polys.get_mut(degree_bound) { - // Zip safety: `p` could be of smaller degree than `e`, - // so it's okay to just use `zip` here. - ensure!(e.len() >= p.coeffs.len()); - cfg_iter_mut!(e).zip(&p.coeffs).for_each(|(e, f)| *e += *c * f) - } else { - let mut e: DensePolynomial = p.clone().into_owned(); - cfg_iter_mut!(e).for_each(|e| *e *= c); - dense_polys.insert(degree_bound, e); - } - } - Sparse(p) => sparse_poly += (*c, p.as_ref()), - } - } - Lagrange { evaluations } => { - let domain = evaluations.domain().size(); - if let Some(e) = lagrange_polys.get_mut(&domain) { - ensure!(e.len() == evaluations.evaluations.len()); - cfg_iter_mut!(e).zip_eq(&evaluations.evaluations).for_each(|(e, f)| *e += *c * f) - } else { - let mut e = evaluations.clone().into_owned().evaluations; - cfg_iter_mut!(e).for_each(|e| *e *= c); - lagrange_polys.insert(domain, e); - } - } - } - } - let sparse_poly = Polynomial::from(sparse_poly); - let sparse_poly = Monomial { polynomial: Cow::Owned(sparse_poly), degree_bound: None }; - Ok(lagrange_polys - .into_iter() - .map(|(k, v)| { - let domain = EvaluationDomain::new(k).unwrap(); - Lagrange { evaluations: Cow::Owned(EvaluationsOnDomain::from_vec_and_domain(v, domain)) } - }) - .chain({ - dense_polys - .into_iter() - .map(|(degree_bound, p)| PolynomialWithBasis::new_dense_monomial_basis(p, *degree_bound)) - }) - .chain([sparse_poly]) - .collect::>() - .into_iter()) - } + self.polynomial.evaluate(point) } /// Retrieve the degree bound in `self`. pub fn degree_bound(&self) -> Option { - self.polynomial - .iter() - .filter_map(|(_, p)| match p { - PolynomialWithBasis::Monomial { degree_bound, .. } => *degree_bound, - _ => None, - }) - .max() + match self.polynomial { + PolynomialWithBasis::Monomial { degree_bound, .. } => degree_bound, + _ => None, + } } /// Retrieve whether the polynomial in `self` should be hidden. @@ -308,7 +224,7 @@ impl<'a, F: PrimeField> From<&'a LabeledPolynomial> for LabeledPolynomialWith polynomial: Cow::Borrowed(other.polynomial()), degree_bound: other.degree_bound(), }; - Self { info: other.info.clone(), polynomial: vec![(F::one(), polynomial)] } + Self { info: other.info.clone(), polynomial } } } @@ -318,7 +234,7 @@ impl<'a, F: PrimeField> From> for LabeledPolynomialWithBasi polynomial: Cow::Owned(other.polynomial), degree_bound: other.info.degree_bound, }; - Self { info: other.info.clone(), polynomial: vec![(F::one(), polynomial)] } + Self { info: other.info.clone(), polynomial } } } From fb526454e9f15ffd84939c5c8287904bec4092e0 Mon Sep 17 00:00:00 2001 From: Howard Wu <9260812+howardwu@users.noreply.github.com> Date: Tue, 26 Dec 2023 16:48:26 -0800 Subject: [PATCH 339/339] Fix type compatibility compilation issues --- ledger/narwhal/batch-certificate/src/bytes.rs | 4 +-- ledger/narwhal/batch-certificate/src/lib.rs | 6 ++-- ledger/narwhal/batch-header/src/lib.rs | 34 ++++++++++++++----- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/ledger/narwhal/batch-certificate/src/bytes.rs b/ledger/narwhal/batch-certificate/src/bytes.rs index 446a0d4193..baa793c1ff 100644 --- a/ledger/narwhal/batch-certificate/src/bytes.rs +++ b/ledger/narwhal/batch-certificate/src/bytes.rs @@ -32,7 +32,7 @@ impl FromBytes for BatchCertificate { // Read the number of signatures. let num_signatures = u32::read_le(&mut reader)?; // Ensure the number of signatures is within bounds. - if num_signatures as usize > Self::MAX_SIGNATURES { + if num_signatures > Self::MAX_SIGNATURES as u32 { return Err(error(format!( "Number of signatures ({num_signatures}) exceeds the maximum ({})", Self::MAX_SIGNATURES @@ -56,7 +56,7 @@ impl FromBytes for BatchCertificate { // Read the number of signatures. let num_signatures = u16::read_le(&mut reader)?; // Ensure the number of signatures is within bounds. - if num_signatures as usize > Self::MAX_SIGNATURES { + if num_signatures > Self::MAX_SIGNATURES { return Err(error(format!( "Number of signatures ({num_signatures}) exceeds the maximum ({})", Self::MAX_SIGNATURES diff --git a/ledger/narwhal/batch-certificate/src/lib.rs b/ledger/narwhal/batch-certificate/src/lib.rs index 3e9fede619..c053433e5c 100644 --- a/ledger/narwhal/batch-certificate/src/lib.rs +++ b/ledger/narwhal/batch-certificate/src/lib.rs @@ -54,7 +54,7 @@ pub enum BatchCertificate { impl BatchCertificate { /// The maximum number of signatures in a batch certificate. - pub const MAX_SIGNATURES: usize = BatchHeader::::MAX_CERTIFICATES; + pub const MAX_SIGNATURES: u16 = BatchHeader::::MAX_CERTIFICATES; } impl BatchCertificate { @@ -84,7 +84,7 @@ impl BatchCertificate { N::hash_bhp1024(&preimage.to_bits_le()) } // Ensure that the number of signatures is within bounds. - ensure!(signatures.len() <= Self::MAX_SIGNATURES, "Invalid number of signatures"); + ensure!(signatures.len() <= Self::MAX_SIGNATURES as usize, "Invalid number of signatures"); // Compute the certificate ID. if certificate_id != compute_certificate_id(batch_header.batch_id(), &signatures)? { bail!("Invalid batch certificate ID") @@ -103,7 +103,7 @@ impl BatchCertificate { /// Initializes a new batch certificate. pub fn from(batch_header: BatchHeader, signatures: IndexSet>) -> Result { // Ensure that the number of signatures is within bounds. - ensure!(signatures.len() <= Self::MAX_SIGNATURES, "Invalid number of signatures"); + ensure!(signatures.len() <= Self::MAX_SIGNATURES as usize, "Invalid number of signatures"); // Verify the signatures are valid. cfg_iter!(signatures).try_for_each(|signature| { diff --git a/ledger/narwhal/batch-header/src/lib.rs b/ledger/narwhal/batch-header/src/lib.rs index 8bfe2d8673..237406a4ec 100644 --- a/ledger/narwhal/batch-header/src/lib.rs +++ b/ledger/narwhal/batch-header/src/lib.rs @@ -94,13 +94,22 @@ impl BatchHeader { } // Ensure that the number of transmissions is within bounds. - ensure!(transmission_ids.len() <= Self::MAX_TRANSMISSIONS, "Invalid number of transmission ids"); + ensure!( + transmission_ids.len() <= Self::MAX_TRANSMISSIONS_PER_BATCH, + "Invalid number of transmission ids ({})", + transmission_ids.len() + ); // Ensure that the number of previous certificate IDs is within bounds. - ensure!(previous_certificate_ids.len() <= Self::MAX_CERTIFICATES, "Invalid number of previous certificate IDs"); + ensure!( + previous_certificate_ids.len() <= Self::MAX_CERTIFICATES as usize, + "Invalid number of previous certificate IDs ({})", + previous_certificate_ids.len() + ); // Ensure the number of last election certificate IDs is within bounds. ensure!( - last_election_certificate_ids.len() <= Self::MAX_CERTIFICATES, - "Invalid number of last election certificate IDs" + last_election_certificate_ids.len() <= Self::MAX_CERTIFICATES as usize, + "Invalid number of last election certificate IDs ({})", + last_election_certificate_ids.len() ); // Retrieve the address. @@ -154,13 +163,22 @@ impl BatchHeader { } // Ensure that the number of transmissions is within bounds. - ensure!(transmission_ids.len() <= Self::MAX_TRANSMISSIONS, "Invalid number of transmission ids"); + ensure!( + transmission_ids.len() <= Self::MAX_TRANSMISSIONS_PER_BATCH, + "Invalid number of transmission ids ({})", + transmission_ids.len() + ); // Ensure that the number of previous certificate IDs is within bounds. - ensure!(previous_certificate_ids.len() <= Self::MAX_CERTIFICATES, "Invalid number of previous certificate IDs"); + ensure!( + previous_certificate_ids.len() <= Self::MAX_CERTIFICATES as usize, + "Invalid number of previous certificate IDs ({})", + previous_certificate_ids.len() + ); // Ensure the number of last election certificate IDs is within bounds. ensure!( - last_election_certificate_ids.len() <= Self::MAX_CERTIFICATES, - "Invalid number of last election certificate IDs" + last_election_certificate_ids.len() <= Self::MAX_CERTIFICATES as usize, + "Invalid number of last election certificate IDs ({})", + last_election_certificate_ids.len() ); // Compute the batch ID.

    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�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%0ANP5eNEb>vEE2^ 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%0D1nd66Vp&5TmZ#8EWmWP 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 K!Xlxgb9p!o|3&nr#E2aT}uZ=q^Xui>dXyM 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