From 2758b7a2f7fe3c996089758c75c7c1992d9249b2 Mon Sep 17 00:00:00 2001 From: Tom Date: Wed, 26 Nov 2025 16:13:06 +1100 Subject: [PATCH] Add zk proving support --- Cargo.lock | 1132 ++++++++++++++++++++- Cargo.toml | 1 + apps/transfers/src/app.rs | 18 +- apps/transfers/tests/balance_test.rs | 4 +- apps/transfers/tests/panic_safety_test.rs | 12 +- node/Cargo.toml | 3 +- node/src/lib.rs | 392 ++++++- node/src/proof.rs | 38 + 8 files changed, 1557 insertions(+), 43 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3f10de0..32dbb5d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,27 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + [[package]] name = "allocator-api2" version = "0.2.21" @@ -702,7 +723,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8e52276fdb553d3c11563afad2898f4085165e4093604afe3d78b69afbf408f" dependencies = [ "alloy-primitives", - "darling", + "darling 0.21.3", "proc-macro2", "quote", "syn 2.0.108", @@ -773,6 +794,72 @@ version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-r1cs-std", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0c292754729c8a190e50414fd1a37093c786c709899f29c9f7daccecfa855e" +dependencies = [ + "ahash", + "ark-crypto-primitives-macros", + "ark-ec", + "ark-ff 0.5.0", + "ark-relations", + "ark-serialize 0.5.0", + "ark-snark", + "ark-std 0.5.0", + "blake2", + "derivative", + "digest 0.10.7", + "fnv", + "merlin", + "sha2", +] + +[[package]] +name = "ark-crypto-primitives-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", + "itertools 0.13.0", + "num-bigint", + "num-integer", + "num-traits", + "zeroize", +] + [[package]] name = "ark-ff" version = "0.3.0" @@ -899,6 +986,65 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "ark-groth16" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88f1d0f3a534bb54188b8dcc104307db6c56cdae574ddc3212aec0625740fc7e" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff 0.5.0", + "ark-poly", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", +] + +[[package]] +name = "ark-r1cs-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-relations", + "ark-std 0.5.0", + "educe", + "num-bigint", + "num-integer", + "num-traits", + "tracing", +] + +[[package]] +name = "ark-relations" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" +dependencies = [ + "ark-ff 0.5.0", + "ark-std 0.5.0", + "tracing", + "tracing-subscriber 0.2.25", +] + [[package]] name = "ark-serialize" version = "0.3.0" @@ -926,12 +1072,36 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" dependencies = [ + "ark-serialize-derive", "ark-std 0.5.0", "arrayvec", "digest 0.10.7", "num-bigint", ] +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "ark-snark" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" +dependencies = [ + "ark-ff 0.5.0", + "ark-relations", + "ark-serialize 0.5.0", + "ark-std 0.5.0", +] + [[package]] name = "ark-std" version = "0.3.0" @@ -962,6 +1132,12 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + [[package]] name = "arrayvec" version = "0.7.6" @@ -1126,6 +1302,15 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bit-set" version = "0.8.0" @@ -1157,6 +1342,12 @@ dependencies = [ "hex-conservative", ] +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.10.0" @@ -1175,6 +1366,21 @@ dependencies = [ "wyz", ] +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "block-buffer" version = "0.10.4" @@ -1196,6 +1402,42 @@ dependencies = [ "zeroize", ] +[[package]] +name = "bonsai-sdk" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21055e2f49cbbdbfe9f8f96d597c5527b0c6ab7933341fdc2f147180e48a988e" +dependencies = [ + "duplicate", + "maybe-async", + "reqwest", + "serde", + "thiserror 2.0.17", +] + +[[package]] +name = "borsh" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "bs58" version = "0.5.1" @@ -1218,6 +1460,26 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" +[[package]] +name = "bytemuck" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "byteorder" version = "1.5.0" @@ -1248,6 +1510,38 @@ dependencies = [ "serde", ] +[[package]] +name = "camino" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.27", + "serde", + "serde_json", + "thiserror 2.0.17", +] + [[package]] name = "cc" version = "1.2.41" @@ -1322,6 +1616,15 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.17", +] + [[package]] name = "coins-bip32" version = "0.12.0" @@ -1433,6 +1736,17 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + [[package]] name = "cpufeatures" version = "0.2.17" @@ -1491,14 +1805,38 @@ dependencies = [ "typenum", ] +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + [[package]] name = "darling" version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.21.3", + "darling_macro 0.21.3", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.108", ] [[package]] @@ -1516,13 +1854,24 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core 0.20.11", + "quote", + "syn 2.0.108", +] + [[package]] name = "darling_macro" version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ - "darling_core", + "darling_core 0.21.3", "quote", "syn 2.0.108", ] @@ -1554,6 +1903,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", + "pem-rfc7468", "zeroize", ] @@ -1578,6 +1928,37 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn 2.0.108", +] + [[package]] name = "derive_more" version = "2.0.1" @@ -1620,6 +2001,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -1631,12 +2033,35 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "docker-generate" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf673e0848ef09fa4aeeba78e681cf651c0c7d35f76ee38cec8e55bc32fa111" + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + [[package]] name = "dunce" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "duplicate" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e92f10a49176cbffacaedabfaa11d51db1ea0f80a83c26e1873b43cd1742c24" +dependencies = [ + "heck", + "proc-macro2", + "proc-macro2-diagnostics", +] + [[package]] name = "dyn-clone" version = "1.0.20" @@ -1679,6 +2104,12 @@ dependencies = [ "serde", ] +[[package]] +name = "elf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" + [[package]] name = "elliptic-curve" version = "0.13.8" @@ -1699,6 +2130,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "encoding_rs" version = "0.8.35" @@ -1836,7 +2279,28 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", ] [[package]] @@ -1845,6 +2309,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + [[package]] name = "form_urlencoded" version = "1.2.2" @@ -2098,6 +2568,12 @@ dependencies = [ "arrayvec", ] +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + [[package]] name = "hmac" version = "0.12.1" @@ -2392,6 +2868,12 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "include_bytes_aligned" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" + [[package]] name = "increment" version = "0.1.0" @@ -2408,7 +2890,7 @@ dependencies = [ "tokio", "tokio-util", "tracing", - "tracing-subscriber", + "tracing-subscriber 0.3.20", "void-app-node", "void-toolkit", ] @@ -2535,11 +3017,37 @@ dependencies = [ "sha3-asm", ] +[[package]] +name = "lazy-regex" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "191898e17ddee19e60bccb3945aa02339e81edd4a8c50e21fd4d48cdecda7b29" +dependencies = [ + "lazy-regex-proc_macros", + "once_cell", + "regex", +] + +[[package]] +name = "lazy-regex-proc_macros" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c35dc8b0da83d1a9507e12122c80dea71a9c7c613014347392483a83ea593e04" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn 2.0.108", +] + [[package]] name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] [[package]] name = "libc" @@ -2553,6 +3061,16 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags 2.10.0", + "libc", +] + [[package]] name = "libsqlite3-sys" version = "0.35.0" @@ -2616,18 +3134,65 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + [[package]] name = "matchit" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" +[[package]] +name = "maybe-async" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "memchr" version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.10.0", + "block", + "core-graphics-types", + "foreign-types 0.5.0", + "log", + "objc", + "paste", +] + [[package]] name = "mime" version = "0.3.17" @@ -2662,6 +3227,12 @@ dependencies = [ "tempfile", ] +[[package]] +name = "no_std_strings" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5b0c77c1b780822bc749a33e39aeb2c07584ab93332303babeabb645298a76e" + [[package]] name = "nu-ansi-term" version = "0.50.3" @@ -2681,6 +3252,22 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -2696,6 +3283,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -2751,6 +3349,15 @@ dependencies = [ "smallvec", ] +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -2769,9 +3376,9 @@ version = "0.10.74" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" dependencies = [ - "bitflags", + "bitflags 2.10.0", "cfg-if", - "foreign-types", + "foreign-types 0.3.2", "libc", "once_cell", "openssl-macros", @@ -2807,6 +3414,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "parity-scale-codec" version = "3.7.5" @@ -2874,6 +3487,15 @@ dependencies = [ "hmac", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -2932,6 +3554,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + [[package]] name = "pkcs8" version = "0.10.2" @@ -2948,6 +3581,18 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + [[package]] name = "potential_utf" version = "0.1.3" @@ -2989,7 +3634,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit", + "toml_edit 0.23.7", ] [[package]] @@ -3023,6 +3668,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", + "version_check", +] + [[package]] name = "proptest" version = "1.8.0" @@ -3031,7 +3688,7 @@ checksum = "2bb0be07becd10686a0bb407298fb425360a5c44a663774406340c59a22de4ce" dependencies = [ "bit-set", "bit-vec", - "bitflags", + "bitflags 2.10.0", "lazy_static", "num-traits", "rand 0.9.2", @@ -3043,6 +3700,29 @@ dependencies = [ "unarray", ] +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -3202,7 +3882,18 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags", + "bitflags 2.10.0", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 2.0.17", ] [[package]] @@ -3225,6 +3916,29 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + [[package]] name = "regex-syntax" version = "0.8.8" @@ -3240,6 +3954,7 @@ dependencies = [ "base64 0.22.1", "bytes", "encoding_rs", + "futures-channel", "futures-core", "futures-util", "h2", @@ -3311,6 +4026,220 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "risc0-binfmt" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dca096030bb4c52f99b12abcfe3531ea93b17b95a12a5aeb06fbf8ee588a275" +dependencies = [ + "anyhow", + "borsh", + "bytemuck", + "derive_more", + "elf", + "lazy_static", + "postcard", + "rand 0.9.2", + "risc0-zkp", + "risc0-zkvm-platform", + "ruint", + "semver 1.0.27", + "serde", + "tracing", +] + +[[package]] +name = "risc0-build" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e744682b661f2a022fddffddfe242608f8b194e839d9e83ddbb3378974942241" +dependencies = [ + "anyhow", + "cargo_metadata", + "derive_builder", + "dirs", + "docker-generate", + "hex", + "risc0-binfmt", + "risc0-zkos-v1compat", + "risc0-zkp", + "risc0-zkvm-platform", + "rzup", + "semver 1.0.27", + "serde", + "serde_json", + "stability", + "tempfile", +] + +[[package]] +name = "risc0-circuit-keccak" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e1d23ef3648bb85b0bd37bc9f9f7d13f1a4388e5e779e18f7eea82b969e5dbc" +dependencies = [ + "anyhow", + "bytemuck", + "paste", + "risc0-binfmt", + "risc0-circuit-recursion", + "risc0-core", + "risc0-zkp", + "tracing", +] + +[[package]] +name = "risc0-circuit-recursion" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "028cd26e1b1f7bdd964d2f1eac8f812d1872b6b8fd24f10804f07d916b90000e" +dependencies = [ + "anyhow", + "bytemuck", + "hex", + "metal", + "risc0-core", + "risc0-zkp", + "tracing", +] + +[[package]] +name = "risc0-circuit-rv32im" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ecd73a71ddce62eab8a28552ee182dc2ea08cdce2a3474a616a80bf2d6e9be" +dependencies = [ + "anyhow", + "bit-vec", + "bytemuck", + "derive_more", + "paste", + "risc0-binfmt", + "risc0-core", + "risc0-zkp", + "serde", + "tracing", +] + +[[package]] +name = "risc0-core" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80f2723fedace48c6c5a505bd8f97ac4e1712bc4cb769083e10536d862b66987" +dependencies = [ + "bytemuck", + "rand_core 0.9.3", +] + +[[package]] +name = "risc0-groth16" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ff13f9b427254c5264e01aaa32e33f355525299b6829449295905778f3b1e8" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ec", + "ark-ff 0.5.0", + "ark-groth16", + "ark-serialize 0.5.0", + "bytemuck", + "hex", + "num-bigint", + "num-traits", + "risc0-binfmt", + "risc0-zkp", + "serde", +] + +[[package]] +name = "risc0-zkos-v1compat" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf1f35f2ef61d8d86fdd06288c11d2f3bbf08f1af66b24ca0a1976ecbf324a1" +dependencies = [ + "include_bytes_aligned", + "no_std_strings", + "risc0-zkvm-platform", +] + +[[package]] +name = "risc0-zkp" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beb493b3f007f04a11106a001c66bca77338d0fc375766189fd7ca3a1e8c3700" +dependencies = [ + "anyhow", + "blake2", + "borsh", + "bytemuck", + "cfg-if", + "digest 0.10.7", + "hex", + "hex-literal", + "metal", + "paste", + "rand_core 0.9.3", + "risc0-core", + "risc0-zkvm-platform", + "serde", + "sha2", + "stability", + "tracing", +] + +[[package]] +name = "risc0-zkvm" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39d9943fe71decea1e8b6a99480cefa33799ab08b5abfccd7e2a18fb07121c1" +dependencies = [ + "anyhow", + "bincode", + "bonsai-sdk", + "borsh", + "bytemuck", + "bytes", + "derive_more", + "hex", + "lazy-regex", + "prost", + "risc0-binfmt", + "risc0-build", + "risc0-circuit-keccak", + "risc0-circuit-recursion", + "risc0-circuit-rv32im", + "risc0-core", + "risc0-groth16", + "risc0-zkos-v1compat", + "risc0-zkp", + "risc0-zkvm-platform", + "rrs-lib", + "rzup", + "semver 1.0.27", + "serde", + "sha2", + "stability", + "tempfile", + "tracing", +] + +[[package]] +name = "risc0-zkvm-platform" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfaa10feba15828c788837ddde84b994393936d8f5715228627cfe8625122a40" +dependencies = [ + "bytemuck", + "cfg-if", + "getrandom 0.2.16", + "getrandom 0.3.4", + "libm", + "num_enum", + "paste", + "stability", +] + [[package]] name = "rlp" version = "0.5.2" @@ -3321,6 +4250,36 @@ dependencies = [ "rustc-hex", ] +[[package]] +name = "rrs-lib" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" +dependencies = [ + "downcast-rs", + "paste", +] + +[[package]] +name = "rsa" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" +dependencies = [ + "const-oid", + "digest 0.10.7", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "ruint" version = "1.17.0" @@ -3331,6 +4290,7 @@ dependencies = [ "ark-ff 0.3.0", "ark-ff 0.4.2", "ark-ff 0.5.0", + "borsh", "bytes", "fastrlp 0.3.1", "fastrlp 0.4.0", @@ -3361,7 +4321,7 @@ version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" dependencies = [ - "bitflags", + "bitflags 2.10.0", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -3405,7 +4365,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys", @@ -3471,6 +4431,25 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "rzup" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d2aed296f203fa64bcb4b52069356dd86d6ec578593985b919b6995bee1f0ae" +dependencies = [ + "hex", + "rsa", + "semver 1.0.27", + "serde", + "serde_with", + "sha2", + "strum", + "tempfile", + "thiserror 2.0.17", + "toml", + "yaml-rust2", +] + [[package]] name = "schannel" version = "0.1.28" @@ -3552,7 +4531,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags", + "bitflags 2.10.0", "core-foundation", "core-foundation-sys", "libc", @@ -3583,6 +4562,10 @@ name = "semver" version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] [[package]] name = "semver-parser" @@ -3653,6 +4636,15 @@ dependencies = [ "serde_core", ] +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3690,7 +4682,7 @@ version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" dependencies = [ - "darling", + "darling 0.21.3", "proc-macro2", "quote", "syn 2.0.108", @@ -3820,6 +4812,12 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "spki" version = "0.7.3" @@ -3830,6 +4828,16 @@ dependencies = [ "der", ] +[[package]] +name = "stability" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" +dependencies = [ + "quote", + "syn 2.0.108", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -3935,7 +4943,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags", + "bitflags 2.10.0", "core-foundation", "system-configuration-sys", ] @@ -4181,6 +5189,27 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + [[package]] name = "toml_datetime" version = "0.7.3" @@ -4190,6 +5219,20 @@ dependencies = [ "serde_core", ] +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap 2.12.0", + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_write", + "winnow", +] + [[package]] name = "toml_edit" version = "0.23.7" @@ -4197,7 +5240,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" dependencies = [ "indexmap 2.12.0", - "toml_datetime", + "toml_datetime 0.7.3", "toml_parser", "winnow", ] @@ -4211,6 +5254,12 @@ dependencies = [ "winnow", ] +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + [[package]] name = "tower" version = "0.5.2" @@ -4233,7 +5282,7 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags", + "bitflags 2.10.0", "bytes", "futures-util", "http", @@ -4301,6 +5350,15 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "tracing-core", +] + [[package]] name = "tracing-subscriber" version = "0.3.20" @@ -4334,7 +5392,7 @@ dependencies = [ "tokio", "tokio-util", "tracing", - "tracing-subscriber", + "tracing-subscriber 0.3.20", "void-app-node", "void-toolkit", ] @@ -4491,6 +5549,7 @@ dependencies = [ "http", "pin-project-lite", "reqwest", + "risc0-zkvm", "rusqlite", "serde", "serde_json", @@ -4500,7 +5559,7 @@ dependencies = [ "tokio", "tokio-util", "tower-http", - "tracing-subscriber", + "tracing-subscriber 0.3.20", "void-toolkit", ] @@ -4516,7 +5575,7 @@ dependencies = [ [[package]] name = "void-merkle" version = "0.1.0" -source = "git+ssh://git@github.com/essential-contributions/void-toolkit.git#fd8b6194eca5f1c84434760ba3e8f27e0a11f4db" +source = "git+ssh://git@github.com/essential-contributions/void-toolkit.git#f7fbd9e5bf92184d41dbbf2f294f4e534fdc0527" dependencies = [ "alloy", "serde", @@ -4527,7 +5586,7 @@ dependencies = [ [[package]] name = "void-network-channel" version = "0.1.0" -source = "git+ssh://git@github.com/essential-contributions/void-toolkit.git#fd8b6194eca5f1c84434760ba3e8f27e0a11f4db" +source = "git+ssh://git@github.com/essential-contributions/void-toolkit.git#f7fbd9e5bf92184d41dbbf2f294f4e534fdc0527" dependencies = [ "axum", "base64 0.22.1", @@ -4593,7 +5652,7 @@ source = "git+ssh://git@github.com/essential-contributions/void-oracle.git#51d98 [[package]] name = "void-oracle-decoder" version = "0.1.0" -source = "git+ssh://git@github.com/essential-contributions/void-toolkit.git#fd8b6194eca5f1c84434760ba3e8f27e0a11f4db" +source = "git+ssh://git@github.com/essential-contributions/void-toolkit.git#f7fbd9e5bf92184d41dbbf2f294f4e534fdc0527" dependencies = [ "alloy", "serde_json", @@ -4611,10 +5670,23 @@ dependencies = [ "serde_yaml_ng", ] +[[package]] +name = "void-proof" +version = "0.1.0" +source = "git+ssh://git@github.com/essential-contributions/void-toolkit.git#f7fbd9e5bf92184d41dbbf2f294f4e534fdc0527" +dependencies = [ + "risc0-zkvm", + "serde", + "serde_json", + "thiserror 2.0.17", + "tracing", + "void-types", +] + [[package]] name = "void-toolkit" version = "0.1.0" -source = "git+ssh://git@github.com/essential-contributions/void-toolkit.git#fd8b6194eca5f1c84434760ba3e8f27e0a11f4db" +source = "git+ssh://git@github.com/essential-contributions/void-toolkit.git#f7fbd9e5bf92184d41dbbf2f294f4e534fdc0527" dependencies = [ "alloy", "futures", @@ -4631,6 +5703,7 @@ dependencies = [ "void-oracle", "void-oracle-decoder", "void-oracle-types", + "void-proof", "void-types", ] @@ -5111,6 +6184,17 @@ dependencies = [ "tap", ] +[[package]] +name = "yaml-rust2" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2462ea039c445496d8793d052e13787f2b90e750b833afee748e601c17621ed9" +dependencies = [ + "arraydeque", + "encoding_rs", + "hashlink", +] + [[package]] name = "yoke" version = "0.8.0" diff --git a/Cargo.toml b/Cargo.toml index 0577ca9..5b050e4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ hex = "0.4" http = "1.3.1" pin-project-lite = "0.2.16" reqwest = "0.12.15" +risc0-zkvm = "3.0.3" rusqlite = "0.37.0" serde = "1.0.219" serde_json = "1.0.140" diff --git a/apps/transfers/src/app.rs b/apps/transfers/src/app.rs index ef9a9e3..2423e8b 100644 --- a/apps/transfers/src/app.rs +++ b/apps/transfers/src/app.rs @@ -52,26 +52,26 @@ pub trait AppProofs { impl AppStateRef for App { fn get_balance(&self, user: Address, token: Address) -> Balance { - self.balance_tree.get(user, token) + self.balance_tree.get(user, token).unwrap() } } impl AppState for App { fn insert_balance(&mut self, user: Address, token: Address, new_balance: Balance) { - self.balance_tree.insert(user, token, new_balance); + self.balance_tree.insert(user, token, new_balance).unwrap(); } fn insert_burn(&mut self, withdrawal_id: B256, burn: Burn) { - self.burn_tree.insert_raw(withdrawal_id, burn); + self.burn_tree.insert_raw(withdrawal_id, burn).unwrap(); } } impl AppProofs for App { fn balance_root(&self) -> B256 { - self.balance_tree.root() + self.balance_tree.root().unwrap() } fn burn_merkle_proof(&self, withdrawal_id: B256) -> MerkleProof { - self.burn_tree.generate_proof_raw(withdrawal_id) + self.burn_tree.generate_proof_raw(withdrawal_id).unwrap() } } @@ -282,8 +282,8 @@ pub fn handle_withdrawal_request( impl Default for App { fn default() -> Self { Self { - balance_tree: GenericSparseMerkleTree::new(), - burn_tree: GenericSparseMerkleTree::new(), + balance_tree: GenericSparseMerkleTree::new_in_memory(), + burn_tree: GenericSparseMerkleTree::new_in_memory(), } } } @@ -325,8 +325,8 @@ impl ProofConversions for Proof { match store { void_app_node::storage::DataStorage::Db(_) => todo!(), void_app_node::storage::DataStorage::Memory(mem) => { - let balance_root = mem.balance_tree.root(); - let burn_root = mem.burn_tree.root(); + let balance_root = mem.balance_tree.root()?; + let burn_root = mem.burn_tree.root()?; Ok(Proof { balance_root: *balance_root, diff --git a/apps/transfers/tests/balance_test.rs b/apps/transfers/tests/balance_test.rs index 808cb20..95bc985 100644 --- a/apps/transfers/tests/balance_test.rs +++ b/apps/transfers/tests/balance_test.rs @@ -5,8 +5,8 @@ use void_toolkit::merkle::generic_sparse_merkle::GenericSparseMerkleTree; #[test] fn test_balance_newtype() { let mut state = App { - balance_tree: GenericSparseMerkleTree::new(), - burn_tree: GenericSparseMerkleTree::new(), + balance_tree: GenericSparseMerkleTree::new_in_memory(), + burn_tree: GenericSparseMerkleTree::new_in_memory(), }; let alice = Address::from([1u8; 20]); diff --git a/apps/transfers/tests/panic_safety_test.rs b/apps/transfers/tests/panic_safety_test.rs index 679bb7e..425a943 100644 --- a/apps/transfers/tests/panic_safety_test.rs +++ b/apps/transfers/tests/panic_safety_test.rs @@ -58,8 +58,8 @@ fn test_zero_amount_protection() { use void_toolkit::merkle::generic_sparse_merkle::GenericSparseMerkleTree; let mut state = App { - balance_tree: GenericSparseMerkleTree::new(), - burn_tree: GenericSparseMerkleTree::new(), + balance_tree: GenericSparseMerkleTree::new_in_memory(), + burn_tree: GenericSparseMerkleTree::new_in_memory(), }; let user = Address::from([1u8; 20]); @@ -110,8 +110,8 @@ fn test_self_transfer_protection() { use void_toolkit::merkle::generic_sparse_merkle::GenericSparseMerkleTree; let mut state = App { - balance_tree: GenericSparseMerkleTree::new(), - burn_tree: GenericSparseMerkleTree::new(), + balance_tree: GenericSparseMerkleTree::new_in_memory(), + burn_tree: GenericSparseMerkleTree::new_in_memory(), }; let user = Address::from([1u8; 20]); @@ -133,8 +133,8 @@ fn test_graceful_error_propagation() { use void_toolkit::merkle::generic_sparse_merkle::GenericSparseMerkleTree; let mut state = App { - balance_tree: GenericSparseMerkleTree::new(), - burn_tree: GenericSparseMerkleTree::new(), + balance_tree: GenericSparseMerkleTree::new_in_memory(), + burn_tree: GenericSparseMerkleTree::new_in_memory(), }; // Create a mock deposit event with overflow amount diff --git a/node/Cargo.toml b/node/Cargo.toml index 9e9b37b..e48e8c2 100644 --- a/node/Cargo.toml +++ b/node/Cargo.toml @@ -16,6 +16,7 @@ futures.workspace = true http.workspace = true pin-project-lite.workspace = true reqwest.workspace = true +risc0-zkvm.workspace = true rusqlite.workspace = true serde.workspace = true serde_json.workspace = true @@ -26,7 +27,7 @@ tokio.workspace = true tokio-util.workspace = true tower-http.workspace = true tracing-subscriber.workspace = true -void-toolkit = { workspace = true, features = ["merkle", "app", "hash", "network-channel", "oracle-sqlite", "oracle", "oracle-decoder"] } +void-toolkit = { workspace = true, features = ["merkle", "app", "hash", "network-channel", "oracle-sqlite", "oracle", "oracle-decoder", "proof-host"] } [dev-dependencies] alloy = { workspace = true, features = [ "node-bindings", "rlp", "signer-mnemonic" ] } diff --git a/node/src/lib.rs b/node/src/lib.rs index 8797209..7df4926 100644 --- a/node/src/lib.rs +++ b/node/src/lib.rs @@ -7,13 +7,14 @@ use void_toolkit::{ app::{Notification, UpdateLatestBlock, VoidStream}, oracle::{observer_oracle, publisher_oracle}, oracle_decoder::tracing, + proof::host::recursive::{Init, RecursiveArgs}, types::{Block, Height}, }; use crate::{ db::{DbDataConstraints, InitDb}, oracle::{ObserverOracle, Oracle}, - proof::{DigestFromProof, Proof, SignedProof}, + proof::{DigestFromProof, Proof, SignedProof, ZkProof}, server::AddHandlers, storage::{ DataStorage, DataStorageRef, FullMemState, FullMemStateRef, ProofStorageConstraints, @@ -100,6 +101,87 @@ macro_rules! run_signing { }; } +#[macro_export] +macro_rules! run_zk { + ($add_handlers:expr, $init_db:expr, $stf:expr, $api_update:expr, $app:ty, $api:ty, $db_data:ty, $proof:ty) => { + pub async fn run_zk_node( + options: $crate::Options, + elf_code: $crate::ElfCode, + ) -> anyhow::Result<()> { + void_app_node::run_zk_node_with_options( + options, + $add_handlers, + $init_db, + stf, + api, + elf_code, + ) + .await?; + Ok(()) + } + + pub type Node = void_app_node::Node<$app, $api, ZkProof, $db_data>; + + pub type DataStore<'a, 'conn> = $crate::storage::DataStorage<'a, 'conn, $app, $db_data>; + + pub type FullDataStore<'a, 'conn> = + $crate::storage::FullDataStorage<'a, 'conn, $app, $api, $db_data>; + + pub type FullDataStoreRef<'a, 'conn> = + $crate::storage::FullDataStorageRef<'a, 'conn, $app, $api, $db_data>; + + fn stf(block: &Block, state: DataStore) -> anyhow::Result<()> { + $stf(block, state) + } + + fn api(block: &Block, state: FullDataStore) -> anyhow::Result<()> { + $api_update(block, state) + } + + impl From<&$proof> for [u8; 32] { + fn from(proof: &$proof) -> Self { + $crate::proof::ProofConversions::digest(proof) + } + } + + impl From<$proof> for Vec { + fn from(proof: $proof) -> Self { + $crate::proof::ProofConversions::into_bytes(proof) + } + } + + impl TryFrom<&[u8]> for $proof { + type Error = anyhow::Error; + fn try_from(bytes: &[u8]) -> Result { + $crate::proof::ProofConversions::try_from_bytes(bytes) + } + } + + impl + TryFrom< + $crate::storage::DataStorage< + '_, + '_, + <$proof as $crate::proof::ProofConversions>::App, + <$proof as $crate::proof::ProofConversions>::DbData, + >, + > for $proof + { + type Error = anyhow::Error; + fn try_from( + store: $crate::storage::DataStorage< + '_, + '_, + <$proof as $crate::proof::ProofConversions>::App, + <$proof as $crate::proof::ProofConversions>::DbData, + >, + ) -> Result { + $crate::proof::ProofConversions::try_from_storage(store) + } + } + }; +} + pub mod db; pub mod memory; pub mod oracle; @@ -161,6 +243,11 @@ pub struct Observer { pub node_network_endpoint: String, } +pub struct ElfCode { + pub state_elf_code: Vec, + pub recursive_elf_code: Vec, +} + pub struct Node { storage: Storage, state_notification: Notification, @@ -337,6 +424,112 @@ where Ok(()) } +pub async fn run_zk_node_with_options( + options: Options, + add_handlers: F, + init: Init, + stf: Stf, + api_update: ApiU, + elf_code: ElfCode, +) -> anyhow::Result<()> +where + Stf: AppTransition, + ApiU: ApiTransition, + P: Proof, + for<'a>

>::Error: Into, + ZkProof: ProofStorageConstraints + serde::Serialize, + Vec: From, + for<'a> >::Error: Into, + [u8; 32]: DigestFromProof

, + Vec: From

, + F: AddHandlers, + Init: InitDb, + App: Default + Send + 'static, + Api: Default + Send + 'static, + DbData: Default + DbDataConstraints, +{ + if options.tracing { + tracing_subscriber::fmt::try_init().ok(); + } + let run = Run { + storage_type: options + .db_path + .map(|path| StorageType::Db(path, DbData::default())) + .unwrap_or_else(|| StorageType::Memory(App::default(), Api::default())), + server_bind_address: options.server_bind_address, + mode: options.mode, + }; + + run_zk_node(run, add_handlers, init, stf, api_update, elf_code).await +} + +pub async fn run_zk_node( + run: R, + add_handlers: F, + init: Init, + stf: Stf, + api_update: ApiU, + elf_code: ElfCode, +) -> anyhow::Result<()> +where + R: Runner, + Stf: AppTransition, + ApiU: ApiTransition, + P: Proof, + for<'a>

>::Error: Into, + ZkProof: ProofStorageConstraints + serde::Serialize, + Vec: From, + for<'a> >::Error: Into, + [u8; 32]: DigestFromProof

, + Vec: From

, + F: AddHandlers, + Init: InitDb, +{ + let Run { + storage_type, + server_bind_address, + mode, + } = run.runner(); + let node: Node<_, _, ZkProof, _> = Node::new(storage_type)?; + if let Storage::Db(db) = &node.storage { + init_db(db, init).await?; + } + let server_jh = tokio::spawn({ + let node = node.clone(); + async move { server::run(node, server_bind_address, add_handlers).await } + }); + let node_jh = tokio::spawn(async move { + match mode { + Mode::Publisher(publisher) => { + run_zk_publisher( + node, + publisher.node_network_bind_address, + publisher.signer, + publisher.oracle, + stf, + api_update, + elf_code, + ) + .await + } + Mode::Observer(observer) => { + run_zk_observer( + node, + observer.node_network_endpoint, + observer.oracle, + stf, + api_update, + ) + .await + } + } + }); + let (server_res, node_res) = futures::future::try_join(server_jh, node_jh).await?; + server_res?; + node_res?; + Ok(()) +} + async fn init_db(db: &db::Db, init: F) -> anyhow::Result<()> where F: InitDb, @@ -566,6 +759,77 @@ async fn run_signing_observer_stream( stf: Stf, api_update: ApiU, ) -> anyhow::Result<()> +where + Stf: AppTransition, + ApiU: ApiTransition, + DbData: DbDataConstraints, +{ + run_observer_stream(node, oracle, proof_heights, stf, api_update).await +} + +async fn run_zk_observer( + node: Node, + node_network_endpoint: String, + oracle: ObserverOracle, + stf: Stf, + api_update: ApiU, +) -> anyhow::Result<()> +where + Stf: AppTransition, + ApiU: ApiTransition, + App: Send + 'static, + Api: Send + 'static, + DbData: DbDataConstraints, +{ + let (proof_heights_tx, proof_heights_rx) = tokio::sync::mpsc::channel(100); + let receiver_jh = tokio::spawn({ + let replicator = node.replicator.clone(); + async move { + void_toolkit::network_channel::replicate::receiver(0, node_network_endpoint) + .try_for_each(|delta| async { + proof::replicate::recv_delta(&replicator, delta, proof_heights_tx.clone()) + .await; + Ok(()) + }) + .await + } + }); + + let observer_jh = tokio::spawn(run_zk_observer_stream( + node, + oracle, + proof_heights_rx, + stf, + api_update, + )); + let (receiver_res, observer_res) = futures::future::try_join(receiver_jh, observer_jh).await?; + receiver_res?; + observer_res?; + Ok(()) +} + +async fn run_zk_observer_stream( + node: Node, + oracle: ObserverOracle, + proof_heights: mpsc::Receiver, + stf: Stf, + api_update: ApiU, +) -> anyhow::Result<()> +where + Stf: AppTransition, + ApiU: ApiTransition, + DbData: DbDataConstraints, +{ + run_observer_stream(node, oracle, proof_heights, stf, api_update).await +} + +async fn run_observer_stream( + node: Node, + oracle: ObserverOracle, + proof_heights: mpsc::Receiver, + stf: Stf, + api_update: ApiU, +) -> anyhow::Result<()> where Stf: AppTransition, ApiU: ApiTransition, @@ -620,3 +884,129 @@ impl Clone for Node( + node: Node, + node_bind_address: SocketAddr, + signer: PrivateKeySigner, + oracle: Oracle, + stf: Stf, + api_update: ApiU, + elf_code: ElfCode, +) -> anyhow::Result<()> +where + Stf: AppTransition, + ApiU: ApiTransition, + P: Proof, + [u8; 32]: DigestFromProof

, + Vec: From

, + App: Send + 'static, + Api: Send + 'static, + DbData: DbDataConstraints, +{ + let replicator_jh = tokio::spawn(void_toolkit::network_channel::replicate::sender( + node.replicator.clone(), + node_bind_address, + 10, + )); + + let publisher_jh = tokio::spawn(run_zk_publisher_stream( + node, signer, oracle, stf, api_update, elf_code, + )); + let (replicator_res, publisher_res) = + futures::future::try_join(replicator_jh, publisher_jh).await?; + replicator_res?; + publisher_res?; + Ok(()) +} + +async fn run_zk_publisher_stream( + node: Node, + signer: PrivateKeySigner, + oracle: Oracle, + stf: Stf, + api_update: ApiU, + elf_code: ElfCode, +) -> anyhow::Result<()> +where + Stf: AppTransition, + ApiU: ApiTransition, + P: Proof, + Vec: From

, + DbData: DbDataConstraints, +{ + let ElfCode { + state_elf_code, + recursive_elf_code, + } = elf_code; + let recursive_elf_code = Arc::new(recursive_elf_code); + let Oracle { + oracle_config, + oracle_bind_address, + oracle_storage, + } = oracle; + let oracle_storage = oracle::oracle_storage(oracle_storage)?; + + let (last_parent_height, last_parent_hash) = node + .storage + .get_current_block_height_and_hash() + .await? + .map_or((None, [0; 32]), |(h, ph)| (Some(h), ph)); + + let stf = Arc::new(stf); + let api_update = Arc::new(api_update); + + publisher_oracle( + oracle_config, + oracle_storage, + last_parent_height.map_or(0, |h| h + 1), + oracle_bind_address, + 10, + Some(signer.clone()), + ) + .map_err(|e| anyhow::anyhow!("Oracle error: {}", e)) + .block_height_parent(last_parent_height, last_parent_hash) + .and_then(|block| { + state_transition_with_storage(block, &node.storage, stf.clone(), api_update.clone()) + }) + .push_notification(node.state_notification.clone()) + .prove(move |block, witness| void_toolkit::proof::host::prove(&block, witness, &state_elf_code)) + .and_then(|zk_state_proof| { + let node = node.clone(); + let recursive_elf_code = recursive_elf_code.clone(); + async move { + let Height { + block_height, + data: zk_state_proof, + } = zk_state_proof; + let zk_state_proof_receipt = serde_json::from_slice(&zk_state_proof)?; + let latest_proof = node.get_latest_proof().await?; + let recursive = match latest_proof { + Some(recursive_receipt) => { + let recursive_receipt = + serde_json::from_slice(&recursive_receipt.data.proof.data)?; + RecursiveArgs::Step(Box::new(recursive_receipt)) + } + None => RecursiveArgs::Init(Init { + this_image_id: risc0_zkvm::compute_image_id(&recursive_elf_code)?.into(), + }), + }; + let input = void_toolkit::proof::host::recursive::Input { + recursive, + state_receipts: vec![zk_state_proof_receipt], + }; + let result = tokio::task::spawn_blocking(move || { + void_toolkit::proof::host::recursive::proof(input, &recursive_elf_code) + }) + .await?; + Ok(Height::new(block_height, result?)) + } + }) + .try_for_each(|zk_proof| async { + let zk_proof = Height::new(zk_proof.block_height, ZkProof { proof: zk_proof }); + node.replicator.update(zk_proof).await?; + Ok(()) + }) + .await?; + Ok(()) +} diff --git a/node/src/proof.rs b/node/src/proof.rs index f83affc..36fdb69 100644 --- a/node/src/proof.rs +++ b/node/src/proof.rs @@ -49,6 +49,11 @@ pub struct SignedProof

{ pub proof: Signed>, } +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct ZkProof { + pub proof: Height>, +} + impl

From>> for SignedProof

{ fn from(signed_height: Signed>) -> Self { Self { @@ -109,3 +114,36 @@ where Ok(SignedProof { proof: signed }) } } + +impl From for Vec { + fn from(zk_proof: ZkProof) -> Self { + let Height { block_height, data } = zk_proof.proof; + let mut buf = vec![]; + buf.extend(block_height.to_be_bytes()); + buf.extend(data); + buf + } +} + +impl TryFrom<&[u8]> for ZkProof { + type Error = anyhow::Error; + + fn try_from(value: &[u8]) -> Result { + let mut cursor = std::io::Cursor::new(&value); + + // Read block height + let mut height_bytes = [0u8; 8]; + cursor.read_exact(&mut height_bytes)?; + let block_height = u64::from_be_bytes(height_bytes); + + // Read proof data + let mut proof_data = vec![]; + cursor.read_to_end(&mut proof_data)?; + + let height = Height { + block_height, + data: proof_data, + }; + Ok(ZkProof { proof: height }) + } +}