From 76a704efc379fb60ab130cdaa557fee504c7453e Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Wed, 23 Oct 2024 16:56:21 +0200 Subject: [PATCH 01/25] update to cairo 2.9.0-dev --- Cargo.lock | 286 +++++++++++++++++++++++++-------------------- Cargo.toml | 36 +++--- runtime/Cargo.toml | 4 +- 3 files changed, 179 insertions(+), 147 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6033835da..fc95c2314 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -103,9 +103,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.89" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" +checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" [[package]] name = "aquamarine" @@ -118,7 +118,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -310,7 +310,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.79", + "syn 2.0.82", "which", ] @@ -331,7 +331,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -427,9 +427,9 @@ dependencies = [ [[package]] name = "cairo-lang-casm" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd4d6659539ace9649c8e8a7434e51b0c50a7a700111d0a2b967dde220ddff49" +checksum = "e1e0dcdb6358bb639dd729546611bd99bada94c86e3f262c3637855abea9a972" dependencies = [ "cairo-lang-utils", "indoc", @@ -441,9 +441,9 @@ dependencies = [ [[package]] name = "cairo-lang-compiler" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2016966ed29f3a44487fd1bbdb05320fb6ea8ec46201c04c6b222ccb5264e0a" +checksum = "b8657f5a5611f341a85e80ba0b21848fc34bfdf391bfd93df0baf4516c3e4159" dependencies = [ "anyhow", "cairo-lang-defs", @@ -467,18 +467,18 @@ dependencies = [ [[package]] name = "cairo-lang-debug" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c804649297ca417206435ee3e8041d2100cc31ebf4a95bc4b92ed02dc63469" +checksum = "0635aa554d297acefe6a35b495aba2795d0af5b7f97c4ab63829c7d62291ef41" dependencies = [ "cairo-lang-utils", ] [[package]] name = "cairo-lang-defs" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8fbda467ac36f73bb1879e1f741898fc719d6f9239a01cc422e6a023281319b" +checksum = "86b356e1c09898e8b8cfdd9731579d89365a13d8b4f7e717962e0cc7d125b83c" dependencies = [ "cairo-lang-debug", "cairo-lang-diagnostics", @@ -493,9 +493,9 @@ dependencies = [ [[package]] name = "cairo-lang-diagnostics" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c843ef4715e3d21de5388d02206db2506e2d2ec0e80e2629e0ae9900a08b8674" +checksum = "2dfe7c6ff96182da29012b707a3554e34a50f19cc96013ee45b0eb36dd396ec8" dependencies = [ "cairo-lang-debug", "cairo-lang-filesystem", @@ -505,9 +505,9 @@ dependencies = [ [[package]] name = "cairo-lang-eq-solver" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33a416c5871960fb4823160ebef2abc51e0c1b86fef1e97a1ebb2e5f3c3795d3" +checksum = "723d244465309d5409e297b5486d62cbec06f2c47b05044414bb640e3f14caab" dependencies = [ "cairo-lang-utils", "good_lp", @@ -515,9 +515,9 @@ dependencies = [ [[package]] name = "cairo-lang-filesystem" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47189e0cb84b21defd201af4cf24a94c6b0d09f48706cf659c9ffa0def8a7a43" +checksum = "237030772ae5368f19a9247e1f63f753f8ad8de963477166e402f4825c0a141d" dependencies = [ "cairo-lang-debug", "cairo-lang-utils", @@ -526,13 +526,14 @@ dependencies = [ "semver", "serde", "smol_str", + "toml", ] [[package]] name = "cairo-lang-formatter" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6409ff1f4a93ce7c0968d9d857d2a8c03657617a827159d33f978110b718b31d" +checksum = "5b71f0eb3a36a6cb5f7f07843926783c4c17e44c9516b53171727a108782f3eb" dependencies = [ "anyhow", "cairo-lang-diagnostics", @@ -545,15 +546,14 @@ dependencies = [ "itertools 0.12.1", "rust-analyzer-salsa", "serde", - "smol_str", "thiserror", ] [[package]] name = "cairo-lang-lowering" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e224e006c82ef21bd9e243390992de2be25ae6fbbdaa8544067b3f0c31977f1" +checksum = "7d095d78e2f1de499429c95655d6135a3d24c384b36d8de9f84e0aa4e07ee152" dependencies = [ "cairo-lang-debug", "cairo-lang-defs", @@ -568,6 +568,7 @@ dependencies = [ "itertools 0.12.1", "log", "num-bigint", + "num-integer", "num-traits 0.2.19", "rust-analyzer-salsa", "smol_str", @@ -575,9 +576,9 @@ dependencies = [ [[package]] name = "cairo-lang-parser" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb260ba349c2b699639e56f9b64deb969ff01179a0253087e2c8ceec7e32157" +checksum = "bb828af7f948a3ef7fa65de14e3f639daedefb046dfefcad6e3116d2cb0f89a0" dependencies = [ "cairo-lang-diagnostics", "cairo-lang-filesystem", @@ -595,9 +596,9 @@ dependencies = [ [[package]] name = "cairo-lang-plugins" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05a2e500dc8ddea4d25a866d8a839158b0e4c41a6c023f21911e2da252bd91b3" +checksum = "135a600043bf7030eacc6ebf2a609c2364d6ffeb04e1f3c809a2738f6b02c829" dependencies = [ "cairo-lang-defs", "cairo-lang-diagnostics", @@ -614,20 +615,20 @@ dependencies = [ [[package]] name = "cairo-lang-proc-macros" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d72f17373740f242d6995e896b9195c2cedff7e8b14e496afdd16b405039d1fb" +checksum = "ac857ec4b564712f3e16e3314e23cc0787ab1c05cdfee83f1c8f9989a6eee40f" dependencies = [ "cairo-lang-debug", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] name = "cairo-lang-project" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13294f08d2013fcd6e815e7235935680963dec3390e5baf454f33da866fc44b6" +checksum = "23cc37b7f8889cdea631aeea3bcc70d5c86ac8fb1d98aabc83f16283d60f1643" dependencies = [ "cairo-lang-filesystem", "cairo-lang-utils", @@ -639,9 +640,9 @@ dependencies = [ [[package]] name = "cairo-lang-runner" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b9e6a21d92255b92f64c60658b4224dd7d290cde8beea783fadc10fbfcd8c" +checksum = "7474375528ffa7f47e343983d32051898e4e7b05ac0bdc48ee84b1325d8b562a" dependencies = [ "ark-ff", "ark-secp256k1", @@ -655,7 +656,7 @@ dependencies = [ "cairo-lang-sierra-type-size", "cairo-lang-starknet", "cairo-lang-utils", - "cairo-vm", + "cairo-vm 1.0.1", "itertools 0.12.1", "keccak", "num-bigint", @@ -670,9 +671,9 @@ dependencies = [ [[package]] name = "cairo-lang-semantic" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6936215bca75c23e71873998420a3d46c322507a09917ce676c8d39f8c1bd6fe" +checksum = "c560cf4b4a89325d3a9594f490fffee38cf30e0990e808bb927619de9d0c973a" dependencies = [ "cairo-lang-debug", "cairo-lang-defs", @@ -696,9 +697,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "424f55450494e959c1ae26c52a71075767a90f76e3ecca6e81056dd7517e8ba0" +checksum = "8118f55ca7d567bfc60960b445d388564d04bf48335c983b1595cb35f67a01c5" dependencies = [ "anyhow", "cairo-lang-utils", @@ -723,9 +724,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-ap-change" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053dd520e0b9d1c1078d93ea69045f6f334c3d41b4b75db183ab33e32cfd8570" +checksum = "2716ef8d4ce0fb700f83ed3281f3656436570e60249d41c65c79dc1ca27be002" dependencies = [ "cairo-lang-eq-solver", "cairo-lang-sierra", @@ -739,9 +740,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-gas" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a73227867377efc62ebb893cddaa88df3940bf2be5dbdc2f0b00f9edf69288e" +checksum = "24a44da87a35845470c4f4c648225232a15e0875fe809045b6088464491f838b" dependencies = [ "cairo-lang-eq-solver", "cairo-lang-sierra", @@ -755,9 +756,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-generator" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3752cacd475ea089d9a536357804150e693a124e703fcc33a55566d568094b3" +checksum = "15bc5cf9f3965a7030a114dfe3d31d183287fbfbfbf904deaaa2468cadb936aa" dependencies = [ "cairo-lang-debug", "cairo-lang-defs", @@ -779,9 +780,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-to-casm" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7162fb3c93960dfc6d8005b65064e518e3f1ed6102e8981b42ea41879c331184" +checksum = "18b7616f1a3c41c4646094b5abf774e558428e9c1eda5d78d7b0638ec5c264e5" dependencies = [ "assert_matches", "cairo-lang-casm", @@ -800,9 +801,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-type-size" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a51b80c117e2b05a6d300f2e2247892cc99e42e950e79f6085e6ed6cbcb44d12" +checksum = "871077dbc08df5d134dc3975538171c14b266ba405d1298085afdb227216f0a3" dependencies = [ "cairo-lang-sierra", "cairo-lang-utils", @@ -810,9 +811,9 @@ dependencies = [ [[package]] name = "cairo-lang-starknet" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafaabc43f78dfa2f45d935993ba21c05c164bbb3bf277d348847a51e5939a9f" +checksum = "9f21804eb8931d41e258e7a393afc8ee8858308e95b3ed2e9b6b469ef68a6a50" dependencies = [ "anyhow", "cairo-lang-compiler", @@ -840,9 +841,9 @@ dependencies = [ [[package]] name = "cairo-lang-starknet-classes" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "832fd9072ddf4204ca6d227c0238929349f10146bd066a98025d51ac15d27fad" +checksum = "b2496bccd68fa0286b35b72c98439316a3a872ef7ec6d881f0dac90b17997490" dependencies = [ "cairo-lang-casm", "cairo-lang-sierra", @@ -863,9 +864,9 @@ dependencies = [ [[package]] name = "cairo-lang-syntax" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cebe67c0d68f9acf8709d170c1308ca57a778d22f70da38a57f74ae250eee28a" +checksum = "8d77ea2e35d3610098ff13e373fc519aedc6a5096ed8547081aacfc104ef4422" dependencies = [ "cairo-lang-debug", "cairo-lang-filesystem", @@ -879,9 +880,9 @@ dependencies = [ [[package]] name = "cairo-lang-syntax-codegen" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31cef5b4347626e61bad8f070495cd35d637a5cb6744c34d20dd382c7431aff8" +checksum = "6b01d505ab26ca9ce829faf3a8dd097f5d7962d2eb8f136017a260694a6a72e8" dependencies = [ "genco", "xshell", @@ -889,9 +890,9 @@ dependencies = [ [[package]] name = "cairo-lang-test-plugin" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d5f036132e07b7829cb1d61b1ecc02789a70c7d16b2733722a2aca992492bc3" +checksum = "05f83e082c8ebf81295156f13399f880037c749a9f1fc3f55b1be7e49fe124c6" dependencies = [ "anyhow", "cairo-lang-compiler", @@ -916,9 +917,9 @@ dependencies = [ [[package]] name = "cairo-lang-test-utils" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060c61ac4a3ae0428771244ff8db903105f127392b7d725d919fe3fb1ec4132f" +checksum = "eb143a22f5a3510df8c4dec76e17c1e36bbcbddcd7915601f6a51a72418c454f" dependencies = [ "cairo-lang-formatter", "cairo-lang-utils", @@ -929,9 +930,9 @@ dependencies = [ [[package]] name = "cairo-lang-utils" -version = "2.8.4" +version = "2.9.0-dev.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bfc6372538143afad658c853a35bdc9f5210c5cb54e0c8f04ab78e268139466" +checksum = "35df943ebcf8e1db11ee9f4f46f843dde5b71639ca79ea0d8caa7973f91d8b12" dependencies = [ "hashbrown 0.14.5", "indexmap 2.6.0", @@ -944,7 +945,7 @@ dependencies = [ [[package]] name = "cairo-native" -version = "0.2.0-alpha.4" +version = "0.2.0-alpha.5" dependencies = [ "anyhow", "aquamarine", @@ -967,7 +968,7 @@ dependencies = [ "cairo-lang-test-plugin", "cairo-lang-utils", "cairo-native-runtime", - "cairo-vm", + "cairo-vm 2.0.0-rc0", "cc", "clap", "colored", @@ -1006,7 +1007,7 @@ dependencies = [ [[package]] name = "cairo-native-runtime" -version = "0.2.0-alpha.4" +version = "0.2.0-alpha.5" dependencies = [ "cairo-lang-sierra-gas", "itertools 0.13.0", @@ -1022,6 +1023,37 @@ name = "cairo-vm" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58363ad8065ed891e3b14a8191b707677c7c7cb5b9d10030822506786d8d8108" +dependencies = [ + "anyhow", + "bincode", + "bitvec", + "generic-array", + "hashbrown 0.14.5", + "hex", + "keccak", + "lazy_static", + "nom", + "num-bigint", + "num-integer", + "num-prime", + "num-traits 0.2.19", + "rand", + "rust_decimal", + "serde", + "serde_json", + "sha2", + "sha3", + "starknet-crypto", + "starknet-types-core", + "thiserror-no-std", + "zip", +] + +[[package]] +name = "cairo-vm" +version = "2.0.0-rc0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db4375450795765e55bf6c58974b26742a1a3935afd07f996062d7d2e545b4a4" dependencies = [ "anyhow", "ark-ff", @@ -1050,6 +1082,7 @@ dependencies = [ "starknet-crypto", "starknet-types-core", "thiserror-no-std", + "wasm-bindgen", "zip", ] @@ -1080,9 +1113,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.30" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ "jobserver", "libc", @@ -1183,7 +1216,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1406,7 +1439,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1417,7 +1450,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1484,7 +1517,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1494,7 +1527,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1565,7 +1598,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1612,7 +1645,7 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1727,7 +1760,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -1785,7 +1818,7 @@ checksum = "553630feadf7b76442b0849fd25fdf89b860d933623aec9693fed19af0400c78" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -2131,9 +2164,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -2218,9 +2251,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.159" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libloading" @@ -2335,7 +2368,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.79", + "syn 2.0.82", "tblgen-alt", "unindent", ] @@ -2739,12 +2772,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" +checksum = "910d41a655dac3b764f1ade94821093d3610248694320cd072303a8eedcf221d" dependencies = [ "proc-macro2", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -2782,9 +2815,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.87" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -3007,7 +3040,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.79", + "syn 2.0.82", "unicode-ident", ] @@ -3037,7 +3070,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -3163,7 +3196,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -3183,22 +3216,22 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.210" +version = "1.0.213" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.213" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -3209,14 +3242,14 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -3371,7 +3404,7 @@ checksum = "bbc159a1934c7be9761c237333a57febe060ace2bc9e3b337a59a37af206d19f" dependencies = [ "starknet-curve 0.4.2", "starknet-ff", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -3463,9 +3496,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.79" +version = "2.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "83540f837a8afc019423a8edb95b52a8effe46957ee402287f4292fae35be021" dependencies = [ "proc-macro2", "quote", @@ -3532,7 +3565,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -3543,28 +3576,28 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", "test-case-core", ] [[package]] name = "thiserror" -version = "1.0.64" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.64" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -3703,7 +3736,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -3897,35 +3930,34 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", - "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3933,28 +3965,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -4208,7 +4240,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] @@ -4228,7 +4260,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.82", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 86d28cac7..98f60d188 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cairo-native" -version = "0.2.0-alpha.4" +version = "0.2.0-alpha.5" edition = "2021" license = "Apache-2.0" description = "A compiler to convert Cairo's intermediate representation Sierra code to MLIR." @@ -59,12 +59,12 @@ normal = ["aquamarine"] [dependencies] aquamarine = "0.5.0" bumpalo = "3.16.0" -cairo-lang-compiler = "2.8.4" -cairo-lang-defs = "2.8.4" -cairo-lang-filesystem = "2.8.4" -cairo-lang-semantic = "2.8.4" -cairo-lang-sierra = "2.8.4" -cairo-lang-sierra-generator = "2.8.4" +cairo-lang-compiler = "2.9.0-dev.0" +cairo-lang-defs = "2.9.0-dev.0" +cairo-lang-filesystem = "2.9.0-dev.0" +cairo-lang-semantic = "2.9.0-dev.0" +cairo-lang-sierra = "2.9.0-dev.0" +cairo-lang-sierra-generator = "2.9.0-dev.0" educe = "0.5.11" # can't update until https://github.com/magiclen/educe/issues/27 itertools = "0.13.0" lazy_static = "1.5" @@ -86,12 +86,12 @@ utf8_iter = "1.0.4" # CLI dependencies -cairo-lang-sierra-ap-change = "2.8.4" -cairo-lang-sierra-gas = "2.8.4" -cairo-lang-starknet = "2.8.4" -cairo-lang-utils = "2.8.4" -cairo-lang-starknet-classes = "2.8.4" -cairo-native-runtime = { version = "0.2.0-alpha.4", path = "runtime", optional = true } +cairo-lang-sierra-ap-change = "2.9.0-dev.0" +cairo-lang-sierra-gas = "2.9.0-dev.0" +cairo-lang-starknet = "2.9.0-dev.0" +cairo-lang-utils = "2.9.0-dev.0" +cairo-lang-starknet-classes = "2.9.0-dev.0" +cairo-native-runtime = { version = "0.2.0-alpha.5", path = "runtime", optional = true } clap = { version = "4.5.19", features = ["derive"], optional = true } libloading = "0.8.5" tracing-subscriber = { version = "0.3.18", features = [ @@ -101,8 +101,8 @@ tracing-subscriber = { version = "0.3.18", features = [ ], optional = true } serde = { version = "1.0", features = ["derive"] } anyhow = { version = "1.0", optional = true } -cairo-lang-test-plugin = { version = "2.8.4", optional = true } -cairo-lang-runner = { version = "2.8.4", optional = true } +cairo-lang-test-plugin = { version = "2.9.0-dev.0", optional = true } +cairo-lang-runner = { version = "2.9.0-dev.0", optional = true } colored = { version = "2.1.0", optional = true } # needed to interface with cairo-lang-* keccak = "0.1.5" @@ -120,9 +120,9 @@ ark-ff = "0.4.2" num-integer = "0.1.46" [dev-dependencies] -cairo-vm = { version = "1.0.1", features = ["cairo-1-hints"] } -cairo-lang-runner = "2.8.4" -cairo-lang-semantic = { version = "2.8.4", features = ["testing"] } +cairo-vm = { version = "2.0.0-rc0", features = ["cairo-1-hints"] } +cairo-lang-runner = "2.9.0-dev.0" +cairo-lang-semantic = { version = "2.9.0-dev.0", features = ["testing"] } criterion = { version = "0.5.1", features = ["html_reports"] } lambdaworks-math = "0.10.0" pretty_assertions_sorted = "1.2.3" diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index cdf46ad32..c5c19fa3c 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cairo-native-runtime" -version = "0.2.0-alpha.4" +version = "0.2.0-alpha.5" description = "The runtime for cairo-native." edition = "2021" license = "Apache-2.0" @@ -15,7 +15,7 @@ starknet-types-core = { version = "0.1.7", default-features = false, features = "serde", "hash", ] } -cairo-lang-sierra-gas = "2.8.4" +cairo-lang-sierra-gas = "2.9.0-dev.0" starknet-curve = "0.5.1" lazy_static = "1.5.0" rand = "0.8.5" From 88d5e172eec1002ad988b4b7e2b68d5bfe2f8442 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Wed, 23 Oct 2024 17:15:28 +0200 Subject: [PATCH 02/25] compile --- Makefile | 4 ++-- src/bin/cairo-native-test.rs | 18 +++++++++++------- src/debug.rs | 6 ++++++ src/executor.rs | 2 ++ src/libfuncs.rs | 3 +++ src/libfuncs/starknet.rs | 1 + src/types.rs | 10 +++++++++- src/values.rs | 1 + tests/common.rs | 26 +++++++++++++++++++------- 9 files changed, 54 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index 217091874..7c734a499 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ # Environment detection. UNAME := $(shell uname) -CAIRO_2_VERSION = 2.8.4 -SCARB_VERSION = 2.8.4 +CAIRO_2_VERSION = 2.9.0-dev.0 +SCARB_VERSION = 2.9.0-dev.0 # Usage is the default target for newcomers running `make`. .PHONY: usage diff --git a/src/bin/cairo-native-test.rs b/src/bin/cairo-native-test.rs index b69a48b5c..cb39f4f8d 100644 --- a/src/bin/cairo-native-test.rs +++ b/src/bin/cairo-native-test.rs @@ -1,6 +1,7 @@ use anyhow::bail; use cairo_lang_compiler::{ db::RootDatabase, + diagnostics::DiagnosticsReporter, project::{check_compiler_path, setup_project}, }; use cairo_lang_filesystem::cfg::{Cfg, CfgSet}; @@ -83,15 +84,18 @@ fn main() -> anyhow::Result<()> { starknet: args.starknet, add_statements_functions: false, add_statements_code_locations: false, + contract_declarations: None, + contract_crate_ids: None, + executable_crate_ids: None, }; - let build_test_compilation = compile_test_prepared_db( - &db, - test_config, - main_crate_ids.clone(), - test_crate_ids.clone(), - args.allow_warnings, - )?; + let mut diag_reporter = DiagnosticsReporter::stderr().with_crates(&main_crate_ids); + if args.allow_warnings { + diag_reporter = diag_reporter.allow_warnings(); + } + + let build_test_compilation = + compile_test_prepared_db(&db, test_config, test_crate_ids.clone(), diag_reporter)?; let (compiled, filtered_out) = filter_test_cases( build_test_compilation, diff --git a/src/debug.rs b/src/debug.rs index 93c0555b4..0c3799290 100644 --- a/src/debug.rs +++ b/src/debug.rs @@ -24,6 +24,7 @@ use cairo_lang_sierra::extensions::{ nullable::NullableConcreteLibfunc, pedersen::PedersenConcreteLibfunc, poseidon::PoseidonConcreteLibfunc, + range::IntRangeConcreteLibfunc, starknet::{ secp256::{Secp256ConcreteLibfunc, Secp256OpConcreteLibfunc}, testing::TestingConcreteLibfunc, @@ -371,6 +372,7 @@ pub fn libfunc_to_name(value: &CoreConcreteLibfunc) -> &'static str { StarkNetConcreteLibfunc::Sha256ProcessBlock(_) => "sha256_process_block", StarkNetConcreteLibfunc::Sha256StateHandleInit(_) => "sha256_state_handle_init", StarkNetConcreteLibfunc::Sha256StateHandleDigest(_) => "sha256_state_handle_digest", + StarkNetConcreteLibfunc::GetClassHashAt(_) => "get_class_hash_at_syscall", }, CoreConcreteLibfunc::Debug(value) => match value { DebugConcreteLibfunc::Print(_) => "debug_print", @@ -407,5 +409,9 @@ pub fn libfunc_to_name(value: &CoreConcreteLibfunc) -> &'static str { BoundedIntConcreteLibfunc::IsZero(_) => "bounded_int_is_zero", BoundedIntConcreteLibfunc::WrapNonZero(_) => "bounded_int_wrap_non_zero", }, + CoreConcreteLibfunc::IntRange(selector) => match selector { + IntRangeConcreteLibfunc::TryNew(_) => "int_range_try_new", + IntRangeConcreteLibfunc::PopFront(_) => "int_range_pop_front", + }, } } diff --git a/src/executor.rs b/src/executor.rs index 10f8549c7..794737482 100644 --- a/src/executor.rs +++ b/src/executor.rs @@ -575,6 +575,8 @@ fn parse_result( | CoreTypeConcrete::Uint128MulGuarantee(_) | CoreTypeConcrete::Circuit(_) | CoreTypeConcrete::RangeCheck96(_) => todo!(), + // 2.9.0 + CoreTypeConcrete::IntRange(_) => todo!(), } } diff --git a/src/libfuncs.rs b/src/libfuncs.rs index dcec662c2..47e788c7f 100644 --- a/src/libfuncs.rs +++ b/src/libfuncs.rs @@ -229,6 +229,9 @@ impl LibfuncBuilder for CoreConcreteLibfunc { Self::BoundedInt(info) => { self::bounded_int::build(context, registry, entry, location, helper, metadata, info) } + Self::IntRange(_info) => { + todo!("2.9.0") + } } } diff --git a/src/libfuncs/starknet.rs b/src/libfuncs/starknet.rs index c4ca0552d..2bb72bb7a 100644 --- a/src/libfuncs/starknet.rs +++ b/src/libfuncs/starknet.rs @@ -144,6 +144,7 @@ pub fn build<'ctx, 'this>( StarkNetConcreteLibfunc::Sha256StateHandleDigest(info) => build_sha256_state_handle_digest( context, registry, entry, location, helper, metadata, info, ), + StarkNetConcreteLibfunc::GetClassHashAt(_) => todo!("2.9.0"), #[cfg(feature = "with-cheatcode")] StarkNetConcreteLibfunc::Testing(TestingConcreteLibfunc::Cheatcode(info)) => { self::testing::build(context, registry, entry, location, helper, metadata, info) diff --git a/src/types.rs b/src/types.rs index bf1dbb8bf..e150f3c24 100644 --- a/src/types.rs +++ b/src/types.rs @@ -429,6 +429,7 @@ impl TypeBuilder for CoreTypeConcrete { metadata, WithSelf::new(self_ty, info), ), + Self::IntRange(_) => todo!("2.9.0"), } } @@ -532,7 +533,9 @@ impl TypeBuilder for CoreTypeConcrete { | CoreTypeConcrete::StarkNet(StarkNetTypeConcrete::Sha256StateHandle(_)) => todo!(), CoreTypeConcrete::Coupon(_) => false, - CoreTypeConcrete::Circuit(info) => circuit::is_complex(info) + CoreTypeConcrete::Circuit(info) => circuit::is_complex(info), + + CoreTypeConcrete::IntRange(_info) => todo!("2.9.0") }) } @@ -610,6 +613,8 @@ impl TypeBuilder for CoreTypeConcrete { } CoreTypeConcrete::Span(_) => todo!(), CoreTypeConcrete::Circuit(info) => circuit::is_zst(info), + + CoreTypeConcrete::IntRange(_) => todo!("2.9.0"), }) } @@ -715,6 +720,8 @@ impl TypeBuilder for CoreTypeConcrete { CoreTypeConcrete::Coupon(_) => Layout::new::<()>(), CoreTypeConcrete::RangeCheck96(_) => get_integer_layout(64), CoreTypeConcrete::Circuit(info) => circuit::layout(registry, info)?, + + CoreTypeConcrete::IntRange(_info) => todo!("2.9.0"), } .pad_to_align()) } @@ -726,6 +733,7 @@ impl TypeBuilder for CoreTypeConcrete { // Right now, only enums and other structures which may end up passing a flattened enum as // arguments. Ok(match self { + CoreTypeConcrete::IntRange(_) => todo!("2.9.0"), CoreTypeConcrete::Array(_) => false, CoreTypeConcrete::Bitwise(_) => false, CoreTypeConcrete::Box(_) => false, diff --git a/src/values.rs b/src/values.rs index 213360111..7153c0244 100644 --- a/src/values.rs +++ b/src/values.rs @@ -802,6 +802,7 @@ impl Value { CoreTypeConcrete::Coupon(_) | CoreTypeConcrete::Circuit(_) | CoreTypeConcrete::RangeCheck96(_) => todo!(), + CoreTypeConcrete::IntRange(_) => todo!("2.9.0"), } }) } diff --git a/tests/common.rs b/tests/common.rs index 649499276..1b146ca09 100644 --- a/tests/common.rs +++ b/tests/common.rs @@ -21,13 +21,16 @@ use cairo_lang_sierra::{ program::Program, program_registry::ProgramRegistry, }; -use cairo_lang_sierra_generator::replace_ids::DebugReplacer; +use cairo_lang_sierra_generator::replace_ids::{DebugReplacer, SierraIdReplacer}; use cairo_lang_starknet::{ - compile::compile_contract_in_prepared_db, contract::get_contracts_info, starknet_plugin_suite, + compile::compile_contract_in_prepared_db, + contract::{find_contracts, get_contracts_info}, + starknet_plugin_suite, }; use cairo_lang_starknet_classes::{ casm_contract_class::CasmContractClass, contract_class::ContractClass, }; +use cairo_lang_utils::Upcast; use cairo_native::{ context::NativeContext, execution_result::{ContractExecutionResult, ExecutionResult}, @@ -128,13 +131,18 @@ pub fn load_cairo_str(program_str: &str) -> (String, Program, SierraCasmRunner) }, ) .unwrap(); - let program = sierra_program_with_dbg.program; + let mut program = sierra_program_with_dbg.program; let module_name = program_file.path().with_extension(""); let module_name = module_name.file_name().unwrap().to_str().unwrap(); let replacer = DebugReplacer { db: &db }; - let contracts_info = get_contracts_info(&db, main_crate_ids, &replacer).unwrap(); + replacer.enrich_function_names(&mut program); + + let contracts = find_contracts((db).upcast(), &main_crate_ids); + let contracts_info = get_contracts_info(&db, contracts, &replacer).unwrap(); + + let program = replacer.apply(&program); let runner = SierraCasmRunner::new( program.clone(), @@ -165,13 +173,17 @@ pub fn load_cairo_path(program_path: &str) -> (String, Program, SierraCasmRunner }, ) .unwrap(); - let program = sierra_program_with_dbg.program; + let mut program = sierra_program_with_dbg.program; let module_name = program_file.with_extension(""); let module_name = module_name.file_name().unwrap().to_str().unwrap(); let replacer = DebugReplacer { db: &db }; - let contracts_info = get_contracts_info(&db, main_crate_ids, &replacer).unwrap(); + replacer.enrich_function_names(&mut program); + let contracts = find_contracts((db).upcast(), &main_crate_ids); + let contracts_info = get_contracts_info(&db, contracts, &replacer).unwrap(); + + let program = replacer.apply(&program); let runner = SierraCasmRunner::new( program.clone(), @@ -283,7 +295,7 @@ pub fn run_vm_contract( .expect("failed to extract program from casm contract"); // Initialize runner and builtins - let mut runner = CairoRunner::new(&program, LayoutName::all_cairo, false, false) + let mut runner = CairoRunner::new(&program, LayoutName::all_cairo, None, false, false) .expect("failed to build runner"); let program_builtins = contract From 564f7e2136e53a1e43033aefa3836b4dc591ffc1 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Wed, 23 Oct 2024 17:19:36 +0200 Subject: [PATCH 03/25] avoid semver auto update --- Cargo.lock | 4 ++-- Cargo.toml | 4 ++-- runtime/Cargo.toml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fc95c2314..5db636af8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -945,7 +945,7 @@ dependencies = [ [[package]] name = "cairo-native" -version = "0.2.0-alpha.5" +version = "0.2.1-alpha.0" dependencies = [ "anyhow", "aquamarine", @@ -1007,7 +1007,7 @@ dependencies = [ [[package]] name = "cairo-native-runtime" -version = "0.2.0-alpha.5" +version = "0.2.1-alpha.0" dependencies = [ "cairo-lang-sierra-gas", "itertools 0.13.0", diff --git a/Cargo.toml b/Cargo.toml index 98f60d188..b94a537bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cairo-native" -version = "0.2.0-alpha.5" +version = "0.2.1-alpha.0" edition = "2021" license = "Apache-2.0" description = "A compiler to convert Cairo's intermediate representation Sierra code to MLIR." @@ -91,7 +91,7 @@ cairo-lang-sierra-gas = "2.9.0-dev.0" cairo-lang-starknet = "2.9.0-dev.0" cairo-lang-utils = "2.9.0-dev.0" cairo-lang-starknet-classes = "2.9.0-dev.0" -cairo-native-runtime = { version = "0.2.0-alpha.5", path = "runtime", optional = true } +cairo-native-runtime = { version = "0.2.1-alpha.0", path = "runtime", optional = true } clap = { version = "4.5.19", features = ["derive"], optional = true } libloading = "0.8.5" tracing-subscriber = { version = "0.3.18", features = [ diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index c5c19fa3c..38bcc3097 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cairo-native-runtime" -version = "0.2.0-alpha.5" +version = "0.2.1-alpha.0" description = "The runtime for cairo-native." edition = "2021" license = "Apache-2.0" From 83fdd99219c9dc528f923f1bfb69078e3fa56001 Mon Sep 17 00:00:00 2001 From: Edgar Date: Thu, 24 Oct 2024 14:29:35 +0200 Subject: [PATCH 04/25] Implement get_class_hash_at syscall (#880) * implement get_class_hash_at syscall * fix --- Makefile | 2 +- examples/erc20.rs | 8 + examples/starknet.rs | 8 + src/libfuncs/starknet.rs | 191 ++++++++++++++++++- src/starknet.rs | 45 ++++- src/starknet_stub.rs | 8 + tests/tests/starknet/programs/syscalls.cairo | 7 +- tests/tests/starknet/secp256.rs | 8 + tests/tests/starknet/syscalls.rs | 28 +++ 9 files changed, 300 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 7c734a499..15d4ae553 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ UNAME := $(shell uname) CAIRO_2_VERSION = 2.9.0-dev.0 -SCARB_VERSION = 2.9.0-dev.0 +SCARB_VERSION = 2.8.4 # Usage is the default target for newcomers running `make`. .PHONY: usage diff --git a/examples/erc20.rs b/examples/erc20.rs index 76917c32e..b466251fc 100644 --- a/examples/erc20.rs +++ b/examples/erc20.rs @@ -274,6 +274,14 @@ impl StarknetSyscallHandler for SyscallHandler { ) -> SyscallResult<()> { unimplemented!() } + + fn get_class_hash_at( + &mut self, + _contract_address: Felt, + _remaining_gas: &mut u128, + ) -> SyscallResult { + todo!() + } } fn main() { diff --git a/examples/starknet.rs b/examples/starknet.rs index 28f987041..a2d8ceb16 100644 --- a/examples/starknet.rs +++ b/examples/starknet.rs @@ -405,6 +405,14 @@ impl StarknetSyscallHandler for SyscallHandler { ) -> SyscallResult<()> { unimplemented!() } + + fn get_class_hash_at( + &mut self, + _contract_address: Felt, + _remaining_gas: &mut u128, + ) -> SyscallResult { + todo!() + } } fn main() { diff --git a/src/libfuncs/starknet.rs b/src/libfuncs/starknet.rs index 2bb72bb7a..0759f0d0b 100644 --- a/src/libfuncs/starknet.rs +++ b/src/libfuncs/starknet.rs @@ -144,7 +144,9 @@ pub fn build<'ctx, 'this>( StarkNetConcreteLibfunc::Sha256StateHandleDigest(info) => build_sha256_state_handle_digest( context, registry, entry, location, helper, metadata, info, ), - StarkNetConcreteLibfunc::GetClassHashAt(_) => todo!("2.9.0"), + StarkNetConcreteLibfunc::GetClassHashAt(info) => { + build_get_class_hash_at(context, registry, entry, location, helper, metadata, info) + } #[cfg(feature = "with-cheatcode")] StarkNetConcreteLibfunc::Testing(TestingConcreteLibfunc::Cheatcode(info)) => { self::testing::build(context, registry, entry, location, helper, metadata, info) @@ -3137,6 +3139,193 @@ pub fn build_sha256_process_block_syscall<'ctx, 'this>( Ok(()) } +pub fn build_get_class_hash_at<'ctx, 'this>( + context: &'ctx Context, + registry: &ProgramRegistry, + entry: &'this Block<'ctx>, + location: Location<'ctx>, + helper: &LibfuncHelper<'ctx, 'this>, + metadata: &mut MetadataStorage, + info: &SignatureOnlyConcreteLibfunc, +) -> Result<()> { + // Extract self pointer. + let ptr = entry.load( + context, + location, + entry.argument(1)?.into(), + llvm::r#type::pointer(context, 0), + )?; + + // Allocate space for the return value. + let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = + crate::types::r#enum::get_type_for_variants( + context, + helper, + registry, + metadata, + &[ + info.branch_signatures()[0].vars[2].ty.clone(), + info.branch_signatures()[1].vars[2].ty.clone(), + ], + )?; + + let result_ptr = helper.init_block().alloca1( + context, + location, + llvm::r#type::r#struct( + context, + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + result_layout.align(), + )?; + + // Allocate space and write the current gas. + let gas_builtin_ptr = helper.init_block().alloca1( + context, + location, + IntegerType::new(context, 128).into(), + get_integer_layout(128).align(), + )?; + entry.store( + context, + location, + gas_builtin_ptr, + entry.argument(0)?.into(), + )?; + + // Allocate `contract_address` argument and write the value. + let contract_address_ptr = helper.init_block().alloca_int(context, location, 252)?; + entry.store( + context, + location, + contract_address_ptr, + entry.argument(2)?.into(), + )?; + + // Extract function pointer. + let fn_ptr = entry.append_op_result(llvm::get_element_ptr( + context, + entry.argument(1)?.into(), + DenseI32ArrayAttribute::new( + context, + &[StarknetSyscallHandlerCallbacks::<()>::GET_CLASS_HASH_AT.try_into()?], + ), + llvm::r#type::pointer(context, 0), + llvm::r#type::pointer(context, 0), + location, + ))?; + let fn_ptr = entry.load(context, location, fn_ptr, llvm::r#type::pointer(context, 0))?; + + entry.append_operation( + OperationBuilder::new("llvm.call", location) + .add_operands(&[ + fn_ptr, + result_ptr, + ptr, + gas_builtin_ptr, + contract_address_ptr, + ]) + .build()?, + ); + + let result = entry.load( + context, + location, + result_ptr, + llvm::r#type::r#struct( + context, + &[ + result_tag_ty, + llvm::r#type::array( + IntegerType::new(context, 8).into(), + (result_layout.size() - 1).try_into()?, + ), + ], + false, + ), + )?; + let result_tag = entry.extract_value( + context, + location, + result, + IntegerType::new(context, 1).into(), + 0, + )?; + + let payload_ok = { + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[0].0)? + }; + let payload_err = { + let ptr = entry.append_op_result( + OperationBuilder::new("llvm.getelementptr", location) + .add_attributes(&[ + ( + Identifier::new(context, "rawConstantIndices"), + DenseI32ArrayAttribute::new( + context, + &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], + ) + .into(), + ), + ( + Identifier::new(context, "elem_type"), + TypeAttribute::new(IntegerType::new(context, 8).into()).into(), + ), + ]) + .add_operands(&[result_ptr]) + .add_results(&[llvm::r#type::pointer(context, 0)]) + .build()?, + )?; + entry.load(context, location, ptr, variant_tys[1].0)? + }; + + let remaining_gas = entry.load( + context, + location, + gas_builtin_ptr, + IntegerType::new(context, 128).into(), + )?; + + entry.append_operation(helper.cond_br( + context, + result_tag, + [1, 0], + [ + &[remaining_gas, entry.argument(1)?.into(), payload_err], + &[remaining_gas, entry.argument(1)?.into(), payload_ok], + ], + location, + )); + Ok(()) +} + #[cfg(test)] mod test { use crate::utils::test::{jit_enum, jit_struct, load_cairo, run_program_assert_output}; diff --git a/src/starknet.rs b/src/starknet.rs index 5371e0364..994b386d9 100644 --- a/src/starknet.rs +++ b/src/starknet.rs @@ -325,6 +325,12 @@ pub trait StarknetSyscallHandler { remaining_gas: &mut u128, ) -> SyscallResult<()>; + fn get_class_hash_at( + &mut self, + contract_address: Felt, + remaining_gas: &mut u128, + ) -> SyscallResult; + #[cfg(feature = "with-cheatcode")] fn cheatcode(&mut self, _selector: Felt, _input: &[Felt]) -> Vec { unimplemented!(); @@ -525,6 +531,14 @@ impl StarknetSyscallHandler for DummySyscallHandler { ) -> SyscallResult<()> { unimplemented!() } + + fn get_class_hash_at( + &mut self, + _contract_address: Felt, + _remaining_gas: &mut u128, + ) -> SyscallResult { + unimplemented!() + } } // TODO: Move to the correct place or remove if unused. @@ -801,6 +815,12 @@ pub(crate) mod handler { state: *mut [u32; 8], block: &[u32; 16], ), + get_class_hash_at: extern "C" fn( + result_ptr: &mut SyscallResultAbi, + ptr: &mut T, + gas: &mut u128, + contract_address: &Felt252Abi, + ), // testing syscalls #[cfg(feature = "with-cheatcode")] pub cheatcode: extern "C" fn( @@ -841,7 +861,10 @@ pub(crate) mod handler { pub const SECP256R1_GET_POINT_FROM_X: usize = field_offset!(Self, secp256r1_get_point_from_x) >> 3; pub const SECP256R1_GET_XY: usize = field_offset!(Self, secp256r1_get_xy) >> 3; + pub const SHA256_PROCESS_BLOCK: usize = field_offset!(Self, sha256_process_block) >> 3; + + pub const GET_CLASS_HASH_AT: usize = field_offset!(Self, get_class_hash_at) >> 3; } #[allow(unused_variables)] @@ -875,6 +898,7 @@ pub(crate) mod handler { secp256r1_get_point_from_x: Self::wrap_secp256r1_get_point_from_x, secp256r1_get_xy: Self::wrap_secp256r1_get_xy, sha256_process_block: Self::wrap_sha256_process_block, + get_class_hash_at: Self::wrap_get_class_hash_at, #[cfg(feature = "with-cheatcode")] cheatcode: Self::wrap_cheatcode, } @@ -1120,8 +1144,6 @@ pub(crate) mod handler { }; } - // TODO: change all from_bytes_be to from_bytes_ne when added and undo byte swapping. - extern "C" fn wrap_deploy( result_ptr: &mut SyscallResultAbi<(Felt252Abi, ArrayAbi)>, ptr: &mut T, @@ -1636,6 +1658,25 @@ pub(crate) mod handler { Err(e) => Self::wrap_error(&e), }; } + + extern "C" fn wrap_get_class_hash_at( + result_ptr: &mut SyscallResultAbi, + ptr: &mut T, + gas: &mut u128, + contract_address: &Felt252Abi, + ) { + let result = ptr.get_class_hash_at(contract_address.into(), gas); + + *result_ptr = match result { + Ok(x) => SyscallResultAbi { + ok: ManuallyDrop::new(SyscallResultAbiOk { + tag: 0u8, + payload: ManuallyDrop::new(Felt252Abi(x.to_bytes_le())), + }), + }, + Err(e) => Self::wrap_error(&e), + }; + } } } diff --git a/src/starknet_stub.rs b/src/starknet_stub.rs index bf25d22c1..77e095fe5 100644 --- a/src/starknet_stub.rs +++ b/src/starknet_stub.rs @@ -647,6 +647,14 @@ impl StarknetSyscallHandler for &mut StubSyscallHandler { sha2::compress256(state, &[data_as_bytes]); Ok(()) } + + fn get_class_hash_at( + &mut self, + contract_address: Felt, + _remaining_gas: &mut u128, + ) -> SyscallResult { + Ok(contract_address) + } } #[cfg(test)] diff --git a/tests/tests/starknet/programs/syscalls.cairo b/tests/tests/starknet/programs/syscalls.cairo index c57362bc4..72d6d5266 100644 --- a/tests/tests/starknet/programs/syscalls.cairo +++ b/tests/tests/starknet/programs/syscalls.cairo @@ -4,10 +4,11 @@ use core::starknet::{ keccak_syscall, library_call_syscall, replace_class_syscall, send_message_to_l1_syscall, storage_address_try_from_felt252, storage_read_syscall, storage_write_syscall, SyscallResult, - testing::cheatcode, + testing::cheatcode, class_hash::ClassHash }; use core::starknet::syscalls::get_execution_info_syscall; use core::starknet::syscalls::get_execution_info_v2_syscall; +use core::starknet::syscalls::get_class_hash_at_syscall; use core::sha256::{sha256_state_handle_init, sha256_state_handle_digest, SHA256_INITIAL_STATE}; use core::box::BoxTrait; use core::starknet::SyscallResultTrait; @@ -16,6 +17,10 @@ fn get_block_hash() -> SyscallResult { get_block_hash_syscall(0) } +fn get_class_hash_at() -> SyscallResult { + get_class_hash_at_syscall(contract_address_const::<2>()) +} + fn get_execution_info() -> SyscallResult> { get_execution_info_syscall() } diff --git a/tests/tests/starknet/secp256.rs b/tests/tests/starknet/secp256.rs index 28a8f9ce6..f98bb5a38 100644 --- a/tests/tests/starknet/secp256.rs +++ b/tests/tests/starknet/secp256.rs @@ -256,6 +256,14 @@ impl StarknetSyscallHandler for &mut SyscallHandler { ) -> SyscallResult<()> { unimplemented!() } + + fn get_class_hash_at( + &mut self, + _contract_address: Felt, + _remaining_gas: &mut u128, + ) -> SyscallResult { + unimplemented!() + } } lazy_static! { diff --git a/tests/tests/starknet/syscalls.rs b/tests/tests/starknet/syscalls.rs index fc52ee5f0..6e3bbc5c9 100644 --- a/tests/tests/starknet/syscalls.rs +++ b/tests/tests/starknet/syscalls.rs @@ -502,6 +502,14 @@ impl StarknetSyscallHandler for SyscallHandler { ) -> SyscallResult<()> { Ok(()) } + + fn get_class_hash_at( + &mut self, + contract_address: Felt, + _remaining_gas: &mut u128, + ) -> SyscallResult { + Ok(contract_address) + } } lazy_static! { @@ -1200,3 +1208,23 @@ fn sha256_process() { }, ); } + +#[test] +fn get_class_hash_at() { + let result = run_native_program( + &SYSCALLS_PROGRAM, + "get_class_hash_at", + &[], + Some(u128::MAX), + Some(SyscallHandler::new()), + ); + + assert_eq_sorted!( + result.return_value, + Value::Enum { + tag: 0, + value: Box::new(Value::Felt252(2.into())), + debug_name: None, + }, + ); +} From d9358fe06a61b98cb92136d57393a5f18de6297f Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Thu, 24 Oct 2024 16:17:27 +0200 Subject: [PATCH 05/25] int range --- src/bin/utils/mod.rs | 1 + src/libfuncs.rs | 7 +- src/libfuncs/int_range.rs | 181 ++++++++++++++++++++++++++++++++++++++ src/types.rs | 23 +++-- src/types/int_range.rs | 46 ++++++++++ src/values.rs | 64 +++++++++++++- 6 files changed, 313 insertions(+), 9 deletions(-) create mode 100644 src/libfuncs/int_range.rs create mode 100644 src/types/int_range.rs diff --git a/src/bin/utils/mod.rs b/src/bin/utils/mod.rs index fc145c5b1..b4cce9a1f 100644 --- a/src/bin/utils/mod.rs +++ b/src/bin/utils/mod.rs @@ -178,6 +178,7 @@ fn jitvalue_to_felt(value: &Value) -> Vec { vec![x.lo.into(), x.hi.into(), y.lo.into(), y.hi.into()] } Value::Null => vec![0.into()], + Value::IntRange { x, y } => [jitvalue_to_felt(x), jitvalue_to_felt(y)].concat(), } } diff --git a/src/libfuncs.rs b/src/libfuncs.rs index 47e788c7f..6fdb4f508 100644 --- a/src/libfuncs.rs +++ b/src/libfuncs.rs @@ -39,6 +39,7 @@ mod felt252_dict; mod felt252_dict_entry; mod function_call; mod gas; +mod int_range; mod mem; mod nullable; mod pedersen; @@ -229,9 +230,9 @@ impl LibfuncBuilder for CoreConcreteLibfunc { Self::BoundedInt(info) => { self::bounded_int::build(context, registry, entry, location, helper, metadata, info) } - Self::IntRange(_info) => { - todo!("2.9.0") - } + Self::IntRange(selector) => self::int_range::build( + context, registry, entry, location, helper, metadata, selector, + ), } } diff --git a/src/libfuncs/int_range.rs b/src/libfuncs/int_range.rs new file mode 100644 index 000000000..38e337bd7 --- /dev/null +++ b/src/libfuncs/int_range.rs @@ -0,0 +1,181 @@ +//! # Int range libfuncs + +use super::LibfuncHelper; +use crate::{ + error::Result, + metadata::MetadataStorage, + types::TypeBuilder, + utils::{BlockExt, ProgramRegistryExt}, +}; +use cairo_lang_sierra::{ + extensions::{ + core::{CoreLibfunc, CoreType}, + lib_func::SignatureOnlyConcreteLibfunc, + range::IntRangeConcreteLibfunc, + ConcreteLibfunc, + }, + program_registry::ProgramRegistry, +}; +use melior::{ + dialect::{ + arith::{self, CmpiPredicate}, + ods, + }, + ir::{Block, Location}, + Context, +}; +use num_bigint::BigInt; + +/// Select and call the correct libfunc builder function from the selector. +pub fn build<'ctx, 'this>( + context: &'ctx Context, + registry: &ProgramRegistry, + entry: &'this Block<'ctx>, + location: Location<'ctx>, + helper: &LibfuncHelper<'ctx, 'this>, + metadata: &mut MetadataStorage, + selector: &IntRangeConcreteLibfunc, +) -> Result<()> { + match selector { + IntRangeConcreteLibfunc::TryNew(info) => { + build_int_range_try_new(context, registry, entry, location, helper, metadata, info) + } + IntRangeConcreteLibfunc::PopFront(info) => { + build_int_range_pop_front(context, registry, entry, location, helper, metadata, info) + } + } +} + +/// Generate MLIR operations for the `int_range_try_new` libfunc. +pub fn build_int_range_try_new<'ctx, 'this>( + context: &'ctx Context, + registry: &ProgramRegistry, + entry: &'this Block<'ctx>, + location: Location<'ctx>, + helper: &LibfuncHelper<'ctx, 'this>, + metadata: &mut MetadataStorage, + info: &SignatureOnlyConcreteLibfunc, +) -> Result<()> { + let range_check = entry.argument(0)?.into(); + let x = entry.argument(1)?.into(); + let y = entry.argument(2)?.into(); + let range_ty = registry.build_type( + context, + helper, + registry, + metadata, + &info.branch_signatures()[0].vars[1].ty, + )?; + let inner = registry.get_type(&info.param_signatures()[1].ty)?; + // to know if it is signed + let inner_range = inner.integer_range(registry)?; + + let is_valid = if inner_range.lower < BigInt::ZERO { + entry.append_op_result(arith::cmpi(context, CmpiPredicate::Sle, x, y, location))? + } else { + entry.append_op_result(arith::cmpi(context, CmpiPredicate::Ule, x, y, location))? + }; + + let range = + entry.append_op_result(ods::llvm::mlir_undef(context, range_ty, location).into())?; + + // if the range is not valid, return the empty range [y, y) + let x_val = entry.append_op_result(arith::select(is_valid, x, y, location))?; + let range = entry.insert_values(context, location, range, &[x_val, y])?; + + entry.append_operation(helper.cond_br( + context, + is_valid, + [0, 1], + [&[range_check, range], &[range_check, range]], + location, + )); + Ok(()) +} + +/// Generate MLIR operations for the `int_range_pop_front` libfunc. +pub fn build_int_range_pop_front<'ctx, 'this>( + context: &'ctx Context, + registry: &ProgramRegistry, + entry: &'this Block<'ctx>, + location: Location<'ctx>, + helper: &LibfuncHelper<'ctx, 'this>, + metadata: &mut MetadataStorage, + info: &SignatureOnlyConcreteLibfunc, +) -> Result<()> { + let range = entry.argument(0)?.into(); + + let inner_ty = registry.build_type( + context, + helper, + registry, + metadata, + &info.branch_signatures()[1].vars[1].ty, + )?; + + let inner = registry.get_type(&info.branch_signatures()[1].vars[1].ty)?; + + let x = entry.extract_value(context, location, range, inner_ty, 0)?; + let k1 = entry.const_int_from_type(context, location, 1, inner_ty)?; + let x_p_1 = entry.append_op_result(arith::addi(x, k1, location))?; + let y = entry.extract_value(context, location, range, inner_ty, 1)?; + + // to know if it is signed + let inner_range = inner.integer_range(registry)?; + + let is_valid = if inner_range.lower < BigInt::ZERO { + entry.append_op_result(arith::cmpi(context, CmpiPredicate::Slt, x, y, location))? + } else { + entry.append_op_result(arith::cmpi(context, CmpiPredicate::Ult, x, y, location))? + }; + let range = entry.insert_value(context, location, range, x_p_1, 0)?; + + entry.append_operation(helper.cond_br( + context, + is_valid, + [1, 0], // failure, success + [&[range, x], &[]], + location, + )); + Ok(()) +} + +#[cfg(test)] +mod test { + use crate::{ + utils::test::{jit_enum, jit_struct, load_cairo, run_program_assert_output}, + values::Value, + }; + use cairo_lang_sierra::program::Program; + use lazy_static::lazy_static; + + lazy_static! { + static ref INT_RANGE_TRY_NEW: (String, Program) = load_cairo! { + #[derive(Copy, Drop)] + pub extern type IntRange; + pub extern fn int_range_try_new( + x: T, y: T + ) -> Result, IntRange> implicits(core::RangeCheck) nopanic; + + fn run_test(lhs: u64, rhs: u64) -> IntRange { + int_range_try_new(lhs, rhs).unwrap() + } + }; + } + + #[test] + fn int_range_try_new() { + run_program_assert_output( + &INT_RANGE_TRY_NEW, + "run_test", + &[2u64.into(), 4u64.into()], + jit_enum!( + 0, + jit_struct!(Value::IntRange { + x: Box::new(2u64.into()), + y: Box::new(4u64.into()), + }) + ), + ); + } +} diff --git a/src/types.rs b/src/types.rs index e150f3c24..523b2fcd0 100644 --- a/src/types.rs +++ b/src/types.rs @@ -44,6 +44,7 @@ mod felt252; mod felt252_dict; mod felt252_dict_entry; mod gas_builtin; +mod int_range; mod non_zero; mod nullable; mod pedersen; @@ -429,7 +430,13 @@ impl TypeBuilder for CoreTypeConcrete { metadata, WithSelf::new(self_ty, info), ), - Self::IntRange(_) => todo!("2.9.0"), + Self::IntRange(info) => self::int_range::build( + context, + module, + registry, + metadata, + WithSelf::new(self_ty, info), + ), } } @@ -535,7 +542,7 @@ impl TypeBuilder for CoreTypeConcrete { CoreTypeConcrete::Circuit(info) => circuit::is_complex(info), - CoreTypeConcrete::IntRange(_info) => todo!("2.9.0") + CoreTypeConcrete::IntRange(_info) => false }) } @@ -614,7 +621,10 @@ impl TypeBuilder for CoreTypeConcrete { CoreTypeConcrete::Span(_) => todo!(), CoreTypeConcrete::Circuit(info) => circuit::is_zst(info), - CoreTypeConcrete::IntRange(_) => todo!("2.9.0"), + CoreTypeConcrete::IntRange(info) => { + let type_info = registry.get_type(&info.ty)?; + type_info.is_zst(registry)? + } }) } @@ -721,7 +731,10 @@ impl TypeBuilder for CoreTypeConcrete { CoreTypeConcrete::RangeCheck96(_) => get_integer_layout(64), CoreTypeConcrete::Circuit(info) => circuit::layout(registry, info)?, - CoreTypeConcrete::IntRange(_info) => todo!("2.9.0"), + CoreTypeConcrete::IntRange(info) => { + let inner = registry.get_type(&info.ty)?.layout(registry)?; + inner.extend(inner).unwrap().0 + } } .pad_to_align()) } @@ -733,7 +746,7 @@ impl TypeBuilder for CoreTypeConcrete { // Right now, only enums and other structures which may end up passing a flattened enum as // arguments. Ok(match self { - CoreTypeConcrete::IntRange(_) => todo!("2.9.0"), + CoreTypeConcrete::IntRange(_) => false, CoreTypeConcrete::Array(_) => false, CoreTypeConcrete::Bitwise(_) => false, CoreTypeConcrete::Box(_) => false, diff --git a/src/types/int_range.rs b/src/types/int_range.rs new file mode 100644 index 000000000..11d901663 --- /dev/null +++ b/src/types/int_range.rs @@ -0,0 +1,46 @@ +//! # Int range of type T +//! +//! A range [x, y) where x <= y +//! +//! ## Layout +//! +//! A struct with 2 fields of type T +//! +//! ``` +//! #[repr(transparent)] +//! pub struct NonZero(pub T); +//! ``` + +use super::WithSelf; +use crate::{error::Result, metadata::MetadataStorage, utils::ProgramRegistryExt}; +use cairo_lang_sierra::{ + extensions::{ + core::{CoreLibfunc, CoreType}, + types::InfoAndTypeConcreteType, + }, + program_registry::ProgramRegistry, +}; +use melior::{ + ir::{Module, Type}, + Context, +}; + +/// Build the MLIR type. +/// +/// Check out [the module](self) for more info. +pub fn build<'ctx>( + context: &'ctx Context, + module: &Module<'ctx>, + registry: &ProgramRegistry, + metadata: &mut MetadataStorage, + info: WithSelf, +) -> Result> { + // TODO: Can its inner type require dup or drop? probably not since they are integers + let inner = registry.build_type(context, module, registry, metadata, &info.ty)?; + + Ok(melior::dialect::llvm::r#type::r#struct( + context, + &[inner, inner], + false, + )) +} diff --git a/src/values.rs b/src/values.rs index 7153c0244..b5fdbc472 100644 --- a/src/values.rs +++ b/src/values.rs @@ -76,6 +76,10 @@ pub enum Value { #[serde(with = "range_serde")] range: Range, }, + IntRange { + x: Box, + y: Box, + }, /// Used as return value for Nullables that are null. Null, } @@ -511,6 +515,36 @@ impl Value { Self::Null => { unimplemented!("null is meant as return value for nullable for now") } + Self::IntRange { x, y } => { + if let CoreTypeConcrete::IntRange(info) = Self::resolve_type(ty, registry)? { + let inner = registry.get_type(&info.ty)?; + let inner_layout = inner.layout(registry)?; + + let mut data = Vec::with_capacity(2); + + let member_ptr = x.to_ptr(arena, registry, &info.ty)?; + data.push((inner_layout, 0, member_ptr)); + + let (struct_layout, offset) = inner_layout.extend(inner_layout)?; + + let member_ptr = y.to_ptr(arena, registry, &info.ty)?; + data.push((inner_layout, offset, member_ptr)); + + let ptr = arena.alloc_layout(struct_layout.pad_to_align()).as_ptr(); + + for (layout, offset, member_ptr) in data { + std::ptr::copy_nonoverlapping( + member_ptr.cast::().as_ptr(), + ptr.byte_add(offset), + layout.size(), + ); + } + + NonNull::new_unchecked(ptr).cast() + } else { + unreachable!() + } + } } }) } @@ -802,7 +836,35 @@ impl Value { CoreTypeConcrete::Coupon(_) | CoreTypeConcrete::Circuit(_) | CoreTypeConcrete::RangeCheck96(_) => todo!(), - CoreTypeConcrete::IntRange(_) => todo!("2.9.0"), + CoreTypeConcrete::IntRange(info) => { + let mut layout: Option = None; + let mut members = Vec::with_capacity(2); + + for member_ty in &[&info.ty, &info.ty] { + let member = registry.get_type(member_ty)?; + let member_layout = member.layout(registry)?; + + let (new_layout, offset) = match layout { + Some(layout) => layout.extend(member_layout)?, + None => (member_layout, 0), + }; + layout = Some(new_layout); + + members.push(Self::from_ptr( + NonNull::new(ptr.as_ptr().byte_add(offset)).unwrap(), + member_ty, + registry, + )?); + } + + let y = members.pop().unwrap(); + let x = members.pop().unwrap(); + + Self::IntRange { + x: x.into(), + y: y.into(), + } + } } }) } From 983fb7604fa43085e71f97cb7a2a99a47d8c44a6 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Thu, 14 Nov 2024 14:45:32 +0100 Subject: [PATCH 06/25] upd --- Cargo.lock | 4 +-- Cargo.toml | 4 +-- runtime/Cargo.toml | 2 +- src/libfuncs/starknet.rs | 70 ++++++++++++---------------------------- 4 files changed, 25 insertions(+), 55 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e0c0b2523..47fa1fea2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -945,7 +945,7 @@ dependencies = [ [[package]] name = "cairo-native" -version = "0.2.1-alpha.0" +version = "0.2.1-alpha.1" dependencies = [ "anyhow", "aquamarine", @@ -1008,7 +1008,7 @@ dependencies = [ [[package]] name = "cairo-native-runtime" -version = "0.2.1-alpha.0" +version = "0.2.1-alpha.1" dependencies = [ "cairo-lang-sierra-gas", "itertools 0.13.0", diff --git a/Cargo.toml b/Cargo.toml index 48ff7382f..03d2089e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cairo-native" -version = "0.2.1-alpha.0" +version = "0.2.1-alpha.1" edition = "2021" license = "Apache-2.0" description = "A compiler to convert Cairo's intermediate representation Sierra code to MLIR." @@ -91,7 +91,7 @@ cairo-lang-sierra-gas = "2.9.0-dev.0" cairo-lang-starknet = "2.9.0-dev.0" cairo-lang-utils = "2.9.0-dev.0" cairo-lang-starknet-classes = "2.9.0-dev.0" -cairo-native-runtime = { version = "0.2.1-alpha.0", path = "runtime", optional = true } +cairo-native-runtime = { version = "0.2.1-alpha.1", path = "runtime", optional = true } clap = { version = "4.5.19", features = ["derive"], optional = true } libloading = "0.8.5" tracing-subscriber = { version = "0.3.18", features = [ diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 38bcc3097..a306bc1b4 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cairo-native-runtime" -version = "0.2.1-alpha.0" +version = "0.2.1-alpha.1" description = "The runtime for cairo-native." edition = "2021" license = "Apache-2.0" diff --git a/src/libfuncs/starknet.rs b/src/libfuncs/starknet.rs index 386b36188..c9eb3152c 100644 --- a/src/libfuncs/starknet.rs +++ b/src/libfuncs/starknet.rs @@ -2852,7 +2852,7 @@ pub fn build_get_class_hash_at<'ctx, 'this>( )?; // Allocate space for the return value. - let (result_layout, (result_tag_ty, result_tag_layout), variant_tys) = + let (result_layout, (result_tag_ty, _), variant_tys) = crate::types::r#enum::get_type_for_variants( context, helper, @@ -2905,17 +2905,15 @@ pub fn build_get_class_hash_at<'ctx, 'this>( )?; // Extract function pointer. - let fn_ptr = entry.append_op_result(llvm::get_element_ptr( + let fn_ptr = entry.gep( context, - entry.argument(1)?.into(), - DenseI32ArrayAttribute::new( - context, - &[StarknetSyscallHandlerCallbacks::<()>::GET_CLASS_HASH_AT.try_into()?], - ), - llvm::r#type::pointer(context, 0), - llvm::r#type::pointer(context, 0), location, - ))?; + entry.argument(1)?.into(), + &[GepIndex::Const( + StarknetSyscallHandlerCallbacks::<()>::GET_CLASS_HASH_AT.try_into()?, + )], + pointer(context, 0), + )?; let fn_ptr = entry.load(context, location, fn_ptr, llvm::r#type::pointer(context, 0))?; entry.append_operation( @@ -2955,50 +2953,22 @@ pub fn build_get_class_hash_at<'ctx, 'this>( )?; let payload_ok = { - let ptr = entry.append_op_result( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[0].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, + let value = entry.load( + context, + location, + result_ptr, + llvm::r#type::r#struct(context, &[result_tag_ty, variant_tys[0].0], false), )?; - entry.load(context, location, ptr, variant_tys[0].0)? + entry.extract_value(context, location, value, variant_tys[0].0, 1)? }; let payload_err = { - let ptr = entry.append_op_result( - OperationBuilder::new("llvm.getelementptr", location) - .add_attributes(&[ - ( - Identifier::new(context, "rawConstantIndices"), - DenseI32ArrayAttribute::new( - context, - &[result_tag_layout.extend(variant_tys[1].1)?.1.try_into()?], - ) - .into(), - ), - ( - Identifier::new(context, "elem_type"), - TypeAttribute::new(IntegerType::new(context, 8).into()).into(), - ), - ]) - .add_operands(&[result_ptr]) - .add_results(&[llvm::r#type::pointer(context, 0)]) - .build()?, + let value = entry.load( + context, + location, + result_ptr, + llvm::r#type::r#struct(context, &[result_tag_ty, variant_tys[1].0], false), )?; - entry.load(context, location, ptr, variant_tys[1].0)? + entry.extract_value(context, location, value, variant_tys[1].0, 1)? }; let remaining_gas = entry.load( From 8395cf633d7ec9f8ebf0fc13be028ac357dfa9d3 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Thu, 14 Nov 2024 14:48:35 +0100 Subject: [PATCH 07/25] add fixes --- src/arch/aarch64.rs | 11 ++--------- src/arch/x86_64.rs | 11 ++--------- src/executor/contract.rs | 6 +++--- 3 files changed, 7 insertions(+), 21 deletions(-) diff --git a/src/arch/aarch64.rs b/src/arch/aarch64.rs index b99d878a7..c020b0f93 100644 --- a/src/arch/aarch64.rs +++ b/src/arch/aarch64.rs @@ -164,15 +164,8 @@ impl AbiArgument for Felt { impl AbiArgument for U256 { fn to_bytes(&self, buffer: &mut Vec) -> Result<(), Error> { - if buffer.len() < 56 { - buffer.extend_from_slice(&self.lo.to_le_bytes()); - buffer.extend_from_slice(&self.hi.to_le_bytes()); - } else { - align_to(buffer, get_integer_layout(256).align()); - buffer.extend_from_slice(&self.lo.to_le_bytes()); - buffer.extend_from_slice(&self.hi.to_le_bytes()); - } - Ok(()) + self.lo.to_bytes(buffer)?; + self.hi.to_bytes(buffer) } } diff --git a/src/arch/x86_64.rs b/src/arch/x86_64.rs index e00e12bcf..1496868b3 100644 --- a/src/arch/x86_64.rs +++ b/src/arch/x86_64.rs @@ -164,15 +164,8 @@ impl AbiArgument for Felt { impl AbiArgument for U256 { fn to_bytes(&self, buffer: &mut Vec) -> Result<(), Error> { - if buffer.len() < 40 { - buffer.extend_from_slice(&self.lo.to_le_bytes()); - buffer.extend_from_slice(&self.hi.to_le_bytes()); - } else { - align_to(buffer, get_integer_layout(256).align()); - buffer.extend_from_slice(&self.lo.to_le_bytes()); - buffer.extend_from_slice(&self.hi.to_le_bytes()); - } - Ok(()) + self.lo.to_bytes(buffer)?; + self.hi.to_bytes(buffer) } } diff --git a/src/executor/contract.rs b/src/executor/contract.rs index a7a09ddbf..c962a587c 100644 --- a/src/executor/contract.rs +++ b/src/executor/contract.rs @@ -379,9 +379,9 @@ impl AotContractExecutor { let len: u32 = args.len().try_into().unwrap(); ptr.to_bytes(&mut invoke_data)?; - 0u32.to_bytes(&mut invoke_data)?; // start - len.to_bytes(&mut invoke_data)?; // end - len.to_bytes(&mut invoke_data)?; // cap + (0u32 as u64).to_bytes(&mut invoke_data)?; // start + (len as u64).to_bytes(&mut invoke_data)?; // end + (len as u64).to_bytes(&mut invoke_data)?; // cap for (idx, elem) in args.iter().enumerate() { let f = elem.to_bytes_le(); From f9c7dab3c362b1b66e1cf38e2de2b1ec100f7e1e Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Thu, 14 Nov 2024 15:05:10 +0100 Subject: [PATCH 08/25] fix test --- src/executor/contract.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/executor/contract.rs b/src/executor/contract.rs index c962a587c..fa74cc6e0 100644 --- a/src/executor/contract.rs +++ b/src/executor/contract.rs @@ -723,7 +723,7 @@ mod tests { .unwrap(); assert_eq!(result.return_values, vec![Felt::from(n), Felt::from(n * 2)]); - assert_eq!(result.remaining_gas, 18446744073709548175); + assert_eq!(result.remaining_gas, 18446744073709548475); }); } @@ -793,7 +793,7 @@ mod tests { .unwrap(); assert_eq!(result.return_values, vec![Felt::from(3628800)]); - assert_eq!(result.remaining_gas, 18446744073709533805); + assert_eq!(result.remaining_gas, 18446744073709534105); } #[rstest] From 8955c391f045615d5c974358b93eba00cb1c1518 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Thu, 14 Nov 2024 15:12:33 +0100 Subject: [PATCH 09/25] fi --- tests/tests/starknet/keccak.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests/starknet/keccak.rs b/tests/tests/starknet/keccak.rs index a2365ab8c..f6a1e679b 100644 --- a/tests/tests/starknet/keccak.rs +++ b/tests/tests/starknet/keccak.rs @@ -38,7 +38,7 @@ fn keccak_test() { assert!(!result.failure_flag); assert_eq!( result.remaining_gas, - 340282366920938463463374607431768143515 + 340282366920938463463374607431768143715 ); assert_eq!(result.return_values, vec![1.into()]); From f038b75b882172ea6d640932e4aa0a30fae97fa3 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Thu, 14 Nov 2024 15:50:01 +0100 Subject: [PATCH 10/25] Version 0.2.2-alpha.0 --- Cargo.lock | 4 ++-- Cargo.toml | 4 ++-- runtime/Cargo.toml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 47fa1fea2..7593f773d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -945,7 +945,7 @@ dependencies = [ [[package]] name = "cairo-native" -version = "0.2.1-alpha.1" +version = "0.2.2-alpha.0" dependencies = [ "anyhow", "aquamarine", @@ -1008,7 +1008,7 @@ dependencies = [ [[package]] name = "cairo-native-runtime" -version = "0.2.1-alpha.1" +version = "0.2.2-alpha.0" dependencies = [ "cairo-lang-sierra-gas", "itertools 0.13.0", diff --git a/Cargo.toml b/Cargo.toml index 03d2089e9..2f7b48eec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cairo-native" -version = "0.2.1-alpha.1" +version = "0.2.2-alpha.0" edition = "2021" license = "Apache-2.0" description = "A compiler to convert Cairo's intermediate representation Sierra code to MLIR." @@ -91,7 +91,7 @@ cairo-lang-sierra-gas = "2.9.0-dev.0" cairo-lang-starknet = "2.9.0-dev.0" cairo-lang-utils = "2.9.0-dev.0" cairo-lang-starknet-classes = "2.9.0-dev.0" -cairo-native-runtime = { version = "0.2.1-alpha.1", path = "runtime", optional = true } +cairo-native-runtime = { version = "0.2.2-alpha.0", path = "runtime", optional = true } clap = { version = "4.5.19", features = ["derive"], optional = true } libloading = "0.8.5" tracing-subscriber = { version = "0.3.18", features = [ diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index a306bc1b4..d75bd51eb 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cairo-native-runtime" -version = "0.2.1-alpha.1" +version = "0.2.2-alpha.0" description = "The runtime for cairo-native." edition = "2021" license = "Apache-2.0" From 66b78825380030ec97d1a364dd1175ae22ba8419 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Thu, 14 Nov 2024 16:27:40 +0100 Subject: [PATCH 11/25] fix --- tests/common.rs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/tests/common.rs b/tests/common.rs index 7e4c39c71..86ba4cfaa 100644 --- a/tests/common.rs +++ b/tests/common.rs @@ -116,11 +116,7 @@ pub fn load_cairo_str(program_str: &str) -> (String, Program, SierraCasmRunner) .unwrap(); fs::write(&mut program_file, program_str).unwrap(); - let mut db = RootDatabase::default(); - init_dev_corelib( - &mut db, - Path::new(&var("CARGO_MANIFEST_DIR").unwrap()).join("corelib/src"), - ); + let mut db = RootDatabase::builder().detect_corelib().build().unwrap(); let main_crate_ids = setup_project(&mut db, program_file.path()).unwrap(); let sierra_program_with_dbg = compile_prepared_db( &db, @@ -131,19 +127,16 @@ pub fn load_cairo_str(program_str: &str) -> (String, Program, SierraCasmRunner) }, ) .unwrap(); - let mut program = sierra_program_with_dbg.program; + let program = sierra_program_with_dbg.program; let module_name = program_file.path().with_extension(""); let module_name = module_name.file_name().unwrap().to_str().unwrap(); let replacer = DebugReplacer { db: &db }; - replacer.enrich_function_names(&mut program); let contracts = find_contracts((db).upcast(), &main_crate_ids); let contracts_info = get_contracts_info(&db, contracts, &replacer).unwrap(); - let program = replacer.apply(&program); - let runner = SierraCasmRunner::new( program.clone(), Some(Default::default()), From 8b2477927c2c74be49eb2f994b575a0d5313f204 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Thu, 14 Nov 2024 16:34:49 +0100 Subject: [PATCH 12/25] ci --- .github/workflows/daily.yml | 6 +++--- .github/workflows/starknet-blocks.yml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml index 14eec0878..f14515c58 100644 --- a/.github/workflows/daily.yml +++ b/.github/workflows/daily.yml @@ -7,7 +7,7 @@ on: env: RANGE_SIZE: 25 - SEQUENCER_REV: 1b1b95cae7ae07b9bc778443ca75ee18008a6bc8 + SEQUENCER_REV: 478b71d7d5fb3eb4e2d00f233008111e155ab76c jobs: run: @@ -65,7 +65,7 @@ jobs: cd ../cairo_native make runtime echo "CAIRO_NATIVE_RUNTIME_LIBRARY=$(pwd)/libcairo_native_runtime.a" > $GITHUB_ENV - + - name: Patch dependencies run: | # Patches native dependency to local path, to use current cairo native version @@ -79,7 +79,7 @@ jobs: NEW_REV="$SEQUENCER_REV" sed -Ei "s#(\"$GIT\" *, *rev *= *\").?*(\".*)#\1$NEW_REV\2#" Cargo.toml grep $GIT Cargo.toml - + - name: Run with Native if: ${{ matrix.runner == 'native' }} run: | diff --git a/.github/workflows/starknet-blocks.yml b/.github/workflows/starknet-blocks.yml index 99665cace..15d6c5b9d 100644 --- a/.github/workflows/starknet-blocks.yml +++ b/.github/workflows/starknet-blocks.yml @@ -27,7 +27,7 @@ jobs: components: clippy - uses: Swatinem/rust-cache@v2 with: - key: "ref-dc35685315f4df544d5d1cf006d3a2a25d8c2c9a" + key: "ref-283012a546a8714a753a3a9d99adab3112d5df81" - name: Check and free hdd space left if: ${{ matrix.runner == 'native' }} @@ -76,7 +76,7 @@ jobs: uses: actions/checkout@v4 with: repository: lambdaclass/starknet-replay - ref: dc35685315f4df544d5d1cf006d3a2a25d8c2c9a + ref: 283012a546a8714a753a3a9d99adab3112d5df81 path: replay - name: Install Starknet Replay deps From 103d98e47a3aafb73ce56bf54c705a6bdd978052 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Thu, 14 Nov 2024 17:16:13 +0100 Subject: [PATCH 13/25] upd replay --- .github/workflows/daily.yml | 2 +- .github/workflows/starknet-blocks.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml index f14515c58..74feccc00 100644 --- a/.github/workflows/daily.yml +++ b/.github/workflows/daily.yml @@ -7,7 +7,7 @@ on: env: RANGE_SIZE: 25 - SEQUENCER_REV: 478b71d7d5fb3eb4e2d00f233008111e155ab76c + SEQUENCER_REV: b2fd7676427c1d26022b171b75d49cce1d524a12 jobs: run: diff --git a/.github/workflows/starknet-blocks.yml b/.github/workflows/starknet-blocks.yml index 15d6c5b9d..70703d7dd 100644 --- a/.github/workflows/starknet-blocks.yml +++ b/.github/workflows/starknet-blocks.yml @@ -27,7 +27,7 @@ jobs: components: clippy - uses: Swatinem/rust-cache@v2 with: - key: "ref-283012a546a8714a753a3a9d99adab3112d5df81" + key: "ref-7d6b0c57a41f7525688c02868895ee7cd44bd56e" - name: Check and free hdd space left if: ${{ matrix.runner == 'native' }} @@ -76,7 +76,7 @@ jobs: uses: actions/checkout@v4 with: repository: lambdaclass/starknet-replay - ref: 283012a546a8714a753a3a9d99adab3112d5df81 + ref: 7d6b0c57a41f7525688c02868895ee7cd44bd56e path: replay - name: Install Starknet Replay deps From 3659bb7e941fc12904319e1ed4c5e78176a9070a Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Thu, 14 Nov 2024 17:25:35 +0100 Subject: [PATCH 14/25] fix --- src/executor/contract.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/executor/contract.rs b/src/executor/contract.rs index fa74cc6e0..f24c7c6f1 100644 --- a/src/executor/contract.rs +++ b/src/executor/contract.rs @@ -379,9 +379,9 @@ impl AotContractExecutor { let len: u32 = args.len().try_into().unwrap(); ptr.to_bytes(&mut invoke_data)?; - (0u32 as u64).to_bytes(&mut invoke_data)?; // start - (len as u64).to_bytes(&mut invoke_data)?; // end - (len as u64).to_bytes(&mut invoke_data)?; // cap + 0u32.to_bytes(&mut invoke_data)?; // start + len.to_bytes(&mut invoke_data)?; // end + len.to_bytes(&mut invoke_data)?; // cap for (idx, elem) in args.iter().enumerate() { let f = elem.to_bytes_le(); From 0bc6f408884370e4fbbf421c4e8e109911c3d73e Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Thu, 14 Nov 2024 17:28:17 +0100 Subject: [PATCH 15/25] fix --- .github/workflows/starknet-blocks.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/starknet-blocks.yml b/.github/workflows/starknet-blocks.yml index 70703d7dd..a76f1626b 100644 --- a/.github/workflows/starknet-blocks.yml +++ b/.github/workflows/starknet-blocks.yml @@ -27,7 +27,7 @@ jobs: components: clippy - uses: Swatinem/rust-cache@v2 with: - key: "ref-7d6b0c57a41f7525688c02868895ee7cd44bd56e" + key: "ref-a00c242317493574096d86b7ba2231579f62a609" - name: Check and free hdd space left if: ${{ matrix.runner == 'native' }} @@ -76,7 +76,7 @@ jobs: uses: actions/checkout@v4 with: repository: lambdaclass/starknet-replay - ref: 7d6b0c57a41f7525688c02868895ee7cd44bd56e + ref: a00c242317493574096d86b7ba2231579f62a609 path: replay - name: Install Starknet Replay deps From 2f8b8412f76d2da241656980e5aad5d3cce5b1e0 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Tue, 19 Nov 2024 11:54:48 +0100 Subject: [PATCH 16/25] fixes --- examples/erc20.rs | 2 +- examples/starknet.rs | 2 +- src/libfuncs/starknet.rs | 29 +++++++++++++++-------------- src/starknet.rs | 8 ++++---- src/starknet_stub.rs | 2 +- tests/tests/starknet/secp256.rs | 2 +- tests/tests/starknet/syscalls.rs | 4 ++-- 7 files changed, 25 insertions(+), 24 deletions(-) diff --git a/examples/erc20.rs b/examples/erc20.rs index dae5a1cf6..77b82831f 100644 --- a/examples/erc20.rs +++ b/examples/erc20.rs @@ -278,7 +278,7 @@ impl StarknetSyscallHandler for SyscallHandler { fn get_class_hash_at( &mut self, _contract_address: Felt, - _remaining_gas: &mut u128, + _remaining_gas: &mut u64, ) -> SyscallResult { todo!() } diff --git a/examples/starknet.rs b/examples/starknet.rs index fd2ae5bf0..ef2d1d42d 100644 --- a/examples/starknet.rs +++ b/examples/starknet.rs @@ -409,7 +409,7 @@ impl StarknetSyscallHandler for SyscallHandler { fn get_class_hash_at( &mut self, _contract_address: Felt, - _remaining_gas: &mut u128, + _remaining_gas: &mut u64, ) -> SyscallResult { todo!() } diff --git a/src/libfuncs/starknet.rs b/src/libfuncs/starknet.rs index 91b0abc20..9302d5d66 100644 --- a/src/libfuncs/starknet.rs +++ b/src/libfuncs/starknet.rs @@ -2887,18 +2887,24 @@ pub fn build_get_class_hash_at<'ctx, 'this>( )?; // Allocate space and write the current gas. - let gas_builtin_ptr = helper.init_block().alloca1( + let (gas_ty, gas_layout) = registry.build_type_with_layout( context, - location, - IntegerType::new(context, 128).into(), - get_integer_layout(128).align(), + helper, + registry, + metadata, + &info.param_signatures()[0].ty, )?; - entry.store( + let gas_builtin_ptr = + helper + .init_block() + .alloca1(context, location, gas_ty, gas_layout.align())?; + entry.append_operation(llvm::store( context, - location, - gas_builtin_ptr, entry.argument(0)?.into(), - )?; + gas_builtin_ptr, + location, + LoadStoreOptions::default(), + )); // Allocate `contract_address` argument and write the value. let contract_address_ptr = helper.init_block().alloca_int(context, location, 252)?; @@ -2976,12 +2982,7 @@ pub fn build_get_class_hash_at<'ctx, 'this>( entry.extract_value(context, location, value, variant_tys[1].0, 1)? }; - let remaining_gas = entry.load( - context, - location, - gas_builtin_ptr, - IntegerType::new(context, 128).into(), - )?; + let remaining_gas = entry.load(context, location, gas_builtin_ptr, gas_ty)?; entry.append_operation(helper.cond_br( context, diff --git a/src/starknet.rs b/src/starknet.rs index c785a7524..58e8faf4c 100644 --- a/src/starknet.rs +++ b/src/starknet.rs @@ -324,7 +324,7 @@ pub trait StarknetSyscallHandler { fn get_class_hash_at( &mut self, contract_address: Felt, - remaining_gas: &mut u128, + remaining_gas: &mut u64, ) -> SyscallResult; #[cfg(feature = "with-cheatcode")] @@ -531,7 +531,7 @@ impl StarknetSyscallHandler for DummySyscallHandler { fn get_class_hash_at( &mut self, _contract_address: Felt, - _remaining_gas: &mut u128, + _remaining_gas: &mut u64, ) -> SyscallResult { unimplemented!() } @@ -814,7 +814,7 @@ pub(crate) mod handler { get_class_hash_at: extern "C" fn( result_ptr: &mut SyscallResultAbi, ptr: &mut T, - gas: &mut u128, + gas: &mut u64, contract_address: &Felt252Abi, ), // testing syscalls @@ -1658,7 +1658,7 @@ pub(crate) mod handler { extern "C" fn wrap_get_class_hash_at( result_ptr: &mut SyscallResultAbi, ptr: &mut T, - gas: &mut u128, + gas: &mut u64, contract_address: &Felt252Abi, ) { let result = ptr.get_class_hash_at(contract_address.into(), gas); diff --git a/src/starknet_stub.rs b/src/starknet_stub.rs index d51fa40bc..ca8ec9779 100644 --- a/src/starknet_stub.rs +++ b/src/starknet_stub.rs @@ -651,7 +651,7 @@ impl StarknetSyscallHandler for &mut StubSyscallHandler { fn get_class_hash_at( &mut self, contract_address: Felt, - _remaining_gas: &mut u128, + _remaining_gas: &mut u64, ) -> SyscallResult { Ok(contract_address) } diff --git a/tests/tests/starknet/secp256.rs b/tests/tests/starknet/secp256.rs index 701bfe1bc..e3f41ba90 100644 --- a/tests/tests/starknet/secp256.rs +++ b/tests/tests/starknet/secp256.rs @@ -260,7 +260,7 @@ impl StarknetSyscallHandler for &mut SyscallHandler { fn get_class_hash_at( &mut self, _contract_address: Felt, - _remaining_gas: &mut u128, + _remaining_gas: &mut u64, ) -> SyscallResult { unimplemented!() } diff --git a/tests/tests/starknet/syscalls.rs b/tests/tests/starknet/syscalls.rs index d15e1bd92..2a7d9bbad 100644 --- a/tests/tests/starknet/syscalls.rs +++ b/tests/tests/starknet/syscalls.rs @@ -506,7 +506,7 @@ impl StarknetSyscallHandler for SyscallHandler { fn get_class_hash_at( &mut self, contract_address: Felt, - _remaining_gas: &mut u128, + _remaining_gas: &mut u64, ) -> SyscallResult { Ok(contract_address) } @@ -1215,7 +1215,7 @@ fn get_class_hash_at() { &SYSCALLS_PROGRAM, "get_class_hash_at", &[], - Some(u128::MAX), + Some(u64::MAX), Some(SyscallHandler::new()), ); From ead5479882be7ac7271c7109d2cbda297728e690 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Tue, 19 Nov 2024 12:06:49 +0100 Subject: [PATCH 17/25] seq rev --- .github/workflows/daily.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml index 7f19ae890..b8f26d7f1 100644 --- a/.github/workflows/daily.yml +++ b/.github/workflows/daily.yml @@ -7,7 +7,7 @@ on: env: RANGE_SIZE: 25 - SEQUENCER_REV: b2fd7676427c1d26022b171b75d49cce1d524a12 + SEQUENCER_REV: 8d3e6b5515e7b62e7ab173026b2c81c750dbb853 jobs: run: From f46e5152ee799c5b3a5f6934490129e31f31c652 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Tue, 19 Nov 2024 12:09:42 +0100 Subject: [PATCH 18/25] version 0.2.3 --- Cargo.lock | 4 ++-- Cargo.toml | 4 ++-- runtime/Cargo.toml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7593f773d..ad90db644 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -945,7 +945,7 @@ dependencies = [ [[package]] name = "cairo-native" -version = "0.2.2-alpha.0" +version = "0.2.3" dependencies = [ "anyhow", "aquamarine", @@ -1008,7 +1008,7 @@ dependencies = [ [[package]] name = "cairo-native-runtime" -version = "0.2.2-alpha.0" +version = "0.2.3" dependencies = [ "cairo-lang-sierra-gas", "itertools 0.13.0", diff --git a/Cargo.toml b/Cargo.toml index 2f7b48eec..01020d53e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cairo-native" -version = "0.2.2-alpha.0" +version = "0.2.3" edition = "2021" license = "Apache-2.0" description = "A compiler to convert Cairo's intermediate representation Sierra code to MLIR." @@ -91,7 +91,7 @@ cairo-lang-sierra-gas = "2.9.0-dev.0" cairo-lang-starknet = "2.9.0-dev.0" cairo-lang-utils = "2.9.0-dev.0" cairo-lang-starknet-classes = "2.9.0-dev.0" -cairo-native-runtime = { version = "0.2.2-alpha.0", path = "runtime", optional = true } +cairo-native-runtime = { version = "0.2.3", path = "runtime", optional = true } clap = { version = "4.5.19", features = ["derive"], optional = true } libloading = "0.8.5" tracing-subscriber = { version = "0.3.18", features = [ diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index d75bd51eb..ac403ac91 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cairo-native-runtime" -version = "0.2.2-alpha.0" +version = "0.2.3" description = "The runtime for cairo-native." edition = "2021" license = "Apache-2.0" From 8c11c5dc3057631fe6c5cb059ae63380b74142f6 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Tue, 19 Nov 2024 12:12:19 +0100 Subject: [PATCH 19/25] update ci --- .github/workflows/starknet-blocks.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/starknet-blocks.yml b/.github/workflows/starknet-blocks.yml index a76f1626b..50f1b2759 100644 --- a/.github/workflows/starknet-blocks.yml +++ b/.github/workflows/starknet-blocks.yml @@ -27,7 +27,7 @@ jobs: components: clippy - uses: Swatinem/rust-cache@v2 with: - key: "ref-a00c242317493574096d86b7ba2231579f62a609" + key: "ref-16302c859b1aacc019eea154a58eddc7b32050c1" - name: Check and free hdd space left if: ${{ matrix.runner == 'native' }} @@ -76,7 +76,7 @@ jobs: uses: actions/checkout@v4 with: repository: lambdaclass/starknet-replay - ref: a00c242317493574096d86b7ba2231579f62a609 + ref: 16302c859b1aacc019eea154a58eddc7b32050c1 path: replay - name: Install Starknet Replay deps From ca7d77721fb23681b440fe8d6a28d7f1c32479fa Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Tue, 19 Nov 2024 12:56:56 +0100 Subject: [PATCH 20/25] fix --- tests/tests/starknet/keccak.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests/starknet/keccak.rs b/tests/tests/starknet/keccak.rs index 9de56a5f8..71babc3c7 100644 --- a/tests/tests/starknet/keccak.rs +++ b/tests/tests/starknet/keccak.rs @@ -36,7 +36,7 @@ fn keccak_test() { ); assert!(!result.failure_flag); - assert_eq!(result.remaining_gas, 18446744073709483675); + assert_eq!(result.remaining_gas, 18446744073709483875); assert_eq!(result.return_values, vec![1.into()]); let result_aot_ct = run_native_starknet_aot_contract( From c9b0fb767d5952053bfe978782a18a410713866a Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Tue, 19 Nov 2024 13:35:25 +0100 Subject: [PATCH 21/25] readme --- README.md | 2 +- scripts/bench-hyperfine.sh | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 9a831e594..80ccd68d8 100644 --- a/README.md +++ b/README.md @@ -350,7 +350,7 @@ Options: ### Requirements - [hyperfine](https://github.com/sharkdp/hyperfine): `cargo install hyperfine` -- [cairo 2.8.2](https://github.com/starkware-libs/cairo) +- [cairo 2.9.0-dev.0](https://github.com/starkware-libs/cairo) - Cairo Corelibs - LLVM 19 with MLIR diff --git a/scripts/bench-hyperfine.sh b/scripts/bench-hyperfine.sh index 473c67265..aa02a1e94 100755 --- a/scripts/bench-hyperfine.sh +++ b/scripts/bench-hyperfine.sh @@ -57,7 +57,6 @@ run_bench() { -L"$OUTPUT_DIR/" \ -Wl,-rpath "$MLIR_DIR/lib" \ -Wl,-rpath "$OUTPUT_DIR" \ - -Wl,--rpath-link "$OUTPUT_DIR" \ -l"$base_name" \ -lm \ -o "$OUTPUT_DIR/$base_name-march-native" \ From 6b91233134beceb16d35e9e4138deddb9e664aca Mon Sep 17 00:00:00 2001 From: Edgar Date: Wed, 20 Nov 2024 14:55:20 +0100 Subject: [PATCH 22/25] Update examples/erc20.rs Co-authored-by: MrAzteca --- examples/erc20.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/erc20.rs b/examples/erc20.rs index 3728df497..b36d2947d 100644 --- a/examples/erc20.rs +++ b/examples/erc20.rs @@ -280,7 +280,7 @@ impl StarknetSyscallHandler for SyscallHandler { _contract_address: Felt, _remaining_gas: &mut u64, ) -> SyscallResult { - todo!() + unimplemented!() } } From 012f9312c02e415a4a5f6f08010ecc0aae6b7734 Mon Sep 17 00:00:00 2001 From: Edgar Date: Wed, 20 Nov 2024 14:55:31 +0100 Subject: [PATCH 23/25] Update examples/starknet.rs Co-authored-by: MrAzteca --- examples/starknet.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/starknet.rs b/examples/starknet.rs index f9b56a805..e64716325 100644 --- a/examples/starknet.rs +++ b/examples/starknet.rs @@ -411,7 +411,7 @@ impl StarknetSyscallHandler for SyscallHandler { _contract_address: Felt, _remaining_gas: &mut u64, ) -> SyscallResult { - todo!() + unimplemented!() } } From 417fc38421313d8b9a331b65a98b4e7f8fcfa20e Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Wed, 20 Nov 2024 15:08:19 +0100 Subject: [PATCH 24/25] edits --- src/values.rs | 65 +++++++++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 36 deletions(-) diff --git a/src/values.rs b/src/values.rs index c1dea6837..3d17e09f7 100644 --- a/src/values.rs +++ b/src/values.rs @@ -520,25 +520,25 @@ impl Value { let inner = registry.get_type(&info.ty)?; let inner_layout = inner.layout(registry)?; - let mut data = Vec::with_capacity(2); + let x_ptr = x.to_ptr(arena, registry, &info.ty)?; - let member_ptr = x.to_ptr(arena, registry, &info.ty)?; - data.push((inner_layout, 0, member_ptr)); + let (struct_layout, y_offset) = inner_layout.extend(inner_layout)?; - let (struct_layout, offset) = inner_layout.extend(inner_layout)?; - - let member_ptr = y.to_ptr(arena, registry, &info.ty)?; - data.push((inner_layout, offset, member_ptr)); + let y_ptr = y.to_ptr(arena, registry, &info.ty)?; let ptr = arena.alloc_layout(struct_layout.pad_to_align()).as_ptr(); - for (layout, offset, member_ptr) in data { - std::ptr::copy_nonoverlapping( - member_ptr.cast::().as_ptr(), - ptr.byte_add(offset), - layout.size(), - ); - } + std::ptr::copy_nonoverlapping( + x_ptr.cast::().as_ptr(), + ptr, + inner_layout.size(), + ); + + std::ptr::copy_nonoverlapping( + y_ptr.cast::().as_ptr(), + ptr.byte_add(y_offset), + inner_layout.size(), + ); NonNull::new_unchecked(ptr).cast() } else { @@ -837,28 +837,21 @@ impl Value { | CoreTypeConcrete::Circuit(_) | CoreTypeConcrete::RangeCheck96(_) => todo!(), CoreTypeConcrete::IntRange(info) => { - let mut layout: Option = None; - let mut members = Vec::with_capacity(2); - - for member_ty in &[&info.ty, &info.ty] { - let member = registry.get_type(member_ty)?; - let member_layout = member.layout(registry)?; - - let (new_layout, offset) = match layout { - Some(layout) => layout.extend(member_layout)?, - None => (member_layout, 0), - }; - layout = Some(new_layout); - - members.push(Self::from_ptr( - NonNull::new(ptr.as_ptr().byte_add(offset)).unwrap(), - member_ty, - registry, - )?); - } - - let y = members.pop().unwrap(); - let x = members.pop().unwrap(); + let member = registry.get_type(&info.ty)?; + let member_layout = member.layout(registry)?; + + let x = + Self::from_ptr(NonNull::new(ptr.as_ptr()).unwrap(), &info.ty, registry)?; + + let y = Self::from_ptr( + NonNull::new( + ptr.as_ptr() + .byte_add(member_layout.extend(member_layout).unwrap().1), + ) + .unwrap(), + &info.ty, + registry, + )?; Self::IntRange { x: x.into(), From 5dcd7f67c001580b22103ba8d7af759d51c0c498 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Wed, 20 Nov 2024 15:12:03 +0100 Subject: [PATCH 25/25] native panic --- src/values.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/values.rs b/src/values.rs index 3d17e09f7..5b9d1ff76 100644 --- a/src/values.rs +++ b/src/values.rs @@ -4,6 +4,7 @@ use crate::{ error::{CompilerError, Error}, + native_panic, starknet::{Secp256k1Point, Secp256r1Point}, types::TypeBuilder, utils::{ @@ -542,7 +543,9 @@ impl Value { NonNull::new_unchecked(ptr).cast() } else { - unreachable!() + native_panic!( + "an IntRange value should always have an IntRange CoreTypeConcrete" + ) } } } @@ -846,7 +849,7 @@ impl Value { let y = Self::from_ptr( NonNull::new( ptr.as_ptr() - .byte_add(member_layout.extend(member_layout).unwrap().1), + .byte_add(member_layout.extend(member_layout)?.1), ) .unwrap(), &info.ty,