diff --git a/Cargo.lock b/Cargo.lock index 560cf465c..6d2c3eb59 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -42,9 +42,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.21" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" [[package]] name = "anes" @@ -88,18 +88,17 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "once_cell", - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -119,7 +118,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -217,7 +216,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -243,7 +242,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -362,7 +361,7 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -412,6 +411,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64ct" version = "1.6.0" @@ -444,7 +449,7 @@ dependencies = [ "regex", "rustc-hash 2.1.0", "shlex", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -453,16 +458,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ - "bit-vec 0.6.3", -] - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec 0.8.0", + "bit-vec", ] [[package]] @@ -471,17 +467,11 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - [[package]] name = "bitflags" -version = "2.8.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bitvec" @@ -506,9 +496,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.11.3" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" +checksum = "1a68f1f47cdf0ec8ee4b941b2eee2a80cb796db73118c0dd09ac63fbe405be22" dependencies = [ "memchr", "serde", @@ -755,7 +745,7 @@ checksum = "5d7afa5c9bb8be0c3654792caec70ca51587667665e667c2250b4fa79df901d3" dependencies = [ "cairo-lang-debug", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -1087,7 +1077,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d72369877bade85ecfef9bc13cbd0c66fdaa3e8cd9686833f0db65eacaa833" dependencies = [ "hashbrown 0.14.5", - "indexmap 2.7.1", + "indexmap 2.6.0", "itertools 0.12.1", "num-bigint", "num-traits", @@ -1162,11 +1152,15 @@ dependencies = [ name = "cairo-native-runtime" version = "0.2.9" dependencies = [ + "cairo-lang-sierra", "cairo-lang-sierra-gas", + "cairo-lang-utils", "itertools 0.14.0", "lazy_static", + "num-bigint", "num-traits", "rand", + "sierra-emu", "starknet-curve 0.5.1", "starknet-types-core", ] @@ -1232,7 +1226,7 @@ dependencies = [ "serde_json", "sha2", "sha3", - "starknet-crypto 0.7.4", + "starknet-crypto 0.7.3", "starknet-types-core", "thiserror-no-std", "wasm-bindgen", @@ -1250,10 +1244,11 @@ dependencies = [ [[package]] name = "caseless" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6fd507454086c8edfd769ca6ada439193cdb209c7681712ef6275cccbfe5d8" +checksum = "808dab3318747be122cb31d36de18d4d1c81277a76f8332a02b81a3d73463d7f" dependencies = [ + "regex", "unicode-normalization", ] @@ -1368,7 +1363,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -1385,12 +1380,12 @@ checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "colored" -version = "2.2.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" dependencies = [ "lazy_static", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1409,15 +1404,15 @@ dependencies = [ [[package]] name = "console" -version = "0.15.10" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ "encode_unicode", + "lazy_static", "libc", - "once_cell", - "unicode-width", - "windows-sys", + "unicode-width 0.1.14", + "windows-sys 0.52.0", ] [[package]] @@ -1426,20 +1421,26 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca" +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "const_format" -version = "0.2.34" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" dependencies = [ "const_format_proc_macros", ] [[package]] name = "const_format_proc_macros" -version = "0.2.34" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" dependencies = [ "proc-macro2", "quote", @@ -1472,9 +1473,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "0ca741a962e1b0bff6d724a1a0958b686406e853bb14061f218562e1896f95e6" dependencies = [ "libc", ] @@ -1526,9 +1527,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1545,15 +1546,15 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" @@ -1562,6 +1563,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", + "rand_core", "subtle", "zeroize", ] @@ -1588,6 +1590,17 @@ dependencies = [ "ordered-float", ] +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "deranged" version = "0.3.11" @@ -1636,6 +1649,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] @@ -1667,6 +1681,20 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + [[package]] name = "educe" version = "0.5.11" @@ -1676,7 +1704,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -1688,7 +1716,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -1697,6 +1725,26 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pem-rfc7468", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "ena" version = "0.14.3" @@ -1708,9 +1756,9 @@ dependencies = [ [[package]] name = "encode_unicode" -version = "1.0.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "entities" @@ -1735,7 +1783,7 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -1746,19 +1794,29 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "fastrand" -version = "2.3.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core", + "subtle", +] [[package]] name = "fixedbitset" @@ -1784,9 +1842,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" [[package]] name = "funty" @@ -1808,7 +1866,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -1856,7 +1914,7 @@ checksum = "43eaff6bbc0b3a878361aced5ec6a2818ee7c541c5b33b5880dfa9a86c23e9e7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -1867,6 +1925,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -1884,9 +1943,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "globset" @@ -1903,14 +1962,25 @@ dependencies = [ [[package]] name = "good_lp" -version = "1.11.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10efcd6c7d6f84cb5b4f9155248e0675deab9cfb92d0edbcb25cb81490b65ae7" +checksum = "97630e1e456d7081c524488a87d8f8f7ed0fd3100ba10c55e3cfa7add5ce05c6" dependencies = [ "fnv", "microlp", ] +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + [[package]] name = "half" version = "2.4.1" @@ -2031,7 +2101,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -2072,9 +2142,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -2090,7 +2160,7 @@ dependencies = [ "console", "number_prefix", "portable-atomic", - "unicode-width", + "unicode-width 0.2.0", "web-time", ] @@ -2111,13 +2181,13 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.14" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f187290c0ed3dfe3f7c85bedddd320949b68fc86ca0ceb71adfb05b3dc3af2a" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ "hermit-abi", "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -2173,9 +2243,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "540654e97a3f4470a492cd30ff187bc95d89557a903a2bbf112e2fae98104ef2" [[package]] name = "jobserver" @@ -2195,6 +2265,20 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + [[package]] name = "keccak" version = "0.1.5" @@ -2211,7 +2295,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" dependencies = [ "ascii-canvas", - "bit-set 0.5.3", + "bit-set", "ena", "itertools 0.11.0", "lalrpop-util", @@ -2279,9 +2363,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.169" +version = "0.2.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "433bfe06b8c75da9b2e3fbea6e5329ff87748f0b144ef75306e674c3f6f7c13f" [[package]] name = "libloading" @@ -2290,9 +2374,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets", + "windows-targets 0.52.6", ] +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + [[package]] name = "libredox" version = "0.1.3" @@ -2305,9 +2395,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.15" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "llvm-sys" @@ -2335,9 +2425,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.25" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" @@ -2388,7 +2478,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.96", + "syn 2.0.89", "tblgen", "unindent", ] @@ -2401,9 +2491,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "microlp" -version = "0.2.9" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54df3293c9060b47f9953c8785e5c96e3d3c29e48afaf215f3f335ffc7007304" +checksum = "4190b5ca62abfbc95a81d57f4a8e3e3872289d656f3eeea5820b3046a1f81d4b" dependencies = [ "log", "sprs", @@ -2417,9 +2507,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ "adler2", ] @@ -2544,6 +2634,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2579,30 +2670,43 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + [[package]] name = "parity-scale-codec" -version = "3.6.12" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +checksum = "8be4817d39f3272f69c59fe05d0535ae6456c2dc2fa1ba02910296c7e0a5c590" dependencies = [ "arrayvec", "bitvec", "byte-slice-cast", "impl-trait-for-tuples", "parity-scale-codec-derive", + "rustversion", "serde", ] [[package]] name = "parity-scale-codec-derive" -version = "3.6.12" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +checksum = "8781a75c6205af67215f382092b6e0a4ff3734798523e69073d4bcd294ec767b" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.89", ] [[package]] @@ -2625,7 +2729,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -2663,6 +2767,15 @@ dependencies = [ "sha2", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "petgraph" version = "0.6.5" @@ -2670,7 +2783,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.7.1", + "indexmap 2.6.0", ] [[package]] @@ -2690,9 +2803,9 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -2700,6 +2813,16 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.31" @@ -2736,15 +2859,15 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.10.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" [[package]] name = "portable-atomic-util" -version = "0.2.4" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "90a7d5beecc52a491b54d6dd05c7a45ba1801666a5baad9fdbfc6fef8d2d206c" dependencies = [ "portable-atomic", ] @@ -2792,12 +2915,21 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.29" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.96", + "syn 2.0.89", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", ] [[package]] @@ -2832,21 +2964,21 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "307e3004becf10f5a6e0d59d20f3cd28231b0e0827a96cd3e0ce6d14bc1e4bb3" dependencies = [ "unicode-ident", ] [[package]] name = "proptest" -version = "1.6.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" dependencies = [ - "bit-set 0.8.0", - "bit-vec 0.8.0", + "bit-set", + "bit-vec", "bitflags", "lazy_static", "num-traits", @@ -2867,9 +2999,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.38" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -2947,9 +3079,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.8" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags", ] @@ -3057,7 +3189,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.96", + "syn 2.0.89", "unicode-ident", ] @@ -3067,7 +3199,7 @@ version = "0.17.0-pre.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719825638c59fd26a55412a24561c7c5bcf54364c88b9a7a04ba08a6eafaba8d" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.6.0", "lock_api", "oorandom", "parking_lot", @@ -3087,7 +3219,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -3123,22 +3255,22 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.44" +version = "0.38.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "rusty-fork" @@ -3219,7 +3351,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -3228,33 +3360,47 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "semver" -version = "1.0.25" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.217" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -3265,14 +3411,14 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] name = "serde_json" -version = "1.0.137" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", @@ -3336,6 +3482,49 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "sierra-emu" +version = "0.1.0" +dependencies = [ + "cairo-lang-compiler", + "cairo-lang-filesystem", + "cairo-lang-runner", + "cairo-lang-sierra", + "cairo-lang-sierra-ap-change", + "cairo-lang-sierra-gas", + "cairo-lang-starknet-classes", + "cairo-lang-utils", + "clap", + "k256", + "keccak", + "num-bigint", + "num-traits", + "p256", + "rand", + "sec1", + "serde", + "serde_json", + "sha2", + "smallvec", + "starknet-crypto 0.7.3", + "starknet-curve 0.5.1", + "starknet-types-core", + "tempfile", + "thiserror 2.0.11", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + [[package]] name = "siphasher" version = "0.3.11" @@ -3382,11 +3571,21 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "sprs" -version = "0.11.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bff8419009a08f6cb7519a602c5590241fbff1446bcc823c07af15386eb801b" +checksum = "704ef26d974e8a452313ed629828cd9d4e4fa34667ca1ad9d6b1fffa43c6e166" dependencies = [ "ndarray", "num-complex", @@ -3422,9 +3621,9 @@ dependencies = [ [[package]] name = "starknet-crypto" -version = "0.7.4" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "039a3bad70806b494c9e6b21c5238a6c8a373d66a26071859deb0ccca6f93634" +checksum = "ded22ccf4cb9e572ce3f77de6066af53560cd2520d508876c83bb1e6b29d5cbc" dependencies = [ "crypto-bigint", "hex", @@ -3447,7 +3646,7 @@ checksum = "bbc159a1934c7be9761c237333a57febe060ace2bc9e3b337a59a37af206d19f" dependencies = [ "starknet-curve 0.4.2", "starknet-ff", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -3539,9 +3738,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.96" +version = "2.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" dependencies = [ "proc-macro2", "quote", @@ -3577,7 +3776,7 @@ dependencies = [ "getrandom", "once_cell", "rustix", - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -3609,7 +3808,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -3620,7 +3819,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", "test-case-core", ] @@ -3650,7 +3849,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -3661,7 +3860,7 @@ checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -3696,9 +3895,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.37" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "num-conv", @@ -3734,9 +3933,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -3774,7 +3973,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.7.1", + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", @@ -3800,7 +3999,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -3913,6 +4112,12 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + [[package]] name = "unicode-width" version = "0.2.0" @@ -3957,9 +4162,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "valuable" -version = "0.1.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "version_check" @@ -4013,7 +4218,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", "wasm-bindgen-shared", ] @@ -4035,7 +4240,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4088,7 +4293,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -4097,13 +4302,46 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -4112,28 +4350,46 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -4146,24 +4402,48 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -4172,9 +4452,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.24" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -4227,7 +4507,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] @@ -4247,7 +4527,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.89", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index ff779ac41..06ff8b100 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,6 +50,7 @@ with-cheatcode = [] with-debug-utils = [] with-mem-tracing = [] with-runtime = ["dep:cairo-native-runtime"] +with-trace-dump = ["cairo-native-runtime/with-trace-dump"] # the aquamarine dep is only used in docs and cannot be detected as used by cargo udeps [package.metadata.cargo-udeps.ignore] diff --git a/Makefile b/Makefile index f145e5d3d..1e357c2c6 100644 --- a/Makefile +++ b/Makefile @@ -59,7 +59,7 @@ build-dev: check-llvm .PHONY: check check: check-llvm cargo fmt --all -- --check - cargo clippy --all-targets --all-features -- -D warnings + cargo clippy --all-targets --features build-cli,with-cheatcode,with-runtime -- -D warnings .PHONY: test test: check-llvm needs-cairo2 build-alexandria runtime-ci @@ -88,11 +88,11 @@ coverage: check-llvm needs-cairo2 build-alexandria runtime-ci .PHONY: doc doc: check-llvm - cargo doc --all-features --no-deps --workspace + cargo doc --features build-cli,with-cheatcode,with-runtime --no-deps --workspace .PHONY: doc-open doc-open: check-llvm - cargo doc --all-features --no-deps --workspace --open + cargo doc --features build-cli,with-cheatcode,with-runtime --no-deps --workspace --open .PHONY: bench bench: needs-cairo2 runtime @@ -179,8 +179,11 @@ build-alexandria: .PHONY: runtime runtime: - cargo b --release --all-features -p cairo-native-runtime && cp target/release/libcairo_native_runtime.a . + cargo b --release -p cairo-native-runtime && cp target/release/libcairo_native_runtime.a . + +runtime-with-trace-dump: + cargo b -p cairo-native-runtime --features=with-trace-dump && cp target/debug/libcairo_native_runtime.a . .PHONY: runtime-ci runtime-ci: - cargo b --profile ci --all-features -p cairo-native-runtime && cp target/ci/libcairo_native_runtime.a . + cargo b --profile ci -p cairo-native-runtime && cp target/ci/libcairo_native_runtime.a . diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 8f827521d..f11e48291 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -9,6 +9,14 @@ keywords = ["starknet", "cairo", "runtime"] [lib] crate-type = ["rlib", "cdylib", "staticlib"] +[features] +with-trace-dump = [ + "dep:cairo-lang-sierra", + "dep:cairo-lang-utils", + "dep:sierra-emu", + "dep:num-bigint", +] + [dependencies] starknet-types-core = { version = "0.1.7", default-features = false, features = [ "std", @@ -19,5 +27,9 @@ cairo-lang-sierra-gas = "2.10.0-rc.1" starknet-curve = "0.5.1" lazy_static = "1.5.0" rand = "0.8.5" +num-bigint = { version = "0.4.4", optional = true } +cairo-lang-sierra = { version = "=2.10.0-rc.1", optional = true } +cairo-lang-utils = { version = "=2.10.0-rc.1", optional = true } +sierra-emu = { path = "../../sierra-emu", optional = true } itertools = "0.14.0" num-traits = "0.2" diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index f21d8cdaa..bc189a8ec 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -793,6 +793,476 @@ pub fn as_cairo_short_string_ex(value: &Felt, length: usize) -> Option { Some(as_string) } +#[cfg(feature = "with-trace-dump")] +pub mod trace_dump { + use cairo_lang_sierra::{ + extensions::{ + bounded_int::BoundedIntConcreteType, + core::{CoreLibfunc, CoreType, CoreTypeConcrete}, + starknet::{secp256::Secp256PointTypeConcrete, StarkNetTypeConcrete}, + }, + ids::{ConcreteTypeId, VarId}, + program::StatementIdx, + program_registry::ProgramRegistry, + }; + use cairo_lang_utils::ordered_hash_map::OrderedHashMap; + use itertools::Itertools; + use num_bigint::BigInt; + use num_traits::One; + use sierra_emu::{ + starknet::{ + Secp256k1Point as EmuSecp256k1Point, Secp256r1Point as EmuSecp256r1Point, + U256 as EmuU256, + }, + ProgramTrace, StateDump, Value, + }; + use starknet_types_core::felt::Felt; + use std::{ + alloc::Layout, + collections::HashMap, + mem::swap, + ops::Range, + ptr::NonNull, + sync::{LazyLock, Mutex}, + }; + + use crate::FeltDict; + + pub static TRACE_DUMP: LazyLock>> = + LazyLock::new(|| Mutex::new(HashMap::new())); + + pub struct TraceDump { + pub trace: ProgramTrace, + state: OrderedHashMap, + registry: ProgramRegistry, + + get_layout: fn(&CoreTypeConcrete, &ProgramRegistry) -> Layout, + } + + impl TraceDump { + pub fn new( + registry: ProgramRegistry, + get_layout: fn(&CoreTypeConcrete, &ProgramRegistry) -> Layout, + ) -> Self { + Self { + trace: ProgramTrace::default(), + state: OrderedHashMap::default(), + registry, + + get_layout, + } + } + } + + #[no_mangle] + pub extern "C" fn get_trace_dump_ptr() -> *const Mutex> { + &*TRACE_DUMP as *const _ + } + + #[no_mangle] + pub unsafe extern "C" fn cairo_native__trace_dump__state( + trace_id: u64, + var_id: u64, + type_id: u64, + value_ptr: NonNull<()>, + ) { + let mut trace_dump = TRACE_DUMP.lock().unwrap(); + let trace_dump = trace_dump.get_mut(&trace_id).unwrap(); + + let type_id = ConcreteTypeId::new(type_id); + let value = read_value_ptr( + &trace_dump.registry, + &type_id, + value_ptr, + trace_dump.get_layout, + ); + + trace_dump.state.insert(VarId::new(var_id), value); + } + + #[no_mangle] + pub unsafe extern "C" fn cairo_native__trace_dump__push(trace_id: u64, statement_idx: u64) { + let mut trace_dump = TRACE_DUMP.lock().unwrap(); + let trace_dump = trace_dump.get_mut(&trace_id).unwrap(); + + let mut items = OrderedHashMap::default(); + swap(&mut items, &mut trace_dump.state); + + trace_dump + .trace + .push(StateDump::new(StatementIdx(statement_idx as usize), items)); + } + + unsafe fn read_value_ptr( + registry: &ProgramRegistry, + type_id: &ConcreteTypeId, + value_ptr: NonNull<()>, + get_layout: fn(&CoreTypeConcrete, &ProgramRegistry) -> Layout, + ) -> Value { + let type_info = registry.get_type(type_id).unwrap(); + match type_info { + CoreTypeConcrete::Felt252(_) + | CoreTypeConcrete::StarkNet(StarkNetTypeConcrete::ContractAddress(_)) + | CoreTypeConcrete::StarkNet(StarkNetTypeConcrete::ClassHash(_)) + | CoreTypeConcrete::StarkNet(StarkNetTypeConcrete::StorageAddress(_)) + | CoreTypeConcrete::StarkNet(StarkNetTypeConcrete::StorageBaseAddress(_)) => { + Value::Felt(Felt::from_bytes_le(value_ptr.cast().as_ref())) + } + CoreTypeConcrete::Uint8(_) => Value::U8(value_ptr.cast().read()), + CoreTypeConcrete::Uint16(_) => Value::U16(value_ptr.cast().read()), + CoreTypeConcrete::Uint32(_) => Value::U32(value_ptr.cast().read()), + CoreTypeConcrete::Uint64(_) | CoreTypeConcrete::GasBuiltin(_) => { + Value::U64(value_ptr.cast().read()) + } + CoreTypeConcrete::Uint128(_) => Value::U128(value_ptr.cast().read()), + + CoreTypeConcrete::BoundedInt(BoundedIntConcreteType { range, .. }) => { + let n_bits = ((range.size() - BigInt::one()).bits() as u32).max(1); + let n_bytes = n_bits.next_multiple_of(8) >> 3; + + let data = NonNull::slice_from_raw_parts(value_ptr.cast::(), n_bytes as usize); + + let value = BigInt::from_bytes_le(num_bigint::Sign::Plus, data.as_ref()); + + Value::BoundedInt { + range: Range { + start: range.lower.clone(), + end: range.upper.clone(), + }, + value: value + &range.lower, + } + } + + CoreTypeConcrete::EcPoint(_) => { + let layout = Layout::new::<()>(); + let (x, layout) = { + let (layout, offset) = layout.extend(Layout::new::<[u128; 2]>()).unwrap(); + ( + Felt::from_bytes_le(value_ptr.byte_add(offset).cast().as_ref()), + layout, + ) + }; + let (y, _) = { + let (layout, offset) = layout.extend(Layout::new::<[u128; 2]>()).unwrap(); + ( + Felt::from_bytes_le(value_ptr.byte_add(offset).cast().as_ref()), + layout, + ) + }; + + Value::EcPoint { x, y } + } + CoreTypeConcrete::EcState(_) => { + let layout = Layout::new::<()>(); + let (x0, layout) = { + let (layout, offset) = layout.extend(Layout::new::<[u128; 2]>()).unwrap(); + ( + Felt::from_bytes_le(value_ptr.byte_add(offset).cast().as_ref()), + layout, + ) + }; + let (y0, layout) = { + let (layout, offset) = layout.extend(Layout::new::<[u128; 2]>()).unwrap(); + ( + Felt::from_bytes_le(value_ptr.byte_add(offset).cast().as_ref()), + layout, + ) + }; + let (x1, layout) = { + let (layout, offset) = layout.extend(Layout::new::<[u128; 2]>()).unwrap(); + ( + Felt::from_bytes_le(value_ptr.byte_add(offset).cast().as_ref()), + layout, + ) + }; + let (y1, _) = { + let (layout, offset) = layout.extend(Layout::new::<[u128; 2]>()).unwrap(); + ( + Felt::from_bytes_le(value_ptr.byte_add(offset).cast().as_ref()), + layout, + ) + }; + + Value::EcState { x0, y0, x1, y1 } + } + + CoreTypeConcrete::Uninitialized(info) => Value::Uninitialized { + ty: info.ty.clone(), + }, + CoreTypeConcrete::Box(info) => read_value_ptr( + registry, + &info.ty, + value_ptr.cast::>().read(), + get_layout, + ), + CoreTypeConcrete::Array(info) => { + let layout = Layout::new::<()>(); + let (array_ptr, layout) = { + let (layout, offset) = layout.extend(Layout::new::<*mut ()>()).unwrap(); + (value_ptr.byte_add(offset).cast::<*mut ()>().read(), layout) + }; + let (array_begin, layout) = { + let (layout, offset) = layout.extend(Layout::new::()).unwrap(); + (value_ptr.byte_add(offset).cast::().read(), layout) + }; + let (array_end, _) = { + let (layout, offset) = layout.extend(Layout::new::()).unwrap(); + (value_ptr.byte_add(offset).cast::().read(), layout) + }; + + let layout = + get_layout(registry.get_type(&info.ty).unwrap(), registry).pad_to_align(); + + let mut data = Vec::with_capacity((array_end - array_begin) as usize); + for index in array_begin..array_end { + let index = index as usize; + + data.push(read_value_ptr( + registry, + &info.ty, + NonNull::new(array_ptr.byte_add(layout.size() * index)).unwrap(), + get_layout, + )); + } + + Value::Array { + ty: info.ty.clone(), + data, + } + } + + CoreTypeConcrete::Struct(info) => { + let mut layout = Layout::new::<()>(); + let mut members = Vec::with_capacity(info.members.len()); + for member_ty in &info.members { + let type_info = registry.get_type(member_ty).unwrap(); + let member_layout = get_layout(type_info, registry); + + let offset; + (layout, offset) = layout.extend(member_layout).unwrap(); + + let current_ptr = value_ptr.byte_add(offset); + members.push(read_value_ptr(registry, member_ty, current_ptr, get_layout)); + } + + Value::Struct(members) + } + CoreTypeConcrete::Enum(info) => { + let tag_bits = info.variants.len().next_power_of_two().trailing_zeros(); + let (tag_value, layout) = match tag_bits { + 0 => (0, Layout::new::<()>()), + width if width <= 8 => { + (value_ptr.cast::().read() as usize, Layout::new::()) + } + width if width <= 16 => ( + value_ptr.cast::().read() as usize, + Layout::new::(), + ), + width if width <= 32 => ( + value_ptr.cast::().read() as usize, + Layout::new::(), + ), + width if width <= 64 => ( + value_ptr.cast::().read() as usize, + Layout::new::(), + ), + width if width <= 128 => ( + value_ptr.cast::().read() as usize, + Layout::new::(), + ), + _ => todo!(), + }; + + let payload = { + let (_, offset) = layout + .extend(get_layout( + registry.get_type(&info.variants[tag_value]).unwrap(), + registry, + )) + .unwrap(); + + read_value_ptr( + registry, + &info.variants[tag_value], + value_ptr.byte_add(offset), + get_layout, + ) + }; + + Value::Enum { + self_ty: type_id.clone(), + index: tag_value, + payload: Box::new(payload), + } + } + + CoreTypeConcrete::NonZero(info) | CoreTypeConcrete::Snapshot(info) => { + read_value_ptr(registry, &info.ty, value_ptr, get_layout) + } + + // Builtins and other unit types: + CoreTypeConcrete::Bitwise(_) + | CoreTypeConcrete::BuiltinCosts(_) + | CoreTypeConcrete::EcOp(_) + | CoreTypeConcrete::Pedersen(_) + | CoreTypeConcrete::Poseidon(_) + | CoreTypeConcrete::RangeCheck96(_) + | CoreTypeConcrete::RangeCheck(_) + | CoreTypeConcrete::SegmentArena(_) + | CoreTypeConcrete::StarkNet(StarkNetTypeConcrete::System(_)) + | CoreTypeConcrete::Uint128MulGuarantee(_) => Value::Unit, + + // TODO: + CoreTypeConcrete::Coupon(_) => todo!("CoreTypeConcrete::Coupon"), + CoreTypeConcrete::Circuit(_) => todo!("CoreTypeConcrete::Circuit"), + CoreTypeConcrete::Const(_) => todo!("CoreTypeConcrete::Const"), + CoreTypeConcrete::Sint8(_) => Value::I8(value_ptr.cast().read()), + CoreTypeConcrete::Sint16(_) => todo!("CoreTypeConcrete::Sint16"), + CoreTypeConcrete::Sint32(_) => Value::I32(value_ptr.cast().read()), + CoreTypeConcrete::Sint64(_) => todo!("CoreTypeConcrete::Sint64"), + CoreTypeConcrete::Sint128(_) => Value::I128(value_ptr.cast().read()), + CoreTypeConcrete::Nullable(info) => { + let inner_ptr = value_ptr.cast::<*mut ()>().read(); + match NonNull::new(inner_ptr) { + Some(inner_ptr) => read_value_ptr(registry, &info.ty, inner_ptr, get_layout), + None => Value::Uninitialized { + ty: info.ty.clone(), + }, + } + } + + CoreTypeConcrete::SquashedFelt252Dict(info) | CoreTypeConcrete::Felt252Dict(info) => { + let value = value_ptr.cast::<&FeltDict>().read(); + + let data = value + .mappings + .iter() + .map(|(k, &i)| { + let p = value + .elements + .byte_offset((value.layout.size() * i) as isize); + let v = match NonNull::new(p) { + Some(value_ptr) => { + read_value_ptr(registry, &info.ty, value_ptr.cast(), get_layout) + } + None => Value::Uninitialized { + ty: info.ty.clone(), + }, + }; + let k = Felt::from_bytes_le(k); + (k, v) + }) + .collect::>(); + + Value::FeltDict { + ty: info.ty.clone(), + data, + } + } + CoreTypeConcrete::Felt252DictEntry(info) => { + let value = value_ptr.cast::().read(); + + let data = value + .dict + .mappings + .iter() + .map(|(k, &i)| { + let p = value + .dict + .elements + .byte_offset((value.dict.layout.size() * i) as isize); + let v = match NonNull::new(p) { + Some(value_ptr) => { + read_value_ptr(registry, &info.ty, value_ptr.cast(), get_layout) + } + None => Value::Uninitialized { + ty: info.ty.clone(), + }, + }; + let k = Felt::from_bytes_le(k); + (k, v) + }) + .collect::>(); + let key = Felt::from_bytes_le(&value.key); + + Value::FeltDictEntry { + ty: info.ty.clone(), + data, + key, + } + } + CoreTypeConcrete::Span(_) => todo!("CoreTypeConcrete::Span"), + CoreTypeConcrete::StarkNet(selector) => match selector { + StarkNetTypeConcrete::Secp256Point(selector) => match selector { + Secp256PointTypeConcrete::K1(_) => { + let point: Secp256Point = value_ptr.cast().read(); + let emu_point = EmuSecp256k1Point { + x: EmuU256 { + lo: point.x.lo, + hi: point.x.hi, + }, + y: EmuU256 { + lo: point.y.lo, + hi: point.y.hi, + }, + }; + emu_point.into_value() + } + Secp256PointTypeConcrete::R1(_) => { + let point: Secp256Point = value_ptr.cast().read(); + let emu_point = EmuSecp256r1Point { + x: EmuU256 { + lo: point.x.lo, + hi: point.x.hi, + }, + y: EmuU256 { + lo: point.y.lo, + hi: point.y.hi, + }, + }; + emu_point.into_value() + } + }, + StarkNetTypeConcrete::Sha256StateHandle(_) => { + let raw_data = value_ptr.cast::>().read().read(); + let data = raw_data.into_iter().map(Value::U32).collect_vec(); + Value::Struct(data) + } + _ => unreachable!(), + }, + CoreTypeConcrete::Bytes31(_) => { + let original_data: [u8; 31] = value_ptr.cast().read(); + let mut data = [0u8; 32]; + for (i, v) in original_data.into_iter().enumerate() { + data[i] = v + } + + Value::Bytes31(Felt::from_bytes_le(&data)) + } + CoreTypeConcrete::IntRange(_) => todo!(), + } + } + + #[derive(Debug)] + struct FeltDictEntry<'a> { + dict: &'a FeltDict, + key: &'a [u8; 32], + } + + #[repr(C, align(16))] + pub struct Secp256Point { + pub x: U256, + pub y: U256, + pub is_infinity: bool, + } + + #[repr(C, align(16))] + pub struct U256 { + pub lo: u128, + pub hi: u128, + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/bin/cairo-native-run.rs b/src/bin/cairo-native-run.rs index 32fd46b95..4cb2e2f49 100644 --- a/src/bin/cairo-native-run.rs +++ b/src/bin/cairo-native-run.rs @@ -16,7 +16,7 @@ use utils::{find_function, result_to_runresult}; mod utils; -#[derive(Clone, Debug, ValueEnum)] +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, ValueEnum)] enum RunMode { Aot, Jit, @@ -44,6 +44,10 @@ struct Args { /// Optimization level, Valid: 0, 1, 2, 3. Values higher than 3 are considered as 3. #[arg(short = 'O', long, default_value_t = 0)] opt_level: u8, + + #[cfg(feature = "with-trace-dump")] + #[arg(long)] + trace_output: Option, } fn main() -> anyhow::Result<()> { @@ -103,6 +107,21 @@ fn main() -> anyhow::Result<()> { } }; + #[cfg(feature = "with-trace-dump")] + { + use cairo_lang_sierra::program_registry::ProgramRegistry; + use cairo_native::types::TypeBuilder; + use cairo_native_runtime::trace_dump::{TraceDump, TRACE_DUMP}; + + TRACE_DUMP.lock().unwrap().insert( + 0, + TraceDump::new( + ProgramRegistry::new(&sierra_program).unwrap(), + |ty, registry| ty.layout(registry).unwrap(), + ), + ); + } + let gas_metadata = GasMetadata::new(&sierra_program, Some(MetadataComputationConfig::default())).unwrap(); @@ -138,5 +157,24 @@ fn main() -> anyhow::Result<()> { println!("Remaining gas: {gas}"); } + #[cfg(feature = "with-trace-dump")] + if let Some(trace_output) = args.trace_output { + assert_eq!( + args.run_mode, + RunMode::Jit, + "AOT trace dump for programs is not yet supported" + ); + + let traces = cairo_native_runtime::trace_dump::TRACE_DUMP.lock().unwrap(); + assert_eq!(traces.len(), 1); + + let trace_dump = traces.values().next().unwrap(); + serde_json::to_writer( + std::fs::File::create(trace_output).unwrap(), + &trace_dump.trace, + ) + .unwrap(); + } + Ok(()) } diff --git a/src/compiler.rs b/src/compiler.rs index dbe929b69..41e146dbd 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -100,6 +100,7 @@ use std::{ collections::{hash_map::Entry, BTreeMap, HashMap, HashSet}, ops::Deref, }; +use tracing::debug; /// The [BlockStorage] type is used to map each statement into its own entry block (on the right), /// and its landing block (on the left) if required. @@ -385,40 +386,45 @@ fn compile_func( let pre_entry_block = region.insert_block_before(entry_block, Block::new(&pre_entry_block_args)); - let initial_state = edit_state::put_results(OrderedHashMap::<_, Value>::default(), { - let mut values = Vec::new(); + let initial_state = + edit_state::put_results(OrderedHashMap::<_, (&ConcreteTypeId, Value)>::default(), { + let mut values = Vec::new(); - let mut count = 0; - for param in &function.params { - let type_info = registry.get_type(¶m.ty)?; - let location = Location::new( - context, - "program.sierra", - sierra_stmt_start_offset + function.entry_point.0, - 0, - ); + let mut count = 0; + for param in &function.params { + let type_info = registry.get_type(¶m.ty)?; + let location = Location::new( + context, + "program.sierra", + sierra_stmt_start_offset + function.entry_point.0, + 0, + ); - values.push(( - ¶m.id, - if type_info.is_builtin() && type_info.is_zst(registry)? { - pre_entry_block - .append_operation(llvm::undef( - type_info.build(context, module, registry, metadata, ¶m.ty)?, - location, - )) - .result(0)? - .into() - } else { - let value = entry_block.argument(count)?.into(); - count += 1; + values.push(( + ¶m.id, + ( + ¶m.ty, + if type_info.is_builtin() && type_info.is_zst(registry)? { + pre_entry_block + .append_operation(llvm::undef( + type_info + .build(context, module, registry, metadata, ¶m.ty)?, + location, + )) + .result(0)? + .into() + } else { + let value = entry_block.argument(count)?.into(); + count += 1; - value - }, - )); - } + value + }, + ), + )); + } - values.into_iter() - })?; + values.into_iter() + })?; tracing::trace!("Implementing the entry block."); entry_block.append_operation(cf::br( @@ -428,7 +434,7 @@ fn compile_func( Statement::Return(x) => x, } .iter() - .map(|x| initial_state[x]) + .map(|x| initial_state[x].1) .collect::>(), { Location::new( @@ -460,10 +466,12 @@ fn compile_func( state = edit_state::put_results( OrderedHashMap::default(), state - .keys() - .sorted_by_key(|x| x.id) + .iter() + .sorted_by_key(|(x, _)| x.id) .enumerate() - .map(|(idx, var_id)| Ok((var_id, landing_block.argument(idx)?.into()))) + .map(|(idx, (var_id, (ty, _)))| { + Ok((var_id, (*ty, landing_block.argument(idx)?.into()))) + }) .collect::, Error>>()? .into_iter(), )?; @@ -478,7 +486,10 @@ fn compile_func( } .iter(), )? - .1, + .1 + .iter() + .map(|x| x.1) + .collect::>(), Location::name( context, &format!("landing_block(stmt_idx={})", statement_idx), @@ -522,6 +533,21 @@ fn compile_func( format!("{}(stmt_idx={})", libfunc_to_name(libf), statement_idx) }; + #[cfg(feature = "with-trace-dump")] + self::trace_dump::build_state_snapshot( + metadata.get_or_insert_with( + crate::metadata::trace_dump::TraceDumpMeta::default, + ), + context, + registry, + module, + &pre_entry_block, + block, + Location::unknown(context), + statement_idx, + &state, + ); + let (state, _) = edit_state::take_args(state, invocation.args.iter())?; let helper = LibfuncHelper { @@ -614,8 +640,9 @@ fn compile_func( invocation .branches .iter() + .zip(libfunc.branch_signatures()) .zip(helper.results()?) - .map(|(branch_info, result_values)| { + .map(|((branch_info, signature), result_values)| { assert_eq!( branch_info.results.len(), result_values.len(), @@ -624,7 +651,13 @@ fn compile_func( Ok(edit_state::put_results( state.clone(), - branch_info.results.iter().zip(result_values.into_iter()), + branch_info.results.iter().zip( + signature + .vars + .iter() + .map(|x| &x.ty) + .zip(result_values.iter().copied()), + ), )?) }) .collect::>()?, @@ -644,6 +677,23 @@ fn compile_func( ), ); + #[cfg(feature = "with-trace-dump")] + if !is_recursive || tailrec_state.is_some() { + self::trace_dump::build_state_snapshot( + metadata.get_or_insert_with( + crate::metadata::trace_dump::TraceDumpMeta::default, + ), + context, + registry, + module, + &pre_entry_block, + block, + Location::unknown(context), + statement_idx, + &state, + ); + } + let (_, mut values) = edit_state::take_args(state, var_ids.iter())?; let mut block = *block; @@ -714,7 +764,7 @@ fn compile_func( .ret_types .iter() .zip(&values) - .filter_map(|(type_id, value)| { + .filter_map(|(type_id, (_, value))| { let type_info = match registry.get_type(type_id) { Ok(x) => x, Err(e) => return Some(Err(e.into())), @@ -741,7 +791,7 @@ fn compile_func( .ret_types .iter() .zip(&values) - .filter_map(|(type_id, value)| { + .filter_map(|(type_id, (_, value))| { let type_info = match registry.get_type(type_id) { Ok(x) => x, Err(e) => return Some(Err(e.into())), @@ -785,11 +835,11 @@ fn compile_func( } // Store the return value in the return pointer, if there's one. - if Some(true) == has_return_ptr { + if has_return_ptr == Some(true) { let (_ret_type_id, ret_type_info) = return_type_infos[0]; let ret_layout = ret_type_info.layout(registry)?; - let ptr = values.remove(0); + let (_, ptr) = values.remove(0); block.append_operation(llvm::store( context, ptr, @@ -807,7 +857,7 @@ fn compile_func( let res_ty = llvm::r#type::r#struct(context, &return_types, false); values.iter().enumerate().try_fold( block.append_op_result(llvm::undef(res_ty, location))?, - |acc, (idx, x)| { + |acc, (idx, (_, x))| { block.append_op_result(llvm::insert_value( context, acc, @@ -1240,7 +1290,7 @@ where ); } StatementCompileResult::Deferred => { - tracing::trace!("Statement {statement_idx}'s compilation has been deferred."); + debug!("Statement {statement_idx}'s compilation has been deferred."); visited.remove(&statement_idx); queue.insert(0, (statement_idx, state)); @@ -1256,7 +1306,7 @@ fn generate_branching_targets<'ctx, 'this, 'a>( statements: &'this [Statement], statement_idx: StatementIdx, invocation: &'this Invocation, - state: &OrderedHashMap>, + state: &OrderedHashMap)>, ) -> Vec<(&'this Block<'ctx>, Vec>)> where 'this: 'ctx, @@ -1275,7 +1325,7 @@ where .map(|var_id| { match branch.results.iter().find_position(|id| *id == var_id) { Some((i, _)) => BranchArg::Returned(i), - None => BranchArg::External(state[var_id]), + None => BranchArg::External(state[var_id].1), } }) .collect::>(); @@ -1296,7 +1346,7 @@ where .find_map(|(i, id)| (id == var_id).then_some(i)) { Some(i) => BranchArg::Returned(i), - None => BranchArg::External(state[var_id]), + None => BranchArg::External(state[var_id].1), } }) .collect::>(); @@ -1397,3 +1447,50 @@ enum StatementCompileResult { /// The statement's processing has to be deferred until the end. Deferred, } + +#[cfg(feature = "with-trace-dump")] +mod trace_dump { + use crate::{metadata::trace_dump::TraceDumpMeta, types::TypeBuilder, utils::BlockExt}; + use cairo_lang_sierra::{ + extensions::core::{CoreLibfunc, CoreType}, + ids::{ConcreteTypeId, VarId}, + program::StatementIdx, + program_registry::ProgramRegistry, + }; + use cairo_lang_utils::ordered_hash_map::OrderedHashMap; + use melior::{ + ir::{BlockRef, Location, Module, Value, ValueLike}, + Context, + }; + + #[allow(clippy::too_many_arguments)] + pub fn build_state_snapshot( + trace_dump: &mut TraceDumpMeta, + context: &Context, + registry: &ProgramRegistry, + module: &Module, + init_block: &BlockRef, + block: &BlockRef, + location: Location, + statement_idx: StatementIdx, + state: &OrderedHashMap, + ) { + for (var_id, (type_id, value)) in state.iter() { + let type_info = registry.get_type(type_id).unwrap(); + let layout = type_info.layout(registry).unwrap(); + + let ptr_value = init_block + .alloca1(context, location, value.r#type(), layout.align()) + .unwrap(); + block.store(context, location, ptr_value, *value).unwrap(); + + trace_dump + .build_state(context, module, block, var_id, type_id, ptr_value, location) + .unwrap(); + } + + trace_dump + .build_push(context, module, block, statement_idx, location) + .unwrap(); + } +} diff --git a/src/executor/contract.rs b/src/executor/contract.rs index e65545b09..1d0af4a6c 100644 --- a/src/executor/contract.rs +++ b/src/executor/contract.rs @@ -78,7 +78,7 @@ use tempfile::NamedTempFile; #[educe(Debug)] pub struct AotContractExecutor { #[educe(Debug(ignore))] - library: Arc, + pub library: Arc, path: PathBuf, is_temp_path: bool, contract_info: NativeContractInfo, diff --git a/src/lib.rs b/src/lib.rs index e41db615e..0d75440dd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,6 +14,9 @@ pub use self::{ values::Value, }; +#[cfg(feature = "with-trace-dump")] +pub use cairo_native_runtime as runtime; + mod arch; pub mod cache; mod compiler; @@ -24,11 +27,11 @@ pub mod error; pub mod execution_result; pub mod executor; mod ffi; -mod libfuncs; +pub mod libfuncs; pub mod metadata; pub mod module; pub mod starknet; pub mod starknet_stub; -mod types; +pub mod types; pub mod utils; mod values; diff --git a/src/metadata.rs b/src/metadata.rs index 9a05f369a..b4328d69c 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -24,6 +24,7 @@ pub mod gas; pub mod realloc_bindings; pub mod runtime_bindings; pub mod tail_recursion; +pub mod trace_dump; /// Metadata container. #[cfg_attr(not(feature = "with-debug-utils"), derive(Default))] diff --git a/src/metadata/trace_dump.rs b/src/metadata/trace_dump.rs new file mode 100644 index 000000000..d487a52db --- /dev/null +++ b/src/metadata/trace_dump.rs @@ -0,0 +1,182 @@ +#![cfg(feature = "with-trace-dump")] + +use crate::{error::Result, utils::BlockExt}; +use cairo_lang_sierra::{ + ids::{ConcreteTypeId, VarId}, + program::StatementIdx, +}; +use melior::{ + dialect::{func, llvm, memref}, + ir::{ + attribute::{FlatSymbolRefAttribute, StringAttribute, TypeAttribute}, + r#type::{FunctionType, IntegerType, MemRefType}, + Block, BlockLike, Identifier, Location, Module, Region, Value, + }, + Context, ExecutionEngine, +}; +use std::collections::HashSet; + +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +enum TraceBinding { + State, + Push, + TraceId, +} + +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct TraceDumpMeta { + bindings: HashSet, +} + +impl TraceDumpMeta { + #[allow(clippy::too_many_arguments)] + pub fn build_state( + &mut self, + context: &Context, + module: &Module, + block: &Block, + var_id: &VarId, + value_ty: &ConcreteTypeId, + value_ptr: Value, + location: Location, + ) -> Result<()> { + self.build_trace_id(context, module)?; + if self.bindings.insert(TraceBinding::State) { + module.body().append_operation(func::func( + context, + StringAttribute::new(context, "cairo_native__trace_dump__state"), + TypeAttribute::new( + FunctionType::new( + context, + &[ + IntegerType::new(context, 64).into(), // Trace ID. + IntegerType::new(context, 64).into(), // Var ID. + IntegerType::new(context, 64).into(), // Value type (`ConcreteTypeId`). + llvm::r#type::pointer(context, 0), // Value pointer. + ], + &[], + ) + .into(), + ), + Region::new(), + &[( + Identifier::new(context, "sym_visibility"), + StringAttribute::new(context, "private").into(), + )], + location, + )); + } + + let trace_id = block + .append_op_result(memref::get_global( + context, + "TRACE_DUMP__TRACE_ID", + MemRefType::new(IntegerType::new(context, 64).into(), &[], None, None), + location, + )) + .unwrap(); + let trace_id = block.append_op_result(memref::load(trace_id, &[], location))?; + let var_id = block.const_int(context, location, var_id.id, 64)?; + let value_ty = block.const_int(context, location, value_ty.id, 64)?; + block.append_operation(func::call( + context, + FlatSymbolRefAttribute::new(context, "cairo_native__trace_dump__state"), + &[trace_id, var_id, value_ty, value_ptr], + &[], + location, + )); + + Ok(()) + } + + pub fn build_push( + &mut self, + context: &Context, + module: &Module, + block: &Block, + statement_idx: StatementIdx, + location: Location, + ) -> Result<()> { + self.build_trace_id(context, module)?; + if self.bindings.insert(TraceBinding::Push) { + module.body().append_operation(func::func( + context, + StringAttribute::new(context, "cairo_native__trace_dump__push"), + TypeAttribute::new( + FunctionType::new( + context, + &[ + IntegerType::new(context, 64).into(), // Trace ID. + IntegerType::new(context, 64).into(), // Statement index. + ], + &[], + ) + .into(), + ), + Region::new(), + &[( + Identifier::new(context, "sym_visibility"), + StringAttribute::new(context, "private").into(), + )], + Location::unknown(context), + )); + } + + let trace_id = block + .append_op_result(memref::get_global( + context, + "TRACE_DUMP__TRACE_ID", + MemRefType::new(IntegerType::new(context, 64).into(), &[], None, None), + location, + )) + .unwrap(); + let trace_id = block.append_op_result(memref::load(trace_id, &[], location))?; + let statement_idx = block.const_int(context, location, statement_idx.0, 64)?; + block.append_operation(func::call( + context, + FlatSymbolRefAttribute::new(context, "cairo_native__trace_dump__push"), + &[trace_id, statement_idx], + &[], + location, + )); + + Ok(()) + } + + fn build_trace_id(&mut self, context: &Context, module: &Module) -> Result<()> { + if self.bindings.insert(TraceBinding::TraceId) { + module.body().append_operation(memref::global( + context, + "TRACE_DUMP__TRACE_ID", + None, + MemRefType::new(IntegerType::new(context, 64).into(), &[], None, None), + None, + false, + None, + Location::unknown(context), + )); + } + + Ok(()) + } + + pub fn register_impls(&self, engine: &ExecutionEngine) { + if self.bindings.contains(&TraceBinding::State) { + unsafe { + engine.register_symbol( + "cairo_native__trace_dump__push", + cairo_native_runtime::trace_dump::cairo_native__trace_dump__push as *mut (), + ); + } + } + + if !self.bindings.is_empty() { + unsafe { + engine.register_symbol( + "cairo_native__trace_dump__state", + cairo_native_runtime::trace_dump::cairo_native__trace_dump__state as *mut (), + ); + } + } + } +}