diff --git a/Cargo.lock b/Cargo.lock index 36e1d5a..fc09dc2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -41,9 +41,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -56,15 +56,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] @@ -91,9 +91,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "arrayvec" @@ -139,9 +139,9 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" [[package]] name = "bitvec" @@ -172,9 +172,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.1" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "byte-slice-cast" @@ -184,9 +184,9 @@ checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" [[package]] name = "bytemuck" -version = "1.24.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" dependencies = [ "bytemuck_derive", ] @@ -199,7 +199,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -210,9 +210,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cast" @@ -222,9 +222,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.54" +version = "1.2.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583" +checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" dependencies = [ "find-msvc-tools", "shlex", @@ -242,6 +242,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.0", +] + [[package]] name = "ciborium" version = "0.2.2" @@ -271,9 +282,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.54" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" dependencies = [ "clap_builder", "clap_derive", @@ -281,9 +292,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.54" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", @@ -293,21 +304,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.49" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "clap_lex" -version = "0.7.7" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "codespan-reporting" @@ -322,9 +333,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "const-random" @@ -412,6 +423,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "criterion" version = "0.5.1" @@ -522,7 +542,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -571,6 +591,8 @@ dependencies = [ "futures", "hex", "log", + "p3-field", + "p3-goldilocks", "pow-core", "primitive-types 0.13.1", "qp-plonky2", @@ -613,9 +635,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "fixed-hash" @@ -674,7 +696,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -700,9 +722,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -715,9 +737,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -725,15 +747,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -742,38 +764,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -783,7 +805,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -812,14 +833,16 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.4" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "libc", "r-efi", + "rand_core 0.10.0", "wasip2", + "wasip3", ] [[package]] @@ -1168,6 +1191,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "idna" version = "1.1.0" @@ -1206,7 +1235,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1217,6 +1246,8 @@ checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", "hashbrown 0.16.1", + "serde", + "serde_core", ] [[package]] @@ -1265,21 +1296,43 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jni-sys" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] [[package]] name = "js-sys" -version = "0.3.85" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" dependencies = [ "once_cell", "wasm-bindgen", @@ -1319,10 +1372,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] -name = "libc" -version = "0.2.180" +name = "leb128fmt" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libc" +version = "0.2.183" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" [[package]] name = "libloading" @@ -1378,9 +1437,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "metal" @@ -1538,7 +1597,7 @@ version = "0.6.0+11769913" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" dependencies = [ - "jni-sys", + "jni-sys 0.3.1", ] [[package]] @@ -1638,9 +1697,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -1810,7 +1869,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1850,35 +1909,29 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pkg-config" @@ -1931,15 +1984,15 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" dependencies = [ "portable-atomic", ] @@ -1977,6 +2030,16 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + [[package]] name = "primitive-types" version = "0.10.1" @@ -2000,9 +2063,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ "toml_edit", ] @@ -2038,9 +2101,9 @@ dependencies = [ [[package]] name = "qp-plonky2" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39530b02faa85964bba211e030afa2d54995b403b0022f88e984c4c65679c4bc" +checksum = "593bccf15b8e2f9eb904ef4010f68b81ddcceb70aaf90116ce29ec09d7578dd4" dependencies = [ "ahash", "anyhow", @@ -2056,7 +2119,9 @@ dependencies = [ "p3-symmetric", "plonky2_maybe_rayon", "plonky2_util", + "qp-plonky2-core", "qp-plonky2-field", + "qp-plonky2-verifier", "qp-poseidon-constants", "rand 0.8.5", "rand_chacha 0.3.1", @@ -2067,10 +2132,36 @@ dependencies = [ ] [[package]] -name = "qp-plonky2-field" -version = "1.1.3" +name = "qp-plonky2-core" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8d52dadf3bb92708c309922b62d7f3f2587d3047f9fe05a0c9f587e2890526" +checksum = "b7d30fabfd90e359640f2371c8b3e9b377d215f7dcf4e61da1f38776c5b84540" +dependencies = [ + "ahash", + "anyhow", + "hashbrown 0.14.5", + "itertools 0.11.0", + "keccak-hash", + "log", + "num", + "p3-field", + "p3-goldilocks", + "p3-poseidon2", + "p3-symmetric", + "plonky2_util", + "qp-plonky2-field", + "qp-poseidon-constants", + "rand 0.8.5", + "serde", + "static_assertions", + "unroll", +] + +[[package]] +name = "qp-plonky2-field" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c9f8259bf4f220b1d81001458cc6c09a1372f2b3e8dac2fb489a66230385c3" dependencies = [ "anyhow", "itertools 0.11.0", @@ -2084,10 +2175,36 @@ dependencies = [ ] [[package]] -name = "qp-poseidon-constants" -version = "1.0.2" +name = "qp-plonky2-verifier" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15005ef7ac88e170a9461990130619855284bd524e8ad059491ed291222d1553" +checksum = "dd0eb89fd3cc40c4b25be95399635957d416406328169ba939db989c0444f364" +dependencies = [ + "ahash", + "anyhow", + "hashbrown 0.14.5", + "itertools 0.11.0", + "keccak-hash", + "log", + "num", + "p3-field", + "p3-goldilocks", + "p3-poseidon2", + "p3-symmetric", + "plonky2_util", + "qp-plonky2-core", + "qp-plonky2-field", + "qp-poseidon-constants", + "serde", + "static_assertions", + "unroll", +] + +[[package]] +name = "qp-poseidon-constants" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300d8b01e4a492b202e739ab5f73215b261905911020cc0f74a22109365e3bd7" dependencies = [ "p3-field", "p3-goldilocks", @@ -2098,15 +2215,14 @@ dependencies = [ [[package]] name = "qp-poseidon-core" -version = "1.0.7" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f65766d6de64eff741c7f402002a3322f5e563d53e0e9040aeab4921ff24f2b" +checksum = "c51774769a44a1c65f9ad3959ff1497a9c315a16f5718151873721b3c5631413" dependencies = [ "p3-field", "p3-goldilocks", "p3-poseidon2", "p3-symmetric", - "qp-plonky2", "qp-poseidon-constants", "rand_chacha 0.9.0", ] @@ -2114,12 +2230,10 @@ dependencies = [ [[package]] name = "qpow-math" version = "0.1.0" -source = "git+https://github.com/Quantus-Network/chain.git#1c4ebb199f1653b981817663a3c508755be67d23" +source = "git+https://github.com/Quantus-Network/chain.git?tag=v0.4.11-star-dust#89f0260cdba4eb71533cb060215cca3d166108d1" dependencies = [ "hex", "log", - "num-bigint", - "num-traits", "primitive-types 0.13.1", "qp-poseidon-core", ] @@ -2127,7 +2241,7 @@ dependencies = [ [[package]] name = "quantus-miner-api" version = "0.0.3" -source = "git+https://github.com/Quantus-Network/chain.git?branch=illuzen%2Fquic-miner#ba656b2d99a44298b94c1830fb105de078825165" +source = "git+https://github.com/Quantus-Network/chain.git?tag=v0.4.11-star-dust#89f0260cdba4eb71533cb060215cca3d166108d1" dependencies = [ "serde", "serde_json", @@ -2184,18 +2298,18 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.44" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "r-efi" -version = "5.3.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "radium" @@ -2220,10 +2334,20 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "rand_chacha 0.9.0", "rand_core 0.9.5", ] +[[package]] +name = "rand" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +dependencies = [ + "chacha20", + "getrandom 0.4.2", + "rand_core 0.10.0", +] + [[package]] name = "rand_chacha" version = "0.3.1" @@ -2258,15 +2382,18 @@ name = "rand_core" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", -] + +[[package]] +name = "rand_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" [[package]] name = "range-alloc" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" +checksum = "ca45419789ae5a7899559e9512e58ca889e41f04f1f2445e9f4b290ceccd1d08" [[package]] name = "raw-window-handle" @@ -2305,9 +2432,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -2317,9 +2444,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -2328,9 +2455,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "renderdoc-sys" @@ -2401,13 +2528,13 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.36" +version = "0.23.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" dependencies = [ "once_cell", "rustls-pki-types", - "rustls-webpki 0.103.9", + "rustls-webpki 0.103.10", "subtle", "zeroize", ] @@ -2454,9 +2581,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.9" +version = "0.103.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" dependencies = [ "ring 0.17.14", "rustls-pki-types", @@ -2471,9 +2598,9 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "same-file" @@ -2486,9 +2613,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ "windows-sys 0.61.2", ] @@ -2530,9 +2657,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.15.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", @@ -2571,7 +2698,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2606,7 +2733,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -2628,9 +2755,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "slotmap" @@ -2659,12 +2786,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -2731,9 +2858,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.114" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -2748,7 +2875,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2792,7 +2919,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2803,7 +2930,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2837,9 +2964,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -2852,9 +2979,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.49.0" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" dependencies = [ "bytes", "libc", @@ -2862,20 +2989,20 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.2", + "socket2 0.6.3", "tokio-macros", "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2884,7 +3011,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.36", + "rustls 0.23.37", "tokio", ] @@ -2908,7 +3035,7 @@ checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" dependencies = [ "futures-util", "log", - "rustls 0.23.36", + "rustls 0.23.37", "rustls-pki-types", "tokio", "tokio-rustls", @@ -2931,18 +3058,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.5+spec-1.1.0" +version = "1.0.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +checksum = "9b320e741db58cac564e26c607d3cc1fdc4a88fd36c879568c07856ed83ff3e9" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.23.10+spec-1.0.0" +version = "0.25.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +checksum = "8ca1a40644a28bce036923f6a431df0b34236949d111cc07cb6dca830c9ef2e1" dependencies = [ "indexmap", "toml_datetime", @@ -2952,9 +3079,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.6+spec-1.1.0" +version = "1.0.10+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420" dependencies = [ "winnow", ] @@ -2985,7 +3112,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -3045,7 +3172,7 @@ dependencies = [ "httparse", "log", "rand 0.8.5", - "rustls 0.23.36", + "rustls 0.23.37", "rustls-pki-types", "sha1", "thiserror 1.0.69", @@ -3090,9 +3217,9 @@ checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-width" @@ -3160,13 +3287,13 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.20.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" +checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.2", "js-sys", - "rand 0.9.2", + "rand 0.10.0", "wasm-bindgen", ] @@ -3240,10 +3367,19 @@ dependencies = [ ] [[package]] -name = "wasm-bindgen" -version = "0.2.108" +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" dependencies = [ "cfg-if", "once_cell", @@ -3254,9 +3390,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.58" +version = "0.4.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" dependencies = [ "cfg-if", "futures-util", @@ -3268,9 +3404,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.108" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3278,31 +3414,65 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.108" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.108" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" dependencies = [ "unicode-ident", ] [[package]] -name = "web-sys" -version = "0.3.85" +name = "wasm-encoder" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" dependencies = [ "js-sys", "wasm-bindgen", @@ -3324,14 +3494,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.5", + "webpki-roots 1.0.6", ] [[package]] name = "webpki-roots" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12bed680863276c63889429bfd6cab3b99943659923822de1c8a39c49e4d722c" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" dependencies = [ "rustls-pki-types", ] @@ -3549,7 +3719,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -3560,7 +3730,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -3606,15 +3776,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - [[package]] name = "windows-sys" version = "0.61.2" @@ -3648,30 +3809,13 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", + "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -3684,12 +3828,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -3702,12 +3840,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -3720,24 +3852,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -3750,12 +3870,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -3768,12 +3882,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -3786,12 +3894,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -3804,17 +3906,11 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - [[package]] name = "winnow" -version = "0.7.14" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" dependencies = [ "memchr", ] @@ -3824,6 +3920,88 @@ name = "wit-bindgen" version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] [[package]] name = "writeable" @@ -3865,28 +4043,28 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.34" +version = "0.8.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71ddd76bcebeed25db614f82bf31a9f4222d3fbba300e6fb6c00afa26cbd4d9d" +checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.34" +version = "0.8.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8187381b52e32220d50b255276aa16a084ec0a9017a0ca2152a1f55c539758d" +checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -3906,7 +4084,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "synstructure", ] @@ -3946,11 +4124,11 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "zmij" -version = "1.0.17" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02aae0f83f69aafc94776e879363e9771d7ecbffe2c7fbb6c14c5e00dfe88439" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml index 8256471..7a36e06 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,19 +29,15 @@ num-bigint = { version = "0.4", features = ["rand"] } num-traits = "0.2" num_cpus = "1.16" primitive-types = { version = "0.13.1", default-features = false } -qp-poseidon-core = { version = "1.0.1", default-features = false } -qpow-math = { git = "https://github.com/Quantus-Network/chain.git", package = "qpow-math", default-features = false } -# Point to local chain repo for development; switch back to crates.io version for release -quantus-miner-api = { git = "https://github.com/Quantus-Network/chain.git", branch = "illuzen/quic-miner" } +qp-poseidon-core = { version = "1.4.0", default-features = false } +qpow-math = { git = "https://github.com/Quantus-Network/chain.git", tag = "v0.4.11-star-dust", package = "qpow-math", default-features = false } +quantus-miner-api = { git = "https://github.com/Quantus-Network/chain.git", tag = "v0.4.11-star-dust" } rand = { version = "0.8.5", default-features = false } serde = { version = "1.0", features = ["derive"] } serde_json = { version = "1.0.132", default-features = false } thiserror = "1" tokio = { version = "1.36", features = ["full"] } -warp = "0.3" # Used by metrics crate for Prometheus HTTP endpoint -# pow-core now delegates to qpow-math for core functionality while providing optimized mining scaffolding. - -# GPU backend dependencies are declared in individual engine crates (no optional deps in workspace) +warp = "0.3" [profile.release] opt-level = 3 diff --git a/crates/engine-gpu/Cargo.toml b/crates/engine-gpu/Cargo.toml index 47e7ba2..3db036d 100644 --- a/crates/engine-gpu/Cargo.toml +++ b/crates/engine-gpu/Cargo.toml @@ -22,10 +22,12 @@ engine-cpu = { path = "../engine-cpu" } pow-core = { path = "../pow-core" } primitive-types = { workspace = true } log = { workspace = true } -qp-poseidon-core = { version = "1.0.2", features = ["p2"] } -qp-poseidon-constants = { version = "1.0.2" } +qp-poseidon-core = { workspace = true } +qp-poseidon-constants = "1.1" qp-plonky2-field = { version = "1.1.1" } plonky2 = { package = "qp-plonky2", version = "1.1.3" } +p3-goldilocks = "0.3" +p3-field = "0.3" wgpu = { version = "27.0.1" } # GPU compute library futures = "0.3" # For async executor diff --git a/crates/engine-gpu/src/main.rs b/crates/engine-gpu/src/main.rs index bbddcb2..3262af9 100644 --- a/crates/engine-gpu/src/main.rs +++ b/crates/engine-gpu/src/main.rs @@ -93,8 +93,8 @@ async fn run() -> Result<(), Box> { eprintln!("❌ Poseidon2 squeeze-twice tests failed: {}", e); } - if let Err(e) = tests::test_double_hash(&device, &queue).await { - eprintln!("❌ Double hash tests failed: {}", e); + if let Err(e) = tests::test_hash_squeeze_twice(&device, &queue).await { + eprintln!("❌ Hash squeeze twice tests failed: {}", e); } if let Err(e) = end_to_end_tests::test_end_to_end_mining(&device, &queue).await { diff --git a/crates/engine-gpu/src/mining.wgsl b/crates/engine-gpu/src/mining.wgsl index 571b55d..31688ac 100644 --- a/crates/engine-gpu/src/mining.wgsl +++ b/crates/engine-gpu/src/mining.wgsl @@ -9,7 +9,7 @@ const GOLDILOCKS_PRIME_HIGH: u32 = 4294967295u; // High 32 bits (2^32 - 1) // Poseidon2 constants const WIDTH: u32 = 12u; -const RATE: u32 = 4u; +const RATE: u32 = 8u; const EXTERNAL_ROUNDS: u32 = 4u; const INTERNAL_ROUNDS: u32 = 22u; @@ -677,17 +677,17 @@ fn poseidon2_hash_squeeze_twice(input: array) -> array { state[i] = gf_zero(); } - // Convert input to field elements (25 total) + // Convert input to field elements (25 total: 24 from input + 1 terminator) let input_felts = bytes_to_field_elements(input); // Sponge construction matching CPU reference exactly: - // CPU processes field elements using push_to_buf() which absorbs in chunks of RATE=4 + // CPU processes field elements using push_to_buf() which absorbs in chunks of RATE=8 - // Process first 24 elements (6 complete chunks of 4) - for (var chunk = 0u; chunk < 6u; chunk++) { - // Absorb 4 elements for this chunk - for (var i = 0u; i < 4u; i++) { - let felt_idx = chunk * 4u + i; + // Process first 24 elements (3 complete chunks of 8) + for (var chunk = 0u; chunk < 3u; chunk++) { + // Absorb 8 elements for this chunk + for (var i = 0u; i < 8u; i++) { + let felt_idx = chunk * 8u + i; state[i] = gf_add(state[i], input_felts[felt_idx]); } // Permute after each complete chunk @@ -695,17 +695,16 @@ fn poseidon2_hash_squeeze_twice(input: array) -> array { } // Process remaining 1 element (partial chunk) - // Now we have element 24 (the padding marker = 1) remaining - // This simulates CPU's finalize_twice adding ONE to buffer position 0 - state[0] = gf_add(state[0], input_felts[24u]); // Add the padding marker (should be 1) + // Now we have element 24 (the terminator = 1) remaining + state[0] = gf_add(state[0], input_felts[24u]); // Add the terminator (value 1) // Add sponge padding marker (ONE) to the next position state[1] = gf_add(state[1], gf_one()); - // Final permutation (CPU calls permute after completing the block) + // Final permutation poseidon2_permute(&state); - // First squeeze - get first 4 field elements + // First squeeze - get first 4 field elements (POSEIDON2_OUTPUT=4 -> 32 bytes) let first_output = field_elements_to_bytes(array( state[0], state[1], state[2], state[3] )); @@ -784,10 +783,9 @@ fn poseidon2_hash_squeeze_twice_64(input: array) -> array { return result; } -// Double Poseidon2 hash (like Bitcoin's double SHA256) -fn double_hash(input: array) -> array { - let first_hash = poseidon2_hash_squeeze_twice(input); - return poseidon2_hash_squeeze_twice_64(first_hash); +// Single Poseidon2 hash with double squeeze (512-bit output) +fn hash_squeeze_twice(input: array) -> array { + return poseidon2_hash_squeeze_twice(input); } // Check if hash < target (U512 comparison) @@ -886,7 +884,7 @@ fn mining_main(@builtin(global_invocation_id) global_id: vec3) { } // Hash (Big Endian) - let hash_be = double_hash(input); + let hash_be = hash_squeeze_twice(input); // Convert to Little Endian for difficulty check and storage var hash_le: array; diff --git a/crates/engine-gpu/src/tests.rs b/crates/engine-gpu/src/tests.rs index a6af81e..dca5cea 100644 --- a/crates/engine-gpu/src/tests.rs +++ b/crates/engine-gpu/src/tests.rs @@ -1,8 +1,8 @@ +use p3_field::PrimeField64 as P3PrimeField64; +use p3_goldilocks::Goldilocks as P3Goldilocks; use plonky2::hash::poseidon2::P2Permuter; use qp_plonky2_field::goldilocks_field::GoldilocksField; use qp_plonky2_field::types::{Field, Field64, PrimeField64}; - -use qp_poseidon_core::serialization::{p2_backend::GF as P2Goldilocks, GoldiCompat}; use rand::{Rng, SeedableRng}; use wgpu::util::DeviceExt; @@ -888,13 +888,17 @@ fn generate_bytes_to_field_test_vectors() -> Vec { let mut vectors = Vec::new(); let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(0x98765432); + // Helper to convert P3 Goldilocks to P2 (Plonky2) GoldilocksField + fn p3_to_p2(felts: Vec) -> Vec { + felts + .into_iter() + .map(|g| GoldilocksField::from_noncanonical_u64(g.as_canonical_u64())) + .collect() + } + // Test 1: All zeros let zero_input = [0u8; 96]; - let zero_expected = - qp_poseidon_core::serialization::injective_bytes_to_felts::(&zero_input) - .into_iter() - .map(|g| GoldilocksField::from_noncanonical_u64(g.to_u64())) - .collect(); + let zero_expected = p3_to_p2(qp_poseidon_core::serialization::bytes_to_felts(&zero_input)); vectors.push(BytesToFieldTestCase { input_bytes: zero_input, expected_felts: zero_expected, @@ -902,11 +906,7 @@ fn generate_bytes_to_field_test_vectors() -> Vec { // Test 2: All 0xFF let ff_input = [0xFFu8; 96]; - let ff_expected = - qp_poseidon_core::serialization::injective_bytes_to_felts::(&ff_input) - .into_iter() - .map(|g| GoldilocksField::from_noncanonical_u64(g.to_u64())) - .collect(); + let ff_expected = p3_to_p2(qp_poseidon_core::serialization::bytes_to_felts(&ff_input)); vectors.push(BytesToFieldTestCase { input_bytes: ff_input, expected_felts: ff_expected, @@ -917,11 +917,7 @@ fn generate_bytes_to_field_test_vectors() -> Vec { for (i, byte) in seq_input.iter_mut().enumerate() { *byte = (i % 256) as u8; } - let seq_expected = - qp_poseidon_core::serialization::injective_bytes_to_felts::(&seq_input) - .into_iter() - .map(|g| GoldilocksField::from_noncanonical_u64(g.to_u64())) - .collect(); + let seq_expected = p3_to_p2(qp_poseidon_core::serialization::bytes_to_felts(&seq_input)); vectors.push(BytesToFieldTestCase { input_bytes: seq_input, expected_felts: seq_expected, @@ -931,11 +927,7 @@ fn generate_bytes_to_field_test_vectors() -> Vec { for _ in 0..10 { let mut input = [0u8; 96]; rng.fill(&mut input[..]); - let expected = - qp_poseidon_core::serialization::injective_bytes_to_felts::(&input) - .into_iter() - .map(|g| GoldilocksField::from_noncanonical_u64(g.to_u64())) - .collect(); + let expected = p3_to_p2(qp_poseidon_core::serialization::bytes_to_felts(&input)); vectors.push(BytesToFieldTestCase { input_bytes: input, expected_felts: expected, @@ -1040,20 +1032,18 @@ fn print_test_failure_hex( } } -fn generate_double_hash_test_vectors() -> Vec { +fn generate_hash_squeeze_twice_test_vectors() -> Vec { let mut vectors = Vec::new(); let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(0xDEADBEEF); - // Test 1-250: Random header and nonce combinations (25 tests) + // Test 1-250: Random header and nonce combinations for i in 0..250 { let mut input = [0u8; 96]; rng.fill(&mut input[..]); - let expected = { - let first_hash = qp_poseidon_core::hash_squeeze_twice(&input); - qp_poseidon_core::hash_squeeze_twice(&first_hash) - }; + // Single hash with double squeeze (no longer double hash) + let expected = qp_poseidon_core::hash_squeeze_twice(&input); vectors.push(DoubleHashTestCase { input_96_bytes: input, @@ -4344,11 +4334,11 @@ fn main(@builtin(global_invocation_id) global_id: vec3) {{ results.print_summary() } -pub async fn test_double_hash( +pub async fn test_hash_squeeze_twice( device: &wgpu::Device, queue: &wgpu::Queue, ) -> Result<(), Box> { - let test_vectors = generate_double_hash_test_vectors(); + let test_vectors = generate_hash_squeeze_twice_test_vectors(); let total_tests = test_vectors.len(); let mut passed_tests = 0; let mut failed_tests = Vec::new(); @@ -4372,8 +4362,8 @@ fn main(@builtin(global_invocation_id) global_id: vec3) {{ input_array[i] = input_data[input_offset + i]; }} - // Hash the input using double hash (96 bytes -> 64 bytes) - let hash_result = double_hash(input_array); + // Hash the input using single hash with double squeeze (96 bytes -> 64 bytes) + let hash_result = hash_squeeze_twice(input_array); // Write full 64 bytes (16 u32s) of result as the hash let output_offset = test_id * 16u; @@ -4386,12 +4376,12 @@ fn main(@builtin(global_invocation_id) global_id: vec3) {{ ); let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor { - label: Some("Double Hash Test Shader"), + label: Some("Hash Squeeze Twice Test Shader"), source: wgpu::ShaderSource::Wgsl(shader_source.into()), }); let pipeline = device.create_compute_pipeline(&wgpu::ComputePipelineDescriptor { - label: Some("Double Hash Test Pipeline"), + label: Some("Hash Squeeze Twice Test Pipeline"), layout: None, module: &shader, entry_point: Some("main"), diff --git a/crates/miner-service/src/lib.rs b/crates/miner-service/src/lib.rs index d81258d..4fa10cb 100644 --- a/crates/miner-service/src/lib.rs +++ b/crates/miner-service/src/lib.rs @@ -55,6 +55,8 @@ pub struct WorkerResult { pub thread_id: usize, /// The type of engine (CPU or GPU) that produced this result. pub engine_type: EngineType, + /// The job ID this result was computed for (used to detect stale results). + pub job_id: u64, /// The winning candidate, if found. pub candidate: Option, /// Number of hashes computed by this worker. @@ -87,8 +89,8 @@ fn generate_random_nonce() -> U512 { pub struct MiningJob { /// Job context with header hash and difficulty pub ctx: pow_core::JobContext, - /// Epoch number to detect stale results after job transitions - pub epoch: u64, + /// Job ID to detect stale results after job transitions + pub job_id: u64, } /// Persistent worker thread pool that keeps threads alive between jobs. @@ -102,8 +104,8 @@ pub struct WorkerPool { result_rx: Receiver, /// Shared cancellation flag for all workers cancel_flag: Arc, - /// Job epoch counter - incremented on each new job to detect stale results - job_epoch: Arc, + /// Job ID counter - incremented on each new job to detect stale results + current_job_id: Arc, /// Thread handles (for cleanup) _handles: Vec>, /// Number of CPU workers @@ -123,7 +125,7 @@ impl WorkerPool { let total_workers = cpu_workers + gpu_devices; let (result_tx, result_rx) = bounded(total_workers * 64); let cancel_flag = Arc::new(AtomicBool::new(false)); - let job_epoch = Arc::new(AtomicU64::new(0)); + let current_job_id = Arc::new(AtomicU64::new(0)); let mut job_senders = Vec::with_capacity(total_workers); let mut handles = Vec::with_capacity(total_workers); @@ -145,11 +147,19 @@ impl WorkerPool { let eng = engine.clone(); let tx = result_tx.clone(); let cancel = cancel_flag.clone(); - let epoch = job_epoch.clone(); + let job_id_counter = current_job_id.clone(); let tid = thread_id; let handle = thread::spawn(move || { - worker_loop(tid, EngineType::Cpu, eng, job_rx, tx, cancel, epoch); + worker_loop( + tid, + EngineType::Cpu, + eng, + job_rx, + tx, + cancel, + job_id_counter, + ); }); handles.push(handle); thread_id += 1; @@ -167,11 +177,19 @@ impl WorkerPool { let eng = engine.clone(); let tx = result_tx.clone(); let cancel = cancel_flag.clone(); - let epoch = job_epoch.clone(); + let job_id_counter = current_job_id.clone(); let tid = thread_id; let handle = thread::spawn(move || { - worker_loop(tid, EngineType::Gpu, eng, job_rx, tx, cancel, epoch); + worker_loop( + tid, + EngineType::Gpu, + eng, + job_rx, + tx, + cancel, + job_id_counter, + ); }); handles.push(handle); thread_id += 1; @@ -183,7 +201,7 @@ impl WorkerPool { job_senders, result_rx, cancel_flag, - job_epoch, + current_job_id, _handles: handles, cpu_worker_count: cpu_workers, gpu_worker_count: gpu_devices, @@ -191,10 +209,12 @@ impl WorkerPool { } /// Start a new mining job. Cancels any currently running job first. - pub fn start_job(&self, header_hash: [u8; 32], difficulty: U512) { - // Increment epoch FIRST - this ensures any in-flight results from the old job - // will be detected as stale when workers check the epoch before sending results - let new_epoch = self.job_epoch.fetch_add(1, Ordering::SeqCst) + 1; + /// + /// Returns the new job ID, which can be used to filter stale results. + pub fn start_job(&self, header_hash: [u8; 32], difficulty: U512) -> u64 { + // Increment job ID FIRST - this ensures any in-flight results from the old job + // will be detected as stale when workers check the job ID before sending results + let new_job_id = self.current_job_id.fetch_add(1, Ordering::SeqCst) + 1; // Cancel any running job self.cancel_flag.store(true, Ordering::SeqCst); @@ -209,7 +229,7 @@ impl WorkerPool { let ctx = pow_core::JobContext::new(header_hash, difficulty); let job = MiningJob { ctx, - epoch: new_epoch, + job_id: new_job_id, }; // Dispatch job to all workers @@ -220,10 +240,12 @@ impl WorkerPool { } log::debug!( - "Job dispatched to {} workers (epoch {})", + "Job dispatched to {} workers (job_id {})", self.job_senders.len(), - new_epoch + new_job_id ); + + new_job_id } /// Cancel the current job. @@ -265,14 +287,14 @@ fn worker_loop( job_rx: Receiver, result_tx: Sender, cancel_flag: Arc, - current_epoch: Arc, + current_job_id: Arc, ) { let type_str = match engine_type { EngineType::Cpu => "CPU", EngineType::Gpu => "GPU", }; - log::info!("{} worker {} started (persistent)", type_str, thread_id); + log::info!("{type_str} worker {thread_id} started (persistent)"); // Main job processing loop loop { @@ -281,17 +303,17 @@ fn worker_loop( Ok(job) => job, Err(_) => { // Channel closed, pool is shutting down - log::debug!("{} worker {} shutting down", type_str, thread_id); + log::debug!("{type_str} worker {thread_id} shutting down"); break; } }; - // Capture the job's epoch for later validation - let job_epoch = job.epoch; + // Capture the job's ID for later validation + let job_id = job.job_id; // Check if already cancelled before starting if cancel_flag.load(Ordering::Relaxed) { - log::debug!("{} worker {} skipping cancelled job", type_str, thread_id); + log::debug!("{type_str} worker {thread_id} skipping cancelled job"); continue; } @@ -300,10 +322,7 @@ fn worker_loop( let end = U512::MAX; log::debug!( - "{} worker {} processing job (epoch {}): range {} to {}", - type_str, - thread_id, - job_epoch, + "{type_str} worker {thread_id} processing job {job_id}: range {} to {}", format_u512(start), format_u512(end) ); @@ -312,15 +331,11 @@ fn worker_loop( let range = EngineRange { start, end }; let result = engine.search_range(&job.ctx, range, &cancel_flag); - // Check if epoch changed during search - if so, this result is stale - let actual_epoch = current_epoch.load(Ordering::SeqCst); - if actual_epoch != job_epoch { + // Check if job ID changed during search - if so, this result is stale + let actual_job_id = current_job_id.load(Ordering::SeqCst); + if actual_job_id != job_id { log::debug!( - "⏰ {} worker {} discarding stale result (job epoch {} != current epoch {})", - type_str, - thread_id, - job_epoch, - actual_epoch + "⏰ {type_str} worker {thread_id} discarding stale result (job {job_id} != current {actual_job_id})" ); // Still send hash count for metrics, but without the candidate let hash_count = match result { @@ -332,6 +347,7 @@ fn worker_loop( let _ = result_tx.try_send(WorkerResult { thread_id, engine_type, + job_id, candidate: None, // Discard the stale candidate hash_count, completed: true, @@ -347,31 +363,18 @@ fn worker_loop( .. } => { log::info!( - "🎉 {} worker {} found solution! Nonce: {}, Hash: {} (epoch {})", - type_str, - thread_id, + "🎉 {type_str} worker {thread_id} found solution! Nonce: {}, Hash: {} (job {job_id})", format_u512(nonce), format_u512(hash), - job_epoch ); (Some(MiningCandidate { nonce, work, hash }), hash_count) } engine_cpu::EngineStatus::Exhausted { hash_count } => { - log::debug!( - "{} worker {} exhausted range ({} hashes)", - type_str, - thread_id, - hash_count - ); + log::debug!("{type_str} worker {thread_id} exhausted range ({hash_count} hashes)"); (None, hash_count) } engine_cpu::EngineStatus::Cancelled { hash_count } => { - log::debug!( - "{} worker {} cancelled ({} hashes)", - type_str, - thread_id, - hash_count - ); + log::debug!("{type_str} worker {thread_id} cancelled ({hash_count} hashes)"); (None, hash_count) } engine_cpu::EngineStatus::Running { .. } => { @@ -384,6 +387,7 @@ fn worker_loop( let _ = result_tx.try_send(WorkerResult { thread_id, engine_type, + job_id, candidate, hash_count, completed: true, @@ -395,7 +399,7 @@ fn worker_loop( engine_gpu::GpuEngine::clear_worker_resources(); } - log::debug!("{} worker {} exited", type_str, thread_id); + log::debug!("{type_str} worker {thread_id} exited"); } /// Resolve GPU configuration and initialize the engine. diff --git a/crates/miner-service/src/quic.rs b/crates/miner-service/src/quic.rs index 00d1eef..ce452e2 100644 --- a/crates/miner-service/src/quic.rs +++ b/crates/miner-service/src/quic.rs @@ -132,7 +132,10 @@ async fn handle_connection( metrics::reset_hash_tracker(); // Current job state - let mut current_job_id: Option = None; + // - node_job_id: The string ID from the node (e.g., "27") - used in protocol messages + // - internal_job_id: Our internal numeric ID from WorkerPool - used to detect stale results + let mut node_job_id: Option = None; + let mut internal_job_id: u64 = 0; let mut job_start_time: Option = None; let mut cpu_hashes: u64 = 0; let mut gpu_hashes: u64 = 0; @@ -142,7 +145,7 @@ async fn handle_connection( loop { // Poll for worker results (non-blocking via spawn_blocking) - let poll_result = if current_job_id.is_some() && !result_sent_for_current_job { + let poll_result = if node_job_id.is_some() && !result_sent_for_current_job { let rx = worker_pool.result_receiver().clone(); tokio::task::spawn_blocking(move || rx.recv_timeout(Duration::from_millis(10))) .await @@ -153,7 +156,7 @@ async fn handle_connection( // Handle worker result if any if let Ok(worker_result) = poll_result { - // Track hashes by engine type + // Track hashes by engine type (always, even for stale results) match worker_result.engine_type { EngineType::Cpu => { cpu_hashes += worker_result.hash_count; @@ -165,20 +168,28 @@ async fn handle_connection( } } - // Only send result for the FIRST solution found + // Check if this result is for the current job (not stale) + if worker_result.job_id != internal_job_id { + log::debug!( + "⏰ Discarding stale result from worker {} (result job_id {} != current {})", + worker_result.thread_id, + worker_result.job_id, + internal_job_id + ); + continue; + } + + // Only send result for the FIRST solution found for THIS job if let Some(candidate) = worker_result.candidate { if !result_sent_for_current_job { - if let Some(ref job_id) = current_job_id { + if let Some(ref job_id) = node_job_id { let total_hashes = cpu_hashes + gpu_hashes; let elapsed = job_start_time .map(|t| t.elapsed().as_secs_f64()) .unwrap_or(0.0); log::info!( - "⛏️ Job {} completed: {} hashes in {:.2}s ({})", - job_id, - total_hashes, - elapsed, + "⛏️ Job {job_id} completed: {total_hashes} hashes in {elapsed:.2}s ({})", format_hashrate(total_hashes as f64 / elapsed.max(0.001)) ); @@ -194,6 +205,7 @@ async fn handle_connection( work: Some(hex::encode(candidate.work)), hash_count: total_hashes, elapsed_time: elapsed, + miner_id: None, }; let msg = MinerMessage::JobResult(result); @@ -232,6 +244,7 @@ async fn handle_connection( work: None, hash_count: 0, elapsed_time: 0.0, + miner_id: None, }; let msg = MinerMessage::JobResult(result); send_message_checked(&connection, &mut send, &msg).await?; @@ -251,6 +264,7 @@ async fn handle_connection( work: None, hash_count: 0, elapsed_time: 0.0, + miner_id: None, }; let msg = MinerMessage::JobResult(result); send_message_checked(&connection, &mut send, &msg).await?; @@ -262,13 +276,14 @@ async fn handle_connection( cpu_hashes = 0; gpu_hashes = 0; job_start_time = Some(Instant::now()); - current_job_id = Some(request.job_id.clone()); + node_job_id = Some(request.job_id.clone()); result_sent_for_current_job = false; log::debug!("Starting job {}", request.job_id); metrics::set_active_jobs(1); - worker_pool.start_job(header_hash, difficulty); + // start_job returns the internal job ID used to detect stale results + internal_job_id = worker_pool.start_job(header_hash, difficulty); } Ok(MinerMessage::JobResult(_)) => { log::warn!("Received unexpected JobResult from node"); diff --git a/crates/pow-core/src/lib.rs b/crates/pow-core/src/lib.rs index 7f909fb..7c286ee 100644 --- a/crates/pow-core/src/lib.rs +++ b/crates/pow-core/src/lib.rs @@ -29,7 +29,7 @@ pub fn format_hashrate(hashes_per_sec: f64) -> String { } } -/// Job context for Bitcoin-style PoW mining with double Poseidon2 hashing +/// Job context for PoW mining with Poseidon2 hash_squeeze_twice #[derive(Debug, Clone)] pub struct JobContext { pub header: [u8; 32], @@ -62,7 +62,7 @@ pub fn step_nonce(nonce: U512) -> U512 { nonce.saturating_add(U512::from(1u64)) } -/// Compute hash for the current nonce using Bitcoin-style double Poseidon2 +/// Compute hash for the current nonce using Poseidon2 hash_squeeze_twice pub fn hash_from_nonce(ctx: &JobContext, nonce: U512) -> U512 { let nonce_bytes = nonce.to_big_endian(); qpow_math::get_nonce_hash(ctx.header, nonce_bytes)