From 9731b04e811664d683f3aa2f8664da9331d573e1 Mon Sep 17 00:00:00 2001 From: "John C. Burnham" Date: Sun, 30 Aug 2026 17:55:21 -0400 Subject: [PATCH 01/10] feat: implement complete Flock Stage 3 prover --- Cargo.lock | 960 ++- Cargo.toml | 11 +- crates/aiur/src/synthesis.rs | 25 + crates/aiur/src/vk_codec.rs | 236 +- crates/terminal/Cargo.toml | 15 + crates/terminal/src/lib.rs | 617 ++ flock-stage3/Cargo.lock | 1251 ++++ flock-stage3/Cargo.toml | 30 + flock-stage3/README.md | 115 + flock-stage3/host/Cargo.toml | 18 + flock-stage3/host/src/air.rs | 1048 +++ flock-stage3/host/src/arithmetic.rs | 676 ++ flock-stage3/host/src/artifact.rs | 381 + .../host/src/bin/flock-stage3-config.rs | 19 + flock-stage3/host/src/binding.rs | 670 ++ flock-stage3/host/src/boolean.rs | 337 + flock-stage3/host/src/config.rs | 121 + flock-stage3/host/src/conformance.rs | 186 + flock-stage3/host/src/equality.rs | 119 + flock-stage3/host/src/extension.rs | 330 + flock-stage3/host/src/fri.rs | 6525 +++++++++++++++++ flock-stage3/host/src/goldilocks.rs | 590 ++ flock-stage3/host/src/lib.rs | 256 + flock-stage3/host/src/merkle.rs | 607 ++ flock-stage3/host/src/multiplication.rs | 421 ++ flock-stage3/host/src/relation.rs | 377 + flock-stage3/host/src/transcript.rs | 2792 +++++++ flock-stage3/host/src/typed_witness.rs | 451 ++ flock-stage3/host/src/window.rs | 161 + 29 files changed, 18799 insertions(+), 546 deletions(-) create mode 100644 crates/terminal/Cargo.toml create mode 100644 crates/terminal/src/lib.rs create mode 100644 flock-stage3/Cargo.lock create mode 100644 flock-stage3/Cargo.toml create mode 100644 flock-stage3/README.md create mode 100644 flock-stage3/host/Cargo.toml create mode 100644 flock-stage3/host/src/air.rs create mode 100644 flock-stage3/host/src/arithmetic.rs create mode 100644 flock-stage3/host/src/artifact.rs create mode 100644 flock-stage3/host/src/bin/flock-stage3-config.rs create mode 100644 flock-stage3/host/src/binding.rs create mode 100644 flock-stage3/host/src/boolean.rs create mode 100644 flock-stage3/host/src/config.rs create mode 100644 flock-stage3/host/src/conformance.rs create mode 100644 flock-stage3/host/src/equality.rs create mode 100644 flock-stage3/host/src/extension.rs create mode 100644 flock-stage3/host/src/fri.rs create mode 100644 flock-stage3/host/src/goldilocks.rs create mode 100644 flock-stage3/host/src/lib.rs create mode 100644 flock-stage3/host/src/merkle.rs create mode 100644 flock-stage3/host/src/multiplication.rs create mode 100644 flock-stage3/host/src/relation.rs create mode 100644 flock-stage3/host/src/transcript.rs create mode 100644 flock-stage3/host/src/typed_witness.rs create mode 100644 flock-stage3/host/src/window.rs diff --git a/Cargo.lock b/Cargo.lock index 2d7e02086..dae039f56 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -39,9 +39,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] @@ -54,7 +54,7 @@ dependencies = [ "indexmap", "libc", "multi-stark", - "num-bigint 0.4.6", + "num-bigint 0.4.8", "rayon", "rustc-hash", "tracing", @@ -69,18 +69,18 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android_system_properties" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" dependencies = [ "libc", ] [[package]] name = "anyhow" -version = "1.0.103" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "ar_archive_writer" @@ -91,27 +91,21 @@ dependencies = [ "object", ] -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - [[package]] name = "arrayvec" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" [[package]] name = "async-trait" -version = "0.1.89" +version = "0.1.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.4", ] [[package]] @@ -154,9 +148,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "backon" @@ -169,6 +163,12 @@ dependencies = [ "tokio", ] +[[package]] +name = "base16ct" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6" + [[package]] name = "base32" version = "0.5.1" @@ -192,7 +192,7 @@ name = "bignat" version = "0.1.0" source = "git+https://github.com/argumentcomputer/lean-ffi.git?rev=93c7e52952ae94546be08313f4ff3922984c84d5#93c7e52952ae94546be08313f4ff3922984c84d5" dependencies = [ - "num-bigint 0.4.6", + "num-bigint 0.4.8", ] [[package]] @@ -231,28 +231,27 @@ dependencies = [ "quote", "regex", "rustc-hash", - "shlex", - "syn", + "shlex 1.3.0", + "syn 2.0.119", ] [[package]] name = "bitflags" -version = "2.11.1" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] name = "blake3" -version = "1.8.5" +version = "1.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" +checksum = "6d9e454fc11f76977dc803893aff6304ed33d6a26efae8696573bea74baa27ae" dependencies = [ - "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", - "cpufeatures 0.3.0", + "cpufeatures 0.3.1", ] [[package]] @@ -284,9 +283,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.20.2" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "byteorder" @@ -296,18 +295,18 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cc" -version = "1.2.61" +version = "1.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" +checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" dependencies = [ "find-msvc-tools", - "shlex", + "shlex 2.0.1", ] [[package]] @@ -327,9 +326,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" [[package]] name = "chacha20" @@ -338,15 +337,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", + "cpufeatures 0.3.1", "rand_core 0.10.1", ] [[package]] name = "chrono" -version = "0.4.44" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ "iana-time-zone", "num-traits", @@ -366,9 +365,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +checksum = "157a8ba7b480713b56f4c09fd13fc3e0a22a5dfab8097ba61cbc5feef950788a" dependencies = [ "glob", "libc", @@ -407,9 +406,9 @@ dependencies = [ [[package]] name = "cordyceps" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" +checksum = "5b9ab7e0ca1d179628fa0172b2b97203c7fa0cd81be2448bd446fb9559ca9261" dependencies = [ "loom", "tracing", @@ -432,9 +431,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" dependencies = [ "libc", ] @@ -447,18 +446,18 @@ checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] name = "crossbeam-channel" -version = "0.5.15" +version = "0.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -475,9 +474,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crunchy" @@ -497,9 +496,9 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ "hybrid-array", ] @@ -539,7 +538,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -563,7 +562,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.119", ] [[package]] @@ -574,14 +573,14 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "dashmap" -version = "6.1.0" +version = "6.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c" dependencies = [ "cfg-if", "crossbeam-utils", @@ -594,15 +593,15 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" +checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" [[package]] name = "der" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b" +checksum = "a69dedd701da44b0536442edf09c81a64b0ab97a7a4a5e3d1971f00027cbc63d" dependencies = [ "const-oid", "pem-rfc7468", @@ -614,9 +613,6 @@ name = "deranged" version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" -dependencies = [ - "powerfmt", -] [[package]] name = "derive_builder" @@ -636,7 +632,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -646,7 +642,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn", + "syn 2.0.119", ] [[package]] @@ -668,7 +664,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn", + "syn 2.0.119", "unicode-xid", ] @@ -696,7 +692,7 @@ checksum = "afa94b64bfc6549e6e4b5a3216f22593224174083da7a90db47e951c4fb31725" dependencies = [ "block-buffer 0.11.0", "const-oid", - "crypto-common 0.2.1", + "crypto-common 0.2.2", ] [[package]] @@ -713,13 +709,13 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.4", ] [[package]] @@ -744,12 +740,12 @@ dependencies = [ [[package]] name = "ed25519" -version = "3.0.0-rc.4" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e914c7c52decb085cea910552e24c63ac019e3ab8bf001ff736da9a9d9d890" +checksum = "29fcf32e6c73d1079f83ab4d782de2d81620346a5f38c6237a86a22f8368980a" dependencies = [ "pkcs8", - "serde", + "serdect", "signature", ] @@ -771,9 +767,9 @@ dependencies = [ [[package]] name = "either" -version = "1.15.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" [[package]] name = "embedded-io" @@ -796,18 +792,18 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "enum-assoc" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed8956bd5c1f0415200516e78ff07ec9e16415ade83c056c230d7b7ea0d55b7" +checksum = "0590c4a94da3372e83493b956755a6e2266830b6e4e3b101afe66e3f39477b91" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.4", ] [[package]] @@ -843,7 +839,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -854,15 +850,15 @@ checksum = "4e7f34442dbe69c60fe8eaf58a8cafff81a1f278816d8ab4db255b3bef4ac3c4" dependencies = [ "getrandom 0.3.4", "libm", - "rand 0.9.4", + "rand 0.9.5", "siphasher", ] [[package]] name = "fastrand" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "fiat-crypto" @@ -872,9 +868,9 @@ checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" [[package]] name = "find-msvc-tools" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" [[package]] name = "fnv" @@ -905,9 +901,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" dependencies = [ "futures-channel", "futures-core", @@ -933,9 +929,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" dependencies = [ "futures-core", "futures-sink", @@ -943,15 +939,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-executor" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" dependencies = [ "futures-core", "futures-task", @@ -960,9 +956,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" [[package]] name = "futures-lite" @@ -979,32 +975,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.4", ] [[package]] name = "futures-sink" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-channel", "futures-core", @@ -1019,9 +1015,9 @@ dependencies = [ [[package]] name = "generator" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" +checksum = "b3b854b0e584ead1a33f18b2fcad7cf7be18b3875c78816b753639aa501513ae" dependencies = [ "cc", "cfg-if", @@ -1071,17 +1067,15 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi 6.0.0", "rand_core 0.10.1", - "wasip2", - "wasip3", "wasm-bindgen", ] @@ -1097,9 +1091,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" [[package]] name = "gloo-timers" @@ -1115,9 +1109,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.16" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9f37a958b41b3b19ee2707c06439c0e9e547e847223eb791ecb0cb821c65e27" +checksum = "ef8e5e5a340588f4452631496976cf8636d4a7ecf600239fdc27615d2530bc16" dependencies = [ "atomic-waker", "bytes", @@ -1171,9 +1165,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "heapless" @@ -1214,7 +1208,7 @@ dependencies = [ "idna", "ipnet", "once_cell", - "rand 0.9.4", + "rand 0.9.5", "ring", "rustls", "thiserror", @@ -1238,7 +1232,7 @@ dependencies = [ "moka", "once_cell", "parking_lot", - "rand 0.9.4", + "rand 0.9.5", "resolv-conf", "rustls", "smallvec", @@ -1250,9 +1244,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" dependencies = [ "bytes", "itoa", @@ -1260,9 +1254,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", "http", @@ -1270,9 +1264,9 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" dependencies = [ "bytes", "futures-core", @@ -1295,18 +1289,18 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hybrid-array" -version = "0.4.11" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d46837a0ed51fe95bd3b05de33cd64a1ee88fc797477ca48446872504507c5" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" dependencies = [ "typenum", ] [[package]] name = "hyper" -version = "1.9.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" dependencies = [ "atomic-waker", "bytes", @@ -1389,9 +1383,9 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" dependencies = [ "displaydoc", "potential_utf", @@ -1403,9 +1397,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" dependencies = [ "displaydoc", "litemap", @@ -1416,9 +1410,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -1430,16 +1424,17 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" [[package]] name = "icu_properties" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" dependencies = [ + "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", @@ -1450,15 +1445,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" [[package]] name = "icu_provider" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" dependencies = [ "displaydoc", "icu_locale_core", @@ -1469,12 +1464,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - [[package]] name = "ident_case" version = "1.0.1" @@ -1523,7 +1512,7 @@ dependencies = [ "hyper", "hyper-util", "log", - "rand 0.9.4", + "rand 0.9.5", "tokio", "url", "xmltree", @@ -1531,15 +1520,13 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.14.0" +version = "2.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" dependencies = [ "equivalent", - "hashbrown 0.17.0", + "hashbrown 0.17.1", "rayon", - "serde", - "serde_core", ] [[package]] @@ -1566,19 +1553,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" - -[[package]] -name = "iri-string" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" -dependencies = [ - "memchr", - "serde", -] +checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" [[package]] name = "iroh" @@ -1613,7 +1590,7 @@ dependencies = [ "pkcs8", "portable-atomic", "portmapper", - "rand 0.9.4", + "rand 0.9.5", "reqwest", "rustc-hash", "rustls", @@ -1678,7 +1655,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -1709,7 +1686,7 @@ dependencies = [ "pin-project", "pkarr", "postcard", - "rand 0.9.4", + "rand 0.9.5", "reqwest", "rustls", "rustls-pki-types", @@ -1794,7 +1771,7 @@ dependencies = [ "ix-common", "ix-kernel", "ixon", - "num-bigint 0.4.6", + "num-bigint 0.4.8", "rayon", "rustc-hash", "sha2 0.10.9", @@ -1827,7 +1804,7 @@ dependencies = [ "mimalloc", "multi-stark", "n0-error", - "num-bigint 0.4.6", + "num-bigint 0.4.8", "rayon", "rustc-hash", "serde", @@ -1859,13 +1836,24 @@ dependencies = [ "ix-common", "ixon", "log", - "num-bigint 0.4.6", + "num-bigint 0.4.8", "quickcheck", "quickcheck_macros", "rayon", "rustc-hash", ] +[[package]] +name = "ix-terminal" +version = "0.1.0" +dependencies = [ + "aiur", + "anyhow", + "bincode", + "blake3", + "multi-stark", +] + [[package]] name = "ixon" version = "0.1.0" @@ -1877,7 +1865,7 @@ dependencies = [ "ix-common", "memmap2", "nom", - "num-bigint 0.4.6", + "num-bigint 0.4.8", "quickcheck", "quickcheck_macros", "rayon", @@ -1895,7 +1883,7 @@ dependencies = [ "ix-common", "ixon", "multi-stark", - "num-bigint 0.4.6", + "num-bigint 0.4.8", "rayon", "rustc-hash", "stacker", @@ -1903,13 +1891,12 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.97" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ "cfg-if", "futures-util", - "once_cell", "wasm-bindgen", ] @@ -1927,20 +1914,14 @@ dependencies = [ "bignat", "bindgen", "cc", - "num-bigint 0.4.6", + "num-bigint 0.4.8", ] -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - [[package]] name = "libc" -version = "0.2.186" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libloading" @@ -1960,9 +1941,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libmimalloc-sys" -version = "0.1.47" +version = "0.1.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1eacfa31c33ec25e873c136ba5669f00f9866d0688bea7be4d3f7e43067df6" +checksum = "6a45a52f43e1c16f667ccfe4dd8c85b7f7c204fd5e3bf46c5b0db9a5c3c0b8e9" dependencies = [ "cc", ] @@ -1975,9 +1956,9 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" [[package]] name = "litrs" @@ -1996,9 +1977,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.29" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "loom" @@ -2045,9 +2026,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "memmap2" @@ -2060,9 +2041,9 @@ dependencies = [ [[package]] name = "mimalloc" -version = "0.1.50" +version = "0.1.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3627c4272df786b9260cabaa46aec1d59c93ede723d4c3ef646c503816b0640" +checksum = "2d4139bb28d14ad1facf21d5eb8825051b326e172d216b39f6d31df53cc97862" dependencies = [ "libmimalloc-sys", ] @@ -2075,9 +2056,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "mio" -version = "1.2.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "wasi", @@ -2086,9 +2067,9 @@ dependencies = [ [[package]] name = "moka" -version = "0.12.15" +version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" +checksum = "4293f18e7567a1caf3c584855554377025c65e0aa445344d04171f5ad63d19b9" dependencies = [ "crossbeam-channel", "crossbeam-epoch", @@ -2144,7 +2125,7 @@ checksum = "03755949235714b2b307e5ae89dd8c1c2531fb127d9b8b7b4adf9c876cd3ed18" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -2203,9 +2184,9 @@ dependencies = [ [[package]] name = "netlink-packet-core" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3463cbb78394cb0141e2c926b93fc2197e473394b761986eca3b9da2c63ae0f4" +checksum = "b897d7bd4f0af82e68d40d0344cf37e97f9c97ddf74a098de3e4da05e96ca395" dependencies = [ "paste", ] @@ -2224,12 +2205,13 @@ dependencies = [ [[package]] name = "netlink-proto" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65d130ee111430e47eed7896ea43ca693c387f097dd97376bffafbf25812128" +checksum = "93af8261786086024cd5e96e0a991dd65ced07bbf7c233a487bbc96b971d5539" dependencies = [ "bytes", - "futures", + "futures-channel", + "futures-util", "log", "netlink-packet-core", "netlink-sys", @@ -2330,7 +2312,7 @@ dependencies = [ "getrandom 0.3.4", "identity-hash", "lru-slab", - "rand 0.9.4", + "rand 0.9.5", "ring", "rustc-hash", "rustls", @@ -2377,14 +2359,14 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "num-bigint" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" dependencies = [ "num-integer", "num-traits", @@ -2402,15 +2384,15 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-integer" -version = "0.1.46" +version = "0.1.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" dependencies = [ "num-traits", ] @@ -2443,7 +2425,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -2604,7 +2586,7 @@ dependencies = [ "p3-maybe-rayon", "p3-util", "paste", - "rand 0.10.1", + "rand 0.10.2", "serde", "tracing", ] @@ -2623,7 +2605,7 @@ dependencies = [ "p3-maybe-rayon", "p3-security", "p3-util", - "rand 0.10.1", + "rand 0.10.2", "serde", "spin 0.12.3", "thiserror", @@ -2644,7 +2626,7 @@ dependencies = [ "p3-symmetric", "p3-util", "paste", - "rand 0.10.1", + "rand 0.10.2", "serde", "spin 0.12.3", ] @@ -2668,7 +2650,7 @@ dependencies = [ "p3-field", "p3-maybe-rayon", "p3-util", - "rand 0.10.1", + "rand 0.10.2", "serde", "tracing", ] @@ -2690,7 +2672,7 @@ dependencies = [ "p3-field", "p3-symmetric", "p3-util", - "rand 0.10.1", + "rand 0.10.2", ] [[package]] @@ -2705,7 +2687,7 @@ dependencies = [ "p3-maybe-rayon", "p3-symmetric", "p3-util", - "rand 0.10.1", + "rand 0.10.2", "serde", "spin 0.12.3", "thiserror", @@ -2722,7 +2704,7 @@ dependencies = [ "p3-matrix", "p3-maybe-rayon", "p3-util", - "rand 0.10.1", + "rand 0.10.2", "serde", "tracing", ] @@ -2735,7 +2717,7 @@ dependencies = [ "p3-field", "p3-mds", "p3-symmetric", - "rand 0.10.1", + "rand 0.10.2", ] [[package]] @@ -2747,7 +2729,7 @@ dependencies = [ "p3-mds", "p3-symmetric", "p3-util", - "rand 0.10.1", + "rand 0.10.2", ] [[package]] @@ -2784,9 +2766,9 @@ dependencies = [ [[package]] name = "papaya" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "997ee03cd38c01469a7046643714f0ad28880bcb9e6679ff0666e24817ca19b7" +checksum = "da2442474a9404698c42509b8967f437249dbc7b50493e83020333d3943ec0ae" dependencies = [ "equivalent", "seize", @@ -2854,22 +2836,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.11" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.11" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -2889,7 +2871,7 @@ dependencies = [ "cfg_aliases", "document-features", "ed25519-dalek", - "getrandom 0.4.2", + "getrandom 0.4.3", "ntimestamp", "self_cell", "serde", @@ -2899,9 +2881,9 @@ dependencies = [ [[package]] name = "pkcs8" -version = "0.11.0-rc.11" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12922b6296c06eb741b02d7b5161e3aaa22864af38dfa025a1a3ba3f68c84577" +checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7" dependencies = [ "der", "spki", @@ -2909,9 +2891,9 @@ dependencies = [ [[package]] name = "plist" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092791278e026273c1b65bbdcfbba3a300f2994c896bd01ab01da613c29c46f1" +checksum = "7da1d65da6dd5d1e44199ac0f58712d241c0f439f80adea8924d832384087f85" dependencies = [ "base64", "indexmap", @@ -2934,9 +2916,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.13.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" dependencies = [ "serde", ] @@ -2959,7 +2941,7 @@ dependencies = [ "n0-error", "netwatch", "num_enum", - "rand 0.9.4", + "rand 0.9.5", "serde", "smallvec", "socket2", @@ -2993,14 +2975,14 @@ checksum = "e0232bd009a197ceec9cc881ba46f727fcd8060a2d8d6a9dde7a69030a6fe2bb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "potential_utf" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" dependencies = [ "zerovec", ] @@ -3027,7 +3009,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.119", ] [[package]] @@ -3041,9 +3023,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] @@ -3060,9 +3042,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.39.4" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" dependencies = [ "memchr", ] @@ -3075,7 +3057,7 @@ checksum = "95c589f335db0f6aaa168a7cd27b1fc6920f5e1470c804f814d9cd6e62a0f70b" dependencies = [ "env_logger", "log", - "rand 0.10.1", + "rand 0.10.2", ] [[package]] @@ -3086,14 +3068,14 @@ checksum = "a9a28b8493dd664c8b171dd944da82d933f7d456b829bfb236738e1fe06c5ba4" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", "cfg_aliases", @@ -3111,14 +3093,15 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.14" +version = "0.11.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +checksum = "04759210543be93709136e28212294a659ef5001836ff4eab4d663e4529bba83" dependencies = [ "bytes", - "getrandom 0.3.4", + "getrandom 0.4.3", "lru-slab", - "rand 0.9.4", + "rand 0.10.2", + "rand_pcg", "ring", "rustc-hash", "rustls", @@ -3132,23 +3115,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "quote" -version = "1.0.45" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -3167,9 +3150,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ "rand_chacha", "rand_core 0.9.5", @@ -3177,12 +3160,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ "chacha20", - "getrandom 0.4.2", + "getrandom 0.4.3", "rand_core 0.10.1", ] @@ -3211,6 +3194,15 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + [[package]] name = "rayon" version = "1.12.0" @@ -3242,9 +3234,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.3" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -3254,9 +3246,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.14" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -3265,9 +3257,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "reqwest" @@ -3332,9 +3324,9 @@ dependencies = [ [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc_version" @@ -3355,14 +3347,14 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.40" +version = "0.23.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" dependencies = [ "log", "once_cell", @@ -3375,9 +3367,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.1" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" dependencies = [ "web-time", "zeroize", @@ -3385,9 +3377,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.13" +version = "0.103.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" dependencies = [ "ring", "rustls-pki-types", @@ -3396,9 +3388,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "ryu" @@ -3423,16 +3415,12 @@ name = "seize" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b55fb86dfd3a2f5f76ea78310a88f96c4ea21a3031f8d212443d56123fd0521" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] [[package]] name = "self_cell" -version = "1.2.2" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" +checksum = "2ab42ca02749e120097e328d91d415325bdf43b1c72c4c8badf37375fe40a813" [[package]] name = "semver" @@ -3448,9 +3436,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -3468,29 +3456,29 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.4", ] [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", "memchr", @@ -3511,6 +3499,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serdect" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3e" +dependencies = [ + "base16ct", + "serde", +] + [[package]] name = "sha2" version = "0.10.9" @@ -3548,6 +3546,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + [[package]] name = "signal-hook-registry" version = "1.4.8" @@ -3560,9 +3564,9 @@ dependencies = [ [[package]] name = "signature" -version = "3.0.0-rc.10" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f1880df446116126965eeec169136b2e0251dba37c6223bcc819569550edea3" +checksum = "28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5" [[package]] name = "simdutf8" @@ -3581,9 +3585,9 @@ dependencies = [ [[package]] name = "siphasher" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "slab" @@ -3593,15 +3597,15 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "socket2" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", "windows-sys 0.61.2", @@ -3621,7 +3625,7 @@ checksum = "c87e960f4dca2788eeb86bbdde8dd246be8948790b7618d656e68f9b720a86e8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -3701,7 +3705,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -3712,9 +3716,20 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.117" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" dependencies = [ "proc-macro2", "quote", @@ -3738,7 +3753,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -3754,46 +3769,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874" dependencies = [ "rustix", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.4", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] [[package]] name = "time" -version = "0.3.47" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" dependencies = [ "deranged", - "itoa", "js-sys", "libc", "num-conv", @@ -3806,15 +3820,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.27" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" dependencies = [ "num-conv", "time-core", @@ -3831,9 +3845,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" dependencies = [ "displaydoc", "zerovec", @@ -3841,9 +3855,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" dependencies = [ "tinyvec_macros", ] @@ -3856,9 +3870,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.1" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", @@ -3872,13 +3886,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.7.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.4", ] [[package]] @@ -3893,9 +3907,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" dependencies = [ "futures-core", "pin-project-lite", @@ -3905,14 +3919,15 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" dependencies = [ "bytes", "futures-core", "futures-sink", "futures-util", + "libc", "pin-project-lite", "tokio", ] @@ -3930,7 +3945,7 @@ dependencies = [ "getrandom 0.3.4", "http", "httparse", - "rand 0.9.4", + "rand 0.9.5", "ring", "rustls-pki-types", "simdutf8", @@ -3950,9 +3965,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.11+spec-1.1.0" +version = "0.25.13+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ "indexmap", "toml_datetime", @@ -3962,9 +3977,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.1.2+spec-1.1.0" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ "winnow", ] @@ -3986,20 +4001,20 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ "bitflags", "bytes", "futures-util", "http", "http-body", - "iri-string", "pin-project-lite", "tower", "tower-layer", "tower-service", + "url", ] [[package]] @@ -4034,7 +4049,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -4096,9 +4111,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.20.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "unicode-ident" @@ -4108,9 +4123,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.13.2" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-xid" @@ -4161,11 +4176,11 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.23.1" +version = "1.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +checksum = "b5772d71c9be8a8a6ac2117d949c5b224c1b72241bb611d9a3012edcf8af7812" dependencies = [ - "getrandom 0.4.2", + "getrandom 0.4.3", "js-sys", "wasm-bindgen", ] @@ -4253,27 +4268,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.3+wasi-0.2.9" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ - "wit-bindgen 0.57.1", -] - -[[package]] -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 = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen 0.51.0", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.120" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df52b6d9b87e0c74c9edfa1eb2d9bf85e5d63515474513aa50fa181b3c4f5db1" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if", "once_cell", @@ -4284,9 +4290,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.70" +version = "0.4.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af934872acec734c2d80e6617bbb5ff4f12b052dd8e6332b0817bce889516084" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" dependencies = [ "js-sys", "wasm-bindgen", @@ -4294,9 +4300,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.120" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b1041f495fb322e64aca85f5756b2172e35cd459376e67f2a6c9dffcedb103" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4304,48 +4310,26 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.120" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dcd0ff20416988a18ac686d4d4d0f6aae9ebf08a389ff5d29012b05af2a1b41" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 2.0.119", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.120" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49757b3c82ebf16c57d69365a142940b384176c24df52a087fb748e2085359ea" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -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 = "wasm-streams" version = "0.4.2" @@ -4359,23 +4343,11 @@ dependencies = [ "web-sys", ] -[[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.97" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eadbac71025cd7b0834f20d1fe8472e8495821b4e9801eb0a60bd1f19827602" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" dependencies = [ "js-sys", "wasm-bindgen", @@ -4393,9 +4365,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" dependencies = [ "rustls-pki-types", ] @@ -4481,7 +4453,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -4492,7 +4464,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -4642,107 +4614,19 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" dependencies = [ "memchr", ] -[[package]] -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" version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" -[[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", - "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", - "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 = "wmi" version = "0.18.4" @@ -4760,9 +4644,9 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" [[package]] name = "ws_stream_wasm" @@ -4800,9 +4684,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -4817,7 +4701,7 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] @@ -4829,29 +4713,29 @@ checksum = "2164e798d9e3d84ee2c91139ace54638059a3b23e361f5c11781c2c6459bde0f" [[package]] name = "zerocopy" -version = "0.8.48" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.48" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "zerofrom" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] @@ -4864,35 +4748,35 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "zerotrie" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" dependencies = [ "displaydoc", "yoke", @@ -4901,9 +4785,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.6" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" dependencies = [ "yoke", "zerofrom", @@ -4912,17 +4796,17 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.3" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.4", ] [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml index 6b683b958..833f2594d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,11 +9,12 @@ members = [ "crates/ixvm-codegen", "crates/ixon", "crates/kernel", + "crates/terminal", ] -# `zisk/` and `sp1/` are their own Cargo workspaces (guest + host) built via -# the respective zkVM toolchains; excluded so host workspace ops don't pick -# them up. -exclude = ["zisk", "sp1", "multi-stark"] +# `zisk/`, `sp1/`, and `flock-stage3/` are isolated Cargo workspaces with +# heavyweight or specialized toolchains; keep normal host workspace operations +# from picking them up. +exclude = ["zisk", "sp1", "flock-stage3", "multi-stark"] resolver = "2" [profile.dev] @@ -40,6 +41,7 @@ ix-common = { path = "crates/common" } ix-compile = { path = "crates/compile" } ixon = { path = "crates/ixon" } ix-kernel = { path = "crates/kernel" } +ix-terminal = { path = "crates/terminal" } # lean-ffi tree (lean-ffi crate + factored-out bignat sub-crate) bignat = { git = "https://github.com/argumentcomputer/lean-ffi.git", rev = "93c7e52952ae94546be08313f4ff3922984c84d5" } @@ -47,6 +49,7 @@ lean-ffi = { git = "https://github.com/argumentcomputer/lean-ffi.git", rev = "93 # External shared deps anyhow = "1" +bincode = { version = "2.0.1", features = ["serde"] } blake3 = "1.8.4" dashmap = "6.1.0" hashbrown = "0.15" diff --git a/crates/aiur/src/synthesis.rs b/crates/aiur/src/synthesis.rs index f0be342ba..284440a84 100644 --- a/crates/aiur/src/synthesis.rs +++ b/crates/aiur/src/synthesis.rs @@ -708,6 +708,31 @@ mod tests { ] ); system.verify(&claim, &proof).expect("xor split outputs must verify"); + + // The terminal prover receives only the serialized verifier key, not the + // prover-side `AiurSystem`. Exercise that exact path against a real proof + // so codec round trips alone cannot mask a transcript/config mismatch. + let vk_bytes = crate::vk_codec::aiur_system_to_bytes(&system) + .expect("encode verifier key"); + let vk = crate::vk_codec::AiurVerifyingKey::from_bytes(&vk_bytes) + .expect("decode verifier key"); + assert_eq!(vk.to_bytes(), vk_bytes, "verifier key is canonical"); + vk.verify(&claim, &proof).expect("decoded verifier key must verify"); + let advice = vk + .proof_to_advice_bytes(&claim, &proof) + .expect("decoded verifier key must serialize valid proof advice"); + assert!(!advice.is_empty(), "serialized verifier advice must not be empty"); + + let mut tampered_claim = claim.clone(); + tampered_claim[2] += G::ONE; + assert!( + vk.verify(&tampered_claim, &proof).is_err(), + "decoded verifier key must bind the outer claim" + ); + assert!( + vk.proof_to_advice_bytes(&tampered_claim, &proof).is_err(), + "advice serialization must verify and bind the outer claim" + ); } /// Hand-build a toplevel exercising the two migrated integration paths that diff --git a/crates/aiur/src/vk_codec.rs b/crates/aiur/src/vk_codec.rs index 9fa9e00ec..c9339fe04 100644 --- a/crates/aiur/src/vk_codec.rs +++ b/crates/aiur/src/vk_codec.rs @@ -67,7 +67,9 @@ use multi_stark::{ lookup::Lookup, p3_field::{PrimeCharacteristicRing, PrimeField64}, system::{Circuit, System}, - types::{Commitment, CommitmentParameters, FriParameters, Val}, + types::{ + Commitment, CommitmentParameters, ExtVal, FriParameters, PcsError, Val, + }, }; use crate::synthesis::{AiurConfig, AiurSystem}; @@ -239,6 +241,20 @@ pub(crate) fn to_bytes( buf } +/// Serialize a verifier key for a custom [`AiurConfig`] circuit system. +/// +/// Most callers should use [`aiur_system_to_bytes`]. This lower-level entry +/// point exists for custom frontends which build the same concrete Aiur STARK +/// configuration without going through [`AiurSystem`]. The supplied protocol +/// parameters must be the ones used to construct `system.config`. +pub fn aiur_config_system_to_bytes( + system: &System, + commitment_parameters: CommitmentParameters, + fri_parameters: FriParameters, +) -> Vec { + to_bytes(system, commitment_parameters, fri_parameters) +} + /// Convenience: serialize the verifying key of a built [`AiurSystem`]. pub fn aiur_system_to_bytes(sys: &AiurSystem) -> Result, String> { Ok(to_bytes(&sys.system, sys.commitment_parameters, sys.fri_parameters)) @@ -396,9 +412,7 @@ fn decode_circuit(seg: &mut Seg<'_>) -> Result, String> { }; let num_lookups = graph.lookups.len(); let ext_degree = - >::DIMENSION; + >::DIMENSION; Ok(Circuit { graph, main_width, @@ -491,6 +505,179 @@ pub(crate) fn from_bytes( Ok((system, commitment_parameters, fri_parameters)) } +/// A verifier-only Aiur key decoded from [`aiur_system_to_bytes`]. +/// +/// This is the narrow surface used by zkVM guests: unlike [`AiurSystem`], it +/// carries neither bytecode nor a prover key, but it can verify a serialized +/// proof under the exact commitment and FRI parameters embedded in the key. +pub struct AiurVerifyingKey { + system: System, + commitment_parameters: CommitmentParameters, + fri_parameters: FriParameters, +} + +/// Verifier-known matrix geometry needed to specialise the terminal PCS +/// relation without carrying the full constraint graph into that relation. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct AiurPcsCircuitMetadata { + pub main_width: usize, + pub stage_2_width: usize, + pub quotient_width: usize, + pub preprocessed_width: usize, + pub preprocessed_height: usize, + pub preprocessed_slot: Option, +} + +/// Constraint program and geometry needed to specialise the terminal AIR +/// evaluation relation for one circuit. +/// +/// This is deliberately a clone of the verifier-owned compiled graph. Stage 3 +/// treats the graph as fixed circuit data, never as proof witness data. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct AiurAirCircuitMetadata { + pub graph: ConstraintGraph, + pub main_width: usize, + pub stage_2_width: usize, + pub quotient_degree: usize, + pub preprocessed_width: usize, + pub preprocessed_slot: Option, + pub lookup_group_size: usize, +} + +impl AiurVerifyingKey { + /// Decode a verifying key and require full input consumption. + pub fn from_bytes(bytes: &[u8]) -> Result { + from_bytes(bytes).map(|(system, commitment_parameters, fri_parameters)| { + Self { system, commitment_parameters, fri_parameters } + }) + } + + /// Re-encode to the canonical Aiur verifying-key wire format. + pub fn to_bytes(&self) -> Vec { + to_bytes(&self.system, self.commitment_parameters, self.fri_parameters) + } + + pub const fn commitment_parameters(&self) -> CommitmentParameters { + self.commitment_parameters + } + + pub const fn fri_parameters(&self) -> FriParameters { + self.fri_parameters + } + + pub fn num_circuits(&self) -> usize { + self.system.circuits.len() + } + + /// Canonical PCS matrix widths and preprocessed slots in circuit order. + pub fn pcs_circuit_metadata(&self) -> Vec { + let extension_degree = + >::DIMENSION; + self + .system + .circuits + .iter() + .zip(&self.system.preprocessed_indices) + .map(|(circuit, &preprocessed_slot)| AiurPcsCircuitMetadata { + main_width: circuit.main_width, + stage_2_width: circuit.stage_2_width, + quotient_width: circuit.quotient_degree() * extension_degree, + preprocessed_width: circuit.preprocessed_width, + preprocessed_height: circuit.preprocessed_height, + preprocessed_slot, + }) + .collect() + } + + /// Fixed compiled AIR programs in canonical circuit order. + pub fn air_circuit_metadata(&self) -> Vec { + self + .system + .circuits + .iter() + .zip(&self.system.preprocessed_indices) + .map(|(circuit, &preprocessed_slot)| AiurAirCircuitMetadata { + graph: circuit.graph.clone(), + main_width: circuit.main_width, + stage_2_width: circuit.stage_2_width, + quotient_degree: circuit.quotient_degree(), + preprocessed_width: circuit.preprocessed_width, + preprocessed_slot, + lookup_group_size: circuit.lookup_group_size, + }) + .collect() + } + + /// Exact challenger seed followed by the `System::observe_shape` words, + /// serialized as the Goldilocks byte challenger observes them. + /// + /// Terminal verifier circuits use this instead of duplicating the shape + /// derivation from the compact verifying-key codec. + pub fn transcript_seed_and_shape_bytes(&self) -> Vec { + let mut bytes = b"multi-stark/v0".to_vec(); + for parameter in [ + self.commitment_parameters.log_blowup, + self.commitment_parameters.cap_height, + self.fri_parameters.log_final_poly_len, + self.fri_parameters.max_log_arity, + self.fri_parameters.num_queries, + self.fri_parameters.commit_proof_of_work_bits, + self.fri_parameters.query_proof_of_work_bits, + ] { + bytes.extend_from_slice( + &u64::try_from(parameter) + .expect("protocol parameter fits u64") + .to_le_bytes(), + ); + } + let mut observe = |value: usize| { + bytes.extend_from_slice( + &u64::try_from(value) + .expect("system shape value fits u64") + .to_le_bytes(), + ); + }; + observe(self.system.circuits.len()); + for circuit in &self.system.circuits { + observe(circuit.constraint_count()); + observe(circuit.max_constraint_degree()); + observe(circuit.preprocessed_height); + observe(circuit.preprocessed_width); + observe(circuit.main_width); + observe(circuit.stage_2_width); + observe(circuit.lookup_group_size); + } + bytes + } + + /// Roots observed for the optional preprocessed commitment, in cap order. + pub fn preprocessed_commitment_roots(&self) -> Option> { + self + .system + .preprocessed_commit + .as_ref() + .map(|commitment| commitment.roots().to_vec()) + } + + pub fn verify( + &self, + claim: &[Val], + proof: &crate::synthesis::AiurProof, + ) -> Result<(), multi_stark::verifier::VerificationError> { + self.system.verify(claim, proof) + } + + /// Verify and serialize the native pruned multiproof consumed by terminal + /// circuit verifiers. + pub fn proof_to_advice_bytes( + &self, + claim: &[Val], + proof: &crate::synthesis::AiurProof, + ) -> Result, String> { + self.verify(claim, proof).map_err(|error| format!("{error:?}"))?; + proof.to_bytes().map_err(|error| format!("{error:?}")) + } +} #[cfg(test)] mod tests { use super::*; @@ -563,6 +750,47 @@ mod tests { } } + #[test] + fn transcript_seed_and_shape_bytes_match_observe_shape_order() { + let (system, cp, fp) = test_system(); + let key = AiurVerifyingKey { + system, + commitment_parameters: cp, + fri_parameters: fp, + }; + let mut expected = b"multi-stark/v0".to_vec(); + for value in [ + cp.log_blowup, + cp.cap_height, + fp.log_final_poly_len, + fp.max_log_arity, + fp.num_queries, + fp.commit_proof_of_work_bits, + fp.query_proof_of_work_bits, + key.system.circuits.len(), + ] { + expected.extend_from_slice(&(value as u64).to_le_bytes()); + } + for circuit in &key.system.circuits { + for value in [ + circuit.constraint_count(), + circuit.max_constraint_degree(), + circuit.preprocessed_height, + circuit.preprocessed_width, + circuit.main_width, + circuit.stage_2_width, + circuit.lookup_group_size, + ] { + expected.extend_from_slice(&(value as u64).to_le_bytes()); + } + } + assert_eq!(key.transcript_seed_and_shape_bytes(), expected); + assert_eq!( + key.preprocessed_commitment_roots().is_some(), + key.system.preprocessed_commit.is_some() + ); + } + #[test] fn rejects_trailing_bytes() { let (system, cp, fp) = test_system(); diff --git a/crates/terminal/Cargo.toml b/crates/terminal/Cargo.toml new file mode 100644 index 000000000..afdfa6547 --- /dev/null +++ b/crates/terminal/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "ix-terminal" +version.workspace = true +edition.workspace = true +license.workspace = true + +[dependencies] +aiur = { workspace = true, features = ["parallel"] } +anyhow = { workspace = true } +bincode = { workspace = true } +blake3 = { workspace = true } +multi-stark = { workspace = true, features = ["parallel"] } + +[lints] +workspace = true diff --git a/crates/terminal/src/lib.rs b/crates/terminal/src/lib.rs new file mode 100644 index 000000000..43c1b7921 --- /dev/null +++ b/crates/terminal/src/lib.rs @@ -0,0 +1,617 @@ +//! Canonical boundary between the recursive Aiur aggregate and terminal +//! compression backends. +//! +//! SP1 and Flock must validate and bind exactly the same Stage 2 statement. +//! This crate owns that byte-level contract so terminal backends cannot drift. + +use aiur::{G, synthesis::AiurProof, vk_codec::AiurVerifyingKey}; +use anyhow::{Result, bail}; +use bincode::{config, serde::decode_from_slice}; +use multi_stark::{ + advice::AdviceProof, + p3_field::{PrimeCharacteristicRing, PrimeField64}, + types::FriParameters, +}; + +/// Domain of the canonical Stage 2 aggregate-root statement. +/// +/// This value is already used by the SP1 compressor and must not change +/// without introducing a new statement version. +pub const STAGE2_ROOT_DOMAIN: &[u8; 8] = b"IXROOT01"; +/// Backwards-compatible name used by the SP1 public-values API. +pub const PUBLIC_VALUES_DOMAIN: &[u8; 8] = STAGE2_ROOT_DOMAIN; +pub const OUTER_CLAIM_ELEMENTS: usize = 18; +pub const FRI_PARAMETER_ELEMENTS: usize = 5; +pub const FRI_PARAMETERS_BYTES: usize = FRI_PARAMETER_ELEMENTS * 8; +pub const OUTER_CLAIM_BYTES: usize = OUTER_CLAIM_ELEMENTS * 8; +pub const STAGE2_CLAIMS_BYTES: usize = 8 + 8 + OUTER_CLAIM_BYTES; +pub const STAGE2_ROOT_STATEMENT_BYTES: usize = + STAGE2_ROOT_DOMAIN.len() + 32 + FRI_PARAMETERS_BYTES + OUTER_CLAIM_BYTES; + +const ADVICE_PROFILE_DOMAIN: &[u8; 8] = b"IXADVP01"; + +/// Versioned, canonical public statement asserted by a closed Stage 2 root. +/// +/// Wire format: +/// `IXROOT01 || blake3(aiur_vk) || five FRI u64s LE || 18 Goldilocks u64s LE`. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage2RootStatementV1 { + verifying_key_digest: [u8; 32], + fri_parameters: [u64; FRI_PARAMETER_ELEMENTS], + outer_claim: [u64; OUTER_CLAIM_ELEMENTS], +} + +/// Shape census of the verified, per-query proof transport consumed by the +/// recursive verifier. This is diagnostic input to the Flock capacity model; +/// it is not itself a proof or a substitute for in-relation shape checks. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage2AdviceProfileV1 { + pub advice_bytes: u64, + pub total_circuits: u64, + pub active_circuits: u64, + pub queries: u64, + pub fri_rounds: u64, + pub input_rounds_per_query: u64, + pub commitment_cap_digests: u64, + pub input_merkle_siblings: u64, + pub fri_merkle_siblings: u64, + pub opened_base_values: u64, + pub fri_sibling_extension_values: u64, + pub other_extension_values: u64, +} + +impl Stage2AdviceProfileV1 { + /// Parse the canonical recursive-verifier advice and census its fixed and + /// capacity-driving dimensions. The parser requires exact byte consumption. + pub fn from_advice_bytes(bytes: &[u8], fri: &FriParameters) -> Result { + profile_advice(bytes, fri) + } + + pub fn to_bytes(&self) -> Vec { + let words = [ + self.advice_bytes, + self.total_circuits, + self.active_circuits, + self.queries, + self.fri_rounds, + self.input_rounds_per_query, + self.commitment_cap_digests, + self.input_merkle_siblings, + self.fri_merkle_siblings, + self.opened_base_values, + self.fri_sibling_extension_values, + self.other_extension_values, + ]; + let mut bytes = + Vec::with_capacity(ADVICE_PROFILE_DOMAIN.len() + words.len() * 8); + bytes.extend_from_slice(ADVICE_PROFILE_DOMAIN); + for word in words { + bytes.extend_from_slice(&word.to_le_bytes()); + } + bytes + } + + pub fn digest(&self) -> [u8; 32] { + *blake3::hash(&self.to_bytes()).as_bytes() + } +} + +/// A compact proof that has been verified and expanded to the exact advice +/// layout used by `Ix.MultiStark`. The verifying key is retained for compiling +/// a specialised typed verifier witness; the claims remain the private words +/// bound by the Stage 2 statement inside that relation. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct ValidatedStage2RootV1 { + statement: Stage2RootStatementV1, + verifying_key_bytes: Vec, + claims_bytes: Vec, + advice_bytes: Vec, + advice_profile: Stage2AdviceProfileV1, +} + +impl ValidatedStage2RootV1 { + pub fn statement(&self) -> &Stage2RootStatementV1 { + &self.statement + } + + pub fn verifying_key_bytes(&self) -> &[u8] { + &self.verifying_key_bytes + } + + pub fn claims_bytes(&self) -> &[u8] { + &self.claims_bytes + } + + pub fn advice_bytes(&self) -> &[u8] { + &self.advice_bytes + } + + pub fn advice_profile(&self) -> &Stage2AdviceProfileV1 { + &self.advice_profile + } +} + +impl Stage2RootStatementV1 { + /// Construct the statement while enforcing the exact claim shape and + /// canonical Goldilocks encoding. + pub fn new( + vk_bytes: &[u8], + claim_bytes: &[u8], + fri: &FriParameters, + ) -> Result { + Ok(Self { + verifying_key_digest: *blake3::hash(vk_bytes).as_bytes(), + fri_parameters: fri_parameter_words(fri), + outer_claim: decode_claim_words(claim_bytes)?, + }) + } + + /// Parse the canonical format. Exact length, domain, and field encodings are + /// checked; trailing bytes are rejected. + pub fn from_bytes(bytes: &[u8]) -> Result { + if bytes.len() != STAGE2_ROOT_STATEMENT_BYTES { + bail!( + "Stage 2 root statement is {} bytes; expected {STAGE2_ROOT_STATEMENT_BYTES}", + bytes.len() + ); + } + if &bytes[..STAGE2_ROOT_DOMAIN.len()] != STAGE2_ROOT_DOMAIN { + bail!("invalid Stage 2 root statement domain"); + } + + let mut verifying_key_digest = [0u8; 32]; + verifying_key_digest.copy_from_slice(&bytes[8..40]); + + let mut fri_parameters = [0u64; FRI_PARAMETER_ELEMENTS]; + for (word, chunk) in + fri_parameters.iter_mut().zip(bytes[40..80].as_chunks::<8>().0) + { + *word = u64::from_le_bytes(*chunk); + } + + Ok(Self { + verifying_key_digest, + fri_parameters, + outer_claim: decode_claim_words(&bytes[80..])?, + }) + } + + pub fn to_bytes(&self) -> Vec { + let mut bytes = Vec::with_capacity(STAGE2_ROOT_STATEMENT_BYTES); + bytes.extend_from_slice(STAGE2_ROOT_DOMAIN); + bytes.extend_from_slice(&self.verifying_key_digest); + for word in self.fri_parameters { + bytes.extend_from_slice(&word.to_le_bytes()); + } + for word in self.outer_claim { + bytes.extend_from_slice(&word.to_le_bytes()); + } + debug_assert_eq!(bytes.len(), STAGE2_ROOT_STATEMENT_BYTES); + bytes + } + + /// BLAKE3 digest of the complete, domain-separated canonical statement. + pub fn digest(&self) -> [u8; 32] { + *blake3::hash(&self.to_bytes()).as_bytes() + } + + pub fn verifying_key_digest(&self) -> &[u8; 32] { + &self.verifying_key_digest + } + + pub fn fri_parameter_words(&self) -> &[u64; FRI_PARAMETER_ELEMENTS] { + &self.fri_parameters + } + + pub fn outer_claim_words(&self) -> &[u64; OUTER_CLAIM_ELEMENTS] { + &self.outer_claim + } +} + +pub fn fri_parameter_words( + fri: &FriParameters, +) -> [u64; FRI_PARAMETER_ELEMENTS] { + [ + fri.log_final_poly_len as u64, + fri.max_log_arity as u64, + fri.num_queries as u64, + fri.commit_proof_of_work_bits as u64, + fri.query_proof_of_work_bits as u64, + ] +} + +pub fn fri_parameters_to_bytes(fri: &FriParameters) -> Vec { + fri_parameter_words(fri) + .iter() + .flat_map(|value| value.to_le_bytes()) + .collect() +} + +/// Decode the exact 18-word outer claim and reject non-canonical Goldilocks +/// representatives. +pub fn decode_claim_words( + claim_bytes: &[u8], +) -> Result<[u64; OUTER_CLAIM_ELEMENTS]> { + if claim_bytes.len() != OUTER_CLAIM_BYTES { + bail!( + "ix_aggr outer claim is {} bytes; expected {OUTER_CLAIM_BYTES} (18 Goldilocks words)", + claim_bytes.len() + ); + } + + let mut words = [0u64; OUTER_CLAIM_ELEMENTS]; + for (index, (word_out, chunk)) in + words.iter_mut().zip(claim_bytes.as_chunks::<8>().0).enumerate() + { + let word = u64::from_le_bytes(*chunk); + let value = G::from_u64(word); + if value.as_canonical_u64() != word { + bail!("outer claim word {index} is not canonical Goldilocks"); + } + *word_out = word; + } + Ok(words) +} + +/// Canonical `&[&[Goldilocks]]` encoding consumed by the existing recursive +/// verifier: one claim, its 18-word length, then its little-endian words. +pub fn stage2_claims_bytes(claim_bytes: &[u8]) -> Result> { + let words = decode_claim_words(claim_bytes)?; + let mut bytes = Vec::with_capacity(STAGE2_CLAIMS_BYTES); + bytes.extend_from_slice(&1u64.to_le_bytes()); + bytes.extend_from_slice(&(OUTER_CLAIM_ELEMENTS as u64).to_le_bytes()); + for word in words { + bytes.extend_from_slice(&word.to_le_bytes()); + } + Ok(bytes) +} + +fn fri_matches(actual: &FriParameters, expected: &FriParameters) -> bool { + fri_parameter_words(actual) == fri_parameter_words(expected) +} + +struct DecodedRootInputs { + statement: Stage2RootStatementV1, + claim: Vec, + verifying_key: AiurVerifyingKey, + proof: AiurProof, +} + +fn decode_root_inputs( + vk_bytes: &[u8], + claim_bytes: &[u8], + proof_bytes: &[u8], + fri: &FriParameters, +) -> Result { + let statement = Stage2RootStatementV1::new(vk_bytes, claim_bytes, fri)?; + let claim: Vec = + statement.outer_claim.iter().copied().map(G::from_u64).collect(); + let verifying_key = AiurVerifyingKey::from_bytes(vk_bytes) + .map_err(|error| anyhow::anyhow!("invalid Aiur verifying key: {error}"))?; + if verifying_key.to_bytes() != vk_bytes { + bail!("Aiur verifying key is not canonically encoded"); + } + if !fri_matches(&verifying_key.fri_parameters(), fri) { + bail!("requested recursion FRI parameters do not match the Aiur vk"); + } + let proof = AiurProof::from_bytes(proof_bytes) + .map_err(|error| anyhow::anyhow!("invalid Aiur proof: {error}"))?; + let canonical_proof = proof + .to_bytes() + .map_err(|error| anyhow::anyhow!("re-encode Aiur proof: {error}"))?; + if canonical_proof != proof_bytes { + bail!("Aiur proof is non-canonical or contains trailing bytes"); + } + Ok(DecodedRootInputs { statement, claim, verifying_key, proof }) +} + +/// Validate a persisted aggregate root natively and return the exact public +/// statement terminal backends must prove. A backend circuit must repeat all +/// verification checks; this native pass is a cost and ergonomics guard. +pub fn validate_root_inputs( + vk_bytes: &[u8], + claim_bytes: &[u8], + proof_bytes: &[u8], + fri: &FriParameters, +) -> Result { + let decoded = decode_root_inputs(vk_bytes, claim_bytes, proof_bytes, fri)?; + decoded.verifying_key.verify(&decoded.claim, &decoded.proof).map_err( + |error| anyhow::anyhow!("aggregate root does not verify: {error:?}"), + )?; + Ok(decoded.statement) +} + +/// Verify a compact Stage 2 root and expand its pruned Merkle multiproofs into +/// the per-query advice layout already consumed by the recursive Lean verifier. +/// No host-derived acceptance bit crosses the boundary: Stage 3 must parse and +/// re-check these retained vk, claim, and advice bytes inside its relation. +pub fn validate_and_expand_root_inputs( + vk_bytes: &[u8], + claim_bytes: &[u8], + proof_bytes: &[u8], + fri: &FriParameters, +) -> Result { + let decoded = decode_root_inputs(vk_bytes, claim_bytes, proof_bytes, fri)?; + let advice_bytes = decoded + .verifying_key + .proof_to_advice_bytes(&decoded.claim, &decoded.proof) + .map_err(|error| anyhow::anyhow!("expand verified Aiur proof: {error}"))?; + let advice_profile = + Stage2AdviceProfileV1::from_advice_bytes(&advice_bytes, fri)?; + Ok(ValidatedStage2RootV1 { + statement: decoded.statement, + verifying_key_bytes: vk_bytes.to_vec(), + claims_bytes: stage2_claims_bytes(claim_bytes)?, + advice_bytes, + advice_profile, + }) +} + +fn profile_advice( + bytes: &[u8], + fri: &FriParameters, +) -> Result { + let proof = decode_stage2_advice(bytes, fri)?; + + let input_rounds_per_query = proof + .opening_proof + .query_proofs + .first() + .map_or(0, |query| query.input_proof.len()); + let commitment_cap_digests = proof.commitments.stage_1_trace.roots().len() + + proof.commitments.stage_2_trace.roots().len() + + proof.commitments.quotient_chunks.roots().len() + + proof + .opening_proof + .commit_phase_commits + .iter() + .map(|commitment| commitment.roots().len()) + .sum::(); + let input_merkle_siblings = proof + .opening_proof + .query_proofs + .iter() + .flat_map(|query| &query.input_proof) + .map(|opening| opening.opening_proof.len()) + .sum(); + let fri_merkle_siblings = proof + .opening_proof + .query_proofs + .iter() + .flat_map(|query| &query.commit_phase_openings) + .map(|opening| opening.opening_proof.len()) + .sum(); + let opened_base_values = proof + .opening_proof + .query_proofs + .iter() + .flat_map(|query| &query.input_proof) + .flat_map(|opening| &opening.opened_values) + .map(Vec::len) + .sum(); + let fri_sibling_extension_values = proof + .opening_proof + .query_proofs + .iter() + .flat_map(|query| &query.commit_phase_openings) + .map(|opening| opening.sibling_values.len()) + .sum(); + let other_extension_values = proof.intermediate_accumulators.len() + + count_opened_values(&proof.quotient_opened_values) + + proof + .preprocessed_opened_values + .as_ref() + .map_or(0, |values| count_opened_values(values)) + + count_opened_values(&proof.stage_1_opened_values) + + count_opened_values(&proof.stage_2_opened_values) + + proof.opening_proof.final_poly.len(); + + Ok(Stage2AdviceProfileV1 { + advice_bytes: to_u64(bytes.len(), "advice bytes")?, + total_circuits: to_u64(proof.active.len(), "circuit count")?, + active_circuits: to_u64( + proof.active.iter().filter(|&&active| active).count(), + "active circuit count", + )?, + queries: to_u64(proof.opening_proof.query_proofs.len(), "query count")?, + fri_rounds: to_u64( + proof.opening_proof.commit_phase_commits.len(), + "FRI round count", + )?, + input_rounds_per_query: to_u64( + input_rounds_per_query, + "input rounds per query", + )?, + commitment_cap_digests: to_u64( + commitment_cap_digests, + "commitment cap digests", + )?, + input_merkle_siblings: to_u64( + input_merkle_siblings, + "input Merkle siblings", + )?, + fri_merkle_siblings: to_u64(fri_merkle_siblings, "FRI Merkle siblings")?, + opened_base_values: to_u64(opened_base_values, "opened base values")?, + fri_sibling_extension_values: to_u64( + fri_sibling_extension_values, + "FRI sibling extension values", + )?, + other_extension_values: to_u64( + other_extension_values, + "other extension values", + )?, + }) +} + +/// Decode the canonical per-query Stage 2 proof transport into semantic proof +/// fields. The persisted bincode representation ends here: Flock backends +/// should lower this typed value, not reproduce byte parsing in their +/// relation. +pub fn decode_stage2_advice( + bytes: &[u8], + fri: &FriParameters, +) -> Result { + let codec = config::standard().with_little_endian().with_fixed_int_encoding(); + let (proof, consumed): (AdviceProof, usize) = decode_from_slice(bytes, codec) + .map_err(|error| { + anyhow::anyhow!("decode canonical Stage 2 advice: {error}") + })?; + if consumed != bytes.len() { + bail!("Stage 2 advice contains trailing bytes"); + } + if proof.opening_proof.query_proofs.len() != fri.num_queries { + bail!( + "Stage 2 advice has {} queries; expected {}", + proof.opening_proof.query_proofs.len(), + fri.num_queries + ); + } + + let input_rounds_per_query = proof + .opening_proof + .query_proofs + .first() + .map_or(0, |query| query.input_proof.len()); + if proof.opening_proof.query_proofs.iter().any(|query| { + query.input_proof.len() != input_rounds_per_query + || query.commit_phase_openings.len() + != proof.opening_proof.commit_phase_commits.len() + }) { + bail!("Stage 2 advice has non-uniform per-query round counts"); + } + Ok(proof) +} + +fn count_opened_values(values: &[Vec>]) -> usize { + values.iter().flat_map(|matrix| matrix.iter()).map(Vec::len).sum() +} + +fn to_u64(value: usize, label: &str) -> Result { + u64::try_from(value) + .map_err(|error| anyhow::anyhow!("{label} exceeds u64: {error}")) +} + +/// Backwards-compatible SP1 public-values constructor. +pub fn expected_public_values( + vk_bytes: &[u8], + claim_bytes: &[u8], + fri: &FriParameters, +) -> Result> { + Ok(Stage2RootStatementV1::new(vk_bytes, claim_bytes, fri)?.to_bytes()) +} + +#[cfg(test)] +mod tests { + use super::*; + use multi_stark::{ + advice::proof_to_advice_bytes, + p3_matrix::dense::RowMajorMatrix, + system::{CircuitInputs, System, SystemWitness}, + types::{CommitmentParameters, GoldilocksBlake3Config}, + }; + + fn test_fri() -> FriParameters { + FriParameters { + log_final_poly_len: 0, + max_log_arity: 1, + num_queries: 100, + commit_proof_of_work_bits: 0, + query_proof_of_work_bits: 20, + } + } + + fn canonical_claim() -> Vec { + (0..OUTER_CLAIM_ELEMENTS as u64).flat_map(u64::to_le_bytes).collect() + } + + #[test] + fn statement_round_trip_is_exact() { + let statement = + Stage2RootStatementV1::new(b"vk", &canonical_claim(), &test_fri()) + .expect("statement"); + let bytes = statement.to_bytes(); + assert_eq!(bytes.len(), STAGE2_ROOT_STATEMENT_BYTES); + assert_eq!(&bytes[..8], STAGE2_ROOT_DOMAIN); + assert_eq!(&bytes[8..40], blake3::hash(b"vk").as_bytes()); + assert_eq!(&bytes[40..80], fri_parameters_to_bytes(&test_fri())); + assert_eq!(&bytes[80..], canonical_claim()); + assert_eq!(Stage2RootStatementV1::from_bytes(&bytes).unwrap(), statement); + assert_eq!( + blake3::Hash::from_bytes(statement.digest()).to_hex().as_str(), + "f1e778aa3d903008a6e755daee2e4f36f1a7a168277cbb6625984602c12dbe4f" + ); + } + + #[test] + fn parser_rejects_domain_length_and_noncanonical_claim() { + let mut bytes = + Stage2RootStatementV1::new(b"vk", &canonical_claim(), &test_fri()) + .unwrap() + .to_bytes(); + bytes[0] ^= 1; + assert!(Stage2RootStatementV1::from_bytes(&bytes).is_err()); + + let mut bytes = + Stage2RootStatementV1::new(b"vk", &canonical_claim(), &test_fri()) + .unwrap() + .to_bytes(); + bytes.extend_from_slice(&[0]); + assert!(Stage2RootStatementV1::from_bytes(&bytes).is_err()); + + let mut claim = canonical_claim(); + claim[..8].copy_from_slice(&u64::MAX.to_le_bytes()); + assert!(Stage2RootStatementV1::new(b"vk", &claim, &test_fri()).is_err()); + } + + #[test] + fn claims_transport_is_the_recursive_verifier_wire_format() { + let claim = canonical_claim(); + let bytes = stage2_claims_bytes(&claim).unwrap(); + assert_eq!(bytes.len(), STAGE2_CLAIMS_BYTES); + assert_eq!(&bytes[..8], &1u64.to_le_bytes()); + assert_eq!(&bytes[8..16], &(OUTER_CLAIM_ELEMENTS as u64).to_le_bytes()); + assert_eq!(&bytes[16..], claim); + } + + #[test] + fn advice_profile_parses_a_real_proof_and_rejects_extensions() { + let commitment = CommitmentParameters { log_blowup: 1, cap_height: 0 }; + let fri = FriParameters { + log_final_poly_len: 0, + max_log_arity: 1, + num_queries: 2, + commit_proof_of_work_bits: 0, + query_proof_of_work_bits: 0, + }; + let (system, key) = System::new( + GoldilocksBlake3Config::new(commitment, fri), + [ + CircuitInputs { main_width: 2, ..Default::default() }, + CircuitInputs { main_width: 3, ..Default::default() }, + ], + ); + let trace_1 = + RowMajorMatrix::new((0..16u32).map(G::from_u32).collect::>(), 2); + let trace_2 = RowMajorMatrix::new( + (0..12u32).map(|value| G::from_u32(7 * value + 3)).collect(), + 3, + ); + let witness = SystemWitness::from_stage_1(vec![trace_1, trace_2], &system); + let proof = system.prove_multiple_claims(&key, &[], witness); + let advice = proof_to_advice_bytes(&system, commitment, fri, &[], &proof) + .expect("expand proof advice"); + + let profile = Stage2AdviceProfileV1::from_advice_bytes(&advice, &fri) + .expect("profile canonical advice"); + assert_eq!(profile.advice_bytes, advice.len() as u64); + assert_eq!(profile.total_circuits, 2); + assert_eq!(profile.active_circuits, 2); + assert_eq!(profile.queries, 2); + assert!(profile.input_rounds_per_query > 0); + assert!(profile.input_merkle_siblings > 0); + + let mut extended = advice; + extended.push(0); + assert!(Stage2AdviceProfileV1::from_advice_bytes(&extended, &fri).is_err()); + } +} diff --git a/flock-stage3/Cargo.lock b/flock-stage3/Cargo.lock new file mode 100644 index 000000000..264ebe798 --- /dev/null +++ b/flock-stage3/Cargo.lock @@ -0,0 +1,1251 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "aiur" +version = "0.1.0" +dependencies = [ + "hashbrown 0.15.5", + "indexmap", + "libc", + "multi-stark", + "num-bigint 0.4.8", + "rayon", + "rustc-hash", + "tracing", + "tracing-texray", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "arrayvec" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "serde", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[package]] +name = "blake3" +version = "1.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d9e454fc11f76977dc803893aff6304ed33d6a26efae8696573bea74baa27ae" +dependencies = [ + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.3.1", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "cc" +version = "1.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chacha20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", + "rand_core 0.10.1", +] + +[[package]] +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "either" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" + +[[package]] +name = "flock-core" +version = "0.1.0" +source = "git+https://github.com/succinctlabs/flock?rev=b310f35f35f68095537150a1c8c0a43caca9a29e#b310f35f35f68095537150a1c8c0a43caca9a29e" +dependencies = [ + "bincode 1.3.3", + "blake3", + "rand_core 0.9.5", + "rayon", + "serde", + "sha2", + "toml", +] + +[[package]] +name = "flock-prover" +version = "0.1.0" +source = "git+https://github.com/succinctlabs/flock?rev=b310f35f35f68095537150a1c8c0a43caca9a29e#b310f35f35f68095537150a1c8c0a43caca9a29e" +dependencies = [ + "bincode 1.3.3", + "blake3", + "flock-core", + "rayon", + "serde", + "sha2", +] + +[[package]] +name = "flock-stage3-host" +version = "0.1.0" +dependencies = [ + "aiur", + "anyhow", + "bincode 1.3.3", + "blake3", + "flock-prover", + "ix-terminal", + "multi-stark", + "serde", +] + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "generator" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3b854b0e584ead1a33f18b2fcad7cf7be18b3875c78816b753639aa501513ae" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows-link", + "windows-result", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "indexmap" +version = "2.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", +] + +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] + +[[package]] +name = "ix-terminal" +version = "0.1.0" +dependencies = [ + "aiur", + "anyhow", + "bincode 2.0.1", + "blake3", + "multi-stark", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" + +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "multi-stark" +version = "0.1.0" +source = "git+https://github.com/argumentcomputer/multi-stark.git?rev=2892243e674f9a0b3aca9004a8d00c79a23beec1#2892243e674f9a0b3aca9004a8d00c79a23beec1" +dependencies = [ + "bincode 2.0.1", + "num-bigint 0.5.1", + "p3-air", + "p3-blake3", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-goldilocks", + "p3-keccak", + "p3-matrix", + "p3-maybe-rayon", + "p3-merkle-tree", + "p3-symmetric", + "p3-util", + "serde", + "tracing", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "p3-air" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "p3-field", + "p3-matrix", + "serde", + "tracing", +] + +[[package]] +name = "p3-blake3" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "blake3", + "p3-symmetric", + "p3-util", +] + +[[package]] +name = "p3-challenger" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "p3-field", + "p3-maybe-rayon", + "p3-symmetric", + "p3-util", + "tracing", +] + +[[package]] +name = "p3-commit" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "itertools", + "p3-field", + "p3-matrix", + "p3-multilinear-util", + "p3-util", + "serde", +] + +[[package]] +name = "p3-dft" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "itertools", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "spin", + "tracing", +] + +[[package]] +name = "p3-field" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "itertools", + "num-bigint 0.5.1", + "p3-maybe-rayon", + "p3-util", + "paste", + "rand", + "serde", + "tracing", +] + +[[package]] +name = "p3-fri" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "itertools", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-security", + "p3-util", + "rand", + "serde", + "spin", + "thiserror", + "tracing", +] + +[[package]] +name = "p3-goldilocks" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "num-bigint 0.5.1", + "p3-dft", + "p3-field", + "p3-mds", + "p3-poseidon1", + "p3-poseidon2", + "p3-symmetric", + "p3-util", + "paste", + "rand", + "serde", + "spin", +] + +[[package]] +name = "p3-keccak" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "p3-symmetric", + "p3-util", + "tiny-keccak", +] + +[[package]] +name = "p3-matrix" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "itertools", + "p3-field", + "p3-maybe-rayon", + "p3-util", + "rand", + "serde", + "tracing", +] + +[[package]] +name = "p3-maybe-rayon" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "rayon", +] + +[[package]] +name = "p3-mds" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "p3-dft", + "p3-field", + "p3-symmetric", + "p3-util", + "rand", +] + +[[package]] +name = "p3-merkle-tree" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "itertools", + "p3-commit", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-symmetric", + "p3-util", + "rand", + "serde", + "spin", + "thiserror", + "tracing", +] + +[[package]] +name = "p3-multilinear-util" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "itertools", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "rand", + "serde", + "tracing", +] + +[[package]] +name = "p3-poseidon1" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "p3-field", + "p3-mds", + "p3-symmetric", + "rand", +] + +[[package]] +name = "p3-poseidon2" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "p3-field", + "p3-mds", + "p3-symmetric", + "p3-util", + "rand", +] + +[[package]] +name = "p3-security" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "libm", + "p3-air", + "p3-field", + "p3-util", + "serde", +] + +[[package]] +name = "p3-symmetric" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "itertools", + "p3-field", + "p3-util", + "serde", +] + +[[package]] +name = "p3-util" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "p3-maybe-rayon", + "serde", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "rand_core 0.10.1", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", + "sha2-asm", +] + +[[package]] +name = "sha2-asm" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b845214d6175804686b2bd482bcffe96651bb2d1200742b712003504a2dac1ab" +dependencies = [ + "cc", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "spin" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0134f9043ed38b087ac4f7d4af44c79e2c9e5094421fe3164f435ce585953b10" +dependencies = [ + "lock_api", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "terminal_size" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874" +dependencies = [ + "rustix", + "windows-sys", +] + +[[package]] +name = "thiserror" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "thread_local" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[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", + "toml_edit", +] + +[[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_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "tracing-texray" +version = "0.2.0" +source = "git+https://github.com/argumentcomputer/tracing-texray?rev=465bbca0bea4721e58419c11cabd8cce21757822#465bbca0bea4721e58419c11cabd8cce21757822" +dependencies = [ + "loom", + "parking_lot", + "terminal_size", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] diff --git a/flock-stage3/Cargo.toml b/flock-stage3/Cargo.toml new file mode 100644 index 000000000..f519d67cc --- /dev/null +++ b/flock-stage3/Cargo.toml @@ -0,0 +1,30 @@ +[workspace] +members = ["host"] +resolver = "2" + +[workspace.package] +version = "0.1.0" +edition = "2024" +license = "MIT OR Apache-2.0" + +[workspace.dependencies] +anyhow = "1" +aiur = { path = "../crates/aiur" } +bincode = "1.3" +blake3 = "1.8.4" +flock-prover = { git = "https://github.com/succinctlabs/flock", rev = "b310f35f35f68095537150a1c8c0a43caca9a29e" } +ix-terminal = { path = "../crates/terminal" } +multi-stark = { git = "https://github.com/argumentcomputer/multi-stark.git", rev = "2892243e674f9a0b3aca9004a8d00c79a23beec1" } +serde = { version = "1", features = ["derive"] } + +[workspace.lints.rust] +invalid_reference_casting = "warn" +nonstandard_style = "warn" +rust_2018_idioms = { level = "warn", priority = -1 } +unreachable_pub = "warn" +unused_lifetimes = "warn" +unused_qualifications = "warn" + +[workspace.lints.clippy] +all = { level = "warn", priority = -1 } +dbg_macro = "warn" diff --git a/flock-stage3/README.md b/flock-stage3/README.md new file mode 100644 index 000000000..f0fe0e7f0 --- /dev/null +++ b/flock-stage3/README.md @@ -0,0 +1,115 @@ +# Ix Flock Stage 3 + +This workspace implements the no-RISC-V Stage 3 compressor: + +```text +Stage 2 Aiur recursive-FRI root + -> Flock proof of statement + AIR/logUp + PCS + FRI verification + -> Stage 4 terminal SNARK +``` + +The backend uses Flock `Fast128` over `F128`, BLAKE3 Merkle commitments, and +chained-BLAKE3 Fiat-Shamir. The upstream revision is pinned to +`b310f35f35f68095537150a1c8c0a43caca9a29e`; changing it is a protocol change. + +## Current status + +`FlockStage3Backend::prove_stage2` now generates a complete Stage 3 proof. +The production path: + +1. validates canonical Aiur verifier-key, claim, and proof encodings; +2. expands the compact multiproof into the typed verifier witness; +3. compiles the specialised fixed-shape Flock relation; +4. proves it under the production Stage 3 transcript domain; +5. binds the compiled circuit, Flock configuration, Stage 2 key, witness + layout, capacity, and completed phase mask in `Stage3RelationManifestV1`; +6. returns a strict, versioned `Stage3ArtifactV1`. + +`FlockStage3Backend::verify_stage2` requires an externally expected +`Stage3StatementV1`. It reconstructs the relation from the canonical Stage 2 +transport, checks the expected root and relation-manifest digest, and verifies +the Flock bundle. The relation digest therefore has to be pinned by the +deployment; accepting a relation digest supplied only by the prover would not +specialise the verifier key. + +The single relation constrains all eleven registered verifier phases: + +- typed witness shape, sparse activation, and active trace heights; +- specialised Aiur verifying-key/AIR metadata; +- all 18 canonical Goldilocks claim words and the 224-byte Stage 2 statement; +- lookup-message inversion, intermediate logUp accumulators, and final balance; +- exact chained-BLAKE3 transcript replay; +- Goldilocks and degree-two extension arithmetic; +- first/last/transition selectors and compiled AIR DAG evaluation; +- alpha-folded OOD composition and quotient recombination; +- every multi-matrix, multi-height PCS opening and BLAKE3 MMCS path; +- every binary FRI beta, grinding draw, query index, fold, roll-in, and final + polynomial check; and +- one published BLAKE3 Stage 2 root shared by the statement and proof checks. + +PCS leaves use the full BLAKE3 tree hasher, including rows wider than one block +and messages beyond one 1,024-byte chunk. Transcript field sampling follows +Plonky3 rejection sampling across the current digest plus one constrained +chained refill. The bounded circuit fails closed only if fewer than two values +are canonical among eight candidates, or among seven after a raw commit-PoW +draw. The latter probability is below roughly `2^-189`. + +## Measured complete proof + +The production regression fixture is a real canonical multi-STARK proof with +an inactive leading circuit, active circuits at heights 8 and 4, an active +preprocessed matrix, an 18-word claim lookup, nontrivial first-row/transition +constraints, and two FRI queries. + +On the debug profile, the complete production round trip produced: + +- Stage 3 artifact: **326,019 bytes**; +- encoded production payload: **325,893 bytes**; and +- prove + decode + valid verify + negative checks: **529.55 seconds**. + +The negative checks reject a different relation digest and a corrupted proof. +This size is expected: Stage 3 is the off-chain proof whose small fixed +verifier is compressed by Stage 4. It is not the sub-kilobyte Ethereum proof. + +Run the exact regression with: + +```sh +cargo test -p flock-stage3-host real_stage2_production_artifact_round_trip -- --ignored --nocapture +``` + +The ordinary suite exercises relation construction and native/circuit +differential checks without paying the full proving cost: + +```sh +cargo test -p flock-stage3-host --lib +cargo clippy -p flock-stage3-host --all-targets -- -D warnings +``` + +Print the selected Flock configuration and digest with: + +```sh +cargo run -p flock-stage3-host --bin flock-stage3-config +``` + +## Scope and remaining work + +The current relation is deliberately specialised to the configuration used by +Ix: 18 claim words, binary FRI, cap height zero, and an exact activation/height +shape. Host deserialization is witness generation rather than trusted +acceptance; every lowered value reaches a verifier constraint. Native +prevalidation remains an ergonomics and cost guard. + +Before freezing a production deployment, Stage 3 still needs: + +- capacity measurements over the intended aggregate-proof corpus rather than + one small fixture; +- differential vectors for production-sized Aiur roots and nonzero grinding; +- an independent review of the local Boolean R1CS tables and pinned Flock + soundness profile; and +- a canonical export of the fixed Flock verifier inputs for Stage 4 witness + generation. + +The next implementation boundary is Stage 4: compile verification of this +fixed relation into the universal-setup FFLONK development backend, measure its +constraint/gas costs, and retain the option to switch the same statement to a +circuit-specific Groth16 endpoint once the relation is stable. diff --git a/flock-stage3/host/Cargo.toml b/flock-stage3/host/Cargo.toml new file mode 100644 index 000000000..77c770687 --- /dev/null +++ b/flock-stage3/host/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "flock-stage3-host" +version.workspace = true +edition.workspace = true +license.workspace = true + +[dependencies] +anyhow = { workspace = true } +aiur = { workspace = true } +bincode = { workspace = true } +blake3 = { workspace = true } +flock-prover = { workspace = true } +ix-terminal = { workspace = true } +multi-stark = { workspace = true } +serde = { workspace = true } + +[lints] +workspace = true diff --git a/flock-stage3/host/src/air.rs b/flock-stage3/host/src/air.rs new file mode 100644 index 000000000..a77f63f79 --- /dev/null +++ b/flock-stage3/host/src/air.rs @@ -0,0 +1,1048 @@ +//! Compiled Aiur AIR evaluation inside the Stage 3 Flock relation. +//! +//! The verifier evaluates every compiled base-polynomial node in the degree-2 +//! challenge field. LogUp is then evaluated in coordinates: one logical +//! accumulator consists of two such challenge-field values. This mirrors +//! `multi_stark::verifier` rather than trusting a host-computed composition. + +use aiur::vk_codec::{AiurAirCircuitMetadata, AiurVerifyingKey}; +use anyhow::{Result, bail}; +use flock_prover::{ + circuit::builder::{ShapeBuilder, SlotId, Wire}, + field::F128, +}; +use ix_terminal::{ + STAGE2_ROOT_STATEMENT_BYTES, ValidatedStage2RootV1, fri_parameter_words, +}; +use multi_stark::{ + expr::{RowOffset, Source}, + graph::Node, + lookup::{Lookup, WidthBinding}, + p3_field::{BasedVectorSpace, Field, PrimeCharacteristicRing, PrimeField64}, + types::{ExtVal, FriParameters, Val}, +}; + +use crate::{ + Stage2PcsInstanceV1, Stage2TranscriptByteBindingV1, Stage2TranscriptReplayV1, + Stage2TranscriptSegmentV1, Stage3TypedProofWitnessV1, + binding::pack_bytes, + extension::GoldilocksCircuitSlots, + fri::{ + assert_f128_equal, bound_transcript_extension, bound_transcript_window, + record_fixed, + }, + goldilocks::GOLDILOCKS_MODULUS, + transcript::TranscriptConstraintRegion, + transcript::{constrain_hash, hash_trace}, +}; + +const EXTENSION_DEGREE: usize = 2; +const STAGE2_STATEMENT_PREFIX_BYTES: usize = 80; + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage2ActiveAirCircuitV1 { + pub circuit_index: usize, + pub log_degree: u8, + pub metadata: AiurAirCircuitMetadata, + pub log_degree_binding: Stage2TranscriptByteBindingV1, + pub accumulator_binding: Stage2TranscriptByteBindingV1, +} + +/// Fixed compiled programs and transcript locations for one Stage 2 proof +/// shape. Claim values remain dynamic public transcript words. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage2AirProgramV1 { + pub active: Vec, + pub activation_bindings: Vec, + pub active_circuits: Vec, + pub claim_bindings: Vec, + pub width_binding: WidthBinding, + pub statement_prefix: [u8; STAGE2_STATEMENT_PREFIX_BYTES], + pub statement_digest: [u8; 32], +} + +impl Stage2AirProgramV1 { + pub fn from_prepared( + prepared: &ValidatedStage2RootV1, + fri: &FriParameters, + pcs: &Stage2PcsInstanceV1, + ) -> Result { + let typed = Stage3TypedProofWitnessV1::from_prepared(prepared, fri)?; + Self::from_prepared_and_typed(prepared, fri, pcs, &typed) + } + + pub fn from_prepared_and_typed( + prepared: &ValidatedStage2RootV1, + fri: &FriParameters, + pcs: &Stage2PcsInstanceV1, + typed: &Stage3TypedProofWitnessV1, + ) -> Result { + typed.ensure_profile(prepared.advice_profile())?; + let key = AiurVerifyingKey::from_bytes(prepared.verifying_key_bytes()) + .map_err(|error| anyhow::anyhow!("decode Aiur AIR key: {error}"))?; + if key.to_bytes() != prepared.verifying_key_bytes() { + bail!("Aiur AIR key is not canonically encoded"); + } + if fri_parameter_words(&key.fri_parameters()) != fri_parameter_words(fri) { + bail!("Stage 3 AIR lowering uses different FRI parameters"); + } + if key.commitment_parameters().cap_height != 0 { + bail!("Stage 3 AIR lowering currently requires cap height zero"); + } + + let metadata = key.air_circuit_metadata(); + if metadata.len() != typed.active.len() { + bail!("Aiur AIR metadata and activation lengths disagree"); + } + let active_indices: Vec<_> = typed + .active + .iter() + .enumerate() + .filter_map(|(index, &active)| active.then_some(index)) + .collect(); + if active_indices.len() != typed.log_degrees.len() + || active_indices.len() != typed.intermediate_accumulators.len() + { + bail!("Aiur AIR active-circuit vectors disagree"); + } + if typed.intermediate_accumulators.last() != Some(&[0, 0]) { + bail!("Aiur AIR lookup accumulator is not balanced"); + } + + validate_pcs_geometry(pcs, &metadata, &active_indices, typed)?; + + let seed_bytes = key.transcript_seed_and_shape_bytes().len(); + let activation_base = seed_bytes; + let preprocessed_bytes = key + .preprocessed_commitment_roots() + .as_ref() + .map_or(0, |roots| roots.len() * 32); + let stage_1_bytes = typed.commitments.stage_1_trace.len() * 32; + let log_degree_base = activation_base + .checked_add(typed.active.len() * 8) + .and_then(|offset| offset.checked_add(preprocessed_bytes)) + .and_then(|offset| offset.checked_add(stage_1_bytes)) + .ok_or_else(|| anyhow::anyhow!("AIR transcript offset overflow"))?; + let claims_base = log_degree_base + .checked_add(typed.log_degrees.len() * 8) + .ok_or_else(|| anyhow::anyhow!("AIR claim offset overflow"))?; + + let claim_words = prepared.statement().outer_claim_words().to_vec(); + if prepared.claims_bytes().len() != 16 + claim_words.len() * 8 { + bail!("Stage 2 recursive claim transport has the wrong length"); + } + let claim_bindings = (0..claim_words.len()) + .map(|word| { + Stage2TranscriptByteBindingV1::new( + Stage2TranscriptSegmentV1::Initial, + claims_base + 16 + word * 8, + ) + }) + .collect(); + let activation_bindings = (0..typed.active.len()) + .map(|circuit| { + Stage2TranscriptByteBindingV1::new( + Stage2TranscriptSegmentV1::Initial, + activation_base + circuit * 8, + ) + }) + .collect(); + + let active_circuits = active_indices + .iter() + .enumerate() + .map(|(position, &circuit_index)| Stage2ActiveAirCircuitV1 { + circuit_index, + log_degree: typed.log_degrees[position], + metadata: metadata[circuit_index].clone(), + log_degree_binding: Stage2TranscriptByteBindingV1::new( + Stage2TranscriptSegmentV1::Initial, + log_degree_base + position * 8, + ), + accumulator_binding: Stage2TranscriptByteBindingV1::new( + Stage2TranscriptSegmentV1::Stage2AndAccumulator, + typed.commitments.stage_2_trace.len() * 32 + position * 16, + ), + }) + .collect::>(); + + let height_weight = + active_circuits.iter().try_fold(1u128, |total, circuit| { + let per_row: u128 = circuit + .metadata + .graph + .lookups + .iter() + .map(|lookup| u128::from(lookup.max_multiplicity)) + .sum(); + let height = 1u128 << circuit.log_degree; + total + .checked_add(per_row.saturating_mul(height)) + .ok_or_else(|| anyhow::anyhow!("AIR multiplicity bound overflow")) + })?; + if height_weight >= u128::from(GOLDILOCKS_MODULUS) { + bail!("AIR multiplicity height bound exceeds Goldilocks"); + } + + let statement_bytes = prepared.statement().to_bytes(); + if statement_bytes.len() != STAGE2_ROOT_STATEMENT_BYTES { + bail!("Stage 2 statement has the wrong length"); + } + let mut statement_prefix = [0u8; STAGE2_STATEMENT_PREFIX_BYTES]; + statement_prefix + .copy_from_slice(&statement_bytes[..STAGE2_STATEMENT_PREFIX_BYTES]); + + Ok(Self { + active: typed.active.clone(), + activation_bindings, + active_circuits, + claim_bindings, + width_binding: key.width_binding(), + statement_prefix, + statement_digest: prepared.statement().digest(), + }) + } + + pub(crate) fn row_budget(&self) -> usize { + let graph_rows = self + .active_circuits + .iter() + .map(|circuit| { + let nodes = circuit.metadata.graph.nodes.len(); + let constraints = circuit.metadata.graph.zeros.len() + + circuit + .metadata + .graph + .lookups + .len() + .div_ceil(circuit.metadata.lookup_group_size) + * EXTENSION_DEGREE; + nodes + .saturating_mul(96) + .saturating_add(constraints.saturating_mul(192)) + .saturating_add(circuit.metadata.quotient_degree * 96) + .saturating_add(2048) + }) + .sum::(); + graph_rows + .saturating_add(self.claim_bindings.len().saturating_mul(128)) + .max(1) + } +} + +fn validate_pcs_geometry( + pcs: &Stage2PcsInstanceV1, + metadata: &[AiurAirCircuitMetadata], + active_indices: &[usize], + typed: &Stage3TypedProofWitnessV1, +) -> Result<()> { + let expected_batches = + 3 + usize::from(typed.preprocessed_opened_values.is_some()); + if pcs.batches.len() != expected_batches { + bail!("AIR PCS batch count disagrees with the typed proof"); + } + for batch in &pcs.batches[..3] { + if batch.matrices.len() != active_indices.len() { + bail!("AIR PCS active-matrix count disagrees with the typed proof"); + } + } + for (position, &circuit_index) in active_indices.iter().enumerate() { + let circuit = &metadata[circuit_index]; + let expected = [ + (circuit.main_width, 2usize), + (circuit.stage_2_width, 2), + (circuit.quotient_degree * EXTENSION_DEGREE, 1), + ]; + for (batch, (width, points)) in expected.into_iter().enumerate() { + let matrix = &pcs.batches[batch].matrices[position]; + if matrix.width != width || matrix.opening_points.len() != points { + bail!("AIR PCS matrix geometry disagrees with the verifier key"); + } + } + } + Ok(()) +} + +#[allow(clippy::too_many_arguments)] +pub(crate) fn constrain_stage2_air( + builder: &mut ShapeBuilder, + arithmetic: &GoldilocksCircuitSlots, + blake3: SlotId, + equality: SlotId, + equality_zero: Wire, + window: SlotId, + data_zero: Wire, + one: Wire, + iv: [Wire; 2], + inputs: &mut Vec, + public: &mut Vec, + prefix_region: &TranscriptConstraintRegion, + prefix: &Stage2TranscriptReplayV1, + pcs: &Stage2PcsInstanceV1, + program: &Stage2AirProgramV1, +) -> Result<()> { + let challenges = prefix.challenges()?; + let lookup = prefix_region.challenges.lookup; + let fingerprint = prefix_region.challenges.fingerprint; + let alpha = prefix_region.challenges.constraint; + let zeta = prefix_region.challenges.zeta; + for wire in [lookup, fingerprint, alpha, zeta] { + arithmetic.assert_canonical(builder, wire); + } + + // Bind the specialised activation pattern and active trace heights to the + // exact words already consumed by Fiat--Shamir. + for (&active, &binding) in + program.active.iter().zip(&program.activation_bindings) + { + let observed = bound_low_word( + builder, + arithmetic, + window, + data_zero, + inputs, + public, + prefix_region, + binding, + ); + let expected = + record_fixed(builder, inputs, public, F128::new(u64::from(active), 0)); + assert_f128_equal(builder, equality, equality_zero, observed, expected); + } + for circuit in &program.active_circuits { + let observed = bound_low_word( + builder, + arithmetic, + window, + data_zero, + inputs, + public, + prefix_region, + circuit.log_degree_binding, + ); + let expected = record_fixed( + builder, + inputs, + public, + F128::new(u64::from(circuit.log_degree), 0), + ); + assert_f128_equal(builder, equality, equality_zero, observed, expected); + } + + let claim_wires: Vec<_> = program + .claim_bindings + .iter() + .map(|&binding| { + let wire = bound_low_word( + builder, + arithmetic, + window, + data_zero, + inputs, + public, + prefix_region, + binding, + ); + arithmetic.assert_canonical(builder, wire); + wire + }) + .collect(); + constrain_stage2_statement( + builder, + arithmetic, + blake3, + data_zero, + iv, + inputs, + public, + &claim_wires, + program, + )?; + + let native_lookup = native_extension(challenges.lookup); + let native_fingerprint = native_extension(challenges.fingerprint); + let mut native_message = ExtVal::ZERO; + let native_claim_words = program + .claim_bindings + .iter() + .map(|&binding| read_bound_u64(prefix, binding)) + .collect::>>()?; + for &word in native_claim_words.iter().rev() { + native_message = native_message * native_fingerprint + Val::from_u64(word); + } + native_message += native_lookup; + let native_inverse = native_message + .try_inverse() + .ok_or_else(|| anyhow::anyhow!("Stage 2 claim lookup message is zero"))?; + + let mut claim_fingerprint = data_zero; + for &word in claim_wires.iter().rev() { + let scaled = arithmetic.ext2_mul(builder, claim_fingerprint, fingerprint); + claim_fingerprint = arithmetic.add(builder, scaled, word); + } + let message = arithmetic.add(builder, lookup, claim_fingerprint); + let inverse = record_private( + builder, + inputs, + pack_extension(extension_words(native_inverse)), + ); + arithmetic.assert_canonical(builder, inverse); + let inverse_check = arithmetic.ext2_mul(builder, message, inverse); + assert_f128_equal(builder, equality, equality_zero, inverse_check, one); + let mut accumulator = inverse; + + let neg_one = + record_fixed(builder, inputs, public, F128::new(GOLDILOCKS_MODULUS - 1, 0)); + let seven = record_fixed(builder, inputs, public, F128::new(7, 0)); + let basis_u = record_fixed(builder, inputs, public, F128::new(0, 1)); + + for (position, circuit) in program.active_circuits.iter().enumerate() { + let next_accumulator = bound_transcript_extension( + builder, + window, + data_zero, + inputs, + public, + prefix_region, + circuit.accumulator_binding, + 0, + ); + arithmetic.assert_canonical(builder, next_accumulator); + if position + 1 == program.active_circuits.len() { + assert_f128_equal( + builder, + equality, + equality_zero, + next_accumulator, + data_zero, + ); + } + + let lookup_coords = arithmetic.ext2_coordinates(builder, lookup); + let fingerprint_coords = arithmetic.ext2_coordinates(builder, fingerprint); + let accumulator_coords = arithmetic.ext2_coordinates(builder, accumulator); + let next_accumulator_coords = + arithmetic.ext2_coordinates(builder, next_accumulator); + let publics = [ + lookup_coords[0], + lookup_coords[1], + fingerprint_coords[0], + fingerprint_coords[1], + accumulator_coords[0], + accumulator_coords[1], + next_accumulator_coords[0], + next_accumulator_coords[1], + ]; + + let openings = bind_air_openings( + builder, + window, + data_zero, + inputs, + public, + prefix_region, + pcs, + circuit, + position, + )?; + let selector_values = + native_selectors(challenges.zeta, circuit.log_degree)?; + let is_first = + record_private(builder, inputs, pack_extension(selector_values.is_first)); + let is_last = + record_private(builder, inputs, pack_extension(selector_values.is_last)); + let inv_vanishing = record_private( + builder, + inputs, + pack_extension(selector_values.inv_vanishing), + ); + for selector in [is_first, is_last, inv_vanishing] { + arithmetic.assert_canonical(builder, selector); + } + + let mut zeta_pow_n = zeta; + for _ in 0..circuit.log_degree { + zeta_pow_n = arithmetic.ext2_mul(builder, zeta_pow_n, zeta_pow_n); + } + let z_h = ext_sub(builder, arithmetic, neg_one, zeta_pow_n, one); + let inv_check = arithmetic.ext2_mul(builder, inv_vanishing, z_h); + assert_f128_equal(builder, equality, equality_zero, inv_check, one); + let zeta_minus_one = ext_sub(builder, arithmetic, neg_one, zeta, one); + let first_check = arithmetic.ext2_mul(builder, is_first, zeta_minus_one); + assert_f128_equal(builder, equality, equality_zero, first_check, z_h); + + let generator = Val::TWO_ADIC_GENERATORS[usize::from(circuit.log_degree)]; + let generator_inverse = generator.inverse(); + let generator_inverse_wire = record_fixed( + builder, + inputs, + public, + F128::new(generator_inverse.as_canonical_u64(), 0), + ); + let is_transition = + ext_sub(builder, arithmetic, neg_one, zeta, generator_inverse_wire); + let last_check = arithmetic.ext2_mul(builder, is_last, is_transition); + assert_f128_equal(builder, equality, equality_zero, last_check, z_h); + + let n = Val::from_u64(1u64 << circuit.log_degree); + let injection_scale = (n * generator).inverse(); + let injection_scale = record_fixed( + builder, + inputs, + public, + F128::new(injection_scale.as_canonical_u64(), 0), + ); + let delta_scaled = std::array::from_fn(|coordinate| { + let delta = ext_sub( + builder, + arithmetic, + neg_one, + next_accumulator_coords[coordinate], + accumulator_coords[coordinate], + ); + arithmetic.ext2_mul(builder, delta, injection_scale) + }); + + let node_values = constrain_graph( + builder, + arithmetic, + neg_one, + inputs, + public, + circuit, + &openings, + &publics, + is_first, + is_last, + is_transition, + )?; + let mut constraints: Vec<_> = circuit + .metadata + .graph + .zeros + .iter() + .map(|root| node_values[root.index()]) + .collect(); + constraints.extend(constrain_logup( + builder, + arithmetic, + neg_one, + seven, + data_zero, + one, + &circuit.metadata.graph.lookups, + circuit.metadata.lookup_group_size, + program.width_binding, + &node_values, + &openings.stage2[0], + &openings.stage2[1], + &publics, + &delta_scaled, + is_last, + inputs, + public, + )); + + let mut composition = data_zero; + for constraint in constraints { + let scaled = arithmetic.ext2_mul(builder, composition, alpha); + composition = arithmetic.add(builder, scaled, constraint); + } + + let mut quotient = data_zero; + let mut power = one; + for chunk in openings.quotient.as_chunks::().0 { + let high = arithmetic.ext2_mul(builder, chunk[1], basis_u); + let coefficient = arithmetic.add(builder, chunk[0], high); + let term = arithmetic.ext2_mul(builder, power, coefficient); + quotient = arithmetic.add(builder, quotient, term); + power = arithmetic.ext2_mul(builder, power, zeta_pow_n); + } + let ood = arithmetic.ext2_mul(builder, composition, inv_vanishing); + assert_f128_equal(builder, equality, equality_zero, ood, quotient); + accumulator = next_accumulator; + } + Ok(()) +} + +#[allow(clippy::too_many_arguments)] +fn constrain_stage2_statement( + builder: &mut ShapeBuilder, + arithmetic: &GoldilocksCircuitSlots, + blake3: SlotId, + data_zero: Wire, + iv: [Wire; 2], + inputs: &mut Vec, + public: &mut Vec, + claims: &[Wire], + program: &Stage2AirProgramV1, +) -> Result<()> { + if claims.len() != 18 { + bail!("Stage 2 statement binding requires 18 claim words"); + } + let mut message = program + .statement_prefix + .as_chunks::<16>() + .0 + .iter() + .map(|word| record_fixed(builder, inputs, public, pack_bytes(word))) + .collect::>(); + for pair in claims.as_chunks::<2>().0 { + let high_lanes = builder.gate(arithmetic.repack, &[pair[1], data_zero]); + let packed = builder.gate(arithmetic.repack, &[pair[0], high_lanes[0]])[3]; + message.push(packed); + } + let trace = hash_trace(STAGE2_ROOT_STATEMENT_BYTES); + let parameters = trace + .rows + .iter() + .map(|&(_cv, _message, counter, block_len, flags)| { + record_fixed( + builder, + inputs, + public, + crate::binding::pack_params(counter, block_len, flags), + ) + }) + .collect::>(); + let root = constrain_hash( + builder, + blake3, + &trace, + ¶meters, + iv, + data_zero, + &message, + )?; + builder.publish(root[0]); + builder.publish(root[1]); + public.extend_from_slice(&[ + pack_bytes(&program.statement_digest[..16]), + pack_bytes(&program.statement_digest[16..]), + ]); + Ok(()) +} + +struct BoundAirOpenings { + preprocessed: [Vec; 2], + main: [Vec; 2], + stage2: [Vec; 2], + quotient: Vec, +} + +#[allow(clippy::too_many_arguments)] +fn bind_air_openings( + builder: &mut ShapeBuilder, + window: SlotId, + data_zero: Wire, + inputs: &mut Vec, + public: &mut Vec, + prefix_region: &TranscriptConstraintRegion, + pcs: &Stage2PcsInstanceV1, + circuit: &Stage2ActiveAirCircuitV1, + position: usize, +) -> Result { + let main = bind_matrix( + builder, + window, + data_zero, + inputs, + public, + prefix_region, + pcs, + 0, + position, + )?; + let stage2 = bind_matrix( + builder, + window, + data_zero, + inputs, + public, + prefix_region, + pcs, + 1, + position, + )?; + let quotient = bind_matrix( + builder, + window, + data_zero, + inputs, + public, + prefix_region, + pcs, + 2, + position, + )?; + if main.len() != 2 || stage2.len() != 2 || quotient.len() != 1 { + bail!("AIR opening-point geometry is invalid"); + } + let preprocessed = if let Some(slot) = circuit.metadata.preprocessed_slot { + let values = bind_matrix( + builder, + window, + data_zero, + inputs, + public, + prefix_region, + pcs, + 3, + slot, + )?; + if values.len() != 2 { + bail!("active AIR preprocessed matrix has the wrong opening count"); + } + [values[0].clone(), values[1].clone()] + } else { + [Vec::new(), Vec::new()] + }; + Ok(BoundAirOpenings { + preprocessed, + main: [main[0].clone(), main[1].clone()], + stage2: [stage2[0].clone(), stage2[1].clone()], + quotient: quotient[0].clone(), + }) +} + +#[allow(clippy::too_many_arguments)] +fn bind_matrix( + builder: &mut ShapeBuilder, + window: SlotId, + data_zero: Wire, + inputs: &mut Vec, + public: &mut Vec, + prefix_region: &TranscriptConstraintRegion, + pcs: &Stage2PcsInstanceV1, + batch: usize, + matrix: usize, +) -> Result>> { + let matrix = pcs + .batches + .get(batch) + .and_then(|batch| batch.matrices.get(matrix)) + .ok_or_else(|| anyhow::anyhow!("AIR PCS matrix is missing"))?; + Ok( + (0..matrix.opening_points.len()) + .map(|point| { + (0..matrix.width) + .map(|column| { + bound_transcript_extension( + builder, + window, + data_zero, + inputs, + public, + prefix_region, + matrix.opened_values, + point * matrix.width + column, + ) + }) + .collect() + }) + .collect(), + ) +} + +#[allow(clippy::too_many_arguments)] +fn constrain_graph( + builder: &mut ShapeBuilder, + arithmetic: &GoldilocksCircuitSlots, + neg_one: Wire, + inputs: &mut Vec, + public: &mut Vec, + circuit: &Stage2ActiveAirCircuitV1, + openings: &BoundAirOpenings, + publics: &[Wire; 8], + is_first: Wire, + is_last: Wire, + is_transition: Wire, +) -> Result> { + let mut values = Vec::with_capacity(circuit.metadata.graph.nodes.len()); + for node in &circuit.metadata.graph.nodes { + let value = match *node { + Node::Const(value) => record_fixed( + builder, + inputs, + public, + F128::new(value.as_canonical_u64(), 0), + ), + Node::Var(column) => { + let rows = match column.source { + Source::Preprocessed => &openings.preprocessed, + Source::Main => &openings.main, + Source::Stage2 => &openings.stage2, + }; + let row = match column.offset { + RowOffset::Current => 0, + RowOffset::Next => 1, + }; + *rows[row] + .get(usize::try_from(column.index).unwrap()) + .ok_or_else(|| anyhow::anyhow!("AIR graph column is out of range"))? + }, + Node::Public(index) => *publics + .get(usize::try_from(index).unwrap()) + .ok_or_else(|| anyhow::anyhow!("AIR graph public is out of range"))?, + Node::IsFirstRow => is_first, + Node::IsLastRow => is_last, + Node::IsTransition => is_transition, + Node::Add(left, right) => { + arithmetic.add(builder, values[left.index()], values[right.index()]) + }, + Node::Sub(left, right) => ext_sub( + builder, + arithmetic, + neg_one, + values[left.index()], + values[right.index()], + ), + Node::Mul(left, right) => arithmetic.ext2_mul( + builder, + values[left.index()], + values[right.index()], + ), + Node::Neg(value) => { + arithmetic.ext2_mul(builder, values[value.index()], neg_one) + }, + }; + values.push(value); + } + Ok(values) +} + +#[allow(clippy::too_many_arguments)] +fn constrain_logup( + builder: &mut ShapeBuilder, + arithmetic: &GoldilocksCircuitSlots, + neg_one: Wire, + seven: Wire, + zero: Wire, + one: Wire, + lookups: &[Lookup], + group_size: usize, + width_binding: WidthBinding, + node_values: &[Wire], + stage2: &[Wire], + stage2_next: &[Wire], + publics: &[Wire; 8], + delta_scaled: &[Wire; 2], + is_last: Wire, + inputs: &mut Vec, + public_inputs: &mut Vec, +) -> Vec { + let beta = [publics[0], publics[1]]; + let gamma = [publics[2], publics[3]]; + let injection = [ + arithmetic.ext2_mul(builder, is_last, delta_scaled[0]), + arithmetic.ext2_mul(builder, is_last, delta_scaled[1]), + ]; + if lookups.is_empty() { + return (0..EXTENSION_DEGREE) + .map(|coordinate| { + let difference = ext_sub( + builder, + arithmetic, + neg_one, + stage2_next[coordinate], + stage2[coordinate], + ); + arithmetic.add(builder, difference, injection[coordinate]) + }) + .collect(); + } + + let group_size = group_size.max(1); + let last_group = lookups.len().div_ceil(group_size) - 1; + let mut constraints = Vec::new(); + for (group, chunk) in lookups.chunks(group_size).enumerate() { + let source = [stage2[2 * group], stage2[2 * group + 1]]; + let target = if group < last_group { + [stage2[2 * group + 2], stage2[2 * group + 3]] + } else { + [ + arithmetic.add(builder, stage2_next[0], injection[0]), + arithmetic.add(builder, stage2_next[1], injection[1]), + ] + }; + let difference = [ + ext_sub(builder, arithmetic, neg_one, target[0], source[0]), + ext_sub(builder, arithmetic, neg_one, target[1], source[1]), + ]; + let messages: Vec<_> = chunk + .iter() + .map(|lookup| { + let seed = match width_binding { + WidthBinding::Fingerprint => lookup.args.len() as u64, + WidthBinding::ByConstruction => 0, + }; + let seed = + record_fixed(builder, inputs, public_inputs, F128::new(seed, 0)); + let mut fingerprint = [seed, zero]; + for &argument in lookup.args.iter().rev() { + fingerprint = + coord_mul(builder, arithmetic, seven, fingerprint, gamma); + fingerprint[0] = arithmetic.add( + builder, + fingerprint[0], + node_values[argument.index()], + ); + } + [ + arithmetic.add(builder, fingerprint[0], beta[0]), + arithmetic.add(builder, fingerprint[1], beta[1]), + ] + }) + .collect(); + let mut product = [one, zero]; + for &message in &messages { + product = coord_mul(builder, arithmetic, seven, product, message); + } + let lhs = coord_mul(builder, arithmetic, seven, product, difference); + let mut rhs = [zero, zero]; + for (excluded, lookup) in chunk.iter().enumerate() { + let mut others = [one, zero]; + for (index, &message) in messages.iter().enumerate() { + if index != excluded { + others = coord_mul(builder, arithmetic, seven, others, message); + } + } + for coordinate in 0..EXTENSION_DEGREE { + let term = arithmetic.ext2_mul( + builder, + others[coordinate], + node_values[lookup.multiplicity.index()], + ); + rhs[coordinate] = arithmetic.add(builder, rhs[coordinate], term); + } + } + constraints.extend((0..EXTENSION_DEGREE).map(|coordinate| { + ext_sub(builder, arithmetic, neg_one, lhs[coordinate], rhs[coordinate]) + })); + } + constraints +} + +fn coord_mul( + builder: &mut ShapeBuilder, + arithmetic: &GoldilocksCircuitSlots, + seven: Wire, + left: [Wire; 2], + right: [Wire; 2], +) -> [Wire; 2] { + let low = arithmetic.ext2_mul(builder, left[0], right[0]); + let high_product = arithmetic.ext2_mul(builder, left[1], right[1]); + let reduced_high = arithmetic.ext2_mul(builder, high_product, seven); + let cross_0 = arithmetic.ext2_mul(builder, left[0], right[1]); + let cross_1 = arithmetic.ext2_mul(builder, left[1], right[0]); + [ + arithmetic.add(builder, low, reduced_high), + arithmetic.add(builder, cross_0, cross_1), + ] +} + +fn ext_sub( + builder: &mut ShapeBuilder, + arithmetic: &GoldilocksCircuitSlots, + neg_one: Wire, + left: Wire, + right: Wire, +) -> Wire { + let negated = arithmetic.ext2_mul(builder, right, neg_one); + arithmetic.add(builder, left, negated) +} + +#[allow(clippy::too_many_arguments)] +fn bound_low_word( + builder: &mut ShapeBuilder, + arithmetic: &GoldilocksCircuitSlots, + window: SlotId, + data_zero: Wire, + inputs: &mut Vec, + public: &mut Vec, + prefix_region: &TranscriptConstraintRegion, + binding: Stage2TranscriptByteBindingV1, +) -> Wire { + let word = bound_transcript_window( + builder, + window, + data_zero, + inputs, + public, + prefix_region, + binding, + 0, + ); + arithmetic.embed_low_lane(builder, word) +} + +fn record_private( + builder: &mut ShapeBuilder, + inputs: &mut Vec, + value: F128, +) -> Wire { + inputs.push(value); + builder.input() +} + +struct NativeSelectors { + is_first: [u64; 2], + is_last: [u64; 2], + inv_vanishing: [u64; 2], +} + +fn native_selectors(zeta: [u64; 2], log_degree: u8) -> Result { + let zeta = native_extension(zeta); + let z_h = zeta.exp_power_of_2(usize::from(log_degree)) - ExtVal::ONE; + let generator = Val::TWO_ADIC_GENERATORS[usize::from(log_degree)]; + let generator_inverse = ExtVal::from(generator.inverse()); + let is_first = z_h + * (zeta - ExtVal::ONE) + .try_inverse() + .ok_or_else(|| anyhow::anyhow!("OOD point is the first trace point"))?; + let is_last = z_h + * (zeta - generator_inverse) + .try_inverse() + .ok_or_else(|| anyhow::anyhow!("OOD point is the last trace point"))?; + let inv_vanishing = z_h + .try_inverse() + .ok_or_else(|| anyhow::anyhow!("OOD point is inside the trace domain"))?; + Ok(NativeSelectors { + is_first: extension_words(is_first), + is_last: extension_words(is_last), + inv_vanishing: extension_words(inv_vanishing), + }) +} + +fn native_extension(value: [u64; 2]) -> ExtVal { + ExtVal::new([Val::from_u64(value[0]), Val::from_u64(value[1])]) +} + +fn extension_words(value: ExtVal) -> [u64; 2] { + let values: &[Val] = value.as_basis_coefficients_slice(); + [values[0].as_canonical_u64(), values[1].as_canonical_u64()] +} + +fn pack_extension(value: [u64; 2]) -> F128 { + F128::new(value[0], value[1]) +} + +fn read_bound_u64( + prefix: &Stage2TranscriptReplayV1, + binding: Stage2TranscriptByteBindingV1, +) -> Result { + let segment = match binding.segment { + Stage2TranscriptSegmentV1::Initial => &prefix.initial_observations, + Stage2TranscriptSegmentV1::Stage2AndAccumulator => { + &prefix.stage2_and_accumulator_observations + }, + Stage2TranscriptSegmentV1::QuotientCommitment => { + &prefix.quotient_commitment_observations + }, + Stage2TranscriptSegmentV1::PcsOpening => &prefix.pcs_opening_observations, + }; + let bytes = segment + .get(binding.byte_offset..binding.byte_offset + 8) + .ok_or_else(|| anyhow::anyhow!("AIR transcript word is out of range"))?; + Ok(u64::from_le_bytes(bytes.try_into().unwrap())) +} diff --git a/flock-stage3/host/src/arithmetic.rs b/flock-stage3/host/src/arithmetic.rs new file mode 100644 index 000000000..228e2725c --- /dev/null +++ b/flock-stage3/host/src/arithmetic.rs @@ -0,0 +1,676 @@ +//! Real Flock circuit proof for the custom Goldilocks arithmetic tables. +//! +//! This remains a labelled conformance artifact, not a Stage 3 proof. It +//! exists to ensure new non-native field tables survive the complete union, +//! wiring, PCS, Fiat-Shamir, serialization, and verifier path before verifier +//! phases depend on them. + +use anyhow::{Context, Result, bail}; +use bincode::Options; +use flock_prover::{ + challenger::FsChallenger, + circuit::builder::{CircuitShape, ShapeBuilder, SlotId}, + field::F128, + pcs::Commitment, + proof::R1csProofCircuitMerged, + prover::{self, UnionSlotProverInput}, + union::UnionInstance, + verifier, +}; +use serde::{Deserialize, Serialize}; + +use crate::{ + ARITHMETIC_CONFORMANCE_TRANSCRIPT_DOMAIN, FlockConfigV1, + binding::pcs_params, + extension::{ + GoldilocksCircuitSlots, GoldilocksLaneRepackGate, build_lane_repack_r1cs, + generate_lane_repack_witness, goldilocks_ext2_mul, + }, + goldilocks::{ + CanonicalGoldilocksPairGate, GOLDILOCKS_MODULUS, GoldilocksAddPairGate, + build_canonical_pair_r1cs, build_goldilocks_add_r1cs, + generate_canonical_pair_witness, generate_goldilocks_add_witness, + }, + multiplication::{ + GoldilocksMulPairGate, build_goldilocks_mul_r1cs, + generate_goldilocks_mul_witness, + }, +}; + +pub const ARITHMETIC_CONFORMANCE_ARTIFACT_MAGIC: &[u8; 8] = b"IXFLKGA1"; +const ARTIFACT_VERSION: u16 = 1; +const FIXED_PREFIX_BYTES: usize = 8 + 2 + 32 + 2 + 2 + 2; +const FIXED_SUFFIX_BYTES: usize = 32 + 8; +const OPERAND_BYTES: usize = 4 * 8; +const MAX_ADDITIONS: usize = 64; +const MAX_MULTIPLICATIONS: usize = 64; +const MAX_EXTENSION_MULTIPLICATIONS: usize = 16; +const MAX_BUNDLE_BYTES: usize = 64 * 1024 * 1024; +// The shared row domain leaves ample virtual address space for the largest +// custom table and always reaches Flock's audited Fast128 geometries. +// Declared row counts remain exact; this only supplies zero padding. +const MIN_SECURE_NU: usize = 10; + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct GoldilocksAddPairV1 { + pub left: [u64; 2], + pub right: [u64; 2], +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct GoldilocksMulPairV1 { + pub left: [u64; 2], + pub right: [u64; 2], +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct GoldilocksExt2MulV1 { + pub left: [u64; 2], + pub right: [u64; 2], +} + +impl GoldilocksExt2MulV1 { + pub fn result(self) -> [u64; 2] { + let result = goldilocks_ext2_mul( + F128::new(self.left[0], self.left[1]), + F128::new(self.right[0], self.right[1]), + ); + [result.lo, result.hi] + } +} + +/// A real Flock proof of public lane-wise Goldilocks arithmetic. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct ArithmeticConformanceArtifactV1 { + additions: Vec, + multiplications: Vec, + extension_multiplications: Vec, + circuit_digest: [u8; 32], + proof_bundle_bytes: Vec, +} + +impl ArithmeticConformanceArtifactV1 { + pub fn to_bytes(&self) -> Vec { + let mut bytes = Vec::with_capacity( + FIXED_PREFIX_BYTES + + (self.additions.len() + + self.multiplications.len() + + self.extension_multiplications.len()) + * OPERAND_BYTES + + FIXED_SUFFIX_BYTES + + self.proof_bundle_bytes.len(), + ); + bytes.extend_from_slice(ARITHMETIC_CONFORMANCE_ARTIFACT_MAGIC); + bytes.extend_from_slice(&ARTIFACT_VERSION.to_le_bytes()); + bytes.extend_from_slice(&FlockConfigV1.digest()); + bytes.extend_from_slice( + &u16::try_from(self.additions.len()) + .expect("addition count") + .to_le_bytes(), + ); + bytes.extend_from_slice( + &u16::try_from(self.multiplications.len()) + .expect("multiplication count") + .to_le_bytes(), + ); + bytes.extend_from_slice( + &u16::try_from(self.extension_multiplications.len()) + .expect("extension multiplication count") + .to_le_bytes(), + ); + for addition in &self.additions { + encode_operands(&mut bytes, addition.left, addition.right); + } + for multiplication in &self.multiplications { + encode_operands(&mut bytes, multiplication.left, multiplication.right); + } + for multiplication in &self.extension_multiplications { + encode_operands(&mut bytes, multiplication.left, multiplication.right); + } + bytes.extend_from_slice(&self.circuit_digest); + bytes.extend_from_slice( + &u64::try_from(self.proof_bundle_bytes.len()) + .expect("proof bundle length") + .to_le_bytes(), + ); + bytes.extend_from_slice(&self.proof_bundle_bytes); + bytes + } + + pub fn from_bytes(bytes: &[u8]) -> Result { + if bytes.len() < FIXED_PREFIX_BYTES + FIXED_SUFFIX_BYTES { + bail!("truncated Flock arithmetic conformance artifact"); + } + if &bytes[..8] != ARITHMETIC_CONFORMANCE_ARTIFACT_MAGIC { + bail!("invalid Flock arithmetic conformance artifact magic"); + } + let version = u16::from_le_bytes(bytes[8..10].try_into().unwrap()); + if version != ARTIFACT_VERSION { + bail!("unsupported Flock arithmetic artifact version {version}"); + } + if bytes[10..42] != FlockConfigV1.digest() { + bail!("Flock arithmetic artifact configuration mismatch"); + } + let addition_count = + usize::from(u16::from_le_bytes(bytes[42..44].try_into().unwrap())); + let multiplication_count = + usize::from(u16::from_le_bytes(bytes[44..46].try_into().unwrap())); + let extension_multiplication_count = + usize::from(u16::from_le_bytes(bytes[46..48].try_into().unwrap())); + validate_counts( + addition_count, + multiplication_count, + extension_multiplication_count, + )?; + let operation_count = + addition_count + multiplication_count + extension_multiplication_count; + let operands_end = FIXED_PREFIX_BYTES + .checked_add(operation_count * OPERAND_BYTES) + .ok_or_else(|| anyhow::anyhow!("arithmetic operand length overflow"))?; + let suffix_end = operands_end + .checked_add(FIXED_SUFFIX_BYTES) + .ok_or_else(|| anyhow::anyhow!("arithmetic artifact length overflow"))?; + if bytes.len() < suffix_end { + bail!("truncated Flock arithmetic operands or proof header"); + } + let mut additions = Vec::with_capacity(addition_count); + let mut multiplications = Vec::with_capacity(multiplication_count); + let mut extension_multiplications = + Vec::with_capacity(extension_multiplication_count); + let (encoded_operations, remainder) = + bytes[FIXED_PREFIX_BYTES..operands_end].as_chunks::(); + debug_assert!(remainder.is_empty()); + for encoded in &encoded_operations[..addition_count] { + let (left, right) = decode_operands(encoded); + let addition = GoldilocksAddPairV1 { left, right }; + validate_operands(addition.left, addition.right)?; + additions.push(addition); + } + let multiplication_end = addition_count + multiplication_count; + for encoded in &encoded_operations[addition_count..multiplication_end] { + let (left, right) = decode_operands(encoded); + let multiplication = GoldilocksMulPairV1 { left, right }; + validate_operands(multiplication.left, multiplication.right)?; + multiplications.push(multiplication); + } + for encoded in &encoded_operations[multiplication_end..] { + let (left, right) = decode_operands(encoded); + let multiplication = GoldilocksExt2MulV1 { left, right }; + validate_operands(multiplication.left, multiplication.right)?; + extension_multiplications.push(multiplication); + } + let mut circuit_digest = [0u8; 32]; + circuit_digest.copy_from_slice(&bytes[operands_end..operands_end + 32]); + let bundle_len = usize::try_from(u64::from_le_bytes( + bytes[operands_end + 32..suffix_end].try_into().unwrap(), + )) + .map_err(|error| { + anyhow::anyhow!("proof bundle length does not fit usize: {error}") + })?; + if bundle_len == 0 || bundle_len > MAX_BUNDLE_BYTES { + bail!("invalid Flock arithmetic proof bundle length {bundle_len}"); + } + let expected_len = suffix_end + .checked_add(bundle_len) + .ok_or_else(|| anyhow::anyhow!("arithmetic proof length overflow"))?; + if bytes.len() != expected_len { + bail!( + "Flock arithmetic artifact is {} bytes; header declares {expected_len}", + bytes.len() + ); + } + let proof_bundle_bytes = bytes[suffix_end..].to_vec(); + decode_bundle(&proof_bundle_bytes) + .context("decode Flock arithmetic conformance proof bundle")?; + Ok(Self { + additions, + multiplications, + extension_multiplications, + circuit_digest, + proof_bundle_bytes, + }) + } + + pub fn additions(&self) -> &[GoldilocksAddPairV1] { + &self.additions + } + + pub fn multiplications(&self) -> &[GoldilocksMulPairV1] { + &self.multiplications + } + + pub fn extension_multiplications(&self) -> &[GoldilocksExt2MulV1] { + &self.extension_multiplications + } + + pub fn circuit_digest(&self) -> &[u8; 32] { + &self.circuit_digest + } + + pub fn proof_bundle_bytes(&self) -> &[u8] { + &self.proof_bundle_bytes + } +} + +#[derive(Serialize, Deserialize)] +struct ArithmeticProofBundle { + commitment: Commitment, + proof: R1csProofCircuitMerged, +} + +pub fn prove_arithmetic_conformance( + additions: &[GoldilocksAddPairV1], + multiplications: &[GoldilocksMulPairV1], + extension_multiplications: &[GoldilocksExt2MulV1], +) -> Result { + validate_operations(additions, multiplications, extension_multiplications)?; + let relation = ArithmeticRelation::build( + additions.len(), + multiplications.len(), + extension_multiplications.len(), + )?; + let inputs = + relation_inputs(additions, multiplications, extension_multiplications); + let witness = relation.shape.run(&inputs, &[]); + relation.ensure_registry_order()?; + + let add_rows = witness.rows::(relation.add_slot); + let mul_rows = witness.rows::(relation.mul_slot); + let repack_rows = + witness.rows::(relation.repack_slot); + let canonical_rows = + witness.rows::(relation.canonical_slot); + let add_r1cs = build_goldilocks_add_r1cs(relation.nu); + let add_lincheck = add_r1cs.csc_lincheck_circuit(); + let mul_r1cs = build_goldilocks_mul_r1cs(relation.nu); + let mul_lincheck = mul_r1cs.csc_lincheck_circuit(); + let repack_r1cs = build_lane_repack_r1cs(relation.nu); + let repack_lincheck = repack_r1cs.csc_lincheck_circuit(); + let canonical_r1cs = build_canonical_pair_r1cs(relation.nu); + let canonical_lincheck = canonical_r1cs.csc_lincheck_circuit(); + let union = + UnionInstance::new(&relation.shape.registry, relation.shape.counts.clone()); + let params = pcs_params(&union); + let mut challenger = + FsChallenger::with_chained_blake3(ARITHMETIC_CONFORMANCE_TRANSCRIPT_DOMAIN); + let (proof, commitment, _) = prover::prove_fast_ligerito_union_circuit( + &union, + &relation.shape.circuit, + &witness.public, + ¶ms, + vec![ + UnionSlotProverInput::new( + generate_goldilocks_mul_witness(mul_rows, relation.nu), + mul_lincheck, + ), + UnionSlotProverInput::new( + generate_goldilocks_add_witness(add_rows, relation.nu), + add_lincheck, + ), + UnionSlotProverInput::new( + generate_lane_repack_witness(repack_rows, relation.nu), + repack_lincheck, + ), + UnionSlotProverInput::new( + generate_canonical_pair_witness(canonical_rows, relation.nu), + canonical_lincheck, + ), + ], + Vec::new(), + &mut challenger, + ); + let proof_bundle_bytes = + encode_bundle(&ArithmeticProofBundle { commitment, proof })?; + if proof_bundle_bytes.len() > MAX_BUNDLE_BYTES { + bail!("Flock arithmetic proof bundle exceeds {MAX_BUNDLE_BYTES} bytes"); + } + Ok(ArithmeticConformanceArtifactV1 { + additions: additions.to_vec(), + multiplications: multiplications.to_vec(), + extension_multiplications: extension_multiplications.to_vec(), + circuit_digest: relation.shape.circuit.digest(), + proof_bundle_bytes, + }) +} + +pub fn verify_arithmetic_conformance( + artifact: &ArithmeticConformanceArtifactV1, +) -> Result<()> { + validate_operations( + &artifact.additions, + &artifact.multiplications, + &artifact.extension_multiplications, + )?; + let relation = ArithmeticRelation::build( + artifact.additions.len(), + artifact.multiplications.len(), + artifact.extension_multiplications.len(), + )?; + relation.ensure_registry_order()?; + if artifact.circuit_digest != relation.shape.circuit.digest() { + bail!("Flock arithmetic conformance circuit digest mismatch"); + } + let witness = relation.shape.run( + &relation_inputs( + &artifact.additions, + &artifact.multiplications, + &artifact.extension_multiplications, + ), + &[], + ); + let bundle = decode_bundle(&artifact.proof_bundle_bytes) + .context("decode Flock arithmetic conformance proof bundle")?; + let add_r1cs = build_goldilocks_add_r1cs(relation.nu); + let add_lincheck = add_r1cs.csc_lincheck_circuit(); + let mul_r1cs = build_goldilocks_mul_r1cs(relation.nu); + let mul_lincheck = mul_r1cs.csc_lincheck_circuit(); + let repack_r1cs = build_lane_repack_r1cs(relation.nu); + let repack_lincheck = repack_r1cs.csc_lincheck_circuit(); + let canonical_r1cs = build_canonical_pair_r1cs(relation.nu); + let canonical_lincheck = canonical_r1cs.csc_lincheck_circuit(); + let linchecks: [&dyn flock_prover::lincheck::LincheckCircuit; 4] = + [mul_lincheck, add_lincheck, repack_lincheck, canonical_lincheck]; + let union = + UnionInstance::new(&relation.shape.registry, relation.shape.counts.clone()); + let params = pcs_params(&union); + let mut challenger = + FsChallenger::with_chained_blake3(ARITHMETIC_CONFORMANCE_TRANSCRIPT_DOMAIN); + verifier::verify_ligerito_union_circuit( + &union, + &relation.shape.circuit, + &witness.public, + &linchecks, + &bundle.commitment, + &bundle.proof, + ¶ms, + &mut challenger, + ) + .map_err(|error| { + anyhow::anyhow!("Flock arithmetic conformance proof rejected: {error:?}") + })?; + Ok(()) +} + +struct ArithmeticRelation { + shape: CircuitShape, + add_slot: SlotId, + mul_slot: SlotId, + canonical_slot: SlotId, + repack_slot: SlotId, + nu: usize, +} + +impl ArithmeticRelation { + fn build( + addition_count: usize, + multiplication_count: usize, + extension_multiplication_count: usize, + ) -> Result { + validate_counts( + addition_count, + multiplication_count, + extension_multiplication_count, + )?; + let row_bound = [ + addition_count + 5 * extension_multiplication_count, + multiplication_count + 2 * extension_multiplication_count, + 3 * addition_count + + 3 * multiplication_count + + 9 * extension_multiplication_count, + 3 * extension_multiplication_count, + ] + .into_iter() + .max() + .unwrap(); + let nu = usize::try_from(row_bound.next_power_of_two().ilog2()) + .unwrap() + .max(MIN_SECURE_NU); + let mut builder = ShapeBuilder::new(nu); + let slots = GoldilocksCircuitSlots::declare(&mut builder, nu); + for _ in 0..addition_count { + let left = builder.public_input(); + let right = builder.public_input(); + for value in [left, right] { + slots.assert_canonical(&mut builder, value); + } + let result = slots.add(&mut builder, left, right); + builder.publish(result); + } + for _ in 0..multiplication_count { + let left = builder.public_input(); + let right = builder.public_input(); + for value in [left, right] { + slots.assert_canonical(&mut builder, value); + } + let result = slots.mul(&mut builder, left, right); + builder.publish(result); + } + for _ in 0..extension_multiplication_count { + let left = builder.public_input(); + let right = builder.public_input(); + let result = slots.ext2_mul(&mut builder, left, right); + builder.publish(result); + } + let shape = builder.finish().map_err(|error| { + anyhow::anyhow!("build Flock arithmetic conformance circuit: {error:?}") + })?; + Ok(Self { + shape, + add_slot: slots.add, + mul_slot: slots.mul, + canonical_slot: slots.canonical, + repack_slot: slots.repack, + nu, + }) + } + + fn ensure_registry_order(&self) -> Result<()> { + // Registry::new sorts Boolean tables by descending k_log. + if self.shape.registry_slot(self.mul_slot) != 0 + || self.shape.registry_slot(self.add_slot) != 1 + || self.shape.registry_slot(self.repack_slot) != 2 + || self.shape.registry_slot(self.canonical_slot) != 3 + { + bail!("unexpected Flock arithmetic table registry order"); + } + Ok(()) + } +} + +fn relation_inputs( + additions: &[GoldilocksAddPairV1], + multiplications: &[GoldilocksMulPairV1], + extension_multiplications: &[GoldilocksExt2MulV1], +) -> Vec { + let mut inputs = Vec::with_capacity( + 1 + 2 + * (additions.len() + + multiplications.len() + + extension_multiplications.len()), + ); + inputs.push(F128::ZERO); + for addition in additions { + inputs.push(F128::new(addition.left[0], addition.left[1])); + inputs.push(F128::new(addition.right[0], addition.right[1])); + } + for multiplication in multiplications { + inputs.push(F128::new(multiplication.left[0], multiplication.left[1])); + inputs.push(F128::new(multiplication.right[0], multiplication.right[1])); + } + for multiplication in extension_multiplications { + inputs.push(F128::new(multiplication.left[0], multiplication.left[1])); + inputs.push(F128::new(multiplication.right[0], multiplication.right[1])); + } + inputs +} + +fn validate_operations( + additions: &[GoldilocksAddPairV1], + multiplications: &[GoldilocksMulPairV1], + extension_multiplications: &[GoldilocksExt2MulV1], +) -> Result<()> { + validate_counts( + additions.len(), + multiplications.len(), + extension_multiplications.len(), + )?; + for addition in additions { + validate_operands(addition.left, addition.right)?; + } + for multiplication in multiplications { + validate_operands(multiplication.left, multiplication.right)?; + } + for multiplication in extension_multiplications { + validate_operands(multiplication.left, multiplication.right)?; + } + Ok(()) +} + +fn validate_counts( + addition_count: usize, + multiplication_count: usize, + extension_multiplication_count: usize, +) -> Result<()> { + if addition_count > MAX_ADDITIONS { + bail!( + "Flock arithmetic conformance has {addition_count} additions; maximum is {MAX_ADDITIONS}" + ); + } + if multiplication_count > MAX_MULTIPLICATIONS { + bail!( + "Flock arithmetic conformance has {multiplication_count} multiplications; maximum is {MAX_MULTIPLICATIONS}" + ); + } + if extension_multiplication_count > MAX_EXTENSION_MULTIPLICATIONS { + bail!( + "Flock arithmetic conformance has {extension_multiplication_count} extension multiplications; maximum is {MAX_EXTENSION_MULTIPLICATIONS}" + ); + } + if addition_count + multiplication_count + extension_multiplication_count == 0 + { + bail!("Flock arithmetic conformance requires at least one operation"); + } + Ok(()) +} + +fn validate_operands(left: [u64; 2], right: [u64; 2]) -> Result<()> { + if left.iter().chain(&right).any(|&word| word >= GOLDILOCKS_MODULUS) { + bail!("Flock arithmetic operand is not canonical Goldilocks"); + } + Ok(()) +} + +fn encode_operands(bytes: &mut Vec, left: [u64; 2], right: [u64; 2]) { + for word in [left[0], left[1], right[0], right[1]] { + bytes.extend_from_slice(&word.to_le_bytes()); + } +} + +fn decode_operands(encoded: &[u8; OPERAND_BYTES]) -> ([u64; 2], [u64; 2]) { + let words: [u64; 4] = std::array::from_fn(|index| { + let offset = index * 8; + u64::from_le_bytes(encoded[offset..offset + 8].try_into().unwrap()) + }); + ([words[0], words[1]], [words[2], words[3]]) +} + +fn encode_bundle(bundle: &ArithmeticProofBundle) -> Result> { + bincode::DefaultOptions::new() + .with_fixint_encoding() + .serialize(bundle) + .context("encode Flock arithmetic conformance proof bundle") +} + +fn decode_bundle(bytes: &[u8]) -> Result { + bincode::DefaultOptions::new() + .with_fixint_encoding() + .with_limit(MAX_BUNDLE_BYTES as u64) + .reject_trailing_bytes() + .deserialize(bytes) + .context("invalid Flock arithmetic conformance proof bundle") +} + +#[cfg(test)] +mod tests { + use super::*; + + fn addition_fixture() -> Vec { + (0..8u64) + .map(|index| GoldilocksAddPairV1 { + left: [index, GOLDILOCKS_MODULUS - 1 - index], + right: [GOLDILOCKS_MODULUS - 1 - index, index + 1], + }) + .collect() + } + + fn multiplication_fixture() -> Vec { + (0..4u64) + .map(|index| GoldilocksMulPairV1 { + left: [index + 1, GOLDILOCKS_MODULUS - 1 - index], + right: [GOLDILOCKS_MODULUS - 2 - index, index + 3], + }) + .collect() + } + + fn extension_multiplication_fixture() -> Vec { + vec![ + GoldilocksExt2MulV1 { left: [3, 5], right: [7, 11] }, + GoldilocksExt2MulV1 { + left: [GOLDILOCKS_MODULUS - 1, 17], + right: [23, GOLDILOCKS_MODULUS - 2], + }, + ] + } + + #[test] + fn artifact_parser_is_strict_before_crypto() { + let artifact = ArithmeticConformanceArtifactV1 { + additions: addition_fixture(), + multiplications: multiplication_fixture(), + extension_multiplications: extension_multiplication_fixture(), + circuit_digest: [7; 32], + proof_bundle_bytes: vec![1, 2, 3], + }; + let mut bytes = artifact.to_bytes(); + assert!(ArithmeticConformanceArtifactV1::from_bytes(&bytes).is_err()); + bytes[0] ^= 1; + assert!(ArithmeticConformanceArtifactV1::from_bytes(&bytes).is_err()); + } + + #[test] + #[ignore = "real Flock arithmetic circuit proof; run explicitly"] + fn real_goldilocks_arithmetic_round_trip_and_mutations() { + let artifact = prove_arithmetic_conformance( + &addition_fixture(), + &multiplication_fixture(), + &extension_multiplication_fixture(), + ) + .expect("prove arithmetic"); + eprintln!( + "Flock Goldilocks-arithmetic conformance bundle: {} bytes", + artifact.proof_bundle_bytes().len() + ); + verify_arithmetic_conformance(&artifact).expect("verify arithmetic"); + + let bytes = artifact.to_bytes(); + let decoded = ArithmeticConformanceArtifactV1::from_bytes(&bytes).unwrap(); + verify_arithmetic_conformance(&decoded).expect("verify decoded arithmetic"); + + let mut wrong_operand = decoded.clone(); + wrong_operand.additions[0].left[0] ^= 1; + assert!(verify_arithmetic_conformance(&wrong_operand).is_err()); + + let mut wrong_multiplication = decoded.clone(); + wrong_multiplication.multiplications[0].right[1] ^= 1; + assert!(verify_arithmetic_conformance(&wrong_multiplication).is_err()); + + let mut wrong_extension = decoded.clone(); + wrong_extension.extension_multiplications[0].left[1] ^= 1; + assert!(verify_arithmetic_conformance(&wrong_extension).is_err()); + + let mut wrong_proof = decoded; + let flip_at = wrong_proof.proof_bundle_bytes.len() / 2; + wrong_proof.proof_bundle_bytes[flip_at] ^= 1; + assert!(verify_arithmetic_conformance(&wrong_proof).is_err()); + } +} diff --git a/flock-stage3/host/src/artifact.rs b/flock-stage3/host/src/artifact.rs new file mode 100644 index 000000000..aac8793f5 --- /dev/null +++ b/flock-stage3/host/src/artifact.rs @@ -0,0 +1,381 @@ +use anyhow::{Context, Result, bail}; +use bincode::Options; +use ix_terminal::Stage2RootStatementV1; +use serde::{Deserialize, Serialize}; + +use crate::config::FlockConfigV1; + +pub const STAGE3_STATEMENT_DOMAIN: &[u8; 8] = b"IXFLK301"; +pub const STAGE3_STATEMENT_BYTES: usize = 8 + 32 + 32 + 32; +const ARTIFACT_MAGIC: &[u8; 8] = b"IXFLOCK3"; +const ARTIFACT_VERSION: u16 = 1; +const ARTIFACT_HEADER_BYTES: usize = 8 + 2 + 4 + 8; +const MAX_PROOF_BYTES: usize = 64 * 1024 * 1024; +const PRODUCTION_PAYLOAD_MAGIC: [u8; 8] = *b"IXFLK3P1"; +const PRODUCTION_PAYLOAD_VERSION: u16 = 1; + +/// Public input to the complete Flock Stage 3 relation. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage3StatementV1 { + stage2_root_digest: [u8; 32], + relation_digest: [u8; 32], + config_digest: [u8; 32], +} + +impl Stage3StatementV1 { + pub fn new( + stage2_root: &Stage2RootStatementV1, + relation_digest: [u8; 32], + ) -> Self { + Self { + stage2_root_digest: stage2_root.digest(), + relation_digest, + config_digest: FlockConfigV1.digest(), + } + } + + pub fn from_bytes(bytes: &[u8]) -> Result { + if bytes.len() != STAGE3_STATEMENT_BYTES { + bail!( + "Stage 3 statement is {} bytes; expected {STAGE3_STATEMENT_BYTES}", + bytes.len() + ); + } + if &bytes[..8] != STAGE3_STATEMENT_DOMAIN { + bail!("invalid Stage 3 statement domain"); + } + let mut stage2_root_digest = [0u8; 32]; + stage2_root_digest.copy_from_slice(&bytes[8..40]); + let mut relation_digest = [0u8; 32]; + relation_digest.copy_from_slice(&bytes[40..72]); + let mut config_digest = [0u8; 32]; + config_digest.copy_from_slice(&bytes[72..104]); + if config_digest != FlockConfigV1.digest() { + bail!("Stage 3 statement uses a different Flock configuration"); + } + Ok(Self { stage2_root_digest, relation_digest, config_digest }) + } + + pub fn to_bytes(&self) -> Vec { + let mut bytes = Vec::with_capacity(STAGE3_STATEMENT_BYTES); + bytes.extend_from_slice(STAGE3_STATEMENT_DOMAIN); + bytes.extend_from_slice(&self.stage2_root_digest); + bytes.extend_from_slice(&self.relation_digest); + bytes.extend_from_slice(&self.config_digest); + bytes + } + + pub fn digest(&self) -> [u8; 32] { + *blake3::hash(&self.to_bytes()).as_bytes() + } + + pub fn stage2_root_digest(&self) -> &[u8; 32] { + &self.stage2_root_digest + } + + pub fn relation_digest(&self) -> &[u8; 32] { + &self.relation_digest + } + + pub fn config_digest(&self) -> &[u8; 32] { + &self.config_digest + } +} + +/// Strict transport framing for a complete Stage 3 proof. +/// +/// Parsing establishes canonical framing only; cryptographic acceptance also +/// requires `FlockStage3Backend::verify_stage2` with an expected statement. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage3ArtifactV1 { + statement: Stage3StatementV1, + proof: Vec, +} + +impl Stage3ArtifactV1 { + pub(crate) fn new( + statement: Stage3StatementV1, + proof: Vec, + ) -> Result { + if proof.is_empty() { + bail!("Stage 3 proof is empty"); + } + if proof.len() > MAX_PROOF_BYTES { + bail!("Stage 3 proof exceeds {MAX_PROOF_BYTES} bytes"); + } + Ok(Self { statement, proof }) + } + + pub fn to_bytes(&self) -> Vec { + let statement = self.statement.to_bytes(); + let mut bytes = Vec::with_capacity( + ARTIFACT_HEADER_BYTES + statement.len() + self.proof.len(), + ); + bytes.extend_from_slice(ARTIFACT_MAGIC); + bytes.extend_from_slice(&ARTIFACT_VERSION.to_le_bytes()); + bytes.extend_from_slice( + &u32::try_from(statement.len()).expect("statement length").to_le_bytes(), + ); + bytes.extend_from_slice( + &u64::try_from(self.proof.len()).expect("proof length").to_le_bytes(), + ); + bytes.extend_from_slice(&statement); + bytes.extend_from_slice(&self.proof); + bytes + } + + pub fn from_bytes(bytes: &[u8]) -> Result { + if bytes.len() < ARTIFACT_HEADER_BYTES { + bail!("truncated Stage 3 artifact header"); + } + if &bytes[..8] != ARTIFACT_MAGIC { + bail!("invalid Stage 3 artifact magic"); + } + let version = read_u16(&bytes[8..10]); + if version != ARTIFACT_VERSION { + bail!("unsupported Stage 3 artifact version {version}"); + } + let statement_len = + usize::try_from(read_u32(&bytes[10..14])).expect("u32 fits in usize"); + if statement_len != STAGE3_STATEMENT_BYTES { + bail!("invalid Stage 3 statement length {statement_len}"); + } + let proof_len = + usize::try_from(read_u64(&bytes[14..22])).map_err(|_| { + anyhow::anyhow!("Stage 3 proof length does not fit usize") + })?; + if proof_len == 0 { + bail!("Stage 3 proof is empty"); + } + if proof_len > MAX_PROOF_BYTES { + bail!("Stage 3 proof exceeds {MAX_PROOF_BYTES} bytes"); + } + let expected_len = ARTIFACT_HEADER_BYTES + .checked_add(statement_len) + .and_then(|len| len.checked_add(proof_len)) + .ok_or_else(|| anyhow::anyhow!("Stage 3 artifact length overflow"))?; + if bytes.len() != expected_len { + bail!( + "Stage 3 artifact is {} bytes; header declares {expected_len}", + bytes.len() + ); + } + let statement_end = ARTIFACT_HEADER_BYTES + statement_len; + let statement = Stage3StatementV1::from_bytes( + &bytes[ARTIFACT_HEADER_BYTES..statement_end], + )?; + Self::new(statement, bytes[statement_end..].to_vec()) + } + + pub fn ensure_statement(&self, expected: &Stage3StatementV1) -> Result<()> { + if &self.statement != expected { + bail!("Stage 3 artifact statement does not match the expected root"); + } + Ok(()) + } + + pub fn statement(&self) -> &Stage3StatementV1 { + &self.statement + } + + pub fn proof_bytes(&self) -> &[u8] { + &self.proof + } +} + +/// Canonical host transport needed to reconstruct the Flock public input. +/// +/// The compact Stage 2 inputs are not trusted by verification: they are +/// decoded again, lowered into the fixed relation, and checked against the +/// proof. Keeping them here avoids making Rust's serializer part of the Flock +/// circuit while giving Stage 4 a deterministic source for the verifier +/// witness. +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub(crate) struct Stage3ProductionPayloadV1 { + magic: [u8; 8], + version: u16, + config_digest: [u8; 32], + vk_bytes: Vec, + claim_bytes: Vec, + stage2_proof_bytes: Vec, + circuit_digest: [u8; 32], + flock_proof_bundle_bytes: Vec, +} + +impl Stage3ProductionPayloadV1 { + pub(crate) fn new( + vk_bytes: &[u8], + claim_bytes: &[u8], + stage2_proof_bytes: &[u8], + circuit_digest: [u8; 32], + flock_proof_bundle_bytes: &[u8], + ) -> Result { + let payload = Self { + magic: PRODUCTION_PAYLOAD_MAGIC, + version: PRODUCTION_PAYLOAD_VERSION, + config_digest: FlockConfigV1.digest(), + vk_bytes: vk_bytes.to_vec(), + claim_bytes: claim_bytes.to_vec(), + stage2_proof_bytes: stage2_proof_bytes.to_vec(), + circuit_digest, + flock_proof_bundle_bytes: flock_proof_bundle_bytes.to_vec(), + }; + payload.validate()?; + Ok(payload) + } + + pub(crate) fn encode(&self) -> Result> { + self.validate()?; + let bytes = bincode::DefaultOptions::new() + .with_fixint_encoding() + .serialize(self) + .context("encode Stage 3 production payload")?; + if bytes.len() > MAX_PROOF_BYTES { + bail!("Stage 3 production payload exceeds {MAX_PROOF_BYTES} bytes"); + } + Ok(bytes) + } + + pub(crate) fn decode(bytes: &[u8]) -> Result { + let payload: Self = bincode::DefaultOptions::new() + .with_fixint_encoding() + .with_limit(MAX_PROOF_BYTES as u64) + .reject_trailing_bytes() + .deserialize(bytes) + .context("invalid Stage 3 production payload")?; + payload.validate()?; + Ok(payload) + } + + fn validate(&self) -> Result<()> { + if self.magic != PRODUCTION_PAYLOAD_MAGIC { + bail!("invalid Stage 3 production payload magic"); + } + if self.version != PRODUCTION_PAYLOAD_VERSION { + bail!("unsupported Stage 3 production payload version {}", self.version); + } + if self.config_digest != FlockConfigV1.digest() { + bail!("Stage 3 production payload configuration mismatch"); + } + for (bytes, label) in [ + (self.vk_bytes.as_slice(), "verifying key"), + (self.claim_bytes.as_slice(), "claim"), + (self.stage2_proof_bytes.as_slice(), "Stage 2 proof"), + (self.flock_proof_bundle_bytes.as_slice(), "Flock proof bundle"), + ] { + if bytes.is_empty() { + bail!("Stage 3 production payload has an empty {label}"); + } + } + Ok(()) + } + + pub(crate) fn vk_bytes(&self) -> &[u8] { + &self.vk_bytes + } + + pub(crate) fn claim_bytes(&self) -> &[u8] { + &self.claim_bytes + } + + pub(crate) fn stage2_proof_bytes(&self) -> &[u8] { + &self.stage2_proof_bytes + } + + pub(crate) const fn circuit_digest(&self) -> [u8; 32] { + self.circuit_digest + } + + pub(crate) fn flock_proof_bundle_bytes(&self) -> &[u8] { + &self.flock_proof_bundle_bytes + } +} + +fn read_u16(bytes: &[u8]) -> u16 { + u16::from_le_bytes(bytes.try_into().expect("fixed u16")) +} + +fn read_u32(bytes: &[u8]) -> u32 { + u32::from_le_bytes(bytes.try_into().expect("fixed u32")) +} + +fn read_u64(bytes: &[u8]) -> u64 { + u64::from_le_bytes(bytes.try_into().expect("fixed u64")) +} + +#[cfg(test)] +mod tests { + use super::*; + use multi_stark::types::FriParameters; + + fn statement() -> Stage3StatementV1 { + let fri = FriParameters { + log_final_poly_len: 0, + max_log_arity: 1, + num_queries: 100, + commit_proof_of_work_bits: 0, + query_proof_of_work_bits: 20, + }; + let claim: Vec = (0..18u64).flat_map(u64::to_le_bytes).collect(); + let root = Stage2RootStatementV1::new(b"vk", &claim, &fri).unwrap(); + Stage3StatementV1::new(&root, [7; 32]) + } + + #[test] + fn artifact_round_trip_rejects_extensions_and_mutations() { + let artifact = Stage3ArtifactV1::new(statement(), vec![1, 2, 3]).unwrap(); + assert_eq!( + blake3::Hash::from_bytes(artifact.statement().digest()).to_hex().as_str(), + "9f8062ce1801b29ed755cfb394fe888d5d82af77fe1ba2e5f539567e14e8b00d" + ); + let bytes = artifact.to_bytes(); + assert_eq!(Stage3ArtifactV1::from_bytes(&bytes).unwrap(), artifact); + + let mut extended = bytes.clone(); + extended.push(0); + assert!(Stage3ArtifactV1::from_bytes(&extended).is_err()); + + let mut wrong_domain = bytes.clone(); + wrong_domain[ARTIFACT_HEADER_BYTES] ^= 1; + assert!(Stage3ArtifactV1::from_bytes(&wrong_domain).is_err()); + + let mut wrong_config = bytes; + wrong_config[ARTIFACT_HEADER_BYTES + 72] ^= 1; + assert!(Stage3ArtifactV1::from_bytes(&wrong_config).is_err()); + } + + #[test] + fn expected_statement_is_checked_before_crypto() { + let artifact = Stage3ArtifactV1::new(statement(), vec![1]).unwrap(); + assert!(artifact.ensure_statement(&statement()).is_ok()); + let mut other = statement(); + other.relation_digest[0] ^= 1; + assert!(artifact.ensure_statement(&other).is_err()); + } + + #[test] + fn production_payload_is_strict_and_configuration_bound() { + let payload = Stage3ProductionPayloadV1::new( + b"vk", + b"claim", + b"stage2 proof", + [9; 32], + b"flock proof", + ) + .unwrap(); + let bytes = payload.encode().unwrap(); + assert_eq!(Stage3ProductionPayloadV1::decode(&bytes).unwrap(), payload); + + let mut extended = bytes.clone(); + extended.push(0); + assert!(Stage3ProductionPayloadV1::decode(&extended).is_err()); + + let mut wrong_magic = bytes; + wrong_magic[0] ^= 1; + assert!(Stage3ProductionPayloadV1::decode(&wrong_magic).is_err()); + + let mut wrong_config = payload; + wrong_config.config_digest[0] ^= 1; + assert!(wrong_config.encode().is_err()); + } +} diff --git a/flock-stage3/host/src/bin/flock-stage3-config.rs b/flock-stage3/host/src/bin/flock-stage3-config.rs new file mode 100644 index 000000000..d389b79ca --- /dev/null +++ b/flock-stage3/host/src/bin/flock-stage3-config.rs @@ -0,0 +1,19 @@ +use flock_stage3_host::{ + FLOCK_UPSTREAM_REVISION, FlockConfigV1, STAGE3_TRANSCRIPT_DOMAIN, +}; + +fn main() { + println!("flock_revision={FLOCK_UPSTREAM_REVISION}"); + println!("field=f128"); + println!("profile=fast128"); + println!("merkle_hash=blake3"); + println!("transcript=chained-blake3"); + println!( + "transcript_domain={}", + String::from_utf8_lossy(STAGE3_TRANSCRIPT_DOMAIN) + ); + println!( + "config_digest={}", + blake3::Hash::from_bytes(FlockConfigV1.digest()).to_hex() + ); +} diff --git a/flock-stage3/host/src/binding.rs b/flock-stage3/host/src/binding.rs new file mode 100644 index 000000000..d682ce5ec --- /dev/null +++ b/flock-stage3/host/src/binding.rs @@ -0,0 +1,670 @@ +//! First production-shaped Flock circuit slice: hash the canonical Stage 2 +//! root statement and expose only its BLAKE3 digest. The 80-byte domain/vk/FRI +//! prefix and BLAKE3 padding are fixed by the circuit; the 144 claim bytes are +//! private inputs whose 18 u64 limbs are constrained to be canonical +//! Goldilocks representatives. +//! +//! This proves real Boolean R1CS plus inter-row wiring with statement-bound +//! public I/O. It is deliberately not called a Stage 3 proof: it does not yet +//! parse the statement or verify the Aiur proof whose root it commits to. + +use anyhow::{Context, Result, bail}; +use bincode::Options; +use flock_prover::{ + challenger::FsChallenger, + circuit::builder::{ + CircuitShape, GateType, ShapeBuilder, SlotId, SlotWitness, Wire, + }, + field::F128, + pcs::{Commitment, PcsParams, ligerito::embedded_initial_k_or_default}, + proof::R1csProofCircuitMerged, + prover::{self, UnionSlotProverInput}, + r1cs_hashes::blake3, + schedule::TableType, + union::UnionInstance, + verifier, +}; +use ix_terminal::{STAGE2_ROOT_STATEMENT_BYTES, Stage2RootStatementV1}; +use serde::{Deserialize, Serialize}; + +use crate::{ + FlockConfigV1, STAGE3_TRANSCRIPT_DOMAIN, + goldilocks::{ + CanonicalGoldilocksPairGate, build_canonical_pair_r1cs, + generate_canonical_pair_witness, + }, +}; + +pub const STAGE3_BINDING_ARTIFACT_MAGIC: &[u8; 8] = b"IXFLK3B1"; +const STAGE3_BINDING_ARTIFACT_VERSION: u16 = 1; +const STAGE2_FIXED_PREFIX_BYTES: usize = 80; +const CONFIG_OFFSET: usize = 10; +const PREFIX_OFFSET: usize = CONFIG_OFFSET + 32; +const CIRCUIT_DIGEST_OFFSET: usize = PREFIX_OFFSET + STAGE2_FIXED_PREFIX_BYTES; +const ROOT_DIGEST_OFFSET: usize = CIRCUIT_DIGEST_OFFSET + 32; +const BUNDLE_LENGTH_OFFSET: usize = ROOT_DIGEST_OFFSET + 32; +const ARTIFACT_HEADER_BYTES: usize = BUNDLE_LENGTH_OFFSET + 8; +const MAX_PROOF_BUNDLE_BYTES: usize = 64 * 1024 * 1024; + +const BLAKE3_CAPACITY_LOG: usize = 8; +const BLOCK_BYTES: usize = 64; +const WORD_BYTES: usize = 16; +const MESSAGE_BLOCKS: usize = STAGE2_ROOT_STATEMENT_BYTES.div_ceil(BLOCK_BYTES); +const FIRST_CLAIM_WORD: usize = STAGE2_FIXED_PREFIX_BYTES / WORD_BYTES; +const CLAIM_WORDS: usize = + (STAGE2_ROOT_STATEMENT_BYTES - STAGE2_FIXED_PREFIX_BYTES) / WORD_BYTES; +pub(crate) const CHUNK_START: u32 = 1 << 0; +pub(crate) const CHUNK_END: u32 = 1 << 1; +pub(crate) const ROOT: u32 = 1 << 3; +pub(crate) const IV: [u32; 8] = [ + 0x6A09_E667, + 0xBB67_AE85, + 0x3C6E_F372, + 0xA54F_F53A, + 0x510E_527F, + 0x9B05_688C, + 0x1F83_D9AB, + 0x5BE0_CD19, +]; + +/// A genuine Flock circuit proof of the statement-hash subrelation. +/// +/// This artifact must never be accepted as [`crate::Stage3ArtifactV1`]. It +/// establishes only +/// `BLAKE3(fixed_domain_vk_fri_prefix || private_claim) = stage2_root_digest`. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage3BindingArtifactV1 { + fixed_statement_prefix: [u8; STAGE2_FIXED_PREFIX_BYTES], + circuit_digest: [u8; 32], + stage2_root_digest: [u8; 32], + proof_bundle_bytes: Vec, +} + +impl Stage3BindingArtifactV1 { + pub fn to_bytes(&self) -> Vec { + let mut bytes = + Vec::with_capacity(ARTIFACT_HEADER_BYTES + self.proof_bundle_bytes.len()); + bytes.extend_from_slice(STAGE3_BINDING_ARTIFACT_MAGIC); + bytes.extend_from_slice(&STAGE3_BINDING_ARTIFACT_VERSION.to_le_bytes()); + bytes.extend_from_slice(&FlockConfigV1.digest()); + bytes.extend_from_slice(&self.fixed_statement_prefix); + bytes.extend_from_slice(&self.circuit_digest); + bytes.extend_from_slice(&self.stage2_root_digest); + bytes.extend_from_slice( + &u64::try_from(self.proof_bundle_bytes.len()) + .expect("proof bundle length") + .to_le_bytes(), + ); + bytes.extend_from_slice(&self.proof_bundle_bytes); + bytes + } + + pub fn from_bytes(bytes: &[u8]) -> Result { + if bytes.len() < ARTIFACT_HEADER_BYTES { + bail!("truncated Flock statement-binding artifact"); + } + if &bytes[..8] != STAGE3_BINDING_ARTIFACT_MAGIC { + bail!("invalid Flock statement-binding artifact magic"); + } + let version = u16::from_le_bytes(bytes[8..10].try_into().unwrap()); + if version != STAGE3_BINDING_ARTIFACT_VERSION { + bail!("unsupported Flock statement-binding artifact version {version}"); + } + if bytes[CONFIG_OFFSET..PREFIX_OFFSET] != FlockConfigV1.digest() { + bail!("Flock statement-binding artifact configuration mismatch"); + } + let mut fixed_statement_prefix = [0u8; STAGE2_FIXED_PREFIX_BYTES]; + fixed_statement_prefix + .copy_from_slice(&bytes[PREFIX_OFFSET..CIRCUIT_DIGEST_OFFSET]); + let mut circuit_digest = [0u8; 32]; + circuit_digest + .copy_from_slice(&bytes[CIRCUIT_DIGEST_OFFSET..ROOT_DIGEST_OFFSET]); + let mut stage2_root_digest = [0u8; 32]; + stage2_root_digest + .copy_from_slice(&bytes[ROOT_DIGEST_OFFSET..BUNDLE_LENGTH_OFFSET]); + let bundle_len = usize::try_from(u64::from_le_bytes( + bytes[BUNDLE_LENGTH_OFFSET..ARTIFACT_HEADER_BYTES].try_into().unwrap(), + )) + .map_err(|error| { + anyhow::anyhow!("Flock proof bundle length does not fit usize: {error}") + })?; + if bundle_len == 0 || bundle_len > MAX_PROOF_BUNDLE_BYTES { + bail!("invalid Flock proof bundle length {bundle_len}"); + } + let expected_len = + ARTIFACT_HEADER_BYTES.checked_add(bundle_len).ok_or_else(|| { + anyhow::anyhow!("Flock binding artifact length overflow") + })?; + if bytes.len() != expected_len { + bail!( + "Flock statement-binding artifact is {} bytes; header declares {expected_len}", + bytes.len() + ); + } + let proof_bundle_bytes = bytes[ARTIFACT_HEADER_BYTES..].to_vec(); + decode_proof_bundle(&proof_bundle_bytes) + .context("decode Flock statement-binding proof bundle")?; + Ok(Self { + fixed_statement_prefix, + circuit_digest, + stage2_root_digest, + proof_bundle_bytes, + }) + } + + pub fn fixed_statement_prefix(&self) -> &[u8; STAGE2_FIXED_PREFIX_BYTES] { + &self.fixed_statement_prefix + } + + pub fn circuit_digest(&self) -> &[u8; 32] { + &self.circuit_digest + } + + pub fn stage2_root_digest(&self) -> &[u8; 32] { + &self.stage2_root_digest + } + + pub fn proof_bundle_bytes(&self) -> &[u8] { + &self.proof_bundle_bytes + } +} + +#[derive(Serialize, Deserialize)] +struct CircuitProofBundle { + commitment: Commitment, + proof: R1csProofCircuitMerged, +} + +/// Produce a real Flock circuit proof that checks the private claim's +/// Goldilocks encodings and hashes the canonical 224-byte Stage 2 statement +/// to its public root digest. +pub fn prove_stage3_statement_binding( + statement: &Stage2RootStatementV1, +) -> Result { + let statement_bytes = statement.to_bytes(); + let fixed_statement_prefix = statement_prefix(&statement_bytes); + let relation = StatementHashRelation::build(&fixed_statement_prefix)?; + let inputs = relation_inputs(&statement_bytes); + let witness = relation.shape.run(&inputs, &[]); + let stage2_root_digest = statement.digest(); + let expected_public = + relation_public(&fixed_statement_prefix, &stage2_root_digest); + if witness.public != expected_public { + bail!("Flock BLAKE3 gate output disagrees with native Stage 2 digest"); + } + + let rows = witness.rows::(relation.blake3_slot); + let canonical_rows = witness + .rows::(relation.canonical_goldilocks_slot); + relation.ensure_registry_order()?; + let blake3_r1cs = blake3::build_block_r1cs(BLAKE3_CAPACITY_LOG); + let blake3_lincheck = blake3_r1cs.csc_lincheck_circuit(); + let canonical_r1cs = build_canonical_pair_r1cs(BLAKE3_CAPACITY_LOG); + let canonical_lincheck = canonical_r1cs.csc_lincheck_circuit(); + let union = + UnionInstance::new(&relation.shape.registry, relation.shape.counts.clone()); + let pcs_params = pcs_params(&union); + let mut challenger = + FsChallenger::with_chained_blake3(STAGE3_TRANSCRIPT_DOMAIN); + let (proof, commitment, _) = prover::prove_fast_ligerito_union_circuit( + &union, + &relation.shape.circuit, + &witness.public, + &pcs_params, + vec![ + UnionSlotProverInput::new( + blake3::generate_witness_batch_major_partial(rows, BLAKE3_CAPACITY_LOG), + blake3_lincheck, + ), + UnionSlotProverInput::new( + generate_canonical_pair_witness(canonical_rows, BLAKE3_CAPACITY_LOG), + canonical_lincheck, + ), + ], + Vec::new(), + &mut challenger, + ); + let proof_bundle_bytes = + encode_proof_bundle(&CircuitProofBundle { commitment, proof })?; + if proof_bundle_bytes.len() > MAX_PROOF_BUNDLE_BYTES { + bail!("Flock proof bundle exceeds {MAX_PROOF_BUNDLE_BYTES} bytes"); + } + Ok(Stage3BindingArtifactV1 { + fixed_statement_prefix, + circuit_digest: relation.shape.circuit.digest(), + stage2_root_digest, + proof_bundle_bytes, + }) +} + +/// Verify the statement-hash circuit proof against the digest carried by its +/// strict artifact. Callers that expect a particular Stage 2 root must also +/// use [`verify_stage3_statement_binding_for`]. +pub fn verify_stage3_statement_binding( + artifact: &Stage3BindingArtifactV1, +) -> Result<()> { + let relation = + StatementHashRelation::build(&artifact.fixed_statement_prefix)?; + relation.ensure_registry_order()?; + if artifact.circuit_digest != relation.shape.circuit.digest() { + bail!("Flock statement-binding circuit digest mismatch"); + } + let bundle = decode_proof_bundle(&artifact.proof_bundle_bytes) + .context("decode Flock statement-binding proof bundle")?; + let public = relation_public( + &artifact.fixed_statement_prefix, + &artifact.stage2_root_digest, + ); + let union = + UnionInstance::new(&relation.shape.registry, relation.shape.counts.clone()); + let pcs_params = pcs_params(&union); + let blake3_r1cs = blake3::build_block_r1cs(BLAKE3_CAPACITY_LOG); + let blake3_lincheck = blake3_r1cs.csc_lincheck_circuit(); + let canonical_r1cs = build_canonical_pair_r1cs(BLAKE3_CAPACITY_LOG); + let canonical_lincheck = canonical_r1cs.csc_lincheck_circuit(); + let linchecks: [&dyn flock_prover::lincheck::LincheckCircuit; 2] = + [blake3_lincheck, canonical_lincheck]; + let mut challenger = + FsChallenger::with_chained_blake3(STAGE3_TRANSCRIPT_DOMAIN); + verifier::verify_ligerito_union_circuit( + &union, + &relation.shape.circuit, + &public, + &linchecks, + &bundle.commitment, + &bundle.proof, + &pcs_params, + &mut challenger, + ) + .map_err(|error| { + anyhow::anyhow!("Flock statement-binding proof rejected: {error:?}") + })?; + Ok(()) +} + +/// Verify and bind the proof to an expected canonical Stage 2 statement. +pub fn verify_stage3_statement_binding_for( + artifact: &Stage3BindingArtifactV1, + expected: &Stage2RootStatementV1, +) -> Result<()> { + if artifact.fixed_statement_prefix != statement_prefix(&expected.to_bytes()) { + bail!("Flock binding proof uses a different Stage 2 vk or FRI prefix"); + } + if artifact.stage2_root_digest != expected.digest() { + bail!("Flock binding proof targets a different Stage 2 root"); + } + verify_stage3_statement_binding(artifact) +} + +/// Content digest of this partial circuit. It is useful for diagnostics and +/// reproducibility, but is not the complete Stage 3 relation digest. +pub fn stage3_statement_binding_circuit_digest( + statement: &Stage2RootStatementV1, +) -> Result<[u8; 32]> { + let prefix = statement_prefix(&statement.to_bytes()); + Ok(StatementHashRelation::build(&prefix)?.shape.circuit.digest()) +} + +struct StatementHashRelation { + shape: CircuitShape, + blake3_slot: SlotId, + canonical_goldilocks_slot: SlotId, +} + +impl StatementHashRelation { + fn build(prefix: &[u8; STAGE2_FIXED_PREFIX_BYTES]) -> Result { + let mut builder = ShapeBuilder::new(BLAKE3_CAPACITY_LOG); + let blake3_slot = builder.slot(Blake3Gate { nu: BLAKE3_CAPACITY_LOG }); + let canonical_goldilocks_slot = + builder.slot(CanonicalGoldilocksPairGate { nu: BLAKE3_CAPACITY_LOG }); + let packed_iv = pack8(&IV); + let initial_cv = [ + builder.fixed_public_input(packed_iv[0]), + builder.fixed_public_input(packed_iv[1]), + ]; + let canonical_zero = builder.fixed_public_input(F128::ZERO); + let mut messages = Vec::<[Wire; 4]>::with_capacity(MESSAGE_BLOCKS); + let mut params = Vec::::with_capacity(MESSAGE_BLOCKS); + for block in 0..MESSAGE_BLOCKS { + let message: [_; 4] = std::array::from_fn(|word| { + let word = block * 4 + word; + match fixed_statement_word(prefix, word) { + Some(value) => builder.fixed_public_input(value), + None => builder.input(), + } + }); + messages.push(message); + params.push(builder.fixed_public_input(block_params(block))); + } + + for word in FIRST_CLAIM_WORD..FIRST_CLAIM_WORD + CLAIM_WORDS { + let message = messages[word / 4][word % 4]; + let violation = builder.gate(canonical_goldilocks_slot, &[message])[0]; + builder.connect(violation, canonical_zero); + } + + let mut cv = initial_cv; + for block in 0..MESSAGE_BLOCKS { + let message = messages[block]; + let outputs = builder.gate( + blake3_slot, + &[ + cv[0], + cv[1], + message[0], + message[1], + message[2], + message[3], + params[block], + ], + ); + cv = [outputs[0], outputs[1]]; + } + builder.publish(cv[0]); + builder.publish(cv[1]); + let shape = builder.finish().map_err(|error| { + anyhow::anyhow!("build Flock binding circuit: {error:?}") + })?; + Ok(Self { shape, blake3_slot, canonical_goldilocks_slot }) + } + + fn ensure_registry_order(&self) -> Result<()> { + if self.shape.registry_slot(self.blake3_slot) != 0 + || self.shape.registry_slot(self.canonical_goldilocks_slot) != 1 + { + bail!("unexpected Flock Boolean table registry order"); + } + Ok(()) + } +} + +pub(crate) struct Blake3Gate { + pub(crate) nu: usize, +} + +impl GateType for Blake3Gate { + type Row = blake3::Compression; + type Hint = (); + + fn table(&self) -> TableType { + TableType::from_block_r1cs(&blake3::build_block_r1cs(self.nu)) + .with_io_schema(blake3::io_schema()) + } + + fn eval( + &self, + inputs: &[F128], + _hint: &(), + outputs: &mut Vec, + ) -> Self::Row { + let cv = unpack8(inputs[0], inputs[1]); + let mut message = [0u32; 16]; + for index in 0..4 { + message[4 * index..4 * index + 4] + .copy_from_slice(&unpack4(inputs[2 + index])); + } + let (counter, block_len, flags) = unpack_params(inputs[6]); + let output = + blake3::blake3_compress(&cv, &message, counter, block_len, flags); + let output_lo: [u32; 8] = output[..8].try_into().unwrap(); + let output_hi: [u32; 8] = output[8..].try_into().unwrap(); + outputs.extend_from_slice(&[ + pack8(&output_lo)[0], + pack8(&output_lo)[1], + pack8(&output_hi)[0], + pack8(&output_hi)[1], + ]); + (cv, message, counter, block_len, flags) + } + + fn witness(&self, _rows: &[Self::Row], _nu: usize) -> SlotWitness { + SlotWitness::DeferredToRows + } +} + +fn relation_inputs(statement: &[u8]) -> Vec { + assert_eq!(statement.len(), STAGE2_ROOT_STATEMENT_BYTES); + let mut padded = [0u8; MESSAGE_BLOCKS * BLOCK_BYTES]; + padded[..statement.len()].copy_from_slice(statement); + let packed_iv = pack8(&IV); + let mut inputs = Vec::with_capacity(3 + MESSAGE_BLOCKS * 5); + inputs.extend_from_slice(&packed_iv); + inputs.push(F128::ZERO); + for block in 0..MESSAGE_BLOCKS { + let start = block * BLOCK_BYTES; + for word in 0..4 { + let offset = start + word * WORD_BYTES; + inputs.push(pack_bytes(&padded[offset..offset + WORD_BYTES])); + } + inputs.push(block_params(block)); + } + inputs +} + +fn relation_public( + prefix: &[u8; STAGE2_FIXED_PREFIX_BYTES], + digest: &[u8; 32], +) -> Vec { + let packed_iv = pack8(&IV); + let mut public = Vec::with_capacity(3 + 7 + MESSAGE_BLOCKS + 2); + public.extend_from_slice(&packed_iv); + public.push(F128::ZERO); + for block in 0..MESSAGE_BLOCKS { + for word in 0..4 { + if let Some(value) = fixed_statement_word(prefix, block * 4 + word) { + public.push(value); + } + } + public.push(block_params(block)); + } + public.push(pack_bytes(&digest[..16])); + public.push(pack_bytes(&digest[16..])); + public +} + +fn statement_prefix(statement: &[u8]) -> [u8; STAGE2_FIXED_PREFIX_BYTES] { + statement[..STAGE2_FIXED_PREFIX_BYTES].try_into().unwrap() +} + +fn fixed_statement_word( + prefix: &[u8; STAGE2_FIXED_PREFIX_BYTES], + word: usize, +) -> Option { + if word * WORD_BYTES < STAGE2_FIXED_PREFIX_BYTES { + let offset = word * WORD_BYTES; + Some(pack_bytes(&prefix[offset..offset + WORD_BYTES])) + } else if word * WORD_BYTES >= STAGE2_ROOT_STATEMENT_BYTES { + Some(F128::ZERO) + } else { + None + } +} + +fn block_params(block: usize) -> F128 { + let is_first = block == 0; + let is_last = block + 1 == MESSAGE_BLOCKS; + let mut flags = 0; + if is_first { + flags |= CHUNK_START; + } + if is_last { + flags |= CHUNK_END | ROOT; + } + let consumed = block * BLOCK_BYTES; + let remaining = STAGE2_ROOT_STATEMENT_BYTES - consumed; + let block_len = u32::try_from(remaining.min(BLOCK_BYTES)).unwrap(); + pack_params(0, block_len, flags) +} + +pub(crate) fn pcs_params(union: &UnionInstance<'_>) -> PcsParams { + let profile = FlockConfigV1.profile(); + let m = union.dense_m(); + let log_batch_size = embedded_initial_k_or_default(m, profile); + PcsParams { + m, + log_inv_rate: profile.log_inv_rate(), + log_batch_size, + profile, + num_lanes: union.commit_lanes(log_batch_size), + merkle_hash: FlockConfigV1.merkle_hash(), + } +} + +pub(crate) fn pack_bytes(bytes: &[u8]) -> F128 { + assert_eq!(bytes.len(), WORD_BYTES); + F128::new( + u64::from_le_bytes(bytes[..8].try_into().unwrap()), + u64::from_le_bytes(bytes[8..].try_into().unwrap()), + ) +} + +pub(crate) fn pack4(words: [u32; 4]) -> F128 { + F128::new( + words[0] as u64 | ((words[1] as u64) << 32), + words[2] as u64 | ((words[3] as u64) << 32), + ) +} + +pub(crate) fn unpack4(value: F128) -> [u32; 4] { + [ + value.lo as u32, + (value.lo >> 32) as u32, + value.hi as u32, + (value.hi >> 32) as u32, + ] +} + +pub(crate) fn pack8(words: &[u32; 8]) -> [F128; 2] { + [ + pack4([words[0], words[1], words[2], words[3]]), + pack4([words[4], words[5], words[6], words[7]]), + ] +} + +pub(crate) fn unpack8(first: F128, second: F128) -> [u32; 8] { + let first = unpack4(first); + let second = unpack4(second); + [ + first[0], first[1], first[2], first[3], second[0], second[1], second[2], + second[3], + ] +} + +pub(crate) fn pack_params(counter: u64, block_len: u32, flags: u32) -> F128 { + F128::new(counter, block_len as u64 | ((flags as u64) << 32)) +} + +fn unpack_params(value: F128) -> (u64, u32, u32) { + (value.lo, value.hi as u32, (value.hi >> 32) as u32) +} + +fn encode_proof_bundle(bundle: &CircuitProofBundle) -> Result> { + bincode::DefaultOptions::new() + .with_fixint_encoding() + .serialize(bundle) + .context("encode Flock statement-binding proof bundle") +} + +fn decode_proof_bundle(bytes: &[u8]) -> Result { + bincode::DefaultOptions::new() + .with_fixint_encoding() + .with_limit(MAX_PROOF_BUNDLE_BYTES as u64) + .reject_trailing_bytes() + .deserialize(bytes) + .context("invalid Flock statement-binding proof bundle") +} + +#[cfg(test)] +mod tests { + use super::*; + use ix_terminal::OUTER_CLAIM_ELEMENTS; + use multi_stark::types::FriParameters; + + fn statement() -> Stage2RootStatementV1 { + let claim: Vec = + (0..OUTER_CLAIM_ELEMENTS as u64).flat_map(u64::to_le_bytes).collect(); + Stage2RootStatementV1::new( + b"binding-test-vk", + &claim, + &FriParameters { + log_final_poly_len: 0, + max_log_arity: 1, + num_queries: 100, + commit_proof_of_work_bits: 0, + query_proof_of_work_bits: 20, + }, + ) + .unwrap() + } + + #[test] + fn circuit_hashes_the_exact_stage2_statement() { + let statement = statement(); + let statement_bytes = statement.to_bytes(); + let prefix = statement_prefix(&statement_bytes); + let relation = StatementHashRelation::build(&prefix).unwrap(); + let witness = relation.shape.run(&relation_inputs(&statement_bytes), &[]); + assert_eq!(witness.public, relation_public(&prefix, &statement.digest())); + assert_eq!(relation.shape.counts, vec![MESSAGE_BLOCKS, CLAIM_WORDS]); + assert_eq!(witness.rows::(relation.blake3_slot).len(), 4); + assert_eq!( + witness + .rows::(relation.canonical_goldilocks_slot) + .len(), + CLAIM_WORDS + ); + + let mut changed = statement.to_bytes(); + let last = changed.len() - 1; + changed[last] ^= 1; + let changed = relation.shape.run(&relation_inputs(&changed), &[]); + assert_ne!(changed.public, witness.public); + + let mut other_prefix = prefix; + other_prefix[8] ^= 1; + let other = StatementHashRelation::build(&other_prefix).unwrap(); + assert_ne!(other.shape.circuit.digest(), relation.shape.circuit.digest()); + } + + #[test] + fn artifact_parser_rejects_short_and_wrong_magic() { + assert!(Stage3BindingArtifactV1::from_bytes(&[]).is_err()); + let mut header = vec![0u8; ARTIFACT_HEADER_BYTES]; + header[..8].copy_from_slice(b"NOTFLOCK"); + assert!(Stage3BindingArtifactV1::from_bytes(&header).is_err()); + } + + #[test] + #[ignore = "large upstream Flock circuit proof; run explicitly"] + fn real_statement_binding_proof_round_trip_and_mutations() { + let statement = statement(); + let artifact = + prove_stage3_statement_binding(&statement).expect("prove binding"); + eprintln!( + "Flock statement-binding circuit proof bundle: {} bytes", + artifact.proof_bundle_bytes().len() + ); + verify_stage3_statement_binding_for(&artifact, &statement) + .expect("verify binding"); + + let encoded = artifact.to_bytes(); + let decoded = Stage3BindingArtifactV1::from_bytes(&encoded).unwrap(); + verify_stage3_statement_binding_for(&decoded, &statement) + .expect("verify decoded binding"); + + let mut wrong_prefix = decoded.clone(); + wrong_prefix.fixed_statement_prefix[8] ^= 1; + assert!( + verify_stage3_statement_binding_for(&wrong_prefix, &statement).is_err() + ); + + let mut wrong_root = decoded.clone(); + wrong_root.stage2_root_digest[0] ^= 1; + assert!(verify_stage3_statement_binding(&wrong_root).is_err()); + + let mut wrong_proof = decoded; + let flip_at = wrong_proof.proof_bundle_bytes.len() / 2; + wrong_proof.proof_bundle_bytes[flip_at] ^= 1; + assert!(verify_stage3_statement_binding(&wrong_proof).is_err()); + } +} diff --git a/flock-stage3/host/src/boolean.rs b/flock-stage3/host/src/boolean.rs new file mode 100644 index 000000000..45b6761f5 --- /dev/null +++ b/flock-stage3/host/src/boolean.rs @@ -0,0 +1,337 @@ +//! Small builder for custom block-diagonal Boolean R1CS tables. +//! +//! Flock fixes `C = I`, so every constraint row also names its output +//! variable. This builder allocates derived variables in dependency order, +//! records their `(linear A) * (linear B) = output` operations once, and uses +//! that same record for both the sparse matrices and native witness filling. + +use std::sync::OnceLock; + +use flock_prover::{ + field::F128, + lincheck::pack_z_lincheck, + r1cs::{BlockR1cs, SparseBinaryMatrix, WitnessLayout}, +}; + +#[derive(Clone, Debug)] +struct BooleanOperation { + output: usize, + a: Vec, + b: Vec, +} + +/// A finished Boolean table plan, independent of its outer row capacity. +#[derive(Clone, Debug)] +pub(crate) struct BooleanR1csPlan { + k_log: usize, + useful_bits: usize, + a_rows: Vec>, + b_rows: Vec>, + operations: Vec, + const_pin: Option, +} + +impl BooleanR1csPlan { + pub(crate) fn k_log(&self) -> usize { + self.k_log + } + + pub(crate) fn k(&self) -> usize { + 1usize << self.k_log + } + + #[cfg(test)] + pub(crate) fn useful_bits(&self) -> usize { + self.useful_bits + } + + pub(crate) fn block_r1cs(&self, nu: usize) -> BlockR1cs { + assert!(nu >= 3, "Flock lincheck requires at least eight rows"); + let k = self.k(); + BlockR1cs { + m: self.k_log + nu, + k_log: self.k_log, + k_skip: 6, + useful_bits: self.useful_bits, + a_0: sparse_matrix(k, self.a_rows.clone()), + b_0: sparse_matrix(k, self.b_rows.clone()), + c_0: sparse_matrix(k, (0..k).map(|row| vec![row]).collect()), + layout: WitnessLayout::BatchMajor, + const_pin: self.const_pin, + digest_cache: OnceLock::new(), + csc_cache: OnceLock::new(), + } + } + + /// Fill fixed/free columns, then derive every internal/output column from + /// the same operation list that created the R1CS matrices. + pub(crate) fn fill_row( + &self, + bits: &mut [bool], + fill_free: impl FnOnce(&mut [bool]), + ) { + assert_eq!(bits.len(), self.k()); + bits.fill(false); + if let Some(column) = self.const_pin { + bits[column] = true; + } + fill_free(bits); + for operation in &self.operations { + let a = parity(bits, &operation.a); + let b = parity(bits, &operation.b); + bits[operation.output] = a & b; + } + } +} + +/// Mutable construction half of [`BooleanR1csPlan`]. +pub(crate) struct BooleanR1csBuilder { + k_log: usize, + k: usize, + next_column: usize, + a_rows: Vec>, + b_rows: Vec>, + assigned: Vec, + operations: Vec, + const_pin: Option, +} + +impl BooleanR1csBuilder { + /// Reserve `[0, reserved_columns)` for word-aligned circuit I/O. + pub(crate) fn new(k_log: usize, reserved_columns: usize) -> Self { + assert!(k_log >= 7, "BatchMajor Boolean tables need k_log >= 7"); + let k = 1usize << k_log; + assert!(reserved_columns <= k); + Self { + k_log, + k, + next_column: reserved_columns, + a_rows: vec![Vec::new(); k], + b_rows: vec![Vec::new(); k], + assigned: vec![false; k], + operations: Vec::new(), + const_pin: None, + } + } + + /// Mark a supplied bit as free Boolean advice (`x * x = x`). + pub(crate) fn free_boolean_at(&mut self, column: usize) { + self.set_constraint(column, vec![column], vec![column], false); + } + + /// Require a supplied Boolean advice bit to be zero. + /// + /// With `one = 1`, the constraint `x * (x + one) = x` accepts `x = 0` + /// and rejects `x = 1`. This is useful for word-aligned gates whose logical + /// input occupies only one lane of an `F128` word. + pub(crate) fn assert_zero_at(&mut self, column: usize, one: usize) { + self.set_constraint(column, vec![column], vec![column, one], false); + } + + /// Allocate one supplied Boolean advice bit after the reserved I/O region. + pub(crate) fn alloc_free_boolean(&mut self) -> usize { + let column = self.alloc_column(); + self.free_boolean_at(column); + column + } + + /// Allocate the table's one constant-one column and bind it through + /// Flock's count-aware lincheck pin. + pub(crate) fn alloc_constant_one(&mut self) -> usize { + assert!(self.const_pin.is_none(), "constant-one column already allocated"); + let column = self.alloc_free_boolean(); + self.const_pin = Some(column); + column + } + + pub(crate) fn and(&mut self, lhs: usize, rhs: usize) -> usize { + self.alloc_gate(vec![lhs], vec![rhs]) + } + + /// Multiply two non-empty GF(2) linear forms. + /// + /// This is useful for compact full adders: `z * (x + y)` is one R1CS + /// constraint and does not need an intermediate column for `x + y`. + pub(crate) fn product_of_parities( + &mut self, + lhs: &[usize], + rhs: &[usize], + ) -> usize { + assert!(!lhs.is_empty()); + assert!(!rhs.is_empty()); + self.alloc_gate(lhs.to_vec(), rhs.to_vec()) + } + + /// Derive a pre-reserved output from two GF(2) linear forms. + pub(crate) fn write_product_of_parities( + &mut self, + output: usize, + lhs: &[usize], + rhs: &[usize], + ) { + assert!(!lhs.is_empty()); + assert!(!rhs.is_empty()); + self.set_constraint(output, lhs.to_vec(), rhs.to_vec(), true); + } + + /// XOR a non-empty set of bits using multiplication by the pinned one. + pub(crate) fn xor(&mut self, inputs: &[usize], one: usize) -> usize { + assert!(!inputs.is_empty()); + self.alloc_gate(inputs.to_vec(), vec![one]) + } + + /// Derive a pre-reserved output bit instead of allocating a new column. + pub(crate) fn write_xor( + &mut self, + output: usize, + inputs: &[usize], + one: usize, + ) { + assert!(!inputs.is_empty()); + self.set_constraint(output, inputs.to_vec(), vec![one], true); + } + + pub(crate) fn finish(self) -> BooleanR1csPlan { + BooleanR1csPlan { + k_log: self.k_log, + useful_bits: self.next_column, + a_rows: self.a_rows, + b_rows: self.b_rows, + operations: self.operations, + const_pin: self.const_pin, + } + } + + fn alloc_gate(&mut self, a: Vec, b: Vec) -> usize { + let output = self.alloc_column(); + self.set_constraint(output, a, b, true); + output + } + + fn alloc_column(&mut self) -> usize { + assert!(self.next_column < self.k, "Boolean R1CS table exceeded 2^k_log"); + let column = self.next_column; + self.next_column += 1; + column + } + + fn set_constraint( + &mut self, + output: usize, + a: Vec, + b: Vec, + derive: bool, + ) { + assert!(output < self.k); + assert!(!self.assigned[output], "Boolean column {output} assigned twice"); + assert!(a.iter().chain(&b).all(|&column| column < self.k)); + self.a_rows[output] = a.clone(); + self.b_rows[output] = b.clone(); + self.assigned[output] = true; + if derive { + self.operations.push(BooleanOperation { output, a, b }); + } + } +} + +/// Produce Flock's BatchMajor `(z, A z, B z, lincheck stripe)` tuple from a +/// row filler that supplies only the plan's free columns. +pub(crate) fn generate_boolean_witness( + plan: &BooleanR1csPlan, + rows: &[T], + nu: usize, + fill_free: impl Fn(&T, &mut [bool]), +) -> (Vec, Vec, Vec, Vec) { + let capacity = 1usize << nu; + assert!(rows.len() <= capacity); + let r1cs = plan.block_r1cs(nu); + let k = plan.k(); + let mut z = vec![false; r1cs.n()]; + for (outer, row) in rows.iter().enumerate() { + plan.fill_row(&mut z[outer * k..(outer + 1) * k], |bits| { + fill_free(row, bits) + }); + } + let a = r1cs.apply_a(&z); + let b = r1cs.apply_b(&z); + assert!( + a.iter() + .zip(&b) + .zip(&z) + .all(|((a_bit, b_bit), z_bit)| (*a_bit & *b_bit) == *z_bit), + "custom Boolean witness does not satisfy its R1CS" + ); + let stripe = pack_z_lincheck(&z, r1cs.m, r1cs.k_log); + ( + pack_batch_major(&z, plan.k_log(), nu), + pack_batch_major(&a, plan.k_log(), nu), + pack_batch_major(&b, plan.k_log(), nu), + stripe, + ) +} + +pub(crate) fn write_f128(bits: &mut [bool], offset: usize, value: F128) { + assert!(offset + 128 <= bits.len()); + for local in 0..64 { + bits[offset + local] = (value.lo >> local) & 1 == 1; + bits[offset + 64 + local] = (value.hi >> local) & 1 == 1; + } +} + +fn parity(bits: &[bool], columns: &[usize]) -> bool { + columns.iter().fold(false, |value, &column| value ^ bits[column]) +} + +fn sparse_matrix(k: usize, rows: Vec>) -> SparseBinaryMatrix { + SparseBinaryMatrix { num_rows: k, num_cols: k, rows } +} + +fn pack_batch_major(bits: &[bool], k_log: usize, nu: usize) -> Vec { + let capacity = 1usize << nu; + let k = 1usize << k_log; + assert_eq!(bits.len(), capacity * k); + let chunks = k / 128; + let mut packed = vec![F128::ZERO; chunks * capacity]; + for chunk in 0..chunks { + for outer in 0..capacity { + let start = outer * k + chunk * 128; + let mut lo = 0u64; + let mut hi = 0u64; + for local in 0..64 { + lo |= u64::from(bits[start + local]) << local; + hi |= u64::from(bits[start + 64 + local]) << local; + } + packed[(chunk << nu) + outer] = F128::new(lo, hi); + } + } + packed +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn one_description_builds_matrices_and_witness() { + let mut builder = BooleanR1csBuilder::new(7, 3); + builder.free_boolean_at(0); + builder.free_boolean_at(1); + let one = builder.alloc_constant_one(); + let product = builder.and(0, 1); + builder.write_xor(2, &[product, 0], one); + let plan = builder.finish(); + let r1cs = plan.block_r1cs(3); + + for (x, y) in [(false, false), (false, true), (true, false), (true, true)] { + let mut row = vec![false; plan.k()]; + plan.fill_row(&mut row, |bits| { + bits[0] = x; + bits[1] = y; + }); + assert_eq!(row[2], (x & y) ^ x); + let mut witness = vec![false; r1cs.n()]; + witness[..plan.k()].copy_from_slice(&row); + assert!(r1cs.satisfies(&witness)); + } + } +} diff --git a/flock-stage3/host/src/config.rs b/flock-stage3/host/src/config.rs new file mode 100644 index 000000000..6c9377c4a --- /dev/null +++ b/flock-stage3/host/src/config.rs @@ -0,0 +1,121 @@ +use flock_prover::{ + hash::HashKind, pcs::ligerito::LigeritoProfile, + r1cs_hashes::blake3::Blake3Setup, +}; + +pub const FLOCK_UPSTREAM_REVISION: &str = + "b310f35f35f68095537150a1c8c0a43caca9a29e"; +pub const STAGE3_TRANSCRIPT_DOMAIN: &[u8] = b"ix:flock-stage3:fri-verifier:v1"; +pub const ENGINE_CONFORMANCE_TRANSCRIPT_DOMAIN: &[u8] = + b"ix:flock-stage3:blake3-engine-conformance:v1"; +pub const ARITHMETIC_CONFORMANCE_TRANSCRIPT_DOMAIN: &[u8] = + b"ix:flock-stage3:goldilocks-arithmetic-conformance:v1"; +pub const MERKLE_CONFORMANCE_TRANSCRIPT_DOMAIN: &[u8] = + b"ix:flock-stage3:blake3-merkle-conformance:v1"; +pub const FRI_FOLD_CONFORMANCE_TRANSCRIPT_DOMAIN: &[u8] = + b"ix:flock-stage3:authenticated-fri-fold-conformance:v1"; +pub const FRI_QUERY_CONFORMANCE_TRANSCRIPT_DOMAIN: &[u8] = + b"ix:flock-stage3:fri-commit-phase-query-conformance:v1"; +pub const PCS_REDUCTION_CONFORMANCE_TRANSCRIPT_DOMAIN: &[u8] = + b"ix:flock-stage3:pcs-reduced-opening-conformance:v1"; +pub const STAGE2_TRANSCRIPT_CONFORMANCE_TRANSCRIPT_DOMAIN: &[u8] = + b"ix:flock-stage3:stage2-transcript-conformance:v1"; +pub const TRANSCRIPT_BOUND_PCS_CONFORMANCE_TRANSCRIPT_DOMAIN: &[u8] = + b"ix:flock-stage3:transcript-bound-pcs-conformance:v1"; +pub const TRANSCRIPT_BOUND_FRI_CONFORMANCE_TRANSCRIPT_DOMAIN: &[u8] = + b"ix:flock-stage3:transcript-bound-fri-query-conformance:v1"; +pub const TRANSCRIPT_BOUND_FRI_QUERIES_CONFORMANCE_TRANSCRIPT_DOMAIN: &[u8] = + b"ix:flock-stage3:transcript-bound-fri-all-queries-conformance:v1"; +pub const TRANSCRIPT_BOUND_PCS_FRI_QUERIES_CONFORMANCE_TRANSCRIPT_DOMAIN: + &[u8] = + b"ix:flock-stage3:transcript-bound-pcs-fri-all-queries-conformance:v1"; +pub const STAGE2_AIR_PCS_FRI_CONFORMANCE_TRANSCRIPT_DOMAIN: &[u8] = + b"ix:flock-stage3:stage2-air-pcs-fri-conformance:v1"; + +const CONFIG_DOMAIN: &[u8; 8] = b"IXFLKCF1"; +const FIELD_F128: u8 = 1; +const PROFILE_FAST128: u8 = 1; +const MERKLE_BLAKE3: u8 = 1; +const TRANSCRIPT_CHAINED_BLAKE3: u8 = 1; + +/// The only Flock protocol configuration accepted by this backend version. +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub struct FlockConfigV1; + +impl FlockConfigV1 { + /// Canonical bytes committed by every Stage 3 statement: + /// `IXFLKCF1 || len(rev) u16 LE || rev || field || profile || merkle || + /// transcript || len(domain) u16 LE || domain`. + /// + /// The four one-byte IDs are respectively F128=1, Fast128=1, BLAKE3=1, + /// and chained-BLAKE3=1. New choices require a new configuration version. + pub fn to_bytes(self) -> Vec { + let revision = FLOCK_UPSTREAM_REVISION.as_bytes(); + let domain = STAGE3_TRANSCRIPT_DOMAIN; + let mut bytes = + Vec::with_capacity(8 + 2 + revision.len() + 4 + 2 + domain.len()); + bytes.extend_from_slice(CONFIG_DOMAIN); + bytes.extend_from_slice( + &u16::try_from(revision.len()).expect("revision length").to_le_bytes(), + ); + bytes.extend_from_slice(revision); + bytes.extend_from_slice(&[ + FIELD_F128, + PROFILE_FAST128, + MERKLE_BLAKE3, + TRANSCRIPT_CHAINED_BLAKE3, + ]); + bytes.extend_from_slice( + &u16::try_from(domain.len()).expect("domain length").to_le_bytes(), + ); + bytes.extend_from_slice(domain); + bytes + } + + pub fn digest(self) -> [u8; 32] { + *blake3::hash(&self.to_bytes()).as_bytes() + } + + pub const fn profile(self) -> LigeritoProfile { + LigeritoProfile::Fast128 + } + + pub const fn merkle_hash(self) -> HashKind { + HashKind::Blake3 + } + + /// Construct the pinned Flock BLAKE3 relation used by the engine smoke test. + /// The production Stage 2-verifier relation will reuse these PCS parameters. + pub(crate) fn blake3_setup(self, n_blocks: usize) -> Blake3Setup { + let mut setup = Blake3Setup::with_profile(n_blocks, self.profile()); + setup.pcs_params.merkle_hash = self.merkle_hash(); + setup + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn config_is_explicit_and_domain_separated() { + let bytes = FlockConfigV1.to_bytes(); + assert_eq!(&bytes[..8], CONFIG_DOMAIN); + assert!( + bytes + .windows(FLOCK_UPSTREAM_REVISION.len()) + .any(|window| window == FLOCK_UPSTREAM_REVISION.as_bytes()) + ); + assert!( + bytes + .windows(STAGE3_TRANSCRIPT_DOMAIN.len()) + .any(|window| window == STAGE3_TRANSCRIPT_DOMAIN) + ); + assert_eq!(FlockConfigV1.profile(), LigeritoProfile::Fast128); + assert_eq!(FlockConfigV1.merkle_hash(), HashKind::Blake3); + assert_eq!( + blake3::Hash::from_bytes(FlockConfigV1.digest()).to_hex().as_str(), + "1897ad7e36bc1a11a9dc4170552b1b48f5689b8f04ecc3c3825ce0273ecfaffc" + ); + } +} diff --git a/flock-stage3/host/src/conformance.rs b/flock-stage3/host/src/conformance.rs new file mode 100644 index 000000000..fc42d89f4 --- /dev/null +++ b/flock-stage3/host/src/conformance.rs @@ -0,0 +1,186 @@ +//! A real Flock/BLAKE3 round trip used to lock the upstream engine API. +//! +//! This is intentionally not exposed as a Stage 3 proof: the standalone +//! upstream BLAKE3 batch relation has existential (unbound) I/O. + +use anyhow::{Context, Result, bail}; +use flock_prover::{ + challenger::FsChallenger, proof_io::R1csProofBundleLigerito, + r1cs_hashes::blake3::Compression, +}; + +use crate::config::{ENGINE_CONFORMANCE_TRANSCRIPT_DOMAIN, FlockConfigV1}; + +const MAGIC: &[u8; 8] = b"IXFLKB3C"; +const VERSION: u16 = 1; +const HEADER_BYTES: usize = 8 + 2 + 32 + 4 + 8; +const MIN_BLOCKS: usize = 256; +const MAX_BLOCKS: usize = 1 << 20; +const MAX_BUNDLE_BYTES: usize = 64 * 1024 * 1024; + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct EngineConformanceArtifact { + n_blocks: usize, + bundle_bytes: Vec, +} + +impl EngineConformanceArtifact { + pub fn to_bytes(&self) -> Vec { + let mut bytes = Vec::with_capacity(HEADER_BYTES + self.bundle_bytes.len()); + bytes.extend_from_slice(MAGIC); + bytes.extend_from_slice(&VERSION.to_le_bytes()); + bytes.extend_from_slice(&FlockConfigV1.digest()); + bytes.extend_from_slice( + &u32::try_from(self.n_blocks).expect("block count").to_le_bytes(), + ); + bytes.extend_from_slice( + &u64::try_from(self.bundle_bytes.len()) + .expect("bundle length") + .to_le_bytes(), + ); + bytes.extend_from_slice(&self.bundle_bytes); + bytes + } + + pub fn from_bytes(bytes: &[u8]) -> Result { + if bytes.len() < HEADER_BYTES { + bail!("truncated Flock conformance artifact"); + } + if &bytes[..8] != MAGIC { + bail!("invalid Flock conformance artifact magic"); + } + let version = u16::from_le_bytes(bytes[8..10].try_into().unwrap()); + if version != VERSION { + bail!("unsupported Flock conformance artifact version {version}"); + } + if bytes[10..42] != FlockConfigV1.digest() { + bail!("Flock conformance artifact configuration mismatch"); + } + let n_blocks = + usize::try_from(u32::from_le_bytes(bytes[42..46].try_into().unwrap())) + .expect("u32 fits usize"); + validate_n_blocks(n_blocks)?; + let bundle_len = + usize::try_from(u64::from_le_bytes(bytes[46..54].try_into().unwrap())) + .map_err(|_| { + anyhow::anyhow!("Flock bundle length does not fit usize") + })?; + if bundle_len == 0 || bundle_len > MAX_BUNDLE_BYTES { + bail!("invalid Flock bundle length {bundle_len}"); + } + let expected_len = HEADER_BYTES + .checked_add(bundle_len) + .ok_or_else(|| anyhow::anyhow!("Flock artifact length overflow"))?; + if bytes.len() != expected_len { + bail!( + "Flock conformance artifact is {} bytes; header declares {expected_len}", + bytes.len() + ); + } + Ok(Self { n_blocks, bundle_bytes: bytes[HEADER_BYTES..].to_vec() }) + } + + pub fn n_blocks(&self) -> usize { + self.n_blocks + } + + pub fn bundle_bytes(&self) -> &[u8] { + &self.bundle_bytes + } +} + +/// Prove an existential batch of valid BLAKE3 compression rows using the +/// exact hash/profile choices intended for Stage 3. +pub fn prove_engine_conformance( + blocks: &[Compression], +) -> Result { + validate_n_blocks(blocks.len())?; + let setup = FlockConfigV1.blake3_setup(blocks.len()); + let mut challenger = + FsChallenger::with_chained_blake3(ENGINE_CONFORMANCE_TRANSCRIPT_DOMAIN); + let (proof, commitment, _) = setup.prove_fast(blocks, &mut challenger); + let bundle = R1csProofBundleLigerito { commitment, proof }; + let bundle_bytes = bundle.to_bytes(); + if bundle_bytes.len() > MAX_BUNDLE_BYTES { + bail!("Flock proof bundle exceeds {MAX_BUNDLE_BYTES} bytes"); + } + Ok(EngineConformanceArtifact { n_blocks: blocks.len(), bundle_bytes }) +} + +pub fn verify_engine_conformance( + artifact: &EngineConformanceArtifact, +) -> Result<()> { + validate_n_blocks(artifact.n_blocks)?; + let bundle = R1csProofBundleLigerito::from_bytes(&artifact.bundle_bytes) + .context("decode Flock proof bundle")?; + let setup = FlockConfigV1.blake3_setup(artifact.n_blocks); + let mut challenger = + FsChallenger::with_chained_blake3(ENGINE_CONFORMANCE_TRANSCRIPT_DOMAIN); + setup.verify(&bundle.commitment, &bundle.proof, &mut challenger).map_err( + |error| anyhow::anyhow!("Flock engine proof rejected: {error:?}"), + )?; + Ok(()) +} + +fn validate_n_blocks(n_blocks: usize) -> Result<()> { + if !(MIN_BLOCKS..=MAX_BLOCKS).contains(&n_blocks) { + bail!( + "Flock conformance batch has {n_blocks} blocks; expected {MIN_BLOCKS}..={MAX_BLOCKS}" + ); + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn envelope_is_strict_and_configuration_bound() { + let artifact = EngineConformanceArtifact { + n_blocks: MIN_BLOCKS, + bundle_bytes: vec![1, 2, 3], + }; + let bytes = artifact.to_bytes(); + assert_eq!( + EngineConformanceArtifact::from_bytes(&bytes).unwrap(), + artifact + ); + + let mut extended = bytes.clone(); + extended.push(0); + assert!(EngineConformanceArtifact::from_bytes(&extended).is_err()); + + let mut wrong_config = bytes; + wrong_config[10] ^= 1; + assert!(EngineConformanceArtifact::from_bytes(&wrong_config).is_err()); + } + + #[test] + #[ignore = "large upstream Flock proof; run explicitly for revision conformance"] + fn real_fast128_blake3_round_trip() { + let blocks: Vec = (0..MIN_BLOCKS) + .map(|index| { + let mut message = [0u32; 16]; + message[0] = u32::try_from(index).unwrap(); + ([0u32; 8], message, index as u64, 64, 0) + }) + .collect(); + let artifact = prove_engine_conformance(&blocks).expect("prove"); + eprintln!( + "Flock Fast128/BLAKE3 conformance bundle: {} bytes", + artifact.bundle_bytes().len() + ); + let encoded = artifact.to_bytes(); + let decoded = EngineConformanceArtifact::from_bytes(&encoded).unwrap(); + verify_engine_conformance(&decoded).expect("verify"); + + let mut mutated = decoded; + let flip_at = mutated.bundle_bytes.len() / 2; + mutated.bundle_bytes[flip_at] ^= 1; + assert!( + verify_engine_conformance(&mutated).is_err(), + "mutated Flock proof must be rejected" + ); + } +} diff --git a/flock-stage3/host/src/equality.rs b/flock-stage3/host/src/equality.rs new file mode 100644 index 000000000..60f80e13e --- /dev/null +++ b/flock-stage3/host/src/equality.rs @@ -0,0 +1,119 @@ +//! A directed equality assertion for two `F128` wires. +//! +//! Flock wire connections merge producer classes, so connecting two values +//! that were independently computed can create a cyclic circuit graph. This +//! gate keeps the graph directed: it emits their bitwise XOR, which callers +//! pin to the fixed zero wire. + +use flock_prover::{ + circuit::builder::{GateType, SlotWitness}, + field::F128, + r1cs::BlockR1cs, + schedule::{IoWord, TableType}, +}; + +use crate::boolean::{ + BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, write_f128, +}; + +const K_LOG: usize = 9; +const LEFT_BASE: usize = 0; +const RIGHT_BASE: usize = 128; +const RESIDUAL_BASE: usize = 256; +const COLUMNS: usize = 384; + +#[derive(Clone, Copy, Debug)] +pub(crate) struct F128EqualityGate { + pub(crate) nu: usize, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub(crate) struct F128EqualityRow { + left: F128, + right: F128, +} + +impl GateType for F128EqualityGate { + type Row = F128EqualityRow; + type Hint = (); + + fn table(&self) -> TableType { + TableType::from_block_r1cs(&build_f128_equality_r1cs(self.nu)) + .with_io_schema(vec![ + IoWord::input(0), + IoWord::input(1), + IoWord::output(2), + ]) + } + + fn eval( + &self, + inputs: &[F128], + _hint: &(), + outputs: &mut Vec, + ) -> Self::Row { + let left = inputs[0]; + let right = inputs[1]; + outputs.push(F128::new(left.lo ^ right.lo, left.hi ^ right.hi)); + F128EqualityRow { left, right } + } + + fn witness(&self, _rows: &[Self::Row], _nu: usize) -> SlotWitness { + SlotWitness::DeferredToRows + } +} + +pub(crate) fn build_f128_equality_r1cs(nu: usize) -> BlockR1cs { + build_plan().block_r1cs(nu) +} + +pub(crate) fn generate_f128_equality_witness( + rows: &[F128EqualityRow], + nu: usize, +) -> (Vec, Vec, Vec, Vec) { + let plan = build_plan(); + generate_boolean_witness(&plan, rows, nu, |row, bits| { + write_f128(bits, LEFT_BASE, row.left); + write_f128(bits, RIGHT_BASE, row.right); + }) +} + +fn build_plan() -> BooleanR1csPlan { + let mut builder = BooleanR1csBuilder::new(K_LOG, COLUMNS); + for column in LEFT_BASE..RIGHT_BASE + 128 { + builder.free_boolean_at(column); + } + let one = builder.alloc_constant_one(); + for bit in 0..128 { + builder.write_xor( + RESIDUAL_BASE + bit, + &[LEFT_BASE + bit, RIGHT_BASE + bit], + one, + ); + } + builder.finish() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn equality_r1cs_rejects_nonzero_residual() { + let plan = build_plan(); + let r1cs = plan.block_r1cs(3); + let left = F128::new(0x1234, 0x5678); + let mut logical = vec![false; plan.k()]; + plan.fill_row(&mut logical, |bits| { + write_f128(bits, LEFT_BASE, left); + write_f128(bits, RIGHT_BASE, left); + }); + let mut witness = vec![false; r1cs.n()]; + witness[..plan.k()].copy_from_slice(&logical); + assert!(r1cs.satisfies(&witness)); + + let mut wrong = witness; + wrong[RIGHT_BASE + 7] ^= true; + assert!(!r1cs.satisfies(&wrong)); + } +} diff --git a/flock-stage3/host/src/extension.rs b/flock-stage3/host/src/extension.rs new file mode 100644 index 000000000..450ca1117 --- /dev/null +++ b/flock-stage3/host/src/extension.rs @@ -0,0 +1,330 @@ +//! Degree-two Goldilocks extension arithmetic lowered to reusable base gates. +//! +//! Extension elements are packed as `F128::new(c0, c1)` and use +//! `X^2 = 7`, matching Plonky3's Goldilocks binomial extension. The lowering +//! deliberately composes the already checked base-field addition and +//! multiplication relations rather than introducing another large monolithic +//! arithmetic table. + +use flock_prover::{ + circuit::builder::{GateType, ShapeBuilder, SlotId, SlotWitness, Wire}, + field::F128, + r1cs::BlockR1cs, + schedule::{IoWord, TableType}, +}; + +use crate::{ + boolean::{ + BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, write_f128, + }, + goldilocks::{CanonicalGoldilocksPairGate, GoldilocksAddPairGate}, + multiplication::{GoldilocksMulPairGate, goldilocks_mul}, +}; + +const REPACK_K_LOG: usize = 10; +const FIRST_BASE: usize = 0; +const SECOND_BASE: usize = 128; +const DUPLICATE_LOW_BASE: usize = 256; +const DUPLICATE_HIGH_BASE: usize = 384; +const SWAP_BASE: usize = 512; +const SELECT_BASE: usize = 640; +const REPACK_COLUMNS: usize = 768; + +/// Fixed lane transforms used by the degree-two extension lowering. +/// +/// For `first = [a,b]` and `second = [c,d]`, the outputs are +/// `[a,a]`, `[b,b]`, `[b,a]`, and `[a,d]`. +#[derive(Clone, Copy, Debug)] +pub(crate) struct GoldilocksLaneRepackGate { + pub(crate) nu: usize, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub(crate) struct GoldilocksLaneRepackRow { + first: F128, + second: F128, +} + +impl GateType for GoldilocksLaneRepackGate { + type Row = GoldilocksLaneRepackRow; + type Hint = (); + + fn table(&self) -> TableType { + TableType::from_block_r1cs(&build_lane_repack_r1cs(self.nu)).with_io_schema( + vec![ + IoWord::input(0), + IoWord::input(1), + IoWord::output(2), + IoWord::output(3), + IoWord::output(4), + IoWord::output(5), + ], + ) + } + + fn eval( + &self, + inputs: &[F128], + _hint: &(), + outputs: &mut Vec, + ) -> Self::Row { + let first = inputs[0]; + let second = inputs[1]; + outputs.extend_from_slice(&[ + F128::new(first.lo, first.lo), + F128::new(first.hi, first.hi), + F128::new(first.hi, first.lo), + F128::new(first.lo, second.hi), + ]); + GoldilocksLaneRepackRow { first, second } + } + + fn witness(&self, _rows: &[Self::Row], _nu: usize) -> SlotWitness { + SlotWitness::DeferredToRows + } +} + +pub(crate) fn build_lane_repack_r1cs(nu: usize) -> BlockR1cs { + build_lane_repack_plan().block_r1cs(nu) +} + +pub(crate) fn generate_lane_repack_witness( + rows: &[GoldilocksLaneRepackRow], + nu: usize, +) -> (Vec, Vec, Vec, Vec) { + let plan = build_lane_repack_plan(); + generate_boolean_witness(&plan, rows, nu, |row, bits| { + write_f128(bits, FIRST_BASE, row.first); + write_f128(bits, SECOND_BASE, row.second); + }) +} + +fn build_lane_repack_plan() -> BooleanR1csPlan { + let mut builder = BooleanR1csBuilder::new(REPACK_K_LOG, REPACK_COLUMNS); + for column in FIRST_BASE..SECOND_BASE + 128 { + builder.free_boolean_at(column); + } + for bit in 0..64 { + let first_low = FIRST_BASE + bit; + let first_high = FIRST_BASE + 64 + bit; + let second_high = SECOND_BASE + 64 + bit; + for output in [DUPLICATE_LOW_BASE + bit, DUPLICATE_LOW_BASE + 64 + bit] { + builder.write_product_of_parities(output, &[first_low], &[first_low]); + } + for output in [DUPLICATE_HIGH_BASE + bit, DUPLICATE_HIGH_BASE + 64 + bit] { + builder.write_product_of_parities(output, &[first_high], &[first_high]); + } + builder.write_product_of_parities( + SWAP_BASE + bit, + &[first_high], + &[first_high], + ); + builder.write_product_of_parities( + SWAP_BASE + 64 + bit, + &[first_low], + &[first_low], + ); + builder.write_product_of_parities( + SELECT_BASE + bit, + &[first_low], + &[first_low], + ); + builder.write_product_of_parities( + SELECT_BASE + 64 + bit, + &[second_high], + &[second_high], + ); + } + builder.finish() +} + +/// The four table slots and fixed zero wire needed by Goldilocks arithmetic. +pub(crate) struct GoldilocksCircuitSlots { + pub(crate) add: SlotId, + pub(crate) mul: SlotId, + pub(crate) canonical: SlotId, + pub(crate) repack: SlotId, + zero: Wire, +} + +impl GoldilocksCircuitSlots { + pub(crate) fn declare(builder: &mut ShapeBuilder, nu: usize) -> Self { + let add = builder.slot(GoldilocksAddPairGate { nu }); + let mul = builder.slot(GoldilocksMulPairGate { nu }); + let canonical = builder.slot(CanonicalGoldilocksPairGate { nu }); + let repack = builder.slot(GoldilocksLaneRepackGate { nu }); + let zero = builder.fixed_public_input(F128::ZERO); + Self { add, mul, canonical, repack, zero } + } + + pub(crate) fn assert_canonical( + &self, + builder: &mut ShapeBuilder, + value: Wire, + ) { + let violation = builder.gate(self.canonical, &[value])[0]; + builder.connect(violation, self.zero); + } + + pub(crate) fn add( + &self, + builder: &mut ShapeBuilder, + left: Wire, + right: Wire, + ) -> Wire { + let outputs = builder.gate(self.add, &[left, right]); + for &residual in &outputs[1..] { + builder.connect(residual, self.zero); + } + self.assert_canonical(builder, outputs[0]); + outputs[0] + } + + pub(crate) fn mul( + &self, + builder: &mut ShapeBuilder, + left: Wire, + right: Wire, + ) -> Wire { + let outputs = builder.gate(self.mul, &[left, right]); + for &residual in &outputs[1..] { + builder.connect(residual, self.zero); + } + self.assert_canonical(builder, outputs[0]); + outputs[0] + } + + /// Multiply two packed extension values in `Goldilocks[X]/(X^2 - 7)`. + pub(crate) fn ext2_mul( + &self, + builder: &mut ShapeBuilder, + left: Wire, + right: Wire, + ) -> Wire { + self.assert_canonical(builder, left); + self.assert_canonical(builder, right); + + let left_lanes = builder.gate(self.repack, &[left, self.zero]); + let products_low = self.mul(builder, left_lanes[0], right); + let products_high = self.mul(builder, left_lanes[1], right); + + let high_repacked = builder.gate(self.repack, &[products_high, self.zero]); + let reversed_high = high_repacked[2]; + let twice = self.add(builder, reversed_high, reversed_high); + let four_times = self.add(builder, twice, twice); + let six_times = self.add(builder, four_times, twice); + let seven_times = self.add(builder, six_times, reversed_high); + let selected = builder.gate(self.repack, &[seven_times, reversed_high])[3]; + self.add(builder, products_low, selected) + } + + /// Embed the low `u64` lane as the constant-coordinate element `[lo, 0]`. + pub(crate) fn embed_low_lane( + &self, + builder: &mut ShapeBuilder, + value: Wire, + ) -> Wire { + builder.gate(self.repack, &[value, self.zero])[3] + } + + /// Split `[c0, c1]` into the two base-coordinate embeddings `[c0, 0]` + /// and `[c1, 0]` used by the coordinate-expanded AIR constraints. + pub(crate) fn ext2_coordinates( + &self, + builder: &mut ShapeBuilder, + value: Wire, + ) -> [Wire; 2] { + let lanes = builder.gate(self.repack, &[value, self.zero]); + let low = lanes[3]; + let high_first = lanes[2]; + let high = builder.gate(self.repack, &[high_first, self.zero])[3]; + [low, high] + } +} + +pub(crate) fn goldilocks_ext2_mul(left: F128, right: F128) -> F128 { + F128::new( + crate::goldilocks::goldilocks_add( + goldilocks_mul(left.lo, right.lo), + goldilocks_mul(7, goldilocks_mul(left.hi, right.hi)), + ), + crate::goldilocks::goldilocks_add( + goldilocks_mul(left.lo, right.hi), + goldilocks_mul(left.hi, right.lo), + ), + ) +} + +#[cfg(test)] +mod tests { + use multi_stark::{ + p3_field::{ + BasedVectorSpace, PrimeCharacteristicRing, PrimeField64, + extension::BinomialExtensionField, + }, + p3_goldilocks::Goldilocks, + }; + + use super::*; + use crate::goldilocks::GOLDILOCKS_MODULUS; + + #[test] + fn native_ext2_mul_matches_plonky3() { + let cases = [ + ([0, 0], [0, 0]), + ([1, 0], [0, 1]), + ([GOLDILOCKS_MODULUS - 1, 17], [23, GOLDILOCKS_MODULUS - 2]), + ([0x1234_5678_9abc_def0, 0xfedc_ba98_7654_3210], [7, 11]), + ]; + for (left, right) in cases { + let reference = BinomialExtensionField::::new([ + Goldilocks::from_u64(left[0]), + Goldilocks::from_u64(left[1]), + ]) * BinomialExtensionField::::new([ + Goldilocks::from_u64(right[0]), + Goldilocks::from_u64(right[1]), + ]); + let reference: &[Goldilocks] = reference.as_basis_coefficients_slice(); + let actual = goldilocks_ext2_mul( + F128::new(left[0], left[1]), + F128::new(right[0], right[1]), + ); + assert_eq!(actual.lo, reference[0].as_canonical_u64()); + assert_eq!(actual.hi, reference[1].as_canonical_u64()); + } + } + + #[test] + fn lane_repack_r1cs_matches_gate_semantics() { + let row = GoldilocksLaneRepackRow { + first: F128::new(0x0123_4567_89ab_cdef, 0xfedc_ba98_7654_3210), + second: F128::new(9, 0x55aa_aa55_1234_5678), + }; + let plan = build_lane_repack_plan(); + let r1cs = plan.block_r1cs(3); + let mut logical = vec![false; plan.k()]; + plan.fill_row(&mut logical, |bits| { + write_f128(bits, FIRST_BASE, row.first); + write_f128(bits, SECOND_BASE, row.second); + }); + let mut witness = vec![false; r1cs.n()]; + witness[..plan.k()].copy_from_slice(&logical); + assert!(r1cs.satisfies(&witness)); + + let outputs = [ + F128::new(row.first.lo, row.first.lo), + F128::new(row.first.hi, row.first.hi), + F128::new(row.first.hi, row.first.lo), + F128::new(row.first.lo, row.second.hi), + ]; + for (index, output) in outputs.into_iter().enumerate() { + let mut encoded = vec![false; 128]; + write_f128(&mut encoded, 0, output); + assert_eq!( + &logical[DUPLICATE_LOW_BASE + index * 128 + ..DUPLICATE_LOW_BASE + (index + 1) * 128], + encoded + ); + } + } +} diff --git a/flock-stage3/host/src/fri.rs b/flock-stage3/host/src/fri.rs new file mode 100644 index 000000000..b09715359 --- /dev/null +++ b/flock-stage3/host/src/fri.rs @@ -0,0 +1,6525 @@ +//! One authenticated binary FRI fold lowered into the Flock relation. +//! +//! This is the first conformance artifact that composes proof semantics rather +//! than testing an isolated primitive. It reconstructs the ordered evaluation +//! pair from the query-index bit, hashes the four Goldilocks coordinates with +//! Plonky3's serialized BLAKE3 leaf convention, authenticates the leaf, derives +//! the bit-reversed subgroup point, and constrains the binary fold. +//! +//! Division is deliberately absent from the circuit. The usual equation +//! +//! `f = (e0 + e1)/2 + beta * (e0 - e1)/(2s)` +//! +//! is constrained in the equivalent denominator-free form +//! +//! `2s*f + beta*e1 = s*(e0 + e1) + beta*e0`. + +use ::blake3 as native_blake3; +use aiur::vk_codec::AiurVerifyingKey; +use anyhow::{Context, Result, bail}; +use bincode::Options; +use flock_prover::{ + challenger::FsChallenger, + circuit::builder::{CircuitShape, ShapeBuilder, SlotId, Wire}, + field::F128, + lincheck::LincheckCircuit, + pcs::Commitment, + proof::R1csProofCircuitMerged, + prover::{self, UnionSlotProverInput}, + r1cs_hashes::blake3 as flock_blake3, + union::UnionInstance, + verifier, +}; +use ix_terminal::{ + Stage2RootStatementV1, ValidatedStage2RootV1, fri_parameter_words, +}; +use multi_stark::{ + p3_field::{BasedVectorSpace, PrimeCharacteristicRing, PrimeField64}, + types::{ExtVal, FriParameters, Val}, +}; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; + +use crate::{ + FRI_FOLD_CONFORMANCE_TRANSCRIPT_DOMAIN, + FRI_QUERY_CONFORMANCE_TRANSCRIPT_DOMAIN, FlockConfigV1, + PCS_REDUCTION_CONFORMANCE_TRANSCRIPT_DOMAIN, + STAGE2_AIR_PCS_FRI_CONFORMANCE_TRANSCRIPT_DOMAIN, Stage3TypedProofWitnessV1, + TRANSCRIPT_BOUND_FRI_CONFORMANCE_TRANSCRIPT_DOMAIN, + TRANSCRIPT_BOUND_FRI_QUERIES_CONFORMANCE_TRANSCRIPT_DOMAIN, + TRANSCRIPT_BOUND_PCS_CONFORMANCE_TRANSCRIPT_DOMAIN, + TRANSCRIPT_BOUND_PCS_FRI_QUERIES_CONFORMANCE_TRANSCRIPT_DOMAIN, + air::{Stage2AirProgramV1, constrain_stage2_air}, + binding::{ + Blake3Gate, CHUNK_END, CHUNK_START, IV, ROOT, pack_bytes, pack_params, + pack8, pcs_params, + }, + equality::{ + F128EqualityGate, build_f128_equality_r1cs, generate_f128_equality_witness, + }, + extension::{ + GoldilocksCircuitSlots, GoldilocksLaneRepackGate, build_lane_repack_r1cs, + generate_lane_repack_witness, + }, + goldilocks::{ + CanonicalGoldilocksPairGate, GOLDILOCKS_MODULUS, GoldilocksAddPairGate, + build_canonical_pair_r1cs, build_goldilocks_add_r1cs, + generate_canonical_pair_witness, generate_goldilocks_add_witness, + }, + merkle::{ + DigestOrderGate, build_digest_order_r1cs, generate_digest_order_witness, + }, + multiplication::{ + GoldilocksMulPairGate, build_goldilocks_mul_r1cs, + generate_goldilocks_mul_witness, goldilocks_mul, + }, + transcript::{ + FriTranscriptCircuitSlots, GoldilocksSampleGate, HashSampleGate, + Stage2FriTranscriptChallengesV1, Stage2FriTranscriptReplayV1, + Stage2TranscriptByteBindingV1, Stage2TranscriptReplayV1, + Stage2TranscriptSegmentV1, TranscriptCircuitSlots, U64SplitGate, + build_goldilocks_sample_r1cs, build_hash_sample_r1cs, build_u64_split_r1cs, + constrain_hash, constrain_stage2_fri_transcript, + constrain_stage2_transcript, fri_transcript_blake3_rows, + fri_transcript_split_rows, generate_goldilocks_sample_witness, + generate_hash_sample_witness, generate_u64_split_witness, hash_trace, + transcript_challenge_words, transcript_nu, + }, + window::{ + ByteWindowGate, build_byte_window_r1cs, generate_byte_window_witness, + }, +}; + +pub const FRI_FOLD_CONFORMANCE_ARTIFACT_MAGIC: &[u8; 8] = b"IXFLKFR1"; +pub const FRI_COMMIT_PHASE_CONFORMANCE_ARTIFACT_MAGIC: &[u8; 8] = b"IXFLFQ01"; +pub const PCS_REDUCTION_CONFORMANCE_ARTIFACT_MAGIC: &[u8; 8] = b"IXFLPR01"; +const ARTIFACT_VERSION: u16 = 1; +const CONFIG_OFFSET: usize = 10; +const LOG_HEIGHT_OFFSET: usize = CONFIG_OFFSET + 32; +const QUERY_INDEX_OFFSET: usize = LOG_HEIGHT_OFFSET + 1; +const FOLDED_OFFSET: usize = QUERY_INDEX_OFFSET + 4; +const SIBLING_OFFSET: usize = FOLDED_OFFSET + 16; +const BETA_OFFSET: usize = SIBLING_OFFSET + 16; +const RESULT_OFFSET: usize = BETA_OFFSET + 16; +const PATH_OFFSET: usize = RESULT_OFFSET + 16; +const FIXED_SUFFIX_BYTES: usize = 32 + 32 + 8; +const MAX_BUNDLE_BYTES: usize = 64 * 1024 * 1024; +const MIN_LOG_HEIGHT: u8 = 1; +const MAX_LOG_HEIGHT: u8 = 31; +const MAX_COMMIT_PHASE_ROUNDS: usize = 8; +const MAX_REDUCED_OPENING_WIDTH: usize = 1 << 16; +// The arithmetic slots need enough rows for the bit-reversed exponentiation +// at the maximum supported height. This also keeps every table in a Flock +// Fast128 geometry exercised by the existing conformance proofs. +const NU: usize = 10; + +/// The witness values consumed by one binary FRI commit-phase opening. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct FriFoldQueryV1 { + /// Height of the folded row (the original query has one additional bit). + pub log_height: u8, + /// Original FRI query index. Bit zero chooses the evaluation within the + /// pair; bits `1..=log_height` authenticate the pair and derive `s`. + pub query_index: u32, + pub folded: [u64; 2], + pub sibling: [u64; 2], + pub beta: [u64; 2], + /// Cap-height-zero authentication path for the row `[e0, e1]`. + pub opening_proof: Vec<[u8; 32]>, +} + +impl FriFoldQueryV1 { + pub fn folded_result(&self) -> Result<[u64; 2]> { + validate_query(self)?; + Ok(native_fold(self)) + } + + pub fn commitment_root(&self) -> Result<[u8; 32]> { + validate_query(self)?; + Ok(native_root(self)) + } +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct FriCommitPhaseRoundV1 { + pub sibling: [u64; 2], + pub beta: [u64; 2], + /// Reduced opening at this folded height, if one is scheduled. It is rolled + /// in as `beta^2 * reduced_opening` after the binary fold. + pub reduced_opening: Option<[u64; 2]>, + pub opening_proof: Vec<[u8; 32]>, +} + +/// A complete binary FRI commit-phase fold chain for one sampled query. +/// +/// This intentionally excludes reduced-opening roll-ins and transcript replay; +/// those are separate semantic slices. Each round consumes the next low query +/// bit, authenticates its extension pair, and feeds its constrained result +/// directly into the following round. The last result must equal the constant +/// final polynomial. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct FriCommitPhaseQueryV1 { + /// Folded height of the first round. Round `r` has height + /// `initial_log_height - r`. + pub initial_log_height: u8, + pub query_index: u32, + pub initial_folded: [u64; 2], + pub rounds: Vec, + pub final_polynomial: [u64; 2], +} + +impl FriCommitPhaseQueryV1 { + pub fn commitment_roots(&self) -> Result> { + let computation = compute_commit_phase(self)?; + ensure_final_polynomial(self, &computation)?; + Ok(computation.roots) + } + + pub fn folded_results(&self) -> Result> { + let computation = compute_commit_phase(self)?; + ensure_final_polynomial(self, &computation)?; + Ok(computation.results) + } +} + +/// One authenticated PCS row reduced into the FRI accumulator. +/// +/// The conformance circuit supports one BLAKE3 leaf block (at most eight +/// Goldilocks values). Wider rows will use the same arithmetic but require the +/// multi-block/tree leaf hasher before the production relation is complete. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PcsReducedOpeningV1 { + pub log_height: u8, + pub query_index: u32, + pub opened_values: Vec, + pub opened_at_z: Vec<[u64; 2]>, + pub zeta: [u64; 2], + pub alpha: [u64; 2], + pub initial_alpha_power: [u64; 2], + pub initial_accumulator: [u64; 2], + pub opening_proof: Vec<[u8; 32]>, +} + +impl PcsReducedOpeningV1 { + pub fn reduced_accumulator(&self) -> Result<[u64; 2]> { + Ok(compute_pcs_reduction(self)?.accumulator) + } + + pub fn next_alpha_power(&self) -> Result<[u64; 2]> { + Ok(compute_pcs_reduction(self)?.alpha_power) + } + + pub fn commitment_root(&self) -> Result<[u8; 32]> { + Ok(compute_pcs_reduction(self)?.root) + } +} + +/// An opening point used by the specialised Stage 2 PCS verifier. +/// +/// Stage 1, Stage 2, and preprocessed matrices are opened at both `zeta` and +/// `zeta * g`, while quotient matrices are opened only at `zeta`. Keeping the +/// point derivation in the relation prevents the prover from supplying a +/// second, unbound point. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum Stage2PcsOpeningPointV1 { + Zeta, + ZetaNext { log_degree: u8 }, +} + +/// Verifier-known metadata for one matrix in a Stage 2 input commitment. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage2PcsMatrixV1 { + /// Log2 of the LDE matrix height, including the FRI blowup. + pub log_height: u8, + /// Number of base-field columns in the authenticated row. + pub width: usize, + /// Opening points in the exact PCS batching order. + pub opening_points: Vec, + /// First `u64` lane of this matrix's contiguous extension-valued OOD + /// openings in the transcript's PCS-opening observation segment. + pub opened_values: Stage2TranscriptByteBindingV1, +} + +/// One multi-matrix MMCS commitment used as a PCS input batch. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage2PcsBatchV1 { + /// First `u64` lane of the 32-byte cap-height-zero commitment root in the + /// constrained transcript prefix. + pub commitment: Stage2TranscriptByteBindingV1, + pub matrices: Vec, +} + +/// Shared, verifier-known PCS instance for all sampled FRI queries. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage2PcsInstanceV1 { + pub log_global_height: u8, + pub log_blowup: u8, + pub batches: Vec, +} + +/// Per-query rows and a legacy full Merkle path for one input batch. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage2PcsBatchOpeningV1 { + pub opened_rows: Vec>, + pub opening_proof: Vec<[u8; 32]>, +} + +/// Every input-batch opening belonging to one transcript-derived query. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage2PcsQueryV1 { + pub batch_openings: Vec, +} + +/// One query's authenticated PCS input followed by its FRI commit-phase +/// opening chain. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TranscriptBoundPcsFriQueryV1 { + pub pcs: Stage2PcsQueryV1, + pub fri: FriCommitPhaseQueryV1, +} + +/// Exact typed Stage 2 PCS/FRI witness prepared for the combined Flock +/// relation. Commitment and OOD bindings point into `prefix`; query indices +/// and betas come from `fri_transcript`. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage2PcsFriWitnessV1 { + pub prefix: Stage2TranscriptReplayV1, + pub fri_transcript: Stage2FriTranscriptReplayV1, + pub pcs_instance: Stage2PcsInstanceV1, + pub queries: Vec, +} + +impl Stage2PcsFriWitnessV1 { + pub fn from_prepared( + prepared: &ValidatedStage2RootV1, + fri: &FriParameters, + ) -> Result { + let typed = Stage3TypedProofWitnessV1::from_prepared(prepared, fri)?; + Self::from_prepared_and_typed(prepared, fri, &typed) + } + + pub fn from_prepared_and_typed( + prepared: &ValidatedStage2RootV1, + fri: &FriParameters, + typed: &Stage3TypedProofWitnessV1, + ) -> Result { + build_stage2_pcs_fri_witness(prepared, fri, typed) + } +} + +/// All currently lowered Stage 2 verifier semantics: compiled AIR/logUp OOD +/// evaluation plus transcript-bound PCS and every FRI query. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage2AirPcsFriWitnessV1 { + pub pcs_fri: Stage2PcsFriWitnessV1, + pub air: Stage2AirProgramV1, +} + +impl Stage2AirPcsFriWitnessV1 { + pub fn from_prepared( + prepared: &ValidatedStage2RootV1, + fri: &FriParameters, + ) -> Result { + let typed = Stage3TypedProofWitnessV1::from_prepared(prepared, fri)?; + let pcs_fri = + Stage2PcsFriWitnessV1::from_prepared_and_typed(prepared, fri, &typed)?; + let air = Stage2AirProgramV1::from_prepared_and_typed( + prepared, + fri, + &pcs_fri.pcs_instance, + &typed, + )?; + Ok(Self { pcs_fri, air }) + } +} + +/// A real Flock proof of an authenticated Plonky3-compatible binary FRI fold. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct FriFoldConformanceArtifactV1 { + query: FriFoldQueryV1, + folded_result: [u64; 2], + circuit_digest: [u8; 32], + commitment_root: [u8; 32], + proof_bundle_bytes: Vec, +} + +impl FriFoldConformanceArtifactV1 { + pub fn to_bytes(&self) -> Vec { + let mut bytes = Vec::with_capacity( + PATH_OFFSET + + 32 * self.query.opening_proof.len() + + FIXED_SUFFIX_BYTES + + self.proof_bundle_bytes.len(), + ); + bytes.extend_from_slice(FRI_FOLD_CONFORMANCE_ARTIFACT_MAGIC); + bytes.extend_from_slice(&ARTIFACT_VERSION.to_le_bytes()); + bytes.extend_from_slice(&FlockConfigV1.digest()); + bytes.push(self.query.log_height); + bytes.extend_from_slice(&self.query.query_index.to_le_bytes()); + encode_extension(&mut bytes, self.query.folded); + encode_extension(&mut bytes, self.query.sibling); + encode_extension(&mut bytes, self.query.beta); + encode_extension(&mut bytes, self.folded_result); + for sibling in &self.query.opening_proof { + bytes.extend_from_slice(sibling); + } + bytes.extend_from_slice(&self.circuit_digest); + bytes.extend_from_slice(&self.commitment_root); + bytes.extend_from_slice( + &u64::try_from(self.proof_bundle_bytes.len()) + .expect("proof bundle length") + .to_le_bytes(), + ); + bytes.extend_from_slice(&self.proof_bundle_bytes); + bytes + } + + pub fn from_bytes(bytes: &[u8]) -> Result { + if bytes.len() < PATH_OFFSET + FIXED_SUFFIX_BYTES { + bail!("truncated Flock FRI-fold conformance artifact"); + } + if &bytes[..8] != FRI_FOLD_CONFORMANCE_ARTIFACT_MAGIC { + bail!("invalid Flock FRI-fold conformance artifact magic"); + } + let version = u16::from_le_bytes(bytes[8..10].try_into().unwrap()); + if version != ARTIFACT_VERSION { + bail!("unsupported Flock FRI-fold artifact version {version}"); + } + if bytes[CONFIG_OFFSET..LOG_HEIGHT_OFFSET] != FlockConfigV1.digest() { + bail!("Flock FRI-fold artifact configuration mismatch"); + } + let log_height = bytes[LOG_HEIGHT_OFFSET]; + validate_log_height(log_height)?; + let query_index = u32::from_le_bytes( + bytes[QUERY_INDEX_OFFSET..FOLDED_OFFSET].try_into().unwrap(), + ); + let folded = decode_extension(&bytes[FOLDED_OFFSET..SIBLING_OFFSET]); + let sibling = decode_extension(&bytes[SIBLING_OFFSET..BETA_OFFSET]); + let beta = decode_extension(&bytes[BETA_OFFSET..RESULT_OFFSET]); + let folded_result = decode_extension(&bytes[RESULT_OFFSET..PATH_OFFSET]); + let path_end = PATH_OFFSET + .checked_add(usize::from(log_height) * 32) + .ok_or_else(|| anyhow::anyhow!("FRI-fold path length overflow"))?; + let suffix_end = path_end + .checked_add(FIXED_SUFFIX_BYTES) + .ok_or_else(|| anyhow::anyhow!("FRI-fold artifact length overflow"))?; + if bytes.len() < suffix_end { + bail!("truncated Flock FRI-fold path or proof header"); + } + let opening_proof = + bytes[PATH_OFFSET..path_end].as_chunks::<32>().0.to_vec(); + let query = FriFoldQueryV1 { + log_height, + query_index, + folded, + sibling, + beta, + opening_proof, + }; + validate_query(&query)?; + validate_extension(folded_result, "folded result")?; + let mut circuit_digest = [0u8; 32]; + circuit_digest.copy_from_slice(&bytes[path_end..path_end + 32]); + let mut commitment_root = [0u8; 32]; + commitment_root.copy_from_slice(&bytes[path_end + 32..path_end + 64]); + let bundle_len = usize::try_from(u64::from_le_bytes( + bytes[path_end + 64..suffix_end].try_into().unwrap(), + )) + .map_err(|error| { + anyhow::anyhow!("proof bundle length does not fit usize: {error}") + })?; + if bundle_len == 0 || bundle_len > MAX_BUNDLE_BYTES { + bail!("invalid Flock FRI-fold proof bundle length {bundle_len}"); + } + let expected_len = suffix_end + .checked_add(bundle_len) + .ok_or_else(|| anyhow::anyhow!("FRI-fold proof length overflow"))?; + if bytes.len() != expected_len { + bail!( + "Flock FRI-fold artifact is {} bytes; header declares {expected_len}", + bytes.len() + ); + } + let proof_bundle_bytes = bytes[suffix_end..].to_vec(); + decode_bundle(&proof_bundle_bytes) + .context("decode Flock FRI-fold conformance proof bundle")?; + Ok(Self { + query, + folded_result, + circuit_digest, + commitment_root, + proof_bundle_bytes, + }) + } + + pub fn query(&self) -> &FriFoldQueryV1 { + &self.query + } + + pub fn folded_result(&self) -> [u64; 2] { + self.folded_result + } + + pub fn circuit_digest(&self) -> &[u8; 32] { + &self.circuit_digest + } + + pub fn commitment_root(&self) -> &[u8; 32] { + &self.commitment_root + } + + pub fn proof_bundle_bytes(&self) -> &[u8] { + &self.proof_bundle_bytes + } +} + +const COMMIT_PHASE_ROUND_COUNT_OFFSET: usize = LOG_HEIGHT_OFFSET + 1; +const COMMIT_PHASE_QUERY_INDEX_OFFSET: usize = + COMMIT_PHASE_ROUND_COUNT_OFFSET + 1; +const COMMIT_PHASE_INITIAL_OFFSET: usize = COMMIT_PHASE_QUERY_INDEX_OFFSET + 4; +const COMMIT_PHASE_FINAL_OFFSET: usize = COMMIT_PHASE_INITIAL_OFFSET + 16; +const COMMIT_PHASE_ROUNDS_OFFSET: usize = COMMIT_PHASE_FINAL_OFFSET + 16; + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct FriCommitPhaseConformanceArtifactV1 { + query: FriCommitPhaseQueryV1, + circuit_digest: [u8; 32], + commitment_roots: Vec<[u8; 32]>, + proof_bundle_bytes: Vec, +} + +impl FriCommitPhaseConformanceArtifactV1 { + pub fn to_bytes(&self) -> Vec { + let round_bytes = self + .query + .rounds + .iter() + .map(|round| 49 + round.opening_proof.len() * 32) + .sum::(); + let mut bytes = Vec::with_capacity( + COMMIT_PHASE_ROUNDS_OFFSET + + round_bytes + + 32 + + self.commitment_roots.len() * 32 + + 8 + + self.proof_bundle_bytes.len(), + ); + bytes.extend_from_slice(FRI_COMMIT_PHASE_CONFORMANCE_ARTIFACT_MAGIC); + bytes.extend_from_slice(&ARTIFACT_VERSION.to_le_bytes()); + bytes.extend_from_slice(&FlockConfigV1.digest()); + bytes.push(self.query.initial_log_height); + bytes.push(u8::try_from(self.query.rounds.len()).expect("FRI round count")); + bytes.extend_from_slice(&self.query.query_index.to_le_bytes()); + encode_extension(&mut bytes, self.query.initial_folded); + encode_extension(&mut bytes, self.query.final_polynomial); + for round in &self.query.rounds { + encode_extension(&mut bytes, round.sibling); + encode_extension(&mut bytes, round.beta); + bytes.push(u8::from(round.reduced_opening.is_some())); + encode_extension(&mut bytes, round.reduced_opening.unwrap_or([0, 0])); + for sibling in &round.opening_proof { + bytes.extend_from_slice(sibling); + } + } + bytes.extend_from_slice(&self.circuit_digest); + for root in &self.commitment_roots { + bytes.extend_from_slice(root); + } + bytes.extend_from_slice( + &u64::try_from(self.proof_bundle_bytes.len()) + .expect("proof bundle length") + .to_le_bytes(), + ); + bytes.extend_from_slice(&self.proof_bundle_bytes); + bytes + } + + pub fn from_bytes(bytes: &[u8]) -> Result { + if bytes.len() < COMMIT_PHASE_ROUNDS_OFFSET + 32 + 32 + 8 { + bail!("truncated Flock FRI commit-phase conformance artifact"); + } + if &bytes[..8] != FRI_COMMIT_PHASE_CONFORMANCE_ARTIFACT_MAGIC { + bail!("invalid Flock FRI commit-phase artifact magic"); + } + let version = u16::from_le_bytes(bytes[8..10].try_into().unwrap()); + if version != ARTIFACT_VERSION { + bail!("unsupported Flock FRI commit-phase artifact version {version}"); + } + if bytes[CONFIG_OFFSET..LOG_HEIGHT_OFFSET] != FlockConfigV1.digest() { + bail!("Flock FRI commit-phase artifact configuration mismatch"); + } + let initial_log_height = bytes[LOG_HEIGHT_OFFSET]; + validate_log_height(initial_log_height)?; + let round_count = usize::from(bytes[COMMIT_PHASE_ROUND_COUNT_OFFSET]); + validate_commit_phase_round_count(initial_log_height, round_count)?; + let query_index = u32::from_le_bytes( + bytes[COMMIT_PHASE_QUERY_INDEX_OFFSET..COMMIT_PHASE_INITIAL_OFFSET] + .try_into() + .unwrap(), + ); + let initial_folded = decode_extension( + &bytes[COMMIT_PHASE_INITIAL_OFFSET..COMMIT_PHASE_FINAL_OFFSET], + ); + let final_polynomial = decode_extension( + &bytes[COMMIT_PHASE_FINAL_OFFSET..COMMIT_PHASE_ROUNDS_OFFSET], + ); + let rounds_bytes = + commit_phase_rounds_bytes(initial_log_height, round_count)?; + let rounds_end = COMMIT_PHASE_ROUNDS_OFFSET + .checked_add(rounds_bytes) + .ok_or_else(|| anyhow::anyhow!("FRI commit-phase rounds overflow"))?; + let suffix_len = 32usize + .checked_add(round_count * 32) + .and_then(|length| length.checked_add(8)) + .ok_or_else(|| anyhow::anyhow!("FRI commit-phase suffix overflow"))?; + let suffix_end = rounds_end + .checked_add(suffix_len) + .ok_or_else(|| anyhow::anyhow!("FRI commit-phase artifact overflow"))?; + if bytes.len() < suffix_end { + bail!("truncated Flock FRI commit-phase rounds or proof header"); + } + + let mut cursor = COMMIT_PHASE_ROUNDS_OFFSET; + let mut rounds = Vec::with_capacity(round_count); + for round_index in 0..round_count { + let log_height = usize::from(initial_log_height) - round_index; + let sibling = decode_extension(&bytes[cursor..cursor + 16]); + cursor += 16; + let beta = decode_extension(&bytes[cursor..cursor + 16]); + cursor += 16; + let has_reduced_opening = bytes[cursor]; + cursor += 1; + if has_reduced_opening > 1 { + bail!( + "FRI commit-phase round {round_index} has invalid roll-in flag {has_reduced_opening}" + ); + } + let encoded_reduced_opening = + decode_extension(&bytes[cursor..cursor + 16]); + cursor += 16; + let reduced_opening = if has_reduced_opening == 1 { + Some(encoded_reduced_opening) + } else { + if encoded_reduced_opening != [0, 0] { + bail!("absent FRI reduced opening has nonzero encoding"); + } + None + }; + let path_end = cursor + log_height * 32; + let opening_proof = bytes[cursor..path_end].as_chunks::<32>().0.to_vec(); + cursor = path_end; + rounds.push(FriCommitPhaseRoundV1 { + sibling, + beta, + reduced_opening, + opening_proof, + }); + } + debug_assert_eq!(cursor, rounds_end); + let query = FriCommitPhaseQueryV1 { + initial_log_height, + query_index, + initial_folded, + rounds, + final_polynomial, + }; + let computation = compute_commit_phase(&query)?; + ensure_final_polynomial(&query, &computation)?; + + let mut circuit_digest = [0u8; 32]; + circuit_digest.copy_from_slice(&bytes[rounds_end..rounds_end + 32]); + let roots_end = rounds_end + 32 + round_count * 32; + let commitment_roots = + bytes[rounds_end + 32..roots_end].as_chunks::<32>().0.to_vec(); + let bundle_len = usize::try_from(u64::from_le_bytes( + bytes[roots_end..suffix_end].try_into().unwrap(), + )) + .map_err(|error| { + anyhow::anyhow!("proof bundle length does not fit usize: {error}") + })?; + if bundle_len == 0 || bundle_len > MAX_BUNDLE_BYTES { + bail!("invalid Flock FRI commit-phase proof length {bundle_len}"); + } + let expected_len = suffix_end + .checked_add(bundle_len) + .ok_or_else(|| anyhow::anyhow!("FRI commit-phase proof overflow"))?; + if bytes.len() != expected_len { + bail!( + "Flock FRI commit-phase artifact is {} bytes; header declares {expected_len}", + bytes.len() + ); + } + let proof_bundle_bytes = bytes[suffix_end..].to_vec(); + decode_bundle(&proof_bundle_bytes) + .context("decode Flock FRI commit-phase proof bundle")?; + Ok(Self { query, circuit_digest, commitment_roots, proof_bundle_bytes }) + } + + pub fn query(&self) -> &FriCommitPhaseQueryV1 { + &self.query + } + + pub fn circuit_digest(&self) -> &[u8; 32] { + &self.circuit_digest + } + + pub fn commitment_roots(&self) -> &[[u8; 32]] { + &self.commitment_roots + } + + pub fn proof_bundle_bytes(&self) -> &[u8] { + &self.proof_bundle_bytes + } +} + +const PCS_WIDTH_OFFSET: usize = LOG_HEIGHT_OFFSET + 1; +const PCS_QUERY_INDEX_OFFSET: usize = PCS_WIDTH_OFFSET + 1; +const PCS_ZETA_OFFSET: usize = PCS_QUERY_INDEX_OFFSET + 4; +const PCS_ALPHA_OFFSET: usize = PCS_ZETA_OFFSET + 16; +const PCS_INITIAL_ALPHA_POWER_OFFSET: usize = PCS_ALPHA_OFFSET + 16; +const PCS_INITIAL_ACCUMULATOR_OFFSET: usize = + PCS_INITIAL_ALPHA_POWER_OFFSET + 16; +const PCS_REDUCED_ACCUMULATOR_OFFSET: usize = + PCS_INITIAL_ACCUMULATOR_OFFSET + 16; +const PCS_NEXT_ALPHA_POWER_OFFSET: usize = PCS_REDUCED_ACCUMULATOR_OFFSET + 16; +const PCS_DYNAMIC_OFFSET: usize = PCS_NEXT_ALPHA_POWER_OFFSET + 16; + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct PcsReductionConformanceArtifactV1 { + opening: PcsReducedOpeningV1, + reduced_accumulator: [u64; 2], + next_alpha_power: [u64; 2], + circuit_digest: [u8; 32], + commitment_root: [u8; 32], + proof_bundle_bytes: Vec, +} + +impl PcsReductionConformanceArtifactV1 { + pub fn to_bytes(&self) -> Vec { + let width = self.opening.opened_values.len(); + let dynamic_bytes = + width * 8 + width * 16 + self.opening.opening_proof.len() * 32; + let mut bytes = Vec::with_capacity( + PCS_DYNAMIC_OFFSET + + dynamic_bytes + + FIXED_SUFFIX_BYTES + + self.proof_bundle_bytes.len(), + ); + bytes.extend_from_slice(PCS_REDUCTION_CONFORMANCE_ARTIFACT_MAGIC); + bytes.extend_from_slice(&ARTIFACT_VERSION.to_le_bytes()); + bytes.extend_from_slice(&FlockConfigV1.digest()); + bytes.push(self.opening.log_height); + bytes.push(u8::try_from(width).expect("PCS row width")); + bytes.extend_from_slice(&self.opening.query_index.to_le_bytes()); + encode_extension(&mut bytes, self.opening.zeta); + encode_extension(&mut bytes, self.opening.alpha); + encode_extension(&mut bytes, self.opening.initial_alpha_power); + encode_extension(&mut bytes, self.opening.initial_accumulator); + encode_extension(&mut bytes, self.reduced_accumulator); + encode_extension(&mut bytes, self.next_alpha_power); + for value in &self.opening.opened_values { + bytes.extend_from_slice(&value.to_le_bytes()); + } + for value in &self.opening.opened_at_z { + encode_extension(&mut bytes, *value); + } + for sibling in &self.opening.opening_proof { + bytes.extend_from_slice(sibling); + } + bytes.extend_from_slice(&self.circuit_digest); + bytes.extend_from_slice(&self.commitment_root); + bytes.extend_from_slice( + &u64::try_from(self.proof_bundle_bytes.len()) + .expect("proof bundle length") + .to_le_bytes(), + ); + bytes.extend_from_slice(&self.proof_bundle_bytes); + bytes + } + + pub fn from_bytes(bytes: &[u8]) -> Result { + if bytes.len() < PCS_DYNAMIC_OFFSET + FIXED_SUFFIX_BYTES { + bail!("truncated Flock PCS-reduction conformance artifact"); + } + if &bytes[..8] != PCS_REDUCTION_CONFORMANCE_ARTIFACT_MAGIC { + bail!("invalid Flock PCS-reduction artifact magic"); + } + let version = u16::from_le_bytes(bytes[8..10].try_into().unwrap()); + if version != ARTIFACT_VERSION { + bail!("unsupported Flock PCS-reduction artifact version {version}"); + } + if bytes[CONFIG_OFFSET..LOG_HEIGHT_OFFSET] != FlockConfigV1.digest() { + bail!("Flock PCS-reduction artifact configuration mismatch"); + } + let log_height = bytes[LOG_HEIGHT_OFFSET]; + validate_log_height(log_height)?; + let width = usize::from(bytes[PCS_WIDTH_OFFSET]); + validate_reduced_opening_width(width)?; + let query_index = u32::from_le_bytes( + bytes[PCS_QUERY_INDEX_OFFSET..PCS_ZETA_OFFSET].try_into().unwrap(), + ); + let zeta = decode_extension(&bytes[PCS_ZETA_OFFSET..PCS_ALPHA_OFFSET]); + let alpha = decode_extension( + &bytes[PCS_ALPHA_OFFSET..PCS_INITIAL_ALPHA_POWER_OFFSET], + ); + let initial_alpha_power = decode_extension( + &bytes[PCS_INITIAL_ALPHA_POWER_OFFSET..PCS_INITIAL_ACCUMULATOR_OFFSET], + ); + let initial_accumulator = decode_extension( + &bytes[PCS_INITIAL_ACCUMULATOR_OFFSET..PCS_REDUCED_ACCUMULATOR_OFFSET], + ); + let reduced_accumulator = decode_extension( + &bytes[PCS_REDUCED_ACCUMULATOR_OFFSET..PCS_NEXT_ALPHA_POWER_OFFSET], + ); + let next_alpha_power = + decode_extension(&bytes[PCS_NEXT_ALPHA_POWER_OFFSET..PCS_DYNAMIC_OFFSET]); + let opened_values_end = PCS_DYNAMIC_OFFSET + .checked_add(width * 8) + .ok_or_else(|| anyhow::anyhow!("PCS opened-values length overflow"))?; + let opened_at_z_end = opened_values_end + .checked_add(width * 16) + .ok_or_else(|| anyhow::anyhow!("PCS OOD-values length overflow"))?; + let path_end = opened_at_z_end + .checked_add(usize::from(log_height) * 32) + .ok_or_else(|| anyhow::anyhow!("PCS Merkle path length overflow"))?; + let suffix_end = path_end + .checked_add(FIXED_SUFFIX_BYTES) + .ok_or_else(|| anyhow::anyhow!("PCS artifact length overflow"))?; + if bytes.len() < suffix_end { + bail!("truncated Flock PCS values, path, or proof header"); + } + let opened_values = bytes[PCS_DYNAMIC_OFFSET..opened_values_end] + .as_chunks::<8>() + .0 + .iter() + .map(|word| u64::from_le_bytes(*word)) + .collect(); + let opened_at_z = bytes[opened_values_end..opened_at_z_end] + .as_chunks::<16>() + .0 + .iter() + .map(|value| decode_extension(value)) + .collect(); + let opening_proof = + bytes[opened_at_z_end..path_end].as_chunks::<32>().0.to_vec(); + let opening = PcsReducedOpeningV1 { + log_height, + query_index, + opened_values, + opened_at_z, + zeta, + alpha, + initial_alpha_power, + initial_accumulator, + opening_proof, + }; + let computation = compute_pcs_reduction(&opening)?; + validate_extension(reduced_accumulator, "reduced accumulator")?; + validate_extension(next_alpha_power, "next alpha power")?; + + let mut circuit_digest = [0u8; 32]; + circuit_digest.copy_from_slice(&bytes[path_end..path_end + 32]); + let mut commitment_root = [0u8; 32]; + commitment_root.copy_from_slice(&bytes[path_end + 32..path_end + 64]); + let bundle_len = usize::try_from(u64::from_le_bytes( + bytes[path_end + 64..suffix_end].try_into().unwrap(), + )) + .map_err(|error| { + anyhow::anyhow!("proof bundle length does not fit usize: {error}") + })?; + if bundle_len == 0 || bundle_len > MAX_BUNDLE_BYTES { + bail!("invalid Flock PCS-reduction proof length {bundle_len}"); + } + let expected_len = suffix_end + .checked_add(bundle_len) + .ok_or_else(|| anyhow::anyhow!("PCS-reduction proof overflow"))?; + if bytes.len() != expected_len { + bail!( + "Flock PCS-reduction artifact is {} bytes; header declares {expected_len}", + bytes.len() + ); + } + let proof_bundle_bytes = bytes[suffix_end..].to_vec(); + decode_bundle(&proof_bundle_bytes) + .context("decode Flock PCS-reduction proof bundle")?; + if reduced_accumulator != computation.accumulator + || next_alpha_power != computation.alpha_power + || commitment_root != computation.root + { + bail!("Flock PCS-reduction artifact carries inconsistent native outputs"); + } + Ok(Self { + opening, + reduced_accumulator, + next_alpha_power, + circuit_digest, + commitment_root, + proof_bundle_bytes, + }) + } + + pub fn opening(&self) -> &PcsReducedOpeningV1 { + &self.opening + } + + pub fn reduced_accumulator(&self) -> [u64; 2] { + self.reduced_accumulator + } + + pub fn next_alpha_power(&self) -> [u64; 2] { + self.next_alpha_power + } + + pub fn circuit_digest(&self) -> &[u8; 32] { + &self.circuit_digest + } + + pub fn commitment_root(&self) -> &[u8; 32] { + &self.commitment_root + } + + pub fn proof_bundle_bytes(&self) -> &[u8] { + &self.proof_bundle_bytes + } +} + +/// One Flock proof in which the exact Stage 2 BLAKE3 transcript directly +/// supplies zeta and the PCS opening-batch challenge to an authenticated +/// reduced-opening check. +/// +/// This is the first composed semantic slice: changing any transcript byte +/// changes the wires used by the PCS arithmetic inside the same circuit. It +/// remains a conformance artifact, not the complete Stage 3 proof. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TranscriptBoundPcsReductionArtifactV1 { + replay: Stage2TranscriptReplayV1, + opening: PcsReducedOpeningV1, + reduced_accumulator: [u64; 2], + next_alpha_power: [u64; 2], + circuit_digest: [u8; 32], + commitment_root: [u8; 32], + proof_bundle_bytes: Vec, +} + +impl TranscriptBoundPcsReductionArtifactV1 { + pub fn replay(&self) -> &Stage2TranscriptReplayV1 { + &self.replay + } + + pub fn opening(&self) -> &PcsReducedOpeningV1 { + &self.opening + } + + pub fn reduced_accumulator(&self) -> [u64; 2] { + self.reduced_accumulator + } + + pub fn next_alpha_power(&self) -> [u64; 2] { + self.next_alpha_power + } + + pub fn circuit_digest(&self) -> &[u8; 32] { + &self.circuit_digest + } + + pub fn commitment_root(&self) -> &[u8; 32] { + &self.commitment_root + } + + pub fn proof_bundle_bytes(&self) -> &[u8] { + &self.proof_bundle_bytes + } +} + +/// One Flock proof that continues the exact Stage 2 transcript through FRI, +/// then uses a transcript-derived query index and folding challenges to check +/// one complete authenticated binary commit-phase chain. +/// +/// Cap roots and the final polynomial are consumed from the same transcript +/// wires used by the fold relation. This is still a conformance slice: a full +/// Stage 3 proof must check every sampled query and all PCS reduced openings. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TranscriptBoundFriCommitPhaseArtifactV1 { + prefix: Stage2TranscriptReplayV1, + fri_transcript: Stage2FriTranscriptReplayV1, + query_number: usize, + query: FriCommitPhaseQueryV1, + circuit_digest: [u8; 32], + commitment_roots: Vec<[u8; 32]>, + proof_bundle_bytes: Vec, +} + +impl TranscriptBoundFriCommitPhaseArtifactV1 { + pub fn prefix(&self) -> &Stage2TranscriptReplayV1 { + &self.prefix + } + + pub fn fri_transcript(&self) -> &Stage2FriTranscriptReplayV1 { + &self.fri_transcript + } + + pub const fn query_number(&self) -> usize { + self.query_number + } + + pub fn query(&self) -> &FriCommitPhaseQueryV1 { + &self.query + } + + pub fn circuit_digest(&self) -> &[u8; 32] { + &self.circuit_digest + } + + pub fn commitment_roots(&self) -> &[[u8; 32]] { + &self.commitment_roots + } + + pub fn proof_bundle_bytes(&self) -> &[u8] { + &self.proof_bundle_bytes + } +} + +/// One Flock proof of every transcript-derived FRI query. All queries share +/// one constrained transcript, beta vector, cap set, and final polynomial. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TranscriptBoundFriQueriesArtifactV1 { + prefix: Stage2TranscriptReplayV1, + fri_transcript: Stage2FriTranscriptReplayV1, + queries: Vec, + circuit_digest: [u8; 32], + proof_bundle_bytes: Vec, +} + +impl TranscriptBoundFriQueriesArtifactV1 { + pub fn prefix(&self) -> &Stage2TranscriptReplayV1 { + &self.prefix + } + + pub fn fri_transcript(&self) -> &Stage2FriTranscriptReplayV1 { + &self.fri_transcript + } + + pub fn queries(&self) -> &[FriCommitPhaseQueryV1] { + &self.queries + } + + pub fn circuit_digest(&self) -> &[u8; 32] { + &self.circuit_digest + } + + pub fn proof_bundle_bytes(&self) -> &[u8] { + &self.proof_bundle_bytes + } +} + +/// One Flock proof that authenticates every Stage 2 PCS input row, computes +/// all per-height reduced openings from transcript-bound OOD values, and feeds +/// those accumulators into every transcript-derived FRI query. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TranscriptBoundPcsFriQueriesArtifactV1 { + prefix: Stage2TranscriptReplayV1, + fri_transcript: Stage2FriTranscriptReplayV1, + pcs_instance: Stage2PcsInstanceV1, + queries: Vec, + circuit_digest: [u8; 32], + proof_bundle_bytes: Vec, +} + +impl TranscriptBoundPcsFriQueriesArtifactV1 { + pub fn prefix(&self) -> &Stage2TranscriptReplayV1 { + &self.prefix + } + + pub fn fri_transcript(&self) -> &Stage2FriTranscriptReplayV1 { + &self.fri_transcript + } + + pub fn pcs_instance(&self) -> &Stage2PcsInstanceV1 { + &self.pcs_instance + } + + pub fn queries(&self) -> &[TranscriptBoundPcsFriQueryV1] { + &self.queries + } + + pub fn circuit_digest(&self) -> &[u8; 32] { + &self.circuit_digest + } + + pub fn proof_bundle_bytes(&self) -> &[u8] { + &self.proof_bundle_bytes + } +} + +/// A real Flock proof of statement binding and compiled AIR/logUp OOD checks +/// composed with the exact PCS-to-FRI relation. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage2AirPcsFriArtifactV1 { + witness: Stage2AirPcsFriWitnessV1, + circuit_digest: [u8; 32], + proof_bundle_bytes: Vec, +} + +impl Stage2AirPcsFriArtifactV1 { + pub(crate) fn from_parts( + witness: Stage2AirPcsFriWitnessV1, + circuit_digest: [u8; 32], + proof_bundle_bytes: Vec, + ) -> Result { + if proof_bundle_bytes.is_empty() { + bail!("Stage 2 AIR/PCS/FRI proof bundle is empty"); + } + if proof_bundle_bytes.len() > MAX_BUNDLE_BYTES { + bail!( + "Stage 2 AIR/PCS/FRI proof bundle exceeds {MAX_BUNDLE_BYTES} bytes" + ); + } + Ok(Self { witness, circuit_digest, proof_bundle_bytes }) + } + + pub fn witness(&self) -> &Stage2AirPcsFriWitnessV1 { + &self.witness + } + + pub fn circuit_digest(&self) -> &[u8; 32] { + &self.circuit_digest + } + + pub fn proof_bundle_bytes(&self) -> &[u8] { + &self.proof_bundle_bytes + } + + pub fn stage2_root_digest(&self) -> &[u8; 32] { + &self.witness.air.statement_digest + } +} + +#[derive(Serialize, Deserialize)] +struct FriFoldProofBundle { + commitment: Commitment, + proof: R1csProofCircuitMerged, +} + +pub fn prove_fri_fold_conformance( + query: &FriFoldQueryV1, +) -> Result { + validate_query(query)?; + let folded_result = native_fold(query); + let commitment_root = native_root(query); + let relation = FriFoldRelation::build(query.log_height)?; + let inputs = relation_inputs(query, folded_result); + let expected_public = relation_public(query, folded_result, &commitment_root); + let proof_bundle_bytes = prove_fri_circuit( + &relation.shape, + relation.table_slots(), + None, + None, + None, + NU, + &inputs, + &expected_public, + FRI_FOLD_CONFORMANCE_TRANSCRIPT_DOMAIN, + )?; + Ok(FriFoldConformanceArtifactV1 { + query: query.clone(), + folded_result, + circuit_digest: relation.shape.circuit.digest(), + commitment_root, + proof_bundle_bytes, + }) +} + +pub fn verify_fri_fold_conformance( + artifact: &FriFoldConformanceArtifactV1, +) -> Result<()> { + validate_query(&artifact.query)?; + if artifact.folded_result != native_fold(&artifact.query) { + bail!("Flock FRI-fold artifact carries the wrong folded result"); + } + if artifact.commitment_root != native_root(&artifact.query) { + bail!("Flock FRI-fold artifact carries the wrong commitment root"); + } + let relation = FriFoldRelation::build(artifact.query.log_height)?; + if artifact.circuit_digest != relation.shape.circuit.digest() { + bail!("Flock FRI-fold conformance circuit digest mismatch"); + } + let public = relation_public( + &artifact.query, + artifact.folded_result, + &artifact.commitment_root, + ); + verify_fri_circuit( + &relation.shape, + relation.table_slots(), + None, + None, + None, + NU, + &public, + &artifact.proof_bundle_bytes, + FRI_FOLD_CONFORMANCE_TRANSCRIPT_DOMAIN, + ) +} + +pub fn prove_fri_commit_phase_conformance( + query: &FriCommitPhaseQueryV1, +) -> Result { + let computation = compute_commit_phase(query)?; + ensure_final_polynomial(query, &computation)?; + let relation = FriCommitPhaseRelation::build(query)?; + let inputs = commit_phase_relation_inputs(query, &computation); + let public = commit_phase_relation_public(query, &computation); + let proof_bundle_bytes = prove_fri_circuit( + &relation.shape, + relation.slots, + None, + None, + None, + relation.nu, + &inputs, + &public, + FRI_QUERY_CONFORMANCE_TRANSCRIPT_DOMAIN, + )?; + Ok(FriCommitPhaseConformanceArtifactV1 { + query: query.clone(), + circuit_digest: relation.shape.circuit.digest(), + commitment_roots: computation.roots, + proof_bundle_bytes, + }) +} + +pub fn verify_fri_commit_phase_conformance( + artifact: &FriCommitPhaseConformanceArtifactV1, +) -> Result<()> { + let computation = compute_commit_phase(&artifact.query)?; + ensure_final_polynomial(&artifact.query, &computation)?; + if artifact.commitment_roots != computation.roots { + bail!("Flock FRI commit-phase artifact carries the wrong round roots"); + } + let relation = FriCommitPhaseRelation::build(&artifact.query)?; + if artifact.circuit_digest != relation.shape.circuit.digest() { + bail!("Flock FRI commit-phase circuit digest mismatch"); + } + let public = commit_phase_relation_public(&artifact.query, &computation); + verify_fri_circuit( + &relation.shape, + relation.slots, + None, + None, + None, + relation.nu, + &public, + &artifact.proof_bundle_bytes, + FRI_QUERY_CONFORMANCE_TRANSCRIPT_DOMAIN, + ) +} + +pub fn prove_pcs_reduction_conformance( + opening: &PcsReducedOpeningV1, +) -> Result { + let computation = compute_pcs_reduction(opening)?; + let relation = PcsReductionRelation::build(opening)?; + let inputs = pcs_reduction_relation_inputs(opening, &computation); + let public = pcs_reduction_relation_public(opening, &computation); + let proof_bundle_bytes = prove_fri_circuit( + &relation.shape, + relation.slots, + None, + None, + None, + relation.nu, + &inputs, + &public, + PCS_REDUCTION_CONFORMANCE_TRANSCRIPT_DOMAIN, + )?; + Ok(PcsReductionConformanceArtifactV1 { + opening: opening.clone(), + reduced_accumulator: computation.accumulator, + next_alpha_power: computation.alpha_power, + circuit_digest: relation.shape.circuit.digest(), + commitment_root: computation.root, + proof_bundle_bytes, + }) +} + +pub fn verify_pcs_reduction_conformance( + artifact: &PcsReductionConformanceArtifactV1, +) -> Result<()> { + let computation = compute_pcs_reduction(&artifact.opening)?; + if artifact.reduced_accumulator != computation.accumulator + || artifact.next_alpha_power != computation.alpha_power + || artifact.commitment_root != computation.root + { + bail!("Flock PCS-reduction artifact carries the wrong native outputs"); + } + let relation = PcsReductionRelation::build(&artifact.opening)?; + if artifact.circuit_digest != relation.shape.circuit.digest() { + bail!("Flock PCS-reduction circuit digest mismatch"); + } + let public = pcs_reduction_relation_public(&artifact.opening, &computation); + verify_fri_circuit( + &relation.shape, + relation.slots, + None, + None, + None, + relation.nu, + &public, + &artifact.proof_bundle_bytes, + PCS_REDUCTION_CONFORMANCE_TRANSCRIPT_DOMAIN, + ) +} + +pub fn prove_transcript_bound_pcs_reduction_conformance( + replay: &Stage2TranscriptReplayV1, + opening: &PcsReducedOpeningV1, +) -> Result { + let challenges = replay.challenges()?; + ensure_transcript_binds_opening(challenges, opening)?; + let computation = compute_pcs_reduction(opening)?; + let relation = TranscriptBoundPcsReductionRelation::build( + replay, + opening, + &computation, + challenges, + )?; + let proof_bundle_bytes = prove_fri_circuit( + &relation.shape, + relation.slots, + None, + None, + None, + relation.nu, + &relation.inputs, + &relation.public, + TRANSCRIPT_BOUND_PCS_CONFORMANCE_TRANSCRIPT_DOMAIN, + )?; + Ok(TranscriptBoundPcsReductionArtifactV1 { + replay: replay.clone(), + opening: opening.clone(), + reduced_accumulator: computation.accumulator, + next_alpha_power: computation.alpha_power, + circuit_digest: relation.shape.circuit.digest(), + commitment_root: computation.root, + proof_bundle_bytes, + }) +} + +pub fn verify_transcript_bound_pcs_reduction_conformance( + artifact: &TranscriptBoundPcsReductionArtifactV1, +) -> Result<()> { + let challenges = artifact.replay.challenges()?; + ensure_transcript_binds_opening(challenges, &artifact.opening)?; + let computation = compute_pcs_reduction(&artifact.opening)?; + if artifact.reduced_accumulator != computation.accumulator + || artifact.next_alpha_power != computation.alpha_power + || artifact.commitment_root != computation.root + { + bail!("transcript-bound PCS artifact carries the wrong native outputs"); + } + let relation = TranscriptBoundPcsReductionRelation::build( + &artifact.replay, + &artifact.opening, + &computation, + challenges, + )?; + if artifact.circuit_digest != relation.shape.circuit.digest() { + bail!("transcript-bound PCS circuit digest mismatch"); + } + verify_fri_circuit( + &relation.shape, + relation.slots, + None, + None, + None, + relation.nu, + &relation.public, + &artifact.proof_bundle_bytes, + TRANSCRIPT_BOUND_PCS_CONFORMANCE_TRANSCRIPT_DOMAIN, + ) +} + +pub fn prove_transcript_bound_fri_commit_phase_conformance( + prefix: &Stage2TranscriptReplayV1, + fri_transcript: &Stage2FriTranscriptReplayV1, + query_number: usize, + query: &FriCommitPhaseQueryV1, +) -> Result { + let challenges = fri_transcript.challenges(prefix)?; + ensure_transcript_binds_fri_query( + fri_transcript, + &challenges, + query_number, + query, + )?; + let computation = compute_commit_phase(query)?; + ensure_final_polynomial(query, &computation)?; + let relation = TranscriptBoundFriCommitPhaseRelation::build( + prefix, + fri_transcript, + &challenges, + query_number, + query, + &computation, + )?; + let proof_bundle_bytes = prove_fri_circuit( + &relation.shape, + relation.slots, + Some(relation.sample_slot), + Some(relation.split_slot), + relation.window_slot, + relation.nu, + &relation.inputs, + &relation.public, + TRANSCRIPT_BOUND_FRI_CONFORMANCE_TRANSCRIPT_DOMAIN, + )?; + Ok(TranscriptBoundFriCommitPhaseArtifactV1 { + prefix: prefix.clone(), + fri_transcript: fri_transcript.clone(), + query_number, + query: query.clone(), + circuit_digest: relation.shape.circuit.digest(), + commitment_roots: computation.roots, + proof_bundle_bytes, + }) +} + +pub fn verify_transcript_bound_fri_commit_phase_conformance( + artifact: &TranscriptBoundFriCommitPhaseArtifactV1, +) -> Result<()> { + let challenges = artifact.fri_transcript.challenges(&artifact.prefix)?; + ensure_transcript_binds_fri_query( + &artifact.fri_transcript, + &challenges, + artifact.query_number, + &artifact.query, + )?; + let computation = compute_commit_phase(&artifact.query)?; + ensure_final_polynomial(&artifact.query, &computation)?; + if artifact.commitment_roots != computation.roots { + bail!("transcript-bound FRI artifact carries the wrong native roots"); + } + let relation = TranscriptBoundFriCommitPhaseRelation::build( + &artifact.prefix, + &artifact.fri_transcript, + &challenges, + artifact.query_number, + &artifact.query, + &computation, + )?; + if artifact.circuit_digest != relation.shape.circuit.digest() { + bail!("transcript-bound FRI circuit digest mismatch"); + } + verify_fri_circuit( + &relation.shape, + relation.slots, + Some(relation.sample_slot), + Some(relation.split_slot), + relation.window_slot, + relation.nu, + &relation.public, + &artifact.proof_bundle_bytes, + TRANSCRIPT_BOUND_FRI_CONFORMANCE_TRANSCRIPT_DOMAIN, + ) +} + +pub fn prove_transcript_bound_fri_queries_conformance( + prefix: &Stage2TranscriptReplayV1, + fri_transcript: &Stage2FriTranscriptReplayV1, + queries: &[FriCommitPhaseQueryV1], +) -> Result { + let challenges = fri_transcript.challenges(prefix)?; + let computations = validate_all_transcript_bound_fri_queries( + fri_transcript, + &challenges, + queries, + )?; + let relation = TranscriptBoundFriCommitPhaseRelation::build_all( + prefix, + fri_transcript, + &challenges, + queries, + &computations, + )?; + let proof_bundle_bytes = prove_fri_circuit( + &relation.shape, + relation.slots, + Some(relation.sample_slot), + Some(relation.split_slot), + relation.window_slot, + relation.nu, + &relation.inputs, + &relation.public, + TRANSCRIPT_BOUND_FRI_QUERIES_CONFORMANCE_TRANSCRIPT_DOMAIN, + )?; + Ok(TranscriptBoundFriQueriesArtifactV1 { + prefix: prefix.clone(), + fri_transcript: fri_transcript.clone(), + queries: queries.to_vec(), + circuit_digest: relation.shape.circuit.digest(), + proof_bundle_bytes, + }) +} + +pub fn verify_transcript_bound_fri_queries_conformance( + artifact: &TranscriptBoundFriQueriesArtifactV1, +) -> Result<()> { + let challenges = artifact.fri_transcript.challenges(&artifact.prefix)?; + let computations = validate_all_transcript_bound_fri_queries( + &artifact.fri_transcript, + &challenges, + &artifact.queries, + )?; + let relation = TranscriptBoundFriCommitPhaseRelation::build_all( + &artifact.prefix, + &artifact.fri_transcript, + &challenges, + &artifact.queries, + &computations, + )?; + if artifact.circuit_digest != relation.shape.circuit.digest() { + bail!("all-query transcript-bound FRI circuit digest mismatch"); + } + verify_fri_circuit( + &relation.shape, + relation.slots, + Some(relation.sample_slot), + Some(relation.split_slot), + relation.window_slot, + relation.nu, + &relation.public, + &artifact.proof_bundle_bytes, + TRANSCRIPT_BOUND_FRI_QUERIES_CONFORMANCE_TRANSCRIPT_DOMAIN, + ) +} + +pub fn prove_transcript_bound_pcs_fri_queries_conformance( + prefix: &Stage2TranscriptReplayV1, + fri_transcript: &Stage2FriTranscriptReplayV1, + pcs_instance: &Stage2PcsInstanceV1, + queries: &[TranscriptBoundPcsFriQueryV1], +) -> Result { + let prefix_challenges = prefix.challenges()?; + let fri_challenges = fri_transcript.challenges(prefix)?; + let (fri_computations, pcs_computations) = + validate_all_transcript_bound_pcs_fri_queries( + prefix, + fri_transcript, + &fri_challenges, + prefix_challenges, + pcs_instance, + queries, + )?; + let relation = TranscriptBoundFriCommitPhaseRelation::build_all_with_pcs( + prefix, + fri_transcript, + &fri_challenges, + pcs_instance, + queries, + &fri_computations, + &pcs_computations, + )?; + let proof_bundle_bytes = prove_fri_circuit( + &relation.shape, + relation.slots, + Some(relation.sample_slot), + Some(relation.split_slot), + relation.window_slot, + relation.nu, + &relation.inputs, + &relation.public, + TRANSCRIPT_BOUND_PCS_FRI_QUERIES_CONFORMANCE_TRANSCRIPT_DOMAIN, + )?; + Ok(TranscriptBoundPcsFriQueriesArtifactV1 { + prefix: prefix.clone(), + fri_transcript: fri_transcript.clone(), + pcs_instance: pcs_instance.clone(), + queries: queries.to_vec(), + circuit_digest: relation.shape.circuit.digest(), + proof_bundle_bytes, + }) +} + +pub fn verify_transcript_bound_pcs_fri_queries_conformance( + artifact: &TranscriptBoundPcsFriQueriesArtifactV1, +) -> Result<()> { + let prefix_challenges = artifact.prefix.challenges()?; + let fri_challenges = artifact.fri_transcript.challenges(&artifact.prefix)?; + let (fri_computations, pcs_computations) = + validate_all_transcript_bound_pcs_fri_queries( + &artifact.prefix, + &artifact.fri_transcript, + &fri_challenges, + prefix_challenges, + &artifact.pcs_instance, + &artifact.queries, + )?; + let relation = TranscriptBoundFriCommitPhaseRelation::build_all_with_pcs( + &artifact.prefix, + &artifact.fri_transcript, + &fri_challenges, + &artifact.pcs_instance, + &artifact.queries, + &fri_computations, + &pcs_computations, + )?; + if artifact.circuit_digest != relation.shape.circuit.digest() { + bail!("transcript-bound PCS/FRI all-query circuit digest mismatch"); + } + verify_fri_circuit( + &relation.shape, + relation.slots, + Some(relation.sample_slot), + Some(relation.split_slot), + relation.window_slot, + relation.nu, + &relation.public, + &artifact.proof_bundle_bytes, + TRANSCRIPT_BOUND_PCS_FRI_QUERIES_CONFORMANCE_TRANSCRIPT_DOMAIN, + ) +} + +pub fn prove_stage2_air_pcs_fri_conformance( + witness: &Stage2AirPcsFriWitnessV1, +) -> Result { + prove_stage2_air_pcs_fri_with_domain( + witness, + STAGE2_AIR_PCS_FRI_CONFORMANCE_TRANSCRIPT_DOMAIN, + ) +} + +pub(crate) fn prove_stage2_air_pcs_fri_production( + witness: &Stage2AirPcsFriWitnessV1, +) -> Result { + prove_stage2_air_pcs_fri_with_domain(witness, crate::STAGE3_TRANSCRIPT_DOMAIN) +} + +fn prove_stage2_air_pcs_fri_with_domain( + witness: &Stage2AirPcsFriWitnessV1, + transcript_domain: &[u8], +) -> Result { + let relation = build_stage2_air_pcs_fri_relation(witness)?; + let proof_bundle_bytes = prove_fri_circuit( + &relation.shape, + relation.slots, + Some(relation.sample_slot), + Some(relation.split_slot), + relation.window_slot, + relation.nu, + &relation.inputs, + &relation.public, + transcript_domain, + )?; + Stage2AirPcsFriArtifactV1::from_parts( + witness.clone(), + relation.shape.circuit.digest(), + proof_bundle_bytes, + ) +} + +fn build_stage2_air_pcs_fri_relation( + witness: &Stage2AirPcsFriWitnessV1, +) -> Result { + let pcs_fri = &witness.pcs_fri; + let prefix_challenges = pcs_fri.prefix.challenges()?; + let fri_challenges = pcs_fri.fri_transcript.challenges(&pcs_fri.prefix)?; + let (fri_computations, pcs_computations) = + validate_all_transcript_bound_pcs_fri_queries( + &pcs_fri.prefix, + &pcs_fri.fri_transcript, + &fri_challenges, + prefix_challenges, + &pcs_fri.pcs_instance, + &pcs_fri.queries, + )?; + let relation = + TranscriptBoundFriCommitPhaseRelation::build_all_with_pcs_and_air( + &pcs_fri.prefix, + &pcs_fri.fri_transcript, + &fri_challenges, + &pcs_fri.pcs_instance, + &witness.air, + &pcs_fri.queries, + &fri_computations, + &pcs_computations, + )?; + Ok(relation) +} + +pub(crate) fn stage2_air_pcs_fri_circuit_digest( + witness: &Stage2AirPcsFriWitnessV1, +) -> Result<[u8; 32]> { + Ok(build_stage2_air_pcs_fri_relation(witness)?.shape.circuit.digest()) +} + +pub fn verify_stage2_air_pcs_fri_conformance( + artifact: &Stage2AirPcsFriArtifactV1, +) -> Result<()> { + verify_stage2_air_pcs_fri_with_domain( + artifact, + STAGE2_AIR_PCS_FRI_CONFORMANCE_TRANSCRIPT_DOMAIN, + ) +} + +pub(crate) fn verify_stage2_air_pcs_fri_production( + artifact: &Stage2AirPcsFriArtifactV1, +) -> Result<()> { + verify_stage2_air_pcs_fri_with_domain( + artifact, + crate::STAGE3_TRANSCRIPT_DOMAIN, + ) +} + +fn verify_stage2_air_pcs_fri_with_domain( + artifact: &Stage2AirPcsFriArtifactV1, + transcript_domain: &[u8], +) -> Result<()> { + let witness = &artifact.witness; + let relation = build_stage2_air_pcs_fri_relation(witness)?; + if artifact.circuit_digest != relation.shape.circuit.digest() { + bail!("Stage 2 AIR/PCS/FRI circuit digest mismatch"); + } + verify_fri_circuit( + &relation.shape, + relation.slots, + Some(relation.sample_slot), + Some(relation.split_slot), + relation.window_slot, + relation.nu, + &relation.public, + &artifact.proof_bundle_bytes, + transcript_domain, + ) +} + +pub fn verify_stage2_air_pcs_fri_conformance_for( + artifact: &Stage2AirPcsFriArtifactV1, + expected: &Stage2RootStatementV1, +) -> Result<()> { + let expected_bytes = expected.to_bytes(); + if artifact.witness.air.statement_prefix != expected_bytes[..80] { + bail!("Stage 2 AIR/PCS/FRI proof uses a different vk or FRI prefix"); + } + if artifact.witness.air.statement_digest != expected.digest() { + bail!("Stage 2 AIR/PCS/FRI proof targets a different Stage 2 root"); + } + verify_stage2_air_pcs_fri_conformance(artifact) +} + +fn validate_all_transcript_bound_pcs_fri_queries( + prefix: &Stage2TranscriptReplayV1, + fri_transcript: &Stage2FriTranscriptReplayV1, + fri_challenges: &Stage2FriTranscriptChallengesV1, + prefix_challenges: crate::Stage2TranscriptChallengesV1, + pcs_instance: &Stage2PcsInstanceV1, + queries: &[TranscriptBoundPcsFriQueryV1], +) -> Result<(Vec, Vec)> { + validate_stage2_pcs_instance(prefix, pcs_instance)?; + if queries.len() != fri_transcript.num_queries + || queries.len() != fri_challenges.query_indices.len() + { + bail!( + "all-query PCS/FRI relation has {} queries; transcript requires {}", + queries.len(), + fri_transcript.num_queries + ); + } + let mut fri_computations = Vec::with_capacity(queries.len()); + let mut pcs_computations = Vec::with_capacity(queries.len()); + for (query_number, query) in queries.iter().enumerate() { + ensure_transcript_binds_fri_query( + fri_transcript, + fri_challenges, + query_number, + &query.fri, + )?; + let pcs_computation = + compute_stage2_pcs_query(prefix, pcs_instance, query, prefix_challenges)?; + ensure_stage2_pcs_feeds_fri(pcs_instance, query, &pcs_computation)?; + let fri_computation = compute_commit_phase(&query.fri)?; + ensure_final_polynomial(&query.fri, &fri_computation)?; + fri_computations.push(fri_computation); + pcs_computations.push(pcs_computation); + } + Ok((fri_computations, pcs_computations)) +} + +fn validate_all_transcript_bound_fri_queries( + fri_transcript: &Stage2FriTranscriptReplayV1, + challenges: &Stage2FriTranscriptChallengesV1, + queries: &[FriCommitPhaseQueryV1], +) -> Result> { + if queries.len() != fri_transcript.num_queries + || queries.len() != challenges.query_indices.len() + { + bail!( + "all-query FRI relation has {} queries; transcript requires {}", + queries.len(), + fri_transcript.num_queries + ); + } + queries + .iter() + .enumerate() + .map(|(query_number, query)| { + ensure_transcript_binds_fri_query( + fri_transcript, + challenges, + query_number, + query, + )?; + let computation = compute_commit_phase(query)?; + ensure_final_polynomial(query, &computation)?; + Ok(computation) + }) + .collect() +} + +fn ensure_transcript_binds_fri_query( + fri_transcript: &Stage2FriTranscriptReplayV1, + challenges: &Stage2FriTranscriptChallengesV1, + query_number: usize, + query: &FriCommitPhaseQueryV1, +) -> Result<()> { + if query_number >= challenges.query_indices.len() { + bail!("FRI query number {query_number} is out of range"); + } + if fri_transcript.log_arities.iter().any(|&arity| arity != 1) { + bail!("binary FRI composition requires every log arity to equal one"); + } + if query.rounds.len() != challenges.betas.len() + || query.rounds.len() != fri_transcript.commit_phase_commitments.len() + { + bail!("transcript and FRI query round counts disagree"); + } + for (round, (query_round, &beta)) in + query.rounds.iter().zip(&challenges.betas).enumerate() + { + if query_round.beta != beta { + bail!("FRI round {round} beta does not equal the transcript challenge"); + } + } + let query_index = challenges.query_indices[query_number]; + if u64::from(query.query_index) != query_index { + bail!("FRI query index does not equal the transcript-derived index"); + } + if usize::from(fri_transcript.query_index_bits) + != usize::from(query.initial_log_height) + 1 + { + bail!("FRI query height does not equal the transcript sampling width"); + } + if fri_transcript.final_polynomial.as_slice() != [query.final_polynomial] { + bail!("FRI final polynomial does not equal the transcript observation"); + } + if fri_transcript.commit_phase_commitments.iter().any(|cap| cap.len() != 1) { + bail!("current transcript-bound FRI composition requires cap height zero"); + } + let roots = query.commitment_roots()?; + for (round, (cap, root)) in + fri_transcript.commit_phase_commitments.iter().zip(&roots).enumerate() + { + if cap[0] != *root { + bail!( + "FRI round {round} opening does not authenticate to its transcript cap" + ); + } + } + Ok(()) +} + +fn ensure_transcript_binds_opening( + challenges: crate::Stage2TranscriptChallengesV1, + opening: &PcsReducedOpeningV1, +) -> Result<()> { + if opening.zeta != challenges.zeta { + bail!("PCS zeta does not equal the constrained Stage 2 transcript zeta"); + } + if opening.alpha != challenges.pcs_alpha { + bail!( + "PCS batching challenge does not equal the constrained Stage 2 transcript challenge" + ); + } + Ok(()) +} + +struct FriFoldRelation { + shape: CircuitShape, + blake3_slot: SlotId, + order_slot: SlotId, + add_slot: SlotId, + mul_slot: SlotId, + repack_slot: SlotId, + canonical_slot: SlotId, + equality_slot: SlotId, +} + +#[derive(Clone, Copy)] +struct FriTableSlots { + blake3: SlotId, + order: SlotId, + add: SlotId, + mul: SlotId, + repack: SlotId, + canonical: SlotId, + equality: SlotId, + field_sample: Option, +} + +impl FriFoldRelation { + fn build(log_height: u8) -> Result { + validate_log_height(log_height)?; + let mut builder = ShapeBuilder::new(NU); + let arithmetic = GoldilocksCircuitSlots::declare(&mut builder, NU); + let blake3_slot = builder.slot(Blake3Gate { nu: NU }); + let order_slot = builder.slot(DigestOrderGate { nu: NU }); + let equality_slot = builder.slot(F128EqualityGate { nu: NU }); + let data_zero = builder.fixed_public_input(F128::ZERO); + let equality_zero = builder.fixed_public_input(F128::ZERO); + + let packed_iv = pack8(&IV); + let iv = [ + builder.fixed_public_input(packed_iv[0]), + builder.fixed_public_input(packed_iv[1]), + ]; + let leaf_params = builder.fixed_public_input(pack_params( + 0, + 32, + CHUNK_START | CHUNK_END | ROOT, + )); + let node_params = builder.fixed_public_input(pack_params( + 0, + 64, + CHUNK_START | CHUNK_END | ROOT, + )); + let one = builder.fixed_public_input(F128::new(1, 0)); + let factor_wires: Vec<_> = twiddle_factors(log_height) + .into_iter() + .map(|factor| builder.fixed_public_input(F128::new(factor, 0))) + .collect(); + + let folded = builder.public_input(); + let sibling = builder.public_input(); + let beta = builder.public_input(); + let index_bits: Vec<_> = + (0..=log_height).map(|_| builder.public_input()).collect(); + let path: Vec<_> = (0..log_height) + .map(|_| [builder.public_input(), builder.public_input()]) + .collect(); + let folded_result = builder.public_input(); + + let root = constrain_authenticated_fold( + &mut builder, + &arithmetic, + blake3_slot, + order_slot, + equality_slot, + data_zero, + equality_zero, + iv, + leaf_params, + node_params, + one, + &factor_wires, + folded, + sibling, + beta, + &index_bits, + &path, + folded_result, + ); + + builder.publish(root[0]); + builder.publish(root[1]); + let shape = builder.finish().map_err(|error| { + anyhow::anyhow!("build Flock authenticated FRI-fold circuit: {error:?}") + })?; + Ok(Self { + shape, + blake3_slot, + order_slot, + add_slot: arithmetic.add, + mul_slot: arithmetic.mul, + repack_slot: arithmetic.repack, + canonical_slot: arithmetic.canonical, + equality_slot, + }) + } + + fn table_slots(&self) -> FriTableSlots { + FriTableSlots { + blake3: self.blake3_slot, + order: self.order_slot, + add: self.add_slot, + mul: self.mul_slot, + repack: self.repack_slot, + canonical: self.canonical_slot, + equality: self.equality_slot, + field_sample: None, + } + } +} + +struct FriCommitPhaseRelation { + shape: CircuitShape, + slots: FriTableSlots, + nu: usize, +} + +struct FriCommitPhaseRoundWires { + sibling: Wire, + beta: Wire, + reduced_opening: Option, + path: Vec<[Wire; 2]>, + result: Wire, +} + +impl FriCommitPhaseRelation { + fn build(query: &FriCommitPhaseQueryV1) -> Result { + validate_commit_phase_structure(query)?; + let nu = commit_phase_nu(query); + let mut builder = ShapeBuilder::new(nu); + let arithmetic = GoldilocksCircuitSlots::declare(&mut builder, nu); + let blake3 = builder.slot(Blake3Gate { nu }); + let order = builder.slot(DigestOrderGate { nu }); + let equality = builder.slot(F128EqualityGate { nu }); + let slots = FriTableSlots { + blake3, + order, + add: arithmetic.add, + mul: arithmetic.mul, + repack: arithmetic.repack, + canonical: arithmetic.canonical, + equality, + field_sample: None, + }; + let data_zero = builder.fixed_public_input(F128::ZERO); + let equality_zero = builder.fixed_public_input(F128::ZERO); + let packed_iv = pack8(&IV); + let iv = [ + builder.fixed_public_input(packed_iv[0]), + builder.fixed_public_input(packed_iv[1]), + ]; + let leaf_params = builder.fixed_public_input(pack_params( + 0, + 32, + CHUNK_START | CHUNK_END | ROOT, + )); + let node_params = builder.fixed_public_input(pack_params( + 0, + 64, + CHUNK_START | CHUNK_END | ROOT, + )); + let one = builder.fixed_public_input(F128::new(1, 0)); + let factor_wires: Vec> = (0..query.rounds.len()) + .map(|round| { + let log_height = query.initial_log_height - round as u8; + twiddle_factors(log_height) + .into_iter() + .map(|factor| builder.fixed_public_input(F128::new(factor, 0))) + .collect() + }) + .collect(); + + // Declare all free values before publishing computed roots, keeping the + // public layout equal to `inputs || roots`. + let initial_folded = builder.public_input(); + let index_bits: Vec<_> = + (0..=query.initial_log_height).map(|_| builder.public_input()).collect(); + let round_wires: Vec<_> = (0..query.rounds.len()) + .map(|round| { + let log_height = usize::from(query.initial_log_height) - round; + FriCommitPhaseRoundWires { + sibling: builder.public_input(), + beta: builder.public_input(), + reduced_opening: query.rounds[round] + .reduced_opening + .map(|_| builder.public_input()), + path: (0..log_height) + .map(|_| [builder.public_input(), builder.public_input()]) + .collect(), + result: builder.public_input(), + } + }) + .collect(); + let final_polynomial = builder.public_input(); + + let mut folded = initial_folded; + for (round, wires) in round_wires.iter().enumerate() { + let root = constrain_authenticated_fold( + &mut builder, + &arithmetic, + blake3, + order, + equality, + data_zero, + equality_zero, + iv, + leaf_params, + node_params, + one, + &factor_wires[round], + folded, + wires.sibling, + wires.beta, + &index_bits[round..], + &wires.path, + wires.result, + ); + builder.publish(root[0]); + builder.publish(root[1]); + folded = if let Some(reduced_opening) = wires.reduced_opening { + let beta_squared = + arithmetic.ext2_mul(&mut builder, wires.beta, wires.beta); + let rollin = + arithmetic.ext2_mul(&mut builder, beta_squared, reduced_opening); + arithmetic.add(&mut builder, wires.result, rollin) + } else { + wires.result + }; + } + let final_residual = builder.gate(equality, &[folded, final_polynomial])[0]; + builder.connect(final_residual, equality_zero); + + let shape = builder.finish().map_err(|error| { + anyhow::anyhow!("build Flock FRI commit-phase circuit: {error:?}") + })?; + Ok(Self { shape, slots, nu }) + } +} + +struct PcsReductionRelation { + shape: CircuitShape, + slots: FriTableSlots, + nu: usize, +} + +impl PcsReductionRelation { + fn build(opening: &PcsReducedOpeningV1) -> Result { + validate_pcs_reduction(opening)?; + let nu = pcs_reduction_nu(opening); + let mut builder = ShapeBuilder::new(nu); + let arithmetic = GoldilocksCircuitSlots::declare(&mut builder, nu); + let blake3 = builder.slot(Blake3Gate { nu }); + let order = builder.slot(DigestOrderGate { nu }); + let equality = builder.slot(F128EqualityGate { nu }); + let slots = FriTableSlots { + blake3, + order, + add: arithmetic.add, + mul: arithmetic.mul, + repack: arithmetic.repack, + canonical: arithmetic.canonical, + equality, + field_sample: None, + }; + let data_zero = builder.fixed_public_input(F128::ZERO); + let equality_zero = builder.fixed_public_input(F128::ZERO); + let packed_iv = pack8(&IV); + let iv = [ + builder.fixed_public_input(packed_iv[0]), + builder.fixed_public_input(packed_iv[1]), + ]; + let leaf_trace = hash_trace(opening.opened_values.len() * 8); + let leaf_params: Vec<_> = leaf_trace + .rows + .iter() + .map(|&(_cv, _message, counter, block_len, flags)| { + builder.fixed_public_input(pack_params(counter, block_len, flags)) + }) + .collect(); + let node_params = builder.fixed_public_input(pack_params( + 0, + 64, + CHUNK_START | CHUNK_END | ROOT, + )); + let one = builder.fixed_public_input(F128::new(1, 0)); + let coset_shift = builder.fixed_public_input(F128::new(7, 0)); + let factor_wires: Vec<_> = pcs_x_factors(opening.log_height) + .into_iter() + .map(|factor| builder.fixed_public_input(F128::new(factor, 0))) + .collect(); + + let packed_values: Vec<_> = + opening.opened_values.chunks(2).map(|_| builder.public_input()).collect(); + let opened_at_z: Vec<_> = + opening.opened_at_z.iter().map(|_| builder.public_input()).collect(); + let zeta = builder.public_input(); + let alpha = builder.public_input(); + let initial_alpha_power = builder.public_input(); + let initial_accumulator = builder.public_input(); + let index_bits: Vec<_> = + (0..opening.log_height).map(|_| builder.public_input()).collect(); + let path: Vec<_> = (0..opening.log_height) + .map(|_| [builder.public_input(), builder.public_input()]) + .collect(); + let denominator = builder.public_input(); + let quotients: Vec<_> = + opening.opened_values.iter().map(|_| builder.public_input()).collect(); + let reduced_accumulator = builder.public_input(); + let next_alpha_power = builder.public_input(); + + for value in [zeta, alpha, initial_alpha_power, initial_accumulator] { + arithmetic.assert_canonical(&mut builder, value); + } + for &value in &opened_at_z { + arithmetic.assert_canonical(&mut builder, value); + } + arithmetic.assert_canonical(&mut builder, denominator); + for "ient in "ients { + arithmetic.assert_canonical(&mut builder, quotient); + } + + let mut px_values = Vec::with_capacity(opening.opened_values.len()); + for (packed_index, packed) in packed_values.iter().enumerate() { + arithmetic.assert_canonical(&mut builder, *packed); + let lanes = builder.gate(arithmetic.repack, &[*packed, data_zero]); + px_values.push(lanes[3]); + if 2 * packed_index + 1 < opening.opened_values.len() { + let high = builder.gate(arithmetic.repack, &[lanes[1], data_zero])[3]; + px_values.push(high); + } else { + let high = builder.gate(arithmetic.repack, &[lanes[1], data_zero])[3]; + let padding_residual = builder.gate(equality, &[high, data_zero])[0]; + builder.connect(padding_residual, equality_zero); + } + } + + let mut x = coset_shift; + for (bit, factor) in index_bits.iter().zip(&factor_wires) { + let selected = + builder.gate(order, &[*bit, one, data_zero, *factor, data_zero])[0]; + x = arithmetic.ext2_mul(&mut builder, x, selected); + } + let denominator_check = arithmetic.add(&mut builder, denominator, x); + let denominator_residual = + builder.gate(equality, &[denominator_check, zeta])[0]; + builder.connect(denominator_residual, equality_zero); + + let mut accumulator = initial_accumulator; + let mut alpha_power = initial_alpha_power; + for ((px, pz), quotient) in + px_values.iter().zip(&opened_at_z).zip("ients) + { + let quotient_product = + arithmetic.ext2_mul(&mut builder, denominator, *quotient); + let reconstructed = arithmetic.add(&mut builder, quotient_product, *px); + let quotient_residual = builder.gate(equality, &[reconstructed, *pz])[0]; + builder.connect(quotient_residual, equality_zero); + let term = arithmetic.ext2_mul(&mut builder, alpha_power, *quotient); + accumulator = arithmetic.add(&mut builder, accumulator, term); + alpha_power = arithmetic.ext2_mul(&mut builder, alpha_power, alpha); + } + let accumulator_residual = + builder.gate(equality, &[accumulator, reduced_accumulator])[0]; + builder.connect(accumulator_residual, equality_zero); + let alpha_power_residual = + builder.gate(equality, &[alpha_power, next_alpha_power])[0]; + builder.connect(alpha_power_residual, equality_zero); + + let mut current = constrain_hash( + &mut builder, + blake3, + &leaf_trace, + &leaf_params, + iv, + data_zero, + &packed_values, + )?; + for (level, sibling) in path.iter().enumerate() { + let ordered = builder.gate( + order, + &[index_bits[level], current[0], current[1], sibling[0], sibling[1]], + ); + let parent = builder.gate( + blake3, + &[ + iv[0], + iv[1], + ordered[0], + ordered[1], + ordered[2], + ordered[3], + node_params, + ], + ); + current = [parent[0], parent[1]]; + } + builder.publish(current[0]); + builder.publish(current[1]); + let shape = builder.finish().map_err(|error| { + anyhow::anyhow!("build Flock PCS-reduction circuit: {error:?}") + })?; + Ok(Self { shape, slots, nu }) + } +} + +struct TranscriptBoundPcsReductionRelation { + shape: CircuitShape, + slots: FriTableSlots, + nu: usize, + inputs: Vec, + public: Vec, +} + +impl TranscriptBoundPcsReductionRelation { + fn build( + replay: &Stage2TranscriptReplayV1, + opening: &PcsReducedOpeningV1, + computation: &PcsReductionComputation, + challenges: crate::Stage2TranscriptChallengesV1, + ) -> Result { + validate_pcs_reduction(opening)?; + ensure_transcript_binds_opening(challenges, opening)?; + let transcript_capacity = 1usize << transcript_nu(replay)?; + let pcs_capacity = 1usize << pcs_reduction_nu(opening); + let nu = usize::try_from( + transcript_capacity + .checked_add(pcs_capacity) + .ok_or_else(|| anyhow::anyhow!("transcript-bound PCS row overflow"))? + .next_power_of_two() + .ilog2(), + ) + .expect("PCS row logarithm fits usize") + .max(NU); + let mut builder = ShapeBuilder::new(nu); + let arithmetic = GoldilocksCircuitSlots::declare(&mut builder, nu); + let blake3 = builder.slot(Blake3Gate { nu }); + let order = builder.slot(DigestOrderGate { nu }); + let equality = builder.slot(F128EqualityGate { nu }); + let sample_slot = builder.slot(GoldilocksSampleGate { nu }); + let slots = FriTableSlots { + blake3, + order, + add: arithmetic.add, + mul: arithmetic.mul, + repack: arithmetic.repack, + canonical: arithmetic.canonical, + equality, + field_sample: Some(sample_slot), + }; + + // `GoldilocksCircuitSlots::declare` creates its fixed canonical zero first. + let mut inputs = vec![F128::ZERO]; + let transcript = constrain_stage2_transcript( + &mut builder, + TranscriptCircuitSlots { + blake3, + sample: sample_slot, + canonical: arithmetic.canonical, + }, + replay, + nu, + )?; + inputs.extend_from_slice(&transcript.inputs); + for challenge in transcript.challenges.all() { + builder.publish(challenge); + } + let mut public = inputs.clone(); + public.extend(transcript_challenge_words(challenges)); + + let data_zero = + record_fixed(&mut builder, &mut inputs, &mut public, F128::ZERO); + let equality_zero = + record_fixed(&mut builder, &mut inputs, &mut public, F128::ZERO); + let packed_iv = pack8(&IV); + let iv = [ + record_fixed(&mut builder, &mut inputs, &mut public, packed_iv[0]), + record_fixed(&mut builder, &mut inputs, &mut public, packed_iv[1]), + ]; + let leaf_trace = hash_trace(opening.opened_values.len() * 8); + let leaf_params: Vec<_> = leaf_trace + .rows + .iter() + .map(|&(_cv, _message, counter, block_len, flags)| { + record_fixed( + &mut builder, + &mut inputs, + &mut public, + pack_params(counter, block_len, flags), + ) + }) + .collect(); + let node_params = record_fixed( + &mut builder, + &mut inputs, + &mut public, + pack_params(0, 64, CHUNK_START | CHUNK_END | ROOT), + ); + let one = + record_fixed(&mut builder, &mut inputs, &mut public, F128::new(1, 0)); + let coset_shift = + record_fixed(&mut builder, &mut inputs, &mut public, F128::new(7, 0)); + let factor_wires: Vec<_> = pcs_x_factors(opening.log_height) + .into_iter() + .map(|factor| { + record_fixed( + &mut builder, + &mut inputs, + &mut public, + F128::new(factor, 0), + ) + }) + .collect(); + + let packed_values: Vec<_> = opening + .opened_values + .chunks(2) + .map(|pair| { + record_public( + &mut builder, + &mut inputs, + &mut public, + F128::new(pair[0], pair.get(1).copied().unwrap_or(0)), + ) + }) + .collect(); + let opened_at_z: Vec<_> = opening + .opened_at_z + .iter() + .copied() + .map(|value| { + record_public( + &mut builder, + &mut inputs, + &mut public, + pack_extension(value), + ) + }) + .collect(); + let initial_alpha_power = record_public( + &mut builder, + &mut inputs, + &mut public, + pack_extension(opening.initial_alpha_power), + ); + let initial_accumulator = record_public( + &mut builder, + &mut inputs, + &mut public, + pack_extension(opening.initial_accumulator), + ); + let index_bits: Vec<_> = (0..opening.log_height) + .map(|bit| { + record_public( + &mut builder, + &mut inputs, + &mut public, + F128::new(u64::from((opening.query_index >> bit) & 1), 0), + ) + }) + .collect(); + let path: Vec<_> = opening + .opening_proof + .iter() + .map(|sibling| { + let digest = pack_digest(sibling); + [ + record_public(&mut builder, &mut inputs, &mut public, digest[0]), + record_public(&mut builder, &mut inputs, &mut public, digest[1]), + ] + }) + .collect(); + let denominator = record_public( + &mut builder, + &mut inputs, + &mut public, + pack_extension(computation.denominator), + ); + let quotients: Vec<_> = computation + .quotients + .iter() + .copied() + .map(|quotient| { + record_public( + &mut builder, + &mut inputs, + &mut public, + pack_extension(quotient), + ) + }) + .collect(); + let reduced_accumulator = record_public( + &mut builder, + &mut inputs, + &mut public, + pack_extension(computation.accumulator), + ); + let next_alpha_power = record_public( + &mut builder, + &mut inputs, + &mut public, + pack_extension(computation.alpha_power), + ); + + let zeta = transcript.challenges.zeta; + let alpha = transcript.challenges.pcs_alpha; + for value in [zeta, alpha, initial_alpha_power, initial_accumulator] { + arithmetic.assert_canonical(&mut builder, value); + } + for &value in &opened_at_z { + arithmetic.assert_canonical(&mut builder, value); + } + arithmetic.assert_canonical(&mut builder, denominator); + for "ient in "ients { + arithmetic.assert_canonical(&mut builder, quotient); + } + + let mut px_values = Vec::with_capacity(opening.opened_values.len()); + for (packed_index, packed) in packed_values.iter().enumerate() { + arithmetic.assert_canonical(&mut builder, *packed); + let lanes = builder.gate(arithmetic.repack, &[*packed, data_zero]); + px_values.push(lanes[3]); + if 2 * packed_index + 1 < opening.opened_values.len() { + let high = builder.gate(arithmetic.repack, &[lanes[1], data_zero])[3]; + px_values.push(high); + } else { + let high = builder.gate(arithmetic.repack, &[lanes[1], data_zero])[3]; + let padding_residual = builder.gate(equality, &[high, data_zero])[0]; + builder.connect(padding_residual, equality_zero); + } + } + + let mut x = coset_shift; + for (bit, factor) in index_bits.iter().zip(&factor_wires) { + let selected = + builder.gate(order, &[*bit, one, data_zero, *factor, data_zero])[0]; + x = arithmetic.ext2_mul(&mut builder, x, selected); + } + let denominator_check = arithmetic.add(&mut builder, denominator, x); + let denominator_residual = + builder.gate(equality, &[denominator_check, zeta])[0]; + builder.connect(denominator_residual, equality_zero); + + let mut accumulator = initial_accumulator; + let mut alpha_power = initial_alpha_power; + for ((px, pz), quotient) in + px_values.iter().zip(&opened_at_z).zip("ients) + { + let quotient_product = + arithmetic.ext2_mul(&mut builder, denominator, *quotient); + let reconstructed = arithmetic.add(&mut builder, quotient_product, *px); + let quotient_residual = builder.gate(equality, &[reconstructed, *pz])[0]; + builder.connect(quotient_residual, equality_zero); + let term = arithmetic.ext2_mul(&mut builder, alpha_power, *quotient); + accumulator = arithmetic.add(&mut builder, accumulator, term); + alpha_power = arithmetic.ext2_mul(&mut builder, alpha_power, alpha); + } + let accumulator_residual = + builder.gate(equality, &[accumulator, reduced_accumulator])[0]; + builder.connect(accumulator_residual, equality_zero); + let alpha_power_residual = + builder.gate(equality, &[alpha_power, next_alpha_power])[0]; + builder.connect(alpha_power_residual, equality_zero); + + let mut current = constrain_hash( + &mut builder, + blake3, + &leaf_trace, + &leaf_params, + iv, + data_zero, + &packed_values, + )?; + for (level, sibling) in path.iter().enumerate() { + let ordered = builder.gate( + order, + &[index_bits[level], current[0], current[1], sibling[0], sibling[1]], + ); + let parent = builder.gate( + blake3, + &[ + iv[0], + iv[1], + ordered[0], + ordered[1], + ordered[2], + ordered[3], + node_params, + ], + ); + current = [parent[0], parent[1]]; + } + builder.publish(current[0]); + builder.publish(current[1]); + public.extend_from_slice(&pack_digest(&computation.root)); + + let shape = builder.finish().map_err(|error| { + anyhow::anyhow!("build transcript-bound PCS circuit: {error:?}") + })?; + Ok(Self { shape, slots, nu, inputs, public }) + } +} + +struct TranscriptBoundFriCommitPhaseRelation { + shape: CircuitShape, + slots: FriTableSlots, + sample_slot: SlotId, + split_slot: SlotId, + window_slot: Option, + nu: usize, + inputs: Vec, + public: Vec, +} + +#[derive(Clone, Copy)] +struct SelectedFriQuery<'a> { + query_number: usize, + query: &'a FriCommitPhaseQueryV1, + computation: &'a FriCommitPhaseComputation, + pcs_query: Option<&'a Stage2PcsQueryV1>, + pcs_computation: Option<&'a Stage2PcsQueryComputation>, +} + +impl TranscriptBoundFriCommitPhaseRelation { + #[allow(clippy::too_many_arguments)] + fn build( + prefix: &Stage2TranscriptReplayV1, + fri_transcript: &Stage2FriTranscriptReplayV1, + challenges: &Stage2FriTranscriptChallengesV1, + query_number: usize, + query: &FriCommitPhaseQueryV1, + computation: &FriCommitPhaseComputation, + ) -> Result { + Self::build_selected( + prefix, + fri_transcript, + challenges, + &[SelectedFriQuery { + query_number, + query, + computation, + pcs_query: None, + pcs_computation: None, + }], + None, + None, + ) + } + + fn build_all( + prefix: &Stage2TranscriptReplayV1, + fri_transcript: &Stage2FriTranscriptReplayV1, + challenges: &Stage2FriTranscriptChallengesV1, + queries: &[FriCommitPhaseQueryV1], + computations: &[FriCommitPhaseComputation], + ) -> Result { + if queries.len() != computations.len() { + bail!("FRI query/computation vector lengths disagree"); + } + let selected: Vec<_> = queries + .iter() + .zip(computations) + .enumerate() + .map(|(query_number, (query, computation))| SelectedFriQuery { + query_number, + query, + computation, + pcs_query: None, + pcs_computation: None, + }) + .collect(); + Self::build_selected( + prefix, + fri_transcript, + challenges, + &selected, + None, + None, + ) + } + + fn build_all_with_pcs( + prefix: &Stage2TranscriptReplayV1, + fri_transcript: &Stage2FriTranscriptReplayV1, + challenges: &Stage2FriTranscriptChallengesV1, + pcs_instance: &Stage2PcsInstanceV1, + queries: &[TranscriptBoundPcsFriQueryV1], + fri_computations: &[FriCommitPhaseComputation], + pcs_computations: &[Stage2PcsQueryComputation], + ) -> Result { + if queries.len() != fri_computations.len() + || queries.len() != pcs_computations.len() + { + bail!("PCS/FRI query and computation vector lengths disagree"); + } + let selected: Vec<_> = queries + .iter() + .zip(fri_computations) + .zip(pcs_computations) + .enumerate() + .map(|(query_number, ((query, computation), pcs_computation))| { + SelectedFriQuery { + query_number, + query: &query.fri, + computation, + pcs_query: Some(&query.pcs), + pcs_computation: Some(pcs_computation), + } + }) + .collect(); + Self::build_selected( + prefix, + fri_transcript, + challenges, + &selected, + Some(pcs_instance), + None, + ) + } + + #[allow(clippy::too_many_arguments)] + fn build_all_with_pcs_and_air( + prefix: &Stage2TranscriptReplayV1, + fri_transcript: &Stage2FriTranscriptReplayV1, + challenges: &Stage2FriTranscriptChallengesV1, + pcs_instance: &Stage2PcsInstanceV1, + air: &Stage2AirProgramV1, + queries: &[TranscriptBoundPcsFriQueryV1], + fri_computations: &[FriCommitPhaseComputation], + pcs_computations: &[Stage2PcsQueryComputation], + ) -> Result { + if queries.len() != fri_computations.len() + || queries.len() != pcs_computations.len() + { + bail!("PCS/FRI query and computation vector lengths disagree"); + } + let selected: Vec<_> = queries + .iter() + .zip(fri_computations) + .zip(pcs_computations) + .enumerate() + .map(|(query_number, ((query, computation), pcs_computation))| { + SelectedFriQuery { + query_number, + query: &query.fri, + computation, + pcs_query: Some(&query.pcs), + pcs_computation: Some(pcs_computation), + } + }) + .collect(); + Self::build_selected( + prefix, + fri_transcript, + challenges, + &selected, + Some(pcs_instance), + Some(air), + ) + } + + fn build_selected( + prefix: &Stage2TranscriptReplayV1, + fri_transcript: &Stage2FriTranscriptReplayV1, + challenges: &Stage2FriTranscriptChallengesV1, + selected: &[SelectedFriQuery<'_>], + pcs_instance: Option<&Stage2PcsInstanceV1>, + air: Option<&Stage2AirProgramV1>, + ) -> Result { + if selected.is_empty() { + bail!("transcript-bound FRI relation has no selected queries"); + } + for item in selected { + ensure_transcript_binds_fri_query( + fri_transcript, + challenges, + item.query_number, + item.query, + )?; + ensure_final_polynomial(item.query, item.computation)?; + if item.pcs_query.is_some() != pcs_instance.is_some() + || item.pcs_computation.is_some() != pcs_instance.is_some() + { + bail!("transcript-bound FRI relation has inconsistent PCS inputs"); + } + } + if air.is_some() && pcs_instance.is_none() { + bail!("AIR evaluation requires the transcript-bound PCS instance"); + } + let nu = transcript_bound_fri_nu( + prefix, + fri_transcript, + selected, + pcs_instance, + air, + )?; + let mut builder = ShapeBuilder::new(nu); + let arithmetic = GoldilocksCircuitSlots::declare(&mut builder, nu); + let blake3 = builder.slot(Blake3Gate { nu }); + let order = builder.slot(DigestOrderGate { nu }); + let equality = builder.slot(F128EqualityGate { nu }); + let sample_slot = builder.slot(HashSampleGate { nu }); + let field_sample_slot = builder.slot(GoldilocksSampleGate { nu }); + let split_slot = builder.slot(U64SplitGate { nu }); + let window_slot = pcs_instance.map(|_| builder.slot(ByteWindowGate { nu })); + let slots = FriTableSlots { + blake3, + order, + add: arithmetic.add, + mul: arithmetic.mul, + repack: arithmetic.repack, + canonical: arithmetic.canonical, + equality, + field_sample: Some(field_sample_slot), + }; + + // GoldilocksCircuitSlots declares its canonical-zero fixed input first. + let mut inputs = vec![F128::ZERO]; + let mut public = vec![F128::ZERO]; + let prefix_region = constrain_stage2_transcript( + &mut builder, + TranscriptCircuitSlots { + blake3, + sample: field_sample_slot, + canonical: arithmetic.canonical, + }, + prefix, + nu, + )?; + inputs.extend_from_slice(&prefix_region.inputs); + public.extend_from_slice(&prefix_region.inputs); + for challenge in prefix_region.challenges.all() { + builder.publish(challenge); + } + public.extend(transcript_challenge_words(prefix.challenges()?)); + + let fri_region = constrain_stage2_fri_transcript( + &mut builder, + FriTranscriptCircuitSlots { + blake3, + sample: sample_slot, + field_sample: field_sample_slot, + canonical: arithmetic.canonical, + repack: arithmetic.repack, + split: split_slot, + }, + fri_transcript, + prefix_region.state_digest, + nu, + )?; + inputs.extend_from_slice(&fri_region.inputs); + public.extend_from_slice(&fri_region.inputs); + for &beta in &fri_region.betas { + builder.publish(beta); + } + public.extend(challenges.betas.iter().copied().map(pack_extension)); + for bits in &fri_region.query_index_bits { + for &bit in bits { + builder.publish(bit); + } + } + for &index in &challenges.query_indices { + public.extend( + (0..fri_transcript.query_index_bits) + .map(|bit| F128::new((index >> bit) & 1, 0)), + ); + } + + let data_zero = + record_fixed(&mut builder, &mut inputs, &mut public, F128::ZERO); + let equality_zero = + record_fixed(&mut builder, &mut inputs, &mut public, F128::ZERO); + let packed_iv = pack8(&IV); + let iv = [ + record_fixed(&mut builder, &mut inputs, &mut public, packed_iv[0]), + record_fixed(&mut builder, &mut inputs, &mut public, packed_iv[1]), + ]; + let leaf_params = record_fixed( + &mut builder, + &mut inputs, + &mut public, + pack_params(0, 32, CHUNK_START | CHUNK_END | ROOT), + ); + let node_params = record_fixed( + &mut builder, + &mut inputs, + &mut public, + pack_params(0, 64, CHUNK_START | CHUNK_END | ROOT), + ); + let one = + record_fixed(&mut builder, &mut inputs, &mut public, F128::new(1, 0)); + let fixed = TranscriptBoundFriFixedWires { + blake3, + order, + equality, + data_zero, + equality_zero, + iv, + leaf_params, + node_params, + one, + }; + if let Some(air) = air { + constrain_stage2_air( + &mut builder, + &arithmetic, + blake3, + equality, + equality_zero, + window_slot.expect("AIR byte-window slot declared above"), + data_zero, + one, + iv, + &mut inputs, + &mut public, + &prefix_region, + prefix, + pcs_instance.expect("AIR PCS instance checked above"), + air, + )?; + } + for item in selected { + let reduced_openings = if let Some(instance) = pcs_instance { + Some(constrain_stage2_pcs_query( + &mut builder, + &arithmetic, + fixed, + &mut inputs, + &mut public, + &prefix_region, + &fri_region, + window_slot.expect("PCS byte-window slot declared above"), + instance, + item.query_number, + item.pcs_query.expect("PCS query presence checked above"), + item.pcs_computation.expect("PCS computation presence checked above"), + )?) + } else { + None + }; + constrain_transcript_bound_fri_query( + &mut builder, + &arithmetic, + fixed, + &mut inputs, + &mut public, + &fri_region, + item.query_number, + item.query, + item.computation, + reduced_openings.as_ref(), + ); + } + + let shape = builder.finish().map_err(|error| { + anyhow::anyhow!("build transcript-bound FRI circuit: {error:?}") + })?; + Ok(Self { + shape, + slots, + sample_slot, + split_slot, + window_slot, + nu, + inputs, + public, + }) + } +} + +#[derive(Clone, Copy)] +struct TranscriptBoundFriFixedWires { + blake3: SlotId, + order: SlotId, + equality: SlotId, + data_zero: Wire, + equality_zero: Wire, + iv: [Wire; 2], + leaf_params: Wire, + node_params: Wire, + one: Wire, +} + +#[allow(clippy::too_many_arguments)] +fn constrain_transcript_bound_fri_query( + builder: &mut ShapeBuilder, + arithmetic: &GoldilocksCircuitSlots, + fixed: TranscriptBoundFriFixedWires, + inputs: &mut Vec, + public: &mut Vec, + fri_region: &crate::transcript::FriTranscriptConstraintRegion, + query_number: usize, + query: &FriCommitPhaseQueryV1, + computation: &FriCommitPhaseComputation, + authenticated_reduced_openings: Option<&BTreeMap>, +) { + let factor_wires: Vec> = computation + .round_queries + .iter() + .map(|round| { + twiddle_factors(round.log_height) + .into_iter() + .map(|factor| { + record_fixed(builder, inputs, public, F128::new(factor, 0)) + }) + .collect() + }) + .collect(); + let initial_folded = authenticated_reduced_openings.map_or_else( + || { + record_public( + builder, + inputs, + public, + pack_extension(query.initial_folded), + ) + }, + |openings| openings[&(query.initial_log_height + 1)], + ); + let round_wires: Vec<_> = query + .rounds + .iter() + .zip(&computation.fold_results) + .enumerate() + .map(|(round, (source, &fold_result))| { + let depth = usize::from(query.initial_log_height) - round; + FriCommitPhaseRoundWires { + sibling: record_public( + builder, + inputs, + public, + pack_extension(source.sibling), + ), + // The beta is the transcript wire, not a duplicated query input. + beta: fri_region.betas[round], + reduced_opening: if let Some(openings) = authenticated_reduced_openings + { + let height = query.initial_log_height + - u8::try_from(round).expect("bounded FRI round index"); + openings.get(&height).copied() + } else { + source.reduced_opening.map(|value| { + record_public(builder, inputs, public, pack_extension(value)) + }) + }, + path: source + .opening_proof + .iter() + .take(depth) + .map(|sibling| { + let digest = pack_digest(sibling); + [ + record_public(builder, inputs, public, digest[0]), + record_public(builder, inputs, public, digest[1]), + ] + }) + .collect(), + result: record_public( + builder, + inputs, + public, + pack_extension(fold_result), + ), + } + }) + .collect(); + + let index_bits = &fri_region.query_index_bits[query_number]; + let mut folded = initial_folded; + for (round, wires) in round_wires.iter().enumerate() { + let root = constrain_authenticated_fold( + builder, + arithmetic, + fixed.blake3, + fixed.order, + fixed.equality, + fixed.data_zero, + fixed.equality_zero, + fixed.iv, + fixed.leaf_params, + fixed.node_params, + fixed.one, + &factor_wires[round], + folded, + wires.sibling, + wires.beta, + &index_bits[round..], + &wires.path, + wires.result, + ); + let cap_root = fri_region.commitment_roots[round][0]; + for lane in 0..2 { + let residual = + builder.gate(fixed.equality, &[root[lane], cap_root[lane]])[0]; + builder.connect(residual, fixed.equality_zero); + } + folded = if let Some(reduced_opening) = wires.reduced_opening { + let beta_squared = arithmetic.ext2_mul(builder, wires.beta, wires.beta); + let rollin = arithmetic.ext2_mul(builder, beta_squared, reduced_opening); + arithmetic.add(builder, wires.result, rollin) + } else { + wires.result + }; + } + let final_residual = + builder.gate(fixed.equality, &[folded, fri_region.final_polynomial[0]])[0]; + builder.connect(final_residual, fixed.equality_zero); +} + +struct Stage2PcsRowWires { + lanes: Vec, + base_extensions: Vec, +} + +#[allow(clippy::too_many_arguments)] +fn constrain_stage2_pcs_query( + builder: &mut ShapeBuilder, + arithmetic: &GoldilocksCircuitSlots, + fixed: TranscriptBoundFriFixedWires, + inputs: &mut Vec, + public: &mut Vec, + prefix_region: &crate::transcript::TranscriptConstraintRegion, + fri_region: &crate::transcript::FriTranscriptConstraintRegion, + window: SlotId, + instance: &Stage2PcsInstanceV1, + query_number: usize, + query: &Stage2PcsQueryV1, + computation: &Stage2PcsQueryComputation, +) -> Result> { + let index_bits = &fri_region.query_index_bits[query_number]; + let alpha = prefix_region.challenges.pcs_alpha; + let zeta = prefix_region.challenges.zeta; + arithmetic.assert_canonical(builder, alpha); + arithmetic.assert_canonical(builder, zeta); + + let mut all_rows = Vec::with_capacity(instance.batches.len()); + for (batch, opening) in instance.batches.iter().zip(&query.batch_openings) { + let mut batch_rows = Vec::with_capacity(batch.matrices.len()); + for row in &opening.opened_rows { + let mut lanes = Vec::with_capacity(row.len()); + let mut base_extensions = Vec::with_capacity(row.len()); + for &value in row { + let lane = + record_public(builder, inputs, public, F128::new(value, value)); + arithmetic.assert_canonical(builder, lane); + let extension = + builder.gate(arithmetic.repack, &[lane, fixed.data_zero])[3]; + lanes.push(lane); + base_extensions.push(extension); + } + batch_rows.push(Stage2PcsRowWires { lanes, base_extensions }); + } + all_rows.push(batch_rows); + } + + // Authenticate every multi-height batch. Rows sharing a height are + // concatenated in matrix order before hashing; shorter-height leaves are + // injected on the right after the corresponding path compression. + for (((batch, opening), batch_computation), rows) in instance + .batches + .iter() + .zip(&query.batch_openings) + .zip(&computation.batches) + .zip(&all_rows) + { + let log_batch_height = + batch.matrices.iter().map(|matrix| matrix.log_height).max().unwrap(); + let mut leaves = BTreeMap::new(); + for height in 0..=log_batch_height { + let leaf_lanes: Vec<_> = batch + .matrices + .iter() + .zip(rows) + .filter(|(matrix, _)| matrix.log_height == height) + .flat_map(|(_, row)| row.lanes.iter().copied()) + .collect(); + if leaf_lanes.is_empty() { + continue; + } + let message: Vec<_> = leaf_lanes + .chunks(2) + .map(|pair| { + builder.gate( + arithmetic.repack, + &[pair[0], pair.get(1).copied().unwrap_or(fixed.data_zero)], + )[3] + }) + .collect(); + let trace = hash_trace(leaf_lanes.len() * 8); + let parameters: Vec<_> = trace + .rows + .iter() + .map(|&(_cv, _message, counter, block_len, flags)| { + record_fixed( + builder, + inputs, + public, + pack_params(counter, block_len, flags), + ) + }) + .collect(); + let leaf = constrain_hash( + builder, + fixed.blake3, + &trace, + ¶meters, + fixed.iv, + fixed.data_zero, + &message, + )?; + leaves.insert(height, leaf); + } + + let mut current = leaves[&log_batch_height]; + let bit_offset = usize::from(instance.log_global_height - log_batch_height); + for (level, sibling) in opening.opening_proof.iter().enumerate() { + let sibling = pack_digest(sibling); + let sibling = [ + record_public(builder, inputs, public, sibling[0]), + record_public(builder, inputs, public, sibling[1]), + ]; + let ordered = builder.gate( + fixed.order, + &[ + index_bits[bit_offset + level], + current[0], + current[1], + sibling[0], + sibling[1], + ], + ); + let parent = builder.gate( + fixed.blake3, + &[ + fixed.iv[0], + fixed.iv[1], + ordered[0], + ordered[1], + ordered[2], + ordered[3], + fixed.node_params, + ], + ); + current = [parent[0], parent[1]]; + let next_height = log_batch_height + - 1 + - u8::try_from(level).expect("bounded Merkle path level"); + if let Some(&injected) = leaves.get(&next_height) { + let parent = builder.gate( + fixed.blake3, + &[ + fixed.iv[0], + fixed.iv[1], + current[0], + current[1], + injected[0], + injected[1], + fixed.node_params, + ], + ); + current = [parent[0], parent[1]]; + } + } + let expected = bound_transcript_digest( + builder, + window, + fixed.data_zero, + inputs, + public, + prefix_region, + batch.commitment, + ); + for lane in 0..2 { + let residual = + builder.gate(fixed.equality, &[current[lane], expected[lane]])[0]; + builder.connect(residual, fixed.equality_zero); + } + let _ = batch_computation.root; + } + + let mut buckets: BTreeMap = instance + .batches + .iter() + .flat_map(|batch| batch.matrices.iter().map(|matrix| matrix.log_height)) + .map(|height| (height, (fixed.one, fixed.data_zero))) + .collect(); + let coset_shift = record_fixed(builder, inputs, public, F128::new(7, 0)); + + for (((batch, opening), batch_computation), rows) in instance + .batches + .iter() + .zip(&query.batch_openings) + .zip(&computation.batches) + .zip(&all_rows) + { + for (((matrix, _row_values), matrix_computation), row) in batch + .matrices + .iter() + .zip(&opening.opened_rows) + .zip(&batch_computation.matrices) + .zip(rows) + { + let bit_offset = + usize::from(instance.log_global_height - matrix.log_height); + let mut x = coset_shift; + for (bit, factor) in index_bits[bit_offset..] + .iter() + .take(usize::from(matrix.log_height)) + .zip(pcs_x_factors(matrix.log_height)) + { + let factor = + record_fixed(builder, inputs, public, F128::new(factor, 0)); + let selected = builder.gate( + fixed.order, + &[*bit, fixed.one, fixed.data_zero, factor, fixed.data_zero], + )[0]; + x = arithmetic.ext2_mul(builder, x, selected); + } + + for (point_index, (point_kind, point_computation)) in + matrix.opening_points.iter().zip(&matrix_computation.points).enumerate() + { + let point = match *point_kind { + Stage2PcsOpeningPointV1::Zeta => zeta, + Stage2PcsOpeningPointV1::ZetaNext { log_degree } => { + let generator = Val::TWO_ADIC_GENERATORS[usize::from(log_degree)] + .as_canonical_u64(); + let generator = + record_fixed(builder, inputs, public, F128::new(generator, 0)); + arithmetic.ext2_mul(builder, zeta, generator) + }, + }; + let denominator = record_public( + builder, + inputs, + public, + pack_extension(point_computation.denominator), + ); + arithmetic.assert_canonical(builder, denominator); + let denominator_check = arithmetic.add(builder, denominator, x); + assert_f128_equal( + builder, + fixed.equality, + fixed.equality_zero, + denominator_check, + point, + ); + + let (mut alpha_power, mut accumulator) = buckets[&matrix.log_height]; + for (column, (&p_at_x, "ient_value)) in row + .base_extensions + .iter() + .zip(&point_computation.quotients) + .enumerate() + { + let p_at_z = bound_transcript_extension( + builder, + window, + fixed.data_zero, + inputs, + public, + prefix_region, + matrix.opened_values, + point_index * matrix.width + column, + ); + arithmetic.assert_canonical(builder, p_at_z); + let quotient = record_public( + builder, + inputs, + public, + pack_extension(quotient_value), + ); + arithmetic.assert_canonical(builder, quotient); + let quotient_product = + arithmetic.ext2_mul(builder, denominator, quotient); + let reconstructed = arithmetic.add(builder, quotient_product, p_at_x); + assert_f128_equal( + builder, + fixed.equality, + fixed.equality_zero, + reconstructed, + p_at_z, + ); + let term = arithmetic.ext2_mul(builder, alpha_power, quotient); + accumulator = arithmetic.add(builder, accumulator, term); + alpha_power = arithmetic.ext2_mul(builder, alpha_power, alpha); + } + buckets.insert(matrix.log_height, (alpha_power, accumulator)); + } + } + } + + Ok( + buckets + .into_iter() + .map(|(height, (_, accumulator))| (height, accumulator)) + .collect(), + ) +} + +#[allow(clippy::too_many_arguments)] +pub(crate) fn bound_transcript_extension( + builder: &mut ShapeBuilder, + window: SlotId, + data_zero: Wire, + inputs: &mut Vec, + public: &mut Vec, + region: &crate::transcript::TranscriptConstraintRegion, + binding: Stage2TranscriptByteBindingV1, + extension_offset: usize, +) -> Wire { + bound_transcript_window( + builder, + window, + data_zero, + inputs, + public, + region, + binding, + extension_offset * 16, + ) +} + +fn bound_transcript_digest( + builder: &mut ShapeBuilder, + window: SlotId, + data_zero: Wire, + inputs: &mut Vec, + public: &mut Vec, + region: &crate::transcript::TranscriptConstraintRegion, + binding: Stage2TranscriptByteBindingV1, +) -> [Wire; 2] { + [ + bound_transcript_window( + builder, window, data_zero, inputs, public, region, binding, 0, + ), + bound_transcript_window( + builder, window, data_zero, inputs, public, region, binding, 16, + ), + ] +} + +#[allow(clippy::too_many_arguments)] +pub(crate) fn bound_transcript_window( + builder: &mut ShapeBuilder, + window: SlotId, + data_zero: Wire, + inputs: &mut Vec, + public: &mut Vec, + region: &crate::transcript::TranscriptConstraintRegion, + binding: Stage2TranscriptByteBindingV1, + relative_byte: usize, +) -> Wire { + let byte_offset = binding.byte_offset + relative_byte; + let word_index = byte_offset / 16; + let byte_in_word = byte_offset % 16; + let words = ®ion.observation_words[binding.segment.index()]; + let first = words[word_index]; + let second = words.get(word_index + 1).copied().unwrap_or(data_zero); + let selector = + record_fixed(builder, inputs, public, F128::new(1 << byte_in_word, 0)); + builder.gate(window, &[first, second, selector])[0] +} + +pub(crate) fn assert_f128_equal( + builder: &mut ShapeBuilder, + equality: SlotId, + equality_zero: Wire, + left: Wire, + right: Wire, +) { + let residual = builder.gate(equality, &[left, right])[0]; + builder.connect(residual, equality_zero); +} + +fn transcript_bound_fri_nu( + prefix: &Stage2TranscriptReplayV1, + fri_transcript: &Stage2FriTranscriptReplayV1, + selected: &[SelectedFriQuery<'_>], + pcs_instance: Option<&Stage2PcsInstanceV1>, + air: Option<&Stage2AirProgramV1>, +) -> Result { + let prefix_capacity = 1usize << transcript_nu(prefix)?; + let commit_capacity = selected.iter().try_fold(0usize, |rows, item| { + rows.checked_add(1usize << commit_phase_nu(item.query)).ok_or_else(|| { + anyhow::anyhow!("transcript-bound FRI query row budget overflow") + }) + })?; + let fri_blake3_rows = fri_transcript_blake3_rows(fri_transcript)?; + let fri_split_rows = fri_transcript_split_rows(fri_transcript)?; + let pcs_capacity = if let Some(instance) = pcs_instance { + selected.iter().try_fold(0usize, |rows, item| { + let query = item + .pcs_query + .ok_or_else(|| anyhow::anyhow!("missing PCS query row budget"))?; + rows + .checked_add(1usize << stage2_pcs_query_nu(instance, query)) + .ok_or_else(|| anyhow::anyhow!("PCS query row budget overflow")) + })? + } else { + 0 + }; + let row_budget = prefix_capacity + .checked_add(commit_capacity) + .and_then(|rows| rows.checked_add(fri_blake3_rows)) + .and_then(|rows| rows.checked_add(fri_split_rows)) + .and_then(|rows| rows.checked_add(pcs_capacity)) + .and_then(|rows| { + rows.checked_add(air.map_or(0, Stage2AirProgramV1::row_budget)) + }) + .ok_or_else(|| { + anyhow::anyhow!("transcript-bound FRI row budget overflow") + })?; + Ok( + usize::try_from(row_budget.max(1).next_power_of_two().ilog2()) + .expect("FRI row logarithm fits usize") + .max(NU), + ) +} + +fn stage2_pcs_query_nu( + instance: &Stage2PcsInstanceV1, + query: &Stage2PcsQueryV1, +) -> usize { + let values = query + .batch_openings + .iter() + .flat_map(|batch| &batch.opened_rows) + .map(Vec::len) + .sum::(); + let points = instance + .batches + .iter() + .flat_map(|batch| &batch.matrices) + .map(|matrix| matrix.opening_points.len()) + .sum::(); + let path_nodes = query + .batch_openings + .iter() + .map(|batch| batch.opening_proof.len()) + .sum::(); + let leaf_rows = instance + .batches + .iter() + .zip(&query.batch_openings) + .map(|(batch, opening)| { + (0..=batch.matrices.iter().map(|matrix| matrix.log_height).max().unwrap()) + .filter(|height| { + batch.matrices.iter().any(|matrix| matrix.log_height == *height) + }) + .map(|height| { + let width = batch + .matrices + .iter() + .zip(&opening.opened_rows) + .filter(|(matrix, _)| matrix.log_height == height) + .map(|(_, row)| row.len()) + .sum::(); + hash_trace(width * 8).rows.len() + }) + .sum::() + }) + .sum::(); + let row_bound = values + .saturating_mul(256) + .saturating_add(points.saturating_mul(128)) + .saturating_add(path_nodes.saturating_mul(64)) + .saturating_add(leaf_rows) + .max(1); + usize::try_from(row_bound.next_power_of_two().ilog2()).unwrap().max(NU) +} + +pub(crate) fn record_fixed( + builder: &mut ShapeBuilder, + inputs: &mut Vec, + public: &mut Vec, + value: F128, +) -> Wire { + inputs.push(value); + public.push(value); + builder.fixed_public_input(value) +} + +fn record_public( + builder: &mut ShapeBuilder, + inputs: &mut Vec, + public: &mut Vec, + value: F128, +) -> Wire { + inputs.push(value); + public.push(value); + builder.public_input() +} + +#[allow(clippy::too_many_arguments)] +fn constrain_authenticated_fold( + builder: &mut ShapeBuilder, + arithmetic: &GoldilocksCircuitSlots, + blake3_slot: SlotId, + order_slot: SlotId, + equality_slot: SlotId, + data_zero: Wire, + equality_zero: Wire, + iv: [Wire; 2], + leaf_params: Wire, + node_params: Wire, + one: Wire, + factor_wires: &[Wire], + folded: Wire, + sibling: Wire, + beta: Wire, + index_bits: &[Wire], + path: &[[Wire; 2]], + folded_result: Wire, +) -> [Wire; 2] { + assert_eq!(index_bits.len(), path.len() + 1); + assert_eq!(factor_wires.len(), path.len()); + + // The low query bit determines which value is e0 and which is e1. + let ordered_evals = builder + .gate(order_slot, &[index_bits[0], folded, data_zero, sibling, data_zero]); + let e0 = ordered_evals[0]; + let e1 = ordered_evals[2]; + + // ExtensionMmcs serializes `[e0.c0,e0.c1,e1.c0,e1.c1]` as 32 little- + // endian bytes before hashing the leaf. + let leaf = builder.gate( + blake3_slot, + &[iv[0], iv[1], e0, e1, data_zero, data_zero, leaf_params], + ); + let mut current = [leaf[0], leaf[1]]; + for (level, sibling_digest) in path.iter().enumerate() { + let ordered = builder.gate( + order_slot, + &[ + index_bits[level + 1], + current[0], + current[1], + sibling_digest[0], + sibling_digest[1], + ], + ); + let parent = builder.gate( + blake3_slot, + &[ + iv[0], + iv[1], + ordered[0], + ordered[1], + ordered[2], + ordered[3], + node_params, + ], + ); + current = [parent[0], parent[1]]; + } + + // `s = g_(h+1)^reverse_bits(index >> 1, h)`. Each original LSB-first + // bit selects its corresponding pre-squared factor. + let mut s = one; + for (bit, factor) in index_bits[1..].iter().zip(factor_wires) { + let selected = + builder.gate(order_slot, &[*bit, one, data_zero, *factor, data_zero])[0]; + s = arithmetic.ext2_mul(builder, s, selected); + } + + let sum = arithmetic.add(builder, e0, e1); + let two_s = arithmetic.add(builder, s, s); + let lhs_fold = arithmetic.ext2_mul(builder, two_s, folded_result); + let lhs_beta = arithmetic.ext2_mul(builder, beta, e1); + let lhs = arithmetic.add(builder, lhs_fold, lhs_beta); + let rhs_sum = arithmetic.ext2_mul(builder, s, sum); + let rhs_beta = arithmetic.ext2_mul(builder, beta, e0); + let rhs = arithmetic.add(builder, rhs_sum, rhs_beta); + let equality_residual = builder.gate(equality_slot, &[lhs, rhs])[0]; + builder.connect(equality_residual, equality_zero); + current +} + +#[allow(clippy::too_many_arguments)] +fn prove_fri_circuit( + shape: &CircuitShape, + slots: FriTableSlots, + sample_slot: Option, + split_slot: Option, + window_slot: Option, + nu: usize, + inputs: &[F128], + expected_public: &[F128], + transcript_domain: &[u8], +) -> Result> { + let witness = shape.run(inputs, &[]); + if witness.public != expected_public { + bail!("Flock authenticated-FRI circuit disagrees with native semantics"); + } + let blake3_rows = witness.rows::(slots.blake3); + let order_rows = witness.rows::(slots.order); + let add_rows = witness.rows::(slots.add); + let mul_rows = witness.rows::(slots.mul); + let repack_rows = witness.rows::(slots.repack); + let canonical_rows = + witness.rows::(slots.canonical); + let equality_rows = witness.rows::(slots.equality); + let sample_rows = + sample_slot.map(|slot| witness.rows::(slot)); + let field_sample_rows = + slots.field_sample.map(|slot| witness.rows::(slot)); + let split_rows = split_slot.map(|slot| witness.rows::(slot)); + let window_rows = + window_slot.map(|slot| witness.rows::(slot)); + + let blake3_r1cs = flock_blake3::build_block_r1cs(nu); + let blake3_lincheck = blake3_r1cs.csc_lincheck_circuit(); + let order_r1cs = build_digest_order_r1cs(nu); + let order_lincheck = order_r1cs.csc_lincheck_circuit(); + let add_r1cs = build_goldilocks_add_r1cs(nu); + let add_lincheck = add_r1cs.csc_lincheck_circuit(); + let mul_r1cs = build_goldilocks_mul_r1cs(nu); + let mul_lincheck = mul_r1cs.csc_lincheck_circuit(); + let repack_r1cs = build_lane_repack_r1cs(nu); + let repack_lincheck = repack_r1cs.csc_lincheck_circuit(); + let canonical_r1cs = build_canonical_pair_r1cs(nu); + let canonical_lincheck = canonical_r1cs.csc_lincheck_circuit(); + let equality_r1cs = build_f128_equality_r1cs(nu); + let equality_lincheck = equality_r1cs.csc_lincheck_circuit(); + let sample_r1cs = build_hash_sample_r1cs(nu); + let sample_lincheck = sample_r1cs.csc_lincheck_circuit(); + let field_sample_r1cs = build_goldilocks_sample_r1cs(nu); + let field_sample_lincheck = field_sample_r1cs.csc_lincheck_circuit(); + let split_r1cs = build_u64_split_r1cs(nu); + let split_lincheck = split_r1cs.csc_lincheck_circuit(); + let window_r1cs = build_byte_window_r1cs(nu); + let window_lincheck = window_r1cs.csc_lincheck_circuit(); + + let mut slot_inputs = vec![ + ( + shape.registry_slot(slots.blake3), + UnionSlotProverInput::new( + flock_blake3::generate_witness_batch_major_partial(blake3_rows, nu), + blake3_lincheck, + ), + ), + ( + shape.registry_slot(slots.order), + UnionSlotProverInput::new( + generate_digest_order_witness(order_rows, nu), + order_lincheck, + ), + ), + ( + shape.registry_slot(slots.add), + UnionSlotProverInput::new( + generate_goldilocks_add_witness(add_rows, nu), + add_lincheck, + ), + ), + ( + shape.registry_slot(slots.mul), + UnionSlotProverInput::new( + generate_goldilocks_mul_witness(mul_rows, nu), + mul_lincheck, + ), + ), + ( + shape.registry_slot(slots.repack), + UnionSlotProverInput::new( + generate_lane_repack_witness(repack_rows, nu), + repack_lincheck, + ), + ), + ( + shape.registry_slot(slots.canonical), + UnionSlotProverInput::new( + generate_canonical_pair_witness(canonical_rows, nu), + canonical_lincheck, + ), + ), + ( + shape.registry_slot(slots.equality), + UnionSlotProverInput::new( + generate_f128_equality_witness(equality_rows, nu), + equality_lincheck, + ), + ), + ]; + if let (Some(slot), Some(rows)) = (sample_slot, sample_rows) { + slot_inputs.push(( + shape.registry_slot(slot), + UnionSlotProverInput::new( + generate_hash_sample_witness(rows, nu), + sample_lincheck, + ), + )); + } + if let (Some(slot), Some(rows)) = (slots.field_sample, field_sample_rows) { + slot_inputs.push(( + shape.registry_slot(slot), + UnionSlotProverInput::new( + generate_goldilocks_sample_witness(rows, nu), + field_sample_lincheck, + ), + )); + } + if let (Some(slot), Some(rows)) = (split_slot, split_rows) { + slot_inputs.push(( + shape.registry_slot(slot), + UnionSlotProverInput::new( + generate_u64_split_witness(rows, nu), + split_lincheck, + ), + )); + } + if let (Some(slot), Some(rows)) = (window_slot, window_rows) { + slot_inputs.push(( + shape.registry_slot(slot), + UnionSlotProverInput::new( + generate_byte_window_witness(rows, nu), + window_lincheck, + ), + )); + } + sort_and_validate_slots(&mut slot_inputs)?; + let slot_inputs = slot_inputs.into_iter().map(|(_, input)| input).collect(); + let union = UnionInstance::new(&shape.registry, shape.counts.clone()); + let params = pcs_params(&union); + let mut challenger = FsChallenger::with_chained_blake3(transcript_domain); + let (proof, commitment, _) = prover::prove_fast_ligerito_union_circuit( + &union, + &shape.circuit, + &witness.public, + ¶ms, + slot_inputs, + Vec::new(), + &mut challenger, + ); + let proof_bundle_bytes = + encode_bundle(&FriFoldProofBundle { commitment, proof })?; + if proof_bundle_bytes.len() > MAX_BUNDLE_BYTES { + bail!("Flock authenticated-FRI proof exceeds {MAX_BUNDLE_BYTES} bytes"); + } + Ok(proof_bundle_bytes) +} + +#[allow(clippy::too_many_arguments)] +fn verify_fri_circuit( + shape: &CircuitShape, + slots: FriTableSlots, + sample_slot: Option, + split_slot: Option, + window_slot: Option, + nu: usize, + public: &[F128], + proof_bundle_bytes: &[u8], + transcript_domain: &[u8], +) -> Result<()> { + let bundle = decode_bundle(proof_bundle_bytes) + .context("decode Flock authenticated-FRI conformance proof bundle")?; + let blake3_r1cs = flock_blake3::build_block_r1cs(nu); + let blake3_lincheck = blake3_r1cs.csc_lincheck_circuit(); + let order_r1cs = build_digest_order_r1cs(nu); + let order_lincheck = order_r1cs.csc_lincheck_circuit(); + let add_r1cs = build_goldilocks_add_r1cs(nu); + let add_lincheck = add_r1cs.csc_lincheck_circuit(); + let mul_r1cs = build_goldilocks_mul_r1cs(nu); + let mul_lincheck = mul_r1cs.csc_lincheck_circuit(); + let repack_r1cs = build_lane_repack_r1cs(nu); + let repack_lincheck = repack_r1cs.csc_lincheck_circuit(); + let canonical_r1cs = build_canonical_pair_r1cs(nu); + let canonical_lincheck = canonical_r1cs.csc_lincheck_circuit(); + let equality_r1cs = build_f128_equality_r1cs(nu); + let equality_lincheck = equality_r1cs.csc_lincheck_circuit(); + let sample_r1cs = build_hash_sample_r1cs(nu); + let sample_lincheck = sample_r1cs.csc_lincheck_circuit(); + let field_sample_r1cs = build_goldilocks_sample_r1cs(nu); + let field_sample_lincheck = field_sample_r1cs.csc_lincheck_circuit(); + let split_r1cs = build_u64_split_r1cs(nu); + let split_lincheck = split_r1cs.csc_lincheck_circuit(); + let window_r1cs = build_byte_window_r1cs(nu); + let window_lincheck = window_r1cs.csc_lincheck_circuit(); + + let mut linchecks: Vec<(usize, &dyn LincheckCircuit)> = vec![ + (shape.registry_slot(slots.blake3), blake3_lincheck), + (shape.registry_slot(slots.order), order_lincheck), + (shape.registry_slot(slots.add), add_lincheck), + (shape.registry_slot(slots.mul), mul_lincheck), + (shape.registry_slot(slots.repack), repack_lincheck), + (shape.registry_slot(slots.canonical), canonical_lincheck), + (shape.registry_slot(slots.equality), equality_lincheck), + ]; + if let Some(slot) = sample_slot { + linchecks.push((shape.registry_slot(slot), sample_lincheck)); + } + if let Some(slot) = slots.field_sample { + linchecks.push((shape.registry_slot(slot), field_sample_lincheck)); + } + if let Some(slot) = split_slot { + linchecks.push((shape.registry_slot(slot), split_lincheck)); + } + if let Some(slot) = window_slot { + linchecks.push((shape.registry_slot(slot), window_lincheck)); + } + sort_and_validate_slots(&mut linchecks)?; + let linchecks: Vec<&dyn LincheckCircuit> = + linchecks.into_iter().map(|(_, lincheck)| lincheck).collect(); + let union = UnionInstance::new(&shape.registry, shape.counts.clone()); + let params = pcs_params(&union); + let mut challenger = FsChallenger::with_chained_blake3(transcript_domain); + verifier::verify_ligerito_union_circuit( + &union, + &shape.circuit, + public, + &linchecks, + &bundle.commitment, + &bundle.proof, + ¶ms, + &mut challenger, + ) + .map_err(|error| { + anyhow::anyhow!("Flock authenticated-FRI proof rejected: {error:?}") + })?; + Ok(()) +} + +fn relation_inputs( + query: &FriFoldQueryV1, + folded_result: [u64; 2], +) -> Vec { + let packed_iv = pack8(&IV); + let mut inputs = Vec::with_capacity(10 + 4 * usize::from(query.log_height)); + inputs.push(F128::ZERO); + inputs.push(F128::ZERO); + inputs.push(F128::ZERO); + inputs.extend_from_slice(&packed_iv); + inputs.push(pack_params(0, 32, CHUNK_START | CHUNK_END | ROOT)); + inputs.push(pack_params(0, 64, CHUNK_START | CHUNK_END | ROOT)); + inputs.push(F128::new(1, 0)); + inputs.extend( + twiddle_factors(query.log_height) + .into_iter() + .map(|factor| F128::new(factor, 0)), + ); + inputs.push(pack_extension(query.folded)); + inputs.push(pack_extension(query.sibling)); + inputs.push(pack_extension(query.beta)); + inputs.extend( + (0..=query.log_height) + .map(|bit| F128::new(u64::from((query.query_index >> bit) & 1), 0)), + ); + for sibling in &query.opening_proof { + inputs.extend_from_slice(&pack_digest(sibling)); + } + inputs.push(pack_extension(folded_result)); + inputs +} + +fn relation_public( + query: &FriFoldQueryV1, + folded_result: [u64; 2], + root: &[u8; 32], +) -> Vec { + let mut public = relation_inputs(query, folded_result); + public.extend_from_slice(&pack_digest(root)); + public +} + +struct FriCommitPhaseComputation { + round_queries: Vec, + fold_results: Vec<[u64; 2]>, + results: Vec<[u64; 2]>, + roots: Vec<[u8; 32]>, +} + +fn compute_commit_phase( + query: &FriCommitPhaseQueryV1, +) -> Result { + validate_commit_phase_structure(query)?; + let mut folded = query.initial_folded; + let mut round_queries = Vec::with_capacity(query.rounds.len()); + let mut fold_results = Vec::with_capacity(query.rounds.len()); + let mut results = Vec::with_capacity(query.rounds.len()); + let mut roots = Vec::with_capacity(query.rounds.len()); + for (round_index, round) in query.rounds.iter().enumerate() { + let round_u8 = u8::try_from(round_index).expect("bounded FRI round count"); + let fold_query = FriFoldQueryV1 { + log_height: query.initial_log_height - round_u8, + query_index: query.query_index >> round_index, + folded, + sibling: round.sibling, + beta: round.beta, + opening_proof: round.opening_proof.clone(), + }; + validate_query(&fold_query)?; + let fold_result = native_fold(&fold_query); + let result = round.reduced_opening.map_or(fold_result, |reduced_opening| { + let beta = native_extension(round.beta); + extension_words( + native_extension(fold_result) + + beta * beta * native_extension(reduced_opening), + ) + }); + roots.push(native_root(&fold_query)); + fold_results.push(fold_result); + results.push(result); + round_queries.push(fold_query); + folded = result; + } + Ok(FriCommitPhaseComputation { round_queries, fold_results, results, roots }) +} + +fn ensure_final_polynomial( + query: &FriCommitPhaseQueryV1, + computation: &FriCommitPhaseComputation, +) -> Result<()> { + if computation.results.last().copied() != Some(query.final_polynomial) { + bail!("FRI commit-phase fold chain does not equal the final polynomial"); + } + Ok(()) +} + +fn commit_phase_relation_inputs( + query: &FriCommitPhaseQueryV1, + computation: &FriCommitPhaseComputation, +) -> Vec { + let packed_iv = pack8(&IV); + let factor_count = computation + .round_queries + .iter() + .map(|round| usize::from(round.log_height)) + .sum::(); + let path_words = computation + .round_queries + .iter() + .map(|round| 2 * round.opening_proof.len()) + .sum::(); + let mut inputs = Vec::with_capacity( + 8 + factor_count + + 1 + + usize::from(query.initial_log_height) + + 1 + + 3 * query.rounds.len() + + query + .rounds + .iter() + .filter(|round| round.reduced_opening.is_some()) + .count() + + path_words + + 1, + ); + inputs.extend_from_slice(&[F128::ZERO, F128::ZERO, F128::ZERO]); + inputs.extend_from_slice(&packed_iv); + inputs.push(pack_params(0, 32, CHUNK_START | CHUNK_END | ROOT)); + inputs.push(pack_params(0, 64, CHUNK_START | CHUNK_END | ROOT)); + inputs.push(F128::new(1, 0)); + for round in &computation.round_queries { + inputs.extend( + twiddle_factors(round.log_height) + .into_iter() + .map(|factor| F128::new(factor, 0)), + ); + } + inputs.push(pack_extension(query.initial_folded)); + inputs.extend( + (0..=query.initial_log_height) + .map(|bit| F128::new(u64::from((query.query_index >> bit) & 1), 0)), + ); + for ((round, source), fold_result) in computation + .round_queries + .iter() + .zip(&query.rounds) + .zip(&computation.fold_results) + { + inputs.push(pack_extension(round.sibling)); + inputs.push(pack_extension(round.beta)); + if let Some(reduced_opening) = source.reduced_opening { + inputs.push(pack_extension(reduced_opening)); + } + for sibling in &round.opening_proof { + inputs.extend_from_slice(&pack_digest(sibling)); + } + inputs.push(pack_extension(*fold_result)); + } + inputs.push(pack_extension(query.final_polynomial)); + inputs +} + +fn commit_phase_relation_public( + query: &FriCommitPhaseQueryV1, + computation: &FriCommitPhaseComputation, +) -> Vec { + let mut public = commit_phase_relation_inputs(query, computation); + for root in &computation.roots { + public.extend_from_slice(&pack_digest(root)); + } + public +} + +fn commit_phase_nu(query: &FriCommitPhaseQueryV1) -> usize { + let rounds = query.rounds.len(); + let rollins = + query.rounds.iter().filter(|round| round.reduced_opening.is_some()).count(); + let height_sum = (0..rounds) + .map(|round| usize::from(query.initial_log_height) - round) + .sum::(); + let extension_multiplications = height_sum + 4 * rounds + 2 * rollins; + let row_bound = [ + 5 * extension_multiplications + 4 * rounds + rollins, + 2 * extension_multiplications, + 3 * extension_multiplications, + 9 * extension_multiplications + 4 * rounds + rollins, + 2 * height_sum + rounds, + height_sum + rounds, + rounds + 1, + ] + .into_iter() + .max() + .unwrap(); + usize::try_from(row_bound.next_power_of_two().ilog2()).unwrap().max(NU) +} + +fn validate_commit_phase_structure( + query: &FriCommitPhaseQueryV1, +) -> Result<()> { + validate_log_height(query.initial_log_height)?; + validate_commit_phase_round_count( + query.initial_log_height, + query.rounds.len(), + )?; + if u64::from(query.query_index) >= 1u64 << (query.initial_log_height + 1) { + bail!( + "FRI commit-phase query index {} does not fit {} bits", + query.query_index, + query.initial_log_height + 1 + ); + } + validate_extension(query.initial_folded, "initial folded evaluation")?; + validate_extension(query.final_polynomial, "final polynomial")?; + for (round_index, round) in query.rounds.iter().enumerate() { + let expected_depth = usize::from(query.initial_log_height) - round_index; + if round.opening_proof.len() != expected_depth { + bail!( + "FRI commit-phase round {round_index} has path depth {}; expected {expected_depth}", + round.opening_proof.len() + ); + } + validate_extension(round.sibling, "FRI round sibling")?; + validate_extension(round.beta, "FRI round challenge")?; + if let Some(reduced_opening) = round.reduced_opening { + validate_extension(reduced_opening, "FRI reduced opening")?; + } + } + Ok(()) +} + +fn validate_commit_phase_round_count( + initial_log_height: u8, + round_count: usize, +) -> Result<()> { + let maximum = usize::from(initial_log_height).min(MAX_COMMIT_PHASE_ROUNDS); + if !(1..=maximum).contains(&round_count) { + bail!("FRI commit-phase round count {round_count}; expected 1..={maximum}"); + } + Ok(()) +} + +fn commit_phase_rounds_bytes( + initial_log_height: u8, + round_count: usize, +) -> Result { + validate_commit_phase_round_count(initial_log_height, round_count)?; + (0..round_count).try_fold(0usize, |length, round| { + let depth = usize::from(initial_log_height) - round; + length + .checked_add(49 + depth * 32) + .ok_or_else(|| anyhow::anyhow!("FRI commit-phase round bytes overflow")) + }) +} + +fn build_stage2_pcs_fri_witness( + prepared: &ValidatedStage2RootV1, + fri: &FriParameters, + typed: &Stage3TypedProofWitnessV1, +) -> Result { + typed.ensure_profile(prepared.advice_profile())?; + let key = AiurVerifyingKey::from_bytes(prepared.verifying_key_bytes()) + .map_err(|error| anyhow::anyhow!("decode Aiur PCS key: {error}"))?; + if key.to_bytes() != prepared.verifying_key_bytes() { + bail!("Aiur PCS key is not canonically encoded"); + } + if key.commitment_parameters().cap_height != 0 { + bail!("Stage 3 PCS lowering currently requires cap height zero"); + } + if fri_parameter_words(&key.fri_parameters()) != fri_parameter_words(fri) { + bail!("Stage 3 PCS lowering uses different FRI parameters"); + } + + let prefix = + Stage2TranscriptReplayV1::from_prepared_and_typed(prepared, fri, typed)?; + let fri_transcript = + Stage2FriTranscriptReplayV1::from_prepared_and_typed(prepared, fri, typed)?; + let metadata = key.pcs_circuit_metadata(); + if metadata.len() != typed.active.len() { + bail!("Aiur PCS metadata and activation lengths disagree"); + } + let active_indices: Vec<_> = typed + .active + .iter() + .enumerate() + .filter_map(|(index, &active)| active.then_some(index)) + .collect(); + if active_indices.len() != typed.log_degrees.len() { + bail!("Aiur PCS active-circuit and log-degree counts disagree"); + } + let mut active_position = vec![None; typed.active.len()]; + for (position, &circuit) in active_indices.iter().enumerate() { + active_position[circuit] = Some(position); + } + + let preprocessed_roots = key.preprocessed_commitment_roots(); + let initial_preprocessed_offset = key + .transcript_seed_and_shape_bytes() + .len() + .checked_add(typed.active.len() * 8) + .ok_or_else(|| anyhow::anyhow!("initial transcript offset overflow"))?; + let initial_stage_1_offset = initial_preprocessed_offset + .checked_add( + preprocessed_roots.as_ref().map_or(0, |roots| roots.len() * 32), + ) + .ok_or_else(|| anyhow::anyhow!("Stage 1 commitment offset overflow"))?; + ensure_single_root(&typed.commitments.stage_1_trace, "Stage 1")?; + ensure_single_root(&typed.commitments.stage_2_trace, "Stage 2")?; + ensure_single_root(&typed.commitments.quotient_chunks, "quotient")?; + + let log_blowup = u8::try_from(key.commitment_parameters().log_blowup) + .map_err(|_| anyhow::anyhow!("PCS blowup height exceeds u8"))?; + let mut opening_offset = 0usize; + + let mut stage_1_matrices = Vec::with_capacity(active_indices.len()); + for (position, &circuit_index) in active_indices.iter().enumerate() { + let circuit = metadata[circuit_index]; + ensure_opened_matrix_shape( + &typed.stage_1_opened_values, + position, + 2, + circuit.main_width, + "Stage 1", + )?; + let log_degree = typed.log_degrees[position]; + stage_1_matrices.push(stage2_pcs_matrix( + log_degree, + log_blowup, + circuit.main_width, + vec![ + Stage2PcsOpeningPointV1::Zeta, + Stage2PcsOpeningPointV1::ZetaNext { log_degree }, + ], + &mut opening_offset, + )?); + } + + let mut stage_2_matrices = Vec::with_capacity(active_indices.len()); + for (position, &circuit_index) in active_indices.iter().enumerate() { + let circuit = metadata[circuit_index]; + ensure_opened_matrix_shape( + &typed.stage_2_opened_values, + position, + 2, + circuit.stage_2_width, + "Stage 2", + )?; + let log_degree = typed.log_degrees[position]; + stage_2_matrices.push(stage2_pcs_matrix( + log_degree, + log_blowup, + circuit.stage_2_width, + vec![ + Stage2PcsOpeningPointV1::Zeta, + Stage2PcsOpeningPointV1::ZetaNext { log_degree }, + ], + &mut opening_offset, + )?); + } + + let mut quotient_matrices = Vec::with_capacity(active_indices.len()); + for (position, &circuit_index) in active_indices.iter().enumerate() { + let circuit = metadata[circuit_index]; + ensure_opened_matrix_shape( + &typed.quotient_opened_values, + position, + 1, + circuit.quotient_width, + "quotient", + )?; + quotient_matrices.push(stage2_pcs_matrix( + typed.log_degrees[position], + log_blowup, + circuit.quotient_width, + vec![Stage2PcsOpeningPointV1::Zeta], + &mut opening_offset, + )?); + } + + let mut batches = vec![ + Stage2PcsBatchV1 { + commitment: Stage2TranscriptByteBindingV1::new( + Stage2TranscriptSegmentV1::Initial, + initial_stage_1_offset, + ), + matrices: stage_1_matrices, + }, + Stage2PcsBatchV1 { + commitment: Stage2TranscriptByteBindingV1::new( + Stage2TranscriptSegmentV1::Stage2AndAccumulator, + 0, + ), + matrices: stage_2_matrices, + }, + Stage2PcsBatchV1 { + commitment: Stage2TranscriptByteBindingV1::new( + Stage2TranscriptSegmentV1::QuotientCommitment, + 0, + ), + matrices: quotient_matrices, + }, + ]; + + if let Some(roots) = &preprocessed_roots { + ensure_single_root(roots, "preprocessed")?; + let opened = + typed.preprocessed_opened_values.as_ref().ok_or_else(|| { + anyhow::anyhow!("preprocessed commitment has no opened-value round") + })?; + let mut preprocessed: Vec<_> = metadata + .iter() + .enumerate() + .filter_map(|(circuit, metadata)| { + metadata.preprocessed_slot.map(|slot| (slot, circuit, *metadata)) + }) + .collect(); + preprocessed.sort_by_key(|(slot, _, _)| *slot); + if opened.len() != preprocessed.len() { + bail!("preprocessed PCS metadata and opened-value counts disagree"); + } + let mut matrices = Vec::with_capacity(preprocessed.len()); + for (expected_slot, (slot, circuit_index, circuit)) in + preprocessed.into_iter().enumerate() + { + if slot != expected_slot { + bail!("preprocessed PCS slots are not contiguous"); + } + let (log_degree, opening_points) = + if let Some(position) = active_position[circuit_index] { + ensure_opened_matrix_shape( + opened, + slot, + 2, + circuit.preprocessed_width, + "preprocessed", + )?; + let log_degree = typed.log_degrees[position]; + ( + log_degree, + vec![ + Stage2PcsOpeningPointV1::Zeta, + Stage2PcsOpeningPointV1::ZetaNext { log_degree }, + ], + ) + } else { + ensure_opened_matrix_shape( + opened, + slot, + 0, + circuit.preprocessed_width, + "inactive preprocessed", + )?; + let height = circuit.preprocessed_height; + if !height.is_power_of_two() { + bail!("preprocessed matrix height is not a power of two"); + } + ( + u8::try_from(height.ilog2()) + .map_err(|_| anyhow::anyhow!("preprocessed height exceeds u8"))?, + Vec::new(), + ) + }; + matrices.push(stage2_pcs_matrix( + log_degree, + log_blowup, + circuit.preprocessed_width, + opening_points, + &mut opening_offset, + )?); + } + batches.push(Stage2PcsBatchV1 { + commitment: Stage2TranscriptByteBindingV1::new( + Stage2TranscriptSegmentV1::Initial, + initial_preprocessed_offset, + ), + matrices, + }); + } else if typed.preprocessed_opened_values.is_some() { + bail!("proof has preprocessed openings but the key has no commitment"); + } + if opening_offset != prefix.pcs_opening_observations.len() { + bail!( + "Stage 2 PCS adapter consumed {opening_offset} opening bytes; transcript has {}", + prefix.pcs_opening_observations.len() + ); + } + + let pcs_instance = Stage2PcsInstanceV1 { + log_global_height: fri_transcript.query_index_bits, + log_blowup, + batches, + }; + validate_stage2_pcs_instance(&prefix, &pcs_instance)?; + let prefix_challenges = prefix.challenges()?; + let fri_challenges = fri_transcript.challenges(&prefix)?; + if typed.opening_proof.query_proofs.len() + != fri_challenges.query_indices.len() + { + bail!("typed PCS query count disagrees with transcript samples"); + } + if typed.opening_proof.final_poly.as_slice() + != fri_transcript.final_polynomial + { + bail!("typed and transcript final polynomials disagree"); + } + let final_polynomial = + *typed.opening_proof.final_poly.first().ok_or_else(|| { + anyhow::anyhow!("Stage 2 FRI final polynomial is empty") + })?; + if typed.opening_proof.final_poly.len() != 1 { + bail!( + "Stage 3 PCS/FRI adapter currently requires a constant final polynomial" + ); + } + + let mut queries = Vec::with_capacity(fri_challenges.query_indices.len()); + for (query_number, (typed_query, &query_index)) in typed + .opening_proof + .query_proofs + .iter() + .zip(&fri_challenges.query_indices) + .enumerate() + { + if typed_query.input_proof.len() != pcs_instance.batches.len() { + bail!("typed PCS query {query_number} has the wrong batch count"); + } + let pcs = Stage2PcsQueryV1 { + batch_openings: typed_query + .input_proof + .iter() + .map(|opening| Stage2PcsBatchOpeningV1 { + opened_rows: opening.opened_values.clone(), + opening_proof: opening.opening_proof.clone(), + }) + .collect(), + }; + if typed_query.commit_phase_openings.len() != fri_challenges.betas.len() { + bail!("typed FRI query {query_number} has the wrong round count"); + } + let rounds: Vec<_> = typed_query + .commit_phase_openings + .iter() + .zip(&fri_challenges.betas) + .enumerate() + .map(|(round, (opening, &beta))| { + if opening.log_arity != 1 || opening.sibling_values.len() != 1 { + bail!("typed FRI query {query_number} round {round} is not binary"); + } + Ok(FriCommitPhaseRoundV1 { + sibling: opening.sibling_values[0], + beta, + reduced_opening: None, + opening_proof: opening.opening_proof.clone(), + }) + }) + .collect::>()?; + let mut query = TranscriptBoundPcsFriQueryV1 { + pcs, + fri: FriCommitPhaseQueryV1 { + initial_log_height: pcs_instance + .log_global_height + .checked_sub(1) + .ok_or_else(|| anyhow::anyhow!("FRI global height is zero"))?, + query_index: u32::try_from(query_index) + .map_err(|_| anyhow::anyhow!("FRI query index exceeds u32"))?, + initial_folded: [0, 0], + rounds, + final_polynomial, + }, + }; + let computation = compute_stage2_pcs_query( + &prefix, + &pcs_instance, + &query, + prefix_challenges, + )?; + query.fri.initial_folded = *computation + .reduced_openings + .get(&pcs_instance.log_global_height) + .ok_or_else(|| { + anyhow::anyhow!("typed PCS query has no initial bucket") + })?; + for (round, opening) in query.fri.rounds.iter_mut().enumerate() { + let height = pcs_instance.log_global_height + - 1 + - u8::try_from(round).expect("bounded FRI round index"); + opening.reduced_opening = + computation.reduced_openings.get(&height).copied(); + } + ensure_stage2_pcs_feeds_fri(&pcs_instance, &query, &computation)?; + let fri_computation = compute_commit_phase(&query.fri)?; + ensure_final_polynomial(&query.fri, &fri_computation)?; + ensure_transcript_binds_fri_query( + &fri_transcript, + &fri_challenges, + query_number, + &query.fri, + )?; + queries.push(query); + } + + Ok(Stage2PcsFriWitnessV1 { prefix, fri_transcript, pcs_instance, queries }) +} + +fn ensure_single_root(roots: &[[u8; 32]], label: &str) -> Result<()> { + if roots.len() != 1 { + bail!("{label} PCS commitment has {} roots; expected one", roots.len()); + } + Ok(()) +} + +fn ensure_opened_matrix_shape( + round: &[Vec>], + matrix: usize, + points: usize, + width: usize, + label: &str, +) -> Result<()> { + let opened = round.get(matrix).ok_or_else(|| { + anyhow::anyhow!("{label} opened matrix {matrix} is missing") + })?; + if opened.len() != points { + bail!( + "{label} opened matrix {matrix} has {} points; expected {points}", + opened.len() + ); + } + if opened.iter().any(|values| values.len() != width) { + bail!("{label} opened matrix {matrix} has the wrong width"); + } + Ok(()) +} + +fn stage2_pcs_matrix( + log_degree: u8, + log_blowup: u8, + width: usize, + opening_points: Vec, + opening_offset: &mut usize, +) -> Result { + let opened_values = Stage2TranscriptByteBindingV1::new( + Stage2TranscriptSegmentV1::PcsOpening, + *opening_offset, + ); + *opening_offset = opening_points + .len() + .checked_mul(width) + .and_then(|count| count.checked_mul(16)) + .and_then(|bytes| opening_offset.checked_add(bytes)) + .ok_or_else(|| anyhow::anyhow!("PCS opening transcript offset overflow"))?; + Ok(Stage2PcsMatrixV1 { + log_height: log_degree + .checked_add(log_blowup) + .ok_or_else(|| anyhow::anyhow!("PCS matrix height overflow"))?, + width, + opening_points, + opened_values, + }) +} + +struct Stage2PcsPointComputation { + denominator: [u64; 2], + quotients: Vec<[u64; 2]>, +} + +struct Stage2PcsMatrixComputation { + points: Vec, +} + +struct Stage2PcsBatchComputation { + root: [u8; 32], + matrices: Vec, +} + +struct Stage2PcsQueryComputation { + batches: Vec, + reduced_openings: BTreeMap, +} + +fn validate_stage2_pcs_instance( + replay: &Stage2TranscriptReplayV1, + instance: &Stage2PcsInstanceV1, +) -> Result<()> { + validate_log_height(instance.log_global_height)?; + if instance.log_blowup >= instance.log_global_height { + bail!( + "Stage 2 PCS blowup height {} must be below global height {}", + instance.log_blowup, + instance.log_global_height + ); + } + if instance.batches.is_empty() { + bail!("Stage 2 PCS instance has no input batches"); + } + + let mut observed_global_height = 0u8; + for (batch_index, batch) in instance.batches.iter().enumerate() { + validate_transcript_binding( + replay, + batch.commitment, + 4, + &format!("PCS batch {batch_index} commitment"), + )?; + if batch.matrices.is_empty() { + bail!("Stage 2 PCS batch {batch_index} has no matrices"); + } + let batch_max = + batch.matrices.iter().map(|matrix| matrix.log_height).max().unwrap(); + observed_global_height = observed_global_height.max(batch_max); + if batch_max > instance.log_global_height { + bail!( + "Stage 2 PCS batch {batch_index} height {batch_max} exceeds global height {}", + instance.log_global_height + ); + } + for (matrix_index, matrix) in batch.matrices.iter().enumerate() { + if matrix.log_height > batch_max { + unreachable!("batch maximum was computed from all matrices"); + } + validate_reduced_opening_width(matrix.width)?; + for point in &matrix.opening_points { + if let Stage2PcsOpeningPointV1::ZetaNext { log_degree } = point + && usize::from(*log_degree) >= Val::TWO_ADIC_GENERATORS.len() + { + bail!( + "Stage 2 PCS batch {batch_index} matrix {matrix_index} opening generator exceeds Goldilocks two-adicity" + ); + } + } + let lane_count = matrix + .opening_points + .len() + .checked_mul(matrix.width) + .and_then(|count| count.checked_mul(2)) + .ok_or_else(|| { + anyhow::anyhow!("Stage 2 PCS OOD binding length overflow") + })?; + validate_transcript_binding( + replay, + matrix.opened_values, + lane_count, + &format!("PCS batch {batch_index} matrix {matrix_index} OOD values"), + )?; + } + } + if observed_global_height != instance.log_global_height { + bail!( + "Stage 2 PCS global height is {}; tallest matrix has height {observed_global_height}", + instance.log_global_height + ); + } + Ok(()) +} + +fn validate_stage2_pcs_query( + replay: &Stage2TranscriptReplayV1, + instance: &Stage2PcsInstanceV1, + query: &TranscriptBoundPcsFriQueryV1, +) -> Result<()> { + validate_stage2_pcs_instance(replay, instance)?; + if query.pcs.batch_openings.len() != instance.batches.len() { + bail!( + "Stage 2 PCS query has {} batch openings; expected {}", + query.pcs.batch_openings.len(), + instance.batches.len() + ); + } + if query.fri.initial_log_height + 1 != instance.log_global_height { + bail!("Stage 2 PCS and FRI global heights disagree"); + } + if usize::from(instance.log_global_height - instance.log_blowup) + != query.fri.rounds.len() + { + bail!("Stage 2 PCS and FRI final heights disagree"); + } + for (batch_index, (batch, opening)) in + instance.batches.iter().zip(&query.pcs.batch_openings).enumerate() + { + if opening.opened_rows.len() != batch.matrices.len() { + bail!( + "Stage 2 PCS batch {batch_index} has {} opened rows; expected {}", + opening.opened_rows.len(), + batch.matrices.len() + ); + } + let batch_max = + batch.matrices.iter().map(|matrix| matrix.log_height).max().unwrap(); + if opening.opening_proof.len() != usize::from(batch_max) { + bail!( + "Stage 2 PCS batch {batch_index} path has {} siblings; expected {batch_max}", + opening.opening_proof.len() + ); + } + for (matrix_index, (matrix, row)) in + batch.matrices.iter().zip(&opening.opened_rows).enumerate() + { + if row.len() != matrix.width { + bail!( + "Stage 2 PCS batch {batch_index} matrix {matrix_index} row width is {}; expected {}", + row.len(), + matrix.width + ); + } + for (column, &value) in row.iter().enumerate() { + if value >= GOLDILOCKS_MODULUS { + bail!( + "Stage 2 PCS batch {batch_index} matrix {matrix_index} column {column} is not canonical Goldilocks" + ); + } + } + } + } + Ok(()) +} + +fn compute_stage2_pcs_query( + replay: &Stage2TranscriptReplayV1, + instance: &Stage2PcsInstanceV1, + query: &TranscriptBoundPcsFriQueryV1, + challenges: crate::Stage2TranscriptChallengesV1, +) -> Result { + validate_stage2_pcs_query(replay, instance, query)?; + let alpha = native_extension(challenges.pcs_alpha); + let zeta = native_extension(challenges.zeta); + let mut buckets: BTreeMap = instance + .batches + .iter() + .flat_map(|batch| batch.matrices.iter().map(|matrix| matrix.log_height)) + .map(|height| (height, (ExtVal::ONE, ExtVal::ZERO))) + .collect(); + let mut batches = Vec::with_capacity(instance.batches.len()); + + for (batch, opening) in instance.batches.iter().zip(&query.pcs.batch_openings) + { + let root = native_stage2_pcs_batch_root( + instance.log_global_height, + query.fri.query_index, + batch, + opening, + ); + if root != read_bound_digest(replay, batch.commitment)? { + bail!( + "Stage 2 PCS input opening does not authenticate to its transcript commitment" + ); + } + let mut matrices = Vec::with_capacity(batch.matrices.len()); + for (matrix_index, (matrix, row)) in + batch.matrices.iter().zip(&opening.opened_rows).enumerate() + { + let local_index = query.fri.query_index + >> (instance.log_global_height - matrix.log_height); + let x = ExtVal::new([ + Val::from_u64(pcs_query_point(matrix.log_height, local_index)), + Val::ZERO, + ]); + let opened_at_z = read_bound_extensions( + replay, + matrix.opened_values, + matrix.opening_points.len() * matrix.width, + )?; + let mut points = Vec::with_capacity(matrix.opening_points.len()); + for (point_index, point_kind) in matrix.opening_points.iter().enumerate() + { + let point = native_stage2_pcs_point(zeta, *point_kind); + let denominator = point - x; + if denominator == ExtVal::ZERO { + bail!( + "Stage 2 PCS batch matrix {matrix_index} opening point {point_index} equals its query point" + ); + } + let values = &opened_at_z + [point_index * matrix.width..(point_index + 1) * matrix.width]; + let mut quotients = Vec::with_capacity(matrix.width); + let (alpha_power, accumulator) = buckets + .get_mut(&matrix.log_height) + .expect("one PCS bucket per matrix height"); + for (&p_at_x, &p_at_z) in row.iter().zip(values) { + let p_at_x = ExtVal::new([Val::from_u64(p_at_x), Val::ZERO]); + let quotient = (native_extension(p_at_z) - p_at_x) / denominator; + *accumulator += *alpha_power * quotient; + *alpha_power *= alpha; + quotients.push(extension_words(quotient)); + } + points.push(Stage2PcsPointComputation { + denominator: extension_words(denominator), + quotients, + }); + } + matrices.push(Stage2PcsMatrixComputation { points }); + } + batches.push(Stage2PcsBatchComputation { root, matrices }); + } + + let reduced_openings = buckets + .into_iter() + .map(|(height, (_, accumulator))| (height, extension_words(accumulator))) + .collect(); + Ok(Stage2PcsQueryComputation { batches, reduced_openings }) +} + +fn ensure_stage2_pcs_feeds_fri( + instance: &Stage2PcsInstanceV1, + query: &TranscriptBoundPcsFriQueryV1, + computation: &Stage2PcsQueryComputation, +) -> Result<()> { + let initial = + computation.reduced_openings.get(&instance.log_global_height).ok_or_else( + || anyhow::anyhow!("missing initial Stage 2 reduced opening"), + )?; + if query.fri.initial_folded != *initial { + bail!("FRI initial value is not the authenticated PCS reduced opening"); + } + for (round, fri_round) in query.fri.rounds.iter().enumerate() { + let height = instance.log_global_height + - 1 + - u8::try_from(round).expect("bounded FRI round index"); + let expected = computation.reduced_openings.get(&height).copied(); + if fri_round.reduced_opening != expected { + bail!( + "FRI round {round} reduced-opening schedule disagrees with PCS buckets" + ); + } + } + let covered_minimum = instance.log_global_height + - u8::try_from(query.fri.rounds.len()).expect("bounded FRI round count"); + if computation.reduced_openings.keys().any(|&height| { + height != instance.log_global_height && height < covered_minimum + }) { + bail!("PCS reduced opening remains below the FRI final height"); + } + Ok(()) +} + +fn native_stage2_pcs_point( + zeta: ExtVal, + point: Stage2PcsOpeningPointV1, +) -> ExtVal { + match point { + Stage2PcsOpeningPointV1::Zeta => zeta, + Stage2PcsOpeningPointV1::ZetaNext { log_degree } => { + let generator = Val::TWO_ADIC_GENERATORS[usize::from(log_degree)]; + zeta * ExtVal::new([generator, Val::ZERO]) + }, + } +} + +fn native_stage2_pcs_batch_root( + log_global_height: u8, + query_index: u32, + batch: &Stage2PcsBatchV1, + opening: &Stage2PcsBatchOpeningV1, +) -> [u8; 32] { + let log_batch_height = + batch.matrices.iter().map(|matrix| matrix.log_height).max().unwrap(); + let local_index = query_index >> (log_global_height - log_batch_height); + let mut current = native_stage2_pcs_leaf(batch, opening, log_batch_height); + for (level, sibling) in opening.opening_proof.iter().enumerate() { + let mut message = [0u8; 64]; + let (left, right) = if (local_index >> level) & 1 == 0 { + (¤t, sibling) + } else { + (sibling, ¤t) + }; + message[..32].copy_from_slice(left); + message[32..].copy_from_slice(right); + current = *native_blake3::hash(&message).as_bytes(); + let next_height = log_batch_height + - 1 + - u8::try_from(level).expect("bounded Merkle path level"); + if batch.matrices.iter().any(|matrix| matrix.log_height == next_height) { + let injected = native_stage2_pcs_leaf(batch, opening, next_height); + let mut message = [0u8; 64]; + message[..32].copy_from_slice(¤t); + message[32..].copy_from_slice(&injected); + current = *native_blake3::hash(&message).as_bytes(); + } + } + current +} + +fn native_stage2_pcs_leaf( + batch: &Stage2PcsBatchV1, + opening: &Stage2PcsBatchOpeningV1, + log_height: u8, +) -> [u8; 32] { + let mut bytes = Vec::new(); + for (matrix, row) in batch.matrices.iter().zip(&opening.opened_rows) { + if matrix.log_height == log_height { + for &value in row { + bytes.extend_from_slice(&value.to_le_bytes()); + } + } + } + *native_blake3::hash(&bytes).as_bytes() +} + +fn validate_transcript_binding( + replay: &Stage2TranscriptReplayV1, + binding: Stage2TranscriptByteBindingV1, + lane_count: usize, + label: &str, +) -> Result<()> { + let bytes = transcript_segment(replay, binding.segment); + let start = binding.byte_offset; + let end = lane_count + .checked_mul(8) + .and_then(|length| start.checked_add(length)) + .ok_or_else(|| anyhow::anyhow!("{label} byte range overflow"))?; + if end > bytes.len() { + bail!( + "{label} binding ends at byte {end}; transcript segment has {} bytes", + bytes.len() + ); + } + Ok(()) +} + +fn read_bound_digest( + replay: &Stage2TranscriptReplayV1, + binding: Stage2TranscriptByteBindingV1, +) -> Result<[u8; 32]> { + validate_transcript_binding(replay, binding, 4, "PCS commitment")?; + let bytes = transcript_segment(replay, binding.segment); + let start = binding.byte_offset; + Ok(bytes[start..start + 32].try_into().unwrap()) +} + +fn read_bound_extensions( + replay: &Stage2TranscriptReplayV1, + binding: Stage2TranscriptByteBindingV1, + count: usize, +) -> Result> { + validate_transcript_binding(replay, binding, count * 2, "PCS OOD opening")?; + let bytes = transcript_segment(replay, binding.segment); + let start = binding.byte_offset; + (0..count) + .map(|index| { + let offset = start + index * 16; + let value = [ + u64::from_le_bytes(bytes[offset..offset + 8].try_into().unwrap()), + u64::from_le_bytes(bytes[offset + 8..offset + 16].try_into().unwrap()), + ]; + validate_extension(value, "transcript-bound PCS OOD value")?; + Ok(value) + }) + .collect() +} + +fn transcript_segment( + replay: &Stage2TranscriptReplayV1, + segment: Stage2TranscriptSegmentV1, +) -> &[u8] { + match segment { + Stage2TranscriptSegmentV1::Initial => &replay.initial_observations, + Stage2TranscriptSegmentV1::Stage2AndAccumulator => { + &replay.stage2_and_accumulator_observations + }, + Stage2TranscriptSegmentV1::QuotientCommitment => { + &replay.quotient_commitment_observations + }, + Stage2TranscriptSegmentV1::PcsOpening => &replay.pcs_opening_observations, + } +} + +struct PcsReductionComputation { + denominator: [u64; 2], + quotients: Vec<[u64; 2]>, + accumulator: [u64; 2], + alpha_power: [u64; 2], + root: [u8; 32], +} + +fn compute_pcs_reduction( + opening: &PcsReducedOpeningV1, +) -> Result { + validate_pcs_reduction(opening)?; + let x = ExtVal::new([ + Val::from_u64(pcs_query_point(opening.log_height, opening.query_index)), + Val::ZERO, + ]); + let zeta = native_extension(opening.zeta); + let denominator = zeta - x; + if denominator == ExtVal::ZERO { + bail!("PCS reduced opening has zeta equal to the query-domain point"); + } + let alpha = native_extension(opening.alpha); + let mut alpha_power = native_extension(opening.initial_alpha_power); + let mut accumulator = native_extension(opening.initial_accumulator); + let mut quotients = Vec::with_capacity(opening.opened_values.len()); + for (&px, &pz) in opening.opened_values.iter().zip(&opening.opened_at_z) { + let px = ExtVal::new([Val::from_u64(px), Val::ZERO]); + let pz = native_extension(pz); + let quotient = (pz - px) / denominator; + accumulator += alpha_power * quotient; + alpha_power *= alpha; + quotients.push(extension_words(quotient)); + } + Ok(PcsReductionComputation { + denominator: extension_words(denominator), + quotients, + accumulator: extension_words(accumulator), + alpha_power: extension_words(alpha_power), + root: native_pcs_row_root(opening), + }) +} + +fn pcs_reduction_relation_inputs( + opening: &PcsReducedOpeningV1, + computation: &PcsReductionComputation, +) -> Vec { + let packed_iv = pack8(&IV); + let width = opening.opened_values.len(); + let mut inputs = Vec::with_capacity( + 9 + usize::from(opening.log_height) + + width.div_ceil(2) + + width + + 4 + + usize::from(opening.log_height) * 3 + + 1 + + width + + 2, + ); + inputs.extend_from_slice(&[F128::ZERO, F128::ZERO, F128::ZERO]); + inputs.extend_from_slice(&packed_iv); + inputs.extend(hash_trace(width * 8).rows.iter().map( + |&(_cv, _message, counter, block_len, flags)| { + pack_params(counter, block_len, flags) + }, + )); + inputs.push(pack_params(0, 64, CHUNK_START | CHUNK_END | ROOT)); + inputs.push(F128::new(1, 0)); + inputs.push(F128::new(7, 0)); + inputs.extend( + pcs_x_factors(opening.log_height) + .into_iter() + .map(|factor| F128::new(factor, 0)), + ); + for pair in opening.opened_values.chunks(2) { + inputs.push(F128::new(pair[0], pair.get(1).copied().unwrap_or(0))); + } + inputs.extend(opening.opened_at_z.iter().copied().map(pack_extension)); + inputs.push(pack_extension(opening.zeta)); + inputs.push(pack_extension(opening.alpha)); + inputs.push(pack_extension(opening.initial_alpha_power)); + inputs.push(pack_extension(opening.initial_accumulator)); + inputs.extend( + (0..opening.log_height) + .map(|bit| F128::new(u64::from((opening.query_index >> bit) & 1), 0)), + ); + for sibling in &opening.opening_proof { + inputs.extend_from_slice(&pack_digest(sibling)); + } + inputs.push(pack_extension(computation.denominator)); + inputs.extend(computation.quotients.iter().copied().map(pack_extension)); + inputs.push(pack_extension(computation.accumulator)); + inputs.push(pack_extension(computation.alpha_power)); + inputs +} + +fn pcs_reduction_relation_public( + opening: &PcsReducedOpeningV1, + computation: &PcsReductionComputation, +) -> Vec { + let mut public = pcs_reduction_relation_inputs(opening, computation); + public.extend_from_slice(&pack_digest(&computation.root)); + public +} + +fn validate_pcs_reduction(opening: &PcsReducedOpeningV1) -> Result<()> { + validate_log_height(opening.log_height)?; + validate_reduced_opening_width(opening.opened_values.len())?; + if opening.opened_at_z.len() != opening.opened_values.len() { + bail!( + "PCS reduced opening has {} base values but {} OOD values", + opening.opened_values.len(), + opening.opened_at_z.len() + ); + } + if opening.opening_proof.len() != usize::from(opening.log_height) { + bail!( + "PCS reduced opening has path depth {}; expected {}", + opening.opening_proof.len(), + opening.log_height + ); + } + if u64::from(opening.query_index) >= 1u64 << opening.log_height { + bail!( + "PCS query index {} does not fit {} bits", + opening.query_index, + opening.log_height + ); + } + for (column, &value) in opening.opened_values.iter().enumerate() { + if value >= GOLDILOCKS_MODULUS { + bail!("PCS opened value {column} is not canonical Goldilocks"); + } + } + for (column, &value) in opening.opened_at_z.iter().enumerate() { + validate_extension(value, &format!("PCS OOD value {column}"))?; + } + for (value, name) in [ + (opening.zeta, "PCS zeta"), + (opening.alpha, "PCS alpha"), + (opening.initial_alpha_power, "PCS initial alpha power"), + (opening.initial_accumulator, "PCS initial accumulator"), + ] { + validate_extension(value, name)?; + } + Ok(()) +} + +fn validate_reduced_opening_width(width: usize) -> Result<()> { + if !(1..=MAX_REDUCED_OPENING_WIDTH).contains(&width) { + bail!( + "PCS reduced-opening width {width}; expected 1..={MAX_REDUCED_OPENING_WIDTH}" + ); + } + Ok(()) +} + +fn pcs_reduction_nu(opening: &PcsReducedOpeningV1) -> usize { + let width = opening.opened_values.len(); + let height = usize::from(opening.log_height); + // This deliberately over-approximates the busiest shared slot. It keeps the + // circuit builder fail-closed while supporting tree-hashed rows wider than a + // single BLAKE3 block. + let row_bound = width + .saturating_mul(128) + .saturating_add(height.saturating_mul(64)) + .saturating_add(hash_trace(width * 8).rows.len()) + .max(1); + usize::try_from(row_bound.next_power_of_two().ilog2()).unwrap().max(NU) +} + +fn native_pcs_row_root(opening: &PcsReducedOpeningV1) -> [u8; 32] { + let mut leaf = Vec::with_capacity(opening.opened_values.len() * 8); + for value in &opening.opened_values { + leaf.extend_from_slice(&value.to_le_bytes()); + } + let mut current = *native_blake3::hash(&leaf).as_bytes(); + for (level, sibling) in opening.opening_proof.iter().enumerate() { + let mut block = [0u8; 64]; + let (left, right) = if (opening.query_index >> level) & 1 == 0 { + (¤t, sibling) + } else { + (sibling, ¤t) + }; + block[..32].copy_from_slice(left); + block[32..].copy_from_slice(right); + current = *native_blake3::hash(&block).as_bytes(); + } + current +} + +fn pcs_query_point(log_height: u8, query_index: u32) -> u64 { + pcs_x_factors(log_height) + .into_iter() + .enumerate() + .filter(|(bit, _)| (query_index >> bit) & 1 == 1) + .fold(7, |point, (_, factor)| goldilocks_mul(point, factor)) +} + +fn twiddle_factors(log_height: u8) -> Vec { + reversed_exponent_factors(log_height + 1, log_height) +} + +fn pcs_x_factors(log_height: u8) -> Vec { + reversed_exponent_factors(log_height, log_height) +} + +fn reversed_exponent_factors(generator_log: u8, exponent_bits: u8) -> Vec { + let generator = + Val::TWO_ADIC_GENERATORS[usize::from(generator_log)].as_canonical_u64(); + (0..exponent_bits) + .map(|bit| { + let squarings = usize::from(exponent_bits - 1 - bit); + (0..squarings).fold(generator, |value, _| goldilocks_mul(value, value)) + }) + .collect() +} + +fn subgroup_point(query: &FriFoldQueryV1) -> u64 { + let index = query.query_index >> 1; + twiddle_factors(query.log_height) + .into_iter() + .enumerate() + .filter(|(bit, _)| (index >> bit) & 1 == 1) + .fold(1, |point, (_, factor)| goldilocks_mul(point, factor)) +} + +fn ordered_evaluations(query: &FriFoldQueryV1) -> ([u64; 2], [u64; 2]) { + if query.query_index & 1 == 0 { + (query.folded, query.sibling) + } else { + (query.sibling, query.folded) + } +} + +fn native_fold(query: &FriFoldQueryV1) -> [u64; 2] { + let (e0_words, e1_words) = ordered_evaluations(query); + let e0 = native_extension(e0_words); + let e1 = native_extension(e1_words); + let beta = native_extension(query.beta); + let s = Val::from_u64(subgroup_point(query)); + let two = Val::ONE + Val::ONE; + let half = ExtVal::new([two, Val::ZERO]); + let two_s = ExtVal::new([two * s, Val::ZERO]); + extension_words((e0 + e1) / half + beta * ((e0 - e1) / two_s)) +} + +fn native_root(query: &FriFoldQueryV1) -> [u8; 32] { + let (e0, e1) = ordered_evaluations(query); + let mut leaf = [0u8; 32]; + for (chunk, word) in + leaf.as_chunks_mut::<8>().0.iter_mut().zip([e0[0], e0[1], e1[0], e1[1]]) + { + chunk.copy_from_slice(&word.to_le_bytes()); + } + let mut current = *native_blake3::hash(&leaf).as_bytes(); + for (level, sibling) in query.opening_proof.iter().enumerate() { + let mut block = [0u8; 64]; + let direction = (query.query_index >> (level + 1)) & 1; + let (left, right) = + if direction == 0 { (¤t, sibling) } else { (sibling, ¤t) }; + block[..32].copy_from_slice(left); + block[32..].copy_from_slice(right); + current = *native_blake3::hash(&block).as_bytes(); + } + current +} + +fn native_extension(value: [u64; 2]) -> ExtVal { + ExtVal::new(value.map(Val::from_u64)) +} + +fn extension_words(value: ExtVal) -> [u64; 2] { + let coefficients: &[Val] = value.as_basis_coefficients_slice(); + [coefficients[0].as_canonical_u64(), coefficients[1].as_canonical_u64()] +} + +fn pack_extension(value: [u64; 2]) -> F128 { + F128::new(value[0], value[1]) +} + +fn pack_digest(digest: &[u8; 32]) -> [F128; 2] { + [pack_bytes(&digest[..16]), pack_bytes(&digest[16..])] +} + +fn validate_query(query: &FriFoldQueryV1) -> Result<()> { + validate_log_height(query.log_height)?; + if query.opening_proof.len() != usize::from(query.log_height) { + bail!( + "FRI-fold opening has depth {}; expected {} for cap height zero", + query.opening_proof.len(), + query.log_height + ); + } + if u64::from(query.query_index) >= 1u64 << (query.log_height + 1) { + bail!( + "FRI query index {} does not fit {} bits", + query.query_index, + query.log_height + 1 + ); + } + validate_extension(query.folded, "folded evaluation")?; + validate_extension(query.sibling, "sibling evaluation")?; + validate_extension(query.beta, "FRI challenge")?; + Ok(()) +} + +fn validate_log_height(log_height: u8) -> Result<()> { + if !(MIN_LOG_HEIGHT..=MAX_LOG_HEIGHT).contains(&log_height) { + bail!( + "FRI fold log height {log_height}; expected {MIN_LOG_HEIGHT}..={MAX_LOG_HEIGHT}" + ); + } + Ok(()) +} + +fn validate_extension(value: [u64; 2], name: &str) -> Result<()> { + for (coordinate, word) in value.into_iter().enumerate() { + if word >= GOLDILOCKS_MODULUS { + bail!("{name} coordinate {coordinate} is not canonical Goldilocks"); + } + } + Ok(()) +} + +fn encode_extension(bytes: &mut Vec, value: [u64; 2]) { + bytes.extend_from_slice(&value[0].to_le_bytes()); + bytes.extend_from_slice(&value[1].to_le_bytes()); +} + +fn decode_extension(bytes: &[u8]) -> [u64; 2] { + [ + u64::from_le_bytes(bytes[..8].try_into().unwrap()), + u64::from_le_bytes(bytes[8..16].try_into().unwrap()), + ] +} + +fn sort_and_validate_slots(slots: &mut [(usize, T)]) -> Result<()> { + slots.sort_by_key(|(slot, _)| *slot); + for (expected, (observed, _)) in slots.iter().enumerate() { + if *observed != expected { + bail!( + "Flock FRI-fold table registry is incomplete: expected slot {expected}, observed {observed}" + ); + } + } + Ok(()) +} + +fn encode_bundle(bundle: &FriFoldProofBundle) -> Result> { + bincode::DefaultOptions::new() + .with_fixint_encoding() + .serialize(bundle) + .context("encode Flock FRI-fold conformance proof bundle") +} + +fn decode_bundle(bytes: &[u8]) -> Result { + bincode::DefaultOptions::new() + .with_fixint_encoding() + .with_limit(MAX_BUNDLE_BYTES as u64) + .reject_trailing_bytes() + .deserialize(bytes) + .context("invalid Flock FRI-fold conformance proof bundle") +} + +#[cfg(test)] +mod tests { + use aiur::vk_codec::aiur_config_system_to_bytes; + use ix_terminal::validate_and_expand_root_inputs; + use multi_stark::{ + expr::Expr, + lookup::{Lookup, WidthBinding}, + p3_matrix::dense::RowMajorMatrix, + system::{CircuitInputs, System, SystemWitness}, + types::{CommitmentParameters, GoldilocksBlake3Config}, + }; + + use super::*; + + fn prepared_stage2_pcs_fixture() + -> (ValidatedStage2RootV1, FriParameters, Vec, Vec, Vec) { + const CLAIM_WORDS: usize = 18; + const CLAIM_CIRCUIT_WIDTH: usize = CLAIM_WORDS + 2; + const TALL_HEIGHT: usize = 8; + const SHORT_HEIGHT: usize = 4; + + let commitment = CommitmentParameters { log_blowup: 1, cap_height: 0 }; + let fri = FriParameters { + log_final_poly_len: 0, + max_log_arity: 1, + num_queries: 2, + commit_proof_of_work_bits: 0, + query_proof_of_work_bits: 0, + }; + let claim: Vec<_> = (0..CLAIM_WORDS) + .map(|word| Val::from_u64(0x100 + u64::try_from(word).unwrap())) + .collect(); + let claim_lookup = Lookup::pull( + Expr::main(0), + (1..=CLAIM_WORDS) + .map(|column| Expr::main(u32::try_from(column).unwrap())) + .collect(), + ); + let multiplicity = Expr::main(0); + let multiplicity_is_boolean = + multiplicity.clone() * (multiplicity - Expr::constant(Val::ONE)); + let preprocessed_matches = + Expr::main(u32::try_from(CLAIM_CIRCUIT_WIDTH - 1).unwrap()) + - Expr::preprocessed(0); + let short_first = + Expr::IsFirstRow * (Expr::main(0) - Expr::constant(Val::from_u64(7))); + let short_transition = Expr::IsTransition + * (Expr::main_next(0) - Expr::main(0) - Expr::constant(Val::from_u64(9))); + let config = GoldilocksBlake3Config::new(commitment, fri) + .with_width_binding(WidthBinding::ByConstruction); + let (system, key) = System::new( + config, + [ + CircuitInputs { main_width: 1, ..Default::default() }, + CircuitInputs { + main_width: CLAIM_CIRCUIT_WIDTH, + preprocessed: Some(RowMajorMatrix::new( + (0..TALL_HEIGHT) + .map(|row| Val::from_u64(5 * u64::try_from(row).unwrap() + 3)) + .collect(), + 1, + )), + constraints: vec![multiplicity_is_boolean, preprocessed_matches], + lookups: vec![claim_lookup], + ..Default::default() + }, + CircuitInputs { + main_width: 3, + constraints: vec![short_first, short_transition], + ..Default::default() + }, + ], + ); + + let mut tall_values = vec![Val::ZERO; TALL_HEIGHT * CLAIM_CIRCUIT_WIDTH]; + tall_values[0] = Val::ONE; + tall_values[1..=CLAIM_WORDS].copy_from_slice(&claim); + for row in 0..TALL_HEIGHT { + tall_values[row * CLAIM_CIRCUIT_WIDTH + CLAIM_CIRCUIT_WIDTH - 1] = + Val::from_u64(5 * u64::try_from(row).unwrap() + 3); + } + let tall_trace = RowMajorMatrix::new(tall_values, CLAIM_CIRCUIT_WIDTH); + let short_trace = RowMajorMatrix::new( + (0..SHORT_HEIGHT * 3) + .map(|word| Val::from_u64(3 * u64::try_from(word).unwrap() + 7)) + .collect(), + 3, + ); + let proof = system.prove( + &key, + &claim, + SystemWitness::from_stage_1( + vec![RowMajorMatrix::new(Vec::new(), 1), tall_trace, short_trace], + &system, + ), + ); + system.verify(&claim, &proof).expect("fixture proof must verify"); + + let vk_bytes = aiur_config_system_to_bytes(&system, commitment, fri); + let claim_bytes: Vec<_> = claim + .iter() + .flat_map(|word| word.as_canonical_u64().to_le_bytes()) + .collect(); + let proof_bytes = proof.to_bytes().expect("encode fixture proof"); + let prepared = validate_and_expand_root_inputs( + &vk_bytes, + &claim_bytes, + &proof_bytes, + &fri, + ) + .expect("validate and expand fixture proof"); + (prepared, fri, vk_bytes, claim_bytes, proof_bytes) + } + + fn fixture() -> FriFoldQueryV1 { + FriFoldQueryV1 { + log_height: 4, + query_index: 0b1_0110, + folded: [0x1234_5678_9abc_def0, 0x0fed_cba9_8765_4321], + sibling: [17, GOLDILOCKS_MODULUS - 9], + beta: [0x1111_2222_3333_4444, 0x5555_6666_7777_8888], + opening_proof: (0..4u8) + .map(|level| { + *native_blake3::hash(&[b'f', b'r', b'i', level]).as_bytes() + }) + .collect(), + } + } + + fn commit_phase_fixture() -> FriCommitPhaseQueryV1 { + let mut query = FriCommitPhaseQueryV1 { + initial_log_height: 4, + query_index: 0b1_0110, + initial_folded: [0x1234_5678_9abc_def0, 0x0fed_cba9_8765_4321], + rounds: (0..3u8) + .map(|round| { + let depth = 4 - usize::from(round); + FriCommitPhaseRoundV1 { + sibling: [ + 17 + u64::from(round), + GOLDILOCKS_MODULUS - 9 - u64::from(round), + ], + beta: [ + 0x1111_2222_3333_4444 + u64::from(round), + 0x5555_6666_7777_8888 + u64::from(round), + ], + reduced_opening: (round != 1) + .then_some([100 + u64::from(round), 200 + u64::from(round)]), + opening_proof: (0..depth) + .map(|level| { + *native_blake3::hash(&[ + b'q', + round, + u8::try_from(level).unwrap(), + ]) + .as_bytes() + }) + .collect(), + } + }) + .collect(), + final_polynomial: [0, 0], + }; + let computation = compute_commit_phase(&query).unwrap(); + query.final_polynomial = *computation.results.last().unwrap(); + query + } + + fn pcs_reduction_fixture() -> PcsReducedOpeningV1 { + PcsReducedOpeningV1 { + log_height: 4, + query_index: 0b1010, + opened_values: vec![3, 5, 8, 13, 21], + opened_at_z: vec![ + [34, 55], + [89, 144], + [233, 377], + [610, 987], + [1597, 2584], + ], + zeta: [0x1020_3040_5060_7080, 0x1122_3344_5566_7788], + alpha: [0x3141_5926_5358_9793, 0x2384_6264_3383_2795], + initial_alpha_power: [7, 11], + initial_accumulator: [17, 19], + opening_proof: (0..4u8) + .map(|level| { + *native_blake3::hash(&[b'p', b'c', b's', level]).as_bytes() + }) + .collect(), + } + } + + fn wide_pcs_reduction_fixture() -> PcsReducedOpeningV1 { + let mut opening = pcs_reduction_fixture(); + opening.opened_values = (0..129u64).map(|column| 3 * column + 5).collect(); + opening.opened_at_z = + (0..129u64).map(|column| [7 * column + 11, 13 * column + 17]).collect(); + opening + } + + fn transcript_replay_fixture() -> Stage2TranscriptReplayV1 { + let mut initial_observations = b"multi-stark/v0".to_vec(); + for value in 0..19u64 { + initial_observations.extend_from_slice(&(value * 17 + 3).to_le_bytes()); + } + initial_observations.extend_from_slice(&[0xa5, 0x5a, 0x11]); + Stage2TranscriptReplayV1 { + initial_observations, + stage2_and_accumulator_observations: (0..79u8) + .map(|value| value.wrapping_mul(29)) + .collect(), + quotient_commitment_observations: (0..32u8) + .map(|value| value ^ 0x6d) + .collect(), + pcs_opening_observations: (0..117u8) + .map(|value| value.wrapping_mul(7).wrapping_add(1)) + .collect(), + } + } + + fn transcript_bound_pcs_fixture() + -> (Stage2TranscriptReplayV1, PcsReducedOpeningV1) { + let replay = transcript_replay_fixture(); + let challenges = replay.challenges().unwrap(); + let mut opening = pcs_reduction_fixture(); + opening.zeta = challenges.zeta; + opening.alpha = challenges.pcs_alpha; + (replay, opening) + } + + fn zero_extension_tree(log_height: u8) -> (Vec<[u8; 32]>, [u8; 32]) { + let mut current = *native_blake3::hash(&[0u8; 32]).as_bytes(); + let mut path = Vec::with_capacity(usize::from(log_height)); + for _ in 0..log_height { + path.push(current); + let mut message = [0u8; 64]; + message[..32].copy_from_slice(¤t); + message[32..].copy_from_slice(¤t); + current = *native_blake3::hash(&message).as_bytes(); + } + (path, current) + } + + fn transcript_bound_fri_fixture() -> ( + Stage2TranscriptReplayV1, + Stage2FriTranscriptReplayV1, + FriCommitPhaseQueryV1, + ) { + let prefix = transcript_replay_fixture(); + let initial_log_height = 4u8; + let round_count = 3usize; + let trees: Vec<_> = (0..round_count) + .map(|round| { + zero_extension_tree(initial_log_height - u8::try_from(round).unwrap()) + }) + .collect(); + let mut fri_transcript = Stage2FriTranscriptReplayV1 { + commit_phase_commitments: trees + .iter() + .map(|(_, root)| vec![*root]) + .collect(), + commit_pow_witnesses: vec![0; round_count], + final_polynomial: vec![[0, 0]], + log_arities: vec![1; round_count], + query_pow_witness: 0, + commit_pow_bits: 0, + query_pow_bits: 4, + num_queries: 5, + query_index_bits: initial_log_height + 1, + }; + let challenges = (0..1_000u64) + .find_map(|witness| { + fri_transcript.query_pow_witness = witness; + fri_transcript.challenges(&prefix).ok() + }) + .expect("small query-PoW fixture has a witness"); + let query = FriCommitPhaseQueryV1 { + initial_log_height, + query_index: u32::try_from(challenges.query_indices[0]).unwrap(), + initial_folded: [0, 0], + rounds: trees + .into_iter() + .zip(challenges.betas) + .map(|((opening_proof, _), beta)| FriCommitPhaseRoundV1 { + sibling: [0, 0], + beta, + reduced_opening: None, + opening_proof, + }) + .collect(), + final_polynomial: [0, 0], + }; + (prefix, fri_transcript, query) + } + + fn transcript_bound_fri_all_queries_fixture() -> ( + Stage2TranscriptReplayV1, + Stage2FriTranscriptReplayV1, + Vec, + ) { + let (prefix, mut fri_transcript, template) = transcript_bound_fri_fixture(); + fri_transcript.num_queries = 2; + let challenges = fri_transcript.challenges(&prefix).unwrap(); + let queries = challenges + .query_indices + .iter() + .map(|&query_index| { + let mut query = template.clone(); + query.query_index = u32::try_from(query_index).unwrap(); + query + }) + .collect(); + (prefix, fri_transcript, queries) + } + + fn linear_base_value(slope: u64, intercept: u64, x: u64) -> u64 { + (Val::from_u64(slope) * Val::from_u64(x) + Val::from_u64(intercept)) + .as_canonical_u64() + } + + fn linear_extension_value(slope: u64, intercept: u64, x: ExtVal) -> [u64; 2] { + extension_words( + ExtVal::new([Val::from_u64(slope), Val::ZERO]) * x + + ExtVal::new([Val::from_u64(intercept), Val::ZERO]), + ) + } + + fn hash_base_rows(rows: &[&[u64]]) -> [u8; 32] { + let mut bytes = Vec::new(); + for row in rows { + for &value in *row { + bytes.extend_from_slice(&value.to_le_bytes()); + } + } + *native_blake3::hash(&bytes).as_bytes() + } + + fn hash_children(left: &[u8; 32], right: &[u8; 32]) -> [u8; 32] { + let mut bytes = [0u8; 64]; + bytes[..32].copy_from_slice(left); + bytes[32..].copy_from_slice(right); + *native_blake3::hash(&bytes).as_bytes() + } + + fn multiheight_batch_root_and_path( + matrix_heights: &[u8], + matrix_rows: &[Vec>], + query_index: usize, + ) -> ([u8; 32], Vec<[u8; 32]>) { + let log_max = *matrix_heights.iter().max().unwrap(); + let leaf_layer = |height: u8| { + (0..1usize << height) + .map(|row_index| { + let rows: Vec<_> = matrix_heights + .iter() + .zip(matrix_rows) + .filter(|(matrix_height, _)| **matrix_height == height) + .map(|(_, rows)| rows[row_index].as_slice()) + .collect(); + hash_base_rows(&rows) + }) + .collect::>() + }; + let mut current = leaf_layer(log_max); + let mut index = query_index; + let mut path = Vec::with_capacity(usize::from(log_max)); + for next_height in (0..log_max).rev() { + path.push(current[index ^ 1]); + let mut parents: Vec<_> = current + .as_chunks::<2>() + .0 + .iter() + .map(|children| hash_children(&children[0], &children[1])) + .collect(); + if matrix_heights.contains(&next_height) { + for (parent, injected) in + parents.iter_mut().zip(leaf_layer(next_height)) + { + *parent = hash_children(parent, &injected); + } + } + current = parents; + index >>= 1; + } + (current[0], path) + } + + fn constant_extension_tree_root_and_path( + value: [u64; 2], + log_height: u8, + query_index: usize, + ) -> ([u8; 32], Vec<[u8; 32]>) { + let mut leaf_bytes = [0u8; 32]; + for (chunk, word) in leaf_bytes + .as_chunks_mut::<8>() + .0 + .iter_mut() + .zip([value[0], value[1], value[0], value[1]]) + { + chunk.copy_from_slice(&word.to_le_bytes()); + } + let leaf = *native_blake3::hash(&leaf_bytes).as_bytes(); + let mut current = vec![leaf; 1usize << log_height]; + let mut index = query_index; + let mut path = Vec::with_capacity(usize::from(log_height)); + for _ in 0..log_height { + path.push(current[index ^ 1]); + current = current + .as_chunks::<2>() + .0 + .iter() + .map(|children| hash_children(&children[0], &children[1])) + .collect(); + index >>= 1; + } + (current[0], path) + } + + fn transcript_bound_pcs_fri_fixture() -> ( + Stage2TranscriptReplayV1, + Stage2FriTranscriptReplayV1, + Stage2PcsInstanceV1, + Vec, + ) { + const LOG_GLOBAL: u8 = 4; + const LOG_BLOWUP: u8 = 1; + let matrix_heights = [4u8, 3u8]; + let matrix_rows = vec![ + (0..1u32 << matrix_heights[0]) + .map(|index| { + let x = pcs_query_point(matrix_heights[0], index); + vec![linear_base_value(2, 11, x), linear_base_value(3, 17, x)] + }) + .collect::>(), + (0..1u32 << matrix_heights[1]) + .map(|index| { + let x = pcs_query_point(matrix_heights[1], index); + vec![linear_base_value(5, 23, x)] + }) + .collect::>(), + ]; + let (input_root, _) = + multiheight_batch_root_and_path(&matrix_heights, &matrix_rows, 0); + + let mut prefix = Stage2TranscriptReplayV1 { + initial_observations: input_root.to_vec(), + stage2_and_accumulator_observations: vec![0x31; 48], + quotient_commitment_observations: vec![0x52; 32], + pcs_opening_observations: vec![0; 3 * 16], + }; + let zeta = native_extension(prefix.challenges().unwrap().zeta); + let opened_values = [ + linear_extension_value(2, 11, zeta), + linear_extension_value(3, 17, zeta), + linear_extension_value(5, 23, zeta), + ]; + prefix.pcs_opening_observations.clear(); + for value in opened_values { + encode_extension(&mut prefix.pcs_opening_observations, value); + } + + let prefix_challenges = prefix.challenges().unwrap(); + let alpha = native_extension(prefix_challenges.pcs_alpha); + let max_reduced = ExtVal::new([Val::from_u64(2), Val::ZERO]) + + alpha * ExtVal::new([Val::from_u64(3), Val::ZERO]); + let shorter_reduced = ExtVal::new([Val::from_u64(5), Val::ZERO]); + let mut current = max_reduced; + let mut round_values = Vec::new(); + + let (round_0_root, _) = + constant_extension_tree_root_and_path(extension_words(current), 3, 0); + let mut fri_transcript = Stage2FriTranscriptReplayV1 { + commit_phase_commitments: vec![ + vec![round_0_root], + vec![[0; 32]], + vec![[0; 32]], + ], + commit_pow_witnesses: vec![0; 3], + final_polynomial: vec![[0, 0]], + log_arities: vec![1; 3], + query_pow_witness: 0, + commit_pow_bits: 0, + query_pow_bits: 0, + num_queries: 1, + query_index_bits: LOG_GLOBAL, + }; + let beta_0 = + native_extension(fri_transcript.challenges(&prefix).unwrap().betas[0]); + round_values.push(extension_words(current)); + current += beta_0 * beta_0 * shorter_reduced; + let (round_1_root, _) = + constant_extension_tree_root_and_path(extension_words(current), 2, 0); + fri_transcript.commit_phase_commitments[1][0] = round_1_root; + + let _beta_1 = fri_transcript.challenges(&prefix).unwrap().betas[1]; + round_values.push(extension_words(current)); + let (round_2_root, _) = + constant_extension_tree_root_and_path(extension_words(current), 1, 0); + fri_transcript.commit_phase_commitments[2][0] = round_2_root; + round_values.push(extension_words(current)); + fri_transcript.final_polynomial[0] = extension_words(current); + let challenges = fri_transcript.challenges(&prefix).unwrap(); + let query_index = u32::try_from(challenges.query_indices[0]).unwrap(); + + let (_, input_path) = multiheight_batch_root_and_path( + &matrix_heights, + &matrix_rows, + usize::try_from(query_index).unwrap(), + ); + let batch_opening = Stage2PcsBatchOpeningV1 { + opened_rows: vec![ + matrix_rows[0][usize::try_from(query_index).unwrap()].clone(), + matrix_rows[1][usize::try_from(query_index >> 1).unwrap()].clone(), + ], + opening_proof: input_path, + }; + let rounds = (0..3usize) + .map(|round| { + let tree_height = 3 - u8::try_from(round).unwrap(); + let row_index = usize::try_from(query_index >> (round + 1)).unwrap(); + let (_, path) = constant_extension_tree_root_and_path( + round_values[round], + tree_height, + row_index, + ); + FriCommitPhaseRoundV1 { + sibling: round_values[round], + beta: challenges.betas[round], + reduced_opening: (round == 0) + .then_some(extension_words(shorter_reduced)), + opening_proof: path, + } + }) + .collect(); + let fri_query = FriCommitPhaseQueryV1 { + initial_log_height: LOG_GLOBAL - 1, + query_index, + initial_folded: extension_words(max_reduced), + rounds, + final_polynomial: extension_words(current), + }; + let instance = Stage2PcsInstanceV1 { + log_global_height: LOG_GLOBAL, + log_blowup: LOG_BLOWUP, + batches: vec![Stage2PcsBatchV1 { + commitment: Stage2TranscriptByteBindingV1::new( + Stage2TranscriptSegmentV1::Initial, + 0, + ), + matrices: vec![ + Stage2PcsMatrixV1 { + log_height: matrix_heights[0], + width: 2, + opening_points: vec![Stage2PcsOpeningPointV1::Zeta], + opened_values: Stage2TranscriptByteBindingV1::new( + Stage2TranscriptSegmentV1::PcsOpening, + 0, + ), + }, + Stage2PcsMatrixV1 { + log_height: matrix_heights[1], + width: 1, + opening_points: vec![Stage2PcsOpeningPointV1::Zeta], + opened_values: Stage2TranscriptByteBindingV1::new( + Stage2TranscriptSegmentV1::PcsOpening, + 32, + ), + }, + ], + }], + }; + let query = TranscriptBoundPcsFriQueryV1 { + pcs: Stage2PcsQueryV1 { batch_openings: vec![batch_opening] }, + fri: fri_query, + }; + (prefix, fri_transcript, instance, vec![query]) + } + + #[test] + fn native_fold_satisfies_denominator_free_identity() { + for query_index in [0, 1, 0b1_0110, 0b1_1111] { + let mut query = fixture(); + query.query_index = query_index; + let result = native_extension(query.folded_result().unwrap()); + let (e0, e1) = ordered_evaluations(&query); + let e0 = native_extension(e0); + let e1 = native_extension(e1); + let beta = native_extension(query.beta); + let s = ExtVal::new([Val::from_u64(subgroup_point(&query)), Val::ZERO]); + let two_s = s + s; + assert_eq!(two_s * result + beta * e1, s * (e0 + e1) + beta * e0); + } + } + + #[test] + fn leaf_and_path_bind_pair_order_and_all_index_bits() { + let query = fixture(); + let root = query.commitment_root().unwrap(); + let mut pair_bit = query.clone(); + pair_bit.query_index ^= 1; + assert_ne!(pair_bit.commitment_root().unwrap(), root); + let mut path_bit = query.clone(); + path_bit.query_index ^= 1 << 3; + assert_ne!(path_bit.commitment_root().unwrap(), root); + assert_ne!( + pair_bit.folded_result().unwrap(), + query.folded_result().unwrap() + ); + } + + #[test] + fn parser_is_strict_before_crypto() { + let query = fixture(); + let artifact = FriFoldConformanceArtifactV1 { + folded_result: query.folded_result().unwrap(), + commitment_root: query.commitment_root().unwrap(), + query, + circuit_digest: [7; 32], + proof_bundle_bytes: vec![1, 2, 3], + }; + let mut bytes = artifact.to_bytes(); + assert!(FriFoldConformanceArtifactV1::from_bytes(&bytes).is_err()); + bytes[0] ^= 1; + assert!(FriFoldConformanceArtifactV1::from_bytes(&bytes).is_err()); + } + + #[test] + fn commit_phase_threads_shifted_index_and_folded_results() { + let query = commit_phase_fixture(); + let computation = compute_commit_phase(&query).unwrap(); + ensure_final_polynomial(&query, &computation).unwrap(); + assert_eq!(computation.round_queries.len(), 3); + assert_eq!( + computation.round_queries[1].query_index, + query.query_index >> 1 + ); + assert_eq!(computation.round_queries[1].folded, computation.results[0]); + assert_ne!(computation.fold_results[0], computation.results[0]); + assert_eq!(computation.fold_results[1], computation.results[1]); + assert_eq!(computation.results[2], query.final_polynomial); + assert_eq!(query.commitment_roots().unwrap(), computation.roots); + + let mut wrong_beta = query.clone(); + wrong_beta.rounds[1].beta[0] ^= 1; + assert!(wrong_beta.folded_results().is_err()); + } + + #[test] + fn commit_phase_parser_is_strict_before_crypto() { + let query = commit_phase_fixture(); + let artifact = FriCommitPhaseConformanceArtifactV1 { + commitment_roots: query.commitment_roots().unwrap(), + query, + circuit_digest: [9; 32], + proof_bundle_bytes: vec![1, 2, 3], + }; + let mut bytes = artifact.to_bytes(); + assert!(FriCommitPhaseConformanceArtifactV1::from_bytes(&bytes).is_err()); + bytes[0] ^= 1; + assert!(FriCommitPhaseConformanceArtifactV1::from_bytes(&bytes).is_err()); + } + + #[test] + fn pcs_reduction_quotients_and_accumulator_match_reference_field() { + let opening = pcs_reduction_fixture(); + let computation = compute_pcs_reduction(&opening).unwrap(); + let denominator = native_extension(computation.denominator); + for (((&px, &pz), "ient), column) in opening + .opened_values + .iter() + .zip(&opening.opened_at_z) + .zip(&computation.quotients) + .zip(0..opening.opened_values.len()) + { + let px = ExtVal::new([Val::from_u64(px), Val::ZERO]); + assert_eq!( + denominator * native_extension(quotient) + px, + native_extension(pz), + "column {column}" + ); + } + assert_eq!(opening.reduced_accumulator().unwrap(), computation.accumulator); + assert_eq!(opening.next_alpha_power().unwrap(), computation.alpha_power); + assert_eq!(opening.commitment_root().unwrap(), computation.root); + + let mut changed_index = opening; + changed_index.query_index ^= 1; + assert_ne!(changed_index.commitment_root().unwrap(), computation.root); + } + + #[test] + fn pcs_leaf_hash_supports_multiple_blocks_and_blake3_chunks() { + let opening = wide_pcs_reduction_fixture(); + assert!(opening.opened_values.len() * 8 > 1_024); + let computation = compute_pcs_reduction(&opening).unwrap(); + let relation = PcsReductionRelation::build(&opening).unwrap(); + let inputs = pcs_reduction_relation_inputs(&opening, &computation); + let public = pcs_reduction_relation_public(&opening, &computation); + let witness = relation.shape.run(&inputs, &[]); + assert_eq!(witness.public, public); + assert!( + witness.rows::(relation.slots.blake3).len() + > opening.opening_proof.len() + 1 + ); + assert_eq!(computation.root, native_pcs_row_root(&opening)); + } + + #[test] + fn pcs_reduction_parser_is_strict_before_crypto() { + let opening = pcs_reduction_fixture(); + let computation = compute_pcs_reduction(&opening).unwrap(); + let artifact = PcsReductionConformanceArtifactV1 { + opening, + reduced_accumulator: computation.accumulator, + next_alpha_power: computation.alpha_power, + circuit_digest: [11; 32], + commitment_root: computation.root, + proof_bundle_bytes: vec![1, 2, 3], + }; + let mut bytes = artifact.to_bytes(); + assert!(PcsReductionConformanceArtifactV1::from_bytes(&bytes).is_err()); + bytes[0] ^= 1; + assert!(PcsReductionConformanceArtifactV1::from_bytes(&bytes).is_err()); + } + + #[test] + fn transcript_challenges_feed_pcs_wires_in_one_circuit() { + let (replay, opening) = transcript_bound_pcs_fixture(); + let challenges = replay.challenges().unwrap(); + let computation = compute_pcs_reduction(&opening).unwrap(); + let relation = TranscriptBoundPcsReductionRelation::build( + &replay, + &opening, + &computation, + challenges, + ) + .unwrap(); + let witness = relation.shape.run(&relation.inputs, &[]); + assert_eq!(witness.public, relation.public); + + let mut wrong_opening = opening; + wrong_opening.alpha[0] ^= 1; + assert!( + TranscriptBoundPcsReductionRelation::build( + &replay, + &wrong_opening, + &compute_pcs_reduction(&wrong_opening).unwrap(), + challenges, + ) + .is_err() + ); + } + + #[test] + fn transcript_betas_indices_caps_and_final_poly_feed_one_fri_circuit() { + let (prefix, fri_transcript, query) = transcript_bound_fri_fixture(); + let challenges = fri_transcript.challenges(&prefix).unwrap(); + assert_eq!(challenges.query_indices.len(), 5); + let computation = compute_commit_phase(&query).unwrap(); + let relation = TranscriptBoundFriCommitPhaseRelation::build( + &prefix, + &fri_transcript, + &challenges, + 0, + &query, + &computation, + ) + .unwrap(); + let witness = relation.shape.run(&relation.inputs, &[]); + assert_eq!(witness.public, relation.public); + + let mut wrong_beta = query.clone(); + wrong_beta.rounds[0].beta[0] ^= 1; + assert!( + ensure_transcript_binds_fri_query( + &fri_transcript, + &challenges, + 0, + &wrong_beta, + ) + .is_err() + ); + let mut wrong_index = query; + wrong_index.query_index ^= 1; + assert!( + ensure_transcript_binds_fri_query( + &fri_transcript, + &challenges, + 0, + &wrong_index, + ) + .is_err() + ); + } + + #[test] + fn one_transcript_drives_every_fri_query_in_one_circuit() { + let (prefix, fri_transcript, queries) = + transcript_bound_fri_all_queries_fixture(); + let challenges = fri_transcript.challenges(&prefix).unwrap(); + let computations = validate_all_transcript_bound_fri_queries( + &fri_transcript, + &challenges, + &queries, + ) + .unwrap(); + let relation = TranscriptBoundFriCommitPhaseRelation::build_all( + &prefix, + &fri_transcript, + &challenges, + &queries, + &computations, + ) + .unwrap(); + let witness = relation.shape.run(&relation.inputs, &[]); + assert_eq!(witness.public, relation.public); + + let mut missing = queries.clone(); + missing.pop(); + assert!( + validate_all_transcript_bound_fri_queries( + &fri_transcript, + &challenges, + &missing, + ) + .is_err() + ); + } + + #[test] + fn authenticated_multiheight_pcs_buckets_feed_fri_in_one_circuit() { + let (prefix, fri_transcript, pcs_instance, queries) = + transcript_bound_pcs_fri_fixture(); + let prefix_challenges = prefix.challenges().unwrap(); + let fri_challenges = fri_transcript.challenges(&prefix).unwrap(); + let (fri_computations, pcs_computations) = + validate_all_transcript_bound_pcs_fri_queries( + &prefix, + &fri_transcript, + &fri_challenges, + prefix_challenges, + &pcs_instance, + &queries, + ) + .unwrap(); + assert_eq!(pcs_computations[0].reduced_openings.len(), 2); + let relation = TranscriptBoundFriCommitPhaseRelation::build_all_with_pcs( + &prefix, + &fri_transcript, + &fri_challenges, + &pcs_instance, + &queries, + &fri_computations, + &pcs_computations, + ) + .unwrap(); + let witness = relation.shape.run(&relation.inputs, &[]); + assert_eq!(witness.public, relation.public); + assert!(witness.rows::(relation.slots.blake3).len() > 20); + + let mut wrong_row = queries.clone(); + wrong_row[0].pcs.batch_openings[0].opened_rows[1][0] ^= 1; + assert!( + validate_all_transcript_bound_pcs_fri_queries( + &prefix, + &fri_transcript, + &fri_challenges, + prefix_challenges, + &pcs_instance, + &wrong_row, + ) + .is_err() + ); + let mut wrong_rollin = queries; + wrong_rollin[0].fri.rounds[0].reduced_opening.as_mut().unwrap()[0] ^= 1; + assert!( + validate_all_transcript_bound_pcs_fri_queries( + &prefix, + &fri_transcript, + &fri_challenges, + prefix_challenges, + &pcs_instance, + &wrong_rollin, + ) + .is_err() + ); + } + + #[test] + fn real_stage2_root_lowers_to_the_combined_pcs_fri_relation() { + let (prepared, fri, _, _, _) = prepared_stage2_pcs_fixture(); + let lowered = + Stage2PcsFriWitnessV1::from_prepared(&prepared, &fri).unwrap(); + let air = + Stage2AirProgramV1::from_prepared(&prepared, &fri, &lowered.pcs_instance) + .unwrap(); + + assert_eq!(lowered.pcs_instance.batches.len(), 4); + assert!( + lowered + .pcs_instance + .batches + .iter() + .take(3) + .all(|batch| batch.matrices.len() == 2) + ); + assert_eq!(lowered.pcs_instance.batches.get(3).unwrap().matrices.len(), 1); + assert_eq!(lowered.queries.len(), fri.num_queries); + + let prefix_challenges = lowered.prefix.challenges().unwrap(); + let fri_challenges = + lowered.fri_transcript.challenges(&lowered.prefix).unwrap(); + let (fri_computations, pcs_computations) = + validate_all_transcript_bound_pcs_fri_queries( + &lowered.prefix, + &lowered.fri_transcript, + &fri_challenges, + prefix_challenges, + &lowered.pcs_instance, + &lowered.queries, + ) + .unwrap(); + let relation = + TranscriptBoundFriCommitPhaseRelation::build_all_with_pcs_and_air( + &lowered.prefix, + &lowered.fri_transcript, + &fri_challenges, + &lowered.pcs_instance, + &air, + &lowered.queries, + &fri_computations, + &pcs_computations, + ) + .unwrap(); + let relation_witness = relation.shape.run(&relation.inputs, &[]); + assert_eq!(relation_witness.public, relation.public); + + let mut wrong_row = lowered.queries; + wrong_row[0].pcs.batch_openings[0].opened_rows[0][0] ^= 1; + assert!( + validate_all_transcript_bound_pcs_fri_queries( + &lowered.prefix, + &lowered.fri_transcript, + &fri_challenges, + prefix_challenges, + &lowered.pcs_instance, + &wrong_row, + ) + .is_err() + ); + } + + #[test] + #[ignore = "real production Flock proof of a complete Stage 2 verifier"] + fn real_stage2_production_artifact_round_trip() { + let (prepared, fri, vk_bytes, claim_bytes, proof_bytes) = + prepared_stage2_pcs_fixture(); + let backend = crate::FlockStage3Backend; + let artifact = backend + .prove_stage2(&vk_bytes, &claim_bytes, &proof_bytes, &fri) + .expect("prove complete Stage 3 relation"); + eprintln!( + "Flock complete Stage 3 artifact: {} bytes (payload: {} bytes)", + artifact.to_bytes().len(), + artifact.proof_bytes().len(), + ); + let encoded = artifact.to_bytes(); + let decoded = crate::Stage3ArtifactV1::from_bytes(&encoded).unwrap(); + backend + .verify_stage2(&decoded, decoded.statement()) + .expect("verify complete Stage 3 relation"); + + let wrong_relation = + crate::Stage3StatementV1::new(prepared.statement(), [0xa5; 32]); + assert!(backend.verify_stage2(&decoded, &wrong_relation).is_err()); + + let mut corrupted = encoded; + let flip_at = corrupted.len() - 1; + corrupted[flip_at] ^= 1; + let corrupted = crate::Stage3ArtifactV1::from_bytes(&corrupted).unwrap(); + assert!(backend.verify_stage2(&corrupted, corrupted.statement()).is_err()); + } + + #[test] + #[ignore = "real Flock authenticated FRI-fold proof; run explicitly"] + fn real_authenticated_fri_fold_round_trip_and_mutations() { + let artifact = prove_fri_fold_conformance(&fixture()).expect("prove fold"); + eprintln!( + "Flock authenticated FRI-fold conformance bundle: {} bytes", + artifact.proof_bundle_bytes().len() + ); + verify_fri_fold_conformance(&artifact).expect("verify fold"); + let decoded = + FriFoldConformanceArtifactV1::from_bytes(&artifact.to_bytes()).unwrap(); + verify_fri_fold_conformance(&decoded).expect("verify decoded fold"); + + let mut wrong_sibling = decoded.clone(); + wrong_sibling.query.opening_proof[2][7] ^= 1; + assert!(verify_fri_fold_conformance(&wrong_sibling).is_err()); + let mut wrong_beta = decoded.clone(); + wrong_beta.query.beta[1] ^= 1; + assert!(verify_fri_fold_conformance(&wrong_beta).is_err()); + let mut wrong_result = decoded.clone(); + wrong_result.folded_result[0] ^= 1; + assert!(verify_fri_fold_conformance(&wrong_result).is_err()); + let mut wrong_proof = decoded; + let flip_at = wrong_proof.proof_bundle_bytes.len() / 2; + wrong_proof.proof_bundle_bytes[flip_at] ^= 1; + assert!(verify_fri_fold_conformance(&wrong_proof).is_err()); + } + + #[test] + #[ignore = "real Flock FRI commit-phase query proof; run explicitly"] + fn real_fri_commit_phase_round_trip_and_mutations() { + let artifact = prove_fri_commit_phase_conformance(&commit_phase_fixture()) + .expect("prove commit phase"); + eprintln!( + "Flock FRI commit-phase conformance bundle: {} bytes", + artifact.proof_bundle_bytes().len() + ); + verify_fri_commit_phase_conformance(&artifact) + .expect("verify commit phase"); + let decoded = + FriCommitPhaseConformanceArtifactV1::from_bytes(&artifact.to_bytes()) + .unwrap(); + verify_fri_commit_phase_conformance(&decoded) + .expect("verify decoded commit phase"); + + let mut wrong_path = decoded.clone(); + wrong_path.query.rounds[1].opening_proof[0][5] ^= 1; + assert!(verify_fri_commit_phase_conformance(&wrong_path).is_err()); + let mut wrong_final = decoded.clone(); + wrong_final.query.final_polynomial[1] ^= 1; + assert!(verify_fri_commit_phase_conformance(&wrong_final).is_err()); + let mut wrong_root = decoded.clone(); + wrong_root.commitment_roots[2][3] ^= 1; + assert!(verify_fri_commit_phase_conformance(&wrong_root).is_err()); + let mut wrong_proof = decoded; + let flip_at = wrong_proof.proof_bundle_bytes.len() / 2; + wrong_proof.proof_bundle_bytes[flip_at] ^= 1; + assert!(verify_fri_commit_phase_conformance(&wrong_proof).is_err()); + } + + #[test] + #[ignore = "real Flock authenticated PCS-reduction proof; run explicitly"] + fn real_pcs_reduction_round_trip_and_mutations() { + let artifact = prove_pcs_reduction_conformance(&pcs_reduction_fixture()) + .expect("prove PCS reduction"); + eprintln!( + "Flock PCS-reduction conformance bundle: {} bytes", + artifact.proof_bundle_bytes().len() + ); + verify_pcs_reduction_conformance(&artifact).expect("verify PCS reduction"); + let decoded = + PcsReductionConformanceArtifactV1::from_bytes(&artifact.to_bytes()) + .unwrap(); + verify_pcs_reduction_conformance(&decoded) + .expect("verify decoded PCS reduction"); + + let mut wrong_value = decoded.clone(); + wrong_value.opening.opened_values[2] ^= 1; + assert!(verify_pcs_reduction_conformance(&wrong_value).is_err()); + let mut wrong_ood = decoded.clone(); + wrong_ood.opening.opened_at_z[1][0] ^= 1; + assert!(verify_pcs_reduction_conformance(&wrong_ood).is_err()); + let mut wrong_result = decoded.clone(); + wrong_result.reduced_accumulator[0] ^= 1; + assert!(verify_pcs_reduction_conformance(&wrong_result).is_err()); + let mut wrong_proof = decoded; + let flip_at = wrong_proof.proof_bundle_bytes.len() / 2; + wrong_proof.proof_bundle_bytes[flip_at] ^= 1; + assert!(verify_pcs_reduction_conformance(&wrong_proof).is_err()); + } + + #[test] + #[ignore = "real transcript-bound Flock PCS proof; run explicitly"] + fn real_transcript_bound_pcs_round_trip_and_mutations() { + let (replay, opening) = transcript_bound_pcs_fixture(); + let artifact = + prove_transcript_bound_pcs_reduction_conformance(&replay, &opening) + .expect("prove transcript-bound PCS reduction"); + eprintln!( + "Flock transcript-bound PCS conformance bundle: {} bytes", + artifact.proof_bundle_bytes().len() + ); + verify_transcript_bound_pcs_reduction_conformance(&artifact) + .expect("verify transcript-bound PCS reduction"); + + let mut wrong_transcript = artifact.clone(); + wrong_transcript.replay.pcs_opening_observations[0] ^= 1; + assert!( + verify_transcript_bound_pcs_reduction_conformance(&wrong_transcript) + .is_err() + ); + let mut wrong_opening = artifact.clone(); + wrong_opening.opening.opened_values[0] ^= 1; + assert!( + verify_transcript_bound_pcs_reduction_conformance(&wrong_opening) + .is_err() + ); + let mut wrong_proof = artifact; + let flip_at = wrong_proof.proof_bundle_bytes.len() / 2; + wrong_proof.proof_bundle_bytes[flip_at] ^= 1; + assert!( + verify_transcript_bound_pcs_reduction_conformance(&wrong_proof).is_err() + ); + } + + #[test] + #[ignore = "real transcript-bound Flock FRI-query proof; run explicitly"] + fn real_transcript_bound_fri_round_trip_and_mutations() { + let (prefix, fri_transcript, query) = transcript_bound_fri_fixture(); + let artifact = prove_transcript_bound_fri_commit_phase_conformance( + &prefix, + &fri_transcript, + 0, + &query, + ) + .expect("prove transcript-bound FRI query"); + eprintln!( + "Flock transcript-bound FRI-query conformance bundle: {} bytes", + artifact.proof_bundle_bytes().len() + ); + verify_transcript_bound_fri_commit_phase_conformance(&artifact) + .expect("verify transcript-bound FRI query"); + + let mut wrong_cap = artifact.clone(); + wrong_cap.fri_transcript.commit_phase_commitments[1][0][7] ^= 1; + assert!( + verify_transcript_bound_fri_commit_phase_conformance(&wrong_cap).is_err() + ); + let mut wrong_query = artifact.clone(); + wrong_query.query.query_index ^= 1; + assert!( + verify_transcript_bound_fri_commit_phase_conformance(&wrong_query) + .is_err() + ); + let mut wrong_final = artifact.clone(); + wrong_final.fri_transcript.final_polynomial[0][0] ^= 1; + assert!( + verify_transcript_bound_fri_commit_phase_conformance(&wrong_final) + .is_err() + ); + let mut wrong_proof = artifact; + let flip_at = wrong_proof.proof_bundle_bytes.len() / 2; + wrong_proof.proof_bundle_bytes[flip_at] ^= 1; + assert!( + verify_transcript_bound_fri_commit_phase_conformance(&wrong_proof) + .is_err() + ); + } + + #[test] + #[ignore = "real all-query transcript-bound Flock FRI proof; run explicitly"] + fn real_transcript_bound_fri_all_queries_round_trip_and_mutations() { + let (prefix, fri_transcript, queries) = + transcript_bound_fri_all_queries_fixture(); + let artifact = prove_transcript_bound_fri_queries_conformance( + &prefix, + &fri_transcript, + &queries, + ) + .expect("prove every transcript-bound FRI query"); + eprintln!( + "Flock all-query transcript-bound FRI bundle: {} bytes", + artifact.proof_bundle_bytes().len() + ); + verify_transcript_bound_fri_queries_conformance(&artifact) + .expect("verify every transcript-bound FRI query"); + + let mut wrong_query = artifact.clone(); + wrong_query.queries[1].query_index ^= 1; + assert!( + verify_transcript_bound_fri_queries_conformance(&wrong_query).is_err() + ); + let mut missing_query = artifact.clone(); + missing_query.queries.pop(); + assert!( + verify_transcript_bound_fri_queries_conformance(&missing_query).is_err() + ); + let mut wrong_proof = artifact; + let flip_at = wrong_proof.proof_bundle_bytes.len() / 2; + wrong_proof.proof_bundle_bytes[flip_at] ^= 1; + assert!( + verify_transcript_bound_fri_queries_conformance(&wrong_proof).is_err() + ); + } + + #[test] + #[ignore = "real transcript-bound PCS-to-FRI Flock proof; run explicitly"] + fn real_transcript_bound_pcs_fri_round_trip_and_mutations() { + let (prefix, fri_transcript, pcs_instance, queries) = + transcript_bound_pcs_fri_fixture(); + let artifact = prove_transcript_bound_pcs_fri_queries_conformance( + &prefix, + &fri_transcript, + &pcs_instance, + &queries, + ) + .expect("prove transcript-bound PCS-to-FRI relation"); + eprintln!( + "Flock transcript-bound PCS-to-FRI bundle: {} bytes", + artifact.proof_bundle_bytes().len() + ); + verify_transcript_bound_pcs_fri_queries_conformance(&artifact) + .expect("verify transcript-bound PCS-to-FRI relation"); + + let mut wrong_row = artifact.clone(); + wrong_row.queries[0].pcs.batch_openings[0].opened_rows[0][0] ^= 1; + assert!( + verify_transcript_bound_pcs_fri_queries_conformance(&wrong_row).is_err() + ); + let mut wrong_ood = artifact.clone(); + wrong_ood.prefix.pcs_opening_observations[0] ^= 1; + assert!( + verify_transcript_bound_pcs_fri_queries_conformance(&wrong_ood).is_err() + ); + let mut wrong_proof = artifact; + let flip_at = wrong_proof.proof_bundle_bytes.len() / 2; + wrong_proof.proof_bundle_bytes[flip_at] ^= 1; + assert!( + verify_transcript_bound_pcs_fri_queries_conformance(&wrong_proof) + .is_err() + ); + } +} diff --git a/flock-stage3/host/src/goldilocks.rs b/flock-stage3/host/src/goldilocks.rs new file mode 100644 index 000000000..fa4253f36 --- /dev/null +++ b/flock-stage3/host/src/goldilocks.rs @@ -0,0 +1,590 @@ +//! Boolean R1CS gadgets for Goldilocks values carried as little-endian u64s. +//! +//! Flock's circuit wiring moves one `F128` word at a time. One gate therefore +//! checks two Goldilocks representatives at once and exposes a 128-bit +//! violation word. The circuit connects that output to a fixed zero wire. + +use std::sync::OnceLock; + +use flock_prover::{ + circuit::builder::{GateType, SlotWitness}, + field::F128, + lincheck::pack_z_lincheck, + r1cs::{BlockR1cs, SparseBinaryMatrix, WitnessLayout}, + schedule::{IoWord, TableType}, +}; + +use crate::boolean::{ + BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, + write_f128 as write_boolean_f128, +}; + +pub(crate) const GOLDILOCKS_MODULUS: u64 = 0xffff_ffff_0000_0001; +const K_LOG: usize = 9; +const K: usize = 1 << K_LOG; +const K_SKIP: usize = 6; +const INPUT_BASE: usize = 0; +const VIOLATION_BASE: usize = 128; +const FIRST_CHAIN_BASE: usize = 256; +const SECOND_CHAIN_BASE: usize = FIRST_CHAIN_BASE + 31; +const USEFUL_BITS: usize = SECOND_CHAIN_BASE + 31; + +const ADD_K_LOG: usize = 11; +const ADD_LEFT_BASE: usize = 0; +const ADD_RIGHT_BASE: usize = 128; +const ADD_RESULT_BASE: usize = 256; +const ADD_VIOLATION_BASE: usize = 384; +const ADD_TOP_VIOLATION_BASE: usize = 512; +const ADD_RESERVED_COLUMNS: usize = 640; + +/// One R1CS row record for a pair of little-endian Goldilocks candidates. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub(crate) struct CanonicalGoldilocksPairRow(F128); + +/// A word-aligned Boolean gate that checks two canonical Goldilocks values. +/// +/// Its sole output is zero exactly when both input u64 limbs are below +/// `2^64 - 2^32 + 1`. Callers must connect that output to a fixed zero wire; +/// the table alone intentionally exposes, rather than silently pins, the +/// violation bits. +#[derive(Clone, Copy, Debug)] +pub(crate) struct CanonicalGoldilocksPairGate { + pub(crate) nu: usize, +} + +impl GateType for CanonicalGoldilocksPairGate { + type Row = CanonicalGoldilocksPairRow; + type Hint = (); + + fn table(&self) -> TableType { + TableType::from_block_r1cs(&build_canonical_pair_r1cs(self.nu)) + .with_io_schema(vec![IoWord::input(0), IoWord::output(1)]) + } + + fn eval( + &self, + inputs: &[F128], + _hint: &(), + outputs: &mut Vec, + ) -> Self::Row { + let value = inputs[0]; + outputs.push(violation_word(value)); + CanonicalGoldilocksPairRow(value) + } + + fn witness(&self, _rows: &[Self::Row], _nu: usize) -> SlotWitness { + SlotWitness::DeferredToRows + } +} + +/// Build the Boolean relation used by [`CanonicalGoldilocksPairGate`]. +pub(crate) fn build_canonical_pair_r1cs(nu: usize) -> BlockR1cs { + assert!(nu >= 3, "Flock lincheck requires at least eight rows"); + + let mut a_rows = vec![Vec::new(); K]; + let mut b_rows = vec![Vec::new(); K]; + + // Input bits are free Boolean values: x * x = x over GF(2). + for bit in 0..128 { + a_rows[INPUT_BASE + bit].push(INPUT_BASE + bit); + b_rows[INPUT_BASE + bit].push(INPUT_BASE + bit); + } + + // Fold each limb's high 32 bits to one `high_is_all_ones` bit. + add_and_chain(&mut a_rows, &mut b_rows, 32, FIRST_CHAIN_BASE); + add_and_chain(&mut a_rows, &mut b_rows, 96, SECOND_CHAIN_BASE); + + // x >= p iff its high 32 bits are all one and at least one low bit is one. + // Materialize all 32 products. Wiring pins the complete output word to zero. + let first_high_all = FIRST_CHAIN_BASE + 30; + let second_high_all = SECOND_CHAIN_BASE + 30; + for low_bit in 0..32 { + a_rows[VIOLATION_BASE + low_bit].push(first_high_all); + b_rows[VIOLATION_BASE + low_bit].push(low_bit); + a_rows[VIOLATION_BASE + 32 + low_bit].push(second_high_all); + b_rows[VIOLATION_BASE + 32 + low_bit].push(64 + low_bit); + } + + let identity_rows = (0..K).map(|row| vec![row]).collect(); + BlockR1cs { + m: K_LOG + nu, + k_log: K_LOG, + k_skip: K_SKIP, + useful_bits: USEFUL_BITS, + a_0: sparse_matrix(a_rows), + b_0: sparse_matrix(b_rows), + c_0: sparse_matrix(identity_rows), + layout: WitnessLayout::BatchMajor, + const_pin: None, + digest_cache: OnceLock::new(), + csc_cache: OnceLock::new(), + } +} + +/// Produce Flock's batch-major `(z, A z, B z, lincheck stripe)` tuple. +pub(crate) fn generate_canonical_pair_witness( + rows: &[CanonicalGoldilocksPairRow], + nu: usize, +) -> (Vec, Vec, Vec, Vec) { + let capacity = 1usize << nu; + assert!(rows.len() <= capacity); + let r1cs = build_canonical_pair_r1cs(nu); + let mut z = vec![false; r1cs.n()]; + for (outer, row) in rows.iter().enumerate() { + let range = outer * K..(outer + 1) * K; + fill_logical_row(&mut z[range], row.0); + } + let a = r1cs.apply_a(&z); + let b = r1cs.apply_b(&z); + debug_assert!( + a.iter() + .zip(&b) + .zip(&z) + .all(|((a_bit, b_bit), z_bit)| (*a_bit & *b_bit) == *z_bit) + ); + let stripe = pack_z_lincheck(&z, r1cs.m, r1cs.k_log); + ( + pack_batch_major(&z, nu), + pack_batch_major(&a, nu), + pack_batch_major(&b, nu), + stripe, + ) +} + +/// One row of two lane-wise Goldilocks additions packed into `F128` words. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub(crate) struct GoldilocksAddPairRow { + left: F128, + right: F128, +} + +/// Two independent canonical Goldilocks additions, one per u64 lane. +/// +/// The gate exposes the result plus two zero-valued equation-residual words. +/// Callers connect both residuals to a fixed zero wire and pass every input +/// and result through [`CanonicalGoldilocksPairGate`]. Keeping canonicality a +/// shared table avoids duplicating its constraints in every arithmetic table. +#[derive(Clone, Copy, Debug)] +pub(crate) struct GoldilocksAddPairGate { + pub(crate) nu: usize, +} + +impl GateType for GoldilocksAddPairGate { + type Row = GoldilocksAddPairRow; + type Hint = (); + + fn table(&self) -> TableType { + TableType::from_block_r1cs(&build_goldilocks_add_r1cs(self.nu)) + .with_io_schema(vec![ + IoWord::input(0), + IoWord::input(1), + IoWord::output(2), + IoWord::output(3), + IoWord::output(4), + ]) + } + + fn eval( + &self, + inputs: &[F128], + _hint: &(), + outputs: &mut Vec, + ) -> Self::Row { + let left = inputs[0]; + let right = inputs[1]; + outputs.extend_from_slice(&[ + F128::new( + goldilocks_add(left.lo, right.lo), + goldilocks_add(left.hi, right.hi), + ), + F128::ZERO, + F128::ZERO, + ]); + GoldilocksAddPairRow { left, right } + } + + fn witness(&self, _rows: &[Self::Row], _nu: usize) -> SlotWitness { + SlotWitness::DeferredToRows + } +} + +struct GoldilocksAddPlan { + boolean: BooleanR1csPlan, + quotient_bits: [usize; 2], +} + +pub(crate) fn build_goldilocks_add_r1cs(nu: usize) -> BlockR1cs { + build_goldilocks_add_plan().boolean.block_r1cs(nu) +} + +pub(crate) fn generate_goldilocks_add_witness( + rows: &[GoldilocksAddPairRow], + nu: usize, +) -> (Vec, Vec, Vec, Vec) { + let plan = build_goldilocks_add_plan(); + generate_boolean_witness(&plan.boolean, rows, nu, |row, bits| { + fill_goldilocks_add_row(&plan, *row, bits) + }) +} + +fn build_goldilocks_add_plan() -> GoldilocksAddPlan { + let mut builder = BooleanR1csBuilder::new(ADD_K_LOG, ADD_RESERVED_COLUMNS); + for column in ADD_LEFT_BASE..ADD_RESULT_BASE + 128 { + builder.free_boolean_at(column); + } + let one = builder.alloc_constant_one(); + let quotient_bits = + [builder.alloc_free_boolean(), builder.alloc_free_boolean()]; + + for (lane, "ient) in quotient_bits.iter().enumerate() { + let lane_offset = lane * 64; + let left: [usize; 64] = + std::array::from_fn(|bit| ADD_LEFT_BASE + lane_offset + bit); + let right: [usize; 64] = + std::array::from_fn(|bit| ADD_RIGHT_BASE + lane_offset + bit); + let result: [usize; 64] = + std::array::from_fn(|bit| ADD_RESULT_BASE + lane_offset + bit); + let right_terms = right.map(Some); + let modulus_terms: [Option; 64] = std::array::from_fn(|bit| { + (((GOLDILOCKS_MODULUS >> bit) & 1) == 1).then_some(quotient) + }); + let (left_sum, left_carry) = + ripple_add(&mut builder, &left, &right_terms, one); + let (right_sum, right_carry) = + ripple_add(&mut builder, &result, &modulus_terms, one); + + for bit in 0..64 { + builder.write_xor( + ADD_VIOLATION_BASE + lane_offset + bit, + &[left_sum[bit], right_sum[bit]], + one, + ); + } + builder.write_xor( + ADD_TOP_VIOLATION_BASE + lane, + &[left_carry, right_carry], + one, + ); + } + + GoldilocksAddPlan { boolean: builder.finish(), quotient_bits } +} + +fn ripple_add( + builder: &mut BooleanR1csBuilder, + left: &[usize; 64], + right: &[Option; 64], + one: usize, +) -> (Vec, usize) { + let mut sums = Vec::with_capacity(64); + let mut carry = None; + for bit in 0..64 { + let xor_lr = right[bit] + .map_or(left[bit], |right| builder.xor(&[left[bit], right], one)); + let sum = carry.map_or(xor_lr, |carry| builder.xor(&[xor_lr, carry], one)); + sums.push(sum); + + let left_and_right = right[bit].map(|right| builder.and(left[bit], right)); + let carry_and_xor = carry.map(|carry| builder.and(carry, xor_lr)); + carry = match (left_and_right, carry_and_xor) { + (Some(first), Some(second)) => Some(builder.xor(&[first, second], one)), + (Some(carry), None) | (None, Some(carry)) => Some(carry), + (None, None) => None, + }; + } + (sums, carry.expect("addition has a carry variable from bit zero")) +} + +fn fill_goldilocks_add_row( + plan: &GoldilocksAddPlan, + row: GoldilocksAddPairRow, + bits: &mut [bool], +) { + let result = F128::new( + goldilocks_add(row.left.lo, row.right.lo), + goldilocks_add(row.left.hi, row.right.hi), + ); + write_boolean_f128(bits, ADD_LEFT_BASE, row.left); + write_boolean_f128(bits, ADD_RIGHT_BASE, row.right); + write_boolean_f128(bits, ADD_RESULT_BASE, result); + for (lane, quotient) in plan.quotient_bits.iter().enumerate() { + let (left, right) = if lane == 0 { + (row.left.lo, row.right.lo) + } else { + (row.left.hi, row.right.hi) + }; + bits[*quotient] = + left as u128 + right as u128 >= GOLDILOCKS_MODULUS as u128; + } +} + +pub(crate) fn goldilocks_add(left: u64, right: u64) -> u64 { + ((left as u128 + right as u128) % GOLDILOCKS_MODULUS as u128) as u64 +} + +fn add_and_chain( + a_rows: &mut [Vec], + b_rows: &mut [Vec], + high_base: usize, + chain_base: usize, +) { + for step in 0..31 { + let output = chain_base + step; + let lhs = if step == 0 { high_base } else { output - 1 }; + let rhs = high_base + step + 1; + a_rows[output].push(lhs); + b_rows[output].push(rhs); + } +} + +fn sparse_matrix(rows: Vec>) -> SparseBinaryMatrix { + SparseBinaryMatrix { num_rows: K, num_cols: K, rows } +} + +fn fill_logical_row(bits: &mut [bool], value: F128) { + assert_eq!(bits.len(), K); + write_f128(bits, INPUT_BASE, value); + write_f128(bits, VIOLATION_BASE, violation_word(value)); + fill_and_chain(bits, value.lo, FIRST_CHAIN_BASE); + fill_and_chain(bits, value.hi, SECOND_CHAIN_BASE); +} + +fn fill_and_chain(bits: &mut [bool], limb: u64, chain_base: usize) { + let mut accumulator = bit(limb, 32); + for step in 0..31 { + accumulator &= bit(limb, 33 + step); + bits[chain_base + step] = accumulator; + } +} + +fn violation_word(value: F128) -> F128 { + let first = limb_violation_bits(value.lo) as u64; + let second = limb_violation_bits(value.hi) as u64; + F128::new(first | (second << 32), 0) +} + +fn limb_violation_bits(value: u64) -> u32 { + if value >= GOLDILOCKS_MODULUS { value as u32 } else { 0 } +} + +fn write_f128(bits: &mut [bool], offset: usize, value: F128) { + for local in 0..64 { + bits[offset + local] = bit(value.lo, local); + bits[offset + 64 + local] = bit(value.hi, local); + } +} + +fn bit(value: u64, index: usize) -> bool { + (value >> index) & 1 == 1 +} + +fn pack_batch_major(bits: &[bool], nu: usize) -> Vec { + let capacity = 1usize << nu; + assert_eq!(bits.len(), capacity * K); + let chunks = K / 128; + let mut packed = vec![F128::ZERO; chunks * capacity]; + for chunk in 0..chunks { + for outer in 0..capacity { + let start = outer * K + chunk * 128; + let mut lo = 0u64; + let mut hi = 0u64; + for local in 0..64 { + lo |= u64::from(bits[start + local]) << local; + hi |= u64::from(bits[start + 64 + local]) << local; + } + packed[(chunk << nu) + outer] = F128::new(lo, hi); + } + } + packed +} + +#[cfg(test)] +mod tests { + use std::panic::{AssertUnwindSafe, catch_unwind}; + + use flock_prover::circuit::builder::ShapeBuilder; + use multi_stark::{ + p3_field::{PrimeCharacteristicRing, PrimeField64}, + p3_goldilocks::Goldilocks, + }; + + use super::*; + + #[test] + fn canonicality_boundary_matches_goldilocks_modulus() { + for value in [0, 1, GOLDILOCKS_MODULUS - 1] { + assert_eq!(violation_word(F128::new(value, value)), F128::ZERO); + } + assert_ne!(violation_word(F128::new(GOLDILOCKS_MODULUS, 0)), F128::ZERO); + assert_ne!(violation_word(F128::new(0, GOLDILOCKS_MODULUS)), F128::ZERO); + assert_ne!(violation_word(F128::new(u64::MAX, 0)), F128::ZERO); + } + + #[test] + fn r1cs_recomputes_every_violation_bit() { + let r1cs = build_canonical_pair_r1cs(3); + for value in [ + F128::new(0, GOLDILOCKS_MODULUS - 1), + F128::new(GOLDILOCKS_MODULUS, u64::MAX), + ] { + let mut row = vec![false; K]; + fill_logical_row(&mut row, value); + let mut witness = vec![false; r1cs.n()]; + witness[..K].copy_from_slice(&row); + assert!(r1cs.satisfies(&witness)); + + if violation_word(value) != F128::ZERO { + witness[VIOLATION_BASE..VIOLATION_BASE + 128].fill(false); + assert!(!r1cs.satisfies(&witness)); + } + } + } + + #[test] + fn circuit_wiring_pins_violation_output_to_zero() { + let nu = 3; + let mut builder = ShapeBuilder::new(nu); + let slot = builder.slot(CanonicalGoldilocksPairGate { nu }); + let candidate = builder.input(); + let zero = builder.fixed_public_input(F128::ZERO); + let violation = builder.gate(slot, &[candidate])[0]; + builder.connect(violation, zero); + let shape = builder.finish().unwrap(); + + shape.run(&[F128::new(GOLDILOCKS_MODULUS - 1, 0), F128::ZERO], &[]); + let invalid = catch_unwind(AssertUnwindSafe(|| { + shape.run(&[F128::new(GOLDILOCKS_MODULUS, 0), F128::ZERO], &[]) + })); + assert!(invalid.is_err()); + } + + #[test] + fn batch_major_witness_has_zero_dummy_rows() { + let rows = [ + CanonicalGoldilocksPairRow(F128::new(1, 2)), + CanonicalGoldilocksPairRow(F128::new(3, 4)), + ]; + let (z, a, b, stripe) = generate_canonical_pair_witness(&rows, 3); + assert_eq!(z.len(), 32); + assert_eq!(a.len(), z.len()); + assert_eq!(b.len(), z.len()); + assert_eq!(stripe.len(), K); + for chunk in 0..K / 128 { + for outer in rows.len()..8 { + assert_eq!(z[(chunk << 3) + outer], F128::ZERO); + assert_eq!(a[(chunk << 3) + outer], F128::ZERO); + assert_eq!(b[(chunk << 3) + outer], F128::ZERO); + } + } + } + + #[test] + fn modular_add_matches_reference_goldilocks() { + let boundary = [ + 0, + 1, + 2, + (1u64 << 32) - 1, + 1u64 << 32, + GOLDILOCKS_MODULUS - 2, + GOLDILOCKS_MODULUS - 1, + ]; + for &left in &boundary { + for &right in &boundary { + let expected = (Goldilocks::from_u64(left) + + Goldilocks::from_u64(right)) + .as_canonical_u64(); + assert_eq!(goldilocks_add(left, right), expected); + } + } + + let mut state = 0x6a09_e667_f3bc_c909u64; + for _ in 0..256 { + state = state + .wrapping_mul(0x9e37_79b9_7f4a_7c15) + .wrapping_add(0xbf58_476d_1ce4_e5b9); + let left = state % GOLDILOCKS_MODULUS; + state ^= state.rotate_left(29); + let right = state % GOLDILOCKS_MODULUS; + let expected = (Goldilocks::from_u64(left) + Goldilocks::from_u64(right)) + .as_canonical_u64(); + assert_eq!(goldilocks_add(left, right), expected); + } + } + + #[test] + fn modular_add_r1cs_rejects_wrong_result_and_quotient() { + let plan = build_goldilocks_add_plan(); + let r1cs = plan.boolean.block_r1cs(3); + let cases = [ + GoldilocksAddPairRow { + left: F128::new(0, GOLDILOCKS_MODULUS - 1), + right: F128::new(0, 0), + }, + GoldilocksAddPairRow { + left: F128::new(GOLDILOCKS_MODULUS - 1, 1 << 32), + right: F128::new(GOLDILOCKS_MODULUS - 1, u64::MAX >> 32), + }, + ]; + for row in cases { + let mut logical = vec![false; plan.boolean.k()]; + plan.boolean.fill_row(&mut logical, |bits| { + fill_goldilocks_add_row(&plan, row, bits) + }); + let mut witness = vec![false; r1cs.n()]; + witness[..plan.boolean.k()].copy_from_slice(&logical); + assert!(r1cs.satisfies(&witness)); + + let mut wrong_result = witness.clone(); + wrong_result[ADD_RESULT_BASE + 17] ^= true; + assert!(!r1cs.satisfies(&wrong_result)); + + let mut wrong_quotient = witness; + wrong_quotient[plan.quotient_bits[0]] ^= true; + assert!(!r1cs.satisfies(&wrong_quotient)); + } + } + + #[test] + fn modular_add_gate_pins_equation_residuals() { + let nu = 3; + let mut builder = ShapeBuilder::new(nu); + let slot = builder.slot(GoldilocksAddPairGate { nu }); + let left = builder.input(); + let right = builder.input(); + let zero = builder.fixed_public_input(F128::ZERO); + let outputs = builder.gate(slot, &[left, right]); + builder.connect(outputs[1], zero); + builder.connect(outputs[2], zero); + builder.publish(outputs[0]); + let shape = builder.finish().unwrap(); + + let left = F128::new(GOLDILOCKS_MODULUS - 1, 7); + let right = F128::new(2, GOLDILOCKS_MODULUS - 3); + let witness = shape.run(&[left, right, F128::ZERO], &[]); + assert_eq!(*witness.public.last().unwrap(), F128::new(1, 4)); + assert_eq!( + witness.rows::(slot), + &[GoldilocksAddPairRow { left, right }] + ); + } + + #[test] + fn modular_add_batch_witness_zeroes_dummy_rows() { + let rows = + [GoldilocksAddPairRow { left: F128::new(1, 2), right: F128::new(3, 4) }]; + let (z, a, b, stripe) = generate_goldilocks_add_witness(&rows, 3); + let chunks = (1usize << ADD_K_LOG) / 128; + assert_eq!(z.len(), chunks * 8); + assert_eq!(a.len(), z.len()); + assert_eq!(b.len(), z.len()); + assert_eq!(stripe.len(), 1usize << ADD_K_LOG); + for chunk in 0..chunks { + for outer in rows.len()..8 { + assert_eq!(z[(chunk << 3) + outer], F128::ZERO); + assert_eq!(a[(chunk << 3) + outer], F128::ZERO); + assert_eq!(b[(chunk << 3) + outer], F128::ZERO); + } + } + } +} diff --git a/flock-stage3/host/src/lib.rs b/flock-stage3/host/src/lib.rs new file mode 100644 index 000000000..a313018e4 --- /dev/null +++ b/flock-stage3/host/src/lib.rs @@ -0,0 +1,256 @@ +//! Ix Stage 3 backend for a specialised Aiur verifier over Flock's binary +//! field proof system. + +mod air; +mod arithmetic; +mod artifact; +mod binding; +mod boolean; +mod config; +mod conformance; +mod equality; +mod extension; +mod fri; +mod goldilocks; +mod merkle; +mod multiplication; +mod relation; +mod transcript; +mod typed_witness; +mod window; + +use aiur::vk_codec::AiurVerifyingKey; +use anyhow::{Result, bail}; +use ix_terminal::{ValidatedStage2RootV1, validate_and_expand_root_inputs}; +use multi_stark::types::FriParameters; + +pub use air::{Stage2ActiveAirCircuitV1, Stage2AirProgramV1}; +pub use arithmetic::{ + ARITHMETIC_CONFORMANCE_ARTIFACT_MAGIC, ArithmeticConformanceArtifactV1, + GoldilocksAddPairV1, GoldilocksExt2MulV1, GoldilocksMulPairV1, + prove_arithmetic_conformance, verify_arithmetic_conformance, +}; +use artifact::Stage3ProductionPayloadV1; +pub use artifact::{ + STAGE3_STATEMENT_BYTES, STAGE3_STATEMENT_DOMAIN, Stage3ArtifactV1, + Stage3StatementV1, +}; +pub use binding::{ + STAGE3_BINDING_ARTIFACT_MAGIC, Stage3BindingArtifactV1, + prove_stage3_statement_binding, stage3_statement_binding_circuit_digest, + verify_stage3_statement_binding, verify_stage3_statement_binding_for, +}; +pub use config::{ + ARITHMETIC_CONFORMANCE_TRANSCRIPT_DOMAIN, + ENGINE_CONFORMANCE_TRANSCRIPT_DOMAIN, FLOCK_UPSTREAM_REVISION, + FRI_FOLD_CONFORMANCE_TRANSCRIPT_DOMAIN, + FRI_QUERY_CONFORMANCE_TRANSCRIPT_DOMAIN, FlockConfigV1, + MERKLE_CONFORMANCE_TRANSCRIPT_DOMAIN, + PCS_REDUCTION_CONFORMANCE_TRANSCRIPT_DOMAIN, + STAGE2_AIR_PCS_FRI_CONFORMANCE_TRANSCRIPT_DOMAIN, + STAGE2_TRANSCRIPT_CONFORMANCE_TRANSCRIPT_DOMAIN, STAGE3_TRANSCRIPT_DOMAIN, + TRANSCRIPT_BOUND_FRI_CONFORMANCE_TRANSCRIPT_DOMAIN, + TRANSCRIPT_BOUND_FRI_QUERIES_CONFORMANCE_TRANSCRIPT_DOMAIN, + TRANSCRIPT_BOUND_PCS_CONFORMANCE_TRANSCRIPT_DOMAIN, + TRANSCRIPT_BOUND_PCS_FRI_QUERIES_CONFORMANCE_TRANSCRIPT_DOMAIN, +}; +pub use conformance::{ + EngineConformanceArtifact, prove_engine_conformance, + verify_engine_conformance, +}; +pub use flock_prover::r1cs_hashes::blake3::Compression; +pub use fri::{ + FRI_COMMIT_PHASE_CONFORMANCE_ARTIFACT_MAGIC, + FRI_FOLD_CONFORMANCE_ARTIFACT_MAGIC, FriCommitPhaseConformanceArtifactV1, + FriCommitPhaseQueryV1, FriCommitPhaseRoundV1, FriFoldConformanceArtifactV1, + FriFoldQueryV1, PCS_REDUCTION_CONFORMANCE_ARTIFACT_MAGIC, + PcsReducedOpeningV1, PcsReductionConformanceArtifactV1, + Stage2AirPcsFriArtifactV1, Stage2AirPcsFriWitnessV1, Stage2PcsBatchOpeningV1, + Stage2PcsBatchV1, Stage2PcsFriWitnessV1, Stage2PcsInstanceV1, + Stage2PcsMatrixV1, Stage2PcsOpeningPointV1, Stage2PcsQueryV1, + TranscriptBoundFriCommitPhaseArtifactV1, TranscriptBoundFriQueriesArtifactV1, + TranscriptBoundPcsFriQueriesArtifactV1, TranscriptBoundPcsFriQueryV1, + TranscriptBoundPcsReductionArtifactV1, prove_fri_commit_phase_conformance, + prove_fri_fold_conformance, prove_pcs_reduction_conformance, + prove_stage2_air_pcs_fri_conformance, + prove_transcript_bound_fri_commit_phase_conformance, + prove_transcript_bound_fri_queries_conformance, + prove_transcript_bound_pcs_fri_queries_conformance, + prove_transcript_bound_pcs_reduction_conformance, + verify_fri_commit_phase_conformance, verify_fri_fold_conformance, + verify_pcs_reduction_conformance, verify_stage2_air_pcs_fri_conformance, + verify_stage2_air_pcs_fri_conformance_for, + verify_transcript_bound_fri_commit_phase_conformance, + verify_transcript_bound_fri_queries_conformance, + verify_transcript_bound_pcs_fri_queries_conformance, + verify_transcript_bound_pcs_reduction_conformance, +}; +use fri::{ + prove_stage2_air_pcs_fri_production, verify_stage2_air_pcs_fri_production, +}; +pub use merkle::{ + MERKLE_CONFORMANCE_ARTIFACT_MAGIC, MerkleConformanceArtifactV1, MerklePathV1, + prove_merkle_conformance, verify_merkle_conformance, +}; +pub use relation::{ + STAGE3_RELATION_MANIFEST_DOMAIN, STAGE3_VERIFIER_PHASES_V1, + Stage3LoweringStatusV1, Stage3RelationBoundsV1, Stage3RelationManifestV1, + Stage3VerifierPhaseV1, +}; +pub use transcript::{ + STAGE2_TRANSCRIPT_CONFORMANCE_ARTIFACT_MAGIC, + Stage2FriTranscriptChallengesV1, Stage2FriTranscriptReplayV1, + Stage2TranscriptByteBindingV1, Stage2TranscriptChallengesV1, + Stage2TranscriptConformanceArtifactV1, Stage2TranscriptReplayV1, + Stage2TranscriptSegmentV1, prove_stage2_transcript_conformance, + verify_stage2_transcript_conformance, +}; +pub use typed_witness::{ + STAGE3_TYPED_WITNESS_LAYOUT_DOMAIN, Stage3DigestV1, Stage3ExtensionValueV1, + Stage3OpenedRoundV1, Stage3TypedBatchOpeningV1, Stage3TypedCommitPhaseStepV1, + Stage3TypedCommitmentsV1, Stage3TypedFriProofV1, Stage3TypedProofCountsV1, + Stage3TypedProofWitnessV1, Stage3TypedQueryProofV1, +}; + +/// Host facade for the production Stage 3 relation. +#[derive(Clone, Copy, Debug, Default)] +pub struct FlockStage3Backend; + +impl FlockStage3Backend { + /// Verify the compact Stage 2 root and produce the exact vk/claims/advice + /// transport that the Flock relation must consume. This is usable while the + /// relation itself is still being lowered. + pub fn prepare_witness( + self, + vk_bytes: &[u8], + claim_bytes: &[u8], + proof_bytes: &[u8], + fri: &FriParameters, + ) -> Result { + validate_and_expand_root_inputs(vk_bytes, claim_bytes, proof_bytes, fri) + } + + /// Compile and content-address the complete relation for a prepared root. + /// This builds the circuit but does not run the expensive Flock prover. + pub fn relation_manifest( + self, + prepared: &ValidatedStage2RootV1, + ) -> Result { + Stage3RelationManifestV1::for_prepared(prepared) + } + + /// Decode the verified advice transport into the primitive, fixed-schema + /// witness consumed by the no-RISC-V Flock lowering. + pub fn prepare_typed_proof_witness( + self, + prepared: &ValidatedStage2RootV1, + fri: &FriParameters, + ) -> Result { + Stage3TypedProofWitnessV1::from_prepared(prepared, fri) + } + + /// Construct a public Stage 3 statement only from a complete manifest that + /// is specialised to, and has capacity for, this prepared root. + pub fn prepare_statement( + self, + prepared: &ValidatedStage2RootV1, + manifest: &Stage3RelationManifestV1, + ) -> Result { + manifest.ensure_accommodates(prepared)?; + Ok(Stage3StatementV1::new( + prepared.statement(), + manifest.relation_digest()?, + )) + } + + /// Validate and lower a compact Stage 2 proof, prove the complete + /// statement/AIR/PCS/FRI relation using the production transcript domain, + /// and return its strictly framed Stage 3 artifact. + pub fn prove_stage2( + self, + vk_bytes: &[u8], + claim_bytes: &[u8], + proof_bytes: &[u8], + fri: &FriParameters, + ) -> Result { + Stage3LoweringStatusV1::current().ensure_complete()?; + let prepared = + self.prepare_witness(vk_bytes, claim_bytes, proof_bytes, fri)?; + let witness = Stage2AirPcsFriWitnessV1::from_prepared(&prepared, fri)?; + let flock_artifact = prove_stage2_air_pcs_fri_production(&witness)?; + let manifest = Stage3RelationManifestV1::for_prepared_and_program_digest( + &prepared, + *flock_artifact.circuit_digest(), + )?; + let statement = self.prepare_statement(&prepared, &manifest)?; + let payload = Stage3ProductionPayloadV1::new( + vk_bytes, + claim_bytes, + proof_bytes, + *flock_artifact.circuit_digest(), + flock_artifact.proof_bundle_bytes(), + )? + .encode()?; + Stage3ArtifactV1::new(statement, payload) + } + + /// Verify the expected public statement, reconstruct the fixed relation + /// from canonical Stage 2 inputs, pin its manifest digest, and verify the + /// Flock proof under the production transcript domain. + pub fn verify_stage2( + self, + artifact: &Stage3ArtifactV1, + expected: &Stage3StatementV1, + ) -> Result<()> { + artifact.ensure_statement(expected)?; + let payload = Stage3ProductionPayloadV1::decode(artifact.proof_bytes())?; + let key = AiurVerifyingKey::from_bytes(payload.vk_bytes()) + .map_err(|error| anyhow::anyhow!("decode Stage 3 Aiur key: {error}"))?; + let fri = key.fri_parameters(); + let prepared = self.prepare_witness( + payload.vk_bytes(), + payload.claim_bytes(), + payload.stage2_proof_bytes(), + &fri, + )?; + if prepared.statement().digest() != *expected.stage2_root_digest() { + bail!("Stage 3 proof targets a different Stage 2 root"); + } + let witness = Stage2AirPcsFriWitnessV1::from_prepared(&prepared, &fri)?; + let manifest = Stage3RelationManifestV1::for_prepared_and_program_digest( + &prepared, + payload.circuit_digest(), + )?; + if manifest.relation_digest()? != *expected.relation_digest() { + bail!("Stage 3 relation manifest does not match the expected relation"); + } + let flock_artifact = Stage2AirPcsFriArtifactV1::from_parts( + witness, + payload.circuit_digest(), + payload.flock_proof_bundle_bytes().to_vec(), + )?; + verify_stage2_air_pcs_fri_production(&flock_artifact) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn malformed_stage2_input_fails_before_proving() { + let fri = FriParameters { + log_final_poly_len: 0, + max_log_arity: 1, + num_queries: 100, + commit_proof_of_work_bits: 0, + query_proof_of_work_bits: 20, + }; + assert!( + FlockStage3Backend + .prove_stage2(b"vk", &[0; 144], b"proof", &fri) + .is_err() + ); + assert!(Stage3LoweringStatusV1::current().is_complete()); + } +} diff --git a/flock-stage3/host/src/merkle.rs b/flock-stage3/host/src/merkle.rs new file mode 100644 index 000000000..92c2d82ab --- /dev/null +++ b/flock-stage3/host/src/merkle.rs @@ -0,0 +1,607 @@ +//! Circuit-bound BLAKE3 Merkle authentication paths. +//! +//! Plonky3's `CompressionFunctionFromHasher` hashes the +//! concatenation of two 32-byte digests. One constrained direction bit orders +//! the current and sibling digests at every level, then the existing Flock +//! BLAKE3 compression table computes the parent. + +use ::blake3 as native_blake3; +use anyhow::{Context, Result, bail}; +use bincode::Options; +use flock_prover::{ + challenger::FsChallenger, + circuit::builder::{ + CircuitShape, GateType, ShapeBuilder, SlotId, SlotWitness, + }, + field::F128, + pcs::Commitment, + proof::R1csProofCircuitMerged, + prover::{self, UnionSlotProverInput}, + r1cs::BlockR1cs, + r1cs_hashes::blake3 as flock_blake3, + schedule::{IoWord, TableType}, + union::UnionInstance, + verifier, +}; +use serde::{Deserialize, Serialize}; + +use crate::{ + FlockConfigV1, MERKLE_CONFORMANCE_TRANSCRIPT_DOMAIN, + binding::{ + Blake3Gate, CHUNK_END, CHUNK_START, IV, ROOT, pack_bytes, pack_params, + pack8, pcs_params, + }, + boolean::{ + BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, write_f128, + }, +}; + +pub const MERKLE_CONFORMANCE_ARTIFACT_MAGIC: &[u8; 8] = b"IXFLKMP1"; +const ARTIFACT_VERSION: u16 = 1; +const CONFIG_OFFSET: usize = 10; +const DEPTH_OFFSET: usize = CONFIG_OFFSET + 32; +const INDEX_OFFSET: usize = DEPTH_OFFSET + 1; +const LEAF_OFFSET: usize = INDEX_OFFSET + 4; +const PATH_OFFSET: usize = LEAF_OFFSET + 32; +const FIXED_SUFFIX_BYTES: usize = 32 + 32 + 8; +const MAX_DEPTH: usize = 32; +const MAX_BUNDLE_BYTES: usize = 64 * 1024 * 1024; + +const NU: usize = 8; +const ORDER_K_LOG: usize = 11; +const BIT_BASE: usize = 0; +const CURRENT_BASE: usize = 128; +const SIBLING_BASE: usize = 384; +const LEFT_BASE: usize = 640; +const RIGHT_BASE: usize = 896; +const ORDER_RESERVED_COLUMNS: usize = 1152; + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct MerklePathV1 { + pub leaf: [u8; 32], + pub siblings: Vec<[u8; 32]>, + /// Leaf index; level zero consumes its least-significant bit. + pub index: u32, +} + +impl MerklePathV1 { + pub fn root(&self) -> Result<[u8; 32]> { + validate_path(self)?; + Ok(native_root(self)) + } +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct MerkleConformanceArtifactV1 { + path: MerklePathV1, + circuit_digest: [u8; 32], + root: [u8; 32], + proof_bundle_bytes: Vec, +} + +impl MerkleConformanceArtifactV1 { + pub fn to_bytes(&self) -> Vec { + let mut bytes = Vec::with_capacity( + PATH_OFFSET + + 32 * self.path.siblings.len() + + FIXED_SUFFIX_BYTES + + self.proof_bundle_bytes.len(), + ); + bytes.extend_from_slice(MERKLE_CONFORMANCE_ARTIFACT_MAGIC); + bytes.extend_from_slice(&ARTIFACT_VERSION.to_le_bytes()); + bytes.extend_from_slice(&FlockConfigV1.digest()); + bytes.push(u8::try_from(self.path.siblings.len()).expect("Merkle depth")); + bytes.extend_from_slice(&self.path.index.to_le_bytes()); + bytes.extend_from_slice(&self.path.leaf); + for sibling in &self.path.siblings { + bytes.extend_from_slice(sibling); + } + bytes.extend_from_slice(&self.circuit_digest); + bytes.extend_from_slice(&self.root); + bytes.extend_from_slice( + &u64::try_from(self.proof_bundle_bytes.len()) + .expect("proof bundle length") + .to_le_bytes(), + ); + bytes.extend_from_slice(&self.proof_bundle_bytes); + bytes + } + + pub fn from_bytes(bytes: &[u8]) -> Result { + if bytes.len() < PATH_OFFSET + FIXED_SUFFIX_BYTES { + bail!("truncated Flock Merkle conformance artifact"); + } + if &bytes[..8] != MERKLE_CONFORMANCE_ARTIFACT_MAGIC { + bail!("invalid Flock Merkle conformance artifact magic"); + } + let version = u16::from_le_bytes(bytes[8..10].try_into().unwrap()); + if version != ARTIFACT_VERSION { + bail!("unsupported Flock Merkle artifact version {version}"); + } + if bytes[CONFIG_OFFSET..DEPTH_OFFSET] != FlockConfigV1.digest() { + bail!("Flock Merkle artifact configuration mismatch"); + } + let depth = usize::from(bytes[DEPTH_OFFSET]); + validate_depth(depth)?; + let index = + u32::from_le_bytes(bytes[INDEX_OFFSET..LEAF_OFFSET].try_into().unwrap()); + let path_end = PATH_OFFSET + .checked_add(depth * 32) + .ok_or_else(|| anyhow::anyhow!("Merkle path length overflow"))?; + let suffix_end = path_end + .checked_add(FIXED_SUFFIX_BYTES) + .ok_or_else(|| anyhow::anyhow!("Merkle artifact length overflow"))?; + if bytes.len() < suffix_end { + bail!("truncated Flock Merkle path or proof header"); + } + let mut leaf = [0u8; 32]; + leaf.copy_from_slice(&bytes[LEAF_OFFSET..PATH_OFFSET]); + let siblings = bytes[PATH_OFFSET..path_end].as_chunks::<32>().0.to_vec(); + let path = MerklePathV1 { leaf, siblings, index }; + validate_path(&path)?; + let mut circuit_digest = [0u8; 32]; + circuit_digest.copy_from_slice(&bytes[path_end..path_end + 32]); + let mut root = [0u8; 32]; + root.copy_from_slice(&bytes[path_end + 32..path_end + 64]); + let bundle_len = usize::try_from(u64::from_le_bytes( + bytes[path_end + 64..suffix_end].try_into().unwrap(), + )) + .map_err(|error| { + anyhow::anyhow!("Merkle proof bundle length does not fit usize: {error}") + })?; + if bundle_len == 0 || bundle_len > MAX_BUNDLE_BYTES { + bail!("invalid Flock Merkle proof bundle length {bundle_len}"); + } + let expected_len = suffix_end + .checked_add(bundle_len) + .ok_or_else(|| anyhow::anyhow!("Merkle proof length overflow"))?; + if bytes.len() != expected_len { + bail!( + "Flock Merkle artifact is {} bytes; header declares {expected_len}", + bytes.len() + ); + } + let proof_bundle_bytes = bytes[suffix_end..].to_vec(); + decode_bundle(&proof_bundle_bytes) + .context("decode Flock Merkle conformance proof bundle")?; + Ok(Self { path, circuit_digest, root, proof_bundle_bytes }) + } + + pub fn path(&self) -> &MerklePathV1 { + &self.path + } + + pub fn circuit_digest(&self) -> &[u8; 32] { + &self.circuit_digest + } + + pub fn root(&self) -> &[u8; 32] { + &self.root + } + + pub fn proof_bundle_bytes(&self) -> &[u8] { + &self.proof_bundle_bytes + } +} + +#[derive(Serialize, Deserialize)] +struct MerkleProofBundle { + commitment: Commitment, + proof: R1csProofCircuitMerged, +} + +pub fn prove_merkle_conformance( + path: &MerklePathV1, +) -> Result { + validate_path(path)?; + let relation = MerkleRelation::build(path.siblings.len())?; + relation.ensure_registry_order()?; + let witness = relation.shape.run(&relation_inputs(path), &[]); + let root = native_root(path); + if witness.public != relation_public(path, &root) { + bail!("Flock Merkle circuit output disagrees with native BLAKE3 root"); + } + let blake3_rows = witness.rows::(relation.blake3_slot); + let order_rows = witness.rows::(relation.order_slot); + let blake3_r1cs = flock_blake3::build_block_r1cs(NU); + let blake3_lincheck = blake3_r1cs.csc_lincheck_circuit(); + let order_r1cs = build_digest_order_r1cs(NU); + let order_lincheck = order_r1cs.csc_lincheck_circuit(); + let union = + UnionInstance::new(&relation.shape.registry, relation.shape.counts.clone()); + let params = pcs_params(&union); + let mut challenger = + FsChallenger::with_chained_blake3(MERKLE_CONFORMANCE_TRANSCRIPT_DOMAIN); + let (proof, commitment, _) = prover::prove_fast_ligerito_union_circuit( + &union, + &relation.shape.circuit, + &witness.public, + ¶ms, + vec![ + UnionSlotProverInput::new( + flock_blake3::generate_witness_batch_major_partial(blake3_rows, NU), + blake3_lincheck, + ), + UnionSlotProverInput::new( + generate_digest_order_witness(order_rows, NU), + order_lincheck, + ), + ], + Vec::new(), + &mut challenger, + ); + let proof_bundle_bytes = + encode_bundle(&MerkleProofBundle { commitment, proof })?; + if proof_bundle_bytes.len() > MAX_BUNDLE_BYTES { + bail!("Flock Merkle proof bundle exceeds {MAX_BUNDLE_BYTES} bytes"); + } + Ok(MerkleConformanceArtifactV1 { + path: path.clone(), + circuit_digest: relation.shape.circuit.digest(), + root, + proof_bundle_bytes, + }) +} + +pub fn verify_merkle_conformance( + artifact: &MerkleConformanceArtifactV1, +) -> Result<()> { + validate_path(&artifact.path)?; + let relation = MerkleRelation::build(artifact.path.siblings.len())?; + relation.ensure_registry_order()?; + if artifact.circuit_digest != relation.shape.circuit.digest() { + bail!("Flock Merkle conformance circuit digest mismatch"); + } + let bundle = decode_bundle(&artifact.proof_bundle_bytes) + .context("decode Flock Merkle conformance proof bundle")?; + let public = relation_public(&artifact.path, &artifact.root); + let blake3_r1cs = flock_blake3::build_block_r1cs(NU); + let blake3_lincheck = blake3_r1cs.csc_lincheck_circuit(); + let order_r1cs = build_digest_order_r1cs(NU); + let order_lincheck = order_r1cs.csc_lincheck_circuit(); + let linchecks: [&dyn flock_prover::lincheck::LincheckCircuit; 2] = + [blake3_lincheck, order_lincheck]; + let union = + UnionInstance::new(&relation.shape.registry, relation.shape.counts.clone()); + let params = pcs_params(&union); + let mut challenger = + FsChallenger::with_chained_blake3(MERKLE_CONFORMANCE_TRANSCRIPT_DOMAIN); + verifier::verify_ligerito_union_circuit( + &union, + &relation.shape.circuit, + &public, + &linchecks, + &bundle.commitment, + &bundle.proof, + ¶ms, + &mut challenger, + ) + .map_err(|error| { + anyhow::anyhow!("Flock Merkle conformance proof rejected: {error:?}") + })?; + Ok(()) +} + +struct MerkleRelation { + shape: CircuitShape, + blake3_slot: SlotId, + order_slot: SlotId, +} + +impl MerkleRelation { + fn build(depth: usize) -> Result { + validate_depth(depth)?; + let mut builder = ShapeBuilder::new(NU); + let blake3_slot = builder.slot(Blake3Gate { nu: NU }); + let order_slot = builder.slot(DigestOrderGate { nu: NU }); + let packed_iv = pack8(&IV); + let iv = [ + builder.fixed_public_input(packed_iv[0]), + builder.fixed_public_input(packed_iv[1]), + ]; + let params = builder.fixed_public_input(pack_params( + 0, + 64, + CHUNK_START | CHUNK_END | ROOT, + )); + let mut current = [builder.public_input(), builder.public_input()]; + for _ in 0..depth { + let direction = builder.public_input(); + let sibling = [builder.public_input(), builder.public_input()]; + let ordered = builder.gate( + order_slot, + &[direction, current[0], current[1], sibling[0], sibling[1]], + ); + let parent = builder.gate( + blake3_slot, + &[iv[0], iv[1], ordered[0], ordered[1], ordered[2], ordered[3], params], + ); + current = [parent[0], parent[1]]; + } + builder.publish(current[0]); + builder.publish(current[1]); + let shape = builder.finish().map_err(|error| { + anyhow::anyhow!("build Flock Merkle conformance circuit: {error:?}") + })?; + Ok(Self { shape, blake3_slot, order_slot }) + } + + fn ensure_registry_order(&self) -> Result<()> { + if self.shape.registry_slot(self.blake3_slot) != 0 + || self.shape.registry_slot(self.order_slot) != 1 + { + bail!("unexpected Flock Merkle table registry order"); + } + Ok(()) + } +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub(crate) struct DigestOrderRow { + direction: bool, + current: [F128; 2], + sibling: [F128; 2], +} + +#[derive(Clone, Copy, Debug)] +pub(crate) struct DigestOrderGate { + pub(crate) nu: usize, +} + +impl GateType for DigestOrderGate { + type Row = DigestOrderRow; + type Hint = (); + + fn table(&self) -> TableType { + TableType::from_block_r1cs(&build_digest_order_r1cs(self.nu)) + .with_io_schema(vec![ + IoWord::input(0), + IoWord::input(1), + IoWord::input(2), + IoWord::input(3), + IoWord::input(4), + IoWord::output(5), + IoWord::output(6), + IoWord::output(7), + IoWord::output(8), + ]) + } + + fn eval( + &self, + inputs: &[F128], + _hint: &(), + outputs: &mut Vec, + ) -> Self::Row { + let direction_word = inputs[0]; + assert_eq!(direction_word.hi, 0); + assert!(direction_word.lo <= 1); + let direction = direction_word.lo == 1; + let current = [inputs[1], inputs[2]]; + let sibling = [inputs[3], inputs[4]]; + if direction { + outputs + .extend_from_slice(&[sibling[0], sibling[1], current[0], current[1]]); + } else { + outputs + .extend_from_slice(&[current[0], current[1], sibling[0], sibling[1]]); + } + DigestOrderRow { direction, current, sibling } + } + + fn witness(&self, _rows: &[Self::Row], _nu: usize) -> SlotWitness { + SlotWitness::DeferredToRows + } +} + +pub(crate) fn build_digest_order_r1cs(nu: usize) -> BlockR1cs { + build_digest_order_plan().block_r1cs(nu) +} + +pub(crate) fn generate_digest_order_witness( + rows: &[DigestOrderRow], + nu: usize, +) -> (Vec, Vec, Vec, Vec) { + let plan = build_digest_order_plan(); + generate_boolean_witness(&plan, rows, nu, |row, bits| { + bits[BIT_BASE] = row.direction; + write_f128(bits, CURRENT_BASE, row.current[0]); + write_f128(bits, CURRENT_BASE + 128, row.current[1]); + write_f128(bits, SIBLING_BASE, row.sibling[0]); + write_f128(bits, SIBLING_BASE + 128, row.sibling[1]); + }) +} + +fn build_digest_order_plan() -> BooleanR1csPlan { + let mut builder = + BooleanR1csBuilder::new(ORDER_K_LOG, ORDER_RESERVED_COLUMNS); + builder.free_boolean_at(BIT_BASE); + for column in CURRENT_BASE..SIBLING_BASE + 256 { + builder.free_boolean_at(column); + } + let one = builder.alloc_constant_one(); + for bit in 0..256 { + let current = CURRENT_BASE + bit; + let sibling = SIBLING_BASE + bit; + let selected = + builder.product_of_parities(&[BIT_BASE], &[current, sibling]); + builder.write_xor(LEFT_BASE + bit, &[current, selected], one); + builder.write_xor( + RIGHT_BASE + bit, + &[current, sibling, LEFT_BASE + bit], + one, + ); + } + builder.finish() +} + +fn relation_inputs(path: &MerklePathV1) -> Vec { + let packed_iv = pack8(&IV); + let mut inputs = Vec::with_capacity(5 + 3 * path.siblings.len()); + inputs.extend_from_slice(&packed_iv); + inputs.push(pack_params(0, 64, CHUNK_START | CHUNK_END | ROOT)); + inputs.extend_from_slice(&pack_digest(&path.leaf)); + for (level, sibling) in path.siblings.iter().enumerate() { + inputs.push(F128::new(u64::from((path.index >> level) & 1), 0)); + inputs.extend_from_slice(&pack_digest(sibling)); + } + inputs +} + +fn relation_public(path: &MerklePathV1, root: &[u8; 32]) -> Vec { + let mut public = relation_inputs(path); + public.extend_from_slice(&pack_digest(root)); + public +} + +fn pack_digest(digest: &[u8; 32]) -> [F128; 2] { + [pack_bytes(&digest[..16]), pack_bytes(&digest[16..])] +} + +fn native_root(path: &MerklePathV1) -> [u8; 32] { + let mut current = path.leaf; + for (level, sibling) in path.siblings.iter().enumerate() { + let mut input = [0u8; 64]; + let (left, right) = if (path.index >> level) & 1 == 0 { + (¤t, sibling) + } else { + (sibling, ¤t) + }; + input[..32].copy_from_slice(left); + input[32..].copy_from_slice(right); + current = *native_blake3::hash(&input).as_bytes(); + } + current +} + +fn validate_path(path: &MerklePathV1) -> Result<()> { + validate_depth(path.siblings.len())?; + if u64::from(path.index) >= 1u64 << path.siblings.len() { + bail!( + "Merkle index {} does not fit depth {}", + path.index, + path.siblings.len() + ); + } + Ok(()) +} + +fn validate_depth(depth: usize) -> Result<()> { + if !(1..=MAX_DEPTH).contains(&depth) { + bail!("Merkle depth {depth}; expected 1..={MAX_DEPTH}"); + } + Ok(()) +} + +fn encode_bundle(bundle: &MerkleProofBundle) -> Result> { + bincode::DefaultOptions::new() + .with_fixint_encoding() + .serialize(bundle) + .context("encode Flock Merkle conformance proof bundle") +} + +fn decode_bundle(bytes: &[u8]) -> Result { + bincode::DefaultOptions::new() + .with_fixint_encoding() + .with_limit(MAX_BUNDLE_BYTES as u64) + .reject_trailing_bytes() + .deserialize(bytes) + .context("invalid Flock Merkle conformance proof bundle") +} + +#[cfg(test)] +mod tests { + use super::*; + + fn fixture() -> MerklePathV1 { + MerklePathV1 { + leaf: *native_blake3::hash(b"ix-stage3-merkle-leaf").as_bytes(), + siblings: (0..4u8) + .map(|level| *native_blake3::hash(&[0xa5, level]).as_bytes()) + .collect(), + index: 0b1010, + } + } + + #[test] + fn native_path_matches_manual_blake3_compression() { + let path = fixture(); + let root = path.root().unwrap(); + assert_ne!(root, path.leaf); + let mut changed = path; + changed.index ^= 1; + assert_ne!(changed.root().unwrap(), root); + } + + #[test] + fn digest_order_r1cs_rejects_direction_and_output_mutations() { + let plan = build_digest_order_plan(); + let r1cs = plan.block_r1cs(3); + let row = DigestOrderRow { + direction: true, + current: [F128::new(1, 2), F128::new(3, 4)], + sibling: [F128::new(5, 6), F128::new(7, 8)], + }; + let mut logical = vec![false; plan.k()]; + plan.fill_row(&mut logical, |bits| { + bits[BIT_BASE] = row.direction; + write_f128(bits, CURRENT_BASE, row.current[0]); + write_f128(bits, CURRENT_BASE + 128, row.current[1]); + write_f128(bits, SIBLING_BASE, row.sibling[0]); + write_f128(bits, SIBLING_BASE + 128, row.sibling[1]); + }); + let mut witness = vec![false; r1cs.n()]; + witness[..plan.k()].copy_from_slice(&logical); + assert!(r1cs.satisfies(&witness)); + + let mut wrong_direction = witness.clone(); + wrong_direction[BIT_BASE] ^= true; + assert!(!r1cs.satisfies(&wrong_direction)); + let mut wrong_output = witness; + wrong_output[LEFT_BASE + 17] ^= true; + assert!(!r1cs.satisfies(&wrong_output)); + } + + #[test] + fn artifact_parser_is_strict_before_crypto() { + let path = fixture(); + let artifact = MerkleConformanceArtifactV1 { + root: path.root().unwrap(), + path, + circuit_digest: [7; 32], + proof_bundle_bytes: vec![1, 2, 3], + }; + let mut bytes = artifact.to_bytes(); + assert!(MerkleConformanceArtifactV1::from_bytes(&bytes).is_err()); + bytes[0] ^= 1; + assert!(MerkleConformanceArtifactV1::from_bytes(&bytes).is_err()); + } + + #[test] + #[ignore = "real Flock BLAKE3 Merkle circuit proof; run explicitly"] + fn real_merkle_path_round_trip_and_mutations() { + let artifact = prove_merkle_conformance(&fixture()).expect("prove path"); + eprintln!( + "Flock BLAKE3-Merkle conformance bundle: {} bytes", + artifact.proof_bundle_bytes().len() + ); + verify_merkle_conformance(&artifact).expect("verify path"); + let decoded = + MerkleConformanceArtifactV1::from_bytes(&artifact.to_bytes()).unwrap(); + verify_merkle_conformance(&decoded).expect("verify decoded path"); + + let mut wrong_sibling = decoded.clone(); + wrong_sibling.path.siblings[1][7] ^= 1; + assert!(verify_merkle_conformance(&wrong_sibling).is_err()); + let mut wrong_index = decoded.clone(); + wrong_index.path.index ^= 1; + assert!(verify_merkle_conformance(&wrong_index).is_err()); + let mut wrong_root = decoded.clone(); + wrong_root.root[0] ^= 1; + assert!(verify_merkle_conformance(&wrong_root).is_err()); + let mut wrong_proof = decoded; + let flip_at = wrong_proof.proof_bundle_bytes.len() / 2; + wrong_proof.proof_bundle_bytes[flip_at] ^= 1; + assert!(verify_merkle_conformance(&wrong_proof).is_err()); + } +} diff --git a/flock-stage3/host/src/multiplication.rs b/flock-stage3/host/src/multiplication.rs new file mode 100644 index 000000000..da7e040bf --- /dev/null +++ b/flock-stage3/host/src/multiplication.rs @@ -0,0 +1,421 @@ +//! Boolean R1CS relation for multiplication in the Goldilocks base field. +//! +//! For canonical `a`, `b`, and `c`, the gate proves that a private 64-bit +//! quotient `q` satisfies the exact non-negative integer identity +//! +//! ```text +//! a * b + (q << 32) = c + q + (q << 64). +//! ``` +//! +//! This is `a*b = c + q*(2^64 - 2^32 + 1)`, so canonical `c` is exactly +//! `a*b mod p`. The multiplication bits are reduced with a carry-save tree +//! before one ripple pass; this is substantially smaller than adding 64 +//! shifted partial-product rows sequentially. + +use flock_prover::{ + circuit::builder::{GateType, SlotWitness}, + field::F128, + r1cs::BlockR1cs, + schedule::{IoWord, TableType}, +}; + +use crate::{ + boolean::{ + BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, write_f128, + }, + goldilocks::GOLDILOCKS_MODULUS, +}; + +const MUL_K_LOG: usize = 16; +const LEFT_BASE: usize = 0; +const RIGHT_BASE: usize = 128; +const RESULT_BASE: usize = 256; +const LOW_RESIDUAL_BASE: usize = 384; +const HIGH_RESIDUAL_BASE: usize = 512; +const TOP_RESIDUAL_BASE: usize = 640; +const RESERVED_COLUMNS: usize = 768; + +// Both sides of the quotient identity are below 2^129 for all 64-bit +// inputs. Comparing 130 sum bits is therefore an exact integer comparison, +// not merely equality modulo a power of two. +const INTEGER_SUM_BITS: usize = 130; + +/// One row of two independent Goldilocks multiplications packed by u64 lane. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub(crate) struct GoldilocksMulPairRow { + left: F128, + right: F128, +} + +/// Two lane-wise Goldilocks multiplications with explicit equation outputs. +/// +/// The result is the first output. Callers must connect all residual words +/// to zero and route the two inputs and result through the shared canonical +/// Goldilocks table. +#[derive(Clone, Copy, Debug)] +pub(crate) struct GoldilocksMulPairGate { + pub(crate) nu: usize, +} + +impl GateType for GoldilocksMulPairGate { + type Row = GoldilocksMulPairRow; + type Hint = (); + + fn table(&self) -> TableType { + TableType::from_block_r1cs(&build_goldilocks_mul_r1cs(self.nu)) + .with_io_schema(vec![ + IoWord::input(0), + IoWord::input(1), + IoWord::output(2), + IoWord::output(3), + IoWord::output(4), + IoWord::output(5), + ]) + } + + fn eval( + &self, + inputs: &[F128], + _hint: &(), + outputs: &mut Vec, + ) -> Self::Row { + let left = inputs[0]; + let right = inputs[1]; + outputs.extend_from_slice(&[ + F128::new( + goldilocks_mul(left.lo, right.lo), + goldilocks_mul(left.hi, right.hi), + ), + F128::ZERO, + F128::ZERO, + F128::ZERO, + ]); + GoldilocksMulPairRow { left, right } + } + + fn witness(&self, _rows: &[Self::Row], _nu: usize) -> SlotWitness { + SlotWitness::DeferredToRows + } +} + +struct GoldilocksMulPlan { + boolean: BooleanR1csPlan, + quotient_bits: [[usize; 64]; 2], +} + +pub(crate) fn build_goldilocks_mul_r1cs(nu: usize) -> BlockR1cs { + build_goldilocks_mul_plan().boolean.block_r1cs(nu) +} + +pub(crate) fn generate_goldilocks_mul_witness( + rows: &[GoldilocksMulPairRow], + nu: usize, +) -> (Vec, Vec, Vec, Vec) { + let plan = build_goldilocks_mul_plan(); + generate_boolean_witness(&plan.boolean, rows, nu, |row, bits| { + fill_goldilocks_mul_row(&plan, *row, bits) + }) +} + +fn build_goldilocks_mul_plan() -> GoldilocksMulPlan { + let mut builder = BooleanR1csBuilder::new(MUL_K_LOG, RESERVED_COLUMNS); + for column in LEFT_BASE..RESULT_BASE + 128 { + builder.free_boolean_at(column); + } + let one = builder.alloc_constant_one(); + let quotient_bits = std::array::from_fn(|_| { + std::array::from_fn(|_| builder.alloc_free_boolean()) + }); + + for (lane, quotient) in quotient_bits.iter().enumerate() { + let lane_offset = lane * 64; + let left: [usize; 64] = + std::array::from_fn(|bit| LEFT_BASE + lane_offset + bit); + let right: [usize; 64] = + std::array::from_fn(|bit| RIGHT_BASE + lane_offset + bit); + let result: [usize; 64] = + std::array::from_fn(|bit| RESULT_BASE + lane_offset + bit); + + let mut left_columns = vec![Vec::new(); INTEGER_SUM_BITS + 1]; + for (left_bit, &left_column) in left.iter().enumerate() { + for (right_bit, &right_column) in right.iter().enumerate() { + let product = builder.and(left_column, right_column); + left_columns[left_bit + right_bit].push(product); + } + } + for (bit, "ient_bit) in quotient.iter().enumerate() { + left_columns[bit + 32].push(quotient_bit); + } + + let mut right_columns = vec![Vec::new(); INTEGER_SUM_BITS + 1]; + for bit in 0..64 { + right_columns[bit].push(result[bit]); + right_columns[bit].push(quotient[bit]); + right_columns[bit + 64].push(quotient[bit]); + } + + let left_sum = + sum_bit_columns(&mut builder, left_columns, one, INTEGER_SUM_BITS); + let right_sum = + sum_bit_columns(&mut builder, right_columns, one, INTEGER_SUM_BITS); + for bit in 0..INTEGER_SUM_BITS { + let residual = if bit < 128 { + if bit < 64 { + LOW_RESIDUAL_BASE + lane_offset + bit + } else { + HIGH_RESIDUAL_BASE + lane_offset + bit - 64 + } + } else { + TOP_RESIDUAL_BASE + lane_offset + bit - 128 + }; + let terms: Vec<_> = + [left_sum[bit], right_sum[bit]].into_iter().flatten().collect(); + if !terms.is_empty() { + builder.write_xor(residual, &terms, one); + } + } + } + + GoldilocksMulPlan { boolean: builder.finish(), quotient_bits } +} + +/// Convert a set of same-weight Boolean terms into canonical binary bits. +fn sum_bit_columns( + builder: &mut BooleanR1csBuilder, + mut columns: Vec>, + one: usize, + output_bits: usize, +) -> Vec> { + assert!(columns.len() > output_bits); + + // Carry-save reduction leaves at most two bits in each weight column. + for bit in 0..output_bits { + while columns[bit].len() > 2 { + let third = columns[bit].pop().unwrap(); + let second = columns[bit].pop().unwrap(); + let first = columns[bit].pop().unwrap(); + let (sum, carry) = full_adder(builder, first, second, third, one); + columns[bit].push(sum); + columns[bit + 1].push(carry); + } + } + + // Add the final two carry-save rows with one ripple pass. + let mut result = Vec::with_capacity(output_bits); + let mut carry = None; + for column in columns.iter().take(output_bits) { + let mut terms = column.clone(); + if let Some(carry_bit) = carry.take() { + terms.push(carry_bit); + } + match terms.as_slice() { + [] => result.push(None), + &[only] => result.push(Some(only)), + &[first, second] => { + let (sum, next_carry) = half_adder(builder, first, second, one); + result.push(Some(sum)); + carry = Some(next_carry); + }, + &[first, second, third] => { + let (sum, next_carry) = full_adder(builder, first, second, third, one); + result.push(Some(sum)); + carry = Some(next_carry); + }, + _ => unreachable!("carry-save column contains more than two bits"), + } + } + // The represented integers are strictly below 2^129. Any structurally + // allocated carry at weight 2^130 is therefore the constant-zero Boolean + // function; all of its source operations remain constrained in the table. + result +} + +fn half_adder( + builder: &mut BooleanR1csBuilder, + first: usize, + second: usize, + one: usize, +) -> (usize, usize) { + (builder.xor(&[first, second], one), builder.and(first, second)) +} + +fn full_adder( + builder: &mut BooleanR1csBuilder, + first: usize, + second: usize, + third: usize, + one: usize, +) -> (usize, usize) { + let sum = builder.xor(&[first, second, third], one); + let first_and_second = builder.and(first, second); + let third_and_difference = + builder.product_of_parities(&[third], &[first, second]); + let carry = builder.xor(&[first_and_second, third_and_difference], one); + (sum, carry) +} + +fn fill_goldilocks_mul_row( + plan: &GoldilocksMulPlan, + row: GoldilocksMulPairRow, + bits: &mut [bool], +) { + let result = F128::new( + goldilocks_mul(row.left.lo, row.right.lo), + goldilocks_mul(row.left.hi, row.right.hi), + ); + write_f128(bits, LEFT_BASE, row.left); + write_f128(bits, RIGHT_BASE, row.right); + write_f128(bits, RESULT_BASE, result); + for (lane, quotient_columns) in plan.quotient_bits.iter().enumerate() { + let (left, right) = if lane == 0 { + (row.left.lo, row.right.lo) + } else { + (row.left.hi, row.right.hi) + }; + let quotient = (left as u128 * right as u128) / GOLDILOCKS_MODULUS as u128; + for (bit, &column) in quotient_columns.iter().enumerate() { + bits[column] = (quotient >> bit) & 1 == 1; + } + } +} + +pub(crate) fn goldilocks_mul(left: u64, right: u64) -> u64 { + ((left as u128 * right as u128) % GOLDILOCKS_MODULUS as u128) as u64 +} + +#[cfg(test)] +mod tests { + use std::panic::{AssertUnwindSafe, catch_unwind}; + + use flock_prover::circuit::builder::ShapeBuilder; + use multi_stark::{ + p3_field::{PrimeCharacteristicRing, PrimeField64}, + p3_goldilocks::Goldilocks, + }; + + use super::*; + + #[test] + fn modular_mul_matches_reference_goldilocks() { + let boundary = [ + 0, + 1, + 2, + (1u64 << 32) - 1, + 1u64 << 32, + GOLDILOCKS_MODULUS - 2, + GOLDILOCKS_MODULUS - 1, + ]; + for &left in &boundary { + for &right in &boundary { + let expected = (Goldilocks::from_u64(left) + * Goldilocks::from_u64(right)) + .as_canonical_u64(); + assert_eq!(goldilocks_mul(left, right), expected); + } + } + + let mut state = 0xbb67_ae85_84ca_a73bu64; + for _ in 0..256 { + state = state + .wrapping_mul(0x9e37_79b9_7f4a_7c15) + .wrapping_add(0x94d0_49bb_1331_11eb); + let left = state % GOLDILOCKS_MODULUS; + state ^= state.rotate_left(23); + let right = state % GOLDILOCKS_MODULUS; + let expected = (Goldilocks::from_u64(left) * Goldilocks::from_u64(right)) + .as_canonical_u64(); + assert_eq!(goldilocks_mul(left, right), expected); + } + } + + #[test] + fn modular_mul_r1cs_rejects_wrong_result_and_quotient() { + let plan = build_goldilocks_mul_plan(); + eprintln!( + "Goldilocks multiplication table uses {} Boolean columns", + plan.boolean.useful_bits() + ); + let r1cs = plan.boolean.block_r1cs(3); + let cases = [ + GoldilocksMulPairRow { + left: F128::new(0, GOLDILOCKS_MODULUS - 1), + right: F128::new(GOLDILOCKS_MODULUS - 1, GOLDILOCKS_MODULUS - 1), + }, + GoldilocksMulPairRow { + left: F128::new(1 << 32, 0x1234_5678_9abc_def0), + right: F128::new(GOLDILOCKS_MODULUS - 2, 0xfedc_ba98_7654_3210), + }, + ]; + for row in cases { + let mut logical = vec![false; plan.boolean.k()]; + plan.boolean.fill_row(&mut logical, |bits| { + fill_goldilocks_mul_row(&plan, row, bits) + }); + let mut witness = vec![false; r1cs.n()]; + witness[..plan.boolean.k()].copy_from_slice(&logical); + assert!(r1cs.satisfies(&witness)); + + let mut wrong_result = witness.clone(); + wrong_result[RESULT_BASE + 17] ^= true; + assert!(!r1cs.satisfies(&wrong_result)); + + let mut wrong_quotient = witness; + wrong_quotient[plan.quotient_bits[0][31]] ^= true; + assert!(!r1cs.satisfies(&wrong_quotient)); + } + } + + #[test] + fn multiplication_gate_pins_equation_residuals() { + let nu = 3; + let mut builder = ShapeBuilder::new(nu); + let slot = builder.slot(GoldilocksMulPairGate { nu }); + let left = builder.input(); + let right = builder.input(); + let zero = builder.fixed_public_input(F128::ZERO); + let outputs = builder.gate(slot, &[left, right]); + builder.connect(outputs[1], zero); + builder.connect(outputs[2], zero); + builder.connect(outputs[3], zero); + let shape = builder.finish().unwrap(); + shape.run( + &[ + F128::new(3, GOLDILOCKS_MODULUS - 1), + F128::new(7, GOLDILOCKS_MODULUS - 1), + F128::ZERO, + ], + &[], + ); + + let invalid = catch_unwind(AssertUnwindSafe(|| { + shape.run( + &[F128::new(GOLDILOCKS_MODULUS, 1), F128::new(1, 1), F128::ZERO], + &[], + ) + })); + // The multiplication identity itself accepts any u64 representation; + // canonicality is deliberately a shared, separately wired gate. + assert!(invalid.is_ok()); + } + + #[test] + fn modular_mul_batch_witness_zeroes_dummy_rows() { + let rows = + [GoldilocksMulPairRow { left: F128::new(3, 5), right: F128::new(7, 11) }]; + let plan = build_goldilocks_mul_plan(); + let (z, a, b, stripe) = generate_goldilocks_mul_witness(&rows, 3); + let chunks = plan.boolean.k() / 128; + assert_eq!(z.len(), chunks * 8); + assert_eq!(a.len(), z.len()); + assert_eq!(b.len(), z.len()); + assert_eq!(stripe.len(), plan.boolean.k()); + for chunk in 0..chunks { + for outer in rows.len()..8 { + assert_eq!(z[(chunk << 3) + outer], F128::ZERO); + assert_eq!(a[(chunk << 3) + outer], F128::ZERO); + assert_eq!(b[(chunk << 3) + outer], F128::ZERO); + } + } + } +} diff --git a/flock-stage3/host/src/relation.rs b/flock-stage3/host/src/relation.rs new file mode 100644 index 000000000..52fa4bd32 --- /dev/null +++ b/flock-stage3/host/src/relation.rs @@ -0,0 +1,377 @@ +use anyhow::{Result, bail}; +use ix_terminal::{Stage2AdviceProfileV1, ValidatedStage2RootV1}; +use multi_stark::types::FriParameters; + +use crate::{ + FlockConfigV1, Stage2AirPcsFriWitnessV1, Stage3TypedProofWitnessV1, + fri::stage2_air_pcs_fri_circuit_digest, +}; + +pub const STAGE3_RELATION_MANIFEST_DOMAIN: &[u8; 8] = b"IXFLKR01"; +const STAGE3_RELATION_MANIFEST_VERSION: u16 = 1; + +/// A semantic obligation that the production Flock relation must enforce. +/// +/// These are deliberately coarser than individual helper functions, but fine +/// grained enough that a partial port cannot silently omit an entire verifier +/// phase. A phase bit may only be enabled together with tests that compare the +/// Flock lowering against the existing Aiur verifier. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +#[repr(u8)] +pub enum Stage3VerifierPhaseV1 { + TypedProofWitnessShape = 0, + SpecializedVerifyingKeyBinding = 1, + ClaimsDecodeAndCanonicality = 2, + Stage2StatementBinding = 3, + ShapeAndActivation = 4, + LookupAccumulatorBalance = 5, + FiatShamirReplay = 6, + AirOodEvaluation = 7, + PcsOpeningReduction = 8, + MerkleMmcs = 9, + FriGrindingFoldAndFinalPolynomial = 10, +} + +pub const STAGE3_VERIFIER_PHASES_V1: [Stage3VerifierPhaseV1; 11] = [ + Stage3VerifierPhaseV1::TypedProofWitnessShape, + Stage3VerifierPhaseV1::SpecializedVerifyingKeyBinding, + Stage3VerifierPhaseV1::ClaimsDecodeAndCanonicality, + Stage3VerifierPhaseV1::Stage2StatementBinding, + Stage3VerifierPhaseV1::ShapeAndActivation, + Stage3VerifierPhaseV1::LookupAccumulatorBalance, + Stage3VerifierPhaseV1::FiatShamirReplay, + Stage3VerifierPhaseV1::AirOodEvaluation, + Stage3VerifierPhaseV1::PcsOpeningReduction, + Stage3VerifierPhaseV1::MerkleMmcs, + Stage3VerifierPhaseV1::FriGrindingFoldAndFinalPolynomial, +]; + +const REQUIRED_PHASE_MASK: u16 = (1 << STAGE3_VERIFIER_PHASES_V1.len()) - 1; + +// Every phase is consumed by the single statement/AIR/PCS/FRI relation. The +// manifest still refuses to identify a deployable relation until the concrete +// compiled circuit digest has been installed. +const IMPLEMENTED_PHASE_MASK: u16 = REQUIRED_PHASE_MASK; + +impl Stage3VerifierPhaseV1 { + const fn bit(self) -> u16 { + 1 << self as u8 + } + + pub const fn name(self) -> &'static str { + match self { + Self::TypedProofWitnessShape => "typed-proof-witness-shape", + Self::SpecializedVerifyingKeyBinding => { + "specialized-verifying-key-binding" + }, + Self::ClaimsDecodeAndCanonicality => "claims-decode-and-canonicality", + Self::Stage2StatementBinding => "stage2-statement-binding", + Self::ShapeAndActivation => "shape-and-activation", + Self::LookupAccumulatorBalance => "lookup-accumulator-balance", + Self::FiatShamirReplay => "fiat-shamir-replay", + Self::AirOodEvaluation => "air-ood-evaluation", + Self::PcsOpeningReduction => "pcs-opening-reduction", + Self::MerkleMmcs => "merkle-mmcs", + Self::FriGrindingFoldAndFinalPolynomial => { + "fri-grinding-fold-and-final-polynomial" + }, + } + } +} + +/// Auditable progress gate for the verifier lowering. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct Stage3LoweringStatusV1 { + implemented_phase_mask: u16, +} + +impl Stage3LoweringStatusV1 { + pub const fn current() -> Self { + Self { implemented_phase_mask: IMPLEMENTED_PHASE_MASK } + } + + pub const fn required_phase_mask(self) -> u16 { + REQUIRED_PHASE_MASK + } + + pub const fn implemented_phase_mask(self) -> u16 { + self.implemented_phase_mask + } + + pub const fn is_complete(self) -> bool { + self.implemented_phase_mask == REQUIRED_PHASE_MASK + } + + pub fn missing_phases(self) -> Vec { + STAGE3_VERIFIER_PHASES_V1 + .into_iter() + .filter(|phase| self.implemented_phase_mask & phase.bit() == 0) + .collect() + } + + pub fn ensure_complete(self) -> Result<()> { + if self.is_complete() { + return Ok(()); + } + let missing = self + .missing_phases() + .into_iter() + .map(Stage3VerifierPhaseV1::name) + .collect::>() + .join(", "); + bail!("Flock Stage 3 verifier lowering is incomplete; missing: {missing}") + } +} + +/// Fixed capacity of one compiled Stage 3 verifier relation. +/// +/// `for_prepared` seeds every maximum from one measured root. That is useful +/// while developing the lowering, but it is not a production capacity study: +/// the final values must cover the intended corpus before the relation program +/// digest is frozen. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage3RelationBoundsV1 { + pub verifying_key_bytes: u64, + pub claims_bytes: u64, + pub advice: Stage2AdviceProfileV1, +} + +impl Stage3RelationBoundsV1 { + fn for_prepared(prepared: &ValidatedStage2RootV1) -> Result { + Ok(Self { + verifying_key_bytes: as_u64( + prepared.verifying_key_bytes().len(), + "verifying-key bytes", + )?, + claims_bytes: as_u64(prepared.claims_bytes().len(), "claims bytes")?, + advice: prepared.advice_profile().clone(), + }) + } + + fn canonical_words(&self) -> [u64; 14] { + [ + self.verifying_key_bytes, + self.claims_bytes, + self.advice.advice_bytes, + self.advice.total_circuits, + self.advice.active_circuits, + self.advice.queries, + self.advice.fri_rounds, + self.advice.input_rounds_per_query, + self.advice.commitment_cap_digests, + self.advice.input_merkle_siblings, + self.advice.fri_merkle_siblings, + self.advice.opened_base_values, + self.advice.fri_sibling_extension_values, + self.advice.other_extension_values, + ] + } + + fn ensure_accommodates( + &self, + prepared: &ValidatedStage2RootV1, + ) -> Result<()> { + let observed = Self::for_prepared(prepared)?; + if observed.verifying_key_bytes != self.verifying_key_bytes { + bail!("Stage 2 verifying-key byte length differs from relation shape"); + } + if observed.claims_bytes != self.claims_bytes { + bail!("Stage 2 claims byte length differs from relation shape"); + } + if observed.advice.total_circuits != self.advice.total_circuits { + bail!("Stage 2 circuit count differs from relation shape"); + } + if observed.advice.queries != self.advice.queries { + bail!("Stage 2 query count differs from relation shape"); + } + + let maxima = [ + (observed.advice.advice_bytes, self.advice.advice_bytes, "advice bytes"), + ( + observed.advice.active_circuits, + self.advice.active_circuits, + "active circuits", + ), + (observed.advice.fri_rounds, self.advice.fri_rounds, "FRI rounds"), + ( + observed.advice.input_rounds_per_query, + self.advice.input_rounds_per_query, + "input rounds per query", + ), + ( + observed.advice.commitment_cap_digests, + self.advice.commitment_cap_digests, + "commitment cap digests", + ), + ( + observed.advice.input_merkle_siblings, + self.advice.input_merkle_siblings, + "input Merkle siblings", + ), + ( + observed.advice.fri_merkle_siblings, + self.advice.fri_merkle_siblings, + "FRI Merkle siblings", + ), + ( + observed.advice.opened_base_values, + self.advice.opened_base_values, + "opened base values", + ), + ( + observed.advice.fri_sibling_extension_values, + self.advice.fri_sibling_extension_values, + "FRI sibling extension values", + ), + ( + observed.advice.other_extension_values, + self.advice.other_extension_values, + "other extension values", + ), + ]; + if let Some((observed, maximum, label)) = + maxima.into_iter().find(|(observed, maximum, _)| observed > maximum) + { + bail!( + "Stage 2 {label} ({observed}) exceeds relation capacity ({maximum})" + ); + } + Ok(()) + } +} + +/// Canonical identity of a specialised Stage 3 verifier relation. +/// +/// The constructor compiles the relation and installs its circuit digest. +/// `relation_digest` additionally binds the Flock configuration, specialised +/// Stage 2 key, witness layout, phase mask, and exact measured capacity. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage3RelationManifestV1 { + stage2_verifying_key_digest: [u8; 32], + typed_witness_layout_digest: [u8; 32], + relation_program_digest: Option<[u8; 32]>, + bounds: Stage3RelationBoundsV1, + lowering_status: Stage3LoweringStatusV1, +} + +impl Stage3RelationManifestV1 { + pub fn for_prepared(prepared: &ValidatedStage2RootV1) -> Result { + let fri = statement_fri_parameters(prepared)?; + let witness = Stage2AirPcsFriWitnessV1::from_prepared(prepared, &fri)?; + let relation_program_digest = stage2_air_pcs_fri_circuit_digest(&witness)?; + Self::for_prepared_and_program_digest(prepared, relation_program_digest) + } + + pub(crate) fn for_prepared_and_program_digest( + prepared: &ValidatedStage2RootV1, + relation_program_digest: [u8; 32], + ) -> Result { + let fri = statement_fri_parameters(prepared)?; + let typed_witness = + Stage3TypedProofWitnessV1::from_prepared(prepared, &fri)?; + Ok(Self { + stage2_verifying_key_digest: *prepared.statement().verifying_key_digest(), + typed_witness_layout_digest: typed_witness.layout_digest(), + relation_program_digest: Some(relation_program_digest), + bounds: Stage3RelationBoundsV1::for_prepared(prepared)?, + lowering_status: Stage3LoweringStatusV1::current(), + }) + } + + pub fn stage2_verifying_key_digest(&self) -> &[u8; 32] { + &self.stage2_verifying_key_digest + } + + pub fn typed_witness_layout_digest(&self) -> &[u8; 32] { + &self.typed_witness_layout_digest + } + + pub fn bounds(&self) -> &Stage3RelationBoundsV1 { + &self.bounds + } + + pub const fn lowering_status(&self) -> Stage3LoweringStatusV1 { + self.lowering_status + } + + pub fn ensure_accommodates( + &self, + prepared: &ValidatedStage2RootV1, + ) -> Result<()> { + if prepared.statement().verifying_key_digest() + != &self.stage2_verifying_key_digest + { + bail!("Stage 2 verifying key differs from the specialised relation"); + } + self.bounds.ensure_accommodates(prepared) + } + + /// Return the digest used in `Stage3StatementV1` for the complete, + /// content-addressed relation program and its exact capacity. + pub fn relation_digest(&self) -> Result<[u8; 32]> { + self.lowering_status.ensure_complete()?; + if self.relation_program_digest.is_none() { + bail!("Flock Stage 3 relation program has not been built and digested"); + } + Ok(*blake3::hash(&self.canonical_bytes()).as_bytes()) + } + + fn canonical_bytes(&self) -> Vec { + let mut bytes = Vec::with_capacity(8 + 2 + 32 * 4 + 2 + 2 + 14 * 8); + bytes.extend_from_slice(STAGE3_RELATION_MANIFEST_DOMAIN); + bytes.extend_from_slice(&STAGE3_RELATION_MANIFEST_VERSION.to_le_bytes()); + bytes.extend_from_slice(&FlockConfigV1.digest()); + bytes.extend_from_slice(&self.stage2_verifying_key_digest); + bytes.extend_from_slice(&self.typed_witness_layout_digest); + bytes.extend_from_slice(&self.relation_program_digest.unwrap_or([0; 32])); + bytes.extend_from_slice( + &self.lowering_status.required_phase_mask().to_le_bytes(), + ); + bytes.extend_from_slice( + &self.lowering_status.implemented_phase_mask().to_le_bytes(), + ); + for word in self.bounds.canonical_words() { + bytes.extend_from_slice(&word.to_le_bytes()); + } + bytes + } +} + +fn statement_fri_parameters( + prepared: &ValidatedStage2RootV1, +) -> Result { + let [log_final_poly_len, max_log_arity, num_queries, commit_pow, query_pow] = + *prepared.statement().fri_parameter_words(); + let convert = |value, label| { + usize::try_from(value).map_err(|error| { + anyhow::anyhow!("Stage 2 {label} does not fit usize: {error}") + }) + }; + Ok(FriParameters { + log_final_poly_len: convert(log_final_poly_len, "final polynomial log")?, + max_log_arity: convert(max_log_arity, "maximum FRI arity log")?, + num_queries: convert(num_queries, "query count")?, + commit_proof_of_work_bits: convert(commit_pow, "commit PoW bits")?, + query_proof_of_work_bits: convert(query_pow, "query PoW bits")?, + }) +} + +fn as_u64(value: usize, label: &str) -> Result { + u64::try_from(value) + .map_err(|error| anyhow::anyhow!("{label} exceeds u64: {error}")) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn phase_registry_is_complete_and_unique() { + let status = Stage3LoweringStatusV1::current(); + assert_eq!(status.required_phase_mask(), 0x07ff); + assert_eq!(status.implemented_phase_mask(), 0x07ff); + assert!(status.is_complete()); + assert!(status.missing_phases().is_empty()); + status.ensure_complete().unwrap(); + } +} diff --git a/flock-stage3/host/src/transcript.rs b/flock-stage3/host/src/transcript.rs new file mode 100644 index 000000000..407436db8 --- /dev/null +++ b/flock-stage3/host/src/transcript.rs @@ -0,0 +1,2792 @@ +//! Exact BLAKE3 `HashChallenger` replay for the Stage 2 verifier transcript. +//! +//! Plonky3's byte challenger replaces its input with `BLAKE3(input)` whenever +//! an empty output buffer is sampled, then pops sample bytes from the END of +//! that digest. An observation discards any unused output bytes. This module +//! lowers the protocol-shaped prefix through the PCS opening-batch sample: +//! +//! 1. sample and re-observe the lookup challenge; +//! 2. sample and re-observe the fingerprint challenge; +//! 3. observe Stage 2 data and sample the constraint challenge; +//! 4. observe the quotient commitment and sample zeta; +//! 5. observe all PCS openings, then sample the FRI/PCS batching challenge +//! used to reduce every opening before the commit-phase folds. +//! +//! The replay can then continue through FRI commitments, commit grinding and +//! betas, the final polynomial/arity observations, query grinding, and every +//! masked query draw. Every BLAKE3 compression is constrained, including +//! chunk-tree parents for messages longer than 1,024 bytes. Sampled Goldilocks +//! limbs are checked canonical. Field sampling constrains one chained digest +//! refill and fails closed only if those eight candidates still contain fewer +//! than two canonical Goldilocks values (seven candidates after a raw PoW +//! draw). + +use aiur::vk_codec::AiurVerifyingKey; +use anyhow::{Context, Result, bail}; +use bincode::Options; +use flock_prover::{ + challenger::FsChallenger, + circuit::builder::{ + CircuitShape, GateType, ShapeBuilder, SlotId, SlotWitness, Wire, + }, + field::F128, + lincheck::LincheckCircuit, + pcs::Commitment, + proof::R1csProofCircuitMerged, + prover::{self, UnionSlotProverInput}, + r1cs_hashes::{ + blake3 as flock_blake3, + fs_chain::{CvSource, FsChain, FsChainTrace}, + }, + schedule::{IoWord, TableType}, + union::UnionInstance, + verifier, +}; +use ix_terminal::{ValidatedStage2RootV1, fri_parameter_words}; +use multi_stark::types::FriParameters; +use serde::{Deserialize, Serialize}; + +use crate::{ + FlockConfigV1, STAGE2_TRANSCRIPT_CONFORMANCE_TRANSCRIPT_DOMAIN, + binding::{Blake3Gate, IV, pack_bytes, pack_params, pack8, pcs_params}, + boolean::{ + BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, write_f128, + }, + goldilocks::{ + CanonicalGoldilocksPairGate, GOLDILOCKS_MODULUS, build_canonical_pair_r1cs, + generate_canonical_pair_witness, + }, + typed_witness::{Stage3OpenedRoundV1, Stage3TypedProofWitnessV1}, +}; + +pub const STAGE2_TRANSCRIPT_CONFORMANCE_ARTIFACT_MAGIC: &[u8; 8] = b"IXFLTR01"; + +const ARTIFACT_VERSION: u16 = 1; +const CONFIG_OFFSET: usize = 10; +const LENGTHS_OFFSET: usize = CONFIG_OFFSET + 32; +const SEGMENT_COUNT: usize = 4; +const LENGTH_BYTES: usize = SEGMENT_COUNT * 4; +const SEGMENTS_OFFSET: usize = LENGTHS_OFFSET + LENGTH_BYTES; +const CHALLENGE_COUNT: usize = 5; +const CHALLENGE_BYTES: usize = CHALLENGE_COUNT * 16; +const FIXED_SUFFIX_BYTES: usize = CHALLENGE_BYTES + 32 + 8; +const MAX_OBSERVATION_BYTES: usize = 16 * 1024 * 1024; +const MAX_BUNDLE_BYTES: usize = 64 * 1024 * 1024; +const WORD_BYTES: usize = 16; +const MIN_NU: usize = 8; +const MAX_NU: usize = 20; +const MAX_FRI_ROUNDS: usize = 32; +const MAX_FRI_QUERIES: usize = 1_024; +const MAX_CAP_ROOTS: usize = 256; + +const SAMPLE_K_LOG: usize = 9; +const SAMPLE_INPUT_BASE: usize = 0; +const SAMPLE_OUTPUT_BASE: usize = 128; +const SAMPLE_COLUMNS: usize = 256; + +const FIELD_SAMPLE_K_LOG: usize = 14; +const FIELD_SAMPLE_HIGH_BASE: usize = 0; +const FIELD_SAMPLE_LOW_BASE: usize = 128; +const FIELD_SAMPLE_REFILL_HIGH_BASE: usize = 256; +const FIELD_SAMPLE_REFILL_LOW_BASE: usize = 384; +const FIELD_SAMPLE_OUTPUT_BASE: usize = 512; +const FIELD_SAMPLE_FAILURE_BASE: usize = 640; +const FIELD_SAMPLE_RAW_FIRST_BASE: usize = 768; +const FIELD_SAMPLE_SKIP_OUTPUT_BASE: usize = 896; +const FIELD_SAMPLE_SKIP_FAILURE_BASE: usize = 1_024; +const FIELD_SAMPLE_STATE_LOW_BASE: usize = 1_152; +const FIELD_SAMPLE_STATE_HIGH_BASE: usize = 1_280; +const FIELD_SAMPLE_SKIP_STATE_LOW_BASE: usize = 1_408; +const FIELD_SAMPLE_SKIP_STATE_HIGH_BASE: usize = 1_536; +const FIELD_SAMPLE_COLUMNS: usize = 1_664; + +/// The variable observation segments around the fixed challenger operations. +/// +/// `initial_observations` is the complete seed/shape/activation/stage-1/ +/// claims prefix. The other fields correspond to the comments on their +/// names and are already serialized exactly as the Stage 2 challenger sees +/// them. The production composition will build these byte words directly +/// from the typed proof and verifying-key constants. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage2TranscriptReplayV1 { + pub initial_observations: Vec, + pub stage2_and_accumulator_observations: Vec, + pub quotient_commitment_observations: Vec, + pub pcs_opening_observations: Vec, +} + +/// Challenges derived by [`Stage2TranscriptReplayV1`], in protocol order. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct Stage2TranscriptChallengesV1 { + pub lookup: [u64; 2], + pub fingerprint: [u64; 2], + pub constraint: [u64; 2], + pub zeta: [u64; 2], + pub pcs_alpha: [u64; 2], +} + +/// One of the four byte segments consumed by the constrained Stage 2 +/// transcript prefix. +/// +/// PCS composition uses these identifiers to consume commitment roots and +/// out-of-domain values from the exact wires already hashed by the +/// transcript, rather than accepting duplicated public values. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum Stage2TranscriptSegmentV1 { + Initial, + Stage2AndAccumulator, + QuotientCommitment, + PcsOpening, +} + +impl Stage2TranscriptSegmentV1 { + pub(crate) const fn index(self) -> usize { + match self { + Self::Initial => 0, + Self::Stage2AndAccumulator => 1, + Self::QuotientCommitment => 2, + Self::PcsOpening => 3, + } + } +} + +/// A little-endian `u64` lane inside one constrained transcript segment. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct Stage2TranscriptByteBindingV1 { + pub segment: Stage2TranscriptSegmentV1, + pub byte_offset: usize, +} + +impl Stage2TranscriptByteBindingV1 { + pub const fn new( + segment: Stage2TranscriptSegmentV1, + byte_offset: usize, + ) -> Self { + Self { segment, byte_offset } + } +} + +/// The FRI portion of the Stage 2 byte transcript after the opening-batch +/// challenge has been sampled. +/// +/// Commitments are kept as caps so the relation can expose and bind every cap +/// root individually. `query_index_bits` is the exact bit width passed to +/// `SerializingChallenger64::sample_bits`; it equals the global FRI height for +/// the two-adic folding strategy used by Ix. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage2FriTranscriptReplayV1 { + pub commit_phase_commitments: Vec>, + pub commit_pow_witnesses: Vec, + pub final_polynomial: Vec<[u64; 2]>, + pub log_arities: Vec, + pub query_pow_witness: u64, + pub commit_pow_bits: u8, + pub query_pow_bits: u8, + pub num_queries: usize, + pub query_index_bits: u8, +} + +/// Challenges sampled by the FRI verifier after the PCS batching challenge. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage2FriTranscriptChallengesV1 { + pub betas: Vec<[u64; 2]>, + pub query_indices: Vec, +} + +impl Stage2TranscriptReplayV1 { + /// Replay the exact native byte challenger through the first FRI challenge. + pub fn challenges(&self) -> Result { + compute_challenges(self) + } + + /// Build the exact transcript segments from an already validated Stage 2 + /// root and its serializer-independent typed proof witness. + pub fn from_prepared( + prepared: &ValidatedStage2RootV1, + fri: &FriParameters, + ) -> Result { + let typed = Stage3TypedProofWitnessV1::from_prepared(prepared, fri)?; + Self::from_prepared_and_typed(prepared, fri, &typed) + } + + pub fn from_prepared_and_typed( + prepared: &ValidatedStage2RootV1, + fri: &FriParameters, + typed: &Stage3TypedProofWitnessV1, + ) -> Result { + if prepared.statement().fri_parameter_words() != &fri_parameter_words(fri) { + bail!("Stage 2 transcript uses different FRI parameters"); + } + typed.ensure_profile(prepared.advice_profile())?; + let key = AiurVerifyingKey::from_bytes(prepared.verifying_key_bytes()) + .map_err(|error| { + anyhow::anyhow!("decode Aiur transcript key: {error}") + })?; + if key.to_bytes() != prepared.verifying_key_bytes() { + bail!("Aiur transcript key is not canonically encoded"); + } + if fri_parameter_words(&key.fri_parameters()) != fri_parameter_words(fri) { + bail!("Aiur transcript key uses different FRI parameters"); + } + if key.num_circuits() != typed.active.len() { + bail!( + "Aiur transcript key has {} circuits but activation has {} bits", + key.num_circuits(), + typed.active.len() + ); + } + + let mut initial_observations = key.transcript_seed_and_shape_bytes(); + for &active in &typed.active { + push_u64_observation(&mut initial_observations, u64::from(active)); + } + if let Some(preprocessed) = key.preprocessed_commitment_roots() { + push_cap_observations(&mut initial_observations, &preprocessed); + } + push_cap_observations( + &mut initial_observations, + &typed.commitments.stage_1_trace, + ); + for &log_degree in &typed.log_degrees { + push_u64_observation(&mut initial_observations, u64::from(log_degree)); + } + initial_observations.extend_from_slice(prepared.claims_bytes()); + + let mut stage2_and_accumulator_observations = Vec::new(); + push_cap_observations( + &mut stage2_and_accumulator_observations, + &typed.commitments.stage_2_trace, + ); + for &accumulator in &typed.intermediate_accumulators { + push_extension_observation( + &mut stage2_and_accumulator_observations, + accumulator, + ); + } + + let mut quotient_commitment_observations = Vec::new(); + push_cap_observations( + &mut quotient_commitment_observations, + &typed.commitments.quotient_chunks, + ); + + let mut pcs_opening_observations = Vec::new(); + push_opened_round_observations( + &mut pcs_opening_observations, + &typed.stage_1_opened_values, + ); + push_opened_round_observations( + &mut pcs_opening_observations, + &typed.stage_2_opened_values, + ); + push_opened_round_observations( + &mut pcs_opening_observations, + &typed.quotient_opened_values, + ); + if let Some(preprocessed) = &typed.preprocessed_opened_values { + push_opened_round_observations( + &mut pcs_opening_observations, + preprocessed, + ); + } + + let replay = Self { + initial_observations, + stage2_and_accumulator_observations, + quotient_commitment_observations, + pcs_opening_observations, + }; + validate_replay(&replay)?; + Ok(replay) + } +} + +impl Stage2FriTranscriptReplayV1 { + /// Build the exact post-opening FRI transcript from the validated Stage 2 + /// advice transport and the commitment parameters embedded in its key. + pub fn from_prepared( + prepared: &ValidatedStage2RootV1, + fri: &FriParameters, + ) -> Result { + let typed = Stage3TypedProofWitnessV1::from_prepared(prepared, fri)?; + Self::from_prepared_and_typed(prepared, fri, &typed) + } + + pub fn from_prepared_and_typed( + prepared: &ValidatedStage2RootV1, + fri: &FriParameters, + typed: &Stage3TypedProofWitnessV1, + ) -> Result { + if prepared.statement().fri_parameter_words() != &fri_parameter_words(fri) { + bail!("Stage 2 FRI transcript uses different FRI parameters"); + } + typed.ensure_profile(prepared.advice_profile())?; + let key = AiurVerifyingKey::from_bytes(prepared.verifying_key_bytes()) + .map_err(|error| { + anyhow::anyhow!("decode Aiur FRI transcript key: {error}") + })?; + if key.to_bytes() != prepared.verifying_key_bytes() { + bail!("Aiur FRI transcript key is not canonically encoded"); + } + if fri_parameter_words(&key.fri_parameters()) != fri_parameter_words(fri) { + bail!("Aiur FRI transcript key uses different FRI parameters"); + } + + let first_query = typed + .opening_proof + .query_proofs + .first() + .ok_or_else(|| anyhow::anyhow!("Stage 2 FRI proof has no queries"))?; + let log_arities: Vec = first_query + .commit_phase_openings + .iter() + .map(|step| step.log_arity) + .collect(); + if typed.opening_proof.query_proofs.iter().any(|query| { + query + .commit_phase_openings + .iter() + .map(|step| step.log_arity) + .ne(log_arities.iter().copied()) + }) { + bail!("Stage 2 FRI queries disagree on the folding-arity schedule"); + } + let total_log_reduction = + log_arities.iter().try_fold(0usize, |sum, &arity| { + sum + .checked_add(usize::from(arity)) + .ok_or_else(|| anyhow::anyhow!("FRI folding-arity sum overflow")) + })?; + let query_index_bits = total_log_reduction + .checked_add(key.commitment_parameters().log_blowup) + .and_then(|height| height.checked_add(fri.log_final_poly_len)) + .ok_or_else(|| anyhow::anyhow!("FRI global height overflow"))?; + + let replay = Self { + commit_phase_commitments: typed + .opening_proof + .commit_phase_commits + .clone(), + commit_pow_witnesses: typed.opening_proof.commit_pow_witnesses.clone(), + final_polynomial: typed.opening_proof.final_poly.clone(), + log_arities, + query_pow_witness: typed.opening_proof.query_pow_witness, + commit_pow_bits: u8::try_from(fri.commit_proof_of_work_bits) + .map_err(|_| anyhow::anyhow!("commit PoW bits exceed u8"))?, + query_pow_bits: u8::try_from(fri.query_proof_of_work_bits) + .map_err(|_| anyhow::anyhow!("query PoW bits exceed u8"))?, + num_queries: fri.num_queries, + query_index_bits: u8::try_from(query_index_bits) + .map_err(|_| anyhow::anyhow!("FRI query-index width exceeds u8"))?, + }; + validate_fri_replay(&replay)?; + Ok(replay) + } + + /// Replay the native challenger from the prefix's retained digest state. + pub fn challenges( + &self, + prefix: &Stage2TranscriptReplayV1, + ) -> Result { + compute_fri_challenges(prefix, self) + } +} + +/// A real Flock proof of the transcript prefix relation. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage2TranscriptConformanceArtifactV1 { + replay: Stage2TranscriptReplayV1, + challenges: Stage2TranscriptChallengesV1, + circuit_digest: [u8; 32], + proof_bundle_bytes: Vec, +} + +impl Stage2TranscriptConformanceArtifactV1 { + pub fn replay(&self) -> &Stage2TranscriptReplayV1 { + &self.replay + } + + pub const fn challenges(&self) -> Stage2TranscriptChallengesV1 { + self.challenges + } + + pub fn circuit_digest(&self) -> &[u8; 32] { + &self.circuit_digest + } + + pub fn proof_bundle_bytes(&self) -> &[u8] { + &self.proof_bundle_bytes + } + + pub fn to_bytes(&self) -> Vec { + let segments = replay_segments(&self.replay); + let segment_bytes: usize = + segments.iter().map(|segment| segment.len()).sum(); + let mut bytes = Vec::with_capacity( + SEGMENTS_OFFSET + + segment_bytes + + FIXED_SUFFIX_BYTES + + self.proof_bundle_bytes.len(), + ); + bytes.extend_from_slice(STAGE2_TRANSCRIPT_CONFORMANCE_ARTIFACT_MAGIC); + bytes.extend_from_slice(&ARTIFACT_VERSION.to_le_bytes()); + bytes.extend_from_slice(&FlockConfigV1.digest()); + for segment in &segments { + bytes.extend_from_slice( + &u32::try_from(segment.len()) + .expect("bounded transcript segment length") + .to_le_bytes(), + ); + } + for segment in &segments { + bytes.extend_from_slice(segment); + } + encode_challenges(&mut bytes, self.challenges); + bytes.extend_from_slice(&self.circuit_digest); + bytes.extend_from_slice( + &u64::try_from(self.proof_bundle_bytes.len()) + .expect("proof bundle length") + .to_le_bytes(), + ); + bytes.extend_from_slice(&self.proof_bundle_bytes); + bytes + } + + pub fn from_bytes(bytes: &[u8]) -> Result { + if bytes.len() < SEGMENTS_OFFSET + FIXED_SUFFIX_BYTES { + bail!("truncated Flock Stage 2 transcript artifact"); + } + if &bytes[..8] != STAGE2_TRANSCRIPT_CONFORMANCE_ARTIFACT_MAGIC { + bail!("invalid Flock Stage 2 transcript artifact magic"); + } + let version = u16::from_le_bytes(bytes[8..10].try_into().unwrap()); + if version != ARTIFACT_VERSION { + bail!("unsupported Flock Stage 2 transcript artifact version {version}"); + } + if bytes[CONFIG_OFFSET..LENGTHS_OFFSET] != FlockConfigV1.digest() { + bail!("Flock Stage 2 transcript artifact configuration mismatch"); + } + + let mut lengths = [0usize; SEGMENT_COUNT]; + for (index, length) in lengths.iter_mut().enumerate() { + let offset = LENGTHS_OFFSET + index * 4; + *length = usize::try_from(u32::from_le_bytes( + bytes[offset..offset + 4].try_into().unwrap(), + )) + .expect("u32 fits usize"); + } + let segment_bytes = lengths.iter().try_fold(0usize, |total, &length| { + total + .checked_add(length) + .ok_or_else(|| anyhow::anyhow!("transcript segment length overflow")) + })?; + let suffix_offset = SEGMENTS_OFFSET + .checked_add(segment_bytes) + .ok_or_else(|| anyhow::anyhow!("transcript artifact length overflow"))?; + let minimum_end = suffix_offset + .checked_add(FIXED_SUFFIX_BYTES) + .ok_or_else(|| anyhow::anyhow!("transcript artifact length overflow"))?; + if bytes.len() < minimum_end { + bail!("truncated Flock Stage 2 transcript artifact segments"); + } + + let mut cursor = SEGMENTS_OFFSET; + let mut take_segment = |length: usize| { + let end = cursor + length; + let segment = bytes[cursor..end].to_vec(); + cursor = end; + segment + }; + let replay = Stage2TranscriptReplayV1 { + initial_observations: take_segment(lengths[0]), + stage2_and_accumulator_observations: take_segment(lengths[1]), + quotient_commitment_observations: take_segment(lengths[2]), + pcs_opening_observations: take_segment(lengths[3]), + }; + validate_replay(&replay)?; + debug_assert_eq!(cursor, suffix_offset); + + let challenges = + decode_challenges(&bytes[suffix_offset..suffix_offset + CHALLENGE_BYTES]); + validate_challenges(challenges)?; + let digest_offset = suffix_offset + CHALLENGE_BYTES; + let mut circuit_digest = [0u8; 32]; + circuit_digest.copy_from_slice(&bytes[digest_offset..digest_offset + 32]); + let bundle_length_offset = digest_offset + 32; + let bundle_len = usize::try_from(u64::from_le_bytes( + bytes[bundle_length_offset..bundle_length_offset + 8].try_into().unwrap(), + )) + .map_err(|_| anyhow::anyhow!("Flock proof length does not fit usize"))?; + if bundle_len == 0 || bundle_len > MAX_BUNDLE_BYTES { + bail!("invalid Flock Stage 2 transcript proof length {bundle_len}"); + } + let bundle_offset = bundle_length_offset + 8; + let declared_end = bundle_offset + .checked_add(bundle_len) + .ok_or_else(|| anyhow::anyhow!("transcript proof length overflow"))?; + if bytes.len() != declared_end { + bail!( + "Flock Stage 2 transcript artifact is {} bytes; header declares {declared_end}", + bytes.len() + ); + } + Ok(Self { + replay, + challenges, + circuit_digest, + proof_bundle_bytes: bytes[bundle_offset..].to_vec(), + }) + } +} + +#[derive(Serialize, Deserialize)] +struct TranscriptProofBundle { + commitment: Commitment, + proof: R1csProofCircuitMerged, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub(crate) struct HashSampleRow(F128); + +/// Convert digest bytes `[16..32]` into the first sampled extension element. +/// +/// For an input word `[LE(digest[16..24]), LE(digest[24..32])]`, popping +/// bytes from the end and then decoding each draw as LE produces +/// `[BE(digest[24..32]), BE(digest[16..24])]`. +#[derive(Clone, Copy, Debug)] +pub(crate) struct HashSampleGate { + pub(crate) nu: usize, +} + +impl GateType for HashSampleGate { + type Row = HashSampleRow; + type Hint = (); + + fn table(&self) -> TableType { + TableType::from_block_r1cs(&build_hash_sample_r1cs(self.nu)) + .with_io_schema(vec![IoWord::input(0), IoWord::output(1)]) + } + + fn eval( + &self, + inputs: &[F128], + _hint: &(), + outputs: &mut Vec, + ) -> Self::Row { + let input = inputs[0]; + outputs.push(sample_word(input)); + HashSampleRow(input) + } + + fn witness(&self, _rows: &[Self::Row], _nu: usize) -> SlotWitness { + SlotWitness::DeferredToRows + } +} + +pub(crate) fn build_hash_sample_r1cs( + nu: usize, +) -> flock_prover::r1cs::BlockR1cs { + hash_sample_plan().block_r1cs(nu) +} + +pub(crate) fn generate_hash_sample_witness( + rows: &[HashSampleRow], + nu: usize, +) -> (Vec, Vec, Vec, Vec) { + generate_boolean_witness(hash_sample_plan(), rows, nu, |row, bits| { + write_f128(bits, SAMPLE_INPUT_BASE, row.0); + }) +} + +fn hash_sample_plan() -> &'static BooleanR1csPlan { + static PLAN: std::sync::OnceLock = + std::sync::OnceLock::new(); + PLAN.get_or_init(|| { + let mut builder = BooleanR1csBuilder::new(SAMPLE_K_LOG, SAMPLE_COLUMNS); + for column in SAMPLE_INPUT_BASE..SAMPLE_INPUT_BASE + 128 { + builder.free_boolean_at(column); + } + for output_bit in 0..128 { + let lane_bit = output_bit % 64; + let source_lane = if output_bit < 64 { 1 } else { 0 }; + let source = + SAMPLE_INPUT_BASE + source_lane * 64 + reverse_bytes_bit(lane_bit); + builder.write_product_of_parities( + SAMPLE_OUTPUT_BASE + output_bit, + &[source], + &[source], + ); + } + builder.finish() + }) +} + +const fn reverse_bytes_bit(bit: usize) -> usize { + (7 - bit / 8) * 8 + bit % 8 +} + +fn sample_word(input: F128) -> F128 { + F128::new(input.hi.swap_bytes(), input.lo.swap_bytes()) +} + +/// Eight raw draws from a digest and its chained refill, lowered to the first +/// two canonical Goldilocks values. The second result variant skips the first +/// raw draw, as required when commit-phase grinding consumes it before beta. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub(crate) struct GoldilocksSampleRow([F128; 4]); + +#[derive(Clone, Copy, Debug)] +pub(crate) struct GoldilocksSampleGate { + pub(crate) nu: usize, +} + +impl GateType for GoldilocksSampleGate { + type Row = GoldilocksSampleRow; + type Hint = (); + + fn table(&self) -> TableType { + TableType::from_block_r1cs(&build_goldilocks_sample_r1cs(self.nu)) + .with_io_schema(vec![ + IoWord::input(0), + IoWord::input(1), + IoWord::input(2), + IoWord::input(3), + IoWord::output(4), + IoWord::output(5), + IoWord::output(6), + IoWord::output(7), + IoWord::output(8), + IoWord::output(9), + IoWord::output(10), + IoWord::output(11), + IoWord::output(12), + ]) + } + + fn eval( + &self, + inputs: &[F128], + _hint: &(), + outputs: &mut Vec, + ) -> Self::Row { + let words = [inputs[0], inputs[1], inputs[2], inputs[3]]; + let candidates = digest_candidates(words); + let (sample, failure, used_refill) = select_two_candidates(&candidates, 4); + let (skip_sample, skip_failure, skip_used_refill) = + select_two_candidates(&candidates[1..], 3); + let state = + if used_refill { [words[3], words[2]] } else { [words[1], words[0]] }; + let skip_state = if skip_used_refill { + [words[3], words[2]] + } else { + [words[1], words[0]] + }; + outputs.extend_from_slice(&[ + sample, + F128::new(u64::from(failure), 0), + F128::new(candidates[0], 0), + skip_sample, + F128::new(u64::from(skip_failure), 0), + state[0], + state[1], + skip_state[0], + skip_state[1], + ]); + GoldilocksSampleRow(words) + } + + fn witness(&self, _rows: &[Self::Row], _nu: usize) -> SlotWitness { + SlotWitness::DeferredToRows + } +} + +pub(crate) fn build_goldilocks_sample_r1cs( + nu: usize, +) -> flock_prover::r1cs::BlockR1cs { + goldilocks_sample_plan().block_r1cs(nu) +} + +pub(crate) fn generate_goldilocks_sample_witness( + rows: &[GoldilocksSampleRow], + nu: usize, +) -> (Vec, Vec, Vec, Vec) { + generate_boolean_witness(goldilocks_sample_plan(), rows, nu, |row, bits| { + write_f128(bits, FIELD_SAMPLE_HIGH_BASE, row.0[0]); + write_f128(bits, FIELD_SAMPLE_LOW_BASE, row.0[1]); + write_f128(bits, FIELD_SAMPLE_REFILL_HIGH_BASE, row.0[2]); + write_f128(bits, FIELD_SAMPLE_REFILL_LOW_BASE, row.0[3]); + }) +} + +fn goldilocks_sample_plan() -> &'static BooleanR1csPlan { + static PLAN: std::sync::OnceLock = + std::sync::OnceLock::new(); + PLAN.get_or_init(|| { + let mut builder = + BooleanR1csBuilder::new(FIELD_SAMPLE_K_LOG, FIELD_SAMPLE_COLUMNS); + let one = builder.alloc_constant_one(); + for column in FIELD_SAMPLE_HIGH_BASE..FIELD_SAMPLE_REFILL_LOW_BASE + 128 { + builder.free_boolean_at(column); + } + let candidate_bits = digest_candidate_columns(); + let rejection: Vec<_> = candidate_bits + .iter() + .map(|candidate| rejection_bit(&mut builder, candidate, one)) + .collect(); + let acceptance: Vec<_> = rejection + .iter() + .map(|&reject| builder.xor(&[reject, one], one)) + .collect(); + + let (first, second, failure) = + selection_masks(&mut builder, &acceptance, &rejection, one); + write_selected_word( + &mut builder, + FIELD_SAMPLE_OUTPUT_BASE, + &candidate_bits, + &first, + &second, + one, + ); + write_flag_word( + &mut builder, + FIELD_SAMPLE_FAILURE_BASE, + failure, + candidate_bits[0][0], + one, + ); + write_candidate_low_word( + &mut builder, + FIELD_SAMPLE_RAW_FIRST_BASE, + &candidate_bits[0], + one, + ); + let used_refill = + selection_uses_refill(&mut builder, &first, &second, 4, one); + write_selected_state( + &mut builder, + FIELD_SAMPLE_STATE_LOW_BASE, + FIELD_SAMPLE_STATE_HIGH_BASE, + used_refill, + one, + ); + + let (skip_first, skip_second, skip_failure) = + selection_masks(&mut builder, &acceptance[1..], &rejection[1..], one); + write_selected_word( + &mut builder, + FIELD_SAMPLE_SKIP_OUTPUT_BASE, + &candidate_bits[1..], + &skip_first, + &skip_second, + one, + ); + write_flag_word( + &mut builder, + FIELD_SAMPLE_SKIP_FAILURE_BASE, + skip_failure, + candidate_bits[0][0], + one, + ); + let skip_used_refill = + selection_uses_refill(&mut builder, &skip_first, &skip_second, 3, one); + write_selected_state( + &mut builder, + FIELD_SAMPLE_SKIP_STATE_LOW_BASE, + FIELD_SAMPLE_SKIP_STATE_HIGH_BASE, + skip_used_refill, + one, + ); + builder.finish() + }) +} + +fn digest_candidate_columns() -> [[usize; 64]; 8] { + [ + std::array::from_fn(|bit| { + FIELD_SAMPLE_HIGH_BASE + 64 + reverse_bytes_bit(bit) + }), + std::array::from_fn(|bit| FIELD_SAMPLE_HIGH_BASE + reverse_bytes_bit(bit)), + std::array::from_fn(|bit| { + FIELD_SAMPLE_LOW_BASE + 64 + reverse_bytes_bit(bit) + }), + std::array::from_fn(|bit| FIELD_SAMPLE_LOW_BASE + reverse_bytes_bit(bit)), + std::array::from_fn(|bit| { + FIELD_SAMPLE_REFILL_HIGH_BASE + 64 + reverse_bytes_bit(bit) + }), + std::array::from_fn(|bit| { + FIELD_SAMPLE_REFILL_HIGH_BASE + reverse_bytes_bit(bit) + }), + std::array::from_fn(|bit| { + FIELD_SAMPLE_REFILL_LOW_BASE + 64 + reverse_bytes_bit(bit) + }), + std::array::from_fn(|bit| { + FIELD_SAMPLE_REFILL_LOW_BASE + reverse_bytes_bit(bit) + }), + ] +} + +fn rejection_bit( + builder: &mut BooleanR1csBuilder, + candidate: &[usize; 64], + one: usize, +) -> usize { + let high_all = candidate[33..] + .iter() + .fold(candidate[32], |all, &bit| builder.and(all, bit)); + let low_any = candidate[1..32].iter().fold(candidate[0], |any, &bit| { + let both = builder.and(any, bit); + builder.xor(&[any, bit, both], one) + }); + builder.and(high_all, low_any) +} + +fn selection_masks( + builder: &mut BooleanR1csBuilder, + acceptance: &[usize], + rejection: &[usize], + one: usize, +) -> (Vec, Vec, usize) { + let zero = builder.xor(&[one, one], one); + let mut none = one; + let mut exactly_one = zero; + let mut first = Vec::with_capacity(acceptance.len()); + let mut second = Vec::with_capacity(acceptance.len()); + for (&accept, &reject) in acceptance.iter().zip(rejection) { + let first_here = builder.and(none, accept); + let second_here = builder.and(exactly_one, accept); + first.push(first_here); + second.push(second_here); + let one_stays = builder.and(exactly_one, reject); + exactly_one = builder.xor(&[one_stays, first_here], one); + none = builder.and(none, reject); + } + let failure = builder.xor(&[none, exactly_one], one); + (first, second, failure) +} + +fn selection_uses_refill( + builder: &mut BooleanR1csBuilder, + first: &[usize], + second: &[usize], + refill_start: usize, + one: usize, +) -> usize { + first[refill_start..].iter().chain(&second[refill_start..]).copied().fold( + builder.xor(&[one, one], one), + |used, mask| { + let both = builder.and(used, mask); + builder.xor(&[used, mask, both], one) + }, + ) +} + +fn write_selected_state( + builder: &mut BooleanR1csBuilder, + output_low_base: usize, + output_high_base: usize, + use_refill: usize, + one: usize, +) { + for (output_base, primary_base, refill_base) in [ + (output_low_base, FIELD_SAMPLE_LOW_BASE, FIELD_SAMPLE_REFILL_LOW_BASE), + (output_high_base, FIELD_SAMPLE_HIGH_BASE, FIELD_SAMPLE_REFILL_HIGH_BASE), + ] { + for bit in 0..128 { + let primary = primary_base + bit; + let refill = refill_base + bit; + let remove_primary = builder.and(use_refill, primary); + let add_refill = builder.and(use_refill, refill); + builder.write_xor( + output_base + bit, + &[primary, remove_primary, add_refill], + one, + ); + } + } +} + +#[allow(clippy::too_many_arguments)] +fn write_selected_word( + builder: &mut BooleanR1csBuilder, + output_base: usize, + candidates: &[[usize; 64]], + first: &[usize], + second: &[usize], + one: usize, +) { + for bit in 0..64 { + let first_terms: Vec<_> = candidates + .iter() + .zip(first) + .map(|(candidate, &mask)| builder.and(candidate[bit], mask)) + .collect(); + let second_terms: Vec<_> = candidates + .iter() + .zip(second) + .map(|(candidate, &mask)| builder.and(candidate[bit], mask)) + .collect(); + builder.write_xor(output_base + bit, &first_terms, one); + builder.write_xor(output_base + 64 + bit, &second_terms, one); + } +} + +fn write_flag_word( + builder: &mut BooleanR1csBuilder, + output_base: usize, + flag: usize, + zero_source: usize, + one: usize, +) { + builder.write_product_of_parities(output_base, &[flag], &[flag]); + for bit in 1..128 { + builder.write_xor(output_base + bit, &[zero_source, zero_source], one); + } +} + +fn write_candidate_low_word( + builder: &mut BooleanR1csBuilder, + output_base: usize, + candidate: &[usize; 64], + one: usize, +) { + for (bit, &candidate_bit) in candidate.iter().enumerate() { + builder.write_product_of_parities( + output_base + bit, + &[candidate_bit], + &[candidate_bit], + ); + } + for bit in 64..128 { + builder.write_xor(output_base + bit, &[candidate[0], candidate[0]], one); + } +} + +fn digest_candidates(words: [F128; 4]) -> [u64; 8] { + [ + words[0].hi.swap_bytes(), + words[0].lo.swap_bytes(), + words[1].hi.swap_bytes(), + words[1].lo.swap_bytes(), + words[2].hi.swap_bytes(), + words[2].lo.swap_bytes(), + words[3].hi.swap_bytes(), + words[3].lo.swap_bytes(), + ] +} + +fn select_two_candidates( + candidates: &[u64], + refill_start: usize, +) -> (F128, bool, bool) { + let accepted: Vec<_> = candidates + .iter() + .copied() + .enumerate() + .filter(|&(_, candidate)| candidate < GOLDILOCKS_MODULUS) + .take(2) + .collect(); + if accepted.len() == 2 { + ( + F128::new(accepted[0].1, accepted[1].1), + false, + accepted[1].0 >= refill_start, + ) + } else { + (F128::ZERO, true, true) + } +} + +const U64_SPLIT_K_LOG: usize = 9; +const U64_SPLIT_INPUT_BASE: usize = 0; +const U64_SPLIT_BIT_BASE: usize = 128; +const U64_SPLIT_QUOTIENT_BASE: usize = 256; +const U64_SPLIT_COLUMNS: usize = 384; + +/// Split a low-lane `u64` into its least-significant bit and the remaining +/// quotient. Repeating this gate exposes exactly the low bits consumed by +/// `SerializingChallenger64::sample_bits`, without making those bits separate +/// public inputs. +#[derive(Clone, Copy, Debug)] +pub(crate) struct U64SplitGate { + pub(crate) nu: usize, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub(crate) struct U64SplitRow(F128); + +impl GateType for U64SplitGate { + type Row = U64SplitRow; + type Hint = (); + + fn table(&self) -> TableType { + TableType::from_block_r1cs(&build_u64_split_r1cs(self.nu)).with_io_schema( + vec![IoWord::input(0), IoWord::output(1), IoWord::output(2)], + ) + } + + fn eval( + &self, + inputs: &[F128], + _hint: &(), + outputs: &mut Vec, + ) -> Self::Row { + let input = inputs[0]; + assert_eq!(input.hi, 0, "u64 split input must occupy the low lane"); + outputs.push(F128::new(input.lo & 1, 0)); + outputs.push(F128::new(input.lo >> 1, 0)); + U64SplitRow(input) + } + + fn witness(&self, _rows: &[Self::Row], _nu: usize) -> SlotWitness { + SlotWitness::DeferredToRows + } +} + +pub(crate) fn build_u64_split_r1cs(nu: usize) -> flock_prover::r1cs::BlockR1cs { + u64_split_plan().block_r1cs(nu) +} + +pub(crate) fn generate_u64_split_witness( + rows: &[U64SplitRow], + nu: usize, +) -> (Vec, Vec, Vec, Vec) { + generate_boolean_witness(u64_split_plan(), rows, nu, |row, bits| { + write_f128(bits, U64_SPLIT_INPUT_BASE, row.0); + }) +} + +fn u64_split_plan() -> &'static BooleanR1csPlan { + static PLAN: std::sync::OnceLock = + std::sync::OnceLock::new(); + PLAN.get_or_init(|| { + let mut builder = + BooleanR1csBuilder::new(U64_SPLIT_K_LOG, U64_SPLIT_COLUMNS); + let one = builder.alloc_constant_one(); + for bit in 0..64 { + builder.free_boolean_at(U64_SPLIT_INPUT_BASE + bit); + } + for bit in 64..128 { + builder.assert_zero_at(U64_SPLIT_INPUT_BASE + bit, one); + } + + let write_copy = |builder: &mut BooleanR1csBuilder, output, source| { + builder.write_product_of_parities(output, &[source], &[source]); + }; + let write_zero = |builder: &mut BooleanR1csBuilder, output| { + builder.write_xor( + output, + &[U64_SPLIT_INPUT_BASE, U64_SPLIT_INPUT_BASE], + one, + ); + }; + + write_copy(&mut builder, U64_SPLIT_BIT_BASE, U64_SPLIT_INPUT_BASE); + for bit in 1..128 { + write_zero(&mut builder, U64_SPLIT_BIT_BASE + bit); + } + for bit in 0..63 { + write_copy( + &mut builder, + U64_SPLIT_QUOTIENT_BASE + bit, + U64_SPLIT_INPUT_BASE + bit + 1, + ); + } + for bit in 63..128 { + write_zero(&mut builder, U64_SPLIT_QUOTIENT_BASE + bit); + } + builder.finish() + }) +} + +#[derive(Clone, Copy)] +pub(crate) struct TranscriptCircuitSlots { + pub(crate) blake3: SlotId, + pub(crate) sample: SlotId, + pub(crate) canonical: SlotId, +} + +#[derive(Clone, Copy)] +pub(crate) struct TranscriptChallengeWires { + pub(crate) lookup: Wire, + pub(crate) fingerprint: Wire, + pub(crate) constraint: Wire, + pub(crate) zeta: Wire, + pub(crate) pcs_alpha: Wire, +} + +impl TranscriptChallengeWires { + pub(crate) fn all(self) -> [Wire; CHALLENGE_COUNT] { + [self.lookup, self.fingerprint, self.constraint, self.zeta, self.pcs_alpha] + } +} + +pub(crate) struct TranscriptConstraintRegion { + pub(crate) inputs: Vec, + pub(crate) challenges: TranscriptChallengeWires, + /// Packed public words for each of the four observation segments. These are + /// the same wires passed to the BLAKE3 transcript gates. + pub(crate) observation_words: Vec>, + /// HashChallenger input state after sampling the PCS challenge. The low + /// half of this digest remains in the output buffer until the next + /// observation; every valid FRI proof immediately observes a non-empty cap. + pub(crate) state_digest: [Wire; 2], +} + +struct TranscriptRelation { + shape: CircuitShape, + slots: TranscriptCircuitSlots, + nu: usize, + inputs: Vec, +} + +impl TranscriptRelation { + fn build(replay: &Stage2TranscriptReplayV1) -> Result { + let nu = transcript_nu(replay)?; + let mut builder = ShapeBuilder::new(nu); + let slots = TranscriptCircuitSlots { + blake3: builder.slot(Blake3Gate { nu }), + sample: builder.slot(GoldilocksSampleGate { nu }), + canonical: builder.slot(CanonicalGoldilocksPairGate { nu }), + }; + let region = constrain_stage2_transcript(&mut builder, slots, replay, nu)?; + for challenge in region.challenges.all() { + builder.publish(challenge); + } + let shape = builder.finish().map_err(|error| { + anyhow::anyhow!("build Flock Stage 2 transcript circuit: {error:?}") + })?; + Ok(Self { shape, slots, nu, inputs: region.inputs }) + } + + fn public(&self, challenges: Stage2TranscriptChallengesV1) -> Vec { + let mut public = self.inputs.clone(); + public.extend(challenge_words(challenges)); + public + } +} + +pub(crate) fn transcript_nu( + replay: &Stage2TranscriptReplayV1, +) -> Result { + let traces = transcript_traces(replay)?; + let blake3_rows = traces.iter().map(|trace| trace.rows.len()).sum::() + + CHALLENGE_COUNT * hash_trace(32).rows.len(); + let needed_rows = blake3_rows.max(CHALLENGE_COUNT).max(1); + let nu = MIN_NU.max(needed_rows.next_power_of_two().ilog2() as usize); + if nu > MAX_NU { + bail!( + "Stage 2 transcript needs {blake3_rows} BLAKE3 rows (nu={nu}); maximum is nu={MAX_NU}" + ); + } + Ok(nu) +} + +pub(crate) fn constrain_stage2_transcript( + builder: &mut ShapeBuilder, + slots: TranscriptCircuitSlots, + replay: &Stage2TranscriptReplayV1, + nu: usize, +) -> Result { + let traces = transcript_traces(replay)?; + let row_count = traces.iter().map(|trace| trace.rows.len()).sum::() + + CHALLENGE_COUNT * hash_trace(32).rows.len(); + if row_count > 1usize << nu { + bail!("Stage 2 transcript exceeds the supplied Flock row capacity"); + } + let segment_wires: Vec> = replay_segments(replay) + .iter() + .map(|segment| { + (0..segment.len().div_ceil(WORD_BYTES)) + .map(|_| builder.public_input()) + .collect() + }) + .collect(); + + let mut inputs: Vec = + replay_segments(replay).into_iter().flat_map(pack_segment).collect(); + let packed_iv = pack8(&IV); + let iv = [ + fixed(builder, &mut inputs, packed_iv[0]), + fixed(builder, &mut inputs, packed_iv[1]), + ]; + // Data padding is only consumed; assertion zero only receives residual + // outputs. Keeping the wiring classes separate preserves a directed DAG. + let data_zero = fixed(builder, &mut inputs, F128::ZERO); + let assertion_zero = fixed(builder, &mut inputs, F128::ZERO); + let parameter_wires: Vec> = traces + .iter() + .map(|trace| { + trace + .rows + .iter() + .map(|&(_cv, _message, counter, block_len, flags)| { + fixed(builder, &mut inputs, pack_params(counter, block_len, flags)) + }) + .collect() + }) + .collect(); + + let digest_1 = constrain_hash( + builder, + slots.blake3, + &traces[0], + ¶meter_wires[0], + iv, + data_zero, + &segment_wires[0], + )?; + let sampled = constrain_field_sample( + builder, + slots.blake3, + slots.sample, + slots.canonical, + assertion_zero, + iv, + data_zero, + &mut inputs, + digest_1, + false, + )?; + let lookup = sampled.value; + let state_1 = sampled.state; + + let digest_2 = constrain_hash( + builder, + slots.blake3, + &traces[1], + ¶meter_wires[1], + iv, + data_zero, + &[state_1[0], state_1[1], lookup], + )?; + let sampled = constrain_field_sample( + builder, + slots.blake3, + slots.sample, + slots.canonical, + assertion_zero, + iv, + data_zero, + &mut inputs, + digest_2, + false, + )?; + let fingerprint = sampled.value; + let state_2 = sampled.state; + + let mut message_3 = vec![state_2[0], state_2[1], fingerprint]; + message_3.extend_from_slice(&segment_wires[1]); + let digest_3 = constrain_hash( + builder, + slots.blake3, + &traces[2], + ¶meter_wires[2], + iv, + data_zero, + &message_3, + )?; + let sampled = constrain_field_sample( + builder, + slots.blake3, + slots.sample, + slots.canonical, + assertion_zero, + iv, + data_zero, + &mut inputs, + digest_3, + false, + )?; + let constraint = sampled.value; + let state_3 = sampled.state; + + let mut message_4 = vec![state_3[0], state_3[1]]; + message_4.extend_from_slice(&segment_wires[2]); + let digest_4 = constrain_hash( + builder, + slots.blake3, + &traces[3], + ¶meter_wires[3], + iv, + data_zero, + &message_4, + )?; + let sampled = constrain_field_sample( + builder, + slots.blake3, + slots.sample, + slots.canonical, + assertion_zero, + iv, + data_zero, + &mut inputs, + digest_4, + false, + )?; + let zeta = sampled.value; + let state_4 = sampled.state; + + let mut message_5 = vec![state_4[0], state_4[1]]; + message_5.extend_from_slice(&segment_wires[3]); + let digest_5 = constrain_hash( + builder, + slots.blake3, + &traces[4], + ¶meter_wires[4], + iv, + data_zero, + &message_5, + )?; + let sampled = constrain_field_sample( + builder, + slots.blake3, + slots.sample, + slots.canonical, + assertion_zero, + iv, + data_zero, + &mut inputs, + digest_5, + false, + )?; + let pcs_alpha = sampled.value; + Ok(TranscriptConstraintRegion { + inputs, + challenges: TranscriptChallengeWires { + lookup, + fingerprint, + constraint, + zeta, + pcs_alpha, + }, + observation_words: segment_wires, + state_digest: sampled.state, + }) +} + +#[derive(Clone, Copy)] +pub(crate) struct FriTranscriptCircuitSlots { + pub(crate) blake3: SlotId, + pub(crate) sample: SlotId, + pub(crate) field_sample: SlotId, + pub(crate) canonical: SlotId, + pub(crate) repack: SlotId, + pub(crate) split: SlotId, +} + +pub(crate) struct FriTranscriptConstraintRegion { + pub(crate) inputs: Vec, + pub(crate) betas: Vec, + pub(crate) query_index_bits: Vec>, + pub(crate) commitment_roots: Vec>, + pub(crate) final_polynomial: Vec, +} + +/// Continue an already constrained Stage 2 transcript through every FRI +/// challenge and query draw. The returned beta/index wires are intended to be +/// consumed directly by the PCS/FRI verifier relation. +pub(crate) fn constrain_stage2_fri_transcript( + builder: &mut ShapeBuilder, + slots: FriTranscriptCircuitSlots, + replay: &Stage2FriTranscriptReplayV1, + initial_digest: [Wire; 2], + nu: usize, +) -> Result { + validate_fri_replay(replay)?; + let capacity = 1usize << nu; + if fri_transcript_blake3_rows(replay)? > capacity + || fri_transcript_split_rows(replay)? > capacity + { + bail!("Stage 2 FRI transcript exceeds the supplied Flock row capacity"); + } + let mut inputs = Vec::new(); + let packed_iv = pack8(&IV); + let iv = [ + fixed(builder, &mut inputs, packed_iv[0]), + fixed(builder, &mut inputs, packed_iv[1]), + ]; + let data_zero = fixed(builder, &mut inputs, F128::ZERO); + let assertion_zero = fixed(builder, &mut inputs, F128::ZERO); + + let mut state = initial_digest; + let mut betas = Vec::with_capacity(replay.commit_phase_commitments.len()); + let mut commitment_roots = + Vec::with_capacity(replay.commit_phase_commitments.len()); + for (round, cap) in replay.commit_phase_commitments.iter().enumerate() { + let cap_bytes = cap_observation_bytes(cap); + let cap_words = declare_public_segment(builder, &mut inputs, &cap_bytes); + commitment_roots.push(cap_words.as_chunks::<2>().0.to_vec()); + let mut message = Vec::with_capacity( + 2 + cap_words.len() + usize::from(replay.commit_pow_bits != 0), + ); + message.extend_from_slice(&state); + message.extend_from_slice(&cap_words); + if replay.commit_pow_bits != 0 { + message.push(declare_public_word( + builder, + &mut inputs, + F128::new(replay.commit_pow_witnesses[round], 0), + )); + } + let message_len = + 32 + cap_bytes.len() + usize::from(replay.commit_pow_bits != 0) * 8; + let trace = hash_trace(message_len); + let parameters = declare_trace_parameters(builder, &mut inputs, &trace); + let digest = constrain_hash( + builder, + slots.blake3, + &trace, + ¶meters, + iv, + data_zero, + &message, + )?; + + let sampled = constrain_field_sample( + builder, + slots.blake3, + slots.field_sample, + slots.canonical, + assertion_zero, + iv, + data_zero, + &mut inputs, + digest, + replay.commit_pow_bits != 0, + )?; + if replay.commit_pow_bits != 0 { + constrain_low_zero_bits( + builder, + slots.split, + assertion_zero, + sampled.raw_first, + replay.commit_pow_bits, + ); + } + betas.push(sampled.value); + state = sampled.state; + } + + let mut final_suffix = final_observation_bytes(replay); + if replay.query_pow_bits != 0 { + push_u64_observation(&mut final_suffix, replay.query_pow_witness); + } + let final_words = declare_public_segment(builder, &mut inputs, &final_suffix); + let final_polynomial = final_words[..replay.final_polynomial.len()].to_vec(); + let mut final_message = Vec::with_capacity(2 + final_words.len()); + final_message.extend_from_slice(&state); + final_message.extend_from_slice(&final_words); + let final_trace = hash_trace(32 + final_suffix.len()); + let final_parameters = + declare_trace_parameters(builder, &mut inputs, &final_trace); + state = constrain_hash( + builder, + slots.blake3, + &final_trace, + &final_parameters, + iv, + data_zero, + &final_message, + )?; + + let draw_count = replay + .num_queries + .checked_add(usize::from(replay.query_pow_bits != 0)) + .ok_or_else(|| anyhow::anyhow!("FRI transcript draw count overflow"))?; + let digest_count = draw_count.div_ceil(4); + let mut draws = Vec::with_capacity(4 * digest_count); + for digest_index in 0..digest_count { + if digest_index != 0 { + let trace = hash_trace(32); + let parameters = declare_trace_parameters(builder, &mut inputs, &trace); + state = constrain_hash( + builder, + slots.blake3, + &trace, + ¶meters, + iv, + data_zero, + &state, + )?; + } + let high_samples = builder.gate(slots.sample, &[state[1]])[0]; + let low_samples = builder.gate(slots.sample, &[state[0]])[0]; + draws.extend(split_sample_lanes( + builder, + slots.repack, + data_zero, + high_samples, + )); + draws.extend(split_sample_lanes( + builder, + slots.repack, + data_zero, + low_samples, + )); + } + draws.truncate(draw_count); + let query_draws = if replay.query_pow_bits == 0 { + &draws[..] + } else { + constrain_low_zero_bits( + builder, + slots.split, + assertion_zero, + draws[0], + replay.query_pow_bits, + ); + &draws[1..] + }; + let query_index_bits = query_draws + .iter() + .map(|&draw| { + split_low_bits(builder, slots.split, draw, replay.query_index_bits) + }) + .collect(); + + Ok(FriTranscriptConstraintRegion { + inputs, + betas, + query_index_bits, + commitment_roots, + final_polynomial, + }) +} + +fn declare_public_segment( + builder: &mut ShapeBuilder, + inputs: &mut Vec, + bytes: &[u8], +) -> Vec { + pack_segment(bytes) + .into_iter() + .map(|word| declare_public_word(builder, inputs, word)) + .collect() +} + +fn declare_public_word( + builder: &mut ShapeBuilder, + inputs: &mut Vec, + value: F128, +) -> Wire { + inputs.push(value); + builder.public_input() +} + +fn declare_trace_parameters( + builder: &mut ShapeBuilder, + inputs: &mut Vec, + trace: &FsChainTrace, +) -> Vec { + trace + .rows + .iter() + .map(|&(_cv, _message, counter, block_len, flags)| { + fixed(builder, inputs, pack_params(counter, block_len, flags)) + }) + .collect() +} + +fn split_sample_lanes( + builder: &mut ShapeBuilder, + repack_slot: SlotId, + zero: Wire, + samples: Wire, +) -> [Wire; 2] { + let repacked = builder.gate(repack_slot, &[samples, zero]); + let low = repacked[3]; + let high_duplicate = repacked[1]; + let high = builder.gate(repack_slot, &[high_duplicate, zero])[3]; + [low, high] +} + +fn split_low_bits( + builder: &mut ShapeBuilder, + split_slot: SlotId, + mut value: Wire, + bits: u8, +) -> Vec { + (0..bits) + .map(|_| { + let outputs = builder.gate(split_slot, &[value]); + value = outputs[1]; + outputs[0] + }) + .collect() +} + +fn constrain_low_zero_bits( + builder: &mut ShapeBuilder, + split_slot: SlotId, + zero: Wire, + value: Wire, + bits: u8, +) { + for bit in split_low_bits(builder, split_slot, value, bits) { + builder.connect(bit, zero); + } +} + +fn fixed( + builder: &mut ShapeBuilder, + fixed_inputs: &mut Vec, + value: F128, +) -> Wire { + fixed_inputs.push(value); + builder.fixed_public_input(value) +} + +struct ConstrainedFieldSample { + value: Wire, + raw_first: Wire, + state: [Wire; 2], +} + +#[allow(clippy::too_many_arguments)] +fn constrain_field_sample( + builder: &mut ShapeBuilder, + blake3: SlotId, + sample: SlotId, + canonical: SlotId, + zero: Wire, + iv: [Wire; 2], + data_zero: Wire, + inputs: &mut Vec, + digest: [Wire; 2], + skip_first: bool, +) -> Result { + let trace = hash_trace(32); + let parameters = declare_trace_parameters(builder, inputs, &trace); + let refill = constrain_hash( + builder, + blake3, + &trace, + ¶meters, + iv, + data_zero, + &digest, + )?; + let sampled = + builder.gate(sample, &[digest[1], digest[0], refill[1], refill[0]]); + let (challenge, failure, state) = if skip_first { + (sampled[3], sampled[4], [sampled[7], sampled[8]]) + } else { + (sampled[0], sampled[1], [sampled[5], sampled[6]]) + }; + builder.connect(failure, zero); + let violation = builder.gate(canonical, &[challenge])[0]; + builder.connect(violation, zero); + Ok(ConstrainedFieldSample { value: challenge, raw_first: sampled[2], state }) +} + +pub(crate) fn constrain_hash( + builder: &mut ShapeBuilder, + slot: SlotId, + trace: &FsChainTrace, + parameters: &[Wire], + iv: [Wire; 2], + zero: Wire, + message: &[Wire], +) -> Result<[Wire; 2]> { + if parameters.len() != trace.rows.len() { + bail!("BLAKE3 trace parameter count mismatch"); + } + let mut row_outputs = Vec::<[Wire; 4]>::with_capacity(trace.rows.len()); + for (row_index, ¶meter) in parameters.iter().enumerate() { + let link = trace.links[row_index]; + let (cv, block) = if let Some(right_row) = link.right { + let CvSource::Row(left_row) = link.cv else { + bail!("BLAKE3 parent row does not name its left child"); + }; + let left = row_outputs + .get(left_row) + .ok_or_else(|| anyhow::anyhow!("BLAKE3 left-child link is forward"))?; + let right = row_outputs + .get(right_row) + .ok_or_else(|| anyhow::anyhow!("BLAKE3 right-child link is forward"))?; + (iv, [left[0], left[1], right[0], right[1]]) + } else { + if link.repeats.is_some() { + bail!("unexpected BLAKE3 XOF row in a 32-byte transcript hash"); + } + let cv = match link.cv { + CvSource::Iv => iv, + CvSource::Row(source) => { + let output = row_outputs.get(source).ok_or_else(|| { + anyhow::anyhow!("BLAKE3 chaining-value link is forward") + })?; + [output[0], output[1]] + }, + CvSource::RowHi(source) => { + let output = row_outputs.get(source).ok_or_else(|| { + anyhow::anyhow!("BLAKE3 high-half link is forward") + })?; + [output[2], output[3]] + }, + }; + let offset = trace.block_offsets[row_index].ok_or_else(|| { + anyhow::anyhow!("BLAKE3 data row is missing its message offset") + })?; + if offset % WORD_BYTES != 0 { + bail!("BLAKE3 message block is not word aligned"); + } + let first_word = offset / WORD_BYTES; + let block = std::array::from_fn(|word| { + message.get(first_word + word).copied().unwrap_or(zero) + }); + (cv, block) + }; + let outputs = builder.gate( + slot, + &[cv[0], cv[1], block[0], block[1], block[2], block[3], parameter], + ); + row_outputs.push(outputs.try_into().expect("BLAKE3 gate has four outputs")); + } + let root_row = *trace + .squeezes + .first() + .and_then(|rows| rows.first()) + .ok_or_else(|| anyhow::anyhow!("BLAKE3 trace has no root squeeze"))?; + let root = row_outputs + .get(root_row) + .ok_or_else(|| anyhow::anyhow!("BLAKE3 root row is out of range"))?; + Ok([root[0], root[1]]) +} + +/// Prove exact Stage 2 transcript replay through the PCS opening-batch sample. +pub fn prove_stage2_transcript_conformance( + replay: &Stage2TranscriptReplayV1, +) -> Result { + let challenges = compute_challenges(replay)?; + let relation = TranscriptRelation::build(replay)?; + let inputs = relation.inputs.clone(); + let expected_public = relation.public(challenges); + let witness = relation.shape.run(&inputs, &[]); + if witness.public != expected_public { + bail!("Flock transcript circuit disagrees with native HashChallenger"); + } + + let proof_bundle_bytes = prove_relation(&relation, &witness)?; + Ok(Stage2TranscriptConformanceArtifactV1 { + replay: replay.clone(), + challenges, + circuit_digest: relation.shape.circuit.digest(), + proof_bundle_bytes, + }) +} + +/// Verify and bind a transcript conformance proof to every observation and +/// sampled challenge carried by its strict artifact. +pub fn verify_stage2_transcript_conformance( + artifact: &Stage2TranscriptConformanceArtifactV1, +) -> Result<()> { + let challenges = compute_challenges(&artifact.replay)?; + if challenges != artifact.challenges { + bail!("Flock Stage 2 transcript artifact challenge mismatch"); + } + let relation = TranscriptRelation::build(&artifact.replay)?; + if relation.shape.circuit.digest() != artifact.circuit_digest { + bail!("Flock Stage 2 transcript circuit digest mismatch"); + } + let public = relation.public(artifact.challenges); + verify_relation(&relation, &public, &artifact.proof_bundle_bytes) +} + +fn prove_relation( + relation: &TranscriptRelation, + witness: &flock_prover::circuit::builder::CircuitWitness, +) -> Result> { + let blake3_rows = witness.rows::(relation.slots.blake3); + let sample_rows = witness.rows::(relation.slots.sample); + let canonical_rows = + witness.rows::(relation.slots.canonical); + + let blake3_r1cs = flock_blake3::build_block_r1cs(relation.nu); + let blake3_lincheck = blake3_r1cs.csc_lincheck_circuit(); + let sample_r1cs = build_goldilocks_sample_r1cs(relation.nu); + let sample_lincheck = sample_r1cs.csc_lincheck_circuit(); + let canonical_r1cs = build_canonical_pair_r1cs(relation.nu); + let canonical_lincheck = canonical_r1cs.csc_lincheck_circuit(); + + let mut slots = vec![ + ( + relation.shape.registry_slot(relation.slots.blake3), + UnionSlotProverInput::new( + flock_blake3::generate_witness_batch_major_partial( + blake3_rows, + relation.nu, + ), + blake3_lincheck, + ), + ), + ( + relation.shape.registry_slot(relation.slots.sample), + UnionSlotProverInput::new( + generate_goldilocks_sample_witness(sample_rows, relation.nu), + sample_lincheck, + ), + ), + ( + relation.shape.registry_slot(relation.slots.canonical), + UnionSlotProverInput::new( + generate_canonical_pair_witness(canonical_rows, relation.nu), + canonical_lincheck, + ), + ), + ]; + sort_slots(&mut slots)?; + let slots = slots.into_iter().map(|(_, input)| input).collect(); + let union = + UnionInstance::new(&relation.shape.registry, relation.shape.counts.clone()); + let params = pcs_params(&union); + let mut challenger = FsChallenger::with_chained_blake3( + STAGE2_TRANSCRIPT_CONFORMANCE_TRANSCRIPT_DOMAIN, + ); + let (proof, commitment, _) = prover::prove_fast_ligerito_union_circuit( + &union, + &relation.shape.circuit, + &witness.public, + ¶ms, + slots, + Vec::new(), + &mut challenger, + ); + let bytes = encode_bundle(&TranscriptProofBundle { commitment, proof })?; + if bytes.len() > MAX_BUNDLE_BYTES { + bail!("Flock Stage 2 transcript proof exceeds {MAX_BUNDLE_BYTES} bytes"); + } + Ok(bytes) +} + +fn verify_relation( + relation: &TranscriptRelation, + public: &[F128], + proof_bundle_bytes: &[u8], +) -> Result<()> { + let bundle = decode_bundle(proof_bundle_bytes) + .context("decode Flock Stage 2 transcript proof bundle")?; + let blake3_r1cs = flock_blake3::build_block_r1cs(relation.nu); + let blake3_lincheck = blake3_r1cs.csc_lincheck_circuit(); + let sample_r1cs = build_goldilocks_sample_r1cs(relation.nu); + let sample_lincheck = sample_r1cs.csc_lincheck_circuit(); + let canonical_r1cs = build_canonical_pair_r1cs(relation.nu); + let canonical_lincheck = canonical_r1cs.csc_lincheck_circuit(); + let mut linchecks: Vec<(usize, &dyn LincheckCircuit)> = vec![ + (relation.shape.registry_slot(relation.slots.blake3), blake3_lincheck), + (relation.shape.registry_slot(relation.slots.sample), sample_lincheck), + ( + relation.shape.registry_slot(relation.slots.canonical), + canonical_lincheck, + ), + ]; + sort_slots(&mut linchecks)?; + let linchecks: Vec<&dyn LincheckCircuit> = + linchecks.into_iter().map(|(_, lincheck)| lincheck).collect(); + let union = + UnionInstance::new(&relation.shape.registry, relation.shape.counts.clone()); + let params = pcs_params(&union); + let mut challenger = FsChallenger::with_chained_blake3( + STAGE2_TRANSCRIPT_CONFORMANCE_TRANSCRIPT_DOMAIN, + ); + verifier::verify_ligerito_union_circuit( + &union, + &relation.shape.circuit, + public, + &linchecks, + &bundle.commitment, + &bundle.proof, + ¶ms, + &mut challenger, + ) + .map_err(|error| { + anyhow::anyhow!("Flock Stage 2 transcript proof rejected: {error:?}") + })?; + Ok(()) +} + +fn sort_slots(slots: &mut [(usize, T)]) -> Result<()> { + slots.sort_by_key(|(index, _)| *index); + if slots.iter().enumerate().any(|(expected, (actual, _))| expected != *actual) + { + bail!("Flock Stage 2 transcript registry is not contiguous"); + } + Ok(()) +} + +pub(crate) fn hash_trace(message_len: usize) -> FsChainTrace { + let mut chain = FsChain::new(); + chain.absorb(&vec![0u8; message_len]); + let output = chain.finalize(32); + debug_assert_eq!(output.len(), 32); + chain.finish() +} + +fn transcript_traces( + replay: &Stage2TranscriptReplayV1, +) -> Result> { + validate_replay(replay)?; + let message_lengths = [ + replay.initial_observations.len(), + 32 + 16, + 32 + 16 + replay.stage2_and_accumulator_observations.len(), + 32 + replay.quotient_commitment_observations.len(), + 32 + replay.pcs_opening_observations.len(), + ]; + Ok(message_lengths.iter().copied().map(hash_trace).collect()) +} + +fn compute_challenges( + replay: &Stage2TranscriptReplayV1, +) -> Result { + Ok(compute_challenges_and_state(replay)?.0) +} + +fn compute_challenges_and_state( + replay: &Stage2TranscriptReplayV1, +) -> Result<(Stage2TranscriptChallengesV1, [u8; 32])> { + validate_replay(replay)?; + + let digest_1 = hash_parts(&[&replay.initial_observations]); + let (lookup, state_1) = sample_digest_high(&digest_1)?; + let lookup_bytes = extension_bytes(lookup); + + let digest_2 = hash_parts(&[&state_1, &lookup_bytes]); + let (fingerprint, state_2) = sample_digest_high(&digest_2)?; + let fingerprint_bytes = extension_bytes(fingerprint); + + let digest_3 = hash_parts(&[ + &state_2, + &fingerprint_bytes, + &replay.stage2_and_accumulator_observations, + ]); + let (constraint, state_3) = sample_digest_high(&digest_3)?; + + let digest_4 = + hash_parts(&[&state_3, &replay.quotient_commitment_observations]); + let (zeta, state_4) = sample_digest_high(&digest_4)?; + + let digest_5 = hash_parts(&[&state_4, &replay.pcs_opening_observations]); + let (pcs_alpha, state_5) = sample_digest_high(&digest_5)?; + Ok(( + Stage2TranscriptChallengesV1 { + lookup, + fingerprint, + constraint, + zeta, + pcs_alpha, + }, + state_5, + )) +} + +fn compute_fri_challenges( + prefix: &Stage2TranscriptReplayV1, + replay: &Stage2FriTranscriptReplayV1, +) -> Result { + validate_fri_replay(replay)?; + let (_, state) = compute_challenges_and_state(prefix)?; + let mut challenger = NativeByteChallenger { + input: state.to_vec(), + // Sampling the PCS extension challenge consumed the high sixteen bytes. + output: state[..16].to_vec(), + }; + let mut betas = Vec::with_capacity(replay.commit_phase_commitments.len()); + for (round, cap) in replay.commit_phase_commitments.iter().enumerate() { + challenger.observe(&cap_observation_bytes(cap)); + if !challenger + .check_witness(replay.commit_pow_bits, replay.commit_pow_witnesses[round]) + { + bail!("Stage 2 FRI commit PoW witness {round} is invalid"); + } + betas.push(challenger.sample_extension()?); + } + challenger.observe(&final_observation_bytes(replay)); + if !challenger.check_witness(replay.query_pow_bits, replay.query_pow_witness) + { + bail!("Stage 2 FRI query PoW witness is invalid"); + } + let query_indices = (0..replay.num_queries) + .map(|_| challenger.sample_bits(replay.query_index_bits)) + .collect(); + Ok(Stage2FriTranscriptChallengesV1 { betas, query_indices }) +} + +struct NativeByteChallenger { + input: Vec, + output: Vec, +} + +impl NativeByteChallenger { + fn observe(&mut self, bytes: &[u8]) { + if bytes.is_empty() { + return; + } + self.output.clear(); + self.input.extend_from_slice(bytes); + } + + fn sample_u64(&mut self) -> u64 { + if self.output.is_empty() { + let digest = *blake3::hash(&self.input).as_bytes(); + self.input = digest.to_vec(); + self.output = digest.to_vec(); + } + let bytes: [u8; 8] = + std::array::from_fn(|_| self.output.pop().expect("fresh digest bytes")); + u64::from_le_bytes(bytes) + } + + fn sample_extension(&mut self) -> Result<[u64; 2]> { + let mut accepted = Vec::with_capacity(2); + loop { + let value = self.sample_u64(); + if value < GOLDILOCKS_MODULUS { + accepted.push(value); + if accepted.len() == 2 { + return Ok([accepted[0], accepted[1]]); + } + } + } + } + + fn sample_bits(&mut self, bits: u8) -> u64 { + debug_assert!(bits < 64); + self.sample_u64() & ((1u64 << bits) - 1) + } + + fn check_witness(&mut self, bits: u8, witness: u64) -> bool { + if bits == 0 { + return true; + } + self.observe(&witness.to_le_bytes()); + self.sample_bits(bits) == 0 + } +} + +fn cap_observation_bytes(cap: &[[u8; 32]]) -> Vec { + cap.iter().flatten().copied().collect() +} + +fn final_observation_bytes(replay: &Stage2FriTranscriptReplayV1) -> Vec { + let mut bytes = Vec::with_capacity( + 16 * replay.final_polynomial.len() + 8 * replay.log_arities.len(), + ); + for &coefficient in &replay.final_polynomial { + push_extension_observation(&mut bytes, coefficient); + } + for &log_arity in &replay.log_arities { + push_u64_observation(&mut bytes, u64::from(log_arity)); + } + bytes +} + +pub(crate) fn fri_transcript_blake3_rows( + replay: &Stage2FriTranscriptReplayV1, +) -> Result { + validate_fri_replay(replay)?; + let commit_rows = + replay.commit_phase_commitments.iter().try_fold(0usize, |rows, cap| { + let message_len = + 32 + 32 * cap.len() + 8 * usize::from(replay.commit_pow_bits != 0); + rows + .checked_add(hash_trace(message_len).rows.len()) + .and_then(|rows| rows.checked_add(hash_trace(32).rows.len())) + .ok_or_else(|| anyhow::anyhow!("FRI transcript row count overflow")) + })?; + let final_rows = hash_trace( + 32 + final_observation_bytes(replay).len() + + 8 * usize::from(replay.query_pow_bits != 0), + ) + .rows + .len(); + let draws = replay.num_queries + usize::from(replay.query_pow_bits != 0); + let followup_digests = draws.div_ceil(4).saturating_sub(1); + commit_rows + .checked_add(final_rows) + .and_then(|rows| { + rows.checked_add(followup_digests * hash_trace(32).rows.len()) + }) + .ok_or_else(|| anyhow::anyhow!("FRI transcript row count overflow")) +} + +pub(crate) fn fri_transcript_split_rows( + replay: &Stage2FriTranscriptReplayV1, +) -> Result { + validate_fri_replay(replay)?; + usize::from(replay.commit_pow_bits) + .checked_mul(replay.commit_phase_commitments.len()) + .and_then(|rows| rows.checked_add(usize::from(replay.query_pow_bits))) + .and_then(|rows| { + rows + .checked_add(replay.num_queries * usize::from(replay.query_index_bits)) + }) + .ok_or_else(|| anyhow::anyhow!("FRI transcript split row count overflow")) +} + +fn sample_digest_high(digest: &[u8; 32]) -> Result<([u64; 2], [u8; 32])> { + let refill = hash_parts(&[digest]); + let candidates = digest_candidates([ + pack_bytes(&digest[16..]), + pack_bytes(&digest[..16]), + pack_bytes(&refill[16..]), + pack_bytes(&refill[..16]), + ]); + let (sample, failure, used_refill) = select_two_candidates(&candidates, 4); + if failure { + bail!("Stage 2 transcript needs more than eight Goldilocks candidates"); + } + Ok(([sample.lo, sample.hi], if used_refill { refill } else { *digest })) +} + +fn hash_parts(parts: &[&[u8]]) -> [u8; 32] { + let mut hasher = blake3::Hasher::new(); + for part in parts { + hasher.update(part); + } + *hasher.finalize().as_bytes() +} + +fn extension_bytes(value: [u64; 2]) -> [u8; 16] { + let mut bytes = [0u8; 16]; + bytes[..8].copy_from_slice(&value[0].to_le_bytes()); + bytes[8..].copy_from_slice(&value[1].to_le_bytes()); + bytes +} + +fn push_u64_observation(bytes: &mut Vec, value: u64) { + bytes.extend_from_slice(&value.to_le_bytes()); +} + +fn push_extension_observation(bytes: &mut Vec, value: [u64; 2]) { + bytes.extend_from_slice(&extension_bytes(value)); +} + +fn push_cap_observations(bytes: &mut Vec, roots: &[[u8; 32]]) { + for root in roots { + bytes.extend_from_slice(root); + } +} + +fn push_opened_round_observations( + bytes: &mut Vec, + round: &Stage3OpenedRoundV1, +) { + for matrix in round { + for point in matrix { + for &value in point { + push_extension_observation(bytes, value); + } + } + } +} + +fn replay_segments(replay: &Stage2TranscriptReplayV1) -> [&[u8]; 4] { + [ + &replay.initial_observations, + &replay.stage2_and_accumulator_observations, + &replay.quotient_commitment_observations, + &replay.pcs_opening_observations, + ] +} + +fn pack_segment(segment: &[u8]) -> Vec { + segment + .chunks(WORD_BYTES) + .map(|chunk| { + let mut word = [0u8; WORD_BYTES]; + word[..chunk.len()].copy_from_slice(chunk); + pack_bytes(&word) + }) + .collect() +} + +pub(crate) fn transcript_challenge_words( + challenges: Stage2TranscriptChallengesV1, +) -> [F128; 5] { + [ + pack_extension(challenges.lookup), + pack_extension(challenges.fingerprint), + pack_extension(challenges.constraint), + pack_extension(challenges.zeta), + pack_extension(challenges.pcs_alpha), + ] +} + +fn challenge_words(challenges: Stage2TranscriptChallengesV1) -> [F128; 5] { + transcript_challenge_words(challenges) +} + +fn pack_extension(value: [u64; 2]) -> F128 { + F128::new(value[0], value[1]) +} + +fn validate_replay(replay: &Stage2TranscriptReplayV1) -> Result<()> { + if replay.initial_observations.is_empty() { + bail!("Stage 2 transcript initial observations are empty"); + } + let total = + replay_segments(replay).iter().try_fold(0usize, |total, segment| { + total.checked_add(segment.len()).ok_or_else(|| { + anyhow::anyhow!("Stage 2 transcript observation length overflow") + }) + })?; + if total > MAX_OBSERVATION_BYTES { + bail!( + "Stage 2 transcript carries {total} observation bytes; maximum is {MAX_OBSERVATION_BYTES}" + ); + } + Ok(()) +} + +fn validate_fri_replay(replay: &Stage2FriTranscriptReplayV1) -> Result<()> { + let rounds = replay.commit_phase_commitments.len(); + if rounds == 0 || rounds > MAX_FRI_ROUNDS { + bail!( + "Stage 2 FRI transcript has {rounds} rounds; expected 1..={MAX_FRI_ROUNDS}" + ); + } + if replay.commit_pow_witnesses.len() != rounds + || replay.log_arities.len() != rounds + { + bail!("Stage 2 FRI transcript round-vector lengths disagree"); + } + if replay.num_queries == 0 || replay.num_queries > MAX_FRI_QUERIES { + bail!( + "Stage 2 FRI transcript has {} queries; expected 1..={MAX_FRI_QUERIES}", + replay.num_queries + ); + } + if replay.query_index_bits == 0 || replay.query_index_bits >= 64 { + bail!( + "Stage 2 FRI query-index width {} is outside 1..64", + replay.query_index_bits + ); + } + for (label, bits) in + [("commit", replay.commit_pow_bits), ("query", replay.query_pow_bits)] + { + if bits >= 64 || (1u64 << bits) >= GOLDILOCKS_MODULUS { + bail!("Stage 2 FRI {label} PoW width {bits} is invalid"); + } + } + if (1u64 << replay.query_index_bits) >= GOLDILOCKS_MODULUS { + bail!("Stage 2 FRI query-index mask exceeds the field order"); + } + if replay.final_polynomial.is_empty() + || !replay.final_polynomial.len().is_power_of_two() + { + bail!( + "Stage 2 FRI final polynomial length must be a non-zero power of two" + ); + } + for coefficient in &replay.final_polynomial { + if coefficient.iter().any(|&limb| limb >= GOLDILOCKS_MODULUS) { + bail!("Stage 2 FRI final polynomial contains a non-canonical limb"); + } + } + if replay + .commit_pow_witnesses + .iter() + .chain(std::iter::once(&replay.query_pow_witness)) + .any(|&witness| witness >= GOLDILOCKS_MODULUS) + { + bail!("Stage 2 FRI transcript contains a non-canonical PoW witness"); + } + let mut cap_roots = 0usize; + for cap in &replay.commit_phase_commitments { + if cap.is_empty() || cap.len() > MAX_CAP_ROOTS { + bail!( + "Stage 2 FRI commitment cap has {} roots; expected 1..={MAX_CAP_ROOTS}", + cap.len() + ); + } + cap_roots = cap_roots + .checked_add(cap.len()) + .ok_or_else(|| anyhow::anyhow!("Stage 2 FRI cap-root count overflow"))?; + } + if replay.log_arities.iter().any(|&arity| arity == 0 || arity >= 64) { + bail!("Stage 2 FRI transcript contains an invalid folding log-arity"); + } + let observation_bytes = 32usize + .checked_mul(cap_roots) + .and_then(|bytes| bytes.checked_add(final_observation_bytes(replay).len())) + .and_then(|bytes| { + bytes.checked_add(8 * usize::from(replay.query_pow_bits != 0)) + }) + .ok_or_else(|| { + anyhow::anyhow!("Stage 2 FRI observation length overflow") + })?; + if observation_bytes > MAX_OBSERVATION_BYTES { + bail!( + "Stage 2 FRI transcript carries {observation_bytes} observation bytes; maximum is {MAX_OBSERVATION_BYTES}" + ); + } + Ok(()) +} + +fn validate_challenges(challenges: Stage2TranscriptChallengesV1) -> Result<()> { + for challenge in [ + challenges.lookup, + challenges.fingerprint, + challenges.constraint, + challenges.zeta, + challenges.pcs_alpha, + ] { + if challenge.iter().any(|&value| value >= GOLDILOCKS_MODULUS) { + bail!("non-canonical Goldilocks transcript challenge"); + } + } + Ok(()) +} + +fn encode_challenges( + bytes: &mut Vec, + challenges: Stage2TranscriptChallengesV1, +) { + for challenge in [ + challenges.lookup, + challenges.fingerprint, + challenges.constraint, + challenges.zeta, + challenges.pcs_alpha, + ] { + bytes.extend_from_slice(&extension_bytes(challenge)); + } +} + +fn decode_challenges(bytes: &[u8]) -> Stage2TranscriptChallengesV1 { + debug_assert_eq!(bytes.len(), CHALLENGE_BYTES); + let mut values = [[0u64; 2]; CHALLENGE_COUNT]; + for (value, chunk) in values.iter_mut().zip(bytes.as_chunks::<16>().0) { + value[0] = u64::from_le_bytes(chunk[..8].try_into().unwrap()); + value[1] = u64::from_le_bytes(chunk[8..].try_into().unwrap()); + } + Stage2TranscriptChallengesV1 { + lookup: values[0], + fingerprint: values[1], + constraint: values[2], + zeta: values[3], + pcs_alpha: values[4], + } +} + +fn encode_bundle(bundle: &TranscriptProofBundle) -> Result> { + bincode::DefaultOptions::new() + .with_fixint_encoding() + .serialize(bundle) + .context("encode Flock Stage 2 transcript proof bundle") +} + +fn decode_bundle(bytes: &[u8]) -> Result { + bincode::DefaultOptions::new() + .with_fixint_encoding() + .with_limit(MAX_BUNDLE_BYTES as u64) + .reject_trailing_bytes() + .deserialize(bytes) + .context("invalid Flock Stage 2 transcript proof bundle") +} + +#[cfg(test)] +mod tests { + use super::*; + + fn replay_fixture() -> Stage2TranscriptReplayV1 { + let mut initial = b"multi-stark/v0".to_vec(); + for value in 0..19u64 { + initial.extend_from_slice(&(value * 17 + 3).to_le_bytes()); + } + // Exercise a final partial BLAKE3 word in the first flush. + initial.extend_from_slice(&[0xa5, 0x5a, 0x11]); + + let stage2_and_accumulator_observations = + (0..79u8).map(|value| value.wrapping_mul(29)).collect(); + let quotient_commitment_observations = + (0..32u8).map(|value| value ^ 0x6d).collect(); + let pcs_opening_observations = + (0..117u8).map(|value| value.wrapping_mul(7).wrapping_add(1)).collect(); + Stage2TranscriptReplayV1 { + initial_observations: initial, + stage2_and_accumulator_observations, + quotient_commitment_observations, + pcs_opening_observations, + } + } + + #[derive(Clone)] + struct ReferenceHashChallenger { + input: Vec, + output: Vec, + } + + impl ReferenceHashChallenger { + fn new(initial: Vec) -> Self { + Self { input: initial, output: Vec::new() } + } + + fn observe(&mut self, bytes: &[u8]) { + self.output.clear(); + self.input.extend_from_slice(bytes); + } + + fn sample8(&mut self) -> [u8; 8] { + if self.output.is_empty() { + let digest = *blake3::hash(&self.input).as_bytes(); + self.input = digest.to_vec(); + self.output = digest.to_vec(); + } + std::array::from_fn(|_| self.output.pop().unwrap()) + } + + fn sample_field(&mut self) -> u64 { + loop { + let value = u64::from_le_bytes(self.sample8()); + if value < GOLDILOCKS_MODULUS { + return value; + } + } + } + + fn sample_ext(&mut self) -> [u64; 2] { + [self.sample_field(), self.sample_field()] + } + } + + #[test] + fn optimized_replay_matches_hash_challenger_buffers() { + let replay = replay_fixture(); + let expected = replay.challenges().unwrap(); + let mut challenger = + ReferenceHashChallenger::new(replay.initial_observations.clone()); + let lookup = challenger.sample_ext(); + challenger.observe(&extension_bytes(lookup)); + let fingerprint = challenger.sample_ext(); + challenger.observe(&extension_bytes(fingerprint)); + challenger.observe(&replay.stage2_and_accumulator_observations); + let constraint = challenger.sample_ext(); + challenger.observe(&replay.quotient_commitment_observations); + let zeta = challenger.sample_ext(); + challenger.observe(&replay.pcs_opening_observations); + let pcs_alpha = challenger.sample_ext(); + assert_eq!( + expected, + Stage2TranscriptChallengesV1 { + lookup, + fingerprint, + constraint, + zeta, + pcs_alpha, + } + ); + } + + #[test] + fn sample_gate_is_the_reverse_pop_order_permutation() { + let input = F128::new(0x0706_0504_0302_0100, 0x0f0e_0d0c_0b0a_0908); + assert_eq!( + sample_word(input), + F128::new(0x0809_0a0b_0c0d_0e0f, 0x0001_0203_0405_0607) + ); + let rows = [HashSampleRow(input)]; + let (z, _, _, _) = generate_hash_sample_witness(&rows, MIN_NU); + assert!(!z.is_empty()); + } + + #[test] + fn goldilocks_sample_gate_redraws_and_supports_pow_skip() { + let cases = [ + ( + [GOLDILOCKS_MODULUS, 5, 6, 7, 8, 9, 10, 11], + F128::new(5, 6), + F128::new(5, 6), + false, + false, + false, + false, + ), + ( + [1, GOLDILOCKS_MODULUS, 2, 3, 4, 5, 6, 7], + F128::new(1, 2), + F128::new(2, 3), + false, + false, + false, + false, + ), + ( + [GOLDILOCKS_MODULUS, GOLDILOCKS_MODULUS, 2, 3, 4, 5, 6, 7], + F128::new(2, 3), + F128::new(2, 3), + false, + false, + false, + false, + ), + ( + [1, 2, GOLDILOCKS_MODULUS, GOLDILOCKS_MODULUS, 4, 5, 6, 7], + F128::new(1, 2), + F128::new(2, 4), + false, + false, + false, + true, + ), + ( + [ + GOLDILOCKS_MODULUS, + GOLDILOCKS_MODULUS, + GOLDILOCKS_MODULUS, + 3, + 4, + 5, + 6, + 7, + ], + F128::new(3, 4), + F128::new(3, 4), + false, + false, + true, + true, + ), + ]; + for ( + candidates, + expected, + expected_skip, + failure, + skip_failure, + used_refill, + skip_used_refill, + ) in cases + { + let words = [ + F128::new(candidates[1].swap_bytes(), candidates[0].swap_bytes()), + F128::new(candidates[3].swap_bytes(), candidates[2].swap_bytes()), + F128::new(candidates[5].swap_bytes(), candidates[4].swap_bytes()), + F128::new(candidates[7].swap_bytes(), candidates[6].swap_bytes()), + ]; + let mut outputs = Vec::new(); + GoldilocksSampleGate { nu: MIN_NU }.eval(&words, &(), &mut outputs); + assert_eq!(outputs[0], expected); + assert_eq!(outputs[1], F128::new(u64::from(failure), 0)); + assert_eq!(outputs[2], F128::new(candidates[0], 0)); + assert_eq!(outputs[3], expected_skip); + assert_eq!(outputs[4], F128::new(u64::from(skip_failure), 0)); + let state = + if used_refill { [words[3], words[2]] } else { [words[1], words[0]] }; + let skip_state = if skip_used_refill { + [words[3], words[2]] + } else { + [words[1], words[0]] + }; + assert_eq!(outputs[5..7], state); + assert_eq!(outputs[7..9], skip_state); + let rows = [GoldilocksSampleRow(words)]; + let (z, _, _, _) = generate_goldilocks_sample_witness(&rows, MIN_NU); + assert!(!z.is_empty()); + } + } + + #[test] + fn u64_split_gate_exposes_low_bits_and_rejects_a_high_lane() { + let plan = u64_split_plan(); + let r1cs = plan.block_r1cs(MIN_NU); + let value = 0x8bad_f00d_dead_beefu64; + let mut row = vec![false; plan.k()]; + plan.fill_row(&mut row, |bits| { + write_f128(bits, U64_SPLIT_INPUT_BASE, F128::new(value, 0)); + }); + let mut witness = vec![false; r1cs.n()]; + witness[..plan.k()].copy_from_slice(&row); + assert!(r1cs.satisfies(&witness)); + assert_eq!(row[U64_SPLIT_BIT_BASE], value & 1 == 1); + for bit in 0..63 { + assert_eq!( + row[U64_SPLIT_QUOTIENT_BASE + bit], + (value >> (bit + 1)) & 1 == 1 + ); + } + + let mut wrong_quotient = witness; + wrong_quotient[U64_SPLIT_QUOTIENT_BASE + 17] ^= true; + assert!(!r1cs.satisfies(&wrong_quotient)); + + let mut high_lane_row = vec![false; plan.k()]; + plan.fill_row(&mut high_lane_row, |bits| { + write_f128(bits, U64_SPLIT_INPUT_BASE, F128::new(value, 1)); + }); + let mut high_lane = vec![false; r1cs.n()]; + high_lane[..plan.k()].copy_from_slice(&high_lane_row); + assert!(!r1cs.satisfies(&high_lane)); + } + + #[test] + fn circuit_matches_native_replay_and_uses_tree_hashing() { + let replay = replay_fixture(); + let challenges = replay.challenges().unwrap(); + let relation = TranscriptRelation::build(&replay).unwrap(); + let witness = relation.shape.run(&relation.inputs, &[]); + assert_eq!(witness.public, relation.public(challenges)); + + let mut long = replay; + long.initial_observations.resize(1_103, 0x42); + let long_relation = TranscriptRelation::build(&long).unwrap(); + let long_challenges = long.challenges().unwrap(); + let long_witness = long_relation.shape.run(&long_relation.inputs, &[]); + assert_eq!(long_witness.public, long_relation.public(long_challenges)); + assert!( + long_witness.rows::(long_relation.slots.blake3).len() + > witness.rows::(relation.slots.blake3).len() + ); + } + + #[test] + fn post_fri_circuit_matches_native_pow_betas_and_refilled_queries() { + let prefix = replay_fixture(); + let mut replay = Stage2FriTranscriptReplayV1 { + commit_phase_commitments: vec![ + vec![*blake3::hash(b"fri-cap-0").as_bytes()], + vec![*blake3::hash(b"fri-cap-1").as_bytes()], + ], + commit_pow_witnesses: vec![0, 0], + final_polynomial: vec![[17, 29]], + log_arities: vec![1, 1], + query_pow_witness: 0, + commit_pow_bits: 2, + query_pow_bits: 3, + num_queries: 5, + query_index_bits: 5, + }; + let challenges = (0..4_096u64) + .find_map(|nonce| { + replay.commit_pow_witnesses = vec![nonce & 15, (nonce >> 4) & 15]; + replay.query_pow_witness = (nonce >> 8) & 15; + replay.challenges(&prefix).ok() + }) + .expect("small commit/query PoW fixture has witnesses"); + + let nu = 11; + let mut builder = ShapeBuilder::new(nu); + let blake3 = builder.slot(Blake3Gate { nu }); + let sample = builder.slot(HashSampleGate { nu }); + let field_sample = builder.slot(GoldilocksSampleGate { nu }); + let canonical = builder.slot(CanonicalGoldilocksPairGate { nu }); + let repack = + builder.slot(crate::extension::GoldilocksLaneRepackGate { nu }); + let split = builder.slot(U64SplitGate { nu }); + let prefix_region = constrain_stage2_transcript( + &mut builder, + TranscriptCircuitSlots { blake3, sample: field_sample, canonical }, + &prefix, + nu, + ) + .unwrap(); + let mut inputs = prefix_region.inputs.clone(); + let mut public = inputs.clone(); + for challenge in prefix_region.challenges.all() { + builder.publish(challenge); + } + public.extend(challenge_words(prefix.challenges().unwrap())); + + let fri_region = constrain_stage2_fri_transcript( + &mut builder, + FriTranscriptCircuitSlots { + blake3, + sample, + field_sample, + canonical, + repack, + split, + }, + &replay, + prefix_region.state_digest, + nu, + ) + .unwrap(); + inputs.extend_from_slice(&fri_region.inputs); + public.extend_from_slice(&fri_region.inputs); + for &beta in &fri_region.betas { + builder.publish(beta); + } + public.extend(challenges.betas.iter().copied().map(pack_extension)); + for bits in &fri_region.query_index_bits { + for &bit in bits { + builder.publish(bit); + } + } + for &index in &challenges.query_indices { + public.extend( + (0..replay.query_index_bits) + .map(|bit| F128::new((index >> bit) & 1, 0)), + ); + } + let shape = builder.finish().unwrap(); + let witness = shape.run(&inputs, &[]); + assert_eq!(witness.public, public); + } + + #[test] + fn artifact_parser_is_strict_before_crypto() { + let replay = replay_fixture(); + let artifact = Stage2TranscriptConformanceArtifactV1 { + challenges: replay.challenges().unwrap(), + replay, + circuit_digest: [7; 32], + proof_bundle_bytes: vec![1, 2, 3], + }; + let bytes = artifact.to_bytes(); + assert_eq!( + Stage2TranscriptConformanceArtifactV1::from_bytes(&bytes).unwrap(), + artifact + ); + + let mut trailing = bytes.clone(); + trailing.push(0); + assert!( + Stage2TranscriptConformanceArtifactV1::from_bytes(&trailing).is_err() + ); + let mut wrong_config = bytes.clone(); + wrong_config[CONFIG_OFFSET] ^= 1; + assert!( + Stage2TranscriptConformanceArtifactV1::from_bytes(&wrong_config).is_err() + ); + let mut wrong_length = bytes; + wrong_length[LENGTHS_OFFSET] ^= 1; + assert!( + Stage2TranscriptConformanceArtifactV1::from_bytes(&wrong_length).is_err() + ); + } + + #[test] + #[ignore = "large upstream Flock proof; run explicitly for transcript conformance"] + fn real_transcript_round_trip_and_mutations() { + let artifact = prove_stage2_transcript_conformance(&replay_fixture()) + .expect("prove Stage 2 transcript replay"); + eprintln!( + "Flock Stage 2 transcript conformance bundle: {} bytes", + artifact.proof_bundle_bytes().len() + ); + verify_stage2_transcript_conformance(&artifact) + .expect("verify Stage 2 transcript replay"); + + let encoded = artifact.to_bytes(); + let decoded = + Stage2TranscriptConformanceArtifactV1::from_bytes(&encoded).unwrap(); + verify_stage2_transcript_conformance(&decoded) + .expect("verify decoded Stage 2 transcript replay"); + + let mut wrong_observation = decoded.clone(); + wrong_observation.replay.pcs_opening_observations[0] ^= 1; + assert!(verify_stage2_transcript_conformance(&wrong_observation).is_err()); + + let mut wrong_challenge = decoded.clone(); + wrong_challenge.challenges.pcs_alpha[0] ^= 1; + assert!(verify_stage2_transcript_conformance(&wrong_challenge).is_err()); + + let mut wrong_proof = decoded; + let flip_at = wrong_proof.proof_bundle_bytes.len() / 2; + wrong_proof.proof_bundle_bytes[flip_at] ^= 1; + assert!(verify_stage2_transcript_conformance(&wrong_proof).is_err()); + } +} diff --git a/flock-stage3/host/src/typed_witness.rs b/flock-stage3/host/src/typed_witness.rs new file mode 100644 index 000000000..fd734aecf --- /dev/null +++ b/flock-stage3/host/src/typed_witness.rs @@ -0,0 +1,451 @@ +//! Owned, serialization-independent witness consumed by the Stage 3 lowering. +//! +//! The source advice uses bincode only as an off-circuit transport. This +//! module converts it once into primitive semantic values so the Flock +//! relation never depends on Rust layout or byte-parser execution. + +use anyhow::{Result, bail}; +use ix_terminal::{ + Stage2AdviceProfileV1, ValidatedStage2RootV1, decode_stage2_advice, + fri_parameter_words, +}; +use multi_stark::{ + advice::AdviceProof, + p3_field::{BasedVectorSpace, PrimeField64}, + types::{ExtVal, FriParameters, Val}, +}; + +pub const STAGE3_TYPED_WITNESS_LAYOUT_DOMAIN: &[u8; 8] = b"IXTYPW01"; +const STAGE3_TYPED_WITNESS_LAYOUT_VERSION: u16 = 1; + +pub type Stage3DigestV1 = [u8; 32]; +pub type Stage3ExtensionValueV1 = [u64; 2]; +pub type Stage3OpenedRoundV1 = Vec>>; + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage3TypedCommitmentsV1 { + pub stage_1_trace: Vec, + pub stage_2_trace: Vec, + pub quotient_chunks: Vec, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage3TypedBatchOpeningV1 { + pub opened_values: Vec>, + pub opening_proof: Vec, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage3TypedCommitPhaseStepV1 { + pub log_arity: u8, + pub sibling_values: Vec, + pub opening_proof: Vec, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage3TypedQueryProofV1 { + pub input_proof: Vec, + pub commit_phase_openings: Vec, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage3TypedFriProofV1 { + pub commit_phase_commits: Vec>, + pub commit_pow_witnesses: Vec, + pub query_proofs: Vec, + pub final_poly: Vec, + pub query_pow_witness: u64, +} + +/// Primitive, typed mirror of `multi_stark::advice::AdviceProof`. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage3TypedProofWitnessV1 { + pub active: Vec, + pub commitments: Stage3TypedCommitmentsV1, + pub intermediate_accumulators: Vec, + pub log_degrees: Vec, + pub opening_proof: Stage3TypedFriProofV1, + pub quotient_opened_values: Stage3OpenedRoundV1, + pub preprocessed_opened_values: Option, + pub stage_1_opened_values: Stage3OpenedRoundV1, + pub stage_2_opened_values: Stage3OpenedRoundV1, +} + +/// Counts that must agree with the independently recorded advice profile. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct Stage3TypedProofCountsV1 { + pub total_circuits: u64, + pub active_circuits: u64, + pub queries: u64, + pub fri_rounds: u64, + pub input_rounds_per_query: u64, + pub commitment_cap_digests: u64, + pub input_merkle_siblings: u64, + pub fri_merkle_siblings: u64, + pub opened_base_values: u64, + pub fri_sibling_extension_values: u64, + pub other_extension_values: u64, +} + +impl Stage3TypedProofWitnessV1 { + /// Decode the strict advice transport and immediately erase its serializer + /// representation in favor of semantic primitive values. + pub fn from_advice_bytes(bytes: &[u8], fri: &FriParameters) -> Result { + Ok(Self::from_advice(decode_stage2_advice(bytes, fri)?)) + } + + /// Prepare the typed proof attached to an already validated Stage 2 root. + pub fn from_prepared( + prepared: &ValidatedStage2RootV1, + fri: &FriParameters, + ) -> Result { + if prepared.statement().fri_parameter_words() != &fri_parameter_words(fri) { + bail!("typed Stage 3 witness uses different FRI parameters"); + } + let witness = Self::from_advice_bytes(prepared.advice_bytes(), fri)?; + witness.ensure_profile(prepared.advice_profile())?; + Ok(witness) + } + + /// Digest of the exact nested vector/option layout, excluding witness + /// values. It is a capacity/compiler input, not a proof-content commitment. + pub fn layout_digest(&self) -> [u8; 32] { + let mut bytes = Vec::new(); + bytes.extend_from_slice(STAGE3_TYPED_WITNESS_LAYOUT_DOMAIN); + bytes.extend_from_slice(&STAGE3_TYPED_WITNESS_LAYOUT_VERSION.to_le_bytes()); + for word in self.layout_words() { + bytes.extend_from_slice(&word.to_le_bytes()); + } + *blake3::hash(&bytes).as_bytes() + } + + pub fn counts(&self) -> Stage3TypedProofCountsV1 { + let commitment_cap_digests = self.commitments.stage_1_trace.len() + + self.commitments.stage_2_trace.len() + + self.commitments.quotient_chunks.len() + + self + .opening_proof + .commit_phase_commits + .iter() + .map(Vec::len) + .sum::(); + let input_merkle_siblings = self + .opening_proof + .query_proofs + .iter() + .flat_map(|query| &query.input_proof) + .map(|opening| opening.opening_proof.len()) + .sum(); + let fri_merkle_siblings = self + .opening_proof + .query_proofs + .iter() + .flat_map(|query| &query.commit_phase_openings) + .map(|opening| opening.opening_proof.len()) + .sum(); + let opened_base_values = self + .opening_proof + .query_proofs + .iter() + .flat_map(|query| &query.input_proof) + .flat_map(|opening| &opening.opened_values) + .map(Vec::len) + .sum(); + let fri_sibling_extension_values = self + .opening_proof + .query_proofs + .iter() + .flat_map(|query| &query.commit_phase_openings) + .map(|opening| opening.sibling_values.len()) + .sum(); + let other_extension_values = self.intermediate_accumulators.len() + + count_opened_values(&self.quotient_opened_values) + + self.preprocessed_opened_values.as_ref().map_or(0, count_opened_values) + + count_opened_values(&self.stage_1_opened_values) + + count_opened_values(&self.stage_2_opened_values) + + self.opening_proof.final_poly.len(); + let input_rounds_per_query = self + .opening_proof + .query_proofs + .first() + .map_or(0, |query| query.input_proof.len()); + + Stage3TypedProofCountsV1 { + total_circuits: as_u64(self.active.len()), + active_circuits: as_u64( + self.active.iter().filter(|&&active| active).count(), + ), + queries: as_u64(self.opening_proof.query_proofs.len()), + fri_rounds: as_u64(self.opening_proof.commit_phase_commits.len()), + input_rounds_per_query: as_u64(input_rounds_per_query), + commitment_cap_digests: as_u64(commitment_cap_digests), + input_merkle_siblings: as_u64(input_merkle_siblings), + fri_merkle_siblings: as_u64(fri_merkle_siblings), + opened_base_values: as_u64(opened_base_values), + fri_sibling_extension_values: as_u64(fri_sibling_extension_values), + other_extension_values: as_u64(other_extension_values), + } + } + + pub fn ensure_profile(&self, profile: &Stage2AdviceProfileV1) -> Result<()> { + let expected = Stage3TypedProofCountsV1 { + total_circuits: profile.total_circuits, + active_circuits: profile.active_circuits, + queries: profile.queries, + fri_rounds: profile.fri_rounds, + input_rounds_per_query: profile.input_rounds_per_query, + commitment_cap_digests: profile.commitment_cap_digests, + input_merkle_siblings: profile.input_merkle_siblings, + fri_merkle_siblings: profile.fri_merkle_siblings, + opened_base_values: profile.opened_base_values, + fri_sibling_extension_values: profile.fri_sibling_extension_values, + other_extension_values: profile.other_extension_values, + }; + let observed = self.counts(); + if observed != expected { + bail!( + "typed Stage 3 witness counts differ from advice profile: expected {expected:?}, observed {observed:?}" + ); + } + Ok(()) + } + + /// Structural verifier step 2: the chained lookup accumulator must end at + /// zero. The full relation will wire this value to the accumulator updates. + pub fn last_accumulator_is_zero(&self) -> bool { + self.intermediate_accumulators.last().is_some_and(|value| *value == [0, 0]) + } + + fn from_advice(proof: AdviceProof) -> Self { + Self { + active: proof.active, + commitments: Stage3TypedCommitmentsV1 { + stage_1_trace: proof.commitments.stage_1_trace.roots().to_vec(), + stage_2_trace: proof.commitments.stage_2_trace.roots().to_vec(), + quotient_chunks: proof.commitments.quotient_chunks.roots().to_vec(), + }, + intermediate_accumulators: proof + .intermediate_accumulators + .into_iter() + .map(extension_words) + .collect(), + log_degrees: proof.log_degrees, + opening_proof: Stage3TypedFriProofV1 { + commit_phase_commits: proof + .opening_proof + .commit_phase_commits + .iter() + .map(|commitment| commitment.roots().to_vec()) + .collect(), + commit_pow_witnesses: proof + .opening_proof + .commit_pow_witnesses + .into_iter() + .map(base_word) + .collect(), + query_proofs: proof + .opening_proof + .query_proofs + .into_iter() + .map(|query| Stage3TypedQueryProofV1 { + input_proof: query + .input_proof + .into_iter() + .map(|opening| Stage3TypedBatchOpeningV1 { + opened_values: opening + .opened_values + .into_iter() + .map(|row| row.into_iter().map(base_word).collect()) + .collect(), + opening_proof: opening.opening_proof, + }) + .collect(), + commit_phase_openings: query + .commit_phase_openings + .into_iter() + .map(|step| Stage3TypedCommitPhaseStepV1 { + log_arity: step.log_arity, + sibling_values: step + .sibling_values + .into_iter() + .map(extension_words) + .collect(), + opening_proof: step.opening_proof, + }) + .collect(), + }) + .collect(), + final_poly: proof + .opening_proof + .final_poly + .into_iter() + .map(extension_words) + .collect(), + query_pow_witness: base_word(proof.opening_proof.query_pow_witness), + }, + quotient_opened_values: opened_round(proof.quotient_opened_values), + preprocessed_opened_values: proof + .preprocessed_opened_values + .map(opened_round), + stage_1_opened_values: opened_round(proof.stage_1_opened_values), + stage_2_opened_values: opened_round(proof.stage_2_opened_values), + } + } + + fn layout_words(&self) -> Vec { + let mut words = Vec::new(); + push_len(&mut words, &self.active); + push_len(&mut words, &self.commitments.stage_1_trace); + push_len(&mut words, &self.commitments.stage_2_trace); + push_len(&mut words, &self.commitments.quotient_chunks); + push_len(&mut words, &self.intermediate_accumulators); + push_len(&mut words, &self.log_degrees); + push_len(&mut words, &self.opening_proof.commit_phase_commits); + for cap in &self.opening_proof.commit_phase_commits { + push_len(&mut words, cap); + } + push_len(&mut words, &self.opening_proof.commit_pow_witnesses); + push_len(&mut words, &self.opening_proof.query_proofs); + for query in &self.opening_proof.query_proofs { + push_len(&mut words, &query.input_proof); + for opening in &query.input_proof { + push_len(&mut words, &opening.opened_values); + for row in &opening.opened_values { + push_len(&mut words, row); + } + push_len(&mut words, &opening.opening_proof); + } + push_len(&mut words, &query.commit_phase_openings); + for step in &query.commit_phase_openings { + words.push(u64::from(step.log_arity)); + push_len(&mut words, &step.sibling_values); + push_len(&mut words, &step.opening_proof); + } + } + push_len(&mut words, &self.opening_proof.final_poly); + push_opened_round(&mut words, &self.quotient_opened_values); + words.push(u64::from(self.preprocessed_opened_values.is_some())); + if let Some(round) = &self.preprocessed_opened_values { + push_opened_round(&mut words, round); + } + push_opened_round(&mut words, &self.stage_1_opened_values); + push_opened_round(&mut words, &self.stage_2_opened_values); + words + } +} + +fn base_word(value: Val) -> u64 { + value.as_canonical_u64() +} + +fn extension_words(value: ExtVal) -> Stage3ExtensionValueV1 { + let coefficients = value.as_basis_coefficients_slice(); + [base_word(coefficients[0]), base_word(coefficients[1])] +} + +fn opened_round(values: Vec>>) -> Stage3OpenedRoundV1 { + values + .into_iter() + .map(|matrix| { + matrix + .into_iter() + .map(|point| point.into_iter().map(extension_words).collect()) + .collect() + }) + .collect() +} + +fn count_opened_values(values: &Stage3OpenedRoundV1) -> usize { + values.iter().flat_map(|matrix| matrix.iter()).map(Vec::len).sum() +} + +fn push_len(words: &mut Vec, values: &[T]) { + words.push(as_u64(values.len())); +} + +fn push_opened_round(words: &mut Vec, values: &Stage3OpenedRoundV1) { + push_len(words, values); + for matrix in values { + push_len(words, matrix); + for point in matrix { + push_len(words, point); + } + } +} + +fn as_u64(value: usize) -> u64 { + u64::try_from(value).expect("Stage 3 witness length fits u64") +} + +#[cfg(test)] +mod tests { + use multi_stark::{ + advice::proof_to_advice_bytes, + p3_field::PrimeCharacteristicRing, + p3_matrix::dense::RowMajorMatrix, + system::{CircuitInputs, System, SystemWitness}, + types::{CommitmentParameters, GoldilocksBlake3Config}, + }; + + use super::*; + + fn typed_fixture() -> (Stage3TypedProofWitnessV1, Stage2AdviceProfileV1) { + let commitment = CommitmentParameters { log_blowup: 1, cap_height: 0 }; + let fri = FriParameters { + log_final_poly_len: 0, + max_log_arity: 1, + num_queries: 2, + commit_proof_of_work_bits: 0, + query_proof_of_work_bits: 0, + }; + let (system, key) = System::new( + GoldilocksBlake3Config::new(commitment, fri), + [ + CircuitInputs { main_width: 2, ..Default::default() }, + CircuitInputs { main_width: 3, ..Default::default() }, + ], + ); + let trace_1 = + RowMajorMatrix::new((0..16u32).map(Val::from_u32).collect::>(), 2); + let trace_2 = RowMajorMatrix::new( + (0..12u32).map(|value| Val::from_u32(7 * value + 3)).collect(), + 3, + ); + let proof = system.prove_multiple_claims( + &key, + &[], + SystemWitness::from_stage_1(vec![trace_1, trace_2], &system), + ); + let advice = + proof_to_advice_bytes(&system, commitment, fri, &[], &proof).unwrap(); + let profile = + Stage2AdviceProfileV1::from_advice_bytes(&advice, &fri).unwrap(); + let typed = + Stage3TypedProofWitnessV1::from_advice_bytes(&advice, &fri).unwrap(); + (typed, profile) + } + + #[test] + fn typed_layout_preserves_every_profile_count() { + let (typed, profile) = typed_fixture(); + typed.ensure_profile(&profile).unwrap(); + assert!(typed.last_accumulator_is_zero()); + assert_ne!(typed.layout_digest(), [0; 32]); + } + + #[test] + fn layout_digest_changes_with_nested_shape_not_values() { + let (typed, _) = typed_fixture(); + let digest = typed.layout_digest(); + + let mut value_change = typed.clone(); + value_change.opening_proof.query_pow_witness ^= 1; + assert_eq!(value_change.layout_digest(), digest); + + let mut shape_change = typed; + shape_change.opening_proof.query_proofs[0].input_proof[0] + .opening_proof + .pop(); + assert_ne!(shape_change.layout_digest(), digest); + } +} diff --git a/flock-stage3/host/src/window.rs b/flock-stage3/host/src/window.rs new file mode 100644 index 000000000..348c79a63 --- /dev/null +++ b/flock-stage3/host/src/window.rs @@ -0,0 +1,161 @@ +//! A fixed-selector 16-byte window over two adjacent transcript words. +//! +//! Stage 2 starts its challenger seed with the 14-byte `multi-stark/v0` tag, +//! so later commitment digests are not necessarily aligned to the Flock +//! circuit's 16-byte `F128` words. This Boolean table selects one of the 16 +//! possible byte offsets and returns the exact next 16 bytes. The selector is +//! always a relation-fixed one-hot word at call sites. + +use flock_prover::{ + circuit::builder::{GateType, SlotWitness}, + field::F128, + r1cs::BlockR1cs, + schedule::{IoWord, TableType}, +}; + +use crate::boolean::{ + BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, write_f128, +}; + +const K_LOG: usize = 12; +const FIRST_BASE: usize = 0; +const SECOND_BASE: usize = 128; +const SELECTOR_BASE: usize = 256; +const OUTPUT_BASE: usize = 384; +const RESERVED_COLUMNS: usize = 512; + +#[derive(Clone, Copy, Debug)] +pub(crate) struct ByteWindowGate { + pub(crate) nu: usize, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub(crate) struct ByteWindowRow { + first: F128, + second: F128, + selector: F128, +} + +impl GateType for ByteWindowGate { + type Row = ByteWindowRow; + type Hint = (); + + fn table(&self) -> TableType { + TableType::from_block_r1cs(&build_byte_window_r1cs(self.nu)).with_io_schema( + vec![ + IoWord::input(0), + IoWord::input(1), + IoWord::input(2), + IoWord::output(3), + ], + ) + } + + fn eval( + &self, + inputs: &[F128], + _hint: &(), + outputs: &mut Vec, + ) -> Self::Row { + let first = inputs[0]; + let second = inputs[1]; + let selector = inputs[2]; + assert_eq!(selector.hi, 0, "byte-window selector high lane must be zero"); + assert_eq!( + selector.lo.count_ones(), + 1, + "byte-window selector must be one-hot" + ); + let offset = selector.lo.trailing_zeros() as usize; + assert!(offset < 16, "byte-window offset exceeds one F128 word"); + outputs.push(byte_window(first, second, offset)); + ByteWindowRow { first, second, selector } + } + + fn witness(&self, _rows: &[Self::Row], _nu: usize) -> SlotWitness { + SlotWitness::DeferredToRows + } +} + +pub(crate) fn build_byte_window_r1cs(nu: usize) -> BlockR1cs { + byte_window_plan().block_r1cs(nu) +} + +pub(crate) fn generate_byte_window_witness( + rows: &[ByteWindowRow], + nu: usize, +) -> (Vec, Vec, Vec, Vec) { + generate_boolean_witness(byte_window_plan(), rows, nu, |row, bits| { + write_f128(bits, FIRST_BASE, row.first); + write_f128(bits, SECOND_BASE, row.second); + write_f128(bits, SELECTOR_BASE, row.selector); + }) +} + +fn byte_window_plan() -> &'static BooleanR1csPlan { + static PLAN: std::sync::OnceLock = + std::sync::OnceLock::new(); + PLAN.get_or_init(|| { + let mut builder = BooleanR1csBuilder::new(K_LOG, RESERVED_COLUMNS); + for column in FIRST_BASE..SELECTOR_BASE + 128 { + builder.free_boolean_at(column); + } + let one = builder.alloc_constant_one(); + for output_bit in 0..128 { + let products: Vec<_> = (0..16) + .map(|offset| { + let source_bit = offset * 8 + output_bit; + let source = if source_bit < 128 { + FIRST_BASE + source_bit + } else { + SECOND_BASE + source_bit - 128 + }; + builder.and(SELECTOR_BASE + offset, source) + }) + .collect(); + builder.write_xor(OUTPUT_BASE + output_bit, &products, one); + } + builder.finish() + }) +} + +fn byte_window(first: F128, second: F128, offset: usize) -> F128 { + let mut bytes = [0u8; 32]; + bytes[..8].copy_from_slice(&first.lo.to_le_bytes()); + bytes[8..16].copy_from_slice(&first.hi.to_le_bytes()); + bytes[16..24].copy_from_slice(&second.lo.to_le_bytes()); + bytes[24..].copy_from_slice(&second.hi.to_le_bytes()); + F128::new( + u64::from_le_bytes(bytes[offset..offset + 8].try_into().unwrap()), + u64::from_le_bytes(bytes[offset + 8..offset + 16].try_into().unwrap()), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn every_byte_offset_matches_native_slice() { + let first = F128::new(0x0706_0504_0302_0100, 0x0f0e_0d0c_0b0a_0908); + let second = F128::new(0x1716_1514_1312_1110, 0x1f1e_1d1c_1b1a_1918); + let plan = byte_window_plan(); + let r1cs = plan.block_r1cs(3); + for offset in 0..16 { + let selector = F128::new(1 << offset, 0); + let mut logical = vec![false; plan.k()]; + plan.fill_row(&mut logical, |bits| { + write_f128(bits, FIRST_BASE, first); + write_f128(bits, SECOND_BASE, second); + write_f128(bits, SELECTOR_BASE, selector); + }); + let mut witness = vec![false; r1cs.n()]; + witness[..plan.k()].copy_from_slice(&logical); + assert!(r1cs.satisfies(&witness)); + let expected = byte_window(first, second, offset); + let mut output = vec![false; 128]; + write_f128(&mut output, 0, expected); + assert_eq!(&logical[OUTPUT_BASE..OUTPUT_BASE + 128], output); + } + } +} From 411262689312befe0bc38c9eac125f2d946fb77b Mon Sep 17 00:00:00 2001 From: "John C. Burnham" Date: Mon, 31 Aug 2026 06:22:09 -0400 Subject: [PATCH 02/10] feat: prepare Flock Stage 3 for production aggregates Remove the fixed eight-round FRI ceiling, add deep-round relation regressions, and expose aggregate-root preflight diagnostics. Add the optional Flock CLI/FFI bridge with shared canonical root preparation, statement pinning, proof verification, and atomic artifact output. --- Cargo.lock | 572 +++++++++++++++++++++++++++----- Ix/Aiur/Protocol.lean | 8 + Ix/Cli/FlockRootCmd.lean | 128 +++++++ Main.lean | 2 + crates/ffi/Cargo.toml | 5 + crates/ffi/src/aiur/protocol.rs | 124 +++++++ flock-stage3/README.md | 27 ++ flock-stage3/host/src/fri.rs | 241 ++++++++++++-- flock-stage3/host/src/lib.rs | 139 +++++++- lakefile.lean | 12 +- 10 files changed, 1127 insertions(+), 131 deletions(-) create mode 100644 Ix/Cli/FlockRootCmd.lean diff --git a/Cargo.lock b/Cargo.lock index dae039f56..6a7203293 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -53,7 +53,7 @@ dependencies = [ "hashbrown 0.15.5", "indexmap", "libc", - "multi-stark", + "multi-stark 0.1.0 (git+https://github.com/argumentcomputer/multi-stark.git?rev=a8aab731af8d2a5e15f390cd2ef14af4fc42d7d3)", "num-bigint 0.4.8", "rayon", "rustc-hash", @@ -195,6 +195,15 @@ dependencies = [ "num-bigint 0.4.8", ] +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bincode" version = "2.0.1" @@ -872,6 +881,47 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" +[[package]] +name = "flock-core" +version = "0.1.0" +source = "git+https://github.com/succinctlabs/flock?rev=b310f35f35f68095537150a1c8c0a43caca9a29e#b310f35f35f68095537150a1c8c0a43caca9a29e" +dependencies = [ + "bincode 1.3.3", + "blake3", + "rand_core 0.9.5", + "rayon", + "serde", + "sha2 0.10.9", + "toml", +] + +[[package]] +name = "flock-prover" +version = "0.1.0" +source = "git+https://github.com/succinctlabs/flock?rev=b310f35f35f68095537150a1c8c0a43caca9a29e#b310f35f35f68095537150a1c8c0a43caca9a29e" +dependencies = [ + "bincode 1.3.3", + "blake3", + "flock-core", + "rayon", + "serde", + "sha2 0.10.9", +] + +[[package]] +name = "flock-stage3-host" +version = "0.1.0" +dependencies = [ + "aiur", + "anyhow", + "bincode 1.3.3", + "blake3", + "flock-prover", + "ix-terminal", + "multi-stark 0.1.0 (git+https://github.com/argumentcomputer/multi-stark.git?rev=2892243e674f9a0b3aca9004a8d00c79a23beec1)", + "serde", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1784,10 +1834,11 @@ dependencies = [ "aiur", "anyhow", "bignat", - "bincode", + "bincode 2.0.1", "blake3", "bytes", "dashmap", + "flock-stage3-host", "getrandom 0.3.4", "indexmap", "iroh", @@ -1802,7 +1853,7 @@ dependencies = [ "lean-ffi", "memmap2", "mimalloc", - "multi-stark", + "multi-stark 0.1.0 (git+https://github.com/argumentcomputer/multi-stark.git?rev=a8aab731af8d2a5e15f390cd2ef14af4fc42d7d3)", "n0-error", "num-bigint 0.4.8", "rayon", @@ -1849,9 +1900,9 @@ version = "0.1.0" dependencies = [ "aiur", "anyhow", - "bincode", + "bincode 2.0.1", "blake3", - "multi-stark", + "multi-stark 0.1.0 (git+https://github.com/argumentcomputer/multi-stark.git?rev=a8aab731af8d2a5e15f390cd2ef14af4fc42d7d3)", ] [[package]] @@ -1882,7 +1933,7 @@ dependencies = [ "dashmap", "ix-common", "ixon", - "multi-stark", + "multi-stark 0.1.0 (git+https://github.com/argumentcomputer/multi-stark.git?rev=a8aab731af8d2a5e15f390cd2ef14af4fc42d7d3)", "num-bigint 0.4.8", "rayon", "rustc-hash", @@ -2082,27 +2133,52 @@ dependencies = [ "uuid", ] +[[package]] +name = "multi-stark" +version = "0.1.0" +source = "git+https://github.com/argumentcomputer/multi-stark.git?rev=2892243e674f9a0b3aca9004a8d00c79a23beec1#2892243e674f9a0b3aca9004a8d00c79a23beec1" +dependencies = [ + "bincode 2.0.1", + "num-bigint 0.5.1", + "p3-air 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-blake3 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-challenger 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-commit 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-fri 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-goldilocks 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-keccak 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-merkle-tree 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "serde", + "tracing", +] + [[package]] name = "multi-stark" version = "0.1.0" source = "git+https://github.com/argumentcomputer/multi-stark.git?rev=a8aab731af8d2a5e15f390cd2ef14af4fc42d7d3#a8aab731af8d2a5e15f390cd2ef14af4fc42d7d3" dependencies = [ - "bincode", + "bincode 2.0.1", "itertools 0.14.0", - "p3-air", - "p3-blake3", - "p3-challenger", - "p3-commit", - "p3-dft", - "p3-field", - "p3-fri", - "p3-goldilocks", - "p3-keccak", - "p3-matrix", - "p3-maybe-rayon", - "p3-merkle-tree", - "p3-symmetric", - "p3-util", + "p3-air 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-blake3 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-challenger 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-commit 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-fri 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-goldilocks 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-keccak 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-merkle-tree 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", "serde", "tracing", ] @@ -2520,8 +2596,19 @@ name = "p3-air" version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ - "p3-field", - "p3-matrix", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "serde", + "tracing", +] + +[[package]] +name = "p3-air" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "serde", "tracing", ] @@ -2532,8 +2619,18 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "blake3", - "p3-symmetric", - "p3-util", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", +] + +[[package]] +name = "p3-blake3" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "blake3", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", ] [[package]] @@ -2541,10 +2638,22 @@ name = "p3-challenger" version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ - "p3-field", - "p3-maybe-rayon", - "p3-symmetric", - "p3-util", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "tracing", +] + +[[package]] +name = "p3-challenger" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "tracing", ] @@ -2554,11 +2663,24 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools 0.15.0", - "p3-dft", - "p3-field", - "p3-matrix", - "p3-multilinear-util", - "p3-util", + "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-multilinear-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "serde", +] + +[[package]] +name = "p3-commit" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "itertools 0.15.0", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-multilinear-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "serde", ] @@ -2568,10 +2690,24 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools 0.15.0", - "p3-field", - "p3-matrix", - "p3-maybe-rayon", - "p3-util", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "spin 0.12.3", + "tracing", +] + +[[package]] +name = "p3-dft" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "itertools 0.15.0", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "spin 0.12.3", "tracing", ] @@ -2583,8 +2719,23 @@ source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc2 dependencies = [ "itertools 0.15.0", "num-bigint 0.5.1", - "p3-maybe-rayon", - "p3-util", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "paste", + "rand 0.10.2", + "serde", + "tracing", +] + +[[package]] +name = "p3-field" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "itertools 0.15.0", + "num-bigint 0.5.1", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "paste", "rand 0.10.2", "serde", @@ -2597,14 +2748,35 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools 0.15.0", - "p3-challenger", - "p3-commit", - "p3-dft", - "p3-field", - "p3-matrix", - "p3-maybe-rayon", - "p3-security", - "p3-util", + "p3-challenger 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-commit 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-security 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "rand 0.10.2", + "serde", + "spin 0.12.3", + "thiserror", + "tracing", +] + +[[package]] +name = "p3-fri" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "itertools 0.15.0", + "p3-challenger 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-commit 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-security 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "rand 0.10.2", "serde", "spin 0.12.3", @@ -2618,13 +2790,32 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "num-bigint 0.5.1", - "p3-dft", - "p3-field", - "p3-mds", - "p3-poseidon1", - "p3-poseidon2", - "p3-symmetric", - "p3-util", + "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-mds 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-poseidon1 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-poseidon2 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "paste", + "rand 0.10.2", + "serde", + "spin 0.12.3", +] + +[[package]] +name = "p3-goldilocks" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "num-bigint 0.5.1", + "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-mds 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-poseidon1 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-poseidon2 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "paste", "rand 0.10.2", "serde", @@ -2636,8 +2827,18 @@ name = "p3-keccak" version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ - "p3-symmetric", - "p3-util", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "tiny-keccak", +] + +[[package]] +name = "p3-keccak" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "tiny-keccak", ] @@ -2647,9 +2848,23 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools 0.15.0", - "p3-field", - "p3-maybe-rayon", - "p3-util", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "rand 0.10.2", + "serde", + "tracing", +] + +[[package]] +name = "p3-matrix" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "itertools 0.15.0", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "rand 0.10.2", "serde", "tracing", @@ -2663,15 +2878,32 @@ dependencies = [ "rayon", ] +[[package]] +name = "p3-maybe-rayon" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" + [[package]] name = "p3-mds" version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ - "p3-dft", - "p3-field", - "p3-symmetric", - "p3-util", + "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "rand 0.10.2", +] + +[[package]] +name = "p3-mds" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "rand 0.10.2", ] @@ -2681,12 +2913,31 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools 0.15.0", - "p3-commit", - "p3-field", - "p3-matrix", - "p3-maybe-rayon", - "p3-symmetric", - "p3-util", + "p3-commit 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "rand 0.10.2", + "serde", + "spin 0.12.3", + "thiserror", + "tracing", +] + +[[package]] +name = "p3-merkle-tree" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "itertools 0.15.0", + "p3-commit 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "rand 0.10.2", "serde", "spin 0.12.3", @@ -2700,10 +2951,25 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools 0.15.0", - "p3-field", - "p3-matrix", - "p3-maybe-rayon", - "p3-util", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "rand 0.10.2", + "serde", + "tracing", +] + +[[package]] +name = "p3-multilinear-util" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "itertools 0.15.0", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "rand 0.10.2", "serde", "tracing", @@ -2714,9 +2980,20 @@ name = "p3-poseidon1" version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ - "p3-field", - "p3-mds", - "p3-symmetric", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-mds 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "rand 0.10.2", +] + +[[package]] +name = "p3-poseidon1" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-mds 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "rand 0.10.2", ] @@ -2725,10 +3002,22 @@ name = "p3-poseidon2" version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ - "p3-field", - "p3-mds", - "p3-symmetric", - "p3-util", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-mds 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "rand 0.10.2", +] + +[[package]] +name = "p3-poseidon2" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-mds 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "rand 0.10.2", ] @@ -2738,9 +3027,21 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "libm", - "p3-air", - "p3-field", - "p3-util", + "p3-air 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "serde", +] + +[[package]] +name = "p3-security" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "libm", + "p3-air 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "serde", ] @@ -2750,8 +3051,19 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools 0.15.0", - "p3-field", - "p3-util", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "serde", +] + +[[package]] +name = "p3-symmetric" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "itertools 0.15.0", + "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "serde", ] @@ -2760,7 +3072,16 @@ name = "p3-util" version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ - "p3-maybe-rayon", + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "serde", +] + +[[package]] +name = "p3-util" +version = "0.6.0" +source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +dependencies = [ + "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", "serde", ] @@ -3018,7 +3339,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit", + "toml_edit 0.25.13+spec-1.1.0", ] [[package]] @@ -3487,6 +3808,15 @@ dependencies = [ "zmij", ] +[[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" @@ -3518,6 +3848,7 @@ dependencies = [ "cfg-if", "cpufeatures 0.2.17", "digest 0.10.7", + "sha2-asm", ] [[package]] @@ -3531,6 +3862,15 @@ dependencies = [ "digest 0.11.0-rc.10", ] +[[package]] +name = "sha2-asm" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b845214d6175804686b2bd482bcffe96651bb2d1200742b712003504a2dac1ab" +dependencies = [ + "cc", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -3954,6 +4294,27 @@ dependencies = [ "tokio-util", ] +[[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 = "1.1.1+spec-1.1.0" @@ -3963,6 +4324,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", + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", +] + [[package]] name = "toml_edit" version = "0.25.13+spec-1.1.0" @@ -3970,9 +4345,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ "indexmap", - "toml_datetime", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow", + "winnow 1.0.4", ] [[package]] @@ -3981,9 +4356,15 @@ version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ - "winnow", + "winnow 1.0.4", ] +[[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.3" @@ -4612,6 +4993,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + [[package]] name = "winnow" version = "1.0.4" diff --git a/Ix/Aiur/Protocol.lean b/Ix/Aiur/Protocol.lean index cbb7ae891..9ba608861 100644 --- a/Ix/Aiur/Protocol.lean +++ b/Ix/Aiur/Protocol.lean @@ -418,6 +418,14 @@ abbrev functionChannel : G := .ofNat 0 def buildClaim (funIdx : Bytecode.FunIdx) (input output : Array G) := #[functionChannel, .ofNat funIdx] ++ input ++ output +/-- Compile/evaluate (preflight) or prove the complete no-RISC-V Flock Stage 3 +relation for one Aiur aggregate root. Proving requires an output path and +atomically installs the verified artifact. Without the Cargo flock feature, +this binding returns a descriptive error while remaining linkable. -/ +@[extern "rs_flock_stage3_aggregate_root"] +opaque flockStage3AggregateRoot : @& ByteArray → @& ByteArray → @& ByteArray → + @& FriParameters → @& String → @& String → Except String Unit + end Aiur end diff --git a/Ix/Cli/FlockRootCmd.lean b/Ix/Cli/FlockRootCmd.lean new file mode 100644 index 000000000..579014d83 --- /dev/null +++ b/Ix/Cli/FlockRootCmd.lean @@ -0,0 +1,128 @@ +/- +`ix flock-root ROOT_ADDRESS` consumes the same canonical aggregate-root +transport as `ix compress-root`, then either compiles/evaluates the complete +Stage 3 relation (`preflight`) or emits a verified Flock artifact (`prove`). + +Preflight deliberately stops before the cryptographic prover. It is the cheap +compatibility and capacity gate for a production-sized Stage 2 aggregate. +-/ +module +public import Cli +public import Ix.Address +public import Ix.Aiur.Protocol +public import Ix.Aggr +public import Ix.Cli.AggregateCmd +public import Ix.Cli.VerifyCmd +public import Ix.Ixon +public import Ix.MultiStark +public import Ix.Store +public import Ix.Unsigned + +public section + +namespace Ix.Cli.FlockRootCmd + +/-- Canonical terminal claim encoding: one little-endian u64 per Goldilocks +word. -/ +def outerClaimBytes (claim : Array Aiur.G) : ByteArray := + claim.foldl (init := .empty) fun bytes value => bytes ++ value.val.toLEBytes + +/-- Canonical Flock transport reconstructed from a persisted aggregate +wrapper. -/ +structure AggregateRootInputs where + rootAddress : Address + bundledClaim : Ix.Claim + verifyingKey : ByteArray + outerClaim : ByteArray + proof : ByteArray + fri : Aiur.FriParameters + +def prepareAggregateRootInputs + (rootHex : String) : IO (Except String AggregateRootInputs) := do + let some rootAddress := Address.fromString rootHex + | return .error s!"aggregate root: expected 64-char hex (32-byte address), \ + got {rootHex.length}-char {rootHex}" + let wrapper ← match Ixon.Proof.de (← StoreIO.toIO (Store.read rootAddress)) with + | .ok wrapper => pure wrapper + | .error error => + return .error s!"aggregate wrapper {rootAddress} does not decode: {error}" + let recursionParameters := MultiStark.defaultRecursionParameters + let backend ← + match ← Ix.Cli.VerifyCmd.buildAggregateBackend recursionParameters with + | .ok backend => pure backend + | .error error => return .error error + let outerClaim := Ix.Cli.AggregateCmd.aggregateOuterClaim + backend.allowed backend.aggrIdx wrapper.claim + if outerClaim.size != 18 then + return .error + s!"internal ix_aggr claim width is {outerClaim.size}, expected 18" + return .ok { + rootAddress + bundledClaim := wrapper.claim + verifyingKey := backend.system.vkBytes + outerClaim := outerClaimBytes outerClaim + proof := wrapper.proof + fri := recursionParameters.fri + } + +/-- Flock Stage 3 accepts only closed aggregate roots. -/ +def validateBundledClaim (claim : Ix.Claim) : Except String Unit := do + let .checkEnv _ assumptions := claim + | throw "aggregate root wrapper does not contain a CheckEnv claim" + if assumptions.isSome then + throw "aggregate root retains assumptions; Flock Stage 3 requires a closed root" + +def runFlockRootCmd (p : Cli.Parsed) : IO UInt32 := do + let roots := (p.variableArgsAs! String).toList + let rootHex ← match roots with + | [root] => pure root + | [] => p.printError "error: expected one aggregate root address"; return 1 + | _ => p.printError "error: expected exactly one aggregate root address"; return 1 + let mode := (p.flag? "mode").map (·.as! String) |>.getD "preflight" + if mode != "preflight" && mode != "prove" then + IO.eprintln s!"error: unknown Flock mode `{mode}` (expected preflight|prove)" + return 1 + let output := (p.flag? "output").map (·.as! String) |>.getD "" + if mode == "preflight" && !output.isEmpty then + IO.eprintln "error: --output is only valid with --mode prove" + return 1 + if mode == "prove" && output.isEmpty then + IO.eprintln "error: Flock proving requires --output" + return 1 + + let inputs ← match ← prepareAggregateRootInputs rootHex with + | .ok inputs => pure inputs + | .error error => IO.eprintln s!"error: {error}"; return 1 + match validateBundledClaim inputs.bundledClaim with + | .ok () => pure () + | .error error => IO.eprintln s!"error: {error}"; return 1 + + IO.println s!"Flock Stage 3 {mode}: aggregate root {inputs.rootAddress}" + IO.println s!" bundled claim: {inputs.bundledClaim}" + IO.println s!" recursion vk: {Address.blake3 inputs.verifyingKey}" + (← IO.getStdout).flush + match Aiur.flockStage3AggregateRoot inputs.verifyingKey inputs.outerClaim + inputs.proof inputs.fri mode output with + | .ok () => + IO.println s!"ok: Flock Stage 3 {mode} accepted aggregate root {inputs.rootAddress}" + return 0 + | .error error => + IO.eprintln s!"error: Flock Stage 3 {mode} failed: {error}" + return 1 + +end Ix.Cli.FlockRootCmd + +open Ix.Cli.FlockRootCmd in +def flockRootCmd : Cli.Cmd := `[Cli| + "flock-root" VIA runFlockRootCmd; + "Preflight or prove one closed ix_aggr root with Flock Stage 3 (build with IX_FLOCK=1)" + + FLAGS: + "mode" : String; "Stage 3 action: preflight | prove (default: preflight)." + "output" : String; "Atomically save the verified Stage3ArtifactV1 (required for prove)." + + ARGS: + ...root : String; "Exactly one 32-byte store address of a persisted aggregate root." +] + +end diff --git a/Main.lean b/Main.lean index 6963f1ad3..c0ccb7dc3 100644 --- a/Main.lean +++ b/Main.lean @@ -13,6 +13,7 @@ import Ix.Cli.CatalogCmd import Ix.Cli.CompileCmd import Ix.Cli.DecompileCmd import Ix.Cli.DiffCmd +import Ix.Cli.FlockRootCmd import Ix.Cli.IngressCmd import Ix.Cli.MergeCmd import Ix.Cli.NameOfCmd @@ -52,6 +53,7 @@ def ixCmd : Cli.Cmd := `[Cli| treeCmd; profileCmd; proveCmd; + flockRootCmd; shardCmd; codegenCmd; verifyCmd; diff --git a/crates/ffi/Cargo.toml b/crates/ffi/Cargo.toml index 7a0bc7896..2d0fbeaa4 100644 --- a/crates/ffi/Cargo.toml +++ b/crates/ffi/Cargo.toml @@ -35,6 +35,10 @@ tracing = { workspace = true } tracing-subscriber = { workspace = true } tracing-texray = { workspace = true } +# Optional no-RISC-V Flock Stage 3 connector. This stays out of the normal +# host build because the pinned prover stack is intentionally isolated. +flock-stage3-host = { path = "../../flock-stage3/host", optional = true } + # Iroh dependencies bytes = { version = "1.10.1", optional = true } tokio = { version = "1.44.1", optional = true } @@ -51,6 +55,7 @@ parallel = ["aiur/parallel"] cuda = ["aiur/cuda"] test-ffi = [] net = ["bytes", "tokio", "iroh", "iroh-base", "n0-error", "getrandom", "bincode", "serde"] +flock = ["dep:flock-stage3-host"] [lints] workspace = true diff --git a/crates/ffi/src/aiur/protocol.rs b/crates/ffi/src/aiur/protocol.rs index 5dac21c9c..f0bf3c0bc 100644 --- a/crates/ffi/src/aiur/protocol.rs +++ b/crates/ffi/src/aiur/protocol.rs @@ -1677,3 +1677,127 @@ fn decode_io_buffer_map( } map } + +// ============================================================================= +// Flock aggregate-root Stage 3 (feature flock) +// ============================================================================= + +#[cfg(feature = "flock")] +fn write_flock_artifact_atomic( + path: &std::path::Path, + bytes: &[u8], +) -> anyhow::Result<()> { + use anyhow::{Context, bail}; + + let Some(file_name) = path.file_name() else { + bail!("Flock output path has no file name: {}", path.display()); + }; + let temporary = path.with_file_name(format!( + ".{}.tmp-{}", + file_name.to_string_lossy(), + std::process::id(), + )); + std::fs::write(&temporary, bytes).with_context(|| { + format!("write temporary Flock artifact {}", temporary.display()) + })?; + if let Err(error) = std::fs::rename(&temporary, path) { + let _ = std::fs::remove_file(&temporary); + return Err(error) + .with_context(|| format!("install Flock artifact {}", path.display())); + } + Ok(()) +} + +/// Compile/evaluate or prove the complete no-RISC-V Flock relation for one +/// canonical ix_aggr root. Default builds retain a checked feature-disabled +/// stub so the Lean CLI remains linkable. +#[unsafe(no_mangle)] +extern "C" fn rs_flock_stage3_aggregate_root( + vk_bytes: LeanByteArray>, + claim_bytes: LeanByteArray>, + proof_bytes: LeanByteArray>, + fri_parameters: LeanAiurFriParameters>, + mode: LeanString>, + output: LeanString>, +) -> LeanExcept { + #[cfg(feature = "flock")] + { + let fri = decode_fri_parameters(&fri_parameters); + let backend = flock_stage3_host::FlockStage3Backend; + let result = match mode.as_str().to_ascii_lowercase().as_str() { + "preflight" => { + if !output.as_str().is_empty() { + Err(anyhow::anyhow!("--output is only valid with --mode prove")) + } else { + backend + .preflight_stage2( + vk_bytes.as_bytes(), + claim_bytes.as_bytes(), + proof_bytes.as_bytes(), + &fri, + ) + .map(|report| println!("{report}")) + } + }, + "prove" => { + if output.as_str().is_empty() { + Err(anyhow::anyhow!( + "Flock proving requires --output so the expensive artifact is retained" + )) + } else { + (|| { + let report = backend.preflight_stage2( + vk_bytes.as_bytes(), + claim_bytes.as_bytes(), + proof_bytes.as_bytes(), + &fri, + )?; + println!("{report}"); + println!("starting Flock Stage 3 prover"); + let artifact = backend.prove_stage2( + vk_bytes.as_bytes(), + claim_bytes.as_bytes(), + proof_bytes.as_bytes(), + &fri, + )?; + if artifact.statement().stage2_root_digest() + != &report.stage2_root_digest + || artifact.statement().relation_digest() + != &report.relation_digest + || artifact.statement().digest() != report.stage3_statement_digest + { + return Err(anyhow::anyhow!( + "Flock prover rebuilt a statement different from preflight" + )); + } + backend.verify_stage2(&artifact, artifact.statement())?; + let encoded = artifact.to_bytes(); + let output_path = std::path::Path::new(output.as_str()); + write_flock_artifact_atomic(output_path, &encoded)?; + println!( + "Flock Stage 3 proof verified; artifact={} bytes; saved to {}", + encoded.len(), + output_path.display(), + ); + Ok(()) + })() + } + }, + other => Err(anyhow::anyhow!( + "unknown Flock mode '{other}' (expected preflight|prove)" + )), + }; + match result { + Ok(()) => LeanExcept::ok(LeanOwned::box_usize(0)), + Err(error) => LeanExcept::error_string(&format!("{error:#}")), + } + } + #[cfg(not(feature = "flock"))] + { + let _ = + (&vk_bytes, &claim_bytes, &proof_bytes, &fri_parameters, &mode, &output); + LeanExcept::error_string( + "ix was built without Flock Stage 3; rebuild with IX_FLOCK=1", + ) + } +} diff --git a/flock-stage3/README.md b/flock-stage3/README.md index f0fe0e7f0..c67eba0ce 100644 --- a/flock-stage3/README.md +++ b/flock-stage3/README.md @@ -91,6 +91,33 @@ Print the selected Flock configuration and digest with: cargo run -p flock-stage3-host --bin flock-stage3-config ``` +## Production aggregate preflight + +Build the optional root connector and compile/evaluate the complete Stage 3 +relation for a persisted `ix_aggr` root without starting the Flock prover: + +```sh +IX_FLOCK=1 nix develop --command lake exe ix flock-root ROOT_ADDRESS \ + --mode preflight +``` + +Preflight natively verifies and expands the compact Stage 2 proof, constructs +the typed AIR/PCS/FRI witness, evaluates every Flock gate, and prints the Stage +2 advice geometry, `nu`, table capacity, relation/public sizes, per-gate row +counts, and content-addressed relation/statement digests. It is the mandatory +gate before a production-sized proof. + +Once preflight succeeds, retain the expensive verified artifact explicitly: + +```sh +IX_FLOCK=1 nix develop --command lake exe ix flock-root ROOT_ADDRESS \ + --mode prove --output root.stage3.flock +``` + +The output is installed atomically. The binary-FRI lowering supports the full +height-derived schedule: the prior eight-round implementation ceiling is gone, +with evaluated regressions at 9, 16, and the current 30-round maximum. + ## Scope and remaining work The current relation is deliberately specialised to the configuration used by diff --git a/flock-stage3/host/src/fri.rs b/flock-stage3/host/src/fri.rs index b09715359..92d11f8e6 100644 --- a/flock-stage3/host/src/fri.rs +++ b/flock-stage3/host/src/fri.rs @@ -106,7 +106,6 @@ const FIXED_SUFFIX_BYTES: usize = 32 + 32 + 8; const MAX_BUNDLE_BYTES: usize = 64 * 1024 * 1024; const MIN_LOG_HEIGHT: u8 = 1; const MAX_LOG_HEIGHT: u8 = 31; -const MAX_COMMIT_PHASE_ROUNDS: usize = 8; const MAX_REDUCED_OPENING_WIDTH: usize = 1 << 16; // The arithmetic slots need enough rows for the bit-reversed exponentiation // at the maximum supported height. This also keeps every table in a Flock @@ -333,6 +332,48 @@ impl Stage2AirPcsFriWitnessV1 { } } +/// Exact circuit census produced by the no-prove Stage 3 preflight. +/// +/// Counts are witness rows before Flock pads each table to `2^nu`. Keeping +/// them named makes production-root growth visible without exposing Flock's +/// internal slot identifiers as part of the Ix API. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage3RelationCensusV1 { + pub circuit_digest: [u8; 32], + pub nu: u64, + pub table_capacity: u64, + pub relation_inputs: u64, + pub public_values: u64, + pub blake3_rows: u64, + pub digest_order_rows: u64, + pub goldilocks_add_rows: u64, + pub goldilocks_mul_rows: u64, + pub lane_repack_rows: u64, + pub canonical_goldilocks_rows: u64, + pub equality_rows: u64, + pub hash_sample_rows: u64, + pub field_sample_rows: u64, + pub u64_split_rows: u64, + pub byte_window_rows: u64, +} + +impl Stage3RelationCensusV1 { + pub fn total_rows(&self) -> u64 { + self + .blake3_rows + .saturating_add(self.digest_order_rows) + .saturating_add(self.goldilocks_add_rows) + .saturating_add(self.goldilocks_mul_rows) + .saturating_add(self.lane_repack_rows) + .saturating_add(self.canonical_goldilocks_rows) + .saturating_add(self.equality_rows) + .saturating_add(self.hash_sample_rows) + .saturating_add(self.field_sample_rows) + .saturating_add(self.u64_split_rows) + .saturating_add(self.byte_window_rows) + } +} + /// A real Flock proof of an authenticated Plonky3-compatible binary FRI fold. #[derive(Clone, Debug, PartialEq, Eq)] pub struct FriFoldConformanceArtifactV1 { @@ -1652,6 +1693,83 @@ pub(crate) fn stage2_air_pcs_fri_circuit_digest( Ok(build_stage2_air_pcs_fri_relation(witness)?.shape.circuit.digest()) } +pub(crate) fn preflight_stage2_air_pcs_fri( + stage2_witness: &Stage2AirPcsFriWitnessV1, +) -> Result { + let relation = build_stage2_air_pcs_fri_relation(stage2_witness)?; + let evaluated = relation.shape.run(&relation.inputs, &[]); + if evaluated.public != relation.public { + bail!("Flock Stage 3 preflight disagrees with native verifier semantics"); + } + + let count = |value: usize, label: &str| { + u64::try_from(value) + .map_err(|error| anyhow::anyhow!("{label} exceeds u64: {error}")) + }; + let nu = count(relation.nu, "Flock table logarithm")?; + let shift = u32::try_from(nu).map_err(|error| { + anyhow::anyhow!("Flock table logarithm exceeds u32: {error}") + })?; + let table_capacity = 1u64.checked_shl(shift).ok_or_else(|| { + anyhow::anyhow!("Flock table logarithm {nu} exceeds the preflight report") + })?; + let field_sample_rows = relation + .slots + .field_sample + .map_or(0, |slot| evaluated.rows::(slot).len()); + let byte_window_rows = relation + .window_slot + .map_or(0, |slot| evaluated.rows::(slot).len()); + + Ok(Stage3RelationCensusV1 { + circuit_digest: relation.shape.circuit.digest(), + nu, + table_capacity, + relation_inputs: count(relation.inputs.len(), "relation input count")?, + public_values: count(relation.public.len(), "public-value count")?, + blake3_rows: count( + evaluated.rows::(relation.slots.blake3).len(), + "BLAKE3 row count", + )?, + digest_order_rows: count( + evaluated.rows::(relation.slots.order).len(), + "digest-order row count", + )?, + goldilocks_add_rows: count( + evaluated.rows::(relation.slots.add).len(), + "Goldilocks-add row count", + )?, + goldilocks_mul_rows: count( + evaluated.rows::(relation.slots.mul).len(), + "Goldilocks-mul row count", + )?, + lane_repack_rows: count( + evaluated.rows::(relation.slots.repack).len(), + "lane-repack row count", + )?, + canonical_goldilocks_rows: count( + evaluated + .rows::(relation.slots.canonical) + .len(), + "canonical-Goldilocks row count", + )?, + equality_rows: count( + evaluated.rows::(relation.slots.equality).len(), + "equality row count", + )?, + hash_sample_rows: count( + evaluated.rows::(relation.sample_slot).len(), + "hash-sample row count", + )?, + field_sample_rows: count(field_sample_rows, "field-sample row count")?, + u64_split_rows: count( + evaluated.rows::(relation.split_slot).len(), + "u64-split row count", + )?, + byte_window_rows: count(byte_window_rows, "byte-window row count")?, + }) +} + pub fn verify_stage2_air_pcs_fri_conformance( artifact: &Stage2AirPcsFriArtifactV1, ) -> Result<()> { @@ -4104,7 +4222,12 @@ fn validate_commit_phase_round_count( initial_log_height: u8, round_count: usize, ) -> Result<()> { - let maximum = usize::from(initial_log_height).min(MAX_COMMIT_PHASE_ROUNDS); + // Every round lowers the authenticated tree by one level. The height is + // already capped by `MAX_LOG_HEIGHT`, so this is a protocol-derived bound + // rather than a second, arbitrary implementation ceiling. The + // transcript-bound path additionally fixes the exact count through its + // folding-arity schedule and FRI parameters. + let maximum = usize::from(initial_log_height); if !(1..=maximum).contains(&round_count) { bail!("FRI commit-phase round count {round_count}; expected 1..={maximum}"); } @@ -5540,14 +5663,19 @@ mod tests { (path, current) } - fn transcript_bound_fri_fixture() -> ( + fn transcript_bound_fri_fixture_with_round_count( + round_count: usize, + ) -> ( Stage2TranscriptReplayV1, Stage2FriTranscriptReplayV1, FriCommitPhaseQueryV1, ) { let prefix = transcript_replay_fixture(); - let initial_log_height = 4u8; - let round_count = 3usize; + // Model the production binary schedule with logBlowup=2 and a constant + // final polynomial: global height = rounds + 2, while the first folded + // height is global height - 1. + assert!((1..=30).contains(&round_count)); + let initial_log_height = u8::try_from(round_count + 1).unwrap(); let trees: Vec<_> = (0..round_count) .map(|round| { zero_extension_tree(initial_log_height - u8::try_from(round).unwrap()) @@ -5592,6 +5720,14 @@ mod tests { (prefix, fri_transcript, query) } + fn transcript_bound_fri_fixture() -> ( + Stage2TranscriptReplayV1, + Stage2FriTranscriptReplayV1, + FriCommitPhaseQueryV1, + ) { + transcript_bound_fri_fixture_with_round_count(3) + } + fn transcript_bound_fri_all_queries_fixture() -> ( Stage2TranscriptReplayV1, Stage2FriTranscriptReplayV1, @@ -5944,6 +6080,63 @@ mod tests { assert!(wrong_beta.folded_results().is_err()); } + #[test] + fn deep_binary_fri_schedules_construct_and_evaluate() { + for round_count in [9, 16, 30] { + let (prefix, fri_transcript, query) = + transcript_bound_fri_fixture_with_round_count(round_count); + validate_commit_phase_structure(&query).unwrap(); + assert_eq!(query.rounds.len(), round_count); + + let challenges = fri_transcript.challenges(&prefix).unwrap(); + ensure_transcript_binds_fri_query( + &fri_transcript, + &challenges, + 0, + &query, + ) + .unwrap(); + let computation = compute_commit_phase(&query).unwrap(); + ensure_final_polynomial(&query, &computation).unwrap(); + + let relation = TranscriptBoundFriCommitPhaseRelation::build( + &prefix, + &fri_transcript, + &challenges, + 0, + &query, + &computation, + ) + .unwrap(); + let witness = relation.shape.run(&relation.inputs, &[]); + assert_eq!(witness.public, relation.public); + + let mut missing_last_round = query.clone(); + missing_last_round.rounds.pop(); + assert!( + ensure_transcript_binds_fri_query( + &fri_transcript, + &challenges, + 0, + &missing_last_round, + ) + .is_err() + ); + + let mut wrong_last_path = query; + wrong_last_path.rounds.last_mut().unwrap().opening_proof[0][0] ^= 1; + assert!( + ensure_transcript_binds_fri_query( + &fri_transcript, + &challenges, + 0, + &wrong_last_path, + ) + .is_err() + ); + } + } + #[test] fn commit_phase_parser_is_strict_before_crypto() { let query = commit_phase_fixture(); @@ -6187,12 +6380,10 @@ mod tests { #[test] fn real_stage2_root_lowers_to_the_combined_pcs_fri_relation() { - let (prepared, fri, _, _, _) = prepared_stage2_pcs_fixture(); + let (prepared, fri, vk_bytes, claim_bytes, proof_bytes) = + prepared_stage2_pcs_fixture(); let lowered = Stage2PcsFriWitnessV1::from_prepared(&prepared, &fri).unwrap(); - let air = - Stage2AirProgramV1::from_prepared(&prepared, &fri, &lowered.pcs_instance) - .unwrap(); assert_eq!(lowered.pcs_instance.batches.len(), 4); assert!( @@ -6209,30 +6400,16 @@ mod tests { let prefix_challenges = lowered.prefix.challenges().unwrap(); let fri_challenges = lowered.fri_transcript.challenges(&lowered.prefix).unwrap(); - let (fri_computations, pcs_computations) = - validate_all_transcript_bound_pcs_fri_queries( - &lowered.prefix, - &lowered.fri_transcript, - &fri_challenges, - prefix_challenges, - &lowered.pcs_instance, - &lowered.queries, - ) - .unwrap(); - let relation = - TranscriptBoundFriCommitPhaseRelation::build_all_with_pcs_and_air( - &lowered.prefix, - &lowered.fri_transcript, - &fri_challenges, - &lowered.pcs_instance, - &air, - &lowered.queries, - &fri_computations, - &pcs_computations, - ) + let report = crate::FlockStage3Backend + .preflight_stage2(&vk_bytes, &claim_bytes, &proof_bytes, &fri) .unwrap(); - let relation_witness = relation.shape.run(&relation.inputs, &[]); - assert_eq!(relation_witness.public, relation.public); + let census = &report.relation; + assert!(census.nu >= u64::try_from(NU).unwrap()); + assert!(census.blake3_rows > 0); + assert!(census.total_rows() > census.blake3_rows); + assert_eq!(report.advice.queries, u64::try_from(fri.num_queries).unwrap()); + assert_eq!(report.stage2_root_digest, prepared.statement().digest()); + assert!(report.to_string().contains("gate rows: blake3=")); let mut wrong_row = lowered.queries; wrong_row[0].pcs.batch_openings[0].opened_rows[0][0] ^= 1; diff --git a/flock-stage3/host/src/lib.rs b/flock-stage3/host/src/lib.rs index a313018e4..e222f0a4b 100644 --- a/flock-stage3/host/src/lib.rs +++ b/flock-stage3/host/src/lib.rs @@ -21,8 +21,12 @@ mod window; use aiur::vk_codec::AiurVerifyingKey; use anyhow::{Result, bail}; -use ix_terminal::{ValidatedStage2RootV1, validate_and_expand_root_inputs}; +use ix_terminal::{ + Stage2AdviceProfileV1, ValidatedStage2RootV1, + validate_and_expand_root_inputs, validate_root_inputs, +}; use multi_stark::types::FriParameters; +use std::fmt; pub use air::{Stage2ActiveAirCircuitV1, Stage2AirProgramV1}; pub use arithmetic::{ @@ -68,11 +72,11 @@ pub use fri::{ Stage2AirPcsFriArtifactV1, Stage2AirPcsFriWitnessV1, Stage2PcsBatchOpeningV1, Stage2PcsBatchV1, Stage2PcsFriWitnessV1, Stage2PcsInstanceV1, Stage2PcsMatrixV1, Stage2PcsOpeningPointV1, Stage2PcsQueryV1, - TranscriptBoundFriCommitPhaseArtifactV1, TranscriptBoundFriQueriesArtifactV1, - TranscriptBoundPcsFriQueriesArtifactV1, TranscriptBoundPcsFriQueryV1, - TranscriptBoundPcsReductionArtifactV1, prove_fri_commit_phase_conformance, - prove_fri_fold_conformance, prove_pcs_reduction_conformance, - prove_stage2_air_pcs_fri_conformance, + Stage3RelationCensusV1, TranscriptBoundFriCommitPhaseArtifactV1, + TranscriptBoundFriQueriesArtifactV1, TranscriptBoundPcsFriQueriesArtifactV1, + TranscriptBoundPcsFriQueryV1, TranscriptBoundPcsReductionArtifactV1, + prove_fri_commit_phase_conformance, prove_fri_fold_conformance, + prove_pcs_reduction_conformance, prove_stage2_air_pcs_fri_conformance, prove_transcript_bound_fri_commit_phase_conformance, prove_transcript_bound_fri_queries_conformance, prove_transcript_bound_pcs_fri_queries_conformance, @@ -86,7 +90,8 @@ pub use fri::{ verify_transcript_bound_pcs_reduction_conformance, }; use fri::{ - prove_stage2_air_pcs_fri_production, verify_stage2_air_pcs_fri_production, + preflight_stage2_air_pcs_fri, prove_stage2_air_pcs_fri_production, + verify_stage2_air_pcs_fri_production, }; pub use merkle::{ MERKLE_CONFORMANCE_ARTIFACT_MAGIC, MerkleConformanceArtifactV1, MerklePathV1, @@ -112,6 +117,85 @@ pub use typed_witness::{ Stage3TypedProofWitnessV1, Stage3TypedQueryProofV1, }; +/// Result of compiling and evaluating the complete Stage 3 relation without +/// invoking the Flock prover. This is the mandatory cost/compatibility gate +/// before attempting a production-sized aggregate root. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Stage3PreflightReportV1 { + pub stage2_root_digest: [u8; 32], + pub relation_digest: [u8; 32], + pub stage3_statement_digest: [u8; 32], + pub verifying_key_bytes: u64, + pub claim_bytes: u64, + pub compact_proof_bytes: u64, + pub advice: Stage2AdviceProfileV1, + pub relation: Stage3RelationCensusV1, +} + +impl fmt::Display for Stage3PreflightReportV1 { + fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + let hex = |digest| blake3::Hash::from_bytes(digest).to_hex(); + writeln!(formatter, "Flock Stage 3 preflight accepted the aggregate root")?; + writeln!(formatter, " Stage 2 root: {}", hex(self.stage2_root_digest))?; + writeln!(formatter, " relation: {}", hex(self.relation_digest))?; + writeln!( + formatter, + " Stage 3 stmt: {}", + hex(self.stage3_statement_digest) + )?; + writeln!( + formatter, + " transport: vk={} B, claim={} B, compact proof={} B, advice={} B", + self.verifying_key_bytes, + self.claim_bytes, + self.compact_proof_bytes, + self.advice.advice_bytes, + )?; + writeln!( + formatter, + " Stage 2 shape: circuits={}/{} active, queries={}, FRI rounds={}, input rounds/query={}", + self.advice.active_circuits, + self.advice.total_circuits, + self.advice.queries, + self.advice.fri_rounds, + self.advice.input_rounds_per_query, + )?; + writeln!( + formatter, + " openings: input siblings={}, FRI siblings={}, base values={}, FRI extension siblings={}, other extensions={}", + self.advice.input_merkle_siblings, + self.advice.fri_merkle_siblings, + self.advice.opened_base_values, + self.advice.fri_sibling_extension_values, + self.advice.other_extension_values, + )?; + writeln!( + formatter, + " Flock relation: nu={}, capacity/table={}, inputs={}, public={}, rows={}", + self.relation.nu, + self.relation.table_capacity, + self.relation.relation_inputs, + self.relation.public_values, + self.relation.total_rows(), + )?; + write!( + formatter, + " gate rows: blake3={}, order={}, add={}, mul={}, repack={}, canonical={}, equality={}, hash-sample={}, field-sample={}, split={}, window={}", + self.relation.blake3_rows, + self.relation.digest_order_rows, + self.relation.goldilocks_add_rows, + self.relation.goldilocks_mul_rows, + self.relation.lane_repack_rows, + self.relation.canonical_goldilocks_rows, + self.relation.equality_rows, + self.relation.hash_sample_rows, + self.relation.field_sample_rows, + self.relation.u64_split_rows, + self.relation.byte_window_rows, + ) + } +} + /// Host facade for the production Stage 3 relation. #[derive(Clone, Copy, Debug, Default)] pub struct FlockStage3Backend; @@ -127,9 +211,50 @@ impl FlockStage3Backend { proof_bytes: &[u8], fri: &FriParameters, ) -> Result { + // Fail before relation construction on an invalid compact root. The + // Flock relation repeats verification; this native pass is only the + // inexpensive guard needed before allocating a production-scale circuit. + validate_root_inputs(vk_bytes, claim_bytes, proof_bytes, fri)?; validate_and_expand_root_inputs(vk_bytes, claim_bytes, proof_bytes, fri) } + /// Validate a compact aggregate root, compile the complete specialised + /// relation, and evaluate every gate without running the Flock prover. + pub fn preflight_stage2( + self, + vk_bytes: &[u8], + claim_bytes: &[u8], + proof_bytes: &[u8], + fri: &FriParameters, + ) -> Result { + Stage3LoweringStatusV1::current().ensure_complete()?; + let prepared = + self.prepare_witness(vk_bytes, claim_bytes, proof_bytes, fri)?; + let witness = Stage2AirPcsFriWitnessV1::from_prepared(&prepared, fri)?; + let relation = preflight_stage2_air_pcs_fri(&witness)?; + let manifest = Stage3RelationManifestV1::for_prepared_and_program_digest( + &prepared, + relation.circuit_digest, + )?; + let statement = self.prepare_statement(&prepared, &manifest)?; + Ok(Stage3PreflightReportV1 { + stage2_root_digest: prepared.statement().digest(), + relation_digest: manifest.relation_digest()?, + stage3_statement_digest: statement.digest(), + verifying_key_bytes: u64::try_from(vk_bytes.len()).map_err(|error| { + anyhow::anyhow!("verifying-key length exceeds u64: {error}") + })?, + claim_bytes: u64::try_from(claim_bytes.len()).map_err(|error| { + anyhow::anyhow!("claim length exceeds u64: {error}") + })?, + compact_proof_bytes: u64::try_from(proof_bytes.len()).map_err( + |error| anyhow::anyhow!("compact-proof length exceeds u64: {error}"), + )?, + advice: prepared.advice_profile().clone(), + relation, + }) + } + /// Compile and content-address the complete relation for a prepared root. /// This builds the circuit but does not run the expensive Flock prover. pub fn relation_manifest( diff --git a/lakefile.lean b/lakefile.lean index 758b208dc..620d29402 100644 --- a/lakefile.lean +++ b/lakefile.lean @@ -60,12 +60,16 @@ def cargoArgs (testFfi : Bool := false) (net : Bool := false) : IO (Array String -- IX_NO_PAR=1 disables parallel; IX_CUDA=1/true/yes enables CUDA. let ixNoPar ← IO.getEnv "IX_NO_PAR" let ixCuda ← IO.getEnv "IX_CUDA" + -- IX_FLOCK=1 builds ix flock-root against the isolated Flock workspace. + -- Default builds retain a descriptive FFI stub. + let ixFlock ← IO.getEnv "IX_FLOCK" let mut features : Array String := #[] if ixNoPar != some "1" then features := features.push "parallel" if ixCuda == some "1" || ixCuda == some "true" || ixCuda == some "yes" then features := features.push "cuda" if net && !System.Platform.isOSX then features := features.push "net" if testFfi then features := features.push "test-ffi" + if ixFlock == some "1" then features := features.push "flock" IO.println s!"Ix Rust features: {if features.isEmpty then "none" else ",".intercalate features.toList}" let buildArgs := #["build", "--release", "-p", "ix-ffi"] if features.isEmpty then return buildArgs @@ -77,8 +81,14 @@ arguments, so changing `IX_CUDA` cannot silently reuse a differently-featured archive from a previous invocation. -/ def buildRustStatic (pkg : Package) (args : Array String) (tag : String) : SpawnM (Job FilePath) := do - let sources ← inputDir (pkg.dir / "crates") true fun path => + let coreSources ← inputDir (pkg.dir / "crates") true fun path => path.extension == some "rs" || path.fileName == "Cargo.toml" + -- Trace the optional path dependency so feature changes cannot reuse a stale + -- static archive. + let flockSources ← inputDir (pkg.dir / "flock-stage3") true fun path => + path.extension == some "rs" || path.fileName == "Cargo.toml" || + path.fileName == "Cargo.lock" + let sources := coreSources.zipWith (fun core flock => core ++ flock) flockSources let manifests := Job.collectArray #[ ← inputTextFile (pkg.dir / "Cargo.toml"), ← inputTextFile (pkg.dir / "Cargo.lock") From d51018ae604f4526ffbb1117b52ceb003610a390 Mon Sep 17 00:00:00 2001 From: "John C. Burnham" Date: Mon, 31 Aug 2026 07:10:25 -0400 Subject: [PATCH 03/10] test: report Flock Stage 3 phase timings Instrument the complete production regression across setup, proving, artifact transport, valid verification, and negative checks. Document the measured 524.315-second breakdown and clarify that corrupted-proof rejection performs a second full verifier run. --- flock-stage3/README.md | 24 ++++++++++----- flock-stage3/host/src/fri.rs | 57 ++++++++++++++++++++++++++++++++++-- 2 files changed, 72 insertions(+), 9 deletions(-) diff --git a/flock-stage3/README.md b/flock-stage3/README.md index c67eba0ce..3ebf235f4 100644 --- a/flock-stage3/README.md +++ b/flock-stage3/README.md @@ -61,15 +61,25 @@ an inactive leading circuit, active circuits at heights 8 and 4, an active preprocessed matrix, an 18-word claim lookup, nontrivial first-row/transition constraints, and two FRI queries. -On the debug profile, the complete production round trip produced: +On the debug profile, the instrumented complete production round trip produced: - Stage 3 artifact: **326,019 bytes**; -- encoded production payload: **325,893 bytes**; and -- prove + decode + valid verify + negative checks: **529.55 seconds**. - -The negative checks reject a different relation digest and a corrupted proof. -This size is expected: Stage 3 is the off-chain proof whose small fixed -verifier is compressed by Stage 4. It is not the sub-kilobyte Ethereum proof. +- encoded production payload: **325,893 bytes**; +- fixture setup: **0.010 seconds**; +- complete `prove_stage2` path: **491.624 seconds**; +- artifact encode and decode: **less than 0.001 seconds each**; +- valid cryptographic verification: **16.245 seconds**; +- rejection of a wrong relation statement: **0.000011 seconds**; +- rejection of a corrupted proof: **16.437 seconds**; and +- complete round trip: **524.315 seconds**. + +The complete prove-path timing includes native validation, witness lowering, +relation construction, Flock proving, and artifact packaging. Proving accounts +for 93.8% of the round trip. The negative-check time is almost entirely a +second full cryptographic verifier run against the corrupted proof; the wrong +relation digest fails before cryptography in 11 microseconds. This size is +expected: Stage 3 is the off-chain proof whose small fixed verifier is +compressed by Stage 4. It is not the sub-kilobyte Ethereum proof. Run the exact regression with: diff --git a/flock-stage3/host/src/fri.rs b/flock-stage3/host/src/fri.rs index 92d11f8e6..edaa6cf07 100644 --- a/flock-stage3/host/src/fri.rs +++ b/flock-stage3/host/src/fri.rs @@ -6429,32 +6429,85 @@ mod tests { #[test] #[ignore = "real production Flock proof of a complete Stage 2 verifier"] fn real_stage2_production_artifact_round_trip() { + let total_started = std::time::Instant::now(); + + let fixture_started = std::time::Instant::now(); let (prepared, fri, vk_bytes, claim_bytes, proof_bytes) = prepared_stage2_pcs_fixture(); + let fixture_elapsed = fixture_started.elapsed(); + let backend = crate::FlockStage3Backend; + + let prove_started = std::time::Instant::now(); let artifact = backend .prove_stage2(&vk_bytes, &claim_bytes, &proof_bytes, &fri) .expect("prove complete Stage 3 relation"); + let prove_elapsed = prove_started.elapsed(); + + let encode_started = std::time::Instant::now(); + let encoded = artifact.to_bytes(); + let encode_elapsed = encode_started.elapsed(); eprintln!( "Flock complete Stage 3 artifact: {} bytes (payload: {} bytes)", - artifact.to_bytes().len(), + encoded.len(), artifact.proof_bytes().len(), ); - let encoded = artifact.to_bytes(); + + let decode_started = std::time::Instant::now(); let decoded = crate::Stage3ArtifactV1::from_bytes(&encoded).unwrap(); + let decode_elapsed = decode_started.elapsed(); + + let valid_verify_started = std::time::Instant::now(); backend .verify_stage2(&decoded, decoded.statement()) .expect("verify complete Stage 3 relation"); + let valid_verify_elapsed = valid_verify_started.elapsed(); let wrong_relation = crate::Stage3StatementV1::new(prepared.statement(), [0xa5; 32]); + let wrong_relation_started = std::time::Instant::now(); assert!(backend.verify_stage2(&decoded, &wrong_relation).is_err()); + let wrong_relation_elapsed = wrong_relation_started.elapsed(); + let corrupt_decode_started = std::time::Instant::now(); let mut corrupted = encoded; let flip_at = corrupted.len() - 1; corrupted[flip_at] ^= 1; let corrupted = crate::Stage3ArtifactV1::from_bytes(&corrupted).unwrap(); + let corrupt_decode_elapsed = corrupt_decode_started.elapsed(); + + let corrupt_verify_started = std::time::Instant::now(); assert!(backend.verify_stage2(&corrupted, corrupted.statement()).is_err()); + let corrupt_verify_elapsed = corrupt_verify_started.elapsed(); + + let total_elapsed = total_started.elapsed(); + let negative_checks_elapsed = + wrong_relation_elapsed + corrupt_decode_elapsed + corrupt_verify_elapsed; + eprintln!( + concat!( + "Flock complete Stage 3 timings (seconds):\n", + " fixture setup: {:>10.3}\n", + " prove: {:>10.3}\n", + " artifact encode: {:>10.3}\n", + " artifact decode: {:>10.3}\n", + " valid cryptographic verification: {:>10.3}\n", + " reject wrong relation statement: {:>10.6}\n", + " corrupt and decode artifact: {:>10.3}\n", + " reject corrupted proof: {:>10.3}\n", + " all negative checks: {:>10.3}\n", + " total: {:>10.3}", + ), + fixture_elapsed.as_secs_f64(), + prove_elapsed.as_secs_f64(), + encode_elapsed.as_secs_f64(), + decode_elapsed.as_secs_f64(), + valid_verify_elapsed.as_secs_f64(), + wrong_relation_elapsed.as_secs_f64(), + corrupt_decode_elapsed.as_secs_f64(), + corrupt_verify_elapsed.as_secs_f64(), + negative_checks_elapsed.as_secs_f64(), + total_elapsed.as_secs_f64(), + ); } #[test] From 23f5a305b65a64806ba5c5b0c0f5ddb3cb3035a7 Mon Sep 17 00:00:00 2001 From: "John C. Burnham" Date: Mon, 31 Aug 2026 07:24:05 -0400 Subject: [PATCH 04/10] fix(nix): stabilize LSpec fetch and Flock source tracing --- flake.lock | 18 ++++++++++++++++++ flake.nix | 19 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/flake.lock b/flake.lock index 6a0edb596..4a8f9a87f 100644 --- a/flake.lock +++ b/flake.lock @@ -284,6 +284,23 @@ "type": "github" } }, + "lspec": { + "flake": false, + "locked": { + "lastModified": 1787413499, + "narHash": "sha256-EPGav84gN1Ki96SzVnH+TGjMAI1IGk4qsQVIaYsr4VM=", + "owner": "argumentcomputer", + "repo": "LSpec", + "rev": "ab4d5eb461941837f48eb891be755c8c73e89fdd", + "type": "github" + }, + "original": { + "owner": "argumentcomputer", + "repo": "LSpec", + "rev": "ab4d5eb461941837f48eb891be755c8c73e89fdd", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1765779637, @@ -399,6 +416,7 @@ "fenix": "fenix_2", "flake-parts": "flake-parts_2", "lean4-nix": "lean4-nix", + "lspec": "lspec", "nixpkgs": [ "lean4-nix", "nixpkgs" diff --git a/flake.nix b/flake.nix index 4e725b2c8..996a4b08d 100644 --- a/flake.nix +++ b/flake.nix @@ -40,6 +40,13 @@ inputs.lean4-nix.follows = "lean4-nix"; }; + # Fetch LSpec through the flake input machinery instead of lake2nix's + # unauthenticated builtins.fetchGit evaluation path. + lspec = { + url = "github:argumentcomputer/LSpec/ab4d5eb461941837f48eb891be755c8c73e89fdd"; + flake = false; + }; + # Zisk dev shell (cargo-zisk, ziskemu, RISC-V toolchain) for `zisk-guest`. zisk.url = "github:argumentcomputer/zisk.nix/blake3-precompile"; @@ -57,6 +64,7 @@ fenix, crane, blake3-lean, + lspec, zisk, sp1, ... @@ -189,6 +197,8 @@ ./Cargo.toml ./Cargo.lock (pkgs.lib.fileset.fileFilter (f: f.hasExt "rs" || f.hasExt "toml") ./crates) + ./flock-stage3/Cargo.lock + (pkgs.lib.fileset.fileFilter (f: f.hasExt "rs" || f.hasExt "toml") ./flock-stage3) (pkgs.lib.fileset.fileFilter (f: f.hasExt "lean") ./.) ]; }; @@ -212,6 +222,15 @@ }; depOverrideDeriv = { Blake3 = blake3-lean.packages.${system}.rust; + # Keep the root manifest authoritative for LSpec's inherited + # plausible dependency while sourcing LSpec from its locked, + # content-addressed flake input. + LSpec = lake2nix.mkLakeDerivation { + name = "LSpec"; + src = lspec; + deps = { inherit (lakeDeps) plausible; }; + buildLibrary = true; + }; }; }; # Shared Lake build args: patches out the Cargo build (Crane handles it) From bd4601364235b79c2c8cddb9cd43998b9bbf08ef Mon Sep 17 00:00:00 2001 From: "John C. Burnham" Date: Mon, 31 Aug 2026 07:33:06 -0400 Subject: [PATCH 05/10] perf(flock-stage3): eliminate padded prover overhead --- flock-stage3/Cargo.lock | 1 + flock-stage3/Cargo.toml | 1 + flock-stage3/host/Cargo.toml | 1 + flock-stage3/host/src/binding.rs | 2 +- flock-stage3/host/src/boolean.rs | 290 +++++++++++++++ flock-stage3/host/src/equality.rs | 13 +- flock-stage3/host/src/extension.rs | 23 +- flock-stage3/host/src/fri.rs | 467 +++++++++++++++++++----- flock-stage3/host/src/goldilocks.rs | 48 ++- flock-stage3/host/src/merkle.rs | 22 +- flock-stage3/host/src/multiplication.rs | 30 +- flock-stage3/host/src/transcript.rs | 61 +++- flock-stage3/host/src/window.rs | 32 +- 13 files changed, 859 insertions(+), 132 deletions(-) diff --git a/flock-stage3/Cargo.lock b/flock-stage3/Cargo.lock index 264ebe798..92c9b50bb 100644 --- a/flock-stage3/Cargo.lock +++ b/flock-stage3/Cargo.lock @@ -275,6 +275,7 @@ dependencies = [ "flock-prover", "ix-terminal", "multi-stark", + "rayon", "serde", ] diff --git a/flock-stage3/Cargo.toml b/flock-stage3/Cargo.toml index f519d67cc..a5cf3e04d 100644 --- a/flock-stage3/Cargo.toml +++ b/flock-stage3/Cargo.toml @@ -15,6 +15,7 @@ blake3 = "1.8.4" flock-prover = { git = "https://github.com/succinctlabs/flock", rev = "b310f35f35f68095537150a1c8c0a43caca9a29e" } ix-terminal = { path = "../crates/terminal" } multi-stark = { git = "https://github.com/argumentcomputer/multi-stark.git", rev = "2892243e674f9a0b3aca9004a8d00c79a23beec1" } +rayon = "1" serde = { version = "1", features = ["derive"] } [workspace.lints.rust] diff --git a/flock-stage3/host/Cargo.toml b/flock-stage3/host/Cargo.toml index 77c770687..d8c35001e 100644 --- a/flock-stage3/host/Cargo.toml +++ b/flock-stage3/host/Cargo.toml @@ -12,6 +12,7 @@ blake3 = { workspace = true } flock-prover = { workspace = true } ix-terminal = { workspace = true } multi-stark = { workspace = true } +rayon = { workspace = true } serde = { workspace = true } [lints] diff --git a/flock-stage3/host/src/binding.rs b/flock-stage3/host/src/binding.rs index d682ce5ec..b961d47aa 100644 --- a/flock-stage3/host/src/binding.rs +++ b/flock-stage3/host/src/binding.rs @@ -387,7 +387,7 @@ impl GateType for Blake3Gate { type Hint = (); fn table(&self) -> TableType { - TableType::from_block_r1cs(&blake3::build_block_r1cs(self.nu)) + crate::boolean::table_from_block_r1cs(blake3::build_block_r1cs(self.nu)) .with_io_schema(blake3::io_schema()) } diff --git a/flock-stage3/host/src/boolean.rs b/flock-stage3/host/src/boolean.rs index 45b6761f5..1eacee9e9 100644 --- a/flock-stage3/host/src/boolean.rs +++ b/flock-stage3/host/src/boolean.rs @@ -8,10 +8,31 @@ use std::sync::OnceLock; use flock_prover::{ + bits::transpose_8_u64s_to_64_bytes, field::F128, lincheck::pack_z_lincheck, r1cs::{BlockR1cs, SparseBinaryMatrix, WitnessLayout}, + schedule::{TableClass, TableType}, + scratch, + union::SlotWitnessDest, }; +use rayon::prelude::*; + +/// Move a freshly built Boolean R1CS into a union table without cloning its +/// sparse matrices. `TableType::from_block_r1cs` accepts a borrow and must +/// deep-copy all three matrices, which is especially costly for BLAKE3. +pub(crate) fn table_from_block_r1cs(r1cs: BlockR1cs) -> TableType { + TableType { + k_log: r1cs.k_log, + useful_bits: r1cs.useful_bits, + a_0: r1cs.a_0, + b_0: r1cs.b_0, + c_0: r1cs.c_0, + const_pin: r1cs.const_pin, + class: TableClass::Boolean, + io_schema: Vec::new(), + } +} #[derive(Clone, Debug)] struct BooleanOperation { @@ -270,6 +291,235 @@ pub(crate) fn generate_boolean_witness( ) } +/// Generate a partial-count Boolean witness directly into one union slot. +/// +/// The allocating compatibility driver above constructs three logical +/// `capacity * k` bit-vectors, applies both sparse matrices over every dummy +/// row, repacks all three vectors, and then makes the union copy them again. +/// Stage 3 tables are deliberately sparse, so that work is overwhelmingly +/// padding. This driver evaluates only declared rows, eight at a time (the +/// lincheck stripe's native grouping), and writes their packed words directly +/// into Flock's pooled union buffers. +pub(crate) fn generate_boolean_witness_into( + plan: &BooleanR1csPlan, + rows: &[T], + nu: usize, + dst: SlotWitnessDest<'_>, + fill_free: impl Fn(&T, &mut [bool]) + Send + Sync, +) -> Vec { + generate_boolean_rows_into( + plan.k_log, + plan.useful_bits, + &plan.a_rows, + &plan.b_rows, + rows, + nu, + dst, + |row, bits| plan.fill_row(bits, |bits| fill_free(row, bits)), + ) +} + +/// Low-level form of [`generate_boolean_witness_into`] for Boolean tables +/// whose matrices and row filler predate [`BooleanR1csPlan`]. +pub(crate) fn generate_boolean_rows_into( + k_log: usize, + useful_bits: usize, + a_rows: &[Vec], + b_rows: &[Vec], + rows: &[T], + nu: usize, + dst: SlotWitnessDest<'_>, + fill_row: impl Fn(&T, &mut [bool]) + Send + Sync, +) -> Vec { + const GROUP_ROWS: usize = 8; + const ZERO_CHUNK_WORDS: usize = 1 << 16; + + assert!(nu >= 3, "Flock lincheck requires at least eight rows"); + assert!(k_log >= 7, "BatchMajor Boolean tables need k_log >= 7"); + let capacity = 1usize << nu; + let k = 1usize << k_log; + assert!(rows.len() <= capacity); + assert!(useful_bits <= k); + assert_eq!(a_rows.len(), k); + assert_eq!(b_rows.len(), k); + + let chunks = k / 128; + let slot_words = capacity * chunks; + let useful_chunks = useful_bits.div_ceil(128); + let useful_words = useful_bits.div_ceil(64); + let stored_words = 2 * useful_chunks; + let SlotWitnessDest { z, a, b, elide_padding_writes } = dst; + for buffer in [&*z, &*a, &*b] { + assert_eq!(buffer.len(), slot_words, "Boolean slot destination length"); + } + + // When padding is observable, initialize it once with parallel contiguous + // stores. The merged union path marks it unread, so production normally + // skips this multi-gigabyte memset entirely. + if !elide_padding_writes { + rayon::join( + || { + z.par_chunks_mut(ZERO_CHUNK_WORDS) + .for_each(|chunk| chunk.fill(F128::ZERO)); + }, + || { + rayon::join( + || { + a.par_chunks_mut(ZERO_CHUNK_WORDS) + .for_each(|chunk| chunk.fill(F128::ZERO)); + }, + || { + b.par_chunks_mut(ZERO_CHUNK_WORDS) + .for_each(|chunk| chunk.fill(F128::ZERO)); + }, + ); + }, + ); + } + + let stripe_len = capacity * k / GROUP_ROWS; + let mut stripe = scratch::take_u8(stripe_len); + if !elide_padding_writes { + stripe.par_chunks_mut(1 << 20).for_each(|chunk| chunk.fill(0)); + } + + let z_ptr = SendPtr(z.as_mut_ptr()); + let a_ptr = SendPtr(a.as_mut_ptr()); + let b_ptr = SendPtr(b.as_mut_ptr()); + let stripe_ptr = SendPtr(stripe.as_mut_ptr()); + let groups = rows.len().div_ceil(GROUP_ROWS); + + (0..groups).into_par_iter().for_each_init( + || BooleanGroupScratch::new(k, stored_words), + |scratch, group| { + scratch.clear_words(); + let first_row = group * GROUP_ROWS; + let live = rows.len().saturating_sub(first_row).min(GROUP_ROWS); + for lane in 0..live { + scratch.z_bits.fill(false); + scratch.a_bits.fill(false); + scratch.b_bits.fill(false); + fill_row(&rows[first_row + lane], &mut scratch.z_bits); + for column in 0..useful_bits { + let a_bit = parity(&scratch.z_bits, &a_rows[column]); + let b_bit = parity(&scratch.z_bits, &b_rows[column]); + scratch.a_bits[column] = a_bit; + scratch.b_bits[column] = b_bit; + assert_eq!( + a_bit & b_bit, + scratch.z_bits[column], + "custom Boolean witness does not satisfy column {column}", + ); + } + for word in 0..useful_words { + let bit = word * 64; + scratch.z_words[word][lane] = pack_bool_word(&scratch.z_bits, bit); + scratch.a_words[word][lane] = pack_bool_word(&scratch.a_bits, bit); + scratch.b_words[word][lane] = pack_bool_word(&scratch.b_bits, bit); + } + } + + // Every group owns disjoint row positions in every chunk-column and a + // disjoint `k`-byte stripe block. The raw pointers avoid materializing + // and then copying a second capacity-sized set of slot buffers. + for chunk in 0..useful_chunks { + for lane in 0..live { + let at = (chunk << nu) + first_row + lane; + let word = 2 * chunk; + unsafe { + z_ptr.get().add(at).write(F128::new( + scratch.z_words[word][lane], + scratch.z_words[word + 1][lane], + )); + a_ptr.get().add(at).write(F128::new( + scratch.a_words[word][lane], + scratch.a_words[word + 1][lane], + )); + b_ptr.get().add(at).write(F128::new( + scratch.b_words[word][lane], + scratch.b_words[word + 1][lane], + )); + } + } + } + + let stripe_base = group * k; + for (word, lanes) in scratch.z_words.iter().take(useful_words).enumerate() + { + let out = unsafe { + std::slice::from_raw_parts_mut( + stripe_ptr.get().add(stripe_base + word * 64), + 64, + ) + }; + transpose_8_u64s_to_64_bytes(lanes, out); + } + if elide_padding_writes { + let tail_start = stripe_base + useful_words * 64; + let tail_len = k - useful_words * 64; + if tail_len != 0 { + unsafe { + std::slice::from_raw_parts_mut( + stripe_ptr.get().add(tail_start), + tail_len, + ) + .fill(0); + } + } + } + }, + ); + + stripe +} + +struct BooleanGroupScratch { + z_bits: Vec, + a_bits: Vec, + b_bits: Vec, + z_words: Vec<[u64; 8]>, + a_words: Vec<[u64; 8]>, + b_words: Vec<[u64; 8]>, +} + +impl BooleanGroupScratch { + fn new(k: usize, stored_words: usize) -> Self { + Self { + z_bits: vec![false; k], + a_bits: vec![false; k], + b_bits: vec![false; k], + z_words: vec![[0; 8]; stored_words], + a_words: vec![[0; 8]; stored_words], + b_words: vec![[0; 8]; stored_words], + } + } + + fn clear_words(&mut self) { + self.z_words.fill([0; 8]); + self.a_words.fill([0; 8]); + self.b_words.fill([0; 8]); + } +} + +#[derive(Clone, Copy)] +struct SendPtr(*mut T); + +unsafe impl Send for SendPtr {} +unsafe impl Sync for SendPtr {} + +impl SendPtr { + fn get(self) -> *mut T { + self.0 + } +} + +fn pack_bool_word(bits: &[bool], start: usize) -> u64 { + bits[start..start + 64] + .iter() + .enumerate() + .fold(0, |word, (bit, value)| word | (u64::from(*value) << bit)) +} + pub(crate) fn write_f128(bits: &mut [bool], offset: usize, value: F128) { assert!(offset + 128 <= bits.len()); for local in 0..64 { @@ -334,4 +584,44 @@ mod tests { assert!(r1cs.satisfies(&witness)); } } + + #[test] + fn in_place_partial_driver_matches_allocating_driver() { + let mut builder = BooleanR1csBuilder::new(7, 3); + builder.free_boolean_at(0); + builder.free_boolean_at(1); + let one = builder.alloc_constant_one(); + let product = builder.and(0, 1); + builder.write_xor(2, &[product, 0], one); + let plan = builder.finish(); + let rows = [(false, false), (true, false), (false, true), (true, true)]; + let nu = 4; + let fill = |row: &(bool, bool), bits: &mut [bool]| { + bits[0] = row.0; + bits[1] = row.1; + }; + let expected = generate_boolean_witness(&plan, &rows, nu, fill); + + let words = 1usize << (nu + plan.k_log() - 7); + let mut z = vec![F128::ZERO; words]; + let mut a = vec![F128::ZERO; words]; + let mut b = vec![F128::ZERO; words]; + let stripe = generate_boolean_witness_into( + &plan, + &rows, + nu, + SlotWitnessDest { + z: &mut z, + a: &mut a, + b: &mut b, + elide_padding_writes: false, + }, + fill, + ); + + assert_eq!(z, expected.0); + assert_eq!(a, expected.1); + assert_eq!(b, expected.2); + assert_eq!(stripe, expected.3); + } } diff --git a/flock-stage3/host/src/equality.rs b/flock-stage3/host/src/equality.rs index 60f80e13e..c74292abc 100644 --- a/flock-stage3/host/src/equality.rs +++ b/flock-stage3/host/src/equality.rs @@ -10,10 +10,12 @@ use flock_prover::{ field::F128, r1cs::BlockR1cs, schedule::{IoWord, TableType}, + union::SlotWitnessDest, }; use crate::boolean::{ - BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, write_f128, + BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness_into, + write_f128, }; const K_LOG: usize = 9; @@ -38,7 +40,7 @@ impl GateType for F128EqualityGate { type Hint = (); fn table(&self) -> TableType { - TableType::from_block_r1cs(&build_f128_equality_r1cs(self.nu)) + crate::boolean::table_from_block_r1cs(build_f128_equality_r1cs(self.nu)) .with_io_schema(vec![ IoWord::input(0), IoWord::input(1), @@ -67,12 +69,13 @@ pub(crate) fn build_f128_equality_r1cs(nu: usize) -> BlockR1cs { build_plan().block_r1cs(nu) } -pub(crate) fn generate_f128_equality_witness( +pub(crate) fn generate_f128_equality_witness_into( rows: &[F128EqualityRow], nu: usize, -) -> (Vec, Vec, Vec, Vec) { + dst: SlotWitnessDest<'_>, +) -> Vec { let plan = build_plan(); - generate_boolean_witness(&plan, rows, nu, |row, bits| { + generate_boolean_witness_into(&plan, rows, nu, dst, |row, bits| { write_f128(bits, LEFT_BASE, row.left); write_f128(bits, RIGHT_BASE, row.right); }) diff --git a/flock-stage3/host/src/extension.rs b/flock-stage3/host/src/extension.rs index 450ca1117..7b36800bd 100644 --- a/flock-stage3/host/src/extension.rs +++ b/flock-stage3/host/src/extension.rs @@ -11,11 +11,13 @@ use flock_prover::{ field::F128, r1cs::BlockR1cs, schedule::{IoWord, TableType}, + union::SlotWitnessDest, }; use crate::{ boolean::{ - BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, write_f128, + BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, + generate_boolean_witness_into, write_f128, }, goldilocks::{CanonicalGoldilocksPairGate, GoldilocksAddPairGate}, multiplication::{GoldilocksMulPairGate, goldilocks_mul}, @@ -50,16 +52,15 @@ impl GateType for GoldilocksLaneRepackGate { type Hint = (); fn table(&self) -> TableType { - TableType::from_block_r1cs(&build_lane_repack_r1cs(self.nu)).with_io_schema( - vec![ + crate::boolean::table_from_block_r1cs(build_lane_repack_r1cs(self.nu)) + .with_io_schema(vec![ IoWord::input(0), IoWord::input(1), IoWord::output(2), IoWord::output(3), IoWord::output(4), IoWord::output(5), - ], - ) + ]) } fn eval( @@ -99,6 +100,18 @@ pub(crate) fn generate_lane_repack_witness( }) } +pub(crate) fn generate_lane_repack_witness_into( + rows: &[GoldilocksLaneRepackRow], + nu: usize, + dst: SlotWitnessDest<'_>, +) -> Vec { + let plan = build_lane_repack_plan(); + generate_boolean_witness_into(&plan, rows, nu, dst, |row, bits| { + write_f128(bits, FIRST_BASE, row.first); + write_f128(bits, SECOND_BASE, row.second); + }) +} + fn build_lane_repack_plan() -> BooleanR1csPlan { let mut builder = BooleanR1csBuilder::new(REPACK_K_LOG, REPACK_COLUMNS); for column in FIRST_BASE..SECOND_BASE + 128 { diff --git a/flock-stage3/host/src/fri.rs b/flock-stage3/host/src/fri.rs index edaa6cf07..7f8954154 100644 --- a/flock-stage3/host/src/fri.rs +++ b/flock-stage3/host/src/fri.rs @@ -22,10 +22,11 @@ use flock_prover::{ challenger::FsChallenger, circuit::builder::{CircuitShape, ShapeBuilder, SlotId, Wire}, field::F128, - lincheck::LincheckCircuit, + lincheck::{CscCircuit, LincheckCircuit}, pcs::Commitment, proof::R1csProofCircuitMerged, prover::{self, UnionSlotProverInput}, + r1cs::BlockR1cs, r1cs_hashes::blake3 as flock_blake3, union::UnionInstance, verifier, @@ -37,8 +38,12 @@ use multi_stark::{ p3_field::{BasedVectorSpace, PrimeCharacteristicRing, PrimeField64}, types::{ExtVal, FriParameters, Val}, }; +use rayon::prelude::*; use serde::{Deserialize, Serialize}; -use std::collections::BTreeMap; +use std::{ + collections::BTreeMap, + sync::{Arc, Mutex, OnceLock}, +}; use crate::{ FRI_FOLD_CONFORMANCE_TRANSCRIPT_DOMAIN, @@ -55,23 +60,25 @@ use crate::{ pack8, pcs_params, }, equality::{ - F128EqualityGate, build_f128_equality_r1cs, generate_f128_equality_witness, + F128EqualityGate, build_f128_equality_r1cs, + generate_f128_equality_witness_into, }, extension::{ GoldilocksCircuitSlots, GoldilocksLaneRepackGate, build_lane_repack_r1cs, - generate_lane_repack_witness, + generate_lane_repack_witness_into, }, goldilocks::{ CanonicalGoldilocksPairGate, GOLDILOCKS_MODULUS, GoldilocksAddPairGate, build_canonical_pair_r1cs, build_goldilocks_add_r1cs, - generate_canonical_pair_witness, generate_goldilocks_add_witness, + generate_canonical_pair_witness_into, generate_goldilocks_add_witness_into, }, merkle::{ - DigestOrderGate, build_digest_order_r1cs, generate_digest_order_witness, + DigestOrderGate, build_digest_order_r1cs, + generate_digest_order_witness_into, }, multiplication::{ GoldilocksMulPairGate, build_goldilocks_mul_r1cs, - generate_goldilocks_mul_witness, goldilocks_mul, + generate_goldilocks_mul_witness_into, goldilocks_mul, }, transcript::{ FriTranscriptCircuitSlots, GoldilocksSampleGate, HashSampleGate, @@ -81,12 +88,12 @@ use crate::{ build_goldilocks_sample_r1cs, build_hash_sample_r1cs, build_u64_split_r1cs, constrain_hash, constrain_stage2_fri_transcript, constrain_stage2_transcript, fri_transcript_blake3_rows, - fri_transcript_split_rows, generate_goldilocks_sample_witness, - generate_hash_sample_witness, generate_u64_split_witness, hash_trace, - transcript_challenge_words, transcript_nu, + fri_transcript_split_rows, generate_goldilocks_sample_witness_into, + generate_hash_sample_witness_into, generate_u64_split_witness_into, + hash_trace, transcript_challenge_words, transcript_nu, }, window::{ - ByteWindowGate, build_byte_window_r1cs, generate_byte_window_witness, + ByteWindowGate, build_byte_window_r1cs, generate_byte_window_witness_into, }, }; @@ -1639,7 +1646,23 @@ fn prove_stage2_air_pcs_fri_with_domain( witness: &Stage2AirPcsFriWitnessV1, transcript_domain: &[u8], ) -> Result { - let relation = build_stage2_air_pcs_fri_relation(witness)?; + let trace = std::env::var_os("IX_FLOCK_TIMING").is_some(); + let total_started = std::time::Instant::now(); + let phase_started = std::time::Instant::now(); + let (relation, _) = rayon::join( + || cached_stage2_air_pcs_fri_relation(witness), + || { + stage3_linchecks(); + }, + ); + let relation = relation?; + if trace { + eprintln!( + " [stage3] relation build: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + } + let phase_started = std::time::Instant::now(); let proof_bundle_bytes = prove_fri_circuit( &relation.shape, relation.slots, @@ -1651,19 +1674,42 @@ fn prove_stage2_air_pcs_fri_with_domain( &relation.public, transcript_domain, )?; - Stage2AirPcsFriArtifactV1::from_parts( + if trace { + eprintln!( + " [stage3] circuit evaluate + prove: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + } + let artifact = Stage2AirPcsFriArtifactV1::from_parts( witness.clone(), relation.shape.circuit.digest(), proof_bundle_bytes, - ) + )?; + if trace { + eprintln!( + " [stage3] relation-to-artifact total: {:.2} ms", + total_started.elapsed().as_secs_f64() * 1e3, + ); + } + Ok(artifact) } fn build_stage2_air_pcs_fri_relation( witness: &Stage2AirPcsFriWitnessV1, ) -> Result { + let trace = std::env::var_os("IX_FLOCK_TIMING").is_some(); + let total_started = std::time::Instant::now(); let pcs_fri = &witness.pcs_fri; + let phase_started = std::time::Instant::now(); let prefix_challenges = pcs_fri.prefix.challenges()?; let fri_challenges = pcs_fri.fri_transcript.challenges(&pcs_fri.prefix)?; + if trace { + eprintln!( + " [stage3-relation] replay transcript: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + } + let phase_started = std::time::Instant::now(); let (fri_computations, pcs_computations) = validate_all_transcript_bound_pcs_fri_queries( &pcs_fri.prefix, @@ -1673,6 +1719,13 @@ fn build_stage2_air_pcs_fri_relation( &pcs_fri.pcs_instance, &pcs_fri.queries, )?; + if trace { + eprintln!( + " [stage3-relation] native PCS/FRI validation: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + } + let phase_started = std::time::Instant::now(); let relation = TranscriptBoundFriCommitPhaseRelation::build_all_with_pcs_and_air( &pcs_fri.prefix, @@ -1684,19 +1737,67 @@ fn build_stage2_air_pcs_fri_relation( &fri_computations, &pcs_computations, )?; + if trace { + eprintln!( + " [stage3-relation] build circuit shape: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + eprintln!( + " [stage3-relation] total: {:.2} ms", + total_started.elapsed().as_secs_f64() * 1e3, + ); + } + Ok(relation) +} + +/// Retain only the most recently used complete relation. The circuit shape is +/// immutable and value-independent once built, while the input/public vectors +/// in this relation are specific to one witness. Comparing the full witness +/// (rather than a digest) makes an exact hit safe for preflight, proving, and +/// post-hoc verification without introducing a cache-collision assumption. +fn cached_stage2_air_pcs_fri_relation( + witness: &Stage2AirPcsFriWitnessV1, +) -> Result> { + type Entry = + (Stage2AirPcsFriWitnessV1, Arc); + static CACHE: OnceLock>> = OnceLock::new(); + + let cache = CACHE.get_or_init(|| Mutex::new(None)); + let mut cached = + cache.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); + if let Some((cached_witness, relation)) = cached.as_ref() + && cached_witness == witness + { + if std::env::var_os("IX_FLOCK_TIMING").is_some() { + eprintln!(" [stage3-relation] exact-witness cache: hit"); + } + return Ok(Arc::clone(relation)); + } + + if std::env::var_os("IX_FLOCK_TIMING").is_some() { + eprintln!(" [stage3-relation] exact-witness cache: miss"); + } + let relation = Arc::new(build_stage2_air_pcs_fri_relation(witness)?); + *cached = Some((witness.clone(), Arc::clone(&relation))); Ok(relation) } pub(crate) fn stage2_air_pcs_fri_circuit_digest( witness: &Stage2AirPcsFriWitnessV1, ) -> Result<[u8; 32]> { - Ok(build_stage2_air_pcs_fri_relation(witness)?.shape.circuit.digest()) + Ok(cached_stage2_air_pcs_fri_relation(witness)?.shape.circuit.digest()) } pub(crate) fn preflight_stage2_air_pcs_fri( stage2_witness: &Stage2AirPcsFriWitnessV1, ) -> Result { - let relation = build_stage2_air_pcs_fri_relation(stage2_witness)?; + let (relation, _) = rayon::join( + || cached_stage2_air_pcs_fri_relation(stage2_witness), + || { + stage3_linchecks(); + }, + ); + let relation = relation?; let evaluated = relation.shape.run(&relation.inputs, &[]); if evaluated.public != relation.public { bail!("Flock Stage 3 preflight disagrees with native verifier semantics"); @@ -1793,7 +1894,13 @@ fn verify_stage2_air_pcs_fri_with_domain( transcript_domain: &[u8], ) -> Result<()> { let witness = &artifact.witness; - let relation = build_stage2_air_pcs_fri_relation(witness)?; + let (relation, _) = rayon::join( + || cached_stage2_air_pcs_fri_relation(witness), + || { + stage3_linchecks(); + }, + ); + let relation = relation?; if artifact.circuit_digest != relation.shape.circuit.digest() { bail!("Stage 2 AIR/PCS/FRI circuit digest mismatch"); } @@ -2834,6 +2941,9 @@ impl TranscriptBoundFriCommitPhaseRelation { pcs_instance: Option<&Stage2PcsInstanceV1>, air: Option<&Stage2AirProgramV1>, ) -> Result { + let trace = std::env::var_os("IX_FLOCK_TIMING").is_some(); + let total_started = std::time::Instant::now(); + let phase_started = std::time::Instant::now(); if selected.is_empty() { bail!("transcript-bound FRI relation has no selected queries"); } @@ -2854,6 +2964,13 @@ impl TranscriptBoundFriCommitPhaseRelation { if air.is_some() && pcs_instance.is_none() { bail!("AIR evaluation requires the transcript-bound PCS instance"); } + if trace { + eprintln!( + " [stage3-shape] validate structure: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + } + let phase_started = std::time::Instant::now(); let nu = transcript_bound_fri_nu( prefix, fri_transcript, @@ -2880,10 +2997,17 @@ impl TranscriptBoundFriCommitPhaseRelation { equality, field_sample: Some(field_sample_slot), }; + if trace { + eprintln!( + " [stage3-shape] size + declare slots: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + } // GoldilocksCircuitSlots declares its canonical-zero fixed input first. let mut inputs = vec![F128::ZERO]; let mut public = vec![F128::ZERO]; + let phase_started = std::time::Instant::now(); let prefix_region = constrain_stage2_transcript( &mut builder, TranscriptCircuitSlots { @@ -2900,7 +3024,14 @@ impl TranscriptBoundFriCommitPhaseRelation { builder.publish(challenge); } public.extend(transcript_challenge_words(prefix.challenges()?)); + if trace { + eprintln!( + " [stage3-shape] prefix transcript: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + } + let phase_started = std::time::Instant::now(); let fri_region = constrain_stage2_fri_transcript( &mut builder, FriTranscriptCircuitSlots { @@ -2932,7 +3063,14 @@ impl TranscriptBoundFriCommitPhaseRelation { .map(|bit| F128::new((index >> bit) & 1, 0)), ); } + if trace { + eprintln!( + " [stage3-shape] FRI transcript: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + } + let phase_started = std::time::Instant::now(); let data_zero = record_fixed(&mut builder, &mut inputs, &mut public, F128::ZERO); let equality_zero = @@ -2967,6 +3105,13 @@ impl TranscriptBoundFriCommitPhaseRelation { node_params, one, }; + if trace { + eprintln!( + " [stage3-shape] fixed wires: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + } + let phase_started = std::time::Instant::now(); if let Some(air) = air { constrain_stage2_air( &mut builder, @@ -2986,7 +3131,16 @@ impl TranscriptBoundFriCommitPhaseRelation { air, )?; } + if trace { + eprintln!( + " [stage3-shape] AIR constraints: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + } + let mut pcs_elapsed = std::time::Duration::ZERO; + let mut fri_elapsed = std::time::Duration::ZERO; for item in selected { + let phase_started = std::time::Instant::now(); let reduced_openings = if let Some(instance) = pcs_instance { Some(constrain_stage2_pcs_query( &mut builder, @@ -3005,6 +3159,8 @@ impl TranscriptBoundFriCommitPhaseRelation { } else { None }; + pcs_elapsed += phase_started.elapsed(); + let phase_started = std::time::Instant::now(); constrain_transcript_bound_fri_query( &mut builder, &arithmetic, @@ -3017,11 +3173,33 @@ impl TranscriptBoundFriCommitPhaseRelation { item.computation, reduced_openings.as_ref(), ); + fri_elapsed += phase_started.elapsed(); + } + if trace { + eprintln!( + " [stage3-shape] PCS query constraints: {:.2} ms", + pcs_elapsed.as_secs_f64() * 1e3, + ); + eprintln!( + " [stage3-shape] FRI query constraints: {:.2} ms", + fri_elapsed.as_secs_f64() * 1e3, + ); } + let phase_started = std::time::Instant::now(); let shape = builder.finish().map_err(|error| { anyhow::anyhow!("build transcript-bound FRI circuit: {error:?}") })?; + if trace { + eprintln!( + " [stage3-shape] finish builder: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + eprintln!( + " [stage3-shape] total: {:.2} ms", + total_started.elapsed().as_secs_f64() * 1e3, + ); + } Ok(Self { shape, slots, @@ -3744,6 +3922,76 @@ fn constrain_authenticated_fold( current } +struct Stage3Linchecks { + blake3: CscCircuit, + order: CscCircuit, + add: CscCircuit, + mul: CscCircuit, + repack: CscCircuit, + canonical: CscCircuit, + equality: CscCircuit, + sample: CscCircuit, + field_sample: CscCircuit, + split: CscCircuit, + window: CscCircuit, +} + +/// CSC transposes depend only on each table's inner Boolean matrices, not on +/// the shared outer-row logarithm. Build them once for the process and reuse +/// them across proving, verification, and every Stage 3 relation size. +fn stage3_linchecks() -> &'static Stage3Linchecks { + static CACHE: OnceLock = OnceLock::new(); + CACHE.get_or_init(|| { + let builders: [fn(usize) -> BlockR1cs; 11] = [ + flock_blake3::build_block_r1cs, + build_digest_order_r1cs, + build_goldilocks_add_r1cs, + build_goldilocks_mul_r1cs, + build_lane_repack_r1cs, + build_canonical_pair_r1cs, + build_f128_equality_r1cs, + build_hash_sample_r1cs, + build_goldilocks_sample_r1cs, + build_u64_split_r1cs, + build_byte_window_r1cs, + ]; + let circuits: Vec<_> = builders + .into_par_iter() + .map(|build| { + let r1cs = build(NU); + CscCircuit::from_matrices(&r1cs.a_0, &r1cs.b_0) + .with_const_pin(r1cs.const_pin) + }) + .collect(); + let [ + blake3, + order, + add, + mul, + repack, + canonical, + equality, + sample, + field_sample, + split, + window, + ] = circuits.try_into().ok().expect("eleven Stage 3 lincheck circuits"); + Stage3Linchecks { + blake3, + order, + add, + mul, + repack, + canonical, + equality, + sample, + field_sample, + split, + window, + } + }) +} + #[allow(clippy::too_many_arguments)] fn prove_fri_circuit( shape: &CircuitShape, @@ -3756,10 +4004,19 @@ fn prove_fri_circuit( expected_public: &[F128], transcript_domain: &[u8], ) -> Result> { + let trace = std::env::var_os("IX_FLOCK_TIMING").is_some(); + let total_started = std::time::Instant::now(); + let phase_started = std::time::Instant::now(); let witness = shape.run(inputs, &[]); if witness.public != expected_public { bail!("Flock authenticated-FRI circuit disagrees with native semantics"); } + if trace { + eprintln!( + " [stage3-circuit] evaluate rows: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + } let blake3_rows = witness.rows::(slots.blake3); let order_rows = witness.rows::(slots.order); let add_rows = witness.rows::(slots.add); @@ -3776,76 +4033,82 @@ fn prove_fri_circuit( let window_rows = window_slot.map(|slot| witness.rows::(slot)); - let blake3_r1cs = flock_blake3::build_block_r1cs(nu); - let blake3_lincheck = blake3_r1cs.csc_lincheck_circuit(); - let order_r1cs = build_digest_order_r1cs(nu); - let order_lincheck = order_r1cs.csc_lincheck_circuit(); - let add_r1cs = build_goldilocks_add_r1cs(nu); - let add_lincheck = add_r1cs.csc_lincheck_circuit(); - let mul_r1cs = build_goldilocks_mul_r1cs(nu); - let mul_lincheck = mul_r1cs.csc_lincheck_circuit(); - let repack_r1cs = build_lane_repack_r1cs(nu); - let repack_lincheck = repack_r1cs.csc_lincheck_circuit(); - let canonical_r1cs = build_canonical_pair_r1cs(nu); - let canonical_lincheck = canonical_r1cs.csc_lincheck_circuit(); - let equality_r1cs = build_f128_equality_r1cs(nu); - let equality_lincheck = equality_r1cs.csc_lincheck_circuit(); - let sample_r1cs = build_hash_sample_r1cs(nu); - let sample_lincheck = sample_r1cs.csc_lincheck_circuit(); - let field_sample_r1cs = build_goldilocks_sample_r1cs(nu); - let field_sample_lincheck = field_sample_r1cs.csc_lincheck_circuit(); - let split_r1cs = build_u64_split_r1cs(nu); - let split_lincheck = split_r1cs.csc_lincheck_circuit(); - let window_r1cs = build_byte_window_r1cs(nu); - let window_lincheck = window_r1cs.csc_lincheck_circuit(); + let phase_started = std::time::Instant::now(); + let linchecks = stage3_linchecks(); + let blake3_lincheck = &linchecks.blake3; + let order_lincheck = &linchecks.order; + let add_lincheck = &linchecks.add; + let mul_lincheck = &linchecks.mul; + let repack_lincheck = &linchecks.repack; + let canonical_lincheck = &linchecks.canonical; + let equality_lincheck = &linchecks.equality; + let sample_lincheck = &linchecks.sample; + let field_sample_lincheck = &linchecks.field_sample; + let split_lincheck = &linchecks.split; + let window_lincheck = &linchecks.window; + if trace { + eprintln!( + " [stage3-circuit] compile R1CS/lincheck: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + } + let phase_started = std::time::Instant::now(); let mut slot_inputs = vec![ ( shape.registry_slot(slots.blake3), - UnionSlotProverInput::new( - flock_blake3::generate_witness_batch_major_partial(blake3_rows, nu), + UnionSlotProverInput::in_place( + move |dst| { + flock_blake3::generate_witness_batch_major_partial_into( + blake3_rows, + nu, + dst, + ) + }, blake3_lincheck, ), ), ( shape.registry_slot(slots.order), - UnionSlotProverInput::new( - generate_digest_order_witness(order_rows, nu), + UnionSlotProverInput::in_place( + move |dst| generate_digest_order_witness_into(order_rows, nu, dst), order_lincheck, ), ), ( shape.registry_slot(slots.add), - UnionSlotProverInput::new( - generate_goldilocks_add_witness(add_rows, nu), + UnionSlotProverInput::in_place( + move |dst| generate_goldilocks_add_witness_into(add_rows, nu, dst), add_lincheck, ), ), ( shape.registry_slot(slots.mul), - UnionSlotProverInput::new( - generate_goldilocks_mul_witness(mul_rows, nu), + UnionSlotProverInput::in_place( + move |dst| generate_goldilocks_mul_witness_into(mul_rows, nu, dst), mul_lincheck, ), ), ( shape.registry_slot(slots.repack), - UnionSlotProverInput::new( - generate_lane_repack_witness(repack_rows, nu), + UnionSlotProverInput::in_place( + move |dst| generate_lane_repack_witness_into(repack_rows, nu, dst), repack_lincheck, ), ), ( shape.registry_slot(slots.canonical), - UnionSlotProverInput::new( - generate_canonical_pair_witness(canonical_rows, nu), + UnionSlotProverInput::in_place( + move |dst| { + generate_canonical_pair_witness_into(canonical_rows, nu, dst) + }, canonical_lincheck, ), ), ( shape.registry_slot(slots.equality), - UnionSlotProverInput::new( - generate_f128_equality_witness(equality_rows, nu), + UnionSlotProverInput::in_place( + move |dst| generate_f128_equality_witness_into(equality_rows, nu, dst), equality_lincheck, ), ), @@ -3853,8 +4116,8 @@ fn prove_fri_circuit( if let (Some(slot), Some(rows)) = (sample_slot, sample_rows) { slot_inputs.push(( shape.registry_slot(slot), - UnionSlotProverInput::new( - generate_hash_sample_witness(rows, nu), + UnionSlotProverInput::in_place( + move |dst| generate_hash_sample_witness_into(rows, nu, dst), sample_lincheck, ), )); @@ -3862,8 +4125,8 @@ fn prove_fri_circuit( if let (Some(slot), Some(rows)) = (slots.field_sample, field_sample_rows) { slot_inputs.push(( shape.registry_slot(slot), - UnionSlotProverInput::new( - generate_goldilocks_sample_witness(rows, nu), + UnionSlotProverInput::in_place( + move |dst| generate_goldilocks_sample_witness_into(rows, nu, dst), field_sample_lincheck, ), )); @@ -3871,8 +4134,8 @@ fn prove_fri_circuit( if let (Some(slot), Some(rows)) = (split_slot, split_rows) { slot_inputs.push(( shape.registry_slot(slot), - UnionSlotProverInput::new( - generate_u64_split_witness(rows, nu), + UnionSlotProverInput::in_place( + move |dst| generate_u64_split_witness_into(rows, nu, dst), split_lincheck, ), )); @@ -3880,8 +4143,8 @@ fn prove_fri_circuit( if let (Some(slot), Some(rows)) = (window_slot, window_rows) { slot_inputs.push(( shape.registry_slot(slot), - UnionSlotProverInput::new( - generate_byte_window_witness(rows, nu), + UnionSlotProverInput::in_place( + move |dst| generate_byte_window_witness_into(rows, nu, dst), window_lincheck, ), )); @@ -3891,6 +4154,13 @@ fn prove_fri_circuit( let union = UnionInstance::new(&shape.registry, shape.counts.clone()); let params = pcs_params(&union); let mut challenger = FsChallenger::with_chained_blake3(transcript_domain); + if trace { + eprintln!( + " [stage3-circuit] assemble prover inputs: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + } + let phase_started = std::time::Instant::now(); let (proof, commitment, _) = prover::prove_fast_ligerito_union_circuit( &union, &shape.circuit, @@ -3900,11 +4170,28 @@ fn prove_fri_circuit( Vec::new(), &mut challenger, ); + if trace { + eprintln!( + " [stage3-circuit] Flock prove: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + } + let phase_started = std::time::Instant::now(); let proof_bundle_bytes = encode_bundle(&FriFoldProofBundle { commitment, proof })?; if proof_bundle_bytes.len() > MAX_BUNDLE_BYTES { bail!("Flock authenticated-FRI proof exceeds {MAX_BUNDLE_BYTES} bytes"); } + if trace { + eprintln!( + " [stage3-circuit] encode proof: {:.2} ms", + phase_started.elapsed().as_secs_f64() * 1e3, + ); + eprintln!( + " [stage3-circuit] total: {:.2} ms", + total_started.elapsed().as_secs_f64() * 1e3, + ); + } Ok(proof_bundle_bytes) } @@ -3915,35 +4202,25 @@ fn verify_fri_circuit( sample_slot: Option, split_slot: Option, window_slot: Option, - nu: usize, + _nu: usize, public: &[F128], proof_bundle_bytes: &[u8], transcript_domain: &[u8], ) -> Result<()> { let bundle = decode_bundle(proof_bundle_bytes) .context("decode Flock authenticated-FRI conformance proof bundle")?; - let blake3_r1cs = flock_blake3::build_block_r1cs(nu); - let blake3_lincheck = blake3_r1cs.csc_lincheck_circuit(); - let order_r1cs = build_digest_order_r1cs(nu); - let order_lincheck = order_r1cs.csc_lincheck_circuit(); - let add_r1cs = build_goldilocks_add_r1cs(nu); - let add_lincheck = add_r1cs.csc_lincheck_circuit(); - let mul_r1cs = build_goldilocks_mul_r1cs(nu); - let mul_lincheck = mul_r1cs.csc_lincheck_circuit(); - let repack_r1cs = build_lane_repack_r1cs(nu); - let repack_lincheck = repack_r1cs.csc_lincheck_circuit(); - let canonical_r1cs = build_canonical_pair_r1cs(nu); - let canonical_lincheck = canonical_r1cs.csc_lincheck_circuit(); - let equality_r1cs = build_f128_equality_r1cs(nu); - let equality_lincheck = equality_r1cs.csc_lincheck_circuit(); - let sample_r1cs = build_hash_sample_r1cs(nu); - let sample_lincheck = sample_r1cs.csc_lincheck_circuit(); - let field_sample_r1cs = build_goldilocks_sample_r1cs(nu); - let field_sample_lincheck = field_sample_r1cs.csc_lincheck_circuit(); - let split_r1cs = build_u64_split_r1cs(nu); - let split_lincheck = split_r1cs.csc_lincheck_circuit(); - let window_r1cs = build_byte_window_r1cs(nu); - let window_lincheck = window_r1cs.csc_lincheck_circuit(); + let lincheck_cache = stage3_linchecks(); + let blake3_lincheck = &lincheck_cache.blake3; + let order_lincheck = &lincheck_cache.order; + let add_lincheck = &lincheck_cache.add; + let mul_lincheck = &lincheck_cache.mul; + let repack_lincheck = &lincheck_cache.repack; + let canonical_lincheck = &lincheck_cache.canonical; + let equality_lincheck = &lincheck_cache.equality; + let sample_lincheck = &lincheck_cache.sample; + let field_sample_lincheck = &lincheck_cache.field_sample; + let split_lincheck = &lincheck_cache.split; + let window_lincheck = &lincheck_cache.window; let mut linchecks: Vec<(usize, &dyn LincheckCircuit)> = vec![ (shape.registry_slot(slots.blake3), blake3_lincheck), @@ -6438,11 +6715,29 @@ mod tests { let backend = crate::FlockStage3Backend; + let preflight_started = std::time::Instant::now(); + let preflight = backend + .preflight_stage2(&vk_bytes, &claim_bytes, &proof_bytes, &fri) + .expect("preflight complete Stage 3 relation"); + let preflight_elapsed = preflight_started.elapsed(); + let prove_started = std::time::Instant::now(); let artifact = backend .prove_stage2(&vk_bytes, &claim_bytes, &proof_bytes, &fri) .expect("prove complete Stage 3 relation"); let prove_elapsed = prove_started.elapsed(); + assert_eq!( + artifact.statement().stage2_root_digest(), + &preflight.stage2_root_digest, + ); + assert_eq!( + artifact.statement().relation_digest(), + &preflight.relation_digest, + ); + assert_eq!( + artifact.statement().digest(), + preflight.stage3_statement_digest + ); let encode_started = std::time::Instant::now(); let encoded = artifact.to_bytes(); @@ -6487,7 +6782,8 @@ mod tests { concat!( "Flock complete Stage 3 timings (seconds):\n", " fixture setup: {:>10.3}\n", - " prove: {:>10.3}\n", + " relation preflight/setup: {:>10.3}\n", + " proof generation: {:>10.3}\n", " artifact encode: {:>10.3}\n", " artifact decode: {:>10.3}\n", " valid cryptographic verification: {:>10.3}\n", @@ -6498,6 +6794,7 @@ mod tests { " total: {:>10.3}", ), fixture_elapsed.as_secs_f64(), + preflight_elapsed.as_secs_f64(), prove_elapsed.as_secs_f64(), encode_elapsed.as_secs_f64(), decode_elapsed.as_secs_f64(), diff --git a/flock-stage3/host/src/goldilocks.rs b/flock-stage3/host/src/goldilocks.rs index fa4253f36..cf57b4d82 100644 --- a/flock-stage3/host/src/goldilocks.rs +++ b/flock-stage3/host/src/goldilocks.rs @@ -12,10 +12,12 @@ use flock_prover::{ lincheck::pack_z_lincheck, r1cs::{BlockR1cs, SparseBinaryMatrix, WitnessLayout}, schedule::{IoWord, TableType}, + union::SlotWitnessDest, }; use crate::boolean::{ - BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, + BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_rows_into, + generate_boolean_witness, generate_boolean_witness_into, write_f128 as write_boolean_f128, }; @@ -57,7 +59,7 @@ impl GateType for CanonicalGoldilocksPairGate { type Hint = (); fn table(&self) -> TableType { - TableType::from_block_r1cs(&build_canonical_pair_r1cs(self.nu)) + crate::boolean::table_from_block_r1cs(build_canonical_pair_r1cs(self.nu)) .with_io_schema(vec![IoWord::input(0), IoWord::output(1)]) } @@ -151,6 +153,24 @@ pub(crate) fn generate_canonical_pair_witness( ) } +pub(crate) fn generate_canonical_pair_witness_into( + rows: &[CanonicalGoldilocksPairRow], + nu: usize, + dst: SlotWitnessDest<'_>, +) -> Vec { + let r1cs = build_canonical_pair_r1cs(nu); + generate_boolean_rows_into( + r1cs.k_log, + r1cs.useful_bits, + &r1cs.a_0.rows, + &r1cs.b_0.rows, + rows, + nu, + dst, + |row, bits| fill_logical_row(bits, row.0), + ) +} + /// One row of two lane-wise Goldilocks additions packed into `F128` words. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub(crate) struct GoldilocksAddPairRow { @@ -174,7 +194,7 @@ impl GateType for GoldilocksAddPairGate { type Hint = (); fn table(&self) -> TableType { - TableType::from_block_r1cs(&build_goldilocks_add_r1cs(self.nu)) + crate::boolean::table_from_block_r1cs(build_goldilocks_add_r1cs(self.nu)) .with_io_schema(vec![ IoWord::input(0), IoWord::input(1), @@ -214,19 +234,35 @@ struct GoldilocksAddPlan { } pub(crate) fn build_goldilocks_add_r1cs(nu: usize) -> BlockR1cs { - build_goldilocks_add_plan().boolean.block_r1cs(nu) + goldilocks_add_plan().boolean.block_r1cs(nu) } pub(crate) fn generate_goldilocks_add_witness( rows: &[GoldilocksAddPairRow], nu: usize, ) -> (Vec, Vec, Vec, Vec) { - let plan = build_goldilocks_add_plan(); + let plan = goldilocks_add_plan(); generate_boolean_witness(&plan.boolean, rows, nu, |row, bits| { - fill_goldilocks_add_row(&plan, *row, bits) + fill_goldilocks_add_row(plan, *row, bits) }) } +pub(crate) fn generate_goldilocks_add_witness_into( + rows: &[GoldilocksAddPairRow], + nu: usize, + dst: SlotWitnessDest<'_>, +) -> Vec { + let plan = goldilocks_add_plan(); + generate_boolean_witness_into(&plan.boolean, rows, nu, dst, |row, bits| { + fill_goldilocks_add_row(plan, *row, bits) + }) +} + +fn goldilocks_add_plan() -> &'static GoldilocksAddPlan { + static PLAN: OnceLock = OnceLock::new(); + PLAN.get_or_init(build_goldilocks_add_plan) +} + fn build_goldilocks_add_plan() -> GoldilocksAddPlan { let mut builder = BooleanR1csBuilder::new(ADD_K_LOG, ADD_RESERVED_COLUMNS); for column in ADD_LEFT_BASE..ADD_RESULT_BASE + 128 { diff --git a/flock-stage3/host/src/merkle.rs b/flock-stage3/host/src/merkle.rs index 92c2d82ab..5c0186c14 100644 --- a/flock-stage3/host/src/merkle.rs +++ b/flock-stage3/host/src/merkle.rs @@ -20,7 +20,7 @@ use flock_prover::{ r1cs::BlockR1cs, r1cs_hashes::blake3 as flock_blake3, schedule::{IoWord, TableType}, - union::UnionInstance, + union::{SlotWitnessDest, UnionInstance}, verifier, }; use serde::{Deserialize, Serialize}; @@ -32,7 +32,8 @@ use crate::{ pack8, pcs_params, }, boolean::{ - BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, write_f128, + BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, + generate_boolean_witness_into, write_f128, }, }; @@ -353,7 +354,7 @@ impl GateType for DigestOrderGate { type Hint = (); fn table(&self) -> TableType { - TableType::from_block_r1cs(&build_digest_order_r1cs(self.nu)) + crate::boolean::table_from_block_r1cs(build_digest_order_r1cs(self.nu)) .with_io_schema(vec![ IoWord::input(0), IoWord::input(1), @@ -412,6 +413,21 @@ pub(crate) fn generate_digest_order_witness( }) } +pub(crate) fn generate_digest_order_witness_into( + rows: &[DigestOrderRow], + nu: usize, + dst: SlotWitnessDest<'_>, +) -> Vec { + let plan = build_digest_order_plan(); + generate_boolean_witness_into(&plan, rows, nu, dst, |row, bits| { + bits[BIT_BASE] = row.direction; + write_f128(bits, CURRENT_BASE, row.current[0]); + write_f128(bits, CURRENT_BASE + 128, row.current[1]); + write_f128(bits, SIBLING_BASE, row.sibling[0]); + write_f128(bits, SIBLING_BASE + 128, row.sibling[1]); + }) +} + fn build_digest_order_plan() -> BooleanR1csPlan { let mut builder = BooleanR1csBuilder::new(ORDER_K_LOG, ORDER_RESERVED_COLUMNS); diff --git a/flock-stage3/host/src/multiplication.rs b/flock-stage3/host/src/multiplication.rs index da7e040bf..9f8f42e02 100644 --- a/flock-stage3/host/src/multiplication.rs +++ b/flock-stage3/host/src/multiplication.rs @@ -12,16 +12,20 @@ //! before one ripple pass; this is substantially smaller than adding 64 //! shifted partial-product rows sequentially. +use std::sync::OnceLock; + use flock_prover::{ circuit::builder::{GateType, SlotWitness}, field::F128, r1cs::BlockR1cs, schedule::{IoWord, TableType}, + union::SlotWitnessDest, }; use crate::{ boolean::{ - BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, write_f128, + BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, + generate_boolean_witness_into, write_f128, }, goldilocks::GOLDILOCKS_MODULUS, }; @@ -62,7 +66,7 @@ impl GateType for GoldilocksMulPairGate { type Hint = (); fn table(&self) -> TableType { - TableType::from_block_r1cs(&build_goldilocks_mul_r1cs(self.nu)) + crate::boolean::table_from_block_r1cs(build_goldilocks_mul_r1cs(self.nu)) .with_io_schema(vec![ IoWord::input(0), IoWord::input(1), @@ -104,19 +108,35 @@ struct GoldilocksMulPlan { } pub(crate) fn build_goldilocks_mul_r1cs(nu: usize) -> BlockR1cs { - build_goldilocks_mul_plan().boolean.block_r1cs(nu) + goldilocks_mul_plan().boolean.block_r1cs(nu) } pub(crate) fn generate_goldilocks_mul_witness( rows: &[GoldilocksMulPairRow], nu: usize, ) -> (Vec, Vec, Vec, Vec) { - let plan = build_goldilocks_mul_plan(); + let plan = goldilocks_mul_plan(); generate_boolean_witness(&plan.boolean, rows, nu, |row, bits| { - fill_goldilocks_mul_row(&plan, *row, bits) + fill_goldilocks_mul_row(plan, *row, bits) + }) +} + +pub(crate) fn generate_goldilocks_mul_witness_into( + rows: &[GoldilocksMulPairRow], + nu: usize, + dst: SlotWitnessDest<'_>, +) -> Vec { + let plan = goldilocks_mul_plan(); + generate_boolean_witness_into(&plan.boolean, rows, nu, dst, |row, bits| { + fill_goldilocks_mul_row(plan, *row, bits) }) } +fn goldilocks_mul_plan() -> &'static GoldilocksMulPlan { + static PLAN: OnceLock = OnceLock::new(); + PLAN.get_or_init(build_goldilocks_mul_plan) +} + fn build_goldilocks_mul_plan() -> GoldilocksMulPlan { let mut builder = BooleanR1csBuilder::new(MUL_K_LOG, RESERVED_COLUMNS); for column in LEFT_BASE..RESULT_BASE + 128 { diff --git a/flock-stage3/host/src/transcript.rs b/flock-stage3/host/src/transcript.rs index 407436db8..61b62fd34 100644 --- a/flock-stage3/host/src/transcript.rs +++ b/flock-stage3/host/src/transcript.rs @@ -39,7 +39,7 @@ use flock_prover::{ fs_chain::{CvSource, FsChain, FsChainTrace}, }, schedule::{IoWord, TableType}, - union::UnionInstance, + union::{SlotWitnessDest, UnionInstance}, verifier, }; use ix_terminal::{ValidatedStage2RootV1, fri_parameter_words}; @@ -50,7 +50,8 @@ use crate::{ FlockConfigV1, STAGE2_TRANSCRIPT_CONFORMANCE_TRANSCRIPT_DOMAIN, binding::{Blake3Gate, IV, pack_bytes, pack_params, pack8, pcs_params}, boolean::{ - BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, write_f128, + BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, + generate_boolean_witness_into, write_f128, }, goldilocks::{ CanonicalGoldilocksPairGate, GOLDILOCKS_MODULUS, build_canonical_pair_r1cs, @@ -563,7 +564,7 @@ impl GateType for HashSampleGate { type Hint = (); fn table(&self) -> TableType { - TableType::from_block_r1cs(&build_hash_sample_r1cs(self.nu)) + crate::boolean::table_from_block_r1cs(build_hash_sample_r1cs(self.nu)) .with_io_schema(vec![IoWord::input(0), IoWord::output(1)]) } @@ -589,6 +590,7 @@ pub(crate) fn build_hash_sample_r1cs( hash_sample_plan().block_r1cs(nu) } +#[cfg(test)] pub(crate) fn generate_hash_sample_witness( rows: &[HashSampleRow], nu: usize, @@ -598,6 +600,22 @@ pub(crate) fn generate_hash_sample_witness( }) } +pub(crate) fn generate_hash_sample_witness_into( + rows: &[HashSampleRow], + nu: usize, + dst: SlotWitnessDest<'_>, +) -> Vec { + generate_boolean_witness_into( + hash_sample_plan(), + rows, + nu, + dst, + |row, bits| { + write_f128(bits, SAMPLE_INPUT_BASE, row.0); + }, + ) +} + fn hash_sample_plan() -> &'static BooleanR1csPlan { static PLAN: std::sync::OnceLock = std::sync::OnceLock::new(); @@ -645,7 +663,7 @@ impl GateType for GoldilocksSampleGate { type Hint = (); fn table(&self) -> TableType { - TableType::from_block_r1cs(&build_goldilocks_sample_r1cs(self.nu)) + crate::boolean::table_from_block_r1cs(build_goldilocks_sample_r1cs(self.nu)) .with_io_schema(vec![ IoWord::input(0), IoWord::input(1), @@ -718,6 +736,25 @@ pub(crate) fn generate_goldilocks_sample_witness( }) } +pub(crate) fn generate_goldilocks_sample_witness_into( + rows: &[GoldilocksSampleRow], + nu: usize, + dst: SlotWitnessDest<'_>, +) -> Vec { + generate_boolean_witness_into( + goldilocks_sample_plan(), + rows, + nu, + dst, + |row, bits| { + write_f128(bits, FIELD_SAMPLE_HIGH_BASE, row.0[0]); + write_f128(bits, FIELD_SAMPLE_LOW_BASE, row.0[1]); + write_f128(bits, FIELD_SAMPLE_REFILL_HIGH_BASE, row.0[2]); + write_f128(bits, FIELD_SAMPLE_REFILL_LOW_BASE, row.0[3]); + }, + ) +} + fn goldilocks_sample_plan() -> &'static BooleanR1csPlan { static PLAN: std::sync::OnceLock = std::sync::OnceLock::new(); @@ -1020,9 +1057,12 @@ impl GateType for U64SplitGate { type Hint = (); fn table(&self) -> TableType { - TableType::from_block_r1cs(&build_u64_split_r1cs(self.nu)).with_io_schema( - vec![IoWord::input(0), IoWord::output(1), IoWord::output(2)], - ) + crate::boolean::table_from_block_r1cs(build_u64_split_r1cs(self.nu)) + .with_io_schema(vec![ + IoWord::input(0), + IoWord::output(1), + IoWord::output(2), + ]) } fn eval( @@ -1047,11 +1087,12 @@ pub(crate) fn build_u64_split_r1cs(nu: usize) -> flock_prover::r1cs::BlockR1cs { u64_split_plan().block_r1cs(nu) } -pub(crate) fn generate_u64_split_witness( +pub(crate) fn generate_u64_split_witness_into( rows: &[U64SplitRow], nu: usize, -) -> (Vec, Vec, Vec, Vec) { - generate_boolean_witness(u64_split_plan(), rows, nu, |row, bits| { + dst: SlotWitnessDest<'_>, +) -> Vec { + generate_boolean_witness_into(u64_split_plan(), rows, nu, dst, |row, bits| { write_f128(bits, U64_SPLIT_INPUT_BASE, row.0); }) } diff --git a/flock-stage3/host/src/window.rs b/flock-stage3/host/src/window.rs index 348c79a63..dc459c79a 100644 --- a/flock-stage3/host/src/window.rs +++ b/flock-stage3/host/src/window.rs @@ -11,10 +11,12 @@ use flock_prover::{ field::F128, r1cs::BlockR1cs, schedule::{IoWord, TableType}, + union::SlotWitnessDest, }; use crate::boolean::{ - BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness, write_f128, + BooleanR1csBuilder, BooleanR1csPlan, generate_boolean_witness_into, + write_f128, }; const K_LOG: usize = 12; @@ -41,14 +43,13 @@ impl GateType for ByteWindowGate { type Hint = (); fn table(&self) -> TableType { - TableType::from_block_r1cs(&build_byte_window_r1cs(self.nu)).with_io_schema( - vec![ + crate::boolean::table_from_block_r1cs(build_byte_window_r1cs(self.nu)) + .with_io_schema(vec![ IoWord::input(0), IoWord::input(1), IoWord::input(2), IoWord::output(3), - ], - ) + ]) } fn eval( @@ -81,15 +82,22 @@ pub(crate) fn build_byte_window_r1cs(nu: usize) -> BlockR1cs { byte_window_plan().block_r1cs(nu) } -pub(crate) fn generate_byte_window_witness( +pub(crate) fn generate_byte_window_witness_into( rows: &[ByteWindowRow], nu: usize, -) -> (Vec, Vec, Vec, Vec) { - generate_boolean_witness(byte_window_plan(), rows, nu, |row, bits| { - write_f128(bits, FIRST_BASE, row.first); - write_f128(bits, SECOND_BASE, row.second); - write_f128(bits, SELECTOR_BASE, row.selector); - }) + dst: SlotWitnessDest<'_>, +) -> Vec { + generate_boolean_witness_into( + byte_window_plan(), + rows, + nu, + dst, + |row, bits| { + write_f128(bits, FIRST_BASE, row.first); + write_f128(bits, SECOND_BASE, row.second); + write_f128(bits, SELECTOR_BASE, row.selector); + }, + ) } fn byte_window_plan() -> &'static BooleanR1csPlan { From 8aa1f41c60de7836256141638aa3689cc7f2bda8 Mon Sep 17 00:00:00 2001 From: "John C. Burnham" Date: Mon, 31 Aug 2026 08:15:00 -0400 Subject: [PATCH 06/10] fix(ci): refresh parallel feature lockfile --- Cargo.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.lock b/Cargo.lock index 6a7203293..a0db113a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -919,6 +919,7 @@ dependencies = [ "flock-prover", "ix-terminal", "multi-stark 0.1.0 (git+https://github.com/argumentcomputer/multi-stark.git?rev=2892243e674f9a0b3aca9004a8d00c79a23beec1)", + "rayon", "serde", ] From dcbbae74231c7762ed175f779bdbf6bf1293d444 Mon Sep 17 00:00:00 2001 From: "John C. Burnham" Date: Fri, 4 Sep 2026 16:14:22 -0400 Subject: [PATCH 07/10] fix(flock-stage3): follow main Aiur proof protocol Pin Stage 3 to a narrow multi-stark branch based directly on main, adding only the per-query advice re-encoder needed by Flock. Preserve the native pruned-multiproof transport used by Stage 2 aggregation and drop the old width-binding, multiplicity-bound, and CUDA fork semantics. --- Cargo.lock | 442 ++++++------------------------- Cargo.toml | 2 +- crates/aiur/src/synthesis.rs | 25 +- crates/aiur/src/vk_codec.rs | 15 +- crates/terminal/src/lib.rs | 14 +- flock-stage3/Cargo.lock | 42 +-- flock-stage3/Cargo.toml | 2 +- flock-stage3/host/src/air.rs | 30 +-- flock-stage3/host/src/boolean.rs | 1 + flock-stage3/host/src/fri.rs | 7 +- 10 files changed, 153 insertions(+), 427 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a0db113a4..acef67328 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -53,7 +53,7 @@ dependencies = [ "hashbrown 0.15.5", "indexmap", "libc", - "multi-stark 0.1.0 (git+https://github.com/argumentcomputer/multi-stark.git?rev=a8aab731af8d2a5e15f390cd2ef14af4fc42d7d3)", + "multi-stark", "num-bigint 0.4.8", "rayon", "rustc-hash", @@ -918,7 +918,7 @@ dependencies = [ "blake3", "flock-prover", "ix-terminal", - "multi-stark 0.1.0 (git+https://github.com/argumentcomputer/multi-stark.git?rev=2892243e674f9a0b3aca9004a8d00c79a23beec1)", + "multi-stark", "rayon", "serde", ] @@ -1854,7 +1854,7 @@ dependencies = [ "lean-ffi", "memmap2", "mimalloc", - "multi-stark 0.1.0 (git+https://github.com/argumentcomputer/multi-stark.git?rev=a8aab731af8d2a5e15f390cd2ef14af4fc42d7d3)", + "multi-stark", "n0-error", "num-bigint 0.4.8", "rayon", @@ -1903,7 +1903,7 @@ dependencies = [ "anyhow", "bincode 2.0.1", "blake3", - "multi-stark 0.1.0 (git+https://github.com/argumentcomputer/multi-stark.git?rev=a8aab731af8d2a5e15f390cd2ef14af4fc42d7d3)", + "multi-stark", ] [[package]] @@ -1934,7 +1934,7 @@ dependencies = [ "dashmap", "ix-common", "ixon", - "multi-stark 0.1.0 (git+https://github.com/argumentcomputer/multi-stark.git?rev=a8aab731af8d2a5e15f390cd2ef14af4fc42d7d3)", + "multi-stark", "num-bigint 0.4.8", "rayon", "rustc-hash", @@ -2137,49 +2137,24 @@ dependencies = [ [[package]] name = "multi-stark" version = "0.1.0" -source = "git+https://github.com/argumentcomputer/multi-stark.git?rev=2892243e674f9a0b3aca9004a8d00c79a23beec1#2892243e674f9a0b3aca9004a8d00c79a23beec1" -dependencies = [ - "bincode 2.0.1", - "num-bigint 0.5.1", - "p3-air 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-blake3 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-challenger 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-commit 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-fri 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-goldilocks 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-keccak 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-merkle-tree 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "serde", - "tracing", -] - -[[package]] -name = "multi-stark" -version = "0.1.0" -source = "git+https://github.com/argumentcomputer/multi-stark.git?rev=a8aab731af8d2a5e15f390cd2ef14af4fc42d7d3#a8aab731af8d2a5e15f390cd2ef14af4fc42d7d3" +source = "git+https://github.com/argumentcomputer/multi-stark.git?rev=6ad074c1f2983ecdd7a56984d333441d6b38186a#6ad074c1f2983ecdd7a56984d333441d6b38186a" dependencies = [ "bincode 2.0.1", "itertools 0.14.0", - "p3-air 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-blake3 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-challenger 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-commit 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-fri 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-goldilocks 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-keccak 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-merkle-tree 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", + "p3-air", + "p3-blake3", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-fri", + "p3-goldilocks", + "p3-keccak", + "p3-matrix", + "p3-maybe-rayon", + "p3-merkle-tree", + "p3-symmetric", + "p3-util", "serde", "tracing", ] @@ -2597,19 +2572,8 @@ name = "p3-air" version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "serde", - "tracing", -] - -[[package]] -name = "p3-air" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-field", + "p3-matrix", "serde", "tracing", ] @@ -2620,18 +2584,8 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "blake3", - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", -] - -[[package]] -name = "p3-blake3" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "blake3", - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-symmetric", + "p3-util", ] [[package]] @@ -2639,22 +2593,10 @@ name = "p3-challenger" version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "tracing", -] - -[[package]] -name = "p3-challenger" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-field", + "p3-maybe-rayon", + "p3-symmetric", + "p3-util", "tracing", ] @@ -2664,24 +2606,11 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools 0.15.0", - "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-multilinear-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "serde", -] - -[[package]] -name = "p3-commit" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "itertools 0.15.0", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-multilinear-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-multilinear-util", + "p3-util", "serde", ] @@ -2691,24 +2620,10 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools 0.15.0", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "spin 0.12.3", - "tracing", -] - -[[package]] -name = "p3-dft" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "itertools 0.15.0", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", "spin 0.12.3", "tracing", ] @@ -2720,23 +2635,8 @@ source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc2 dependencies = [ "itertools 0.15.0", "num-bigint 0.5.1", - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "paste", - "rand 0.10.2", - "serde", - "tracing", -] - -[[package]] -name = "p3-field" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "itertools 0.15.0", - "num-bigint 0.5.1", - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-maybe-rayon", + "p3-util", "paste", "rand 0.10.2", "serde", @@ -2749,35 +2649,14 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools 0.15.0", - "p3-challenger 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-commit 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-security 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "rand 0.10.2", - "serde", - "spin 0.12.3", - "thiserror", - "tracing", -] - -[[package]] -name = "p3-fri" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "itertools 0.15.0", - "p3-challenger 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-commit 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-security 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-challenger", + "p3-commit", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-security", + "p3-util", "rand 0.10.2", "serde", "spin 0.12.3", @@ -2791,32 +2670,13 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "num-bigint 0.5.1", - "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-mds 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-poseidon1 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-poseidon2 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "paste", - "rand 0.10.2", - "serde", - "spin 0.12.3", -] - -[[package]] -name = "p3-goldilocks" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "num-bigint 0.5.1", - "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-mds 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-poseidon1 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-poseidon2 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-dft", + "p3-field", + "p3-mds", + "p3-poseidon1", + "p3-poseidon2", + "p3-symmetric", + "p3-util", "paste", "rand 0.10.2", "serde", @@ -2828,18 +2688,8 @@ name = "p3-keccak" version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "tiny-keccak", -] - -[[package]] -name = "p3-keccak" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-symmetric", + "p3-util", "tiny-keccak", ] @@ -2849,23 +2699,9 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools 0.15.0", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "rand 0.10.2", - "serde", - "tracing", -] - -[[package]] -name = "p3-matrix" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "itertools 0.15.0", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-field", + "p3-maybe-rayon", + "p3-util", "rand 0.10.2", "serde", "tracing", @@ -2879,32 +2715,15 @@ dependencies = [ "rayon", ] -[[package]] -name = "p3-maybe-rayon" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" - [[package]] name = "p3-mds" version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ - "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "rand 0.10.2", -] - -[[package]] -name = "p3-mds" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "p3-dft 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-dft", + "p3-field", + "p3-symmetric", + "p3-util", "rand 0.10.2", ] @@ -2914,31 +2733,12 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools 0.15.0", - "p3-commit 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "rand 0.10.2", - "serde", - "spin 0.12.3", - "thiserror", - "tracing", -] - -[[package]] -name = "p3-merkle-tree" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "itertools 0.15.0", - "p3-commit 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-commit", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-symmetric", + "p3-util", "rand 0.10.2", "serde", "spin 0.12.3", @@ -2952,25 +2752,10 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools 0.15.0", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "rand 0.10.2", - "serde", - "tracing", -] - -[[package]] -name = "p3-multilinear-util" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "itertools 0.15.0", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-matrix 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", "rand 0.10.2", "serde", "tracing", @@ -2981,20 +2766,9 @@ name = "p3-poseidon1" version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-mds 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "rand 0.10.2", -] - -[[package]] -name = "p3-poseidon1" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-mds 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-field", + "p3-mds", + "p3-symmetric", "rand 0.10.2", ] @@ -3003,22 +2777,10 @@ name = "p3-poseidon2" version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-mds 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "rand 0.10.2", -] - -[[package]] -name = "p3-poseidon2" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-mds 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-symmetric 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-field", + "p3-mds", + "p3-symmetric", + "p3-util", "rand 0.10.2", ] @@ -3028,21 +2790,9 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "libm", - "p3-air 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "serde", -] - -[[package]] -name = "p3-security" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "libm", - "p3-air 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-air", + "p3-field", + "p3-util", "serde", ] @@ -3052,19 +2802,8 @@ version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools 0.15.0", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "serde", -] - -[[package]] -name = "p3-symmetric" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "itertools 0.15.0", - "p3-field 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", - "p3-util 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-field", + "p3-util", "serde", ] @@ -3073,16 +2812,7 @@ name = "p3-util" version = "0.6.0" source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c)", - "serde", -] - -[[package]] -name = "p3-util" -version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" -dependencies = [ - "p3-maybe-rayon 0.6.0 (git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2)", + "p3-maybe-rayon", "serde", ] diff --git a/Cargo.toml b/Cargo.toml index 833f2594d..65cc3abd2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,7 +59,7 @@ libc = "0.2" log = "0.4" memmap2 = "0.9" mimalloc = { version = "0.1", default-features = false } -multi-stark = { git = "https://github.com/argumentcomputer/multi-stark.git", rev = "a8aab731af8d2a5e15f390cd2ef14af4fc42d7d3" } +multi-stark = { git = "https://github.com/argumentcomputer/multi-stark.git", rev = "6ad074c1f2983ecdd7a56984d333441d6b38186a" } nom = "7.1.3" num-bigint = "0.4.6" quickcheck = "1.0.3" diff --git a/crates/aiur/src/synthesis.rs b/crates/aiur/src/synthesis.rs index 284440a84..0c5e33b3b 100644 --- a/crates/aiur/src/synthesis.rs +++ b/crates/aiur/src/synthesis.rs @@ -590,8 +590,25 @@ impl AiurSystem { claim: &[G], proof: &AiurProof, ) -> Result, String> { - self.verify(claim, proof).map_err(|e| format!("{e:?}"))?; - proof.to_bytes().map_err(|e| format!("{e:?}")) + self.verify(claim, proof).map_err(|error| format!("{error:?}"))?; + proof.to_bytes().map_err(|error| format!("{error:?}")) + } + + /// Verify and expand the native multiproof for a per-query terminal + /// verifier such as Flock Stage 3. + pub fn proof_to_per_query_advice_bytes( + &self, + claim: &[G], + proof: &AiurProof, + ) -> Result, String> { + multi_stark::advice::proof_to_advice_bytes( + &self.system, + self.commitment_parameters, + self.fri_parameters, + &[claim], + proof, + ) + .map_err(|error| format!("{error:?}")) } } @@ -719,7 +736,7 @@ mod tests { assert_eq!(vk.to_bytes(), vk_bytes, "verifier key is canonical"); vk.verify(&claim, &proof).expect("decoded verifier key must verify"); let advice = vk - .proof_to_advice_bytes(&claim, &proof) + .proof_to_per_query_advice_bytes(&claim, &proof) .expect("decoded verifier key must serialize valid proof advice"); assert!(!advice.is_empty(), "serialized verifier advice must not be empty"); @@ -730,7 +747,7 @@ mod tests { "decoded verifier key must bind the outer claim" ); assert!( - vk.proof_to_advice_bytes(&tampered_claim, &proof).is_err(), + vk.proof_to_per_query_advice_bytes(&tampered_claim, &proof).is_err(), "advice serialization must verify and bind the outer claim" ); } diff --git a/crates/aiur/src/vk_codec.rs b/crates/aiur/src/vk_codec.rs index c9339fe04..8f7b1df5f 100644 --- a/crates/aiur/src/vk_codec.rs +++ b/crates/aiur/src/vk_codec.rs @@ -667,15 +667,20 @@ impl AiurVerifyingKey { self.system.verify(claim, proof) } - /// Verify and serialize the native pruned multiproof consumed by terminal - /// circuit verifiers. - pub fn proof_to_advice_bytes( + /// Verify and expand the native pruned multiproof into per-query advice. + pub fn proof_to_per_query_advice_bytes( &self, claim: &[Val], proof: &crate::synthesis::AiurProof, ) -> Result, String> { - self.verify(claim, proof).map_err(|error| format!("{error:?}"))?; - proof.to_bytes().map_err(|error| format!("{error:?}")) + multi_stark::advice::proof_to_advice_bytes( + &self.system, + self.commitment_parameters, + self.fri_parameters, + &[claim], + proof, + ) + .map_err(|error| format!("{error:?}")) } } #[cfg(test)] diff --git a/crates/terminal/src/lib.rs b/crates/terminal/src/lib.rs index 43c1b7921..7cd07b2f3 100644 --- a/crates/terminal/src/lib.rs +++ b/crates/terminal/src/lib.rs @@ -42,7 +42,7 @@ pub struct Stage2RootStatementV1 { } /// Shape census of the verified, per-query proof transport consumed by the -/// recursive verifier. This is diagnostic input to the Flock capacity model; +/// Flock verifier. This is diagnostic input to the Flock capacity model; /// it is not itself a proof or a substitute for in-relation shape checks. #[derive(Clone, Debug, PartialEq, Eq)] pub struct Stage2AdviceProfileV1 { @@ -61,7 +61,7 @@ pub struct Stage2AdviceProfileV1 { } impl Stage2AdviceProfileV1 { - /// Parse the canonical recursive-verifier advice and census its fixed and + /// Parse the canonical Flock-verifier advice and census its fixed and /// capacity-driving dimensions. The parser requires exact byte consumption. pub fn from_advice_bytes(bytes: &[u8], fri: &FriParameters) -> Result { profile_advice(bytes, fri) @@ -96,9 +96,9 @@ impl Stage2AdviceProfileV1 { } } -/// A compact proof that has been verified and expanded to the exact advice -/// layout used by `Ix.MultiStark`. The verifying key is retained for compiling -/// a specialised typed verifier witness; the claims remain the private words +/// A compact proof that has been verified and expanded to the per-query advice +/// layout used by Flock Stage 3. The verifying key is retained for compiling a +/// specialised typed verifier witness; the claims remain the private words /// bound by the Stage 2 statement inside that relation. #[derive(Clone, Debug, PartialEq, Eq)] pub struct ValidatedStage2RootV1 { @@ -322,7 +322,7 @@ pub fn validate_root_inputs( } /// Verify a compact Stage 2 root and expand its pruned Merkle multiproofs into -/// the per-query advice layout already consumed by the recursive Lean verifier. +/// the per-query advice layout consumed by the Flock Stage 3 verifier. /// No host-derived acceptance bit crosses the boundary: Stage 3 must parse and /// re-check these retained vk, claim, and advice bytes inside its relation. pub fn validate_and_expand_root_inputs( @@ -334,7 +334,7 @@ pub fn validate_and_expand_root_inputs( let decoded = decode_root_inputs(vk_bytes, claim_bytes, proof_bytes, fri)?; let advice_bytes = decoded .verifying_key - .proof_to_advice_bytes(&decoded.claim, &decoded.proof) + .proof_to_per_query_advice_bytes(&decoded.claim, &decoded.proof) .map_err(|error| anyhow::anyhow!("expand verified Aiur proof: {error}"))?; let advice_profile = Stage2AdviceProfileV1::from_advice_bytes(&advice_bytes, fri)?; diff --git a/flock-stage3/Cargo.lock b/flock-stage3/Cargo.lock index 92c9b50bb..ed989cd7c 100644 --- a/flock-stage3/Cargo.lock +++ b/flock-stage3/Cargo.lock @@ -427,10 +427,9 @@ checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "multi-stark" version = "0.1.0" -source = "git+https://github.com/argumentcomputer/multi-stark.git?rev=2892243e674f9a0b3aca9004a8d00c79a23beec1#2892243e674f9a0b3aca9004a8d00c79a23beec1" +source = "git+https://github.com/argumentcomputer/multi-stark.git?rev=6ad074c1f2983ecdd7a56984d333441d6b38186a#6ad074c1f2983ecdd7a56984d333441d6b38186a" dependencies = [ "bincode 2.0.1", - "num-bigint 0.5.1", "p3-air", "p3-blake3", "p3-challenger", @@ -505,7 +504,7 @@ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "p3-air" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "p3-field", "p3-matrix", @@ -516,7 +515,7 @@ dependencies = [ [[package]] name = "p3-blake3" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "blake3", "p3-symmetric", @@ -526,7 +525,7 @@ dependencies = [ [[package]] name = "p3-challenger" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "p3-field", "p3-maybe-rayon", @@ -538,9 +537,10 @@ dependencies = [ [[package]] name = "p3-commit" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools", + "p3-dft", "p3-field", "p3-matrix", "p3-multilinear-util", @@ -551,7 +551,7 @@ dependencies = [ [[package]] name = "p3-dft" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools", "p3-field", @@ -565,7 +565,7 @@ dependencies = [ [[package]] name = "p3-field" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools", "num-bigint 0.5.1", @@ -580,7 +580,7 @@ dependencies = [ [[package]] name = "p3-fri" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools", "p3-challenger", @@ -601,7 +601,7 @@ dependencies = [ [[package]] name = "p3-goldilocks" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "num-bigint 0.5.1", "p3-dft", @@ -620,7 +620,7 @@ dependencies = [ [[package]] name = "p3-keccak" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "p3-symmetric", "p3-util", @@ -630,7 +630,7 @@ dependencies = [ [[package]] name = "p3-matrix" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools", "p3-field", @@ -644,7 +644,7 @@ dependencies = [ [[package]] name = "p3-maybe-rayon" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "rayon", ] @@ -652,7 +652,7 @@ dependencies = [ [[package]] name = "p3-mds" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "p3-dft", "p3-field", @@ -664,7 +664,7 @@ dependencies = [ [[package]] name = "p3-merkle-tree" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools", "p3-commit", @@ -683,7 +683,7 @@ dependencies = [ [[package]] name = "p3-multilinear-util" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools", "p3-field", @@ -698,7 +698,7 @@ dependencies = [ [[package]] name = "p3-poseidon1" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "p3-field", "p3-mds", @@ -709,7 +709,7 @@ dependencies = [ [[package]] name = "p3-poseidon2" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "p3-field", "p3-mds", @@ -721,7 +721,7 @@ dependencies = [ [[package]] name = "p3-security" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "libm", "p3-air", @@ -733,7 +733,7 @@ dependencies = [ [[package]] name = "p3-symmetric" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "itertools", "p3-field", @@ -744,7 +744,7 @@ dependencies = [ [[package]] name = "p3-util" version = "0.6.0" -source = "git+https://github.com/Plonky3/Plonky3?rev=3c84c158c0939345a3becba60a387643935593d2#3c84c158c0939345a3becba60a387643935593d2" +source = "git+https://github.com/Plonky3/Plonky3?rev=3152b14a89067c83775a8076cc262ffc48a1fd7c#3152b14a89067c83775a8076cc262ffc48a1fd7c" dependencies = [ "p3-maybe-rayon", "serde", diff --git a/flock-stage3/Cargo.toml b/flock-stage3/Cargo.toml index a5cf3e04d..38b5ad44e 100644 --- a/flock-stage3/Cargo.toml +++ b/flock-stage3/Cargo.toml @@ -14,7 +14,7 @@ bincode = "1.3" blake3 = "1.8.4" flock-prover = { git = "https://github.com/succinctlabs/flock", rev = "b310f35f35f68095537150a1c8c0a43caca9a29e" } ix-terminal = { path = "../crates/terminal" } -multi-stark = { git = "https://github.com/argumentcomputer/multi-stark.git", rev = "2892243e674f9a0b3aca9004a8d00c79a23beec1" } +multi-stark = { git = "https://github.com/argumentcomputer/multi-stark.git", rev = "6ad074c1f2983ecdd7a56984d333441d6b38186a" } rayon = "1" serde = { version = "1", features = ["derive"] } diff --git a/flock-stage3/host/src/air.rs b/flock-stage3/host/src/air.rs index a77f63f79..ab52c6ecc 100644 --- a/flock-stage3/host/src/air.rs +++ b/flock-stage3/host/src/air.rs @@ -17,7 +17,7 @@ use ix_terminal::{ use multi_stark::{ expr::{RowOffset, Source}, graph::Node, - lookup::{Lookup, WidthBinding}, + lookup::Lookup, p3_field::{BasedVectorSpace, Field, PrimeCharacteristicRing, PrimeField64}, types::{ExtVal, FriParameters, Val}, }; @@ -56,7 +56,6 @@ pub struct Stage2AirProgramV1 { pub activation_bindings: Vec, pub active_circuits: Vec, pub claim_bindings: Vec, - pub width_binding: WidthBinding, pub statement_prefix: [u8; STAGE2_STATEMENT_PREFIX_BYTES], pub statement_digest: [u8; 32], } @@ -166,24 +165,6 @@ impl Stage2AirProgramV1 { }) .collect::>(); - let height_weight = - active_circuits.iter().try_fold(1u128, |total, circuit| { - let per_row: u128 = circuit - .metadata - .graph - .lookups - .iter() - .map(|lookup| u128::from(lookup.max_multiplicity)) - .sum(); - let height = 1u128 << circuit.log_degree; - total - .checked_add(per_row.saturating_mul(height)) - .ok_or_else(|| anyhow::anyhow!("AIR multiplicity bound overflow")) - })?; - if height_weight >= u128::from(GOLDILOCKS_MODULUS) { - bail!("AIR multiplicity height bound exceeds Goldilocks"); - } - let statement_bytes = prepared.statement().to_bytes(); if statement_bytes.len() != STAGE2_ROOT_STATEMENT_BYTES { bail!("Stage 2 statement has the wrong length"); @@ -197,7 +178,6 @@ impl Stage2AirProgramV1 { activation_bindings, active_circuits, claim_bindings, - width_binding: key.width_binding(), statement_prefix, statement_digest: prepared.statement().digest(), }) @@ -532,7 +512,6 @@ pub(crate) fn constrain_stage2_air( one, &circuit.metadata.graph.lookups, circuit.metadata.lookup_group_size, - program.width_binding, &node_values, &openings.stage2[0], &openings.stage2[1], @@ -821,7 +800,6 @@ fn constrain_logup( one: Wire, lookups: &[Lookup], group_size: usize, - width_binding: WidthBinding, node_values: &[Wire], stage2: &[Wire], stage2_next: &[Wire], @@ -872,12 +850,8 @@ fn constrain_logup( let messages: Vec<_> = chunk .iter() .map(|lookup| { - let seed = match width_binding { - WidthBinding::Fingerprint => lookup.args.len() as u64, - WidthBinding::ByConstruction => 0, - }; let seed = - record_fixed(builder, inputs, public_inputs, F128::new(seed, 0)); + record_fixed(builder, inputs, public_inputs, F128::new(0, 0)); let mut fingerprint = [seed, zero]; for &argument in lookup.args.iter().rev() { fingerprint = diff --git a/flock-stage3/host/src/boolean.rs b/flock-stage3/host/src/boolean.rs index 1eacee9e9..6a137e0bb 100644 --- a/flock-stage3/host/src/boolean.rs +++ b/flock-stage3/host/src/boolean.rs @@ -321,6 +321,7 @@ pub(crate) fn generate_boolean_witness_into( /// Low-level form of [`generate_boolean_witness_into`] for Boolean tables /// whose matrices and row filler predate [`BooleanR1csPlan`]. +#[allow(clippy::too_many_arguments)] pub(crate) fn generate_boolean_rows_into( k_log: usize, useful_bits: usize, diff --git a/flock-stage3/host/src/fri.rs b/flock-stage3/host/src/fri.rs index 7f8954154..f204824b0 100644 --- a/flock-stage3/host/src/fri.rs +++ b/flock-stage3/host/src/fri.rs @@ -3975,7 +3975,7 @@ fn stage3_linchecks() -> &'static Stage3Linchecks { field_sample, split, window, - ] = circuits.try_into().ok().expect("eleven Stage 3 lincheck circuits"); + ] = circuits.try_into().expect("eleven Stage 3 lincheck circuits"); Stage3Linchecks { blake3, order, @@ -5703,7 +5703,7 @@ mod tests { use ix_terminal::validate_and_expand_root_inputs; use multi_stark::{ expr::Expr, - lookup::{Lookup, WidthBinding}, + lookup::Lookup, p3_matrix::dense::RowMajorMatrix, system::{CircuitInputs, System, SystemWitness}, types::{CommitmentParameters, GoldilocksBlake3Config}, @@ -5745,8 +5745,7 @@ mod tests { Expr::IsFirstRow * (Expr::main(0) - Expr::constant(Val::from_u64(7))); let short_transition = Expr::IsTransition * (Expr::main_next(0) - Expr::main(0) - Expr::constant(Val::from_u64(9))); - let config = GoldilocksBlake3Config::new(commitment, fri) - .with_width_binding(WidthBinding::ByConstruction); + let config = GoldilocksBlake3Config::new(commitment, fri); let (system, key) = System::new( config, [ From 40cf786ac78990108701ac2f1ec5e3b5867f4410 Mon Sep 17 00:00:00 2001 From: "John C. Burnham" Date: Sat, 5 Sep 2026 11:57:29 -0400 Subject: [PATCH 08/10] feat(flock-stage3): harden production workflow --- .github/workflows/ci.yml | 42 +++++ Cargo.lock | 33 ++-- Ix/Aiur/Protocol.lean | 10 +- Ix/Cli/FlockRootCmd.lean | 35 +++-- Ix/Cli/VerifyCmd.lean | 2 +- crates/ffi/Cargo.toml | 21 ++- crates/ffi/src/aiur/protocol.rs | 94 ++++++------ crates/terminal/src/lib.rs | 9 +- flock-stage3/README.md | 120 ++++++++++----- flock-stage3/host/src/artifact.rs | 188 ++++++++++++++++++++++- flock-stage3/host/src/fri.rs | 230 +++++++++++++++++++++++----- flock-stage3/host/src/lib.rs | 165 +++++++++++++++++--- flock-stage3/host/src/limits.rs | 244 ++++++++++++++++++++++++++++++ flock-stage3/host/src/relation.rs | 184 +++++++++++++--------- 14 files changed, 1111 insertions(+), 266 deletions(-) create mode 100644 flock-stage3/host/src/limits.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 267f0b62e..82b654df5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -114,6 +114,48 @@ jobs: with: rust-version: ${{ env.RUST_VERSION }} + # flock-stage3 is intentionally an isolated Cargo workspace, so the root + # workspace jobs above do not discover it. Keep both its no-prove relation + # and native/circuit differential suite and its real proof vectors on every + # pull request. The proof vectors run serially to bound peak memory while + # exercising heterogeneous relation shapes against Flock's recycled buffers. + flock-stage3-test: + runs-on: warp-ubuntu-latest-x64-16x + steps: + - uses: actions/checkout@v7 + - uses: ./.github/actions/setup-rust-toolchain + with: + cache-workspaces: flock-stage3 + - name: Check Stage 3 Rustfmt style + run: cargo fmt --manifest-path flock-stage3/Cargo.toml --all -- --check + - name: Check Stage 3 clippy warnings + run: cargo clippy --release --locked --manifest-path flock-stage3/Cargo.toml --workspace --all-targets -- -D warnings + - name: Test Stage 3 relation and differential checks + run: cargo test --release --locked --manifest-path flock-stage3/Cargo.toml --workspace --lib + - name: Test Stage 3 cryptographic proof vectors + run: cargo test --release --locked --manifest-path flock-stage3/Cargo.toml -p flock-stage3-host --lib -- --ignored --test-threads=1 + + # The isolated host job cannot catch drift in the Lean extern signature or + # failures that appear only when the CLI combines its net and flock features. + # Reuse the base Lake/Cargo work from `build` and link that exact opt-in path. + flock-stage3-link: + needs: [build, flock-stage3-test] + runs-on: warp-ubuntu-latest-x64-16x + steps: + - uses: actions/checkout@v7 + - uses: ./.github/actions/setup-rust-toolchain + - uses: actions/cache/restore@v6 + with: + path: ./.lake + key: lake-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('lean-toolchain') }}-${{ hashFiles('lake-manifest.json') }}-${{ github.sha }} + restore-keys: lake-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('lean-toolchain') }}-${{ hashFiles('lake-manifest.json') }}- + - uses: leanprover/lean-action@v1 + with: + auto-config: false + use-github-cache: false + - name: Link Flock-enabled ix CLI + run: IX_FLOCK=1 lake build ix + # Compile and link the opt-in backend without requiring a GPU. Runtime and # proof-byte equivalence are covered by multi-stark's NVIDIA smoke suite. cuda-compile: diff --git a/Cargo.lock b/Cargo.lock index acef67328..577d4bc6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -163,12 +163,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "base16ct" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6" - [[package]] name = "base32" version = "0.5.1" @@ -749,12 +743,12 @@ dependencies = [ [[package]] name = "ed25519" -version = "3.0.0" +version = "3.0.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29fcf32e6c73d1079f83ab4d782de2d81620346a5f38c6237a86a22f8368980a" +checksum = "c6e914c7c52decb085cea910552e24c63ac019e3ab8bf001ff736da9a9d9d890" dependencies = [ "pkcs8", - "serdect", + "serde", "signature", ] @@ -1839,6 +1833,7 @@ dependencies = [ "blake3", "bytes", "dashmap", + "ed25519", "flock-stage3-host", "getrandom 0.3.4", "indexmap", @@ -1857,11 +1852,13 @@ dependencies = [ "multi-stark", "n0-error", "num-bigint 0.4.8", + "pkcs8", "rayon", "rustc-hash", "serde", "serde_json", "sha2 0.10.9", + "signature", "tiny-keccak", "tokio", "tracing", @@ -2933,9 +2930,9 @@ dependencies = [ [[package]] name = "pkcs8" -version = "0.11.0" +version = "0.11.0-rc.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7" +checksum = "12922b6296c06eb741b02d7b5161e3aaa22864af38dfa025a1a3ba3f68c84577" dependencies = [ "der", "spki", @@ -3560,16 +3557,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serdect" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3e" -dependencies = [ - "base16ct", - "serde", -] - [[package]] name = "sha2" version = "0.10.9" @@ -3635,9 +3622,9 @@ dependencies = [ [[package]] name = "signature" -version = "3.0.0" +version = "3.0.0-rc.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5" +checksum = "7f1880df446116126965eeec169136b2e0251dba37c6223bcc819569550edea3" [[package]] name = "simdutf8" diff --git a/Ix/Aiur/Protocol.lean b/Ix/Aiur/Protocol.lean index 9ba608861..d448f8a3d 100644 --- a/Ix/Aiur/Protocol.lean +++ b/Ix/Aiur/Protocol.lean @@ -418,13 +418,13 @@ abbrev functionChannel : G := .ofNat 0 def buildClaim (funIdx : Bytecode.FunIdx) (input output : Array G) := #[functionChannel, .ofNat funIdx] ++ input ++ output -/-- Compile/evaluate (preflight) or prove the complete no-RISC-V Flock Stage 3 -relation for one Aiur aggregate root. Proving requires an output path and -atomically installs the verified artifact. Without the Cargo flock feature, -this binding returns a descriptive error while remaining linkable. -/ +/-- Compile/evaluate (preflight), prove, or independently verify the complete +no-RISC-V Flock Stage 3 relation for one Aiur aggregate root. Proving requires +an output path; verification requires an artifact path. Without the Cargo flock +feature, this binding returns a descriptive error while remaining linkable. -/ @[extern "rs_flock_stage3_aggregate_root"] opaque flockStage3AggregateRoot : @& ByteArray → @& ByteArray → @& ByteArray → - @& FriParameters → @& String → @& String → Except String Unit + @& FriParameters → @& String → @& String → @& String → Except String Unit end Aiur diff --git a/Ix/Cli/FlockRootCmd.lean b/Ix/Cli/FlockRootCmd.lean index 579014d83..26c837c95 100644 --- a/Ix/Cli/FlockRootCmd.lean +++ b/Ix/Cli/FlockRootCmd.lean @@ -1,10 +1,12 @@ /- `ix flock-root ROOT_ADDRESS` consumes the same canonical aggregate-root -transport as `ix compress-root`, then either compiles/evaluates the complete -Stage 3 relation (`preflight`) or emits a verified Flock artifact (`prove`). +transport as `ix compress-root`, then compiles/evaluates the complete Stage 3 +relation (`preflight`), emits a verified artifact (`prove`), or verifies an +artifact against that external root (`verify`). Preflight deliberately stops before the cryptographic prover. It is the cheap -compatibility and capacity gate for a production-sized Stage 2 aggregate. +compatibility and exact-shape sizing gate for a production-sized Stage 2 +aggregate. -/ module public import Cli @@ -79,15 +81,21 @@ def runFlockRootCmd (p : Cli.Parsed) : IO UInt32 := do | [] => p.printError "error: expected one aggregate root address"; return 1 | _ => p.printError "error: expected exactly one aggregate root address"; return 1 let mode := (p.flag? "mode").map (·.as! String) |>.getD "preflight" - if mode != "preflight" && mode != "prove" then - IO.eprintln s!"error: unknown Flock mode `{mode}` (expected preflight|prove)" + if mode != "preflight" && mode != "prove" && mode != "verify" then + IO.eprintln + s!"error: unknown Flock mode `{mode}` (expected preflight|prove|verify)" return 1 + let artifact := (p.flag? "artifact").map (·.as! String) |>.getD "" let output := (p.flag? "output").map (·.as! String) |>.getD "" - if mode == "preflight" && !output.isEmpty then - IO.eprintln "error: --output is only valid with --mode prove" + if mode == "preflight" && (!artifact.isEmpty || !output.isEmpty) then + IO.eprintln + "error: --artifact and --output are not valid with --mode preflight" return 1 - if mode == "prove" && output.isEmpty then - IO.eprintln "error: Flock proving requires --output" + if mode == "prove" && (!artifact.isEmpty || output.isEmpty) then + IO.eprintln "error: Flock proving requires --output and forbids --artifact" + return 1 + if mode == "verify" && (artifact.isEmpty || !output.isEmpty) then + IO.eprintln "error: Flock verification requires --artifact and forbids --output" return 1 let inputs ← match ← prepareAggregateRootInputs rootHex with @@ -102,7 +110,7 @@ def runFlockRootCmd (p : Cli.Parsed) : IO UInt32 := do IO.println s!" recursion vk: {Address.blake3 inputs.verifyingKey}" (← IO.getStdout).flush match Aiur.flockStage3AggregateRoot inputs.verifyingKey inputs.outerClaim - inputs.proof inputs.fri mode output with + inputs.proof inputs.fri mode artifact output with | .ok () => IO.println s!"ok: Flock Stage 3 {mode} accepted aggregate root {inputs.rootAddress}" return 0 @@ -115,11 +123,12 @@ end Ix.Cli.FlockRootCmd open Ix.Cli.FlockRootCmd in def flockRootCmd : Cli.Cmd := `[Cli| "flock-root" VIA runFlockRootCmd; - "Preflight or prove one closed ix_aggr root with Flock Stage 3 (build with IX_FLOCK=1)" + "Preflight, prove, or verify one closed ix_aggr root with Flock Stage 3 (build with IX_FLOCK=1)" FLAGS: - "mode" : String; "Stage 3 action: preflight | prove (default: preflight)." - "output" : String; "Atomically save the verified Stage3ArtifactV1 (required for prove)." + "mode" : String; "Stage 3 action: preflight | prove | verify (default: preflight)." + "artifact" : String; "Read a Stage3ArtifactV1 (required for verify)." + "output" : String; "Atomically save the verified Stage3ArtifactV1 (required for prove)." ARGS: ...root : String; "Exactly one 32-byte store address of a persisted aggregate root." diff --git a/Ix/Cli/VerifyCmd.lean b/Ix/Cli/VerifyCmd.lean index 1b6bc5fe4..cb617d231 100644 --- a/Ix/Cli/VerifyCmd.lean +++ b/Ix/Cli/VerifyCmd.lean @@ -149,7 +149,7 @@ def auditAggregateConstants (env : Ixon.Env) (statement : Aggr.CheckEnvTrees) : /-- Build the two deterministic systems whose identities are committed by an aggregate root: the IxVM vk and the single-entrypoint recursion vk. -/ -private def buildAggregateBackend +def buildAggregateBackend (recursionParameters : MultiStark.RecursionParameters) : IO (Except String AggregateBackend) := do let ixvmCompiled ← match IxVM.ixVM with diff --git a/crates/ffi/Cargo.toml b/crates/ffi/Cargo.toml index 2d0fbeaa4..7da259aa8 100644 --- a/crates/ffi/Cargo.toml +++ b/crates/ffi/Cargo.toml @@ -49,12 +49,31 @@ getrandom = { version = "0.3", optional = true } bincode = { version = "2.0.1", optional = true } serde = { version = "1.0.219", features = ["derive"], optional = true } +# iroh 0.97 pins ed25519-dalek 3.0.0-pre.1, whose permissive prerelease +# requirements otherwise resolve to incompatible final releases. Keep the +# known-good companion API versions explicit until iroh updates dalek. +ed25519-compat-pin = { package = "ed25519", version = "=3.0.0-rc.4", optional = true } +pkcs8-compat-pin = { package = "pkcs8", version = "=0.11.0-rc.11", optional = true } +signature-compat-pin = { package = "signature", version = "=3.0.0-rc.10", optional = true } + [features] default = [] parallel = ["aiur/parallel"] cuda = ["aiur/cuda"] test-ffi = [] -net = ["bytes", "tokio", "iroh", "iroh-base", "n0-error", "getrandom", "bincode", "serde"] +net = [ + "bytes", + "tokio", + "iroh", + "iroh-base", + "n0-error", + "getrandom", + "bincode", + "serde", + "dep:ed25519-compat-pin", + "dep:pkcs8-compat-pin", + "dep:signature-compat-pin", +] flock = ["dep:flock-stage3-host"] [lints] diff --git a/crates/ffi/src/aiur/protocol.rs b/crates/ffi/src/aiur/protocol.rs index f0bf3c0bc..d54da471f 100644 --- a/crates/ffi/src/aiur/protocol.rs +++ b/crates/ffi/src/aiur/protocol.rs @@ -1682,35 +1682,9 @@ fn decode_io_buffer_map( // Flock aggregate-root Stage 3 (feature flock) // ============================================================================= -#[cfg(feature = "flock")] -fn write_flock_artifact_atomic( - path: &std::path::Path, - bytes: &[u8], -) -> anyhow::Result<()> { - use anyhow::{Context, bail}; - - let Some(file_name) = path.file_name() else { - bail!("Flock output path has no file name: {}", path.display()); - }; - let temporary = path.with_file_name(format!( - ".{}.tmp-{}", - file_name.to_string_lossy(), - std::process::id(), - )); - std::fs::write(&temporary, bytes).with_context(|| { - format!("write temporary Flock artifact {}", temporary.display()) - })?; - if let Err(error) = std::fs::rename(&temporary, path) { - let _ = std::fs::remove_file(&temporary); - return Err(error) - .with_context(|| format!("install Flock artifact {}", path.display())); - } - Ok(()) -} - -/// Compile/evaluate or prove the complete no-RISC-V Flock relation for one -/// canonical ix_aggr root. Default builds retain a checked feature-disabled -/// stub so the Lean CLI remains linkable. +/// Compile/evaluate, prove, or independently verify the complete no-RISC-V +/// Flock relation for one canonical ix_aggr root. Default builds retain a +/// checked feature-disabled stub so the Lean CLI remains linkable. #[unsafe(no_mangle)] extern "C" fn rs_flock_stage3_aggregate_root( vk_bytes: LeanByteArray>, @@ -1718,6 +1692,7 @@ extern "C" fn rs_flock_stage3_aggregate_root( proof_bytes: LeanByteArray>, fri_parameters: LeanAiurFriParameters>, mode: LeanString>, + artifact_path: LeanString>, output: LeanString>, ) -> LeanExcept { #[cfg(feature = "flock")] @@ -1726,8 +1701,10 @@ extern "C" fn rs_flock_stage3_aggregate_root( let backend = flock_stage3_host::FlockStage3Backend; let result = match mode.as_str().to_ascii_lowercase().as_str() { "preflight" => { - if !output.as_str().is_empty() { - Err(anyhow::anyhow!("--output is only valid with --mode prove")) + if !artifact_path.as_str().is_empty() || !output.as_str().is_empty() { + Err(anyhow::anyhow!( + "--artifact and --output are not valid with --mode preflight" + )) } else { backend .preflight_stage2( @@ -1740,26 +1717,22 @@ extern "C" fn rs_flock_stage3_aggregate_root( } }, "prove" => { - if output.as_str().is_empty() { + if !artifact_path.as_str().is_empty() { + Err(anyhow::anyhow!("--artifact is only valid with --mode verify")) + } else if output.as_str().is_empty() { Err(anyhow::anyhow!( "Flock proving requires --output so the expensive artifact is retained" )) } else { (|| { - let report = backend.preflight_stage2( + println!("running Flock Stage 3 preflight, prover, and verifier"); + let (report, artifact) = backend.preflight_and_prove_stage2( vk_bytes.as_bytes(), claim_bytes.as_bytes(), proof_bytes.as_bytes(), &fri, )?; println!("{report}"); - println!("starting Flock Stage 3 prover"); - let artifact = backend.prove_stage2( - vk_bytes.as_bytes(), - claim_bytes.as_bytes(), - proof_bytes.as_bytes(), - &fri, - )?; if artifact.statement().stage2_root_digest() != &report.stage2_root_digest || artifact.statement().relation_digest() @@ -1770,10 +1743,9 @@ extern "C" fn rs_flock_stage3_aggregate_root( "Flock prover rebuilt a statement different from preflight" )); } - backend.verify_stage2(&artifact, artifact.statement())?; let encoded = artifact.to_bytes(); let output_path = std::path::Path::new(output.as_str()); - write_flock_artifact_atomic(output_path, &encoded)?; + artifact.write_atomic(output_path)?; println!( "Flock Stage 3 proof verified; artifact={} bytes; saved to {}", encoded.len(), @@ -1783,8 +1755,33 @@ extern "C" fn rs_flock_stage3_aggregate_root( })() } }, + "verify" => { + if artifact_path.as_str().is_empty() { + Err(anyhow::anyhow!("Flock verification requires --artifact")) + } else if !output.as_str().is_empty() { + Err(anyhow::anyhow!("--output is only valid with --mode prove")) + } else { + (|| { + let path = std::path::Path::new(artifact_path.as_str()); + let artifact = + flock_stage3_host::Stage3ArtifactV1::read_from_path(path)?; + backend.verify_stage2_for_root( + &artifact, + vk_bytes.as_bytes(), + claim_bytes.as_bytes(), + proof_bytes.as_bytes(), + &fri, + )?; + println!( + "Flock Stage 3 artifact verified against aggregate root: {}", + path.display() + ); + Ok(()) + })() + } + }, other => Err(anyhow::anyhow!( - "unknown Flock mode '{other}' (expected preflight|prove)" + "unknown Flock mode '{other}' (expected preflight|prove|verify)" )), }; match result { @@ -1794,8 +1791,15 @@ extern "C" fn rs_flock_stage3_aggregate_root( } #[cfg(not(feature = "flock"))] { - let _ = - (&vk_bytes, &claim_bytes, &proof_bytes, &fri_parameters, &mode, &output); + let _ = ( + &vk_bytes, + &claim_bytes, + &proof_bytes, + &fri_parameters, + &mode, + &artifact_path, + &output, + ); LeanExcept::error_string( "ix was built without Flock Stage 3; rebuild with IX_FLOCK=1", ) diff --git a/crates/terminal/src/lib.rs b/crates/terminal/src/lib.rs index 7cd07b2f3..7d1b954e2 100644 --- a/crates/terminal/src/lib.rs +++ b/crates/terminal/src/lib.rs @@ -315,10 +315,14 @@ pub fn validate_root_inputs( fri: &FriParameters, ) -> Result { let decoded = decode_root_inputs(vk_bytes, claim_bytes, proof_bytes, fri)?; + verify_decoded_root_inputs(&decoded)?; + Ok(decoded.statement) +} + +fn verify_decoded_root_inputs(decoded: &DecodedRootInputs) -> Result<()> { decoded.verifying_key.verify(&decoded.claim, &decoded.proof).map_err( |error| anyhow::anyhow!("aggregate root does not verify: {error:?}"), - )?; - Ok(decoded.statement) + ) } /// Verify a compact Stage 2 root and expand its pruned Merkle multiproofs into @@ -332,6 +336,7 @@ pub fn validate_and_expand_root_inputs( fri: &FriParameters, ) -> Result { let decoded = decode_root_inputs(vk_bytes, claim_bytes, proof_bytes, fri)?; + verify_decoded_root_inputs(&decoded)?; let advice_bytes = decoded .verifying_key .proof_to_per_query_advice_bytes(&decoded.claim, &decoded.proof) diff --git a/flock-stage3/README.md b/flock-stage3/README.md index 3ebf235f4..248f0d6d0 100644 --- a/flock-stage3/README.md +++ b/flock-stage3/README.md @@ -22,8 +22,10 @@ The production path: 3. compiles the specialised fixed-shape Flock relation; 4. proves it under the production Stage 3 transcript domain; 5. binds the compiled circuit, Flock configuration, Stage 2 key, witness - layout, capacity, and completed phase mask in `Stage3RelationManifestV1`; -6. returns a strict, versioned `Stage3ArtifactV1`. + layout, exact witness shape, and completed phase mask in + `Stage3RelationManifestV1`; +6. verifies the generated Flock bundle against that same relation; and +7. returns a strict, versioned `Stage3ArtifactV1`. `FlockStage3Backend::verify_stage2` requires an externally expected `Stage3StatementV1`. It reconstructs the relation from the canonical Stage 2 @@ -32,6 +34,11 @@ the Flock bundle. The relation digest therefore has to be pinned by the deployment; accepting a relation digest supplied only by the prover would not specialise the verifier key. +`verify_stage2_for_root` is the operational verification path: it derives the +expected statement from an external persisted aggregate root, requires the +artifact's embedded compact transport to match it, and reuses that one +validation/relation build for cryptographic verification. + The single relation constrains all eleven registered verifier phases: - typed witness shape, sparse activation, and active trace heights; @@ -54,51 +61,70 @@ chained refill. The bounded circuit fails closed only if fewer than two values are canonical among eight candidates, or among seven after a raw commit-PoW draw. The latter probability is below roughly `2^-189`. -## Measured complete proof +The manifest is deliberately exact-shape: the current compiler does not pad a +smaller proof into a reusable capacity. All transport/profile words and the +full nested typed-witness layout must match. A capacity-based deployment would +require explicit in-relation padding and a new manifest version. + +Before witness generation, the production circuit zero-initializes every +recycled Flock slot buffer. This preserves deterministic dummy rows and padding +across heterogeneous relation shapes instead of making proof validity depend +on allocator contents. The serial real-proof CI suite exercises all 13 +cryptographic vectors in one process specifically to retain this regression. + +## Measured integration proof -The production regression fixture is a real canonical multi-STARK proof with +The integration regression fixture is a real canonical multi-STARK proof with an inactive leading circuit, active circuits at heights 8 and 4, an active preprocessed matrix, an 18-word claim lookup, nontrivial first-row/transition constraints, and two FRI queries. -On the debug profile, the instrumented complete production round trip produced: +On the release profile, the current self-verifying integration round trip +produced: -- Stage 3 artifact: **326,019 bytes**; -- encoded production payload: **325,893 bytes**; -- fixture setup: **0.010 seconds**; -- complete `prove_stage2` path: **491.624 seconds**; +- Stage 3 artifact: **326,171 bytes**; +- encoded production payload: **326,045 bytes**; +- fixture setup: **0.005 seconds**; +- combined preflight and self-verifying proof: **2.233 seconds**; - artifact encode and decode: **less than 0.001 seconds each**; -- valid cryptographic verification: **16.245 seconds**; -- rejection of a wrong relation statement: **0.000011 seconds**; -- rejection of a corrupted proof: **16.437 seconds**; and -- complete round trip: **524.315 seconds**. - -The complete prove-path timing includes native validation, witness lowering, -relation construction, Flock proving, and artifact packaging. Proving accounts -for 93.8% of the round trip. The negative-check time is almost entirely a -second full cryptographic verifier run against the corrupted proof; the wrong -relation digest fails before cryptography in 11 microseconds. This size is -expected: Stage 3 is the off-chain proof whose small fixed verifier is -compressed by Stage 4. It is not the sub-kilobyte Ethereum proof. +- valid external-root cryptographic verification: **0.013 seconds**; +- rejection of a wrong relation statement: **0.000002 seconds**; +- rejection of a corrupted proof: **0.012 seconds**; and +- complete round trip: **2.262 seconds**. + +The combined timing includes one native validation/expansion, witness lowering, +relation preflight and cached reuse, Flock proving, verification, and artifact +packaging. The negative-check time is almost entirely a full cryptographic +verifier run against the corrupted proof; the wrong relation digest fails +before cryptography. This size is expected: Stage 3 is the off-chain proof +whose small fixed verifier is compressed by Stage 4. It is not the sub-kilobyte +Ethereum proof. Run the exact regression with: ```sh -cargo test -p flock-stage3-host real_stage2_production_artifact_round_trip -- --ignored --nocapture +cargo test --release --locked --manifest-path flock-stage3/Cargo.toml \ + -p flock-stage3-host \ + real_stage2_integration_artifact_round_trip -- --ignored --nocapture ``` The ordinary suite exercises relation construction and native/circuit differential checks without paying the full proving cost: ```sh -cargo test -p flock-stage3-host --lib -cargo clippy -p flock-stage3-host --all-targets -- -D warnings +cargo test --release --locked --manifest-path flock-stage3/Cargo.toml \ + --workspace --lib +cargo test --release --locked --manifest-path flock-stage3/Cargo.toml \ + -p flock-stage3-host --lib -- --ignored --test-threads=1 +cargo clippy --release --locked --manifest-path flock-stage3/Cargo.toml \ + --workspace --all-targets -- -D warnings ``` Print the selected Flock configuration and digest with: ```sh -cargo run -p flock-stage3-host --bin flock-stage3-config +cargo run --release --locked --manifest-path flock-stage3/Cargo.toml \ + -p flock-stage3-host --bin flock-stage3-config ``` ## Production aggregate preflight @@ -111,11 +137,15 @@ IX_FLOCK=1 nix develop --command lake exe ix flock-root ROOT_ADDRESS \ --mode preflight ``` -Preflight natively verifies and expands the compact Stage 2 proof, constructs -the typed AIR/PCS/FRI witness, evaluates every Flock gate, and prints the Stage -2 advice geometry, `nu`, table capacity, relation/public sizes, per-gate row -counts, and content-addressed relation/statement digests. It is the mandatory -gate before a production-sized proof. +Preflight applies bounded host admission first, natively verifies and expands +the compact Stage 2 proof, constructs the typed AIR/PCS/FRI witness, evaluates +every Flock gate, and prints the Stage 2 advice geometry, `nu`, table capacity, +relation/public sizes, per-gate row counts, and content-addressed +relation/statement digests. It is the mandatory gate before a production-sized +proof. The ordinary suite generates and natively verifies a canonical transport +with the deployed blowup-two, 100-query, 20-bit query-PoW parameters and lowers +its complete typed AIR/PCS/FRI witness. It does not replace a full +production-root Flock proof vector. Once preflight succeeds, retain the expensive verified artifact explicitly: @@ -124,9 +154,25 @@ IX_FLOCK=1 nix develop --command lake exe ix flock-root ROOT_ADDRESS \ --mode prove --output root.stage3.flock ``` -The output is installed atomically. The binary-FRI lowering supports the full -height-derived schedule: the prior eight-round implementation ceiling is gone, -with evaluated regressions at 9, 16, and the current 30-round maximum. +The prove command performs preflight, proving, and self-verification through a +single validated witness/relation path; it does not repeat native Stage 2 +verification between those phases. + +The output is durably installed through an exclusive temporary file and is +never allowed to overwrite an existing artifact. Verify it later against the +persisted aggregate root, which independently derives the expected Stage 3 +statement and relation digest: + +```sh +IX_FLOCK=1 nix develop --command lake exe ix flock-root ROOT_ADDRESS \ + --mode verify --artifact root.stage3.flock +``` + +The binary-FRI lowering supports the full height-derived schedule: the prior +eight-round implementation ceiling is gone, with evaluated regressions at 9, +16, and the current 30-round maximum. The isolated Stage 3 workspace's fast +relation/differential suite and serial real cryptographic proof vectors are +both required pull-request CI checks. ## Scope and remaining work @@ -138,9 +184,11 @@ prevalidation remains an ergonomics and cost guard. Before freezing a production deployment, Stage 3 still needs: -- capacity measurements over the intended aggregate-proof corpus rather than - one small fixture; -- differential vectors for production-sized Aiur roots and nonzero grinding; +- exact-shape measurements over the intended aggregate-proof corpus rather + than one small fixture, followed by a decision to freeze one shape or add + explicitly constrained padding; +- full proof vectors for production-sized Aiur roots at 100 queries and 20-bit + query grinding; - an independent review of the local Boolean R1CS tables and pinned Flock soundness profile; and - a canonical export of the fixed Flock verifier inputs for Stage 4 witness diff --git a/flock-stage3/host/src/artifact.rs b/flock-stage3/host/src/artifact.rs index aac8793f5..6d04d8094 100644 --- a/flock-stage3/host/src/artifact.rs +++ b/flock-stage3/host/src/artifact.rs @@ -2,6 +2,13 @@ use anyhow::{Context, Result, bail}; use bincode::Options; use ix_terminal::Stage2RootStatementV1; use serde::{Deserialize, Serialize}; +use std::{ + ffi::OsString, + fs::{self, File, OpenOptions}, + io::{ErrorKind, Read, Write}, + path::{Path, PathBuf}, + sync::atomic::{AtomicU64, Ordering}, +}; use crate::config::FlockConfigV1; @@ -10,9 +17,12 @@ pub const STAGE3_STATEMENT_BYTES: usize = 8 + 32 + 32 + 32; const ARTIFACT_MAGIC: &[u8; 8] = b"IXFLOCK3"; const ARTIFACT_VERSION: u16 = 1; const ARTIFACT_HEADER_BYTES: usize = 8 + 2 + 4 + 8; -const MAX_PROOF_BYTES: usize = 64 * 1024 * 1024; +pub const MAX_STAGE3_PROOF_BYTES: usize = 64 * 1024 * 1024; +pub const MAX_STAGE3_ARTIFACT_BYTES: usize = + ARTIFACT_HEADER_BYTES + STAGE3_STATEMENT_BYTES + MAX_STAGE3_PROOF_BYTES; const PRODUCTION_PAYLOAD_MAGIC: [u8; 8] = *b"IXFLK3P1"; const PRODUCTION_PAYLOAD_VERSION: u16 = 1; +static NEXT_TEMP_FILE: AtomicU64 = AtomicU64::new(0); /// Public input to the complete Flock Stage 3 relation. #[derive(Clone, Debug, PartialEq, Eq)] @@ -100,8 +110,8 @@ impl Stage3ArtifactV1 { if proof.is_empty() { bail!("Stage 3 proof is empty"); } - if proof.len() > MAX_PROOF_BYTES { - bail!("Stage 3 proof exceeds {MAX_PROOF_BYTES} bytes"); + if proof.len() > MAX_STAGE3_PROOF_BYTES { + bail!("Stage 3 proof exceeds {MAX_STAGE3_PROOF_BYTES} bytes"); } Ok(Self { statement, proof }) } @@ -147,8 +157,8 @@ impl Stage3ArtifactV1 { if proof_len == 0 { bail!("Stage 3 proof is empty"); } - if proof_len > MAX_PROOF_BYTES { - bail!("Stage 3 proof exceeds {MAX_PROOF_BYTES} bytes"); + if proof_len > MAX_STAGE3_PROOF_BYTES { + bail!("Stage 3 proof exceeds {MAX_STAGE3_PROOF_BYTES} bytes"); } let expected_len = ARTIFACT_HEADER_BYTES .checked_add(statement_len) @@ -181,6 +191,121 @@ impl Stage3ArtifactV1 { pub fn proof_bytes(&self) -> &[u8] { &self.proof } + + /// Read a strictly bounded artifact without first allocating according to + /// an untrusted file size. + pub fn read_from_path(path: impl AsRef) -> Result { + let path = path.as_ref(); + let file = File::open(path) + .with_context(|| format!("open Stage 3 artifact {}", path.display()))?; + let declared_len = file + .metadata() + .with_context(|| format!("stat Stage 3 artifact {}", path.display()))? + .len(); + let maximum = u64::try_from(MAX_STAGE3_ARTIFACT_BYTES) + .expect("Stage 3 artifact limit fits u64"); + if declared_len > maximum { + bail!( + "Stage 3 artifact {} is {declared_len} bytes; maximum is {maximum}", + path.display() + ); + } + + let mut bytes = Vec::with_capacity( + usize::try_from(declared_len).context("Stage 3 artifact size")?, + ); + file + .take(maximum + 1) + .read_to_end(&mut bytes) + .with_context(|| format!("read Stage 3 artifact {}", path.display()))?; + if bytes.len() > MAX_STAGE3_ARTIFACT_BYTES { + bail!( + "Stage 3 artifact {} grew beyond {MAX_STAGE3_ARTIFACT_BYTES} bytes while being read", + path.display() + ); + } + Self::from_bytes(&bytes) + .with_context(|| format!("decode Stage 3 artifact {}", path.display())) + } + + /// Durably install an artifact in the destination directory. Temporary + /// files are created exclusively, and an existing destination is never + /// overwritten. + pub fn write_atomic(&self, path: impl AsRef) -> Result<()> { + write_bytes_atomic(path.as_ref(), &self.to_bytes()) + } +} + +fn write_bytes_atomic(path: &Path, bytes: &[u8]) -> Result<()> { + if path.file_name().is_none() { + bail!("Stage 3 artifact path has no file name: {}", path.display()); + } + if bytes.len() > MAX_STAGE3_ARTIFACT_BYTES { + bail!( + "encoded Stage 3 artifact is {} bytes; maximum is {MAX_STAGE3_ARTIFACT_BYTES}", + bytes.len() + ); + } + let parent = path + .parent() + .filter(|parent| !parent.as_os_str().is_empty()) + .unwrap_or_else(|| Path::new(".")); + + let (temporary, mut file) = create_temporary(parent)?; + let install = (|| -> Result<()> { + file.write_all(bytes).with_context(|| { + format!("write temporary artifact {}", temporary.display()) + })?; + file.sync_all().with_context(|| { + format!("sync temporary artifact {}", temporary.display()) + })?; + drop(file); + + fs::hard_link(&temporary, path).with_context(|| { + if path.exists() { + format!("refusing to overwrite Stage 3 artifact {}", path.display()) + } else { + format!("install Stage 3 artifact {}", path.display()) + } + })?; + fs::remove_file(&temporary).with_context(|| { + format!("remove temporary artifact {}", temporary.display()) + })?; + File::open(parent) + .and_then(|directory| directory.sync_all()) + .with_context(|| { + format!("sync artifact directory {}", parent.display()) + })?; + Ok(()) + })(); + if install.is_err() { + let _ = fs::remove_file(&temporary); + } + install +} + +fn create_temporary(parent: &Path) -> Result<(PathBuf, File)> { + for _ in 0..1_024 { + let nonce = NEXT_TEMP_FILE.fetch_add(1, Ordering::Relaxed); + let temporary_name = OsString::from(format!( + ".ix-flock-stage3-{}-{nonce}.tmp", + std::process::id() + )); + let temporary = parent.join(temporary_name); + match OpenOptions::new().write(true).create_new(true).open(&temporary) { + Ok(file) => return Ok((temporary, file)), + Err(error) if error.kind() == ErrorKind::AlreadyExists => {}, + Err(error) => { + return Err(error).with_context(|| { + format!("create temporary artifact {}", temporary.display()) + }); + }, + } + } + bail!( + "could not reserve a unique temporary Stage 3 artifact in {}", + parent.display() + ) } /// Canonical host transport needed to reconstruct the Flock public input. @@ -230,8 +355,10 @@ impl Stage3ProductionPayloadV1 { .with_fixint_encoding() .serialize(self) .context("encode Stage 3 production payload")?; - if bytes.len() > MAX_PROOF_BYTES { - bail!("Stage 3 production payload exceeds {MAX_PROOF_BYTES} bytes"); + if bytes.len() > MAX_STAGE3_PROOF_BYTES { + bail!( + "Stage 3 production payload exceeds {MAX_STAGE3_PROOF_BYTES} bytes" + ); } Ok(bytes) } @@ -239,7 +366,7 @@ impl Stage3ProductionPayloadV1 { pub(crate) fn decode(bytes: &[u8]) -> Result { let payload: Self = bincode::DefaultOptions::new() .with_fixint_encoding() - .with_limit(MAX_PROOF_BYTES as u64) + .with_limit(MAX_STAGE3_PROOF_BYTES as u64) .reject_trailing_bytes() .deserialize(bytes) .context("invalid Stage 3 production payload")?; @@ -378,4 +505,49 @@ mod tests { wrong_config.config_digest[0] ^= 1; assert!(wrong_config.encode().is_err()); } + + #[test] + fn artifact_file_io_is_bounded_atomic_and_no_clobber() { + let nonce = NEXT_TEMP_FILE.fetch_add(1, Ordering::Relaxed); + let directory = std::env::temp_dir().join(format!( + "ix-flock-stage3-artifact-test-{}-{nonce}", + std::process::id() + )); + fs::create_dir(&directory).unwrap(); + let path = directory.join("root.stage3.flock"); + + let artifact = Stage3ArtifactV1::new(statement(), vec![1, 2, 3]).unwrap(); + artifact.write_atomic(&path).unwrap(); + assert_eq!(Stage3ArtifactV1::read_from_path(&path).unwrap(), artifact); + + let replacement = Stage3ArtifactV1::new(statement(), vec![4, 5]).unwrap(); + let error = replacement.write_atomic(&path).unwrap_err().to_string(); + assert!(error.contains("refusing to overwrite")); + assert_eq!(Stage3ArtifactV1::read_from_path(&path).unwrap(), artifact); + assert_eq!(fs::read_dir(&directory).unwrap().count(), 1); + + fs::remove_file(&path).unwrap(); + let concurrent_path = + std::sync::Arc::new(directory.join("concurrent.flock")); + let contenders = [artifact.clone(), replacement.clone()].map(|artifact| { + let path = std::sync::Arc::clone(&concurrent_path); + std::thread::spawn(move || artifact.write_atomic(path.as_path())) + }); + let outcomes = contenders.map(|thread| thread.join().unwrap()); + assert_eq!(outcomes.iter().filter(|outcome| outcome.is_ok()).count(), 1); + let installed = + Stage3ArtifactV1::read_from_path(concurrent_path.as_path()).unwrap(); + assert!(installed == artifact || installed == replacement); + assert_eq!(fs::read_dir(&directory).unwrap().count(), 1); + fs::remove_file(concurrent_path.as_path()).unwrap(); + + let oversized = directory.join("oversized.stage3.flock"); + File::create(&oversized) + .unwrap() + .set_len(u64::try_from(MAX_STAGE3_ARTIFACT_BYTES).unwrap() + 1) + .unwrap(); + assert!(Stage3ArtifactV1::read_from_path(&oversized).is_err()); + fs::remove_file(oversized).unwrap(); + fs::remove_dir(directory).unwrap(); + } } diff --git a/flock-stage3/host/src/fri.rs b/flock-stage3/host/src/fri.rs index f204824b0..8214140ca 100644 --- a/flock-stage3/host/src/fri.rs +++ b/flock-stage3/host/src/fri.rs @@ -28,7 +28,7 @@ use flock_prover::{ prover::{self, UnionSlotProverInput}, r1cs::BlockR1cs, r1cs_hashes::blake3 as flock_blake3, - union::UnionInstance, + union::{SlotWitnessDest, UnionInstance}, verifier, }; use ix_terminal::{ @@ -3992,6 +3992,39 @@ fn stage3_linchecks() -> &'static Stage3Linchecks { }) } +/// Keep every committed slot word deterministic even when Flock lends this +/// relation a dirty recycled buffer. Flock's merged prover can advertise +/// padding as unread, but the heterogeneous Stage 3 conformance suite has +/// exposed zerocheck reads of those words across relation shapes. Clearing +/// the slot storage here preserves the documented witness contract and +/// prevents allocator contents from affecting proofs; generators may still +/// elide their redundant padding writes and lincheck-stripe initialization. +fn initialize_slot_padding(dst: SlotWitnessDest<'_>) -> SlotWitnessDest<'_> { + const ZERO_CHUNK_WORDS: usize = 1 << 16; + let z = &mut *dst.z; + let a = &mut *dst.a; + let b = &mut *dst.b; + rayon::join( + || { + z.par_chunks_mut(ZERO_CHUNK_WORDS) + .for_each(|chunk| chunk.fill(F128::ZERO)); + }, + || { + rayon::join( + || { + a.par_chunks_mut(ZERO_CHUNK_WORDS) + .for_each(|chunk| chunk.fill(F128::ZERO)); + }, + || { + b.par_chunks_mut(ZERO_CHUNK_WORDS) + .for_each(|chunk| chunk.fill(F128::ZERO)); + }, + ); + }, + ); + dst +} + #[allow(clippy::too_many_arguments)] fn prove_fri_circuit( shape: &CircuitShape, @@ -4062,7 +4095,7 @@ fn prove_fri_circuit( flock_blake3::generate_witness_batch_major_partial_into( blake3_rows, nu, - dst, + initialize_slot_padding(dst), ) }, blake3_lincheck, @@ -4071,28 +4104,52 @@ fn prove_fri_circuit( ( shape.registry_slot(slots.order), UnionSlotProverInput::in_place( - move |dst| generate_digest_order_witness_into(order_rows, nu, dst), + move |dst| { + generate_digest_order_witness_into( + order_rows, + nu, + initialize_slot_padding(dst), + ) + }, order_lincheck, ), ), ( shape.registry_slot(slots.add), UnionSlotProverInput::in_place( - move |dst| generate_goldilocks_add_witness_into(add_rows, nu, dst), + move |dst| { + generate_goldilocks_add_witness_into( + add_rows, + nu, + initialize_slot_padding(dst), + ) + }, add_lincheck, ), ), ( shape.registry_slot(slots.mul), UnionSlotProverInput::in_place( - move |dst| generate_goldilocks_mul_witness_into(mul_rows, nu, dst), + move |dst| { + generate_goldilocks_mul_witness_into( + mul_rows, + nu, + initialize_slot_padding(dst), + ) + }, mul_lincheck, ), ), ( shape.registry_slot(slots.repack), UnionSlotProverInput::in_place( - move |dst| generate_lane_repack_witness_into(repack_rows, nu, dst), + move |dst| { + generate_lane_repack_witness_into( + repack_rows, + nu, + initialize_slot_padding(dst), + ) + }, repack_lincheck, ), ), @@ -4100,7 +4157,11 @@ fn prove_fri_circuit( shape.registry_slot(slots.canonical), UnionSlotProverInput::in_place( move |dst| { - generate_canonical_pair_witness_into(canonical_rows, nu, dst) + generate_canonical_pair_witness_into( + canonical_rows, + nu, + initialize_slot_padding(dst), + ) }, canonical_lincheck, ), @@ -4108,7 +4169,13 @@ fn prove_fri_circuit( ( shape.registry_slot(slots.equality), UnionSlotProverInput::in_place( - move |dst| generate_f128_equality_witness_into(equality_rows, nu, dst), + move |dst| { + generate_f128_equality_witness_into( + equality_rows, + nu, + initialize_slot_padding(dst), + ) + }, equality_lincheck, ), ), @@ -4117,7 +4184,13 @@ fn prove_fri_circuit( slot_inputs.push(( shape.registry_slot(slot), UnionSlotProverInput::in_place( - move |dst| generate_hash_sample_witness_into(rows, nu, dst), + move |dst| { + generate_hash_sample_witness_into( + rows, + nu, + initialize_slot_padding(dst), + ) + }, sample_lincheck, ), )); @@ -4126,7 +4199,13 @@ fn prove_fri_circuit( slot_inputs.push(( shape.registry_slot(slot), UnionSlotProverInput::in_place( - move |dst| generate_goldilocks_sample_witness_into(rows, nu, dst), + move |dst| { + generate_goldilocks_sample_witness_into( + rows, + nu, + initialize_slot_padding(dst), + ) + }, field_sample_lincheck, ), )); @@ -4135,7 +4214,13 @@ fn prove_fri_circuit( slot_inputs.push(( shape.registry_slot(slot), UnionSlotProverInput::in_place( - move |dst| generate_u64_split_witness_into(rows, nu, dst), + move |dst| { + generate_u64_split_witness_into( + rows, + nu, + initialize_slot_padding(dst), + ) + }, split_lincheck, ), )); @@ -4144,7 +4229,13 @@ fn prove_fri_circuit( slot_inputs.push(( shape.registry_slot(slot), UnionSlotProverInput::in_place( - move |dst| generate_byte_window_witness_into(rows, nu, dst), + move |dst| { + generate_byte_window_witness_into( + rows, + nu, + initialize_slot_padding(dst), + ) + }, window_lincheck, ), )); @@ -5713,11 +5804,6 @@ mod tests { fn prepared_stage2_pcs_fixture() -> (ValidatedStage2RootV1, FriParameters, Vec, Vec, Vec) { - const CLAIM_WORDS: usize = 18; - const CLAIM_CIRCUIT_WIDTH: usize = CLAIM_WORDS + 2; - const TALL_HEIGHT: usize = 8; - const SHORT_HEIGHT: usize = 4; - let commitment = CommitmentParameters { log_blowup: 1, cap_height: 0 }; let fri = FriParameters { log_final_poly_len: 0, @@ -5726,6 +5812,18 @@ mod tests { commit_proof_of_work_bits: 0, query_proof_of_work_bits: 0, }; + prepared_stage2_pcs_fixture_with(commitment, fri) + } + + fn prepared_stage2_pcs_fixture_with( + commitment: CommitmentParameters, + fri: FriParameters, + ) -> (ValidatedStage2RootV1, FriParameters, Vec, Vec, Vec) { + const CLAIM_WORDS: usize = 18; + const CLAIM_CIRCUIT_WIDTH: usize = CLAIM_WORDS + 2; + const TALL_HEIGHT: usize = 8; + const SHORT_HEIGHT: usize = 4; + let claim: Vec<_> = (0..CLAIM_WORDS) .map(|word| Val::from_u64(0x100 + u64::try_from(word).unwrap())) .collect(); @@ -6287,6 +6385,23 @@ mod tests { (prefix, fri_transcript, instance, vec![query]) } + #[test] + fn recycled_slot_storage_is_zero_initialized() { + let poison = F128::new(0xdead_beef_dead_beef, 0xa5a5_a5a5_a5a5_a5a5); + let (mut z, mut a, mut b) = + (vec![poison; 257], vec![poison; 257], vec![poison; 257]); + let dst = initialize_slot_padding(SlotWitnessDest { + z: &mut z, + a: &mut a, + b: &mut b, + elide_padding_writes: true, + }); + assert!(dst.z.iter().all(|word| *word == F128::ZERO)); + assert!(dst.a.iter().all(|word| *word == F128::ZERO)); + assert!(dst.b.iter().all(|word| *word == F128::ZERO)); + assert!(dst.elide_padding_writes); + } + #[test] fn native_fold_satisfies_denominator_free_identity() { for query_index in [0, 1, 0b1_0110, 0b1_1111] { @@ -6687,6 +6802,34 @@ mod tests { assert_eq!(report.stage2_root_digest, prepared.statement().digest()); assert!(report.to_string().contains("gate rows: blake3=")); + let expected = crate::Stage3StatementV1::new( + prepared.statement(), + report.relation_digest, + ); + let mismatched_payload = crate::artifact::Stage3ProductionPayloadV1::new( + &vk_bytes, + &claim_bytes, + b"different compact proof", + report.relation.circuit_digest, + b"unused proof bundle", + ) + .unwrap() + .encode() + .unwrap(); + let mismatched_artifact = + crate::Stage3ArtifactV1::new(expected, mismatched_payload).unwrap(); + let error = crate::FlockStage3Backend + .verify_stage2_for_root( + &mismatched_artifact, + &vk_bytes, + &claim_bytes, + &proof_bytes, + &fri, + ) + .unwrap_err() + .to_string(); + assert!(error.contains("different Stage 2 compact proof transport")); + let mut wrong_row = lowered.queries; wrong_row[0].pcs.batch_openings[0].opened_rows[0][0] ^= 1; assert!( @@ -6703,8 +6846,29 @@ mod tests { } #[test] - #[ignore = "real production Flock proof of a complete Stage 2 verifier"] - fn real_stage2_production_artifact_round_trip() { + fn production_parameters_generate_and_lower_canonical_stage2_transport() { + let commitment = CommitmentParameters { log_blowup: 2, cap_height: 0 }; + let fri = FriParameters { + log_final_poly_len: 0, + max_log_arity: 1, + num_queries: 100, + commit_proof_of_work_bits: 0, + query_proof_of_work_bits: 20, + }; + let (prepared, fri, _, _, _) = + prepared_stage2_pcs_fixture_with(commitment, fri); + let witness = Stage2AirPcsFriWitnessV1::from_prepared(&prepared, &fri) + .expect("lower production-parameter Stage 2 transport"); + + assert_eq!(prepared.advice_profile().queries, 100); + assert_eq!(witness.pcs_fri.queries.len(), 100); + assert_eq!(witness.pcs_fri.fri_transcript.query_pow_bits, 20); + assert_eq!(witness.pcs_fri.pcs_instance.log_blowup, 2); + } + + #[test] + #[ignore = "real Flock proof of the complete Stage 2 integration fixture"] + fn real_stage2_integration_artifact_round_trip() { let total_started = std::time::Instant::now(); let fixture_started = std::time::Instant::now(); @@ -6714,16 +6878,10 @@ mod tests { let backend = crate::FlockStage3Backend; - let preflight_started = std::time::Instant::now(); - let preflight = backend - .preflight_stage2(&vk_bytes, &claim_bytes, &proof_bytes, &fri) - .expect("preflight complete Stage 3 relation"); - let preflight_elapsed = preflight_started.elapsed(); - let prove_started = std::time::Instant::now(); - let artifact = backend - .prove_stage2(&vk_bytes, &claim_bytes, &proof_bytes, &fri) - .expect("prove complete Stage 3 relation"); + let (preflight, artifact) = backend + .preflight_and_prove_stage2(&vk_bytes, &claim_bytes, &proof_bytes, &fri) + .expect("preflight and prove complete Stage 3 relation"); let prove_elapsed = prove_started.elapsed(); assert_eq!( artifact.statement().stage2_root_digest(), @@ -6753,8 +6911,14 @@ mod tests { let valid_verify_started = std::time::Instant::now(); backend - .verify_stage2(&decoded, decoded.statement()) - .expect("verify complete Stage 3 relation"); + .verify_stage2_for_root( + &decoded, + &vk_bytes, + &claim_bytes, + &proof_bytes, + &fri, + ) + .expect("verify complete Stage 3 relation against its aggregate root"); let valid_verify_elapsed = valid_verify_started.elapsed(); let wrong_relation = @@ -6781,11 +6945,10 @@ mod tests { concat!( "Flock complete Stage 3 timings (seconds):\n", " fixture setup: {:>10.3}\n", - " relation preflight/setup: {:>10.3}\n", - " proof generation: {:>10.3}\n", + " preflight + self-verifying proof: {:>10.3}\n", " artifact encode: {:>10.3}\n", " artifact decode: {:>10.3}\n", - " valid cryptographic verification: {:>10.3}\n", + " valid external-root verification: {:>10.3}\n", " reject wrong relation statement: {:>10.6}\n", " corrupt and decode artifact: {:>10.3}\n", " reject corrupted proof: {:>10.3}\n", @@ -6793,7 +6956,6 @@ mod tests { " total: {:>10.3}", ), fixture_elapsed.as_secs_f64(), - preflight_elapsed.as_secs_f64(), prove_elapsed.as_secs_f64(), encode_elapsed.as_secs_f64(), decode_elapsed.as_secs_f64(), diff --git a/flock-stage3/host/src/lib.rs b/flock-stage3/host/src/lib.rs index e222f0a4b..cabc6154a 100644 --- a/flock-stage3/host/src/lib.rs +++ b/flock-stage3/host/src/lib.rs @@ -12,6 +12,7 @@ mod equality; mod extension; mod fri; mod goldilocks; +mod limits; mod merkle; mod multiplication; mod relation; @@ -22,8 +23,7 @@ mod window; use aiur::vk_codec::AiurVerifyingKey; use anyhow::{Result, bail}; use ix_terminal::{ - Stage2AdviceProfileV1, ValidatedStage2RootV1, - validate_and_expand_root_inputs, validate_root_inputs, + Stage2AdviceProfileV1, ValidatedStage2RootV1, validate_and_expand_root_inputs, }; use multi_stark::types::FriParameters; use std::fmt; @@ -36,8 +36,8 @@ pub use arithmetic::{ }; use artifact::Stage3ProductionPayloadV1; pub use artifact::{ - STAGE3_STATEMENT_BYTES, STAGE3_STATEMENT_DOMAIN, Stage3ArtifactV1, - Stage3StatementV1, + MAX_STAGE3_ARTIFACT_BYTES, MAX_STAGE3_PROOF_BYTES, STAGE3_STATEMENT_BYTES, + STAGE3_STATEMENT_DOMAIN, Stage3ArtifactV1, Stage3StatementV1, }; pub use binding::{ STAGE3_BINDING_ARTIFACT_MAGIC, Stage3BindingArtifactV1, @@ -91,8 +91,9 @@ pub use fri::{ }; use fri::{ preflight_stage2_air_pcs_fri, prove_stage2_air_pcs_fri_production, - verify_stage2_air_pcs_fri_production, + stage2_air_pcs_fri_circuit_digest, verify_stage2_air_pcs_fri_production, }; +pub use limits::Stage3ResourceLimitsV1; pub use merkle::{ MERKLE_CONFORMANCE_ARTIFACT_MAGIC, MerkleConformanceArtifactV1, MerklePathV1, prove_merkle_conformance, verify_merkle_conformance, @@ -211,11 +212,16 @@ impl FlockStage3Backend { proof_bytes: &[u8], fri: &FriParameters, ) -> Result { - // Fail before relation construction on an invalid compact root. The - // Flock relation repeats verification; this native pass is only the - // inexpensive guard needed before allocating a production-scale circuit. - validate_root_inputs(vk_bytes, claim_bytes, proof_bytes, fri)?; - validate_and_expand_root_inputs(vk_bytes, claim_bytes, proof_bytes, fri) + let limits = Stage3ResourceLimitsV1::default(); + limits.ensure_transport(vk_bytes, claim_bytes, proof_bytes, fri)?; + // Fail before relation construction on an invalid compact root. The Flock + // relation repeats verification; this native validation/expansion pass is + // the inexpensive guard needed before allocating a production-scale + // circuit. + let prepared = + validate_and_expand_root_inputs(vk_bytes, claim_bytes, proof_bytes, fri)?; + limits.ensure_prepared(&prepared)?; + Ok(prepared) } /// Validate a compact aggregate root, compile the complete specialised @@ -231,23 +237,40 @@ impl FlockStage3Backend { let prepared = self.prepare_witness(vk_bytes, claim_bytes, proof_bytes, fri)?; let witness = Stage2AirPcsFriWitnessV1::from_prepared(&prepared, fri)?; - let relation = preflight_stage2_air_pcs_fri(&witness)?; - let manifest = Stage3RelationManifestV1::for_prepared_and_program_digest( + self.preflight_prepared( &prepared, + &witness, + vk_bytes.len(), + claim_bytes.len(), + proof_bytes.len(), + ) + } + + fn preflight_prepared( + self, + prepared: &ValidatedStage2RootV1, + witness: &Stage2AirPcsFriWitnessV1, + verifying_key_bytes: usize, + claim_bytes: usize, + compact_proof_bytes: usize, + ) -> Result { + let relation = preflight_stage2_air_pcs_fri(witness)?; + let manifest = Stage3RelationManifestV1::for_prepared_and_program_digest( + prepared, relation.circuit_digest, )?; - let statement = self.prepare_statement(&prepared, &manifest)?; + let statement = self.prepare_statement(prepared, &manifest)?; Ok(Stage3PreflightReportV1 { stage2_root_digest: prepared.statement().digest(), relation_digest: manifest.relation_digest()?, stage3_statement_digest: statement.digest(), - verifying_key_bytes: u64::try_from(vk_bytes.len()).map_err(|error| { - anyhow::anyhow!("verifying-key length exceeds u64: {error}") - })?, - claim_bytes: u64::try_from(claim_bytes.len()).map_err(|error| { + verifying_key_bytes: u64::try_from(verifying_key_bytes).map_err( + |error| anyhow::anyhow!("verifying-key length exceeds u64: {error}"), + )?, + claim_bytes: u64::try_from(claim_bytes).map_err(|error| { anyhow::anyhow!("claim length exceeds u64: {error}") })?, - compact_proof_bytes: u64::try_from(proof_bytes.len()).map_err( + compact_proof_bytes: u64::try_from(compact_proof_bytes).map_err( |error| anyhow::anyhow!("compact-proof length exceeds u64: {error}"), )?, advice: prepared.advice_profile().clone(), @@ -275,13 +298,13 @@ impl FlockStage3Backend { } /// Construct a public Stage 3 statement only from a complete manifest that - /// is specialised to, and has capacity for, this prepared root. + /// is specialised to the exact shape of this prepared root. pub fn prepare_statement( self, prepared: &ValidatedStage2RootV1, manifest: &Stage3RelationManifestV1, ) -> Result { - manifest.ensure_accommodates(prepared)?; + manifest.ensure_matches(prepared)?; Ok(Stage3StatementV1::new( prepared.statement(), manifest.relation_digest()?, @@ -290,7 +313,7 @@ impl FlockStage3Backend { /// Validate and lower a compact Stage 2 proof, prove the complete /// statement/AIR/PCS/FRI relation using the production transcript domain, - /// and return its strictly framed Stage 3 artifact. + /// verify it, and return its strictly framed Stage 3 artifact. pub fn prove_stage2( self, vk_bytes: &[u8], @@ -302,12 +325,24 @@ impl FlockStage3Backend { let prepared = self.prepare_witness(vk_bytes, claim_bytes, proof_bytes, fri)?; let witness = Stage2AirPcsFriWitnessV1::from_prepared(&prepared, fri)?; - let flock_artifact = prove_stage2_air_pcs_fri_production(&witness)?; + self.prove_prepared(&prepared, &witness, vk_bytes, claim_bytes, proof_bytes) + } + + fn prove_prepared( + self, + prepared: &ValidatedStage2RootV1, + witness: &Stage2AirPcsFriWitnessV1, + vk_bytes: &[u8], + claim_bytes: &[u8], + proof_bytes: &[u8], + ) -> Result { + let flock_artifact = prove_stage2_air_pcs_fri_production(witness)?; + verify_stage2_air_pcs_fri_production(&flock_artifact)?; let manifest = Stage3RelationManifestV1::for_prepared_and_program_digest( - &prepared, + prepared, *flock_artifact.circuit_digest(), )?; - let statement = self.prepare_statement(&prepared, &manifest)?; + let statement = self.prepare_statement(prepared, &manifest)?; let payload = Stage3ProductionPayloadV1::new( vk_bytes, claim_bytes, @@ -319,6 +354,37 @@ impl FlockStage3Backend { Stage3ArtifactV1::new(statement, payload) } + /// Run the mandatory no-prove gate and then prove using the same validated + /// root, typed witness, and cached relation. The returned artifact has also + /// passed the production Flock verifier. + pub fn preflight_and_prove_stage2( + self, + vk_bytes: &[u8], + claim_bytes: &[u8], + proof_bytes: &[u8], + fri: &FriParameters, + ) -> Result<(Stage3PreflightReportV1, Stage3ArtifactV1)> { + Stage3LoweringStatusV1::current().ensure_complete()?; + let prepared = + self.prepare_witness(vk_bytes, claim_bytes, proof_bytes, fri)?; + let witness = Stage2AirPcsFriWitnessV1::from_prepared(&prepared, fri)?; + let report = self.preflight_prepared( + &prepared, + &witness, + vk_bytes.len(), + claim_bytes.len(), + proof_bytes.len(), + )?; + let artifact = self.prove_prepared( + &prepared, + &witness, + vk_bytes, + claim_bytes, + proof_bytes, + )?; + Ok((report, artifact)) + } + /// Verify the expected public statement, reconstruct the fixed relation /// from canonical Stage 2 inputs, pin its manifest digest, and verify the /// Flock proof under the production transcript domain. @@ -356,6 +422,52 @@ impl FlockStage3Backend { )?; verify_stage2_air_pcs_fri_production(&flock_artifact) } + + /// Verify an artifact against the exact canonical aggregate-root transport + /// from which it was produced. The expected statement and relation digest + /// are rebuilt from these external inputs; no artifact-supplied statement is + /// used as its own trust anchor. + /// + /// Requiring the embedded compact transport to match also lets this path + /// reuse one native validation and one relation build. + pub fn verify_stage2_for_root( + self, + artifact: &Stage3ArtifactV1, + vk_bytes: &[u8], + claim_bytes: &[u8], + proof_bytes: &[u8], + fri: &FriParameters, + ) -> Result<()> { + Stage3LoweringStatusV1::current().ensure_complete()?; + let prepared = + self.prepare_witness(vk_bytes, claim_bytes, proof_bytes, fri)?; + let payload = Stage3ProductionPayloadV1::decode(artifact.proof_bytes())?; + for (observed, external, label) in [ + (payload.vk_bytes(), vk_bytes, "verifying key"), + (payload.claim_bytes(), claim_bytes, "claim"), + (payload.stage2_proof_bytes(), proof_bytes, "compact proof"), + ] { + if observed != external { + bail!("Stage 3 artifact embeds a different Stage 2 {label} transport"); + } + } + + let witness = Stage2AirPcsFriWitnessV1::from_prepared(&prepared, fri)?; + let relation_program_digest = stage2_air_pcs_fri_circuit_digest(&witness)?; + let manifest = Stage3RelationManifestV1::for_prepared_and_program_digest( + &prepared, + relation_program_digest, + )?; + let expected = self.prepare_statement(&prepared, &manifest)?; + artifact.ensure_statement(&expected)?; + + let flock_artifact = Stage2AirPcsFriArtifactV1::from_parts( + witness, + payload.circuit_digest(), + payload.flock_proof_bundle_bytes().to_vec(), + )?; + verify_stage2_air_pcs_fri_production(&flock_artifact) + } } #[cfg(test)] @@ -376,6 +488,11 @@ mod tests { .prove_stage2(b"vk", &[0; 144], b"proof", &fri) .is_err() ); + assert!( + FlockStage3Backend + .preflight_and_prove_stage2(b"vk", &[0; 144], b"proof", &fri) + .is_err() + ); assert!(Stage3LoweringStatusV1::current().is_complete()); } } diff --git a/flock-stage3/host/src/limits.rs b/flock-stage3/host/src/limits.rs new file mode 100644 index 000000000..7e94f8e94 --- /dev/null +++ b/flock-stage3/host/src/limits.rs @@ -0,0 +1,244 @@ +use anyhow::{Result, bail}; +use ix_terminal::{ + OUTER_CLAIM_BYTES, STAGE2_CLAIMS_BYTES, Stage2AdviceProfileV1, + ValidatedStage2RootV1, +}; +use multi_stark::types::FriParameters; + +const MIB: u64 = 1024 * 1024; + +/// Host-side admission limits applied before a Stage 3 relation is built. +/// +/// These limits are denial-of-service guards, not cryptographic parameters and +/// not a claim that every admitted proof will fit a particular machine. The +/// exact relation census printed by preflight remains the operator's sizing +/// input. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct Stage3ResourceLimitsV1 { + pub max_verifying_key_bytes: u64, + pub max_compact_proof_bytes: u64, + pub max_advice_bytes: u64, + pub max_total_circuits: u64, + pub max_fri_queries: u64, + pub max_fri_rounds: u64, + pub max_profile_items: u64, +} + +impl Default for Stage3ResourceLimitsV1 { + fn default() -> Self { + Self { + max_verifying_key_bytes: 16 * MIB, + max_compact_proof_bytes: 64 * MIB, + max_advice_bytes: 256 * MIB, + max_total_circuits: 1 << 16, + max_fri_queries: 1_024, + max_fri_rounds: 32, + max_profile_items: 1 << 24, + } + } +} + +impl Stage3ResourceLimitsV1 { + /// Reject impossible or oversized raw inputs before decoding/verifying them. + pub fn ensure_transport( + self, + vk_bytes: &[u8], + claim_bytes: &[u8], + proof_bytes: &[u8], + fri: &FriParameters, + ) -> Result<()> { + ensure_nonempty_bounded( + vk_bytes.len(), + self.max_verifying_key_bytes, + "Stage 2 verifying key", + )?; + if claim_bytes.len() != OUTER_CLAIM_BYTES { + bail!( + "Stage 2 outer claim is {} bytes; expected {OUTER_CLAIM_BYTES}", + claim_bytes.len() + ); + } + ensure_nonempty_bounded( + proof_bytes.len(), + self.max_compact_proof_bytes, + "compact Stage 2 proof", + )?; + if fri.log_final_poly_len > 31 { + bail!("Stage 3 final-polynomial log exceeds 31"); + } + if fri.max_log_arity != 1 { + bail!("Stage 3 currently requires binary FRI (maximum log arity 1)"); + } + let queries = as_u64(fri.num_queries, "FRI query count")?; + if queries == 0 || queries > self.max_fri_queries { + bail!( + "Stage 3 FRI query count {queries} is outside 1..={}", + self.max_fri_queries + ); + } + for (label, bits) in [ + ("commit", fri.commit_proof_of_work_bits), + ("query", fri.query_proof_of_work_bits), + ] { + if bits >= 64 { + bail!("Stage 3 FRI {label} PoW width {bits} is outside 0..64"); + } + } + Ok(()) + } + + /// Reject expanded proof geometry that is too large to hand to the relation + /// compiler. This runs immediately after native proof expansion. + pub fn ensure_prepared(self, prepared: &ValidatedStage2RootV1) -> Result<()> { + ensure_nonempty_bounded( + prepared.verifying_key_bytes().len(), + self.max_verifying_key_bytes, + "expanded Stage 2 verifying key", + )?; + if prepared.claims_bytes().len() != STAGE2_CLAIMS_BYTES { + bail!( + "expanded Stage 2 claims are {} bytes; expected {STAGE2_CLAIMS_BYTES}", + prepared.claims_bytes().len() + ); + } + ensure_nonempty_bounded( + prepared.advice_bytes().len(), + self.max_advice_bytes, + "expanded Stage 2 advice", + )?; + + let profile = prepared.advice_profile(); + if profile.advice_bytes + != as_u64(prepared.advice_bytes().len(), "expanded advice length")? + { + bail!("Stage 2 advice profile byte length disagrees with its transport"); + } + ensure_range( + profile.total_circuits, + self.max_total_circuits, + "total circuit count", + )?; + if profile.active_circuits == 0 + || profile.active_circuits > profile.total_circuits + { + bail!( + "Stage 2 active circuit count {} is outside 1..={}", + profile.active_circuits, + profile.total_circuits + ); + } + ensure_range(profile.queries, self.max_fri_queries, "FRI query count")?; + ensure_range(profile.fri_rounds, self.max_fri_rounds, "FRI round count")?; + + for (label, value) in profile_items(profile) { + if value > self.max_profile_items { + bail!( + "Stage 2 {label} count {value} exceeds host admission limit {}", + self.max_profile_items + ); + } + } + Ok(()) + } +} + +fn profile_items(profile: &Stage2AdviceProfileV1) -> [(&'static str, u64); 7] { + [ + ("input rounds per query", profile.input_rounds_per_query), + ("commitment cap digest", profile.commitment_cap_digests), + ("input Merkle sibling", profile.input_merkle_siblings), + ("FRI Merkle sibling", profile.fri_merkle_siblings), + ("opened base value", profile.opened_base_values), + ("FRI sibling extension value", profile.fri_sibling_extension_values), + ("other extension value", profile.other_extension_values), + ] +} + +fn ensure_nonempty_bounded( + observed: usize, + maximum: u64, + label: &str, +) -> Result<()> { + let observed = as_u64(observed, label)?; + if observed == 0 || observed > maximum { + bail!("{label} length {observed} is outside 1..={maximum} bytes"); + } + Ok(()) +} + +fn ensure_range(observed: u64, maximum: u64, label: &str) -> Result<()> { + if observed == 0 || observed > maximum { + bail!("Stage 2 {label} {observed} is outside 1..={maximum}"); + } + Ok(()) +} + +fn as_u64(value: usize, label: &str) -> Result { + u64::try_from(value) + .map_err(|error| anyhow::anyhow!("{label} exceeds u64: {error}")) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn production_fri() -> FriParameters { + FriParameters { + log_final_poly_len: 0, + max_log_arity: 1, + num_queries: 100, + commit_proof_of_work_bits: 0, + query_proof_of_work_bits: 20, + } + } + + #[test] + fn production_parameters_pass_early_admission() { + Stage3ResourceLimitsV1::default() + .ensure_transport( + b"canonical-looking vk transport", + &[0; OUTER_CLAIM_BYTES], + b"canonical-looking compact proof transport", + &production_fri(), + ) + .unwrap(); + } + + #[test] + fn transport_admission_rejects_unsupported_or_oversized_work() { + let limits = Stage3ResourceLimitsV1 { + max_verifying_key_bytes: 2, + max_compact_proof_bytes: 3, + ..Stage3ResourceLimitsV1::default() + }; + let claim = [0; OUTER_CLAIM_BYTES]; + assert!( + limits + .ensure_transport(b"too long", &claim, b"ok", &production_fri()) + .is_err() + ); + assert!( + limits + .ensure_transport(b"ok", &claim, b"long", &production_fri()) + .is_err() + ); + + let mut non_binary = production_fri(); + non_binary.max_log_arity = 2; + assert!( + limits.ensure_transport(b"ok", &claim, b"ok", &non_binary).is_err() + ); + + let mut too_many_queries = production_fri(); + too_many_queries.num_queries = 1_025; + assert!( + limits.ensure_transport(b"ok", &claim, b"ok", &too_many_queries).is_err() + ); + + let mut invalid_pow = production_fri(); + invalid_pow.query_proof_of_work_bits = 64; + assert!( + limits.ensure_transport(b"ok", &claim, b"ok", &invalid_pow).is_err() + ); + } +} diff --git a/flock-stage3/host/src/relation.rs b/flock-stage3/host/src/relation.rs index 52fa4bd32..bdc47e228 100644 --- a/flock-stage3/host/src/relation.rs +++ b/flock-stage3/host/src/relation.rs @@ -123,12 +123,12 @@ impl Stage3LoweringStatusV1 { } } -/// Fixed capacity of one compiled Stage 3 verifier relation. +/// Exact transport and advice shape of one compiled Stage 3 verifier relation. /// -/// `for_prepared` seeds every maximum from one measured root. That is useful -/// while developing the lowering, but it is not a production capacity study: -/// the final values must cover the intended corpus before the relation program -/// digest is frozen. +/// The current relation has no padding/activation layer that would make these +/// values reusable maxima. Every word therefore identifies the exact witness +/// shape used to compile the relation. A future capacity-based relation needs a +/// new manifest version and explicit in-circuit padding constraints. #[derive(Clone, Debug, PartialEq, Eq)] pub struct Stage3RelationBoundsV1 { pub verifying_key_bytes: u64, @@ -167,73 +167,37 @@ impl Stage3RelationBoundsV1 { ] } - fn ensure_accommodates( - &self, - prepared: &ValidatedStage2RootV1, - ) -> Result<()> { + fn ensure_matches(&self, prepared: &ValidatedStage2RootV1) -> Result<()> { let observed = Self::for_prepared(prepared)?; - if observed.verifying_key_bytes != self.verifying_key_bytes { - bail!("Stage 2 verifying-key byte length differs from relation shape"); - } - if observed.claims_bytes != self.claims_bytes { - bail!("Stage 2 claims byte length differs from relation shape"); - } - if observed.advice.total_circuits != self.advice.total_circuits { - bail!("Stage 2 circuit count differs from relation shape"); - } - if observed.advice.queries != self.advice.queries { - bail!("Stage 2 query count differs from relation shape"); - } + self.ensure_same_shape(&observed) + } - let maxima = [ - (observed.advice.advice_bytes, self.advice.advice_bytes, "advice bytes"), - ( - observed.advice.active_circuits, - self.advice.active_circuits, - "active circuits", - ), - (observed.advice.fri_rounds, self.advice.fri_rounds, "FRI rounds"), - ( - observed.advice.input_rounds_per_query, - self.advice.input_rounds_per_query, - "input rounds per query", - ), - ( - observed.advice.commitment_cap_digests, - self.advice.commitment_cap_digests, - "commitment cap digests", - ), - ( - observed.advice.input_merkle_siblings, - self.advice.input_merkle_siblings, - "input Merkle siblings", - ), - ( - observed.advice.fri_merkle_siblings, - self.advice.fri_merkle_siblings, - "FRI Merkle siblings", - ), - ( - observed.advice.opened_base_values, - self.advice.opened_base_values, - "opened base values", - ), - ( - observed.advice.fri_sibling_extension_values, - self.advice.fri_sibling_extension_values, - "FRI sibling extension values", - ), - ( - observed.advice.other_extension_values, - self.advice.other_extension_values, - "other extension values", - ), + fn ensure_same_shape(&self, observed: &Self) -> Result<()> { + let labels = [ + "verifying-key bytes", + "claims bytes", + "advice bytes", + "total circuits", + "active circuits", + "queries", + "FRI rounds", + "input rounds per query", + "commitment cap digests", + "input Merkle siblings", + "FRI Merkle siblings", + "opened base values", + "FRI sibling extension values", + "other extension values", ]; - if let Some((observed, maximum, label)) = - maxima.into_iter().find(|(observed, maximum, _)| observed > maximum) + let expected_words = self.canonical_words(); + let observed_words = observed.canonical_words(); + if let Some((label, (expected, observed))) = labels + .into_iter() + .zip(expected_words.into_iter().zip(observed_words)) + .find(|(_, (expected, observed))| expected != observed) { bail!( - "Stage 2 {label} ({observed}) exceeds relation capacity ({maximum})" + "Stage 2 {label} differs from the exact relation shape: expected {expected}, observed {observed}" ); } Ok(()) @@ -244,7 +208,7 @@ impl Stage3RelationBoundsV1 { /// /// The constructor compiles the relation and installs its circuit digest. /// `relation_digest` additionally binds the Flock configuration, specialised -/// Stage 2 key, witness layout, phase mask, and exact measured capacity. +/// Stage 2 key, witness layout, phase mask, and exact measured shape. #[derive(Clone, Debug, PartialEq, Eq)] pub struct Stage3RelationManifestV1 { stage2_verifying_key_digest: [u8; 32], @@ -294,20 +258,40 @@ impl Stage3RelationManifestV1 { self.lowering_status } - pub fn ensure_accommodates( - &self, - prepared: &ValidatedStage2RootV1, - ) -> Result<()> { + pub fn ensure_matches(&self, prepared: &ValidatedStage2RootV1) -> Result<()> { if prepared.statement().verifying_key_digest() != &self.stage2_verifying_key_digest { bail!("Stage 2 verifying key differs from the specialised relation"); } - self.bounds.ensure_accommodates(prepared) + self.bounds.ensure_matches(prepared)?; + + let fri = statement_fri_parameters(prepared)?; + let observed_layout = + Stage3TypedProofWitnessV1::from_prepared(prepared, &fri)?.layout_digest(); + self.ensure_layout_digest(observed_layout) + } + + /// Compatibility spelling retained for callers written against the earlier + /// capacity terminology. The check is exact, not a less-than-or-equal test. + pub fn ensure_accommodates( + &self, + prepared: &ValidatedStage2RootV1, + ) -> Result<()> { + self.ensure_matches(prepared) + } + + fn ensure_layout_digest(&self, observed: [u8; 32]) -> Result<()> { + if observed != self.typed_witness_layout_digest { + bail!( + "Stage 2 typed witness layout differs from the exact relation shape" + ); + } + Ok(()) } /// Return the digest used in `Stage3StatementV1` for the complete, - /// content-addressed relation program and its exact capacity. + /// content-addressed relation program and its exact witness shape. pub fn relation_digest(&self) -> Result<[u8; 32]> { self.lowering_status.ensure_complete()?; if self.relation_program_digest.is_none() { @@ -365,6 +349,27 @@ fn as_u64(value: usize, label: &str) -> Result { mod tests { use super::*; + fn relation_shape() -> Stage3RelationBoundsV1 { + Stage3RelationBoundsV1 { + verifying_key_bytes: 10, + claims_bytes: 160, + advice: Stage2AdviceProfileV1 { + advice_bytes: 1_000, + total_circuits: 8, + active_circuits: 3, + queries: 100, + fri_rounds: 20, + input_rounds_per_query: 4, + commitment_cap_digests: 23, + input_merkle_siblings: 2_400, + fri_merkle_siblings: 19_000, + opened_base_values: 12_000, + fri_sibling_extension_values: 2_000, + other_extension_values: 900, + }, + } + } + #[test] fn phase_registry_is_complete_and_unique() { let status = Stage3LoweringStatusV1::current(); @@ -374,4 +379,35 @@ mod tests { assert!(status.missing_phases().is_empty()); status.ensure_complete().unwrap(); } + + #[test] + fn relation_shape_is_exact_instead_of_a_maximum() { + let expected = relation_shape(); + assert!(expected.ensure_same_shape(&expected).is_ok()); + + let mut smaller = expected.clone(); + smaller.advice.active_circuits -= 1; + let error = expected.ensure_same_shape(&smaller).unwrap_err().to_string(); + assert!(error.contains("active circuits")); + assert!(error.contains("expected 3, observed 2")); + + let mut larger = expected.clone(); + larger.advice.fri_merkle_siblings += 1; + let error = expected.ensure_same_shape(&larger).unwrap_err().to_string(); + assert!(error.contains("FRI Merkle siblings")); + assert!(error.contains("expected 19000, observed 19001")); + } + + #[test] + fn manifest_rejects_a_different_nested_layout_digest() { + let manifest = Stage3RelationManifestV1 { + stage2_verifying_key_digest: [0; 32], + typed_witness_layout_digest: [1; 32], + relation_program_digest: Some([2; 32]), + bounds: relation_shape(), + lowering_status: Stage3LoweringStatusV1::current(), + }; + assert!(manifest.ensure_layout_digest([1; 32]).is_ok()); + assert!(manifest.ensure_layout_digest([3; 32]).is_err()); + } } From b3da6a8d2f4d30d29f9cb3dcb458b10b121f4022 Mon Sep 17 00:00:00 2001 From: "John C. Burnham" Date: Sat, 5 Sep 2026 18:28:50 -0400 Subject: [PATCH 09/10] perf(flock-stage3): reduce aggregate witness capacity to 192 GiB Share PCS reductions, query points and nonzero denominators; pack four Goldilocks limbs into each canonicality row while preserving every check. Add count-first resource admission, owned prepared roots, strict JSONL CLI and artifact handling, hardened verifier-key decoding, and current-protocol native fixtures with reproducible measurements. Keep the Stage 2 minimum-opening-width profile explicit opt-in. Validated with 75 fast Stage 3 tests, 13 serial cryptographic vectors, full 100-query and two-query toy proofs with fresh-process verification, native fixtures, CLI regressions, and Aiur/terminal tests. Real-root 192 GiB sizing remains count-only; production-root peak RAM and Flock proving are not yet measured. --- .github/workflows/ci.yml | 12 +- Benchmarks/FlockRootFixture.lean | 297 +++ Cargo.lock | 1 + Ix/Aiur/Protocol.lean | 26 +- Ix/Cli/FlockRootCmd.lean | 241 +- Ix/Store.lean | 18 +- .../singleton-2026-09-05/PROVENANCE.md | 102 + .../Aggregate/singleton-2026-09-05/aggr.vk | Bin 0 -> 181630 bytes .../singleton-2026-09-05/check-env.claim | Bin 0 -> 34 bytes .../singleton-2026-09-05/execution.json | 783 +++++++ .../singleton-2026-09-05/fixture.json | 790 +++++++ .../singleton-2026-09-05/ixvm.ixon-proof | Bin 0 -> 4485008 bytes .../Aggregate/singleton-2026-09-05/ixvm.vk | Bin 0 -> 709741 bytes .../singleton-2026-09-05/outer-claim.bin | Bin 0 -> 144 bytes .../singleton-2026-09-05/root.ixon-proof | Bin 0 -> 8565030 bytes .../singleton-2026-09-05/subjects.tree | Bin 0 -> 34 bytes .../PROVENANCE.md | 139 ++ .../singleton-min-opening-2026-09-05/aggr.vk | Bin 0 -> 181630 bytes .../check-env.claim | Bin 0 -> 34 bytes .../execution.json | 785 +++++++ .../fixture.json | 792 +++++++ .../ixvm.ixon-proof | Bin 0 -> 4485008 bytes .../singleton-min-opening-2026-09-05/ixvm.vk | Bin 0 -> 709741 bytes .../outer-claim.bin | Bin 0 -> 144 bytes .../root.ixon-proof | Bin 0 -> 8002662 bytes .../subjects.tree | Bin 0 -> 34 bytes Tests/FlockRootCli.lean | 112 + Tests/MultiStark.lean | 24 +- crates/aiur/src/lib.rs | 1 + crates/aiur/src/lookup_grouping.rs | 228 ++ crates/aiur/src/synthesis.rs | 125 +- crates/aiur/src/vk_codec.rs | 301 ++- crates/ffi/src/aiur/protocol.rs | 198 +- crates/terminal/src/lib.rs | 62 +- flock-stage3/Cargo.lock | 26 + flock-stage3/Cargo.toml | 1 + flock-stage3/README.md | 449 +++- flock-stage3/STAGE4-BOUNDARY.md | 109 + flock-stage3/host/Cargo.toml | 7 + flock-stage3/host/src/air.rs | 49 +- flock-stage3/host/src/arithmetic.rs | 15 +- flock-stage3/host/src/artifact.rs | 147 +- flock-stage3/host/src/binding.rs | 21 +- flock-stage3/host/src/extension.rs | 213 +- flock-stage3/host/src/fri.rs | 1963 +++++++++++++---- flock-stage3/host/src/goldilocks.rs | 175 +- flock-stage3/host/src/lib.rs | 269 ++- flock-stage3/host/src/limits.rs | 78 +- flock-stage3/host/src/prepared.rs | 178 ++ flock-stage3/host/src/relation.rs | 84 +- flock-stage3/host/src/report.rs | 110 + flock-stage3/host/src/sizing.rs | 268 +++ flock-stage3/host/src/test_support.rs | 65 + flock-stage3/host/src/transcript.rs | 48 +- .../packed-canonicality-2026-09-05.json | 1259 +++++++++++ .../pcs-query-sharing-2026-09-05.json | 920 ++++++++ .../persisted-singleton-2026-09-05.json | 59 + .../persisted-singleton-pcs-2026-09-05.json | 95 + .../production-parameters-2026-09-05.json | 44 + ...roduction-parameters-exact-2026-09-05.json | 73 + .../production-parameters-pcs-2026-09-05.json | 304 +++ .../stage2-lookup-packing-2026-09-05.json | 694 ++++++ lakefile.lean | 5 + 63 files changed, 11763 insertions(+), 1002 deletions(-) create mode 100644 Benchmarks/FlockRootFixture.lean create mode 100644 Tests/Fixtures/Aggregate/singleton-2026-09-05/PROVENANCE.md create mode 100644 Tests/Fixtures/Aggregate/singleton-2026-09-05/aggr.vk create mode 100644 Tests/Fixtures/Aggregate/singleton-2026-09-05/check-env.claim create mode 100644 Tests/Fixtures/Aggregate/singleton-2026-09-05/execution.json create mode 100644 Tests/Fixtures/Aggregate/singleton-2026-09-05/fixture.json create mode 100644 Tests/Fixtures/Aggregate/singleton-2026-09-05/ixvm.ixon-proof create mode 100644 Tests/Fixtures/Aggregate/singleton-2026-09-05/ixvm.vk create mode 100644 Tests/Fixtures/Aggregate/singleton-2026-09-05/outer-claim.bin create mode 100644 Tests/Fixtures/Aggregate/singleton-2026-09-05/root.ixon-proof create mode 100644 Tests/Fixtures/Aggregate/singleton-2026-09-05/subjects.tree create mode 100644 Tests/Fixtures/Aggregate/singleton-min-opening-2026-09-05/PROVENANCE.md create mode 100644 Tests/Fixtures/Aggregate/singleton-min-opening-2026-09-05/aggr.vk create mode 100644 Tests/Fixtures/Aggregate/singleton-min-opening-2026-09-05/check-env.claim create mode 100644 Tests/Fixtures/Aggregate/singleton-min-opening-2026-09-05/execution.json create mode 100644 Tests/Fixtures/Aggregate/singleton-min-opening-2026-09-05/fixture.json create mode 100644 Tests/Fixtures/Aggregate/singleton-min-opening-2026-09-05/ixvm.ixon-proof create mode 100644 Tests/Fixtures/Aggregate/singleton-min-opening-2026-09-05/ixvm.vk create mode 100644 Tests/Fixtures/Aggregate/singleton-min-opening-2026-09-05/outer-claim.bin create mode 100644 Tests/Fixtures/Aggregate/singleton-min-opening-2026-09-05/root.ixon-proof create mode 100644 Tests/Fixtures/Aggregate/singleton-min-opening-2026-09-05/subjects.tree create mode 100644 Tests/FlockRootCli.lean create mode 100644 crates/aiur/src/lookup_grouping.rs create mode 100644 flock-stage3/STAGE4-BOUNDARY.md create mode 100644 flock-stage3/host/src/prepared.rs create mode 100644 flock-stage3/host/src/report.rs create mode 100644 flock-stage3/host/src/sizing.rs create mode 100644 flock-stage3/host/src/test_support.rs create mode 100644 flock-stage3/measurements/packed-canonicality-2026-09-05.json create mode 100644 flock-stage3/measurements/pcs-query-sharing-2026-09-05.json create mode 100644 flock-stage3/measurements/persisted-singleton-2026-09-05.json create mode 100644 flock-stage3/measurements/persisted-singleton-pcs-2026-09-05.json create mode 100644 flock-stage3/measurements/production-parameters-2026-09-05.json create mode 100644 flock-stage3/measurements/production-parameters-exact-2026-09-05.json create mode 100644 flock-stage3/measurements/production-parameters-pcs-2026-09-05.json create mode 100644 flock-stage3/measurements/stage2-lookup-packing-2026-09-05.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 82b654df5..7d8323a98 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -153,8 +153,16 @@ jobs: with: auto-config: false use-github-cache: false - - name: Link Flock-enabled ix CLI - run: IX_FLOCK=1 lake build ix + - name: Link Flock-enabled ix CLI and fixture harness + run: IX_FLOCK=1 lake build ix bench-flock-root-fixture + - name: Verify persisted current-protocol aggregate fixture + run: | + .lake/build/bin/bench-flock-root-fixture --verify Tests/Fixtures/Aggregate/singleton-2026-09-05 + .lake/build/bin/bench-flock-root-fixture --min-opening-width --verify Tests/Fixtures/Aggregate/singleton-min-opening-2026-09-05 + - name: Test Flock CLI JSONL and artifact safety + run: | + ulimit -v 16777216 + lake env lean --run Tests/FlockRootCli.lean # Compile and link the opt-in backend without requiring a GPU. Runtime and # proof-byte equivalence are covered by multi-stark's NVIDIA smoke suite. diff --git a/Benchmarks/FlockRootFixture.lean b/Benchmarks/FlockRootFixture.lean new file mode 100644 index 000000000..71514927d --- /dev/null +++ b/Benchmarks/FlockRootFixture.lean @@ -0,0 +1,297 @@ +import Ix.Cli.FlockRootCmd +import Ix.Aiur.Statistics +import Ix.Benchmark.Bench +import Ix.TracingTexray + +/-! +A small, genuine production-protocol `ix_aggr` root for Stage 3 measurements. +The environment has one well-formed axiom declaration, not a toy verifier +circuit. Both systems use the CLI's canonical parameters. No store or cache +is accessed. Outputs go into a newly created directory, never an existing one. + +The default run proves the tiny IxVM child and only EXECUTES its aggregate +wrap. `--prove` also proves, verifies, and persists the aggregate. Require a +finite Linux address-space limit of at most 64 GiB in either mode: recursive +prover RAM estimates were calibrated on an older protocol, so they are not a +safe absolute budget for this measurement. Allocation failure can terminate +the subprocess; an incomplete directory is not a completed fixture. +`--verify DIRECTORY` checks a completed fixture in a fresh process without +proving, modifying files, or requiring the generation-only memory cap. +`--min-opening-width` explicitly selects the experimental aggregate lookup +packing profile in any mode. The default profile/keys remain unchanged. +`--count DIRECTORY` verifies the fixture, then counts Stage 3 with a one-byte +witness admission limit, so it cannot compile wiring or invoke a prover. +-/ + +open Lean (Json toJson) + +namespace Benchmarks.FlockRootFixture + +private def require (condition : Bool) (message : String) : IO Unit := do + unless condition do throw <| IO.userError message + +private def timed (label : String) (action : Unit → Except String α) : IO (α × Nat) := do + IO.eprintln s!"[flock-root-fixture] {label}" + let start ← IO.monoNanosNow + let result ← IO.ofExcept (← blackBoxIO action ()) + return (result, ((← IO.monoNanosNow) - start) / 1000) + +private def memoryCap : IO Nat := do + let limits ← IO.FS.readFile "/proc/self/limits" + let some line := (limits.splitOn "\n").find? (·.startsWith "Max address space") + | throw <| IO.userError "could not read the process address-space limit" + let fields := line.splitOn " " |>.filter (!·.isEmpty) + let cap := (fields[3]?).bind String.toNat? + let some cap := cap + | throw <| IO.userError "set a finite process memory cap: ulimit -v 67108864 (64 GiB)" + require (cap > 0 && cap ≤ 64 * 1024 ^ 3) + "the process address-space limit must be positive and at most 64 GiB" + return cap + +private def singletonEnv : Ixon.Env × Address := + let constant : Ixon.Constant := + ⟨.axio ⟨false, 0, .sort 0⟩, #[], #[], #[.succ .zero]⟩ + let address := Address.blake3 (Ixon.serConstant constant) + (({} : Ixon.Env).storeConst address constant, address) + +private def compile (source : Except Aiur.Global Aiur.Source.Toplevel) : + Except String Aiur.CompiledToplevel := do + let top ← source.mapError toString + top.compile.mapError toString + +private def writeBytes (directory : System.FilePath) (name : String) + (bytes : ByteArray) : IO Json := do + IO.FS.writeBinFile (directory / name) bytes + return Json.mkObj [("file", toJson name), ("bytes", toJson bytes.size), + ("blake3", toJson (toString (Address.blake3 bytes)))] + +private def circuitRow (stats : Aiur.CircuitStats) : Json := + Json.mkObj [("name", toJson stats.name), ("height", toJson stats.height), + ("committed_width", toJson stats.width), ("cache_hits", toJson stats.cacheHits)] + +private def lookupPolicy (minOpeningWidth : Bool) : String := + if minOpeningWidth then "min-opening-width-v1" else "legacy" + +private def aggregateSystem (compiled : Aiur.CompiledToplevel) + (minOpeningWidth : Bool) : Aiur.AiurSystem := + let recursion := MultiStark.defaultRecursionParameters + if minOpeningWidth then + Aiur.AiurSystem.buildMinOpeningWidth compiled.bytecode recursion.commitment recursion.fri + else MultiStark.buildRecursionSystem compiled.bytecode recursion + +/-- Fresh-process verification is deliberately cheap enough for CI. Validate +the persisted transport and the exact singleton subject, not just a proof of +an arbitrary self-reported bundled claim. -/ +private def verify (directory : System.FilePath) (minOpeningWidth count : Bool) : IO Unit := do + if count then discard memoryCap + let manifestBytes ← Ix.Cli.FlockRootCmd.readBounded (directory / "fixture.json") (1024 ^ 2) + let some manifestText := String.fromUTF8? manifestBytes + | throw <| IO.userError "fixture manifest is not UTF-8" + let manifest ← IO.ofExcept (Json.parse manifestText) + require ((← IO.ofExcept (manifest.getObjValAs? String "schema")) == "ix.flock-stage3.root-fixture") + "unexpected fixture schema" + require ((← IO.ofExcept (manifest.getObjValAs? Nat "version")) == 1) "unexpected fixture version" + require (← IO.ofExcept (manifest.getObjValAs? Bool "aggregate_proven")) "fixture is execution-only" + let policy ← match manifest.getObjVal? "aggregate_lookup_policy" with + | .ok json => IO.ofExcept (Lean.fromJson? json : Except String String) + | .error _ => pure "legacy" + require (policy == lookupPolicy minOpeningWidth) + "fixture lookup policy differs from the explicitly requested profile" + let inputs ← IO.ofExcept (manifest.getObjValAs? (Array Json) "inputs") + let records := inputs.push (← IO.ofExcept (manifest.getObjVal? "child")) + |>.push (← IO.ofExcept (manifest.getObjVal? "root")) + let names := #["environment.ixe", "check-env.claim", "subjects.tree", "ixvm.vk", + "aggr.vk", "outer-claim.bin", "ixvm.ixon-proof", "root.ixon-proof"] + require (records.size == names.size) "unexpected fixture file count" + let mut files : Std.HashMap String ByteArray := {} + for (record, name) in records.zip names do + -- Only literal filenames may select a read; never follow a manifest path. + require ((← IO.ofExcept (record.getObjValAs? String "file")) == name) "unexpected fixture filename" + let bytes ← Ix.Cli.FlockRootCmd.readBounded (directory / name) (64 * 1024 ^ 2) + require ((← IO.ofExcept (record.getObjValAs? Nat "bytes")) == bytes.size) s!"{name}: size changed" + require ((← IO.ofExcept (record.getObjValAs? String "blake3")) == toString (Address.blake3 bytes)) + s!"{name}: digest changed" + files := files.insert name bytes + -- Verify the same bounded, digest-checked bytes; do not re-open mutable + -- paths between transport validation and native proof verification. + let read := fun name => files[name]! + let (env, owned) := singletonEnv + require (read "environment.ixe" == (← IO.ofExcept (Ixon.serEnv env))) + "fixture environment is not the expected singleton" + let (claim, trees) ← IO.ofExcept (IxVM.ClaimHarness.shardCheckEnvClaimTrees env #[owned]) + let statement ← IO.ofExcept (MultiStark.CheckEnvTrees.ofClaim claim trees) + require (read "subjects.tree" == statement.subjects.ser) + "fixture subject tree changed" + let claimBytes := Ix.Claim.ser claim + require (read "check-env.claim" == claimBytes) "fixture claim changed" + let (ixvmSystem, compiled) ← IO.ofExcept (← Ix.Cli.VerifyCmd.buildBackend) + let some verifyIdx := compiled.getFuncIdx `verify_claim + | throw <| IO.userError "missing verify_claim entrypoint" + require (read "ixvm.vk" == ixvmSystem.vkBytes) "IxVM key changed" + let aggrCompiled ← IO.ofExcept (compile Aggr.ixAggr) + let some aggrIdx := aggrCompiled.getFuncIdx `ix_aggr + | throw <| IO.userError "missing ix_aggr entrypoint" + let aggrSystem := aggregateSystem aggrCompiled minOpeningWidth + require (read "aggr.vk" == aggrSystem.vkBytes) "aggregate key changed" + let allowed := Aggr.allowedBlob ixvmSystem.vkBytes verifyIdx aggrSystem.vkBytes aggrIdx + let outerClaim := Ix.Cli.AggregateCmd.aggregateOuterClaim allowed aggrIdx claim + require (read "outer-claim.bin" == + Ix.Cli.FlockRootCmd.outerClaimBytes outerClaim) "aggregate outer claim changed" + let innerClaim := Aiur.buildClaim verifyIdx + (IxVM.ClaimHarness.packedDigestKey (Address.blake3 claimBytes)) #[] + for (name, system, expected) in + [("ixvm.ixon-proof", ixvmSystem, innerClaim), ("root.ixon-proof", aggrSystem, outerClaim)] do + let wrapper ← IO.ofExcept (Ixon.Proof.de (read name)) + require (wrapper.claim == claim) s!"{name}: bundled claim changed" + let proof ← IO.ofExcept (Aiur.Proof.ofBytesChecked wrapper.proof) + IO.ofExcept (system.verify expected proof) + let verified := "Flock root fixture digests, subjects, keys, and native proofs verified" + if count then IO.eprintln verified else IO.println verified + if count then + let wrapper ← IO.ofExcept (Ixon.Proof.de (read "root.ixon-proof")) + let outcome : Except String String ← try + pure (.ok (← Aiur.flockStage3AggregateRoot + aggrSystem.vkBytes (Ix.Cli.FlockRootCmd.outerClaimBytes outerClaim) + wrapper.proof MultiStark.defaultRecursionParameters.fri "preflight" "" "" + "{\"max_table_capacity\":4294967296,\"max_union_witness_bytes\":1}")) + catch error => pure (.error error.toString) + match outcome with + | .ok _ => throw <| IO.userError "count-only mode unexpectedly passed one-byte witness admission" + | .error message => + require (message.startsWith "Stage 3 padded union witness requires ") message + IO.println <| (Json.mkObj [("schema", toJson "ix.flock-stage3.fixture-count"), + ("version", toJson (1 : Nat)), ("aggregate_lookup_policy", toJson policy), + ("compiled", toJson false), ("admission_error", toJson message)]).compress + +private def generate (directory : System.FilePath) (prove minOpeningWidth : Bool) : IO Unit := do + let cap ← memoryCap + -- createDir is exclusive: an existing directory, including a symlink, + -- fails before any output is written. Never create the user's store. + IO.FS.createDir directory + TracingTexray.startSampler 10 + let (env, owned) := singletonEnv + let envBytes ← IO.ofExcept (Ixon.serEnv env) + let handle ← IO.ofExcept (Aiur.EnvHandle.fromBytes envBytes) + let (claim, trees) ← IO.ofExcept (IxVM.ClaimHarness.shardCheckEnvClaimTrees env #[owned]) + IO.ofExcept (Ix.Cli.FlockRootCmd.validateBundledClaim claim) + let statement ← IO.ofExcept (MultiStark.CheckEnvTrees.ofClaim claim trees) + let audited ← IO.ofExcept <| Ix.Cli.VerifyCmd.auditAggregateConstants env + (Ix.Cli.AggregateCmd.toAggrCheckEnvTrees statement) + require (audited == 1) "fixture must certify exactly one environment constant" + let claimBytes := Ix.Claim.ser claim + let environmentFile ← writeBytes directory "environment.ixe" envBytes + let claimFile ← writeBytes directory "check-env.claim" claimBytes + let subjectsFile ← writeBytes directory "subjects.tree" statement.subjects.ser + let (ixvmCompiled, ixvmCompileUs) ← timed "compile IxVM" fun _ => compile IxVM.ixVM + let (aggrCompiled, aggrCompileUs) ← timed "compile ix_aggr" fun _ => compile Aggr.ixAggr + let some verifyIdx := ixvmCompiled.getFuncIdx `verify_claim + | throw <| IO.userError "missing verify_claim entrypoint" + let some aggrIdx := aggrCompiled.getFuncIdx `ix_aggr + | throw <| IO.userError "missing ix_aggr entrypoint" + let recursion := MultiStark.defaultRecursionParameters + let ixvmSystem := Aiur.AiurSystem.build ixvmCompiled.bytecode + Aiur.defaultCommitmentParameters Aiur.defaultFriParameters + let aggrSystem := aggregateSystem aggrCompiled minOpeningWidth + let ixvmVk := ixvmSystem.vkBytes + let aggrVk := aggrSystem.vkBytes + let allowed := Aggr.allowedBlob ixvmVk verifyIdx aggrVk aggrIdx + let ixvmVkFile ← writeBytes directory "ixvm.vk" ixvmVk + let aggrVkFile ← writeBytes directory "aggr.vk" aggrVk + let innerClaim := Aiur.buildClaim verifyIdx + (IxVM.ClaimHarness.packedDigestKey (Address.blake3 claimBytes)) #[] + TracingTexray.resetPeakTreeRss + let (inner, ixvmProveUs) ← timed "prove IxVM child (2 GiB model budget)" fun _ => + ixvmSystem.shardProveWithEnv verifyIdx handle owned.hash (2 * 1024 ^ 3) + require (inner.claimBytes == claimBytes) "native shard claim differs from host reconstruction" + let some innerProof := inner.proof + | throw <| IO.userError s!"IxVM child exceeds budget: predicted {inner.peakBytes} bytes" + let ixvmPeak ← TracingTexray.peakTreeRssBytes + let (_, ixvmVerifyUs) ← timed "verify IxVM child" fun _ => + ixvmSystem.verify innerClaim innerProof + let childFile ← writeBytes directory "ixvm.ixon-proof" + (Ixon.Proof.ser { claim, proof := innerProof.toBytes }) + let advice ← IO.ofExcept (ixvmSystem.proofToAdviceBytes innerClaim innerProof) + let childClaims := MultiStark.serializeClaims #[innerClaim] + let pubInput := Aggr.pubInput allowed claimBytes + let outerClaim := Ix.Cli.AggregateCmd.aggregateOuterClaim allowed aggrIdx claim + let outerFile ← writeBytes directory "outer-claim.bin" + (Ix.Cli.FlockRootCmd.outerClaimBytes outerClaim) + TracingTexray.resetPeakTreeRss + let ((output, queries), aggrExecuteUs) ← timed "execute ix_aggr wrap (no aggregate proof yet)" fun _ => + aggrCompiled.bytecode.executeIxAggr aggrIdx pubInput 0 + advice ByteArray.empty ixvmVk aggrVk childClaims ByteArray.empty + claimBytes allowed (Aggr.preimagesBlob #[]) (Aggr.treesBlob #[]) (Aggr.pathsBlob #[]) + require (Aiur.buildClaim aggrIdx pubInput output == outerClaim) + "aggregate execution produced an unexpected outer claim" + let aggrExecutePeak ← TracingTexray.peakTreeRssBytes + let stats := Aiur.computeStats aggrCompiled queries aggrSystem.circuitShapes + recursion.commitment.logBlowup + let base := [("schema", toJson "ix.flock-stage3.root-fixture"), ("version", toJson (1 : Nat)), + ("lean_toolchain", toJson Lean.versionString), + ("description", toJson "single well-formed axiom declaration; production ix_aggr shape-0 wrap"), + ("aggregate_lookup_policy", toJson (lookupPolicy minOpeningWidth)), + ("active_committed_width", toJson <| stats.circuits.foldl + (fun total circuit => total + if circuit.height == 0 then 0 else circuit.width) 0), + ("subject", toJson (toString owned)), ("bundled_claim", toJson (toString claim)), + ("address_space_limit_bytes", toJson cap), + ("fri", Json.mkObj [("num_queries", toJson recursion.fri.numQueries), + ("query_pow_bits", toJson recursion.fri.queryProofOfWorkBits), + ("commit_pow_bits", toJson recursion.fri.commitProofOfWorkBits), + ("max_log_arity", toJson recursion.fri.maxLogArity), + ("log_final_poly_len", toJson recursion.fri.logFinalPolyLen), + ("log_blowup", toJson recursion.commitment.logBlowup)]), + ("inputs", Json.arr #[environmentFile, claimFile, subjectsFile, ixvmVkFile, aggrVkFile, outerFile]), + ("child", childFile), ("ixvm_compile_us", toJson ixvmCompileUs), + ("aggr_compile_us", toJson aggrCompileUs), ("ixvm_prove_us", toJson ixvmProveUs), + ("ixvm_verify_us", toJson ixvmVerifyUs), ("ixvm_predicted_peak_bytes", toJson inner.peakBytes), + ("ixvm_sampled_peak_rss_bytes", toJson ixvmPeak), + ("aggr_execute_us", toJson aggrExecuteUs), + ("aggr_execute_sampled_peak_rss_bytes", toJson aggrExecutePeak), + ("aggregate_circuits", Json.arr (stats.circuits.map circuitRow))] + IO.FS.writeFile (directory / "execution.json") + ((Json.mkObj (base ++ [("aggregate_proven", toJson false)])).pretty ++ "\n") + unless prove do + IO.println s!"Aggregate execution passed; measurements: {directory / "execution.json"}" + return + TracingTexray.resetPeakTreeRss + let ((provedClaim, proof), aggrProveUs) ← timed "prove ix_aggr wrap (process memory cap enforced)" fun _ => + aggrSystem.proveIxAggr aggrIdx pubInput 0 + advice ByteArray.empty ixvmVk aggrVk childClaims ByteArray.empty + claimBytes allowed (Aggr.preimagesBlob #[]) (Aggr.treesBlob #[]) (Aggr.pathsBlob #[]) + let aggrProvePeak ← TracingTexray.peakTreeRssBytes + require (provedClaim == outerClaim) "aggregate proof produced an unexpected outer claim" + let (_, aggrVerifyUs) ← timed "verify ix_aggr wrap" fun _ => aggrSystem.verify outerClaim proof + let rootFile ← writeBytes directory "root.ixon-proof" + (Ixon.Proof.ser { claim, proof := proof.toBytes }) + -- Re-read the persisted transport, not just the in-memory proof handle. + let wrapper ← IO.ofExcept (Ixon.Proof.de (← IO.FS.readBinFile (directory / "root.ixon-proof"))) + require (wrapper.claim == claim) "persisted aggregate claim changed" + let rereadProof ← IO.ofExcept (Aiur.Proof.ofBytesChecked wrapper.proof) + IO.ofExcept (aggrSystem.verify outerClaim rereadProof) + IO.FS.writeFile (directory / "fixture.json") + ((Json.mkObj (base ++ [("aggregate_proven", toJson true), ("root", rootFile), + ("aggr_prove_us", toJson aggrProveUs), ("aggr_verify_us", toJson aggrVerifyUs), + ("aggr_prove_sampled_peak_rss_bytes", toJson aggrProvePeak)])).pretty ++ "\n") + IO.println s!"Verified current-protocol aggregate: {directory / "root.ixon-proof"}" + +end Benchmarks.FlockRootFixture + +def main (args : List String) : IO UInt32 := do + try + let minOpeningWidth := args.contains "--min-opening-width" + let args := args.erase "--min-opening-width" + if let ["--verify", directory] := args then + Benchmarks.FlockRootFixture.verify directory minOpeningWidth false + return 0 + if let ["--count", directory] := args then + Benchmarks.FlockRootFixture.verify directory minOpeningWidth true + return 0 + let (directory, prove) ← match args with + | ["--output", directory] => pure (directory, false) + | ["--output", directory, "--prove"] => pure (directory, true) + | _ => throw (IO.userError "usage: bench-flock-root-fixture [--min-opening-width] (--output NEW_DIRECTORY [--prove] | --verify DIRECTORY | --count DIRECTORY)") + Benchmarks.FlockRootFixture.generate directory prove minOpeningWidth + return 0 + catch error => + IO.eprintln s!"flock-root-fixture: {error}" + return 1 diff --git a/Cargo.lock b/Cargo.lock index 577d4bc6f..1a278fb10 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -915,6 +915,7 @@ dependencies = [ "multi-stark", "rayon", "serde", + "serde_json", ] [[package]] diff --git a/Ix/Aiur/Protocol.lean b/Ix/Aiur/Protocol.lean index d448f8a3d..1f47da0a8 100644 --- a/Ix/Aiur/Protocol.lean +++ b/Ix/Aiur/Protocol.lean @@ -108,6 +108,14 @@ namespace AiurSystem @[extern "rs_aiur_system_build"] opaque build : @&Bytecode.Toplevel → @&CommitmentParameters → @&FriParameters → AiurSystem +/-- Experimental, opt-in key profile minimizing lookup-accumulator plus +quotient opening width within the existing blowup. FRI parameters and user +constraints are unchanged, but the verifying key changes. Larger quotients +may make native proving slower; this is not the deployment default. -/ +@[extern "rs_aiur_system_build_min_opening_width"] +opaque buildMinOpeningWidth : + @&Bytecode.Toplevel → @&CommitmentParameters → @&FriParameters → AiurSystem + /-- Serialize the verifying key (`System`) to bytes. -/ @[extern "rs_aiur_system_vk_bytes"] opaque vkBytes : @& AiurSystem → ByteArray @@ -418,13 +426,23 @@ abbrev functionChannel : G := .ofNat 0 def buildClaim (funIdx : Bytecode.FunIdx) (input output : Array G) := #[functionChannel, .ofNat funIdx] ++ input ++ output +-- Keep the operation effectful, but transport backend failures as Except. +-- The pinned Rust lean-ffi helper hardcodes an IO.Error constructor tag that +-- does not match this Lean toolchain; let Lean construct IO.userError instead. +@[extern "rs_flock_stage3_aggregate_root"] +private opaque flockStage3AggregateRootRaw : @& ByteArray → @& ByteArray → @& ByteArray → + @& FriParameters → @& String → @& String → @& String → @& String → IO (Except String String) + /-- Compile/evaluate (preflight), prove, or independently verify the complete no-RISC-V Flock Stage 3 relation for one Aiur aggregate root. Proving requires an output path; verification requires an artifact path. Without the Cargo flock -feature, this binding returns a descriptive error while remaining linkable. -/ -@[extern "rs_flock_stage3_aggregate_root"] -opaque flockStage3AggregateRoot : @& ByteArray → @& ByteArray → @& ByteArray → - @& FriParameters → @& String → @& String → @& String → Except String Unit +feature, this binding returns a descriptive error while remaining linkable. +The final argument is a JSON object of host resource-limit overrides. The +result is a JSON diagnostic object; progress is written only to stderr. -/ +def flockStage3AggregateRoot (vkBytes claimBytes proofBytes : ByteArray) + (friParameters : FriParameters) (mode artifactPath output limitsJson : String) : IO String := do + IO.ofExcept (← flockStage3AggregateRootRaw vkBytes claimBytes proofBytes + friParameters mode artifactPath output limitsJson) end Aiur diff --git a/Ix/Cli/FlockRootCmd.lean b/Ix/Cli/FlockRootCmd.lean index 26c837c95..1411d6085 100644 --- a/Ix/Cli/FlockRootCmd.lean +++ b/Ix/Cli/FlockRootCmd.lean @@ -1,12 +1,8 @@ /- -`ix flock-root ROOT_ADDRESS` consumes the same canonical aggregate-root -transport as `ix compress-root`, then compiles/evaluates the complete Stage 3 -relation (`preflight`), emits a verified artifact (`prove`), or verifies an -artifact against that external root (`verify`). - -Preflight deliberately stops before the cryptographic prover. It is the cheap -compatibility and exact-shape sizing gate for a production-sized Stage 2 -aggregate. +Preflight closed aggregate roots, prove one root, or verify its Stage 3 +artifact. JSONL stdout contains one versioned result per requested root; +progress and pre-prove reports go to stderr. A batch reuses only the Aiur +backend, never a root-specific Flock relation. -/ module public import Cli @@ -15,6 +11,7 @@ public import Ix.Aiur.Protocol public import Ix.Aggr public import Ix.Cli.AggregateCmd public import Ix.Cli.VerifyCmd +public import Ix.Common public import Ix.Ixon public import Ix.MultiStark public import Ix.Store @@ -24,49 +21,9 @@ public section namespace Ix.Cli.FlockRootCmd -/-- Canonical terminal claim encoding: one little-endian u64 per Goldilocks -word. -/ def outerClaimBytes (claim : Array Aiur.G) : ByteArray := claim.foldl (init := .empty) fun bytes value => bytes ++ value.val.toLEBytes -/-- Canonical Flock transport reconstructed from a persisted aggregate -wrapper. -/ -structure AggregateRootInputs where - rootAddress : Address - bundledClaim : Ix.Claim - verifyingKey : ByteArray - outerClaim : ByteArray - proof : ByteArray - fri : Aiur.FriParameters - -def prepareAggregateRootInputs - (rootHex : String) : IO (Except String AggregateRootInputs) := do - let some rootAddress := Address.fromString rootHex - | return .error s!"aggregate root: expected 64-char hex (32-byte address), \ - got {rootHex.length}-char {rootHex}" - let wrapper ← match Ixon.Proof.de (← StoreIO.toIO (Store.read rootAddress)) with - | .ok wrapper => pure wrapper - | .error error => - return .error s!"aggregate wrapper {rootAddress} does not decode: {error}" - let recursionParameters := MultiStark.defaultRecursionParameters - let backend ← - match ← Ix.Cli.VerifyCmd.buildAggregateBackend recursionParameters with - | .ok backend => pure backend - | .error error => return .error error - let outerClaim := Ix.Cli.AggregateCmd.aggregateOuterClaim - backend.allowed backend.aggrIdx wrapper.claim - if outerClaim.size != 18 then - return .error - s!"internal ix_aggr claim width is {outerClaim.size}, expected 18" - return .ok { - rootAddress - bundledClaim := wrapper.claim - verifyingKey := backend.system.vkBytes - outerClaim := outerClaimBytes outerClaim - proof := wrapper.proof - fri := recursionParameters.fri - } - /-- Flock Stage 3 accepts only closed aggregate roots. -/ def validateBundledClaim (claim : Ix.Claim) : Except String Unit := do let .checkEnv _ assumptions := claim @@ -74,48 +31,142 @@ def validateBundledClaim (claim : Ix.Claim) : Except String Unit := do if assumptions.isSome then throw "aggregate root retains assumptions; Flock Stage 3 requires a closed root" -def runFlockRootCmd (p : Cli.Parsed) : IO UInt32 := do - let roots := (p.variableArgsAs! String).toList - let rootHex ← match roots with - | [root] => pure root - | [] => p.printError "error: expected one aggregate root address"; return 1 - | _ => p.printError "error: expected exactly one aggregate root address"; return 1 - let mode := (p.flag? "mode").map (·.as! String) |>.getD "preflight" - if mode != "preflight" && mode != "prove" && mode != "verify" then - IO.eprintln - s!"error: unknown Flock mode `{mode}` (expected preflight|prove|verify)" - return 1 - let artifact := (p.flag? "artifact").map (·.as! String) |>.getD "" - let output := (p.flag? "output").map (·.as! String) |>.getD "" - if mode == "preflight" && (!artifact.isEmpty || !output.isEmpty) then - IO.eprintln - "error: --artifact and --output are not valid with --mode preflight" - return 1 - if mode == "prove" && (!artifact.isEmpty || output.isEmpty) then - IO.eprintln "error: Flock proving requires --output and forbids --artifact" - return 1 - if mode == "verify" && (artifact.isEmpty || !output.isEmpty) then - IO.eprintln "error: Flock verification requires --artifact and forbids --output" - return 1 +/-- Bound reads even if a file grows after opening; do not allocate from an +untrusted file length. The extra byte detects oversized wrappers. -/ +def readBounded (path : System.FilePath) (maximum : Nat) : IO ByteArray := do + let handle ← IO.FS.Handle.mk path .read + let mut bytes := ByteArray.empty + repeat + let chunk ← handle.read (min (1024 * 1024) (maximum + 1 - bytes.size)).toUSize + if chunk.isEmpty then return bytes + bytes := bytes ++ chunk + if bytes.size > maximum then + throw <| IO.userError s!"{path} exceeds the {maximum}-byte input limit" + +/-- Read the canonical wrapper without changing the store. File mode derives +its address from the bytes; address mode also checks the requested identity. -/ +def loadAggregateWrapper (rootHex rootFile : String) : IO (Address × Ixon.Proof) := do + let maximum := 64 * 1024 * 1024 + 4096 + let (address, bytes) ← if rootFile.isEmpty then do + let some address := Address.fromString rootHex + | throw <| IO.userError s!"aggregate root: expected a 64-char hex address, got {rootHex}" + let path ← StoreIO.toIO (Store.existingPath address) + pure (address, ← readBounded path maximum) + else do + let bytes ← readBounded rootFile maximum + pure (Address.blake3 bytes, bytes) + let wrapper ← IO.ofExcept <| VerifyCmd.decodeAggregateWrapperAt address bytes + IO.ofExcept <| validateBundledClaim wrapper.claim + return (address, wrapper) - let inputs ← match ← prepareAggregateRootInputs rootHex with - | .ok inputs => pure inputs - | .error error => IO.eprintln s!"error: {error}"; return 1 - match validateBundledClaim inputs.bundledClaim with - | .ok () => pure () - | .error error => IO.eprintln s!"error: {error}"; return 1 +abbrev CachedBackend := Option (Except String VerifyCmd.AggregateBackend) - IO.println s!"Flock Stage 3 {mode}: aggregate root {inputs.rootAddress}" - IO.println s!" bundled claim: {inputs.bundledClaim}" - IO.println s!" recursion vk: {Address.blake3 inputs.verifyingKey}" - (← IO.getStdout).flush - match Aiur.flockStage3AggregateRoot inputs.verifyingKey inputs.outerClaim - inputs.proof inputs.fri mode artifact output with - | .ok () => - IO.println s!"ok: Flock Stage 3 {mode} accepted aggregate root {inputs.rootAddress}" - return 0 - | .error error => - IO.eprintln s!"error: Flock Stage 3 {mode} failed: {error}" +def runRoot (rootHex rootFile mode artifact output limits : String) + (backendRef : IO.Ref CachedBackend) : IO Lean.Json := do + let started ← IO.monoNanosNow + let (address, wrapper) ← loadAggregateWrapper rootHex rootFile + let recursionParameters := MultiStark.defaultRecursionParameters + let backendStarted ← IO.monoNanosNow + let cached ← backendRef.get + let backend ← match cached with + | some result => IO.ofExcept result + | none => do + let result ← VerifyCmd.buildAggregateBackend recursionParameters + backendRef.set (some result) + IO.ofExcept result + let backendUs := ((← IO.monoNanosNow) - backendStarted) / 1000 + let outerClaim := AggregateCmd.aggregateOuterClaim + backend.allowed backend.aggrIdx wrapper.claim + if outerClaim.size != 18 then + throw <| IO.userError s!"internal ix_aggr claim width is {outerClaim.size}, expected 18" + IO.eprintln s!"Flock Stage 3 {mode}: aggregate root {address}" + let report ← Aiur.flockStage3AggregateRoot + backend.system.vkBytes (outerClaimBytes outerClaim) wrapper.proof + recursionParameters.fri mode artifact output limits + let details ← IO.ofExcept (Lean.Json.parse report) + return Lean.Json.mkObj + [ ("root_address", Lean.toJson (toString address)) + , ("bundled_claim", Lean.toJson (toString wrapper.claim)) + , ("backend_prepare_us", Lean.toJson backendUs) + , ("backend_cache", Lean.toJson (if cached.isSome then "hit" else "miss")) + , ("root_total_us", Lean.toJson (((← IO.monoNanosNow) - started) / 1000)) + , ("details", details) ] + +def resourceLimitsJson (p : Cli.Parsed) : Except String String := do + let mut fields := [] + for (flag, field, scale) in + [("max-advice-mib", "max_advice_bytes", 1024 * 1024), + ("max-witness-mib", "max_union_witness_bytes", 1024 * 1024), + ("max-table-capacity", "max_table_capacity", 1)] do + if let some value := p.flag? flag then + let text := value.as! String + let some n := text.toNat? + | throw s!"--{flag} requires a positive integer" + if n == 0 || n * scale > 18446744073709551615 then + throw s!"--{flag} is outside the positive u64 range after scaling" + fields := fields ++ [(field, Lean.toJson (n * scale))] + return (Lean.Json.mkObj fields).compress + +def runFlockRootCmd (p : Cli.Parsed) : IO UInt32 := do + let flag (name : String) := (p.flag? name).map (·.as! String) |>.getD "" + let mode := if (flag "mode").isEmpty then "preflight" else flag "mode" + let artifact := flag "artifact" + let output := flag "output" + let rootFile := flag "root-file" + let rootsFile := flag "roots-file" + let jsonl := p.hasFlag "jsonl" + try + if mode != "preflight" && mode != "prove" && mode != "verify" then + throw <| IO.userError s!"unknown Flock mode {mode} (expected preflight|prove|verify)" + if mode == "preflight" && (!artifact.isEmpty || !output.isEmpty) then + throw <| IO.userError "--artifact and --output are not valid with --mode preflight" + if mode == "prove" && (!artifact.isEmpty || output.isEmpty) then + throw <| IO.userError "Flock proving requires --output and forbids --artifact" + if mode == "verify" && (artifact.isEmpty || !output.isEmpty) then + throw <| IO.userError "Flock verification requires --artifact and forbids --output" + let limits ← IO.ofExcept (resourceLimitsJson p) + let mut roots := p.variableArgsAs! String + if !rootsFile.isEmpty then + let bytes ← readBounded rootsFile (1024 * 1024) + let some contents := String.fromUTF8? bytes + | throw <| IO.userError "--roots-file must be UTF-8" + roots := roots ++ (contents.splitOn "\n" |>.filterMap fun line => + let line := line.trimAscii.toString + if line.isEmpty || line.startsWith "#" then none else some line).toArray + if !rootFile.isEmpty then + if !roots.isEmpty || !rootsFile.isEmpty then + throw <| IO.userError "--root-file cannot be combined with addresses or --roots-file" + roots := #[rootFile] + if roots.isEmpty then + throw <| IO.userError "expected an aggregate root address, --roots-file, or --root-file" + if mode != "preflight" && roots.size != 1 then + throw <| IO.userError "prove and verify require exactly one root; batches use preflight" + let backendRef ← IO.mkRef (none : CachedBackend) + let mut failed := false + for source in roots do + let common := + [("schema", Lean.toJson "ix.flock-stage3.root"), ("version", Lean.toJson (1 : Nat)), + ("ix_version", Lean.toJson Ix.versionString), ("lean_toolchain", Lean.toJson Lean.versionString), + ("mode", Lean.toJson mode), ("source", Lean.toJson source)] + try + let result ← runRoot source rootFile mode artifact output limits backendRef + if jsonl then + IO.println (Lean.Json.mkObj (common ++ + [("status", Lean.toJson "ok"), ("result", result)])).compress + else + IO.println s!"ok: Flock Stage 3 {mode} accepted {source}" + if !output.isEmpty then IO.println s!" artifact saved to {output}" + catch error => + failed := true + if jsonl then + IO.println (Lean.Json.mkObj (common ++ + [("status", Lean.toJson "error"), ("error", Lean.toJson error.toString)])).compress + else + IO.eprintln s!"error: Flock Stage 3 {mode} failed for {source}: {error}" + (← IO.getStdout).flush + return if failed then 1 else 0 + catch error => + IO.eprintln s!"error: {error}" return 1 end Ix.Cli.FlockRootCmd @@ -123,15 +174,21 @@ end Ix.Cli.FlockRootCmd open Ix.Cli.FlockRootCmd in def flockRootCmd : Cli.Cmd := `[Cli| "flock-root" VIA runFlockRootCmd; - "Preflight, prove, or verify one closed ix_aggr root with Flock Stage 3 (build with IX_FLOCK=1)" + "Preflight closed ix_aggr roots, or prove/verify one root with Flock Stage 3 (IX_FLOCK=1)" FLAGS: - "mode" : String; "Stage 3 action: preflight | prove | verify (default: preflight)." + "mode" : String; "preflight | prove | verify (default: preflight)." "artifact" : String; "Read a Stage3ArtifactV1 (required for verify)." - "output" : String; "Atomically save the verified Stage3ArtifactV1 (required for prove)." + "output" : String; "Atomically save the verified artifact (required for prove; no overwrite)." + "jsonl"; "Emit one versioned JSON result per root on stdout; progress stays on stderr." + "roots-file" : String; "Append addresses from a UTF-8 file, one per line (# comments allowed)." + "root-file" : String; "Read one offline Ixon proof wrapper instead of a store address." + "max-advice-mib" : String; "Host expanded-advice bound in MiB (default: 256)." + "max-witness-mib" : String; "Padded z/a/b union bound in MiB, excluding scratch (default: 32768)." + "max-table-capacity" : String; "Maximum rows/table before wiring compilation (default: 4194304)." ARGS: - ...root : String; "Exactly one 32-byte store address of a persisted aggregate root." + ...root : String; "32-byte store addresses; multiple roots are supported in preflight mode." ] end diff --git a/Ix/Store.lean b/Ix/Store.lean index 50a6155a8..988d33c62 100644 --- a/Ix/Store.lean +++ b/Ix/Store.lean @@ -48,18 +48,24 @@ def cacheDir (namespace' : String) : StoreIO FilePath := do IO.toEIO .ioError (IO.FS.createDirAll path) return path -def storePath (addr: Address): StoreIO FilePath := do - let store <- storeDir +/-- Resolve an object path without creating directories. Read-only consumers +can use this before bounded reads, including when the address is missing. -/ +def existingPath (addr : Address) : StoreIO FilePath := do + let store := (← getHomeDir) / ".ix" / "store" let hex := hexOfBytes addr.hash let s := hex.toSlice let dir1 := (s.take 2).toString let dir2 := (s.drop 2 |>.take 2).toString let dir3 := (s.drop 4 |>.take 2).toString let file := (s.drop 6).toString - let path := store / dir1 / dir2 / dir3 - if !(<- path.pathExists) then - IO.toEIO .ioError (IO.FS.createDirAll path) - return path / file + return store / dir1 / dir2 / dir3 / file + +def storePath (addr: Address): StoreIO FilePath := do + let path ← existingPath addr + let parent := path.parent.getD path + if !(← parent.pathExists) then + IO.toEIO .ioError (IO.FS.createDirAll parent) + return path def write (bytes: ByteArray) : StoreIO Address := do let addr := Address.blake3 bytes diff --git a/Tests/Fixtures/Aggregate/singleton-2026-09-05/PROVENANCE.md b/Tests/Fixtures/Aggregate/singleton-2026-09-05/PROVENANCE.md new file mode 100644 index 000000000..db2d740cd --- /dev/null +++ b/Tests/Fixtures/Aggregate/singleton-2026-09-05/PROVENANCE.md @@ -0,0 +1,102 @@ +# Current-protocol singleton aggregate + +This is a genuine `ix_aggr` shape-0 wrap of an IxVM `CheckEnv` proof, not a +toy verifier circuit. Its environment contains one well-formed axiom +declaration. The certificate checks that declaration's well-formedness; it +does not prove the proposition postulated by the axiom. Both native proofs +use the production defaults: blowup log 2, cap height 0, 100 binary-FRI +queries, 20-bit query grinding, no commitment grinding, constant final +polynomial. The canonical subject tree has no assumptions. + +The fixture was generated on 2026-09-05 by +`Benchmarks/FlockRootFixture.lean`, in the uncommitted Stage 3 worktree based +on `40cf786ac78990108701ac2f1ec5e3b5867f4410`. It uses Lean 4.33.1, +multi-stark `6ad074c1f2983ecdd7a56984d333441d6b38186a`, and Plonky3 +`3152b14a89067c83775a8076cc262ffc48a1fd7c`. No personal store/cache or +formalization workspace was used. This is a minimal current-protocol +measurement, not a representative full-environment corpus. + +## Identities + +- Subject: `f7a3722c3ab8ad9d45a8cecf412c1d1cae92e2e453a8e923b7f466bfecd345a8` +- Subject-tree root: `71cbf135649af05f7cce8ba201a48e46556de51483f690cc6ec500a65530059c` +- Bundled claim: `CheckEnv(71cbf135649af05f7cce8ba201a48e46556de51483f690cc6ec500a65530059c, none)` +- Root wrapper BLAKE3: `254dcab734b79f1714d6c9b372ccdf8fcbad69e01fb90b51b0007f8cb6841406` +- Root wrapper SHA-256: `6ea804f334bf5a4f126c7f2713acc6636740a6789f10c23b42ea860857f8fada` +- Child wrapper BLAKE3: `9381b528d31fdb23e8af24c6131bb3a3dd898f446848d295e4f8b0da24c7a618` +- Child wrapper SHA-256: `0795bff320f62034e76bb37e1ebf2e6da7968302a828242cc8e0041ba1236001` + +`fixture.json` records every input/key/claim/proof file's byte length and +BLAKE3 digest, native circuit heights, timings, and memory measurements. +`execution.json` is the checkpoint written before aggregate proving. The +fixture is complete only when `fixture.json` exists and verification passes. +The 116-byte environment and its canonical subject tree are included; no +external manifest is needed for this singleton certificate. + +## Reproduction and verification + +From the repository root, build and generate into a **new** directory: + +```sh +IX_FLOCK=1 lake build ix bench-flock-root-fixture +flock_fixture_parent=$(mktemp -d /tmp/ix-flock-fixture.XXXXXX) +( + ulimit -v 67108864 + RAYON_NUM_THREADS=8 .lake/build/bin/bench-flock-root-fixture \ + --output "$flock_fixture_parent/root" --prove +) +.lake/build/bin/bench-flock-root-fixture --verify "$flock_fixture_parent/root" +``` + +Without `--prove`, the harness proves/verifies the tiny IxVM child and only +executes the aggregate. Generation requires a Linux process address-space +limit of at most 64 GiB. This is an OS allocation guard, not a prediction of +RSS; an allocation failure can terminate the subprocess and leave an +incomplete output directory. Existing destinations are refused before writes. + +To verify these saved files without proving or writing anything: + +```sh +.lake/build/bin/bench-flock-root-fixture \ + --verify Tests/Fixtures/Aggregate/singleton-2026-09-05 +``` + +Verification checks bounded, digest-checked bytes, the exact singleton +environment and subject tree, both current keys, the expected outer claim, +and both native proofs. CI runs this fresh-process verification; it does not +regenerate the high-memory native aggregate proof. + +## Measured costs + +AMD Ryzen 9 7950X3D, 128 GiB-class RAM (`MemTotal=134128111616` bytes), +8 Rayon workers, 64 GiB address-space cap, 10 ms process-tree RSS sampling: + +| Operation | Time | Sampled peak RSS | +| --- | ---: | ---: | +| IxVM child proof | 0.189 s | 0.87 GiB | +| Aggregate execution alone, in the proving run | 1.652 s | 2.68 GiB | +| Aggregate proof, including its own execution | 75.813 s | 25.26 GiB | +| Aggregate native verification | 0.121 s | Not separately sampled | + +RSS includes retained system/runtime state, not just incremental prover +allocation. The aggregate has 175 active circuits. The root wrapper is +8,565,030 bytes and the child wrapper 4,485,008 bytes. + +The initial Stage 3 count required `nu=26`, 67,108,864 rows of uniform capacity, +and **3,298,534,883,328 bytes (3 TiB) of padded z/a/b alone**. The subsequent +shared-PCS/weighted-quotient compiler reduces the same unchanged root to +`nu=24`, 16,777,216 rows and **824,633,720,832 bytes (768 GiB)**. Query-point +and denominator sharing subsequently reduces it to `nu=23`, 8,388,608 rows +and **412,316,860,416 bytes (384 GiB)**, with 6,283,484 canonicality rows. +Packing two canonicality requests into the same 512-column row reduces it +again to `nu=22`, 4,194,304 rows and **206,158,430,208 bytes (192 GiB)**, +with 3,162,519 packed canonicality rows. The other table row counts and all +native fixture bytes are unchanged. The latest count took 0.155 s with a +350 MiB process peak under a 16 GiB address-space cap. Native +validation and counting pass, but production admission still correctly refuses +the root before wiring compilation. No Flock proof or evaluated relation +was produced for this fixture. See the retained +[baseline](../../../../flock-stage3/measurements/persisted-singleton-2026-09-05.json) +[PCS follow-up](../../../../flock-stage3/measurements/persisted-singleton-pcs-2026-09-05.json) +[query-sharing measurement](../../../../flock-stage3/measurements/pcs-query-sharing-2026-09-05.json) +and [canonicality-packing measurement](../../../../flock-stage3/measurements/packed-canonicality-2026-09-05.json). diff --git a/Tests/Fixtures/Aggregate/singleton-2026-09-05/aggr.vk b/Tests/Fixtures/Aggregate/singleton-2026-09-05/aggr.vk new file mode 100644 index 0000000000000000000000000000000000000000..9d2c284b58fb69295475208a80fde8489fff4efd GIT binary patch literal 181630 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

%el0BtbWMOet>#D^s;!Vcl3o$uG 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 literal 0 HcmV?d00001 diff --git a/Tests/Fixtures/Aggregate/singleton-2026-09-05/execution.json b/Tests/Fixtures/Aggregate/singleton-2026-09-05/execution.json new file mode 100644 index 000000000..6441bda20 --- /dev/null +++ b/Tests/Fixtures/Aggregate/singleton-2026-09-05/execution.json @@ -0,0 +1,783 @@ +{"version": 1, + "subject": "f7a3722c3ab8ad9d45a8cecf412c1d1cae92e2e453a8e923b7f466bfecd345a8", + "schema": "ix.flock-stage3.root-fixture", + "lean_toolchain": "4.33.1", + "ixvm_verify_us": 16618, + "ixvm_sampled_peak_rss_bytes": 931577856, + "ixvm_prove_us": 188766, + "ixvm_predicted_peak_bytes": 228450779, + "ixvm_compile_us": 63619, + "inputs": + [{"file": "environment.ixe", + "bytes": 116, + "blake3": + "bed282f9db4dee56f1746870478aad7223ce2a325f7e6baf24dacde3aa06e0e8"}, + {"file": "check-env.claim", + "bytes": 34, + "blake3": + "ddef67870a4517be2f996e2eeb6f7fdcd3871ba527190f17d45b93308a40825f"}, + {"file": "subjects.tree", + "bytes": 34, + "blake3": + "9014207ff8cef20d1f8f64934fef14d4114e8afe43f7a35f930dfcb70175d67e"}, + {"file": "ixvm.vk", + "bytes": 709741, + "blake3": + "e3b0aff0da508c305da9048b113e586502d35e75dadc4f7647d89efb320fbc78"}, + {"file": "aggr.vk", + "bytes": 181630, + "blake3": + "75452941bc0dbe4a861c88c792067f34d7864f0460f305858a0a004ec409406e"}, + {"file": "outer-claim.bin", + "bytes": 144, + "blake3": + "6f872178af386cef9c799c1417035682c120756b3bbec883f09b1c31c703c713"}], + "fri": + {"query_pow_bits": 20, + "num_queries": 100, + "max_log_arity": 1, + "log_final_poly_len": 0, + "log_blowup": 2, + "commit_pow_bits": 0}, + "description": + "single well-formed axiom declaration; production ix_aggr shape-0 wrap", + "child": + {"file": "ixvm.ixon-proof", + "bytes": 4485008, + "blake3": "9381b528d31fdb23e8af24c6131bb3a3dd898f446848d295e4f8b0da24c7a618"}, + "bundled_claim": + "CheckEnv(71cbf135649af05f7cce8ba201a48e46556de51483f690cc6ec500a65530059c, none)", + "aggregate_proven": false, + "aggregate_circuits": + [{"name": "blake3_compress", + "height": 332248, + "committed_width": 925, + "cache_hits": 30}, + {"name": "blake3_compress_chunks", + "height": 910476, + "committed_width": 29, + "cache_hits": 0}, + {"name": "memory[3]", + "height": 1781328, + "committed_width": 12, + "cache_hits": 2531861}, + {"name": "read_u64_vec_n", + "height": 499217, + "committed_width": 28, + "cache_hits": 0}, + {"name": "aggr_read_byte", + "height": 709741, + "committed_width": 12, + "cache_hits": 1}, + {"name": "ro_fold", + "height": 192396, + "committed_width": 49, + "cache_hits": 741}, + {"name": "read_nodes_n", + "height": 124768, + "committed_width": 59, + "cache_hits": 0}, + {"name": "bucket_update", + "height": 168721, + "committed_width": 42, + "cache_hits": 33549}, + {"name": "select_rows", + "height": 111490, + "committed_width": 46, + "cache_hits": 2735}, + {"name": "read_vk_u16", + "height": 287822, + "committed_width": 15, + "cache_hits": 0}, + {"name": "rows_pop", + "height": 103656, + "committed_width": 46, + "cache_hits": 11313}, + {"name": "b3_rows_chunks", + "height": 13889, + "committed_width": 282, + "cache_hits": 9}, + {"name": "select_rows_le", + "height": 48377, + "committed_width": 68, + "cache_hits": 3009}, + {"name": "bytes_to_block", + "height": 13089, + "committed_width": 265, + "cache_hits": 1152}, + {"name": "memory[7]", + "height": 166607, + "committed_width": 16, + "cache_hits": 172539}, + {"name": "blake3_compress_block", + "height": 14209, + "committed_width": 211, + "cache_hits": 0}, + {"name": "memory[6]", + "height": 153362, + "committed_width": 15, + "cache_hits": 104373}, + {"name": "list_length.U8_8", + "height": 92339, + "committed_width": 25, + "cache_hits": 38901}, + {"name": "memory[10]", + "height": 102225, + "committed_width": 19, + "cache_hits": 863505}, + {"name": "memory[32]", + "height": 47672, + "committed_width": 41, + "cache_hits": 56371}, + {"name": "ri_apply", "height": 38900, "committed_width": 44, "cache_hits": 0}, + {"name": "Bytes2", "height": 65536, "committed_width": 24, "cache_hits": 0}, + {"name": "read_vk_tag", + "height": 124768, + "committed_width": 11, + "cache_hits": 0}, + {"name": "read_node_ids_n", + "height": 63409, + "committed_width": 23, + "cache_hits": 0}, + {"name": "mmcs_compress", + "height": 11919, + "committed_width": 111, + "cache_hits": 0}, + {"name": "eval_at", + "height": 16958, + "committed_width": 55, + "cache_hits": 17366}, + {"name": "cons8", "height": 25251, "committed_width": 33, "cache_hits": 31}, + {"name": "frontier_level", + "height": 10798, + "committed_width": 70, + "cache_hits": 10}, + {"name": "list_drop.G", + "height": 31910, + "committed_width": 20, + "cache_hits": 66505}, + {"name": "accs_onto", "height": 9679, "committed_width": 68, "cache_hits": 2}, + {"name": "open_batch_2pt", + "height": 15600, + "committed_width": 38, + "cache_hits": 0}, + {"name": "list_length.Ptr.U8_8_4", + "height": 30013, + "committed_width": 18, + "cache_hits": 715}, + {"name": "read_u64_vec_vec_n", + "height": 23700, + "committed_width": 23, + "cache_hits": 0}, + {"name": "read_count_at", + "height": 25993, + "committed_width": 19, + "cache_hits": 0}, + {"name": "read_digest_vec_at_n", + "height": 9245, + "committed_width": 58, + "cache_hits": 0}, + {"name": "blake3_next_layer", + "height": 3191, + "committed_width": 191, + "cache_hits": 0}, + {"name": "list_lookup.BatchOpening", + "height": 27956, + "committed_width": 16, + "cache_hits": 86659}, + {"name": "open_2pt_mat", + "height": 15600, + "committed_width": 30, + "cache_hits": 0}, + {"name": "read_ext_vec_n", + "height": 12881, + "committed_width": 37, + "cache_hits": 0}, + {"name": "frontier_merge", + "height": 10686, + "committed_width": 43, + "cache_hits": 605}, + {"name": "blake3_compress_layer", + "height": 3257, + "committed_width": 157, + "cache_hits": 9}, + {"name": "rev_onto", + "height": 17695, + "committed_width": 22, + "cache_hits": 38800}, + {"name": "list_drop.SysNode", + "height": 16958, + "committed_width": 23, + "cache_hits": 16881}, + {"name": "read_u64_vec", + "height": 23301, + "committed_width": 15, + "cache_hits": 0}, + {"name": "list_lookup.SysNode", + "height": 16958, + "committed_width": 19, + "cache_hits": 0}, + {"name": "open_prep", "height": 7800, "committed_width": 45, "cache_hits": 0}, + {"name": "logup_fingerprint", + "height": 6738, + "committed_width": 49, + "cache_hits": 601}, + {"name": "open_quotient", + "height": 7800, + "committed_width": 41, + "cache_hits": 0}, + {"name": "inject_maybe", + "height": 10698, + "committed_width": 23, + "cache_hits": 0}, + {"name": "memory[34]", + "height": 5984, + "committed_width": 43, + "cache_hits": 14017}, + {"name": "frontier_split", + "height": 6774, + "committed_width": 37, + "cache_hits": 1388}, + {"name": "list_is_empty.Ptr.U8_32", + "height": 14193, + "committed_width": 15, + "cache_hits": 13340}, + {"name": "memory[4]", + "height": 15175, + "committed_width": 13, + "cache_hits": 229269}, + {"name": "memo_u32_less_than", + "height": 6753, + "committed_width": 28, + "cache_hits": 2604}, + {"name": "list_length.CommitPhaseProofStep", + "height": 9431, + "committed_width": 19, + "cache_hits": 40384}, + {"name": "read_sys_lookups_n", + "height": 5866, + "committed_width": 31, + "cache_hits": 0}, + {"name": "verify_query", + "height": 1231, + "committed_width": 170, + "cache_hits": 96}, + {"name": "compress_ordered", + "height": 9187, + "committed_width": 16, + "cache_hits": 0}, + {"name": "limbs_onto", + "height": 5357, + "committed_width": 29, + "cache_hits": 0}, + {"name": "leaf_hash_at", + "height": 2752, + "committed_width": 58, + "cache_hits": 469}, + {"name": "exp_by_bits", + "height": 6010, + "committed_width": 23, + "cache_hits": 40029}, + {"name": "pair_mul", + "height": 4383, + "committed_width": 32, + "cache_hits": 4214}, + {"name": "frontier_sort", + "height": 3465, + "committed_width": 40, + "cache_hits": 423}, + {"name": "list_drop.G_2", + "height": 5894, + "committed_width": 21, + "cache_hits": 4471}, + {"name": "read_sys_circuits_n", + "height": 765, + "committed_width": 185, + "cache_hits": 0}, + {"name": "list_lookup.G_2", + "height": 5883, + "committed_width": 17, + "cache_hits": 9004}, + {"name": "logup_steps_fold", + "height": 678, + "committed_width": 126, + "cache_hits": 0}, + {"name": "frontier_leaves", + "height": 2018, + "committed_width": 35, + "cache_hits": 2}, + {"name": "fold_roots", + "height": 1374, + "committed_width": 45, + "cache_hits": 0}, + {"name": "read_ext_vec_vec_n", + "height": 2238, + "committed_width": 23, + "cache_hits": 0}, + {"name": "rows_at_round", + "height": 1616, + "committed_width": 31, + "cache_hits": 0}, + {"name": "fri_fold2", + "height": 1131, + "committed_width": 44, + "cache_hits": 96}, + {"name": "step_views_at", + "height": 1700, + "committed_width": 27, + "cache_hits": 0}, + {"name": "take_bits", "height": 1921, "committed_width": 23, "cache_hits": 0}, + {"name": "drop_index_bits", + "height": 1702, + "committed_width": 25, + "cache_hits": 15}, + {"name": "list_concat.Ptr.U8_32", + "height": 1889, + "committed_width": 22, + "cache_hits": 15}, + {"name": "rollin", "height": 1128, "committed_width": 35, "cache_hits": 99}, + {"name": "read_vk_u16_limb", + "height": 2300, + "committed_width": 15, + "cache_hits": 0}, + {"name": "read_ext_vec", + "height": 1991, + "committed_width": 15, + "cache_hits": 0}, + {"name": "has_height", + "height": 1199, + "committed_width": 23, + "cache_hits": 10673}, + {"name": "memory[8]", + "height": 1534, + "committed_width": 17, + "cache_hits": 63077}, + {"name": "circ_has_height", + "height": 1027, + "committed_width": 25, + "cache_hits": 0}, + {"name": "select_active_circuits", + "height": 765, + "committed_width": 34, + "cache_hits": 0}, + {"name": "bits_to_num", + "height": 1247, + "committed_width": 18, + "cache_hits": 23282}, + {"name": "select_active_prep", + "height": 765, + "committed_width": 30, + "cache_hits": 0}, + {"name": "ood_fold", + "height": 1038, + "committed_width": 18, + "cache_hits": 1419}, + {"name": "list_length.SysCircuit", + "height": 840, + "committed_width": 23, + "cache_hits": 2}, + {"name": "pad_block", "height": 1029, "committed_width": 18, "cache_hits": 0}, + {"name": "read_opt_idx_n", + "height": 765, + "committed_width": 25, + "cache_hits": 0}, + {"name": "log_degrees_onto", + "height": 843, + "committed_width": 22, + "cache_hits": 0}, + {"name": "read_active_n", + "height": 843, + "committed_width": 21, + "cache_hits": 0}, + {"name": "u64_is_zero", + "height": 694, + "committed_width": 25, + "cache_hits": 27436}, + {"name": "relaxed_u64_succ", + "height": 693, + "committed_width": 25, + "cache_hits": 819}, + {"name": "read_vk_u32_limb", + "height": 764, + "committed_width": 21, + "cache_hits": 0}, + {"name": "assert_bits", + "height": 765, + "committed_width": 19, + "cache_hits": 0}, + {"name": "ch_sample8", + "height": 143, + "committed_width": 138, + "cache_hits": 0}, + {"name": "points_onto", + "height": 622, + "committed_width": 22, + "cache_hits": 0}, + {"name": "assert_blowup_zero", + "height": 466, + "committed_width": 30, + "cache_hits": 99}, + {"name": "ood_loop", "height": 78, "committed_width": 251, "cache_hits": 0}, + {"name": "batch_views_at", + "height": 500, + "committed_width": 26, + "cache_hits": 0}, + {"name": "read_u64_vec_vec_vec_n", + "height": 404, + "committed_width": 27, + "cache_hits": 0}, + {"name": "b3_w4_onto", "height": 376, "committed_width": 21, "cache_hits": 0}, + {"name": "verify_one_query", + "height": 100, + "committed_width": 96, + "cache_hits": 0}, + {"name": "read_vk_u64", + "height": 209, + "committed_width": 33, + "cache_hits": 0}, + {"name": "blake3_finish", + "height": 49, + "committed_width": 190, + "cache_hits": 0}, + {"name": "lookup_groups_count", + "height": 308, + "committed_width": 18, + "cache_hits": 761}, + {"name": "ch_sample_bits", + "height": 101, + "committed_width": 69, + "cache_hits": 100}, + {"name": "read_opened_round_n", + "height": 237, + "committed_width": 23, + "cache_hits": 0}, + {"name": "frontier_fold", + "height": 244, + "committed_width": 22, + "cache_hits": 0}, + {"name": "round_onto", "height": 237, "committed_width": 22, "cache_hits": 0}, + {"name": "query_loop", "height": 101, "committed_width": 54, "cache_hits": 0}, + {"name": "open_prep_batch", + "height": 100, + "committed_width": 44, + "cache_hits": 0}, + {"name": "read_field", "height": 205, "committed_width": 18, "cache_hits": 0}, + {"name": "read_ext_vec_vec", + "height": 233, + "committed_width": 15, + "cache_hits": 0}, + {"name": "Bytes1", "height": 256, "committed_width": 11, "cache_hits": 0}, + {"name": "query_views", + "height": 101, + "committed_width": 26, + "cache_hits": 0}, + {"name": "sample_query_indices", + "height": 101, + "committed_width": 25, + "cache_hits": 0}, + {"name": "last_acc_is_zero", + "height": 77, + "committed_width": 30, + "cache_hits": 0}, + {"name": "heights_prep", + "height": 78, + "committed_width": 29, + "cache_hits": 100}, + {"name": "read_u8", "height": 108, "committed_width": 18, "cache_hits": 4}, + {"name": "heights_all", + "height": 78, + "committed_width": 23, + "cache_hits": 100}, + {"name": "quotient_eval", + "height": 57, + "committed_width": 32, + "cache_hits": 68}, + {"name": "ch_sample_field", + "height": 42, + "committed_width": 41, + "cache_hits": 0}, + {"name": "ext_exp_pow2", + "height": 70, + "committed_width": 21, + "cache_hits": 512}, + {"name": "reconstruct_ext_row", + "height": 46, + "committed_width": 32, + "cache_hits": 76}, + {"name": "cap_onto", "height": 23, "committed_width": 65, "cache_hits": 17}, + {"name": "flatten_u64", + "height": 70, + "committed_width": 14, + "cache_hits": 25927}, + {"name": "pcs_betas", "height": 17, "committed_width": 64, "cache_hits": 0}, + {"name": "mmcs_verify_multi", + "height": 20, + "committed_width": 41, + "cache_hits": 0}, + {"name": "verify_commit_multi", + "height": 17, + "committed_width": 51, + "cache_hits": 0}, + {"name": "read_digest_vec_at", + "height": 39, + "committed_width": 15, + "cache_hits": 0}, + {"name": "ch_sample_ext", + "height": 21, + "committed_width": 32, + "cache_hits": 0}, + {"name": "two_adic_gen", + "height": 33, + "committed_width": 17, + "cache_hits": 55783}, + {"name": "from_ext_basis", + "height": 44, + "committed_width": 10, + "cache_hits": 1}, + {"name": "pcs_check_witness", + "height": 17, + "committed_width": 34, + "cache_hits": 0}, + {"name": "read_commit_phase_step_vec_n", + "height": 17, + "committed_width": 33, + "cache_hits": 0}, + {"name": "build_buckets", + "height": 19, + "committed_width": 25, + "cache_hits": 99}, + {"name": "read_merkle_cap_vec_n", + "height": 17, + "committed_width": 23, + "cache_hits": 0}, + {"name": "snoc_b8", "height": 17, "committed_width": 22, "cache_hits": 0}, + {"name": "obs_log_arities", + "height": 17, + "committed_width": 22, + "cache_hits": 0}, + {"name": "list_length.CommitPhaseMultiStep", + "height": 17, + "committed_width": 20, + "cache_hits": 0}, + {"name": "read_u64", "height": 12, "committed_width": 33, "cache_hits": 0}, + {"name": "fingerprint_vals", + "height": 11, + "committed_width": 32, + "cache_hits": 0}, + {"name": "snoc_cap", "height": 18, "committed_width": 15, "cache_hits": 0}, + {"name": "read_claim_vals_n", + "height": 11, + "committed_width": 30, + "cache_hits": 0}, + {"name": "pow2", "height": 17, "committed_width": 14, "cache_hits": 76}, + {"name": "memory[5]", + "height": 17, + "committed_width": 14, + "cache_hits": 1734}, + {"name": "list_drop.U8_8", + "height": 10, + "committed_width": 27, + "cache_hits": 9}, + {"name": "list_lookup.U8_8", + "height": 10, + "committed_width": 23, + "cache_hits": 0}, + {"name": "list_concat.U8_8", + "height": 8, + "committed_width": 29, + "cache_hits": 0}, + {"name": "aggr_claim_field", + "height": 10, + "committed_width": 18, + "cache_hits": 0}, + {"name": "aggr_verify_child", + "height": 1, + "committed_width": 500, + "cache_hits": 0}, + {"name": "read_batch_opening_vec_n", + "height": 5, + "committed_width": 31, + "cache_hits": 0}, + {"name": "aggr_read_address", + "height": 2, + "committed_width": 138, + "cache_hits": 0}, + {"name": "heights_max", + "height": 3, + "committed_width": 44, + "cache_hits": 100}, + {"name": "aggr_load_sys", + "height": 1, + "committed_width": 227, + "cache_hits": 0}, + {"name": "ix_aggr", "height": 1, "committed_width": 202, "cache_hits": 0}, + {"name": "read_opened_round", + "height": 4, + "committed_width": 15, + "cache_hits": 0}, + {"name": "read_vk_cap_n", + "height": 2, + "committed_width": 66, + "cache_hits": 0}, + {"name": "quotient_degree_of", + "height": 2, + "committed_width": 45, + "cache_hits": 75}, + {"name": "aggr_pack_address", + "height": 2, + "committed_width": 41, + "cache_hits": 0}, + {"name": "aggr_child_check_env_digest", + "height": 1, + "committed_width": 89, + "cache_hits": 0}, + {"name": "claims_acc", "height": 2, "committed_width": 37, "cache_hits": 0}, + {"name": "read_claims_n", + "height": 2, + "committed_width": 27, + "cache_hits": 0}, + {"name": "verify_input_multi", + "height": 1, + "committed_width": 62, + "cache_hits": 0}, + {"name": "read_count", "height": 2, "committed_width": 21, "cache_hits": 0}, + {"name": "aggr_wrap", "height": 1, "committed_width": 53, "cache_hits": 0}, + {"name": "aggr_assert_digest", + "height": 2, + "committed_width": 22, + "cache_hits": 0}, + {"name": "aggr_claim_digest", + "height": 1, + "committed_width": 26, + "cache_hits": 0}, + {"name": "read_opt_commit", + "height": 1, + "committed_width": 23, + "cache_hits": 0}, + {"name": "list_length.Bucket", + "height": 1, + "committed_width": 22, + "cache_hits": 3}, + {"name": "list_length.FrontierNode", + "height": 1, + "committed_width": 21, + "cache_hits": 19}, + {"name": "read_preprocessed", + "height": 1, + "committed_width": 17, + "cache_hits": 0}, + {"name": "aggr_only_claim", + "height": 1, + "committed_width": 17, + "cache_hits": 0}, + {"name": "prep_count", "height": 1, "committed_width": 11, "cache_hits": 100}, + {"name": "aggr_parse_check_env", + "height": 0, + "committed_width": 23, + "cache_hits": 0}, + {"name": "aggr_node_hash", + "height": 0, + "committed_width": 19, + "cache_hits": 0}, + {"name": "aggr_leaf_hash", + "height": 0, + "committed_width": 17, + "cache_hits": 0}, + {"name": "aggr_parse_tree_body", + "height": 0, + "committed_width": 26, + "cache_hits": 0}, + {"name": "aggr_put_address", + "height": 0, + "committed_width": 106, + "cache_hits": 0}, + {"name": "aggr_load_preimage", + "height": 0, + "committed_width": 62, + "cache_hits": 0}, + {"name": "aggr_leaf_hashes", + "height": 0, + "committed_width": 24, + "cache_hits": 0}, + {"name": "aggr_pair", "height": 0, "committed_width": 137, "cache_hits": 0}, + {"name": "aggr_pair_hashes", + "height": 0, + "committed_width": 33, + "cache_hits": 0}, + {"name": "bytes_to_addr", + "height": 0, + "committed_width": 53, + "cache_hits": 0}, + {"name": "aggr_reduce_hashes", + "height": 0, + "committed_width": 27, + "cache_hits": 0}, + {"name": "aggr_canonical_root", + "height": 0, + "committed_width": 13, + "cache_hits": 0}, + {"name": "address_eq_tail", + "height": 0, + "committed_width": 84, + "cache_hits": 0}, + {"name": "aggr_load_canonical_tree", + "height": 0, + "committed_width": 62, + "cache_hits": 0}, + {"name": "aggr_load_optional_tree", + "height": 0, + "committed_width": 14, + "cache_hits": 0}, + {"name": "aggr_assert_same_list", + "height": 0, + "committed_width": 26, + "cache_hits": 0}, + {"name": "aggr_assert_union", + "height": 0, + "committed_width": 40, + "cache_hits": 0}, + {"name": "aggr_next_assumption", + "height": 0, + "committed_width": 30, + "cache_hits": 0}, + {"name": "aggr_seek_subject", + "height": 0, + "committed_width": 25, + "cache_hits": 0}, + {"name": "aggr_assert_difference", + "height": 0, + "committed_width": 35, + "cache_hits": 0}, + {"name": "aggr_fold_path", + "height": 0, + "committed_width": 35, + "cache_hits": 0}, + {"name": "aggr_pair_structural", + "height": 0, + "committed_width": 134, + "cache_hits": 0}, + {"name": "aggr_address_order", + "height": 0, + "committed_width": 120, + "cache_hits": 0}, + {"name": "aggr_discharge_choice", + "height": 0, + "committed_width": 78, + "cache_hits": 0}, + {"name": "aggr_assert_strict_sorted", + "height": 0, + "committed_width": 26, + "cache_hits": 0}, + {"name": "aggr_assert_structural_difference", + "height": 0, + "committed_width": 34, + "cache_hits": 0}, + {"name": "address_eq", "height": 0, "committed_width": 82, "cache_hits": 0}, + {"name": "aggr_get_opt_address", + "height": 0, + "committed_width": 18, + "cache_hits": 0}], + "aggr_execute_us": 1652316, + "aggr_execute_sampled_peak_rss_bytes": 2873384960, + "aggr_compile_us": 24606, + "address_space_limit_bytes": 68719476736} diff --git a/Tests/Fixtures/Aggregate/singleton-2026-09-05/fixture.json b/Tests/Fixtures/Aggregate/singleton-2026-09-05/fixture.json new file mode 100644 index 000000000..409077a97 --- /dev/null +++ b/Tests/Fixtures/Aggregate/singleton-2026-09-05/fixture.json @@ -0,0 +1,790 @@ +{"version": 1, + "subject": "f7a3722c3ab8ad9d45a8cecf412c1d1cae92e2e453a8e923b7f466bfecd345a8", + "schema": "ix.flock-stage3.root-fixture", + "root": + {"file": "root.ixon-proof", + "bytes": 8565030, + "blake3": "254dcab734b79f1714d6c9b372ccdf8fcbad69e01fb90b51b0007f8cb6841406"}, + "lean_toolchain": "4.33.1", + "ixvm_verify_us": 16618, + "ixvm_sampled_peak_rss_bytes": 931577856, + "ixvm_prove_us": 188766, + "ixvm_predicted_peak_bytes": 228450779, + "ixvm_compile_us": 63619, + "inputs": + [{"file": "environment.ixe", + "bytes": 116, + "blake3": + "bed282f9db4dee56f1746870478aad7223ce2a325f7e6baf24dacde3aa06e0e8"}, + {"file": "check-env.claim", + "bytes": 34, + "blake3": + "ddef67870a4517be2f996e2eeb6f7fdcd3871ba527190f17d45b93308a40825f"}, + {"file": "subjects.tree", + "bytes": 34, + "blake3": + "9014207ff8cef20d1f8f64934fef14d4114e8afe43f7a35f930dfcb70175d67e"}, + {"file": "ixvm.vk", + "bytes": 709741, + "blake3": + "e3b0aff0da508c305da9048b113e586502d35e75dadc4f7647d89efb320fbc78"}, + {"file": "aggr.vk", + "bytes": 181630, + "blake3": + "75452941bc0dbe4a861c88c792067f34d7864f0460f305858a0a004ec409406e"}, + {"file": "outer-claim.bin", + "bytes": 144, + "blake3": + "6f872178af386cef9c799c1417035682c120756b3bbec883f09b1c31c703c713"}], + "fri": + {"query_pow_bits": 20, + "num_queries": 100, + "max_log_arity": 1, + "log_final_poly_len": 0, + "log_blowup": 2, + "commit_pow_bits": 0}, + "description": + "single well-formed axiom declaration; production ix_aggr shape-0 wrap", + "child": + {"file": "ixvm.ixon-proof", + "bytes": 4485008, + "blake3": "9381b528d31fdb23e8af24c6131bb3a3dd898f446848d295e4f8b0da24c7a618"}, + "bundled_claim": + "CheckEnv(71cbf135649af05f7cce8ba201a48e46556de51483f690cc6ec500a65530059c, none)", + "aggregate_proven": true, + "aggregate_circuits": + [{"name": "blake3_compress", + "height": 332248, + "committed_width": 925, + "cache_hits": 30}, + {"name": "blake3_compress_chunks", + "height": 910476, + "committed_width": 29, + "cache_hits": 0}, + {"name": "memory[3]", + "height": 1781328, + "committed_width": 12, + "cache_hits": 2531861}, + {"name": "read_u64_vec_n", + "height": 499217, + "committed_width": 28, + "cache_hits": 0}, + {"name": "aggr_read_byte", + "height": 709741, + "committed_width": 12, + "cache_hits": 1}, + {"name": "ro_fold", + "height": 192396, + "committed_width": 49, + "cache_hits": 741}, + {"name": "read_nodes_n", + "height": 124768, + "committed_width": 59, + "cache_hits": 0}, + {"name": "bucket_update", + "height": 168721, + "committed_width": 42, + "cache_hits": 33549}, + {"name": "select_rows", + "height": 111490, + "committed_width": 46, + "cache_hits": 2735}, + {"name": "read_vk_u16", + "height": 287822, + "committed_width": 15, + "cache_hits": 0}, + {"name": "rows_pop", + "height": 103656, + "committed_width": 46, + "cache_hits": 11313}, + {"name": "b3_rows_chunks", + "height": 13889, + "committed_width": 282, + "cache_hits": 9}, + {"name": "select_rows_le", + "height": 48377, + "committed_width": 68, + "cache_hits": 3009}, + {"name": "bytes_to_block", + "height": 13089, + "committed_width": 265, + "cache_hits": 1152}, + {"name": "memory[7]", + "height": 166607, + "committed_width": 16, + "cache_hits": 172539}, + {"name": "blake3_compress_block", + "height": 14209, + "committed_width": 211, + "cache_hits": 0}, + {"name": "memory[6]", + "height": 153362, + "committed_width": 15, + "cache_hits": 104373}, + {"name": "list_length.U8_8", + "height": 92339, + "committed_width": 25, + "cache_hits": 38901}, + {"name": "memory[10]", + "height": 102225, + "committed_width": 19, + "cache_hits": 863505}, + {"name": "memory[32]", + "height": 47672, + "committed_width": 41, + "cache_hits": 56371}, + {"name": "ri_apply", "height": 38900, "committed_width": 44, "cache_hits": 0}, + {"name": "Bytes2", "height": 65536, "committed_width": 24, "cache_hits": 0}, + {"name": "read_vk_tag", + "height": 124768, + "committed_width": 11, + "cache_hits": 0}, + {"name": "read_node_ids_n", + "height": 63409, + "committed_width": 23, + "cache_hits": 0}, + {"name": "mmcs_compress", + "height": 11919, + "committed_width": 111, + "cache_hits": 0}, + {"name": "eval_at", + "height": 16958, + "committed_width": 55, + "cache_hits": 17366}, + {"name": "cons8", "height": 25251, "committed_width": 33, "cache_hits": 31}, + {"name": "frontier_level", + "height": 10798, + "committed_width": 70, + "cache_hits": 10}, + {"name": "list_drop.G", + "height": 31910, + "committed_width": 20, + "cache_hits": 66505}, + {"name": "accs_onto", "height": 9679, "committed_width": 68, "cache_hits": 2}, + {"name": "open_batch_2pt", + "height": 15600, + "committed_width": 38, + "cache_hits": 0}, + {"name": "list_length.Ptr.U8_8_4", + "height": 30013, + "committed_width": 18, + "cache_hits": 715}, + {"name": "read_u64_vec_vec_n", + "height": 23700, + "committed_width": 23, + "cache_hits": 0}, + {"name": "read_count_at", + "height": 25993, + "committed_width": 19, + "cache_hits": 0}, + {"name": "read_digest_vec_at_n", + "height": 9245, + "committed_width": 58, + "cache_hits": 0}, + {"name": "blake3_next_layer", + "height": 3191, + "committed_width": 191, + "cache_hits": 0}, + {"name": "list_lookup.BatchOpening", + "height": 27956, + "committed_width": 16, + "cache_hits": 86659}, + {"name": "open_2pt_mat", + "height": 15600, + "committed_width": 30, + "cache_hits": 0}, + {"name": "read_ext_vec_n", + "height": 12881, + "committed_width": 37, + "cache_hits": 0}, + {"name": "frontier_merge", + "height": 10686, + "committed_width": 43, + "cache_hits": 605}, + {"name": "blake3_compress_layer", + "height": 3257, + "committed_width": 157, + "cache_hits": 9}, + {"name": "rev_onto", + "height": 17695, + "committed_width": 22, + "cache_hits": 38800}, + {"name": "list_drop.SysNode", + "height": 16958, + "committed_width": 23, + "cache_hits": 16881}, + {"name": "read_u64_vec", + "height": 23301, + "committed_width": 15, + "cache_hits": 0}, + {"name": "list_lookup.SysNode", + "height": 16958, + "committed_width": 19, + "cache_hits": 0}, + {"name": "open_prep", "height": 7800, "committed_width": 45, "cache_hits": 0}, + {"name": "logup_fingerprint", + "height": 6738, + "committed_width": 49, + "cache_hits": 601}, + {"name": "open_quotient", + "height": 7800, + "committed_width": 41, + "cache_hits": 0}, + {"name": "inject_maybe", + "height": 10698, + "committed_width": 23, + "cache_hits": 0}, + {"name": "memory[34]", + "height": 5984, + "committed_width": 43, + "cache_hits": 14017}, + {"name": "frontier_split", + "height": 6774, + "committed_width": 37, + "cache_hits": 1388}, + {"name": "list_is_empty.Ptr.U8_32", + "height": 14193, + "committed_width": 15, + "cache_hits": 13340}, + {"name": "memory[4]", + "height": 15175, + "committed_width": 13, + "cache_hits": 229269}, + {"name": "memo_u32_less_than", + "height": 6753, + "committed_width": 28, + "cache_hits": 2604}, + {"name": "list_length.CommitPhaseProofStep", + "height": 9431, + "committed_width": 19, + "cache_hits": 40384}, + {"name": "read_sys_lookups_n", + "height": 5866, + "committed_width": 31, + "cache_hits": 0}, + {"name": "verify_query", + "height": 1231, + "committed_width": 170, + "cache_hits": 96}, + {"name": "compress_ordered", + "height": 9187, + "committed_width": 16, + "cache_hits": 0}, + {"name": "limbs_onto", + "height": 5357, + "committed_width": 29, + "cache_hits": 0}, + {"name": "leaf_hash_at", + "height": 2752, + "committed_width": 58, + "cache_hits": 469}, + {"name": "exp_by_bits", + "height": 6010, + "committed_width": 23, + "cache_hits": 40029}, + {"name": "pair_mul", + "height": 4383, + "committed_width": 32, + "cache_hits": 4214}, + {"name": "frontier_sort", + "height": 3465, + "committed_width": 40, + "cache_hits": 423}, + {"name": "list_drop.G_2", + "height": 5894, + "committed_width": 21, + "cache_hits": 4471}, + {"name": "read_sys_circuits_n", + "height": 765, + "committed_width": 185, + "cache_hits": 0}, + {"name": "list_lookup.G_2", + "height": 5883, + "committed_width": 17, + "cache_hits": 9004}, + {"name": "logup_steps_fold", + "height": 678, + "committed_width": 126, + "cache_hits": 0}, + {"name": "frontier_leaves", + "height": 2018, + "committed_width": 35, + "cache_hits": 2}, + {"name": "fold_roots", + "height": 1374, + "committed_width": 45, + "cache_hits": 0}, + {"name": "read_ext_vec_vec_n", + "height": 2238, + "committed_width": 23, + "cache_hits": 0}, + {"name": "rows_at_round", + "height": 1616, + "committed_width": 31, + "cache_hits": 0}, + {"name": "fri_fold2", + "height": 1131, + "committed_width": 44, + "cache_hits": 96}, + {"name": "step_views_at", + "height": 1700, + "committed_width": 27, + "cache_hits": 0}, + {"name": "take_bits", "height": 1921, "committed_width": 23, "cache_hits": 0}, + {"name": "drop_index_bits", + "height": 1702, + "committed_width": 25, + "cache_hits": 15}, + {"name": "list_concat.Ptr.U8_32", + "height": 1889, + "committed_width": 22, + "cache_hits": 15}, + {"name": "rollin", "height": 1128, "committed_width": 35, "cache_hits": 99}, + {"name": "read_vk_u16_limb", + "height": 2300, + "committed_width": 15, + "cache_hits": 0}, + {"name": "read_ext_vec", + "height": 1991, + "committed_width": 15, + "cache_hits": 0}, + {"name": "has_height", + "height": 1199, + "committed_width": 23, + "cache_hits": 10673}, + {"name": "memory[8]", + "height": 1534, + "committed_width": 17, + "cache_hits": 63077}, + {"name": "circ_has_height", + "height": 1027, + "committed_width": 25, + "cache_hits": 0}, + {"name": "select_active_circuits", + "height": 765, + "committed_width": 34, + "cache_hits": 0}, + {"name": "bits_to_num", + "height": 1247, + "committed_width": 18, + "cache_hits": 23282}, + {"name": "select_active_prep", + "height": 765, + "committed_width": 30, + "cache_hits": 0}, + {"name": "ood_fold", + "height": 1038, + "committed_width": 18, + "cache_hits": 1419}, + {"name": "list_length.SysCircuit", + "height": 840, + "committed_width": 23, + "cache_hits": 2}, + {"name": "pad_block", "height": 1029, "committed_width": 18, "cache_hits": 0}, + {"name": "read_opt_idx_n", + "height": 765, + "committed_width": 25, + "cache_hits": 0}, + {"name": "log_degrees_onto", + "height": 843, + "committed_width": 22, + "cache_hits": 0}, + {"name": "read_active_n", + "height": 843, + "committed_width": 21, + "cache_hits": 0}, + {"name": "u64_is_zero", + "height": 694, + "committed_width": 25, + "cache_hits": 27436}, + {"name": "relaxed_u64_succ", + "height": 693, + "committed_width": 25, + "cache_hits": 819}, + {"name": "read_vk_u32_limb", + "height": 764, + "committed_width": 21, + "cache_hits": 0}, + {"name": "assert_bits", + "height": 765, + "committed_width": 19, + "cache_hits": 0}, + {"name": "ch_sample8", + "height": 143, + "committed_width": 138, + "cache_hits": 0}, + {"name": "points_onto", + "height": 622, + "committed_width": 22, + "cache_hits": 0}, + {"name": "assert_blowup_zero", + "height": 466, + "committed_width": 30, + "cache_hits": 99}, + {"name": "ood_loop", "height": 78, "committed_width": 251, "cache_hits": 0}, + {"name": "batch_views_at", + "height": 500, + "committed_width": 26, + "cache_hits": 0}, + {"name": "read_u64_vec_vec_vec_n", + "height": 404, + "committed_width": 27, + "cache_hits": 0}, + {"name": "b3_w4_onto", "height": 376, "committed_width": 21, "cache_hits": 0}, + {"name": "verify_one_query", + "height": 100, + "committed_width": 96, + "cache_hits": 0}, + {"name": "read_vk_u64", + "height": 209, + "committed_width": 33, + "cache_hits": 0}, + {"name": "blake3_finish", + "height": 49, + "committed_width": 190, + "cache_hits": 0}, + {"name": "lookup_groups_count", + "height": 308, + "committed_width": 18, + "cache_hits": 761}, + {"name": "ch_sample_bits", + "height": 101, + "committed_width": 69, + "cache_hits": 100}, + {"name": "read_opened_round_n", + "height": 237, + "committed_width": 23, + "cache_hits": 0}, + {"name": "frontier_fold", + "height": 244, + "committed_width": 22, + "cache_hits": 0}, + {"name": "round_onto", "height": 237, "committed_width": 22, "cache_hits": 0}, + {"name": "query_loop", "height": 101, "committed_width": 54, "cache_hits": 0}, + {"name": "open_prep_batch", + "height": 100, + "committed_width": 44, + "cache_hits": 0}, + {"name": "read_field", "height": 205, "committed_width": 18, "cache_hits": 0}, + {"name": "read_ext_vec_vec", + "height": 233, + "committed_width": 15, + "cache_hits": 0}, + {"name": "Bytes1", "height": 256, "committed_width": 11, "cache_hits": 0}, + {"name": "query_views", + "height": 101, + "committed_width": 26, + "cache_hits": 0}, + {"name": "sample_query_indices", + "height": 101, + "committed_width": 25, + "cache_hits": 0}, + {"name": "last_acc_is_zero", + "height": 77, + "committed_width": 30, + "cache_hits": 0}, + {"name": "heights_prep", + "height": 78, + "committed_width": 29, + "cache_hits": 100}, + {"name": "read_u8", "height": 108, "committed_width": 18, "cache_hits": 4}, + {"name": "heights_all", + "height": 78, + "committed_width": 23, + "cache_hits": 100}, + {"name": "quotient_eval", + "height": 57, + "committed_width": 32, + "cache_hits": 68}, + {"name": "ch_sample_field", + "height": 42, + "committed_width": 41, + "cache_hits": 0}, + {"name": "ext_exp_pow2", + "height": 70, + "committed_width": 21, + "cache_hits": 512}, + {"name": "reconstruct_ext_row", + "height": 46, + "committed_width": 32, + "cache_hits": 76}, + {"name": "cap_onto", "height": 23, "committed_width": 65, "cache_hits": 17}, + {"name": "flatten_u64", + "height": 70, + "committed_width": 14, + "cache_hits": 25927}, + {"name": "pcs_betas", "height": 17, "committed_width": 64, "cache_hits": 0}, + {"name": "mmcs_verify_multi", + "height": 20, + "committed_width": 41, + "cache_hits": 0}, + {"name": "verify_commit_multi", + "height": 17, + "committed_width": 51, + "cache_hits": 0}, + {"name": "read_digest_vec_at", + "height": 39, + "committed_width": 15, + "cache_hits": 0}, + {"name": "ch_sample_ext", + "height": 21, + "committed_width": 32, + "cache_hits": 0}, + {"name": "two_adic_gen", + "height": 33, + "committed_width": 17, + "cache_hits": 55783}, + {"name": "from_ext_basis", + "height": 44, + "committed_width": 10, + "cache_hits": 1}, + {"name": "pcs_check_witness", + "height": 17, + "committed_width": 34, + "cache_hits": 0}, + {"name": "read_commit_phase_step_vec_n", + "height": 17, + "committed_width": 33, + "cache_hits": 0}, + {"name": "build_buckets", + "height": 19, + "committed_width": 25, + "cache_hits": 99}, + {"name": "read_merkle_cap_vec_n", + "height": 17, + "committed_width": 23, + "cache_hits": 0}, + {"name": "snoc_b8", "height": 17, "committed_width": 22, "cache_hits": 0}, + {"name": "obs_log_arities", + "height": 17, + "committed_width": 22, + "cache_hits": 0}, + {"name": "list_length.CommitPhaseMultiStep", + "height": 17, + "committed_width": 20, + "cache_hits": 0}, + {"name": "read_u64", "height": 12, "committed_width": 33, "cache_hits": 0}, + {"name": "fingerprint_vals", + "height": 11, + "committed_width": 32, + "cache_hits": 0}, + {"name": "snoc_cap", "height": 18, "committed_width": 15, "cache_hits": 0}, + {"name": "read_claim_vals_n", + "height": 11, + "committed_width": 30, + "cache_hits": 0}, + {"name": "pow2", "height": 17, "committed_width": 14, "cache_hits": 76}, + {"name": "memory[5]", + "height": 17, + "committed_width": 14, + "cache_hits": 1734}, + {"name": "list_drop.U8_8", + "height": 10, + "committed_width": 27, + "cache_hits": 9}, + {"name": "list_lookup.U8_8", + "height": 10, + "committed_width": 23, + "cache_hits": 0}, + {"name": "list_concat.U8_8", + "height": 8, + "committed_width": 29, + "cache_hits": 0}, + {"name": "aggr_claim_field", + "height": 10, + "committed_width": 18, + "cache_hits": 0}, + {"name": "aggr_verify_child", + "height": 1, + "committed_width": 500, + "cache_hits": 0}, + {"name": "read_batch_opening_vec_n", + "height": 5, + "committed_width": 31, + "cache_hits": 0}, + {"name": "aggr_read_address", + "height": 2, + "committed_width": 138, + "cache_hits": 0}, + {"name": "heights_max", + "height": 3, + "committed_width": 44, + "cache_hits": 100}, + {"name": "aggr_load_sys", + "height": 1, + "committed_width": 227, + "cache_hits": 0}, + {"name": "ix_aggr", "height": 1, "committed_width": 202, "cache_hits": 0}, + {"name": "read_opened_round", + "height": 4, + "committed_width": 15, + "cache_hits": 0}, + {"name": "read_vk_cap_n", + "height": 2, + "committed_width": 66, + "cache_hits": 0}, + {"name": "quotient_degree_of", + "height": 2, + "committed_width": 45, + "cache_hits": 75}, + {"name": "aggr_pack_address", + "height": 2, + "committed_width": 41, + "cache_hits": 0}, + {"name": "aggr_child_check_env_digest", + "height": 1, + "committed_width": 89, + "cache_hits": 0}, + {"name": "claims_acc", "height": 2, "committed_width": 37, "cache_hits": 0}, + {"name": "read_claims_n", + "height": 2, + "committed_width": 27, + "cache_hits": 0}, + {"name": "verify_input_multi", + "height": 1, + "committed_width": 62, + "cache_hits": 0}, + {"name": "read_count", "height": 2, "committed_width": 21, "cache_hits": 0}, + {"name": "aggr_wrap", "height": 1, "committed_width": 53, "cache_hits": 0}, + {"name": "aggr_assert_digest", + "height": 2, + "committed_width": 22, + "cache_hits": 0}, + {"name": "aggr_claim_digest", + "height": 1, + "committed_width": 26, + "cache_hits": 0}, + {"name": "read_opt_commit", + "height": 1, + "committed_width": 23, + "cache_hits": 0}, + {"name": "list_length.Bucket", + "height": 1, + "committed_width": 22, + "cache_hits": 3}, + {"name": "list_length.FrontierNode", + "height": 1, + "committed_width": 21, + "cache_hits": 19}, + {"name": "read_preprocessed", + "height": 1, + "committed_width": 17, + "cache_hits": 0}, + {"name": "aggr_only_claim", + "height": 1, + "committed_width": 17, + "cache_hits": 0}, + {"name": "prep_count", "height": 1, "committed_width": 11, "cache_hits": 100}, + {"name": "aggr_parse_check_env", + "height": 0, + "committed_width": 23, + "cache_hits": 0}, + {"name": "aggr_node_hash", + "height": 0, + "committed_width": 19, + "cache_hits": 0}, + {"name": "aggr_leaf_hash", + "height": 0, + "committed_width": 17, + "cache_hits": 0}, + {"name": "aggr_parse_tree_body", + "height": 0, + "committed_width": 26, + "cache_hits": 0}, + {"name": "aggr_put_address", + "height": 0, + "committed_width": 106, + "cache_hits": 0}, + {"name": "aggr_load_preimage", + "height": 0, + "committed_width": 62, + "cache_hits": 0}, + {"name": "aggr_leaf_hashes", + "height": 0, + "committed_width": 24, + "cache_hits": 0}, + {"name": "aggr_pair", "height": 0, "committed_width": 137, "cache_hits": 0}, + {"name": "aggr_pair_hashes", + "height": 0, + "committed_width": 33, + "cache_hits": 0}, + {"name": "bytes_to_addr", + "height": 0, + "committed_width": 53, + "cache_hits": 0}, + {"name": "aggr_reduce_hashes", + "height": 0, + "committed_width": 27, + "cache_hits": 0}, + {"name": "aggr_canonical_root", + "height": 0, + "committed_width": 13, + "cache_hits": 0}, + {"name": "address_eq_tail", + "height": 0, + "committed_width": 84, + "cache_hits": 0}, + {"name": "aggr_load_canonical_tree", + "height": 0, + "committed_width": 62, + "cache_hits": 0}, + {"name": "aggr_load_optional_tree", + "height": 0, + "committed_width": 14, + "cache_hits": 0}, + {"name": "aggr_assert_same_list", + "height": 0, + "committed_width": 26, + "cache_hits": 0}, + {"name": "aggr_assert_union", + "height": 0, + "committed_width": 40, + "cache_hits": 0}, + {"name": "aggr_next_assumption", + "height": 0, + "committed_width": 30, + "cache_hits": 0}, + {"name": "aggr_seek_subject", + "height": 0, + "committed_width": 25, + "cache_hits": 0}, + {"name": "aggr_assert_difference", + "height": 0, + "committed_width": 35, + "cache_hits": 0}, + {"name": "aggr_fold_path", + "height": 0, + "committed_width": 35, + "cache_hits": 0}, + {"name": "aggr_pair_structural", + "height": 0, + "committed_width": 134, + "cache_hits": 0}, + {"name": "aggr_address_order", + "height": 0, + "committed_width": 120, + "cache_hits": 0}, + {"name": "aggr_discharge_choice", + "height": 0, + "committed_width": 78, + "cache_hits": 0}, + {"name": "aggr_assert_strict_sorted", + "height": 0, + "committed_width": 26, + "cache_hits": 0}, + {"name": "aggr_assert_structural_difference", + "height": 0, + "committed_width": 34, + "cache_hits": 0}, + {"name": "address_eq", "height": 0, "committed_width": 82, "cache_hits": 0}, + {"name": "aggr_get_opt_address", + "height": 0, + "committed_width": 18, + "cache_hits": 0}], + "aggr_verify_us": 121037, + "aggr_prove_us": 75812960, + "aggr_prove_sampled_peak_rss_bytes": 27118215168, + "aggr_execute_us": 1652316, + "aggr_execute_sampled_peak_rss_bytes": 2873384960, + "aggr_compile_us": 24606, + "address_space_limit_bytes": 68719476736} diff --git a/Tests/Fixtures/Aggregate/singleton-2026-09-05/ixvm.ixon-proof b/Tests/Fixtures/Aggregate/singleton-2026-09-05/ixvm.ixon-proof new file mode 100644 index 0000000000000000000000000000000000000000..1be669e31f87a3216fdb913fa204a082ac86827c GIT binary patch literal 4485008 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 z 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%0AyS_7lMWNWdv$fXCvVy; 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

o5L-s$;dxA@(ye5YLl_tD+X^V^UC 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

;h@_ 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≈+ckp||>Q{Hz8rRjY<17zFpTQBTr-fk^Q@m`j6l9 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

x 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
    aQ$!tF3)Jtn^ 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 z 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𝔥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

    Jr=lKA&r1gVE7MzF5nB^O#d(T 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%0DyZUcvsAoxAvnvADqjM+%sT<*`@ucu&sv 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 z zz&m5fjlvCx)|Q_PkY)mMRU%Hb9PrVX#67R<7tVa`2t(Ot;D_{V{m#VC<31%RhNrS+ zmX7|7MW0u$fq-J^)Zoriq-_3(ff}Hwj(n<3>A<#wqhW}7Az#cN0~kYThK=hguEWu$ zS)wXb)y+2fP%4arZmHJ(81zkBT4^1~cyy9FAk;fo8#XBK#{Gw_b> zno&IXh**wN^+QoERD41^j1MZn$0@eRU}O=GXLl`zgGO2*-Y(ilg*E=8@>Kv5d+Ktr zoQP9dxOJt+_G>JVVEJ@fLaSAD)if4|N2u{3J=veG`&r`Vy3Qj`(IVEZi*QVYVHhed zDH@2N?CC!XcuH=NXc+|-L#*m!ONO!)6|58jp+I~nFHeE|w7ZGo zTe-9Bt@Kxh_zn@Q1pj0m?{Trv%?TO=o-1)|G-m{=p;`M&qeXIuW@c(@COZlG3N_Y| z$Mc&`jT+y&Q4!M#CT9n>ACVr^Up6+N)u@Yn>mq=;^QzjX4Df0N!JJdr?YK9|JvwfS zlfk}fukNBk@g-=f#pB&HC*{O0yi_>bjh?$agKt%_h&H-z?5jetxyWv&e5XHI6sm%Y z?>H@oCR+wgb;3wT&Gx?~OyxKL9nJ(uy3>MLS+w9A%53+4>miudF!i}ha*1@n%kdDK zpp6OuDl?&LQR{!nC+v-__Ytm?G#^q$272U?)2OlpZ+S_JDBX%uR(E4LF^uk8`ElvB zU1Q{ZG-8w!(~)|#7INFoBp6D_vZBpXSbH_8LI+iJmb5$MI6IGed0o~=c(Zn10Bw4P zqo%|Z?Uxjtsxn}xK7DNQQpI2zbWWs6`r0h%T^G>>KTnM)uw|(J%yuAk@Yc@Oe!9J0 z=hhm`;@8w#&yXrUiCtp%orcRlmW}ZDLc%}wA71Sr8v*I+C?|#fgRQ}aQspb+gTZx9 zsnY6LC;rv0USVTSpODo|OYrS6aUP8VvZi$2lK*EN35H35vakoB4)8SmS)^VN89bri zEWLBpX=nNyv#FX%N;k4H$Bv*^&bnl`SimxGAB;;l|8i9WO?z9xS^)o@_r}5_i9!4F>tm@@l+__7hGlyOhu%@I; z(5Wi=iuH!(Z@=r$x=N70F%kRYW1>t}9i{e?RJ@@ipdsmO+XM`Fq=)3tL`@Cd3jTBQ zH=#Vyxi|B1^)+O?;U-Uaw1L+zL?+I9>BxV_1^l~swI|=wIJ?4lPSdhGIGgF8o{*{b zCwt^UHn+WXZ#}?kZ*h|v@>)IS951mb_CsqX2Y>8O>@VWb~6l+Csjg{pH%?9ZhGz2aX>cKb5# zeE#}l&2E??0p1cbKWr!0yF>d@9f*5A6Y#+T5`$FuAtyy+w%6pBfG-k`h9qrVJWMi< zr6f}3=Xq6BU8CP7sSp zh9mw~2*jl!FaXH3?Cq?4YGI~GSvsw9j%S;H>Q#HZVCmyP$}x%uo}V!>z&Yrp=FzuLdYU(MbztbEhUlWsY7F3RT;x!-o}sX|rU zNZoE|IVV*%&YI^`2~R^8DgJGDQJdbzKAb0o*uK#2K2Wf1m(3Ok78{} z0I#SpubcAwDh`8B2DQ_^F7N9~0G;bG%d4>mlEhML_*ySC0{2Oa|bbBTP{s1SwA0W+_TC10gTa6SGmFZ^%wR|CV0d`+oV zxH)uZ(GD|=>663?j=_79!{6}0QS`jHaCkaeu-Zl+gXYlabmJjCZ3^zfaHrph-z|cB z-S#57o&CFe!XJON|6YH!oKbk_O6Vs4giuTt1^{yaBIDPY@A>|4xNiG~%I{JvIo@sQ z5x%l$EaNJ=Up2Kguu@zNoV0LpWpTzeZdFmM% zW{vQuZ}5P#ou6^Eh5BIZCKvokah4xchNw_Jc{S^97jKN-Y}77qVGcn&G)GGz|3>i) z<#tijv$m95xYW;j;4BP*tciSRUw~Xo71E2PwDqrrr){S3`_y$K&=ACq%-{9Awd7(3 zr%h-ez$v22K2U*K^t<*Gnc>O2?~hr}UtPJs^J-aNxZE7RQE=yFD1F5umNxyI_usAa z_wm0wAOGFF8oy83>JS6^6*s@3f4@aas4k=)T-6L3iESL&P<A%vS>vkoHno-iFmfDLsw)9bfbUdzs+JXzJ%z)J; z$t#s$e?R1|&bH{R{n#T?4I9%V;&|5)MljjhYpiMPi0WqhI?n&k4IMFSHq*fX*hzOK z!boi$tlUs82xCD91_TmXvse9=Ty-AXz|FO8$bZ?Kx^ucpv~#C^rylRw%RQUc9k8UBE zyu7;&r>9^Y8jAFZewf6_KF+2p?F$QpAgr#HaBX0`jmf{-R{}|fuN)j(1|0XkwOqd- z<{VS`8usdT_(sle2KQ5}EdxQZxk$j_HQ4f=;1q9f0H@2=&PYslDODBh(dwjmLZ_8Y zrRq1$4oPKO1n1!T*O#?dl&C zvp&{+g^x#U^}3f+ErQN!j(IJ@Z1hxgYhM4!a7=ePd31v&0Ru;ZBt4^A$I>=3n-415 ze{Y6pN14lQu@i?^zrIdq;~{nM;8V`DilTPJvju()jf&}kOX@WzWgBY{L&n_2N=eVm zyrbLbM8LL%vUNer6IgWQlb6Fb7OiYfX$9!{m3`6zF-qny`w{$)ckNCSxXRdU734aI z8Vl89S~c1N{pg+S@vno9id979N|qM1{@q z_(c!8)XmRJQmrX2Yy$|HT=~lg$Yc>(s1RV~&Iu5r<`$FRq-*Nt8U4pOhcKY#;n(l* z-~4ctN39OsMDwClJEhoMz+42(q7)*Bgp0x&vvhd$u#6IOZXE!V*S=?VTfhi&hiIj^ z$aQ8Ud=cM2ek52v>2nvTC|0-fK`20#fws`%4^GfCIgwR>5^S}Dtf_@m&i--QM4Xg1 z_vMZJjbU?vwE9VCxzQpxRwHQNt{g4zi;}h}0oIy-0*u(p#2dwEy`bHP3a1_x(agSC zd0FSFr6AKe_b(*gIBoZdxSmkGlu9E!2z5Xl+1j`T zmTtTsrpPVAo>tnDEDB%1PQF}Hxlz6U7^RJee}K31hGJ>$#bbSyQob#2Ie+)S(eArr zFPCjoqXlw>yJDFf*~Ed@aKj}`Z|40urmD{UR$KxND+H8b&gu-Arc4iL(X8A+q5*<5 z9mAI#YhwR_7`jK;G>|rGRHaU^8m(-So-p+gQK}z1-WA!p&u>LCyzfjD>=2oW1F;jlJuQA9}o@~8h}BS(5%p;s)l-H z%6IKo8vSGo(`=N}N#LR&KLE;ZM=rla<|0fd>Y7i(Z=l_EeLZj~!qn<5jtB4b6R-G{ ziG^gsNf{8ON?YnP3YgBc@4sb`eqYp&m2L<3dYWM!_dscd@SyOlxS;GA%n|+!_T z{@U4ItUoKVIST1(V4(+`$GmPwRiB|3Io&3dawp8zRfG27HN_%gnRTAeo~B@asjzFS2*=zIBrO>Et1xAPBt#wlk}yVS75HA&cIiZyqYSTd@LxmQCbZ%7XTrHr&_{5PW{D^ehXC$ZiF zsLfEg@o*TZ^u##H6MBxAsYY#fU-Wws*h!&|#x_f^jRDMcg?b}@-HTX+jL-TBQD|+wYb!75Vm0BG$IWI6T zP?ghewPM|T`N1oQ`c<;dD^=qX&w%;2wMtsc#83m*Cdy^{aZW+iRn@50wPLyoNidEI z&oQJ%OT3kq2=KyrC#B4leJv-+Vjta|oKGLY?F&D6HI|4Y<0p}Oa^?!1G%dHL3IHM2 zi*1K%)~Pz$LVzFm01CtefZ_uHj{K#gBw(KSBYymF@av2LYxp*A=WYg2mN@mL-{d^_ zL?6vh-R|W(`)Nv*kYS(XqgPPm!1i&f;o-(jX1V0FSH;3&wrB4>{6xh|Ee!FY77FbB z5!kL(>en!`SM-Y`5c+#8; zm^ZaU;$2B;sU4lEjX3#%y13_I4bcHH*gBw8A~y8+k**NS*+|Tmb?6@sEQ_uncsw1z z%&oU`^paaN<9fFDgL_&2Kr))*w@oO1EJ?il@E^tAubc?Y@0#)y0>;7V$B*y!s+|yY zjlt}od#jVCG1f+a4;VUD5ja>2D&Nbi`jNnC1@`4ZWFIN5nP%3hyo zjeq9DcF>FStaA-UC-fzH!fgeOO_O=Y=8H#GheT-}20A%cj**<`>aBICTovgyV}7eQ z^$LyWMp1@dz7Gdnv9Z2lKq3-PVr~z>mbpkckPuHVh!xf;vVPW2$q=EjG8T8gCDqh9 zQF>p=9EBU$6!LuX-4LFJyA=7VybB73*X~fkZQd>!OR?8A0j8Z0MmAFyg2`7*p5^&Q ztaljZ?`o5aQ`&>2(Wnq57TaTGheZYiAd>k4EVoU#W5GEkNN;S&XSfjwA-!^X$6R^N z8G!hAlhGYHe!R0~>_Urdew*eK@fd2?Yeyj!+J%K**WM3*`QZ+Ma=$Wp)9)LHW2b>> zeD&vHw5nV$uU1Q9rJyZNTb)K-U@py%6>-;k{0h z6ieh8KoaY)-LhqsB#8))pFu`kechW^43%S- zlFW?a^ATumfB?Ir% zL2b0dU@&{Epx$nlfe=V+VQ5T}v&LJXINsB-h;>pzK@DT!ihXt=_$ zn&G0;o6cJ=;U1DHkb|3b7y^rPwNUi%u3|D^l|Lq}MDg=TX^imV>$jw(L?czwQL^R*1uPh9mt?3>=JzVoxA3{cRNV z{<*HIH5#GJOnDedYudY-Q99#N8)|=nr83FhVq1H$20G=@WlTTOUz?P*JkNeId_IyK zwZ^HkpJ>g_a)+bSYsGBFG3|GVYByfi zkFO=6KQ@B0A;iBGHDtCVh(D9OI0QX8e7W+Ndh?D*2pk&dcg_v(1972dJ#gxkjW^R` zAMJO3L7Z%Q<85Lf#iUzMUe??%+bcqTMS8CC;k-m#b;;5B&cci9)PBO;n8RDS3`1{o zhoBSfkkCrL@Vy21QC0m&xQc4Z=HaZ@{x}&)SD|J#u8SkX(&75W zm}V`b%avmCXm2<2pqN&G+GFLJTMp^qV_Qbr{$T?v;4{IGCqu&D3k?6%e|WWjYy@aF z;uHT#jxU)@s?Tml@Ayg7F`NcCaxM@8byPHOSj_w5jk@QX^Vl;ShJ#T_%)@6L>7}7! z+%ba_w6L`}OmUB3b^1ADXR{KzBGslwMUSaMtbg17*9t71;Ncw4II+6uFDlynFrd!l z5wE^U4V~j{#ozU3+-rvDE6Dkf%y39ryTprlT(0DjsUu5bY{A#gtOkr%7Bw&7^>Oa0 zpbrt@lC7u45v7uaXS;j%!|(BQT;@&vp11c+XP4hYC0&Idi8e8PfX z4Q%t*K9ySq7PbxavICFIB~+aK>xTQ!?;a8wU`Jk1c+ldJzScat$){F1gZdGB z+Z8Y{FZ4bo1o&G*+mH!CF4g)^NjM)S%?mO#yn0(gwGhDCxRkdol!L(w|6Toz_@b9ZfQU>Q zr(w>HLVl8yGzu6ji-shKcj`l<;&E{%wcfQy-S}i-nuCjXN8Md2IQ~#Mhe1l{2fOOi80ugQqaLY9y{GL@e89-QZN)=u&;_v zYHO8>Q>fnl?$(}*rn9K+NhrN3Y z(&Wn)g^maxgp@0f=U>T`MNek~YbdN6f35iA)&4bJZGo*@9iV7I2+C=EE0yrLS%IA$L653# z6TeJEiGsbTZx9G#CQ2Kd6{HxjBKXjjsFFII{$l7Bvdx50rDpFPRi@gi9)65t{3f=m z^<@Ce@vrjAAFuX%ru}>T$E*F*JVmz)<%1~w z-^%lm>$b+v;TKWnBkO+Y{#Gf#8%L%s!paOdYrn2(`D*`f5V;GHN*$ z5aypyG!EwFv~13<7cFTWV+Co4b2l)j&*Q1ouq&jO*gNJo>dyD}!Q`CR<^WPjL{!^v z+I$@t3JrF)6g?RW-cbU%AZ7xCdS1ZrP?+O&uaPGuwltHVW4nu2Ui)H{2<1{do4n!& zydcfkn5P%M!}(K^sEJ|Zvwre>hWX>w{ykm|6{e~LR}%V*sZ9q{I_PoiXC5rRw2C=` zaL!pj^(|g5BR>2b|NV3NXXBg5VV0nhYF+1P)y|QuY0IZ^rV}j27d(7mYKQ|y};*5t% z`2(|OVetlAaxdwjwdaJ$CWm^Pp!IjJcG7SW|5(ZGb$71cczAv7^10uCb)3JC|JC*J z-|f|;2A`x|k&v*^BoiDF|PGm6v(;5@Et&+D!B{G0}d= zaO%9McMsz*nRy+V1@DzEGzlRU)q|~J$ojFLP`eeQO>ESoJ+7$%D{6<;6b$$DfqenJ zDFKYi{0PIH*=uzTTvty!4IuV zcEJ!EnuzncOun`l3Y8pU;0~;gAMv{*`%{+9uND!Bcu!~QFpY@7K+nfay%^obyy;Ru zshJk5-_ov_-VFg8=h(m`|N3UjekD~c4No>P;E8Yc?Tk?|iTH@wF?9+K99N$27b~O~ zhGE3@Ilk%%<+IH+-#P^15PUa&Yk-XmRNS!&h!`Du(y8Cp&%>n7U(?Cnm=)`u2W1v? z(-)`N$NE4jM{o}P0reYTCbHb&@pIZYE=O@lf`OenAiii5@g+`}X@Uip#zdGEV{Y>} zSUOo>Al%sK0EA#!Dj0$_MfW&|_yj7w2nkHr&k>*DQG<2ickVRNOd$+;X8+^&Kv%XI zN;q~cDaH`JPc7}3)IK1~fy=wWwvMC4BZ)Z=eqc+E4y3qFD9tGpaKZGIG<M)40U=b-uoivXX%~(p(g2 zxkD0T;;4-N9C#vdq&1CiDDqTuc)1JKD`?5@hMtm4OYkuG07Sgtm!QH`ZC&yDkdQi4;bavlMFyDaC%%uZtODkZ%$o%dz)jc2 zT(BZ+x?dL}uY%1g!#m@=>*?3SQ34M_i|y zh8cfO5qAvWmfBcY^fsO$36G~uM;&E97WxHP{Fr5$hI_wyl0vHn^Q6xrLS;!mARM^Y zrS2V`8`mf!cldJ-=+PdWazZmV@7AsVln=i2`%6qw3(FT9PH^u&26mk36gd$RchGV! zmim4glc$wxYzM`?fw$_AgLG#XuT=x;W(!sej;%So`cz?)AS&(1VNlN5UdAw8P)M0G zk)!e)Oq`U`^mfd#S$cuz&JR#r4O=c2J@@pW_!qp=)rf3~m{{}z)||AJ&>RGv+Sx@K zlJ-hNP`?w`a0F)0Udz@F5$~)ON<9Lv%28QvpDE$U0x{7U8m zJ$X~gM3(}uA}b1Qlgp&omXL>+gz>Ga62lA=h4=H?ImPZOEWB5;H1?&F`*@9GiLV7__`-HFLcZxpmEdJZ zFeyPJ0*x|i+6h`jkQxxp`o(l_;^jVYtI(qJWLiJtdB;62P7cY(tk9{*RrP*^{QFX# zwntaerZSmTUWG@HM9tQuYY*nHOwnX4enTU+ z(^SMnCYNu&@#mv?CC)B@STH`O4az3+O@j;OLQ%g%ORWXO9Fl2bE9Bht^r1}`s+LXt zCQfz4ZPH{BL}!G|D*{rE4eCnB|5eF;kz+$F7P@ajNNcf20(^a)5avR36ZZtK{UG{W zJ@E-tt~;w_>V+i3+SXE`ny9LGg=E3Y3v^{?f;zZMJybsFdy*i?QBN9K7BewgZKE`i zM~ocJ#%d*4aD-^fbIeyHo!Jpo7&>NtBf6AWF1lGzE+!i3=CcB5-irzsb&K=cZ@Lr? zK9={QRz?|Zjd7KrL&s%s)7!x3PGL2T`prF*N|}*prTz{m5E~LPbB3xxT+Y8**yE6$ zYU*vrGD-@O4Luwz-UBTHn5ybb{qw>}enz!jHesy^Mu)pYGSj>=?>G)3Exl^qlfC7$ zz=S=w8l^E_x~X6cA;-3c%uBr*r$JD74P+n=%jXS7=BNcz&;9awhulf{ekCw5Cx8h# z{`RcKq(SdSwTu%vwTW;-Kz`T0n`=jZ+?is!=IFn0P}I6dtvMlMmJB-&U9l1!KBfGI z#Qw#QAo~jVG94T5d$UryShwES!53MgdY%M;BFwBysJ+wS?6!0`DiIEdn{X0o;~7vJ znhRbx+-yytWjaJnvuhswO(KknkT=c)oJOB$1A)58f>jE>&U6}5E^{RHfq*_MOQ@Rc zQ@+z$I(+jH2kRanU9M7;q$C^o&8$`#XO47ab$?yp6lAb-VqdKyJ#LXk`Wey2??fbb zZ|-{?^KW8UyedC(eGc4Z+(99z*vt?*1A@A7n@j2*i zY;0ZID`9%^mHuL)U?pnDidS5*2>2)gFWKp@TeZYuY|;PxefJ)#bUw|%g)s^F2Avo6 zCyAq$s%L9Wp|D2lS!V|&i((&c{Oy87;|Yz~M?>Uyzd%|7*a2sfn@A$GESvO?p_A0( zXTg#sUZzX<537k-h#n8L;;;*40oYh7p((8Td1PQ^_ws4~dt>3ZOx z+bLv_k90ahAASKp=L=H|`xdC%07pam8qh!bkqDZ$YJUkfd$yia`#h^MCchfSvK18i z0Bbw`&C7wL#yI_;TPSv5T}^7h&B2_3SvmSFozrO* znUWZD!nInQo|jcVk)KvOT42MvFr08aA_LeWXT$?262UQTw96w`gqlGIE43ikvmeo3 z@RR(iC&`>MioyC-s!ClJGOX678cI`o_s^SWm56YZ_C%N1a*;rU^0wE6hJK|07eTIV zyBHlt~q(-Bh$s1bUCD}OSez`?GGHtrDc<6og0A;i~ z2Db8GokP0m`gi~>Hn(JTM-)-UKPU+O3BA2}UHWo(Zeej3UcG#Sjv)y3r#VGi{=S)&F@4*b9fr2;`gNxg0cd=T-RI0{xs2C3owl)1vX&NBx`t)1&E;hyoIb)>^aS93@S#G}^I zquQ*IO`En+6#5Rxa>_FdUJ;^2_HMU(+Mz`qpRorO=eIJs4YLU>oHP@mAcevB6$afQ z*q-0x&v~K7PAFTf-sz%$MgY4stxa+%j{zy6b2ApgUSjnQ$pQ|)9**LTROvLq99S

    ;HeUWhtWae} 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 ` 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

    0IyD^BZM@EP?QApS?%=Yfkvx5ooOf(|4qT=K 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 aV{0B7bYz<8=>F>H)fqC&| zUQdmh8pX=BUj}gT$-8zi!hJOA;OZbKJ-hUGUTtb`V!GvJk=AfZ5M)_MIOucTzrWxA zZv5}g$A7oK+N_x(=XZmsYpUyb*K}O;fMV3%Rrq1qkSLT?LkL$D9TJq>9w>V|G)ru6 zyo)u|44Y_Fspb`Abodp*UHvK^(|@Hu_sxwx2qk3U=HBk=lSDk^a00msCUEEBZX8|= z9UC+k8PvNE`+dGd3Zmr^JO#O6HiMClS~i&Tsrc!qD7`%m>5$+*16@|P%>G*PUbY$% z98y0eUn72vF?1?viEV4gsQ_Yd6=)Fp4%di) z{@(3ity5}wc@rB7b#wdTiZOT!V2>QF`T(h&Fqzw=$PjO;8t0lG z8Z57oH|*sN(T1%QWxjnADjqY9i|Xn*9j>J=>z(OPl&M4PKGSC0n5(Ltk>m

    k5t<&dYD?kg~O@Go_c>ZjFubHQN^ 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�jox67 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 z�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