From 73a060ec57a1c1714febfdcd3e7f4c48d6e187c6 Mon Sep 17 00:00:00 2001 From: Sebastian T F Date: Wed, 21 Feb 2024 12:25:38 +0530 Subject: [PATCH 1/4] test: add print_range_check_dot_graph --- zk_prover/src/chips/range/tests.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/zk_prover/src/chips/range/tests.rs b/zk_prover/src/chips/range/tests.rs index 07cc576..1e4be7c 100644 --- a/zk_prover/src/chips/range/tests.rs +++ b/zk_prover/src/chips/range/tests.rs @@ -292,4 +292,17 @@ mod testing { .render(9, &circuit, &root) .unwrap(); } + + #[cfg(feature = "dev-graph")] + #[test] + fn print_range_check_dot_graph() { + let circuit = TestCircuit::<4> { + a: Fp::from(0x1f2f3f4f), + b: Fp::from(1), + }; + + let dot_string = halo2_proofs::dev::circuit_dot_graph(&circuit); + + print!("{}", dot_string); + } } From 0d38c8751ebbcbb14ebfe4ba40ae6e67b2841e8b Mon Sep 17 00:00:00 2001 From: Sebastian T F Date: Wed, 21 Feb 2024 12:39:51 +0530 Subject: [PATCH 2/4] chore: write dot string to file --- zk_prover/prints/range-check.dot | 1 + zk_prover/src/chips/range/tests.rs | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 zk_prover/prints/range-check.dot diff --git a/zk_prover/prints/range-check.dot b/zk_prover/prints/range-check.dot new file mode 100644 index 0000000..bf72ab3 --- /dev/null +++ b/zk_prover/prints/range-check.dot @@ -0,0 +1 @@ +digraph circuit{0[label="add chip";];1[label="checking value a is in range";];2[label="checking value b is in range";];3[label="checking value c is in range";];} \ No newline at end of file diff --git a/zk_prover/src/chips/range/tests.rs b/zk_prover/src/chips/range/tests.rs index 1e4be7c..35c5b3a 100644 --- a/zk_prover/src/chips/range/tests.rs +++ b/zk_prover/src/chips/range/tests.rs @@ -296,12 +296,16 @@ mod testing { #[cfg(feature = "dev-graph")] #[test] fn print_range_check_dot_graph() { + use std::io::Write; + let circuit = TestCircuit::<4> { a: Fp::from(0x1f2f3f4f), b: Fp::from(1), }; let dot_string = halo2_proofs::dev::circuit_dot_graph(&circuit); + let mut dot_graph = std::fs::File::create("prints/range-check.dot").unwrap(); + dot_graph.write_all(dot_string.as_bytes()).unwrap(); print!("{}", dot_string); } From 2c96b24e151911c73b77f6e3b77a117a97bbb41e Mon Sep 17 00:00:00 2001 From: Sebastian T F Date: Wed, 21 Feb 2024 13:08:43 +0530 Subject: [PATCH 3/4] feat: render dot string to svg --- zk_prover/Cargo.lock | 92 +++++++++++++++++++++- zk_prover/Cargo.toml | 1 + zk_prover/prints/range-check-dot-graph.svg | 37 +++++++++ zk_prover/src/chips/range/tests.rs | 21 +++++ 4 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 zk_prover/prints/range-check-dot-graph.svg diff --git a/zk_prover/Cargo.lock b/zk_prover/Cargo.lock index 7c2620c..77d7b26 100644 --- a/zk_prover/Cargo.lock +++ b/zk_prover/Cargo.lock @@ -1275,6 +1275,21 @@ dependencies = [ "libloading", ] +[[package]] +name = "dot-generator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aaac7ada45f71873ebce336491d1c1bc4a7c8042c7cea978168ad59e805b871" +dependencies = [ + "dot-structures", +] + +[[package]] +name = "dot-structures" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "675e35c02a51bb4d4618cb4885b3839ce6d1787c97b664474d9208d074742e20" + [[package]] name = "dunce" version = "1.0.4" @@ -2181,6 +2196,22 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "graphviz-rust" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "769bca09004f06ca60d9b5640e8bb9105e9ae6e11488d2bf75cb8a30c2ab436a" +dependencies = [ + "dot-generator", + "dot-structures", + "into-attr", + "into-attr-derive", + "pest", + "pest_derive", + "rand 0.8.5", + "tempfile", +] + [[package]] name = "group" version = "0.13.0" @@ -2553,6 +2584,28 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "into-attr" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18b48c537e49a709e678caec3753a7dba6854661a1eaa27675024283b3f8b376" +dependencies = [ + "dot-structures", +] + +[[package]] +name = "into-attr-derive" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecac7c1ae6cd2c6a3a64d1061a8bdc7f52ff62c26a831a2301e54c1b5d70d5b1" +dependencies = [ + "dot-generator", + "dot-structures", + "into-attr", + "quote", + "syn 1.0.109", +] + [[package]] name = "ipnet" version = "2.9.0" @@ -3282,15 +3335,49 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.6" +version = "2.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f200d8d83c44a45b21764d1916299752ca035d15ecd46faca3e9a2a2bf6ad06" +checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546" dependencies = [ "memchr", "thiserror", "ucd-trie", ] +[[package]] +name = "pest_derive" +version = "2.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e1288dbd7786462961e69bfd4df7848c1e37e8b74303dbdab82c3a9cdd2809" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1381c29a877c6d34b8c176e734f35d7f7f5b3adaefe940cb4d1bb7af94678e2e" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "pest_meta" +version = "2.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0934d6907f148c22a3acbda520c7eed243ad7487a30f51f6ce52b58b7077a8a" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + [[package]] name = "petgraph" version = "0.6.4" @@ -4437,6 +4524,7 @@ dependencies = [ "csv", "ethers", "ff_ce", + "graphviz-rust", "halo2_gadgets", "halo2_proofs", "halo2_solidity_verifier", diff --git a/zk_prover/Cargo.toml b/zk_prover/Cargo.toml index bba8596..22aa8fb 100644 --- a/zk_prover/Cargo.toml +++ b/zk_prover/Cargo.toml @@ -13,6 +13,7 @@ dev-graph = ["halo2_proofs/dev-graph", "plotters"] halo2_proofs = { git = "https://github.com/summa-dev/halo2"} halo2_gadgets = { git = "https://github.com/summa-dev/halo2"} plotters = { version = "0.3.4", optional = true } +graphviz-rust = {version = "0.7.1", optional = true} rand = "0.8" ark-std = { version = "0.3.0", features = ["print-trace"] } tabbycat = { version = "0.1", features = ["attributes"], optional = true } diff --git a/zk_prover/prints/range-check-dot-graph.svg b/zk_prover/prints/range-check-dot-graph.svg new file mode 100644 index 0000000..308cecd --- /dev/null +++ b/zk_prover/prints/range-check-dot-graph.svg @@ -0,0 +1,37 @@ + + + + + + +circuit + + + +0 + +add chip + + + +1 + +checking value a is in range + + + +2 + +checking value b is in range + + + +3 + +checking value c is in range + + + diff --git a/zk_prover/src/chips/range/tests.rs b/zk_prover/src/chips/range/tests.rs index 35c5b3a..24e233a 100644 --- a/zk_prover/src/chips/range/tests.rs +++ b/zk_prover/src/chips/range/tests.rs @@ -298,6 +298,13 @@ mod testing { fn print_range_check_dot_graph() { use std::io::Write; + use graphviz_rust::{ + cmd::{CommandArg, Format}, + dot_structures::*, + exec, parse, + printer::PrinterContext, + }; + let circuit = TestCircuit::<4> { a: Fp::from(0x1f2f3f4f), b: Fp::from(1), @@ -308,5 +315,19 @@ mod testing { dot_graph.write_all(dot_string.as_bytes()).unwrap(); print!("{}", dot_string); + + // * Following svg generation requires graphviz client to be installed: https://graphviz.org/download/#executable-packages + // * Might be easier to use Graphviz Interactive Preview extension in VSCode to open the .dot file + // * https://marketplace.visualstudio.com/items?itemName=tintinweb.graphviz-interactive-preview + let g: Graph = parse(&dot_string).unwrap(); + exec( + g, + &mut PrinterContext::default(), + vec![ + Format::Svg.into(), + CommandArg::Output("prints/range-check-dot-graph.svg".to_string()), + ], + ) + .unwrap(); } } From 2ff254ca337ad560fa08b6c4d903f06a841acb77 Mon Sep 17 00:00:00 2001 From: Sebastian T F Date: Wed, 21 Feb 2024 14:12:37 +0530 Subject: [PATCH 4/4] test: add print_mst_inclusion_dot_graph() --- zk_prover/prints/mst-inclusion-dot-graph.svg | 1603 ++++++++++++++++++ zk_prover/prints/mst-inclusion.dot | 1 + zk_prover/src/circuits/tests.rs | 42 + 3 files changed, 1646 insertions(+) create mode 100644 zk_prover/prints/mst-inclusion-dot-graph.svg create mode 100644 zk_prover/prints/mst-inclusion.dot diff --git a/zk_prover/prints/mst-inclusion-dot-graph.svg b/zk_prover/prints/mst-inclusion-dot-graph.svg new file mode 100644 index 0000000..041fe4e --- /dev/null +++ b/zk_prover/prints/mst-inclusion-dot-graph.svg @@ -0,0 +1,1603 @@ + + + + + + +circuit + + + +0 + +assign entry username + + + +1 + +assign entry balance 0 + + + +2 + +assign entry balance 1 + + + +3 + +perform poseidon entry hash + + + +4 + +hasher + + + +3->4 + + + + + +5 + +hash + + + +3->5 + + + + + +6 + +absorb_0 + + + +5->6 + + + + + +7 + +absorb_1 + + + +5->7 + + + + + +9 + +absorb_2 + + + +5->9 + + + + + +11 + +finish absorbing + + + +5->11 + + + + + +13 + +squeeze + + + +5->13 + + + + + +8 + +PoseidonSponge + + + +7->8 + + + + + +10 + +PoseidonSponge + + + +9->10 + + + + + +12 + +PoseidonSponge + + + +11->12 + + + + + +14 + +public leaf hash + + + +15 + +sibling leaf node username + + + +16 + +sibling leaf node balance 0 + + + +17 + +sibling leaf node balance 1 + + + +18 + +level 0: perform poseidon hash + + + +19 + +hasher + + + +18->19 + + + + + +20 + +hash + + + +18->20 + + + + + +21 + +absorb_0 + + + +20->21 + + + + + +22 + +absorb_1 + + + +20->22 + + + + + +24 + +absorb_2 + + + +20->24 + + + + + +26 + +finish absorbing + + + +20->26 + + + + + +28 + +squeeze + + + +20->28 + + + + + +23 + +PoseidonSponge + + + +22->23 + + + + + +25 + +PoseidonSponge + + + +24->25 + + + + + +27 + +PoseidonSponge + + + +26->27 + + + + + +29 + +level 0: currency 0: range check leaf balance + + + +30 + +level 0: currency 0: range check sibling balance + + + +31 + +level 0: currency 1: range check leaf balance + + + +32 + +level 0: currency 1: range check sibling balance + + + +33 + +level 0: assign swap bit + + + +34 + +level 0: swap hashes + + + +35 + +level 0: currency 0: perform balance sum + + + +36 + +level 0: currency 1: perform balance sum + + + +37 + +level 0: perform poseidon hash + + + +38 + +hasher + + + +37->38 + + + + + +39 + +hash + + + +37->39 + + + + + +40 + +absorb_0 + + + +39->40 + + + + + +41 + +absorb_1 + + + +39->41 + + + + + +43 + +absorb_2 + + + +39->43 + + + + + +45 + +absorb_3 + + + +39->45 + + + + + +47 + +finish absorbing + + + +39->47 + + + + + +49 + +squeeze + + + +39->49 + + + + + +42 + +PoseidonSponge + + + +41->42 + + + + + +44 + +PoseidonSponge + + + +43->44 + + + + + +46 + +PoseidonSponge + + + +45->46 + + + + + +48 + +PoseidonSponge + + + +47->48 + + + + + +50 + +sibling node balance 0 + + + +51 + +sibling node balance 1 + + + +52 + +sibling left hash + + + +53 + +sibling right hash + + + +54 + +level 1: perform poseidon hash + + + +55 + +hasher + + + +54->55 + + + + + +56 + +hash + + + +54->56 + + + + + +57 + +absorb_0 + + + +56->57 + + + + + +58 + +absorb_1 + + + +56->58 + + + + + +60 + +absorb_2 + + + +56->60 + + + + + +62 + +absorb_3 + + + +56->62 + + + + + +64 + +finish absorbing + + + +56->64 + + + + + +66 + +squeeze + + + +56->66 + + + + + +59 + +PoseidonSponge + + + +58->59 + + + + + +61 + +PoseidonSponge + + + +60->61 + + + + + +63 + +PoseidonSponge + + + +62->63 + + + + + +65 + +PoseidonSponge + + + +64->65 + + + + + +67 + +level 1: currency 0: range check sibling balance + + + +68 + +level 1: currency 1: range check sibling balance + + + +69 + +level 1: assign swap bit + + + +70 + +level 1: swap hashes + + + +71 + +level 1: currency 0: perform balance sum + + + +72 + +level 1: currency 1: perform balance sum + + + +73 + +level 1: perform poseidon hash + + + +74 + +hasher + + + +73->74 + + + + + +75 + +hash + + + +73->75 + + + + + +76 + +absorb_0 + + + +75->76 + + + + + +77 + +absorb_1 + + + +75->77 + + + + + +79 + +absorb_2 + + + +75->79 + + + + + +81 + +absorb_3 + + + +75->81 + + + + + +83 + +finish absorbing + + + +75->83 + + + + + +85 + +squeeze + + + +75->85 + + + + + +78 + +PoseidonSponge + + + +77->78 + + + + + +80 + +PoseidonSponge + + + +79->80 + + + + + +82 + +PoseidonSponge + + + +81->82 + + + + + +84 + +PoseidonSponge + + + +83->84 + + + + + +86 + +sibling node balance 0 + + + +87 + +sibling node balance 1 + + + +88 + +sibling left hash + + + +89 + +sibling right hash + + + +90 + +level 2: perform poseidon hash + + + +91 + +hasher + + + +90->91 + + + + + +92 + +hash + + + +90->92 + + + + + +93 + +absorb_0 + + + +92->93 + + + + + +94 + +absorb_1 + + + +92->94 + + + + + +96 + +absorb_2 + + + +92->96 + + + + + +98 + +absorb_3 + + + +92->98 + + + + + +100 + +finish absorbing + + + +92->100 + + + + + +102 + +squeeze + + + +92->102 + + + + + +95 + +PoseidonSponge + + + +94->95 + + + + + +97 + +PoseidonSponge + + + +96->97 + + + + + +99 + +PoseidonSponge + + + +98->99 + + + + + +101 + +PoseidonSponge + + + +100->101 + + + + + +103 + +level 2: currency 0: range check sibling balance + + + +104 + +level 2: currency 1: range check sibling balance + + + +105 + +level 2: assign swap bit + + + +106 + +level 2: swap hashes + + + +107 + +level 2: currency 0: perform balance sum + + + +108 + +level 2: currency 1: perform balance sum + + + +109 + +level 2: perform poseidon hash + + + +110 + +hasher + + + +109->110 + + + + + +111 + +hash + + + +109->111 + + + + + +112 + +absorb_0 + + + +111->112 + + + + + +113 + +absorb_1 + + + +111->113 + + + + + +115 + +absorb_2 + + + +111->115 + + + + + +117 + +absorb_3 + + + +111->117 + + + + + +119 + +finish absorbing + + + +111->119 + + + + + +121 + +squeeze + + + +111->121 + + + + + +114 + +PoseidonSponge + + + +113->114 + + + + + +116 + +PoseidonSponge + + + +115->116 + + + + + +118 + +PoseidonSponge + + + +117->118 + + + + + +120 + +PoseidonSponge + + + +119->120 + + + + + +122 + +sibling node balance 0 + + + +123 + +sibling node balance 1 + + + +124 + +sibling left hash + + + +125 + +sibling right hash + + + +126 + +level 3: perform poseidon hash + + + +127 + +hasher + + + +126->127 + + + + + +128 + +hash + + + +126->128 + + + + + +129 + +absorb_0 + + + +128->129 + + + + + +130 + +absorb_1 + + + +128->130 + + + + + +132 + +absorb_2 + + + +128->132 + + + + + +134 + +absorb_3 + + + +128->134 + + + + + +136 + +finish absorbing + + + +128->136 + + + + + +138 + +squeeze + + + +128->138 + + + + + +131 + +PoseidonSponge + + + +130->131 + + + + + +133 + +PoseidonSponge + + + +132->133 + + + + + +135 + +PoseidonSponge + + + +134->135 + + + + + +137 + +PoseidonSponge + + + +136->137 + + + + + +139 + +level 3: currency 0: range check sibling balance + + + +140 + +level 3: currency 1: range check sibling balance + + + +141 + +level 3: assign swap bit + + + +142 + +level 3: swap hashes + + + +143 + +level 3: currency 0: perform balance sum + + + +144 + +level 3: currency 1: perform balance sum + + + +145 + +level 3: perform poseidon hash + + + +146 + +hasher + + + +145->146 + + + + + +147 + +hash + + + +145->147 + + + + + +148 + +absorb_0 + + + +147->148 + + + + + +149 + +absorb_1 + + + +147->149 + + + + + +151 + +absorb_2 + + + +147->151 + + + + + +153 + +absorb_3 + + + +147->153 + + + + + +155 + +finish absorbing + + + +147->155 + + + + + +157 + +squeeze + + + +147->157 + + + + + +150 + +PoseidonSponge + + + +149->150 + + + + + +152 + +PoseidonSponge + + + +151->152 + + + + + +154 + +PoseidonSponge + + + +153->154 + + + + + +156 + +PoseidonSponge + + + +155->156 + + + + + +158 + +public root hash + + + +159 + +public root balance 0 + + + +160 + +public root balance 1 + + + diff --git a/zk_prover/prints/mst-inclusion.dot b/zk_prover/prints/mst-inclusion.dot new file mode 100644 index 0000000..fdfd9fa --- /dev/null +++ b/zk_prover/prints/mst-inclusion.dot @@ -0,0 +1 @@ +digraph circuit{0[label="assign entry username";];1[label="assign entry balance 0";];2[label="assign entry balance 1";];3[label="perform poseidon entry hash";];4[label="hasher";];5[label="hash";];6[label="absorb_0";];7[label="absorb_1";];8[label="PoseidonSponge";];9[label="absorb_2";];10[label="PoseidonSponge";];11[label="finish absorbing";];12[label="PoseidonSponge";];13[label="squeeze";];14[label="public leaf hash";];15[label="sibling leaf node username";];16[label="sibling leaf node balance 0";];17[label="sibling leaf node balance 1";];18[label="level 0: perform poseidon hash";];19[label="hasher";];20[label="hash";];21[label="absorb_0";];22[label="absorb_1";];23[label="PoseidonSponge";];24[label="absorb_2";];25[label="PoseidonSponge";];26[label="finish absorbing";];27[label="PoseidonSponge";];28[label="squeeze";];29[label="level 0: currency 0: range check leaf balance";];30[label="level 0: currency 0: range check sibling balance";];31[label="level 0: currency 1: range check leaf balance";];32[label="level 0: currency 1: range check sibling balance";];33[label="level 0: assign swap bit";];34[label="level 0: swap hashes";];35[label="level 0: currency 0: perform balance sum";];36[label="level 0: currency 1: perform balance sum";];37[label="level 0: perform poseidon hash";];38[label="hasher";];39[label="hash";];40[label="absorb_0";];41[label="absorb_1";];42[label="PoseidonSponge";];43[label="absorb_2";];44[label="PoseidonSponge";];45[label="absorb_3";];46[label="PoseidonSponge";];47[label="finish absorbing";];48[label="PoseidonSponge";];49[label="squeeze";];50[label="sibling node balance 0";];51[label="sibling node balance 1";];52[label="sibling left hash";];53[label="sibling right hash";];54[label="level 1: perform poseidon hash";];55[label="hasher";];56[label="hash";];57[label="absorb_0";];58[label="absorb_1";];59[label="PoseidonSponge";];60[label="absorb_2";];61[label="PoseidonSponge";];62[label="absorb_3";];63[label="PoseidonSponge";];64[label="finish absorbing";];65[label="PoseidonSponge";];66[label="squeeze";];67[label="level 1: currency 0: range check sibling balance";];68[label="level 1: currency 1: range check sibling balance";];69[label="level 1: assign swap bit";];70[label="level 1: swap hashes";];71[label="level 1: currency 0: perform balance sum";];72[label="level 1: currency 1: perform balance sum";];73[label="level 1: perform poseidon hash";];74[label="hasher";];75[label="hash";];76[label="absorb_0";];77[label="absorb_1";];78[label="PoseidonSponge";];79[label="absorb_2";];80[label="PoseidonSponge";];81[label="absorb_3";];82[label="PoseidonSponge";];83[label="finish absorbing";];84[label="PoseidonSponge";];85[label="squeeze";];86[label="sibling node balance 0";];87[label="sibling node balance 1";];88[label="sibling left hash";];89[label="sibling right hash";];90[label="level 2: perform poseidon hash";];91[label="hasher";];92[label="hash";];93[label="absorb_0";];94[label="absorb_1";];95[label="PoseidonSponge";];96[label="absorb_2";];97[label="PoseidonSponge";];98[label="absorb_3";];99[label="PoseidonSponge";];100[label="finish absorbing";];101[label="PoseidonSponge";];102[label="squeeze";];103[label="level 2: currency 0: range check sibling balance";];104[label="level 2: currency 1: range check sibling balance";];105[label="level 2: assign swap bit";];106[label="level 2: swap hashes";];107[label="level 2: currency 0: perform balance sum";];108[label="level 2: currency 1: perform balance sum";];109[label="level 2: perform poseidon hash";];110[label="hasher";];111[label="hash";];112[label="absorb_0";];113[label="absorb_1";];114[label="PoseidonSponge";];115[label="absorb_2";];116[label="PoseidonSponge";];117[label="absorb_3";];118[label="PoseidonSponge";];119[label="finish absorbing";];120[label="PoseidonSponge";];121[label="squeeze";];122[label="sibling node balance 0";];123[label="sibling node balance 1";];124[label="sibling left hash";];125[label="sibling right hash";];126[label="level 3: perform poseidon hash";];127[label="hasher";];128[label="hash";];129[label="absorb_0";];130[label="absorb_1";];131[label="PoseidonSponge";];132[label="absorb_2";];133[label="PoseidonSponge";];134[label="absorb_3";];135[label="PoseidonSponge";];136[label="finish absorbing";];137[label="PoseidonSponge";];138[label="squeeze";];139[label="level 3: currency 0: range check sibling balance";];140[label="level 3: currency 1: range check sibling balance";];141[label="level 3: assign swap bit";];142[label="level 3: swap hashes";];143[label="level 3: currency 0: perform balance sum";];144[label="level 3: currency 1: perform balance sum";];145[label="level 3: perform poseidon hash";];146[label="hasher";];147[label="hash";];148[label="absorb_0";];149[label="absorb_1";];150[label="PoseidonSponge";];151[label="absorb_2";];152[label="PoseidonSponge";];153[label="absorb_3";];154[label="PoseidonSponge";];155[label="finish absorbing";];156[label="PoseidonSponge";];157[label="squeeze";];158[label="public root hash";];159[label="public root balance 0";];160[label="public root balance 1";];3->4;3->5;5->6;5->7;7->8;5->9;9->10;5->11;11->12;5->13;18->19;18->20;20->21;20->22;22->23;20->24;24->25;20->26;26->27;20->28;37->38;37->39;39->40;39->41;41->42;39->43;43->44;39->45;45->46;39->47;47->48;39->49;54->55;54->56;56->57;56->58;58->59;56->60;60->61;56->62;62->63;56->64;64->65;56->66;73->74;73->75;75->76;75->77;77->78;75->79;79->80;75->81;81->82;75->83;83->84;75->85;90->91;90->92;92->93;92->94;94->95;92->96;96->97;92->98;98->99;92->100;100->101;92->102;109->110;109->111;111->112;111->113;113->114;111->115;115->116;111->117;117->118;111->119;119->120;111->121;126->127;126->128;128->129;128->130;130->131;128->132;132->133;128->134;134->135;128->136;136->137;128->138;145->146;145->147;147->148;147->149;149->150;147->151;151->152;147->153;153->154;147->155;155->156;147->157;} \ No newline at end of file diff --git a/zk_prover/src/circuits/tests.rs b/zk_prover/src/circuits/tests.rs index cab5e15..d2b8fbf 100644 --- a/zk_prover/src/circuits/tests.rs +++ b/zk_prover/src/circuits/tests.rs @@ -458,4 +458,46 @@ mod test { .render(K, &circuit, &root) .unwrap(); } + + #[cfg(feature = "dev-graph")] + #[test] + fn print_mst_inclusion_dot_graph() { + use std::io::Write; + + use graphviz_rust::{ + cmd::{CommandArg, Format}, + dot_structures::*, + exec, parse, + printer::PrinterContext, + }; + + let merkle_sum_tree = + MerkleSumTree::::from_csv("../csv/entry_16.csv").unwrap(); + + let user_index = 0; + + let merkle_proof = merkle_sum_tree.generate_proof(user_index).unwrap(); + + let circuit = MstInclusionCircuit::::init(merkle_proof); + + let dot_string = halo2_proofs::dev::circuit_dot_graph(&circuit); + let mut dot_graph = std::fs::File::create("prints/mst-inclusion.dot").unwrap(); + dot_graph.write_all(dot_string.as_bytes()).unwrap(); + + print!("{}", dot_string); + + // * Following svg generation requires graphviz client to be installed: https://graphviz.org/download/#executable-packages + // * Might be easier to use Graphviz Interactive Preview extension in VSCode to open the .dot file + // * https://marketplace.visualstudio.com/items?itemName=tintinweb.graphviz-interactive-preview + let g: Graph = parse(&dot_string).unwrap(); + exec( + g, + &mut PrinterContext::default(), + vec![ + Format::Svg.into(), + CommandArg::Output("prints/mst-inclusion-dot-graph.svg".to_string()), + ], + ) + .unwrap(); + } }